<?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>Liquid Quartz</title>
	<atom:link href="http://zalbee.intricus.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://zalbee.intricus.net</link>
	<description>zAlbee&#039;s Interblag.</description>
	<lastBuildDate>Wed, 22 Feb 2012 09:32:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Why I sold my Apple iPad and bought an ASUS Transformer tablet</title>
		<link>http://zalbee.intricus.net/2012/02/why-i-sold-my-ipad-for-an-asus/</link>
		<comments>http://zalbee.intricus.net/2012/02/why-i-sold-my-ipad-for-an-asus/#comments</comments>
		<pubDate>Wed, 08 Feb 2012 11:42:05 +0000</pubDate>
		<dc:creator>zAlbee</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://zalbee.intricus.net/?p=91</guid>
		<description><![CDATA[When Apple first announced their first ever tablet, the iPad, I wasn&#8217;t too interested. Like many people, I laughed it off as a giant iPod Touch with a silly name. A large, expensive touchscreen with no physical keyboard or buttons, &#8230;<p class="read-more"><a href="http://zalbee.intricus.net/2012/02/why-i-sold-my-ipad-for-an-asus/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://zalbee.intricus.net/2012/02/why-i-sold-my-ipad/"><img class="size-medium wp-image-98 alignright" src="http://zalbee.intricus.net/wordpress/wp-content/uploads/2012/02/ipad-3-crying-title-300x200.jpg" alt="" width="300" height="200" /></a></p>
<p>When Apple first announced their first ever tablet, the iPad, I wasn&#8217;t too interested. Like many people, I laughed it off as a giant iPod Touch with a silly name. A large, expensive touchscreen with no physical keyboard or buttons, running only toy apps designed for an iPod/iPhone, minus the phone capability &#8212; sounds pretty useless, right? (Well, we all know how that turned out.) Imagine my surprise when my fiancée&#8217;s father had already bought one &#8212; with 64GB and 3G, no less &#8212; and moreover, he didn&#8217;t have a use for it, so they were going to give it to me! I wasn&#8217;t sure whether to be excited or tell him he&#8217;d wasted his money. After all, I didn&#8217;t have any real use for it either, but it would be my first iOS (actually my first Apple) device, and I wanted to see what all the hype was about.</p>
<p>Fast forward 10 months later, and I was starting to find a use for the tablet&#8230; in bed. No joke. I kept it on a nightstand unused for weeks at a time (a testament to the great battery life), and only picked it up after an especially tiring day, when I just wanted to lie back and relax. (Why? If I&#8217;m awake, I&#8217;d be using my real laptop connected to a 23&#8243; monitor at my desk.) I loved the large touch-screen, the light weight, and the long battery life, but it was also frustrating. So much potential, but there was so much that I just couldn&#8217;t do.</p>
<p><strong><span id="more-91"></span></strong></p>
<h3>Dealbreaker #1: No Flash</h3>
<p>To be sure, the iPad is an entertainment device, mainly good for three things: reading, gaming, and watching videos. With that in mind, the number one thing that is missing from the iPad is Adobe Flash. Sure, many mainstream video sites like Youtube already have a mobile version to deliver video through HTML5, but that wasn&#8217;t enough for my needs. Up until maybe 8 months of ownership, there was no way to watch The Colbert Report on my iPad; today, their <a title="Colbert Nation Digest for iPad" href="http://t.colbertnation.com/" target="_blank">iPad-specific site</a> still only shows short clips, while the full site has always streamed full episodes using Flash. To watch these, I would have to sit at my desk or use my laptop on my lap, which I try to avoid since the rear vent gets hot enough to cook an egg. Using a tablet, which stays cool, would have been ideal, but alas, the iPad still doesn&#8217;t quite have it.</p>
<p><div class="wp-caption aligncenter" style="width: 522px"><img src="https://lh3.googleusercontent.com/-EhwwNTgaemk/TzJVz9xloiI/AAAAAAAABzE/GifNQuS9o3k/s512/P20120208024800.jpg" alt="" width="512" height="320" /><p class="wp-caption-text">DJManiax, in all its widescreen glory (shown on the ASUS Eee Pad Transformer) is not available on the iPad because it doesn&#39;t support Flash</p></div>
<p>Eventually most video should move to HTML5 (although apparently true live-streaming video is not available in HTML5), so this argument will become less important. However, there&#8217;s also a whole other world of Flash games and animations. When done right, using vector art instead of pixels, Flash can look beautiful and sharp no matter how large you scale it, without any blocky zoom or muddy compression. Think classics like <a href="http://www.albinoblacksheep.com/flash/ddautta" target="_blank">There She Is</a>, <a href="http://www.endofworld.net/" target="_blank">End of the World</a>, and <a href="http://www.newgrounds.com/portal/view/234288" target="_blank">Banjo-Threeie</a>. Most games I&#8217;m content to play on a computer, but <a href="http://www.kongregate.com/games/TaroNuke/djmaniax" target="_blank">DJManiax</a>, one of my favourite rhythm/music Flash games, has a selectable tablet input mode that is really perfect for a large touchscreen. It was quite disheartening to know that my iPad would never be able to play this great game, but then I saw this video of <a href="http://www.youtube.com/watch?v=vJiqLivSUHE" target="_blank">Android 2.2 supporting Flash</a> 10.1 beta and started to get my hopes up. That was just a phone though, and I&#8217;m not sure there were any Flash-compatible tablets at the time. I contented myself to playing the same 15 free levels of Angry Birds over and over&#8230;</p>
<h3>Dealbreaker #2: No Filesystem; Only iTunes</h3>
<p>One thing that I really liked about the iPad was its slick interface for browsing photo albums by flicking your finger. In fact, flicking anything in iOS is pretty satisfying. So naturally, I thought it&#8217;d be the perfect way to read full colour comics &#8212; instead of clicking on links in the web browser, why not download them into albums so I can flick through the comics while I&#8217;m offline? I started by saving a couple of comics (as JPEG images) from Safari, and they were automatically placed into to a saved images album. But wait! All saved pictures go into the same album. How do you create or move pictures into new albums? Turns out you can&#8217;t do that from the iPad itself. In fact, you can&#8217;t manipulate or organize files in any way. What if I plug it into my computer and transfer the images that way&#8230; That&#8217;d be faster, right? Nope! For whatever reason, unlike 99% of phones and MP3 players out there, you can&#8217;t use the iPad as a USB mass storage device. (You can see the files, but it&#8217;s read-only). So instead of doing a simple drag and drop of files to the iPad, you need to install iTunes and have it sync the photos from your computer&#8217;s albums. For all its user-friendliness, Apple still makes some simple things needlessly hard. I gave up on that without installing iTunes. It just wasn&#8217;t worth the trouble.</p>
<h3>Dealbreaker #3: No DivX/Xvid</h3>
<p>Eventually I did install iTunes. It was just before a long trans-Pacific flight. I learned that my plane had no personal entertainment device, and I had forgot to bring my DS. All I had was my 5-and-a-half pound Lenovo Thinkpad with a few saved movies and the iPad. It was a 14-hour flight, so I figured I&#8217;d transfer some movies to the iPad and put its 9-hour battery life to use. Installed iTunes and&#8230; nothing. iTunes only listed 2 video files as compatible with the iPad, and they weren&#8217;t the movies I wanted to watch. It turns out ONLY h.264-encoded video can be watched on the iPad (iPad uses hardware-decoding for h.264), whereas my videos were in the more common Xvid format. So you either have to buy some 3rd-party video conversion software (iTunes doesn&#8217;t convert it!) or jailbreak the iPad and install some 3rd-party video-player software. What happened to Apple things being easier to use? Suffice to say, this wasn&#8217;t something I was going to try the night before an early flight. Instead, out on the plane came the Thinkpad and it did its job admirably; its 5-hour battery was more than enough. The iPad? I never even took it out of my backpack!</p>
<p>The airplane fiasco was the final straw. That and hearing rumours of an iPad 3 coming out in March. I was determined to sell the iPad before it became even more obsolete. The fact that my fiancée recently got her own iPad 2 also made mine redundant, and the decision easier. But I had already imagined all the great things you could do with a more capable touchscreen tablet. So after a lot of research, I sold the iPad and bought an Android tablet instead.</p>
<h3><img class="alignleft" style="border-image: initial;" title="ASUS Eee Pad Transformer and dock" src="http://www.asus.com/websites/global/products/gHh4q7I8dvWJzhdV/P_500.jpg" alt="ASUS Eee Pad Transformer and dock" width="250" height="250" /></h3>
<h3>Robots in Disguise</h3>
<p>Three months later and I can say I&#8217;m very happy with my choice &#8211; an <a href="http://www.asus.com/Eee/Eee_Pad/Eee_Pad_Transformer_TF101/" target="_blank">ASUS Eee Pad Transformer 16GB TF101</a> running Android 3.2.1 Honeycomb. I mainly chose it because of its low price ($249 on Black Friday, though I paid more than that), similar specs, and the OS. The ability to add a dock was nice to have, but I opted for the tablet only. Its smaller 16GB storage is compensated for by the microSD slot, and I don&#8217;t miss the lack of 3G. The size, weight and thickness are all nearly identical to the iPad 1. It has a brilliant IPS display just like the iPad, only with a widescreen aspect (which I love for watching movies) and higher resolution (1280&#215;800 vs 1024&#215;768) that actually makes text much sharper and nicer to read on. The same games that I liked on the iOS device (Angry Birds, Fruit Ninja) are all there on the Android as well, only the full versions are free!  <img src='http://zalbee.intricus.net/wordpress/wp-includes/images/smilies/icon_eek.gif' alt='8-O' class='wp-smiley' /> </p>
<p>But the best part is it does all the things I wanted it to do from the start. Since it supports Flash Player 11, the first thing I did was load up DJManiax. This game is not listed in the Kongregate Arcade app, which means it isn&#8217;t optimized for mobile, so I wasn&#8217;t sure what to expect. The framerate was a little low in complex sections, but damn, <em>it worked</em>, and it was really fun. A few tweaks to the quality and entering full screen helped a lot. The second thing I did was check out <a href="http://www.colbertnation.com" target="_blank">Colbert Nation</a>. Full episodes, BAM. <img src='http://zalbee.intricus.net/wordpress/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  The third thing i did was plug it into my computer. Sure enough, it appeared as a drive in Windows and I was copying my Xvid-encoded TV episodes in seconds. The Transformer wasn&#8217;t able to play the files at first, but that was easily rectified with a quick search in the Marketplace to install MX Video Player, the highest-rated video player app available. Turns out that this is a <strong>really</strong> good video player, easily better than the default Android player. :-O  It has a lot of convenient shortcuts like slide your finger anywhere at anytime horizontally to seek, vertically anywhere on the left half to adjust brightness, and vertically anywhere on the right half to adjust volume. Dare I say, it&#8217;s even better than the iPad&#8217;s interface.</p>
<p style="text-align: center;"><img class="aligncenter" title="Honeycomb Homescreen" src="https://lh3.googleusercontent.com/-crU098itlNA/TzJfRuHSK0I/AAAAAAAABzY/L2hCLLtRXwQ/s512/HomescreenTron.jpg" alt="" width="512" height="320" /></p>
<p>Of course, I&#8217;d be lying if I said there weren&#8217;t any tradeoffs. The Android Facebook app crashes occasionally and doesn&#8217;t integrate video properly (bah). Some websites will lag or crash with Flash enabled (I have plugins set to on-demand). Web browsing on the Android feels less smooth than in iOS. Webpage rendering is definitely fastest on the iPad 2; once rendered, scrolling the page around is like gliding a buttered-up sheet of soap. It feels like Apple did a much better job of using the GPU for hardware acceleration, but that&#8217;s just a guess. Not to say the ASUS tablet is bad, but on some complex websites, there is a slight half-second delay before the page starts scrolling, which makes it <em>feel</em> jerky, but once you get it started, the scrolling is smooth enough. Also on more complex websites (example: <a href="http://tsn.ca">TSN</a>), it seems that portions of the page that are offscreen need to be frequently re-rendered when you scroll them back into view. I&#8217;d wager this points to inefficiencies in the browser rendering code, and hopefully a software update can improve it. I don&#8217;t have the iPad 1 to compare anymore, but I don&#8217;t recall as much jerkiness when scrolling the iPad, but it did have similar issues with re-rendering the page, which is fine given the Transformer&#8217;s higher resolution.</p>
<p>In the end though, the ASUS Transformer gave me what I wanted &#8212; the capability to play the games I like and watch the videos I want, and that&#8217;s all that matters. In 3 months of ownership, I have already used the ASUS a lot more than in 10 months with the iPad. I can easily live with its minor annoyances for more power and capability. Considering I actually made $100 on the iPad/Transformer trade, plus the free Angry Birds/Fruit Ninja apps, and the free games available thanks to Flash, this Transformer is a pretty cost-efficient alternative.</p>
]]></content:encoded>
			<wfw:commentRss>http://zalbee.intricus.net/2012/02/why-i-sold-my-ipad-for-an-asus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kongregate Stats and Graphs</title>
		<link>http://zalbee.intricus.net/2012/01/kongregate-stats-and-graphs/</link>
		<comments>http://zalbee.intricus.net/2012/01/kongregate-stats-and-graphs/#comments</comments>
		<pubDate>Mon, 09 Jan 2012 06:50:04 +0000</pubDate>
		<dc:creator>zAlbee</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://zalbee.intricus.net/?p=86</guid>
		<description><![CDATA[Some interesting graphs I conjured up a while back for achievements earned on Kongregate, the popular Flash gaming portal. The first one is based on user data collected by MrRubix in late August 2011. It shows how many users have collected a &#8230;<p class="read-more"><a href="http://zalbee.intricus.net/2012/01/kongregate-stats-and-graphs/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Some interesting graphs I conjured up a while back for achievements earned on <a href="http://www.kongregate.com/">Kongregate</a>, the popular Flash gaming portal.</p>
<p><img src="http://zalbee.intricus.net/pics/badge-log-graph.png" alt="Graph 1: Users with X number of badges" width="1318" height="890" /></p>
<p>The first one is based on user data collected by <a href="http://www.kongregate.com/accounts/MrRubix">MrRubix</a> in late August 2011. It shows how many users have collected a certain number of badges. The data is very bottom-heavy, so it&#8217;s using a log scale (for amusement, the graph using a <a href="http://zalbee.intricus.net/pics/badge-count-graph.png">standard scale</a> is mostly useless). 744670 users have only 1 badge, while only 23 users have all 1593 badges (the max number at the time). Interestingly, the graph is mostly descending until the end, where there&#8217;s a sharp increase.</p>
<p>The next set is generated by my own script:<span id="more-86"></span></p>
<p><img class="alignnone" src="http://zalbee.intricus.net/kong/graphzalb.png" alt="Graph 2: Earned Points over Time (zAlbee)" width="549" height="327" /></p>
<p><img class="alignnone" src="http://zalbee.intricus.net/kong/graphzalb-pct.png" alt="Graph 3: Earned Badge Percentage (zAlbee)" width="502" height="322" /></p>
<p><img class="alignnone" src="http://zalbee.intricus.net/kong/graphzalb-cmp.png" alt="Graph 4: zAlbee vs All Badges" width="499" height="327" /></p>
<p>These show historical badge counts for a single user (number earned) and for Kongregate (number available). Graphs are generated dynamically, with JavaScript and HTML5 Canvas. (Original <a href="http://www.kongregate.com/forums/1-kongregate/topics/201886-user-badge-graphs">forum thread</a>.)</p>
<p>You can access up-to-date graphs <a title="Graphing Kongregate Badges" href="http://zalbee.intricus.net/kong/graph.php">here</a> and any Kongregate username can be specified. It normally takes a few seconds to load (the global badge file is ~700 KB) so please wait for it. I delayed posting this, thinking I would update the script to do some clever caching/loading first, but then got lazy, so this is it.</p>
]]></content:encoded>
			<wfw:commentRss>http://zalbee.intricus.net/2012/01/kongregate-stats-and-graphs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2011 WTF Games of the Year</title>
		<link>http://zalbee.intricus.net/2011/08/2011-wtf-goty/</link>
		<comments>http://zalbee.intricus.net/2011/08/2011-wtf-goty/#comments</comments>
		<pubDate>Sun, 28 Aug 2011 23:24:53 +0000</pubDate>
		<dc:creator>zAlbee</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://zalbee.intricus.net/?p=74</guid>
		<description><![CDATA[I have updated my annual list with 3 games! This year&#8217;s winners are a pair of deceptively simple but frustratingly difficult games, QWOP and GIRP. Plus I added an extra one to 2010 for fun. Click below to see these reviews &#8230;<p class="read-more"><a href="http://zalbee.intricus.net/2011/08/2011-wtf-goty/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img title="QWOP" src="http://zalbee.intricus.net/wtfgame/qwop-150x150.png" alt="" width="150" height="150" /> <img title="GIRP" src="http://zalbee.intricus.net/wtfgame/girp-150x150.png" alt="" width="150" height="150" /> <img title="Action Turnip" src="http://zalbee.intricus.net/wtfgame/action-turnip-150x150.png" alt="" width="150" height="150" /></p>
<p style="clear: left; text-align: left;">I have updated my <a title="zAlbee's WTF Game of the Year" href="http://zalbee.intricus.net/wtfgame.html">annual list</a> with 3 games!</p>
<p>This year&#8217;s winners are a pair of deceptively simple but frustratingly difficult games, QWOP and GIRP. Plus I added an extra one to 2010 for fun. Click below to see these reviews and more:</p>
<p><span class="Apple-style-span" style="line-height: 18px;"><a href="http://zalbee.intricus.net/wtfgame.html">zAlbee&#8217;s WTF Game of the Year</a></span></p>
]]></content:encoded>
			<wfw:commentRss>http://zalbee.intricus.net/2011/08/2011-wtf-goty/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ghost House Wallpaper</title>
		<link>http://zalbee.intricus.net/2011/04/ghost-house-wallpaper/</link>
		<comments>http://zalbee.intricus.net/2011/04/ghost-house-wallpaper/#comments</comments>
		<pubDate>Fri, 08 Apr 2011 09:04:22 +0000</pubDate>
		<dc:creator>zAlbee</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://zalbee.intricus.net/wordpress/?p=22</guid>
		<description><![CDATA[I was playing some old SNES games on emulator and decided to make a new desktop wallpaper, inspired by the SomethingAwful thread of 2003 (yikes, that was a long time ago). The idea was that, with computer monitors being so &#8230;<p class="read-more"><a href="http://zalbee.intricus.net/2011/04/ghost-house-wallpaper/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>I was playing some old SNES games on emulator and decided to make a new desktop wallpaper, inspired by the <a title="Mario Wallpaper (made it, not my idea)" href="http://forums.somethingawful.com/showthread.php?threadid=574546" target="_blank">SomethingAwful thread</a> of 2003 (yikes, that was a long time ago). The idea was that, with computer monitors being so high resolution, you could fit a lot more on screen than a Super NES on NTSC TV&#8217;s 480 lines, or whatever it was. That is, you could fit an entire game level. However, 8 years ago, I didn&#8217;t have an HD 1080p monitor&#8230; now I do. Last last weekend, I made a new one:</p>
<p><a href="http://zalbee.intricus.net/wordpress/wp-content/uploads/2011/04/desk-ghosthouse-1280x720.jpg"><img class="alignnone size-large wp-image-25" title="desk-ghosthouse-1280x720" src="http://zalbee.intricus.net/wordpress/wp-content/uploads/2011/04/desk-ghosthouse-1280x720-1024x576.jpg" alt="" width="640" height="360" /></a></p>
<p>This wallpaper contains the complete Super Mario World level, Forest of Illusion Ghost House. Stitching together screenshots from the game takes a lot of time. Fortunately, Stefan Mahrla already did most of the <a href="http://www.vgmaps.com/Atlas/SuperNES/SuperMarioWorld-ForestOfIllusion-ForestGhostHouse.png">mapping work</a>. I rearranged and edited the little things, like replacing labels with original sprites and adding extra space for the taskbar. Notice that even at 1080p resolution, the image is scaled down from the original size of 2816&#215;1584! Click below to download.</p>
<p><a href="http://zalbee.intricus.net/wordpress/wp-content/uploads/2011/04/forest-ghost-house-1920x1080-c.png">Forest Ghost House Wallpaper by zAlbee &#8211; 1920&#215;1080</a> (581 KB)</p>
]]></content:encoded>
			<wfw:commentRss>http://zalbee.intricus.net/2011/04/ghost-house-wallpaper/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>wtfomgblog</title>
		<link>http://zalbee.intricus.net/2011/04/wtfomgblog/</link>
		<comments>http://zalbee.intricus.net/2011/04/wtfomgblog/#comments</comments>
		<pubDate>Fri, 08 Apr 2011 08:47:22 +0000</pubDate>
		<dc:creator>zAlbee</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://zalbee.intricus.net/?p=1</guid>
		<description><![CDATA[Moving to WordPress for CMS/blog software instead of editing my own HTML. Let&#8217;s see if I pay more attention to it now. I just wasn&#8217;t updating the old way, not for lack of content, but because of a laziness threshold &#8230;<p class="read-more"><a href="http://zalbee.intricus.net/2011/04/wtfomgblog/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Moving to WordPress for CMS/blog software instead of editing my own HTML. Let&#8217;s see if I pay more attention to it now. I just wasn&#8217;t updating the old way, not for lack of content, but because of a laziness threshold that needed to be surpassed whenever manually updating things.</p>
<p>I thought it&#8217;d be painful to port over my old content, but so far that&#8217;s not the case. I can backdate things without touching the database. I&#8217;m also trying to restrain myself from hacking the code to bits, like I did with the IMmerge website. <em>Embrace the built-in features&#8230;</em> *deep breath*</p>
<p>I have to say, the dynamically PHP-generated pages load noticeably slower than static HTML. Maybe it&#8217;s the server.</p>
]]></content:encoded>
			<wfw:commentRss>http://zalbee.intricus.net/2011/04/wtfomgblog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2010 WTF Game of the Year</title>
		<link>http://zalbee.intricus.net/2010/10/2010-wtf-game-of-the-year/</link>
		<comments>http://zalbee.intricus.net/2010/10/2010-wtf-game-of-the-year/#comments</comments>
		<pubDate>Sun, 17 Oct 2010 12:00:17 +0000</pubDate>
		<dc:creator>zAlbee</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://zalbee.intricus.net/wordpress/?p=9</guid>
		<description><![CDATA[I have named the 2010 WTF game of the year. It includes cars and zombies.]]></description>
			<content:encoded><![CDATA[<p>I have named the <a href="http://zalbee.intricus.net/wtfgame.html">2010 WTF game of the year</a>. It includes cars and zombies.</p>
]]></content:encoded>
			<wfw:commentRss>http://zalbee.intricus.net/2010/10/2010-wtf-game-of-the-year/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Robot Wants Fishy &#8211; complete map</title>
		<link>http://zalbee.intricus.net/2010/09/robot-wants-fishy-complete-map/</link>
		<comments>http://zalbee.intricus.net/2010/09/robot-wants-fishy-complete-map/#comments</comments>
		<pubDate>Thu, 09 Sep 2010 12:00:59 +0000</pubDate>
		<dc:creator>zAlbee</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://zalbee.intricus.net/wordpress/?p=6</guid>
		<description><![CDATA[Complete Map (warning: huge picture 662 KB) for Robot wants Fishy, including all item locations.]]></description>
			<content:encoded><![CDATA[<p><a href="http://zalbee.intricus.net/pics/rwfmap-complete.png">Complete Map</a> (warning: huge picture 662 KB) for <a href="http://www.kongregate.com/games/Hamumu/robot-wants-fishy?referrer=zAlbee">Robot wants Fishy</a>, including all item locations.</p>
]]></content:encoded>
			<wfw:commentRss>http://zalbee.intricus.net/2010/09/robot-wants-fishy-complete-map/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Solving Continuity Levels with Dijkstra&#8217;s Shortest Path</title>
		<link>http://zalbee.intricus.net/2010/04/solving-continuity-levels/</link>
		<comments>http://zalbee.intricus.net/2010/04/solving-continuity-levels/#comments</comments>
		<pubDate>Fri, 16 Apr 2010 18:46:49 +0000</pubDate>
		<dc:creator>zAlbee</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://zalbee.intricus.net/?p=45</guid>
		<description><![CDATA[(This article was originally posted here.) Continuity is a new Flash game that I was playing recently. It combines platforming and puzzle in a novel way &#8211; your character must jump from platform to platform collecting keys to open a door, &#8230;<p class="read-more"><a href="http://zalbee.intricus.net/2010/04/solving-continuity-levels/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p><em>(This article was originally posted <a href="http://zalbee.intricus.net/immerge/blog/94">here</a>.)</em></p>
<p><a href="http://www.kongregate.com/games/glimajr/continuity?sfa=permalink&amp;referrer=zAlbee">Continuity</a> is a new Flash game that I was playing recently. It combines platforming and puzzle in a novel way &#8211; your character must jump from platform to platform collecting keys to open a door, but must do so inside mini-levels (squares). The macro-game is essentially an <a href="http://en.wikipedia.org/wiki/8_puzzle">8-puzzle</a> (8 pieces in a 3&#215;3 square grid), where you shift the puzzle pieces using the one empty space, such that your character can succeed in the mini-levels.</p>
<p>This game is perfectly solvable through logic and working backwards, though for some of the harder levels you need to keep a long memory of steps. In short, I became bored and impatient of solving the puzzles in my head, and decided after ~30 levels, it&#8217;d be more interesting to automate it by writing a solver.</p>
<p>I also took this opportunity to get familiar with <a href="http://www.python.org/">Python</a>, a language well known for its fast prototyping and easy learning curve. I have only worked in Python once, during a 4-month internship 4 years ago, but otherwise, my main skills are in C and Java. However the syntax required to write good algorithms and data structures in these &#8220;classic&#8221; languages can get quite long and annoying. So I coded up a Python script to solve the final two levels.</p>
<p>The rest of this post details how to develop the solution. The solution is relatively simple because we can just treat each exit in a square as a point in a directed graph, where each edge in the graph A-&gt;B specifies that point B is reachable from point A, and then apply a search algorithm through the graph. I chose <a href="http://en.wikipedia.org/wiki/Dijkstra's_algorithm">Dijkstra&#8217;s shortest path</a> algorithm, which runs fast and finds the best (shortest) solution. However, my program did require a lot of manual data entering to specify the paths/exits in each puzzle piece, so it wasn&#8217;t fully automatic. Perhaps Python has some <a href="http://xkcd.com/353/" target="_blank">magic</a> that could automate this <img src='http://zalbee.intricus.net/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Lastly, I skipped solving the 8-puzzle, since it&#8217;s not necessary.</p>
<p><span id="more-45"></span></p>
<h2>The Basics</h2>
<p>First some notation. I will number the squares (from 1-n). In this game, your character can only move between two squares if the sides match exactly. So, for each square, I will classify its sides with a letter. Two sides that can connect to each other will have the same letter, but different case (e.g. side X connects to side x).  Top and left sides will use capital letters; bottom and right sides use lower case. We will label each opening in an side A as A1, A2, A3, etc&#8230; in order from top to bottom or left to right.</p>
<p>I will use Level 31 in Continuity as an example. I have labelled this level in the below image. The labels just make it easier for a human to follow (and to input).</p>
<p>&nbsp;</p>
<div>
<dl>
<dt><img title="Continuity Level 31" src="http://zalbee.intricus.net/pics/continuity31_labels.png" alt="" width="640" height="480" /></dt>
<dd>Matching sides are labelled with letters.</dd>
</dl>
</div>
<p>&nbsp;</p>
<p>In this level, there are 7 types of sides with these openings:</p>
<div>Number of openings  (points) per side:</div>
<div>Left/right sides:</div>
<div>
<ul>
<li> side A/a: 2</li>
<li> side B/b: 2</li>
<li> side C/c: 2</li>
</ul>
</div>
<div>Top/bottom sides:</div>
<div>
<ul>
<li> side Z/z: 2</li>
<li> side Y/y: 2</li>
<li> side X/x: 0</li>
<li> side W/w: 1</li>
</ul>
</div>
<p>In Python:</p>
<pre>numOpenings = {'a':2, 'b':2, 'c':2, 'z':2, 'y':2, 'x':0, 'w':1}</pre>
<p>The following are the sides that each square possesses. Also noted the special points and their related openings:</p>
<table>
<tbody>
<tr>
<th>Square</th>
<th>Sides</th>
<th>Notes</th>
</tr>
<tr>
<td>1:</td>
<td>A, b, Z, z</td>
<td></td>
</tr>
<tr>
<td>2:</td>
<td>B, b, Y, y</td>
<td>&lt;Keys: b2&gt;</td>
</tr>
<tr>
<td>3:</td>
<td>B, a, W, w</td>
<td></td>
</tr>
<tr>
<td>4:</td>
<td>C, a, Z, y</td>
<td></td>
</tr>
<tr>
<td>5:</td>
<td>A, a, W, z</td>
<td>&lt;Start: A1, a1, W1&gt;</td>
</tr>
<tr>
<td>6:</td>
<td>A, b, Z, z</td>
<td>&lt;Finish: Z2&gt;</td>
</tr>
<tr>
<td>7:</td>
<td>B, c, Y, x</td>
<td></td>
</tr>
<tr>
<td>8:</td>
<td>C, b, Z, w</td>
<td>Keys: b1, (Z1 or Z2)</td>
</tr>
</tbody>
</table>
<p>In my code, I simply use strings to store the sides per square, since they are easy to deal with:</p>
<pre>sqEdges = ["AbZz", "BbYy", "BaWw", "CaZy", "AaWz", "AbZz", "BcYx", "CbZw"]</pre>
<h2>Setting up the Graph Data</h2>
<p>Construct a directed graph of connected points. There is a connection (edge) from p1 -&gt; p2 if you can get from p1 to p2. That does not imply you can get from p2 -&gt; p1 because of game physics (jumping and gravity), so this is a directed graph.</p>
<h3>First, inter-square connections (between different squares).</h3>
<p>It is simple to see that any 2 squares can be placed adjacent to each other in whichever way desirable. We just assume that any such move is equally easy to do, with weight 1. (Because it really is easy!)</p>
<p>All matching sides can be connected to each other, with the exception of top and bottom sides, where the connection is one-way (top to bottom). So we can infer all inter-square connections from the square-&gt;sides table above, using a loop:</p>
<div>for each square S:</div>
<div style="padding-left: 30px;">for each side E in S:</div>
<div style="padding-left: 60px;">for each other square T with matching side e:</div>
<div style="padding-left: 90px;">for each point i per side E/e:</div>
<div style="padding-left: 120px;">if (S.E is not a top side):</div>
<div style="padding-left: 150px;">S.Ei -&gt; T.ei</div>
<h3>Secondly, find the intra-square connections (within same square).</h3>
<p>Unfortunately, the only way to do this is inspect each square to see if it is possible to reach the opening via jumping inside the square alone. This was easily the longest (and most error-prone) part of the process. I won&#8217;t even list them all here because the list is so long.</p>
<div>Connections:</div>
<div style="padding-left: 30px;">1: Z1 -&gt; A1, Z2 -&gt; z2, Z2 -&gt; b2, A2 -&gt; z1</div>
<div style="padding-left: 30px;">2: Y1 -&gt; B1, Y1 -&gt; B2, Y1 -&gt; y2, Y2 -&gt; B2, Y2 -&gt; y2, B1 -&gt; B2, B1 -&gt; y2</div>
<div style="padding-left: 30px;">(or, minimally: Y1 -&gt; B1, B1 -&gt; B2, Y1 -&gt; B2, Y2 -&gt; B2, B2 -&gt; y2)</div>
<div style="padding-left: 30px;">3:</div>
<div style="padding-left: 30px;">&#8230;</div>
<div style="padding-left: 30px;">etc.</div>
<h3>Finally, connections from special points to openings.</h3>
<p>Ah, these are the keys and doors in the game. Yes, there is still a game here <img src='http://zalbee.intricus.net/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> .</p>
<p>Most of the time, extra points are not necessary. Most keys or doors can only be reached by one opening, so just use that point. For starting point, just pick the closest opening. If a key or door can be reached by more than one opening, we will create an extra point with connections. For example, in this level, &#8216;key2&#8242; is the only extra point:</p>
<div style="padding-left: 30px;">8.Z1 -&gt; key2</div>
<div style="padding-left: 30px;">8.Z2 -&gt; key2</div>
<div style="padding-left: 30px;">key2 -&gt; w1</div>
<div style="padding-left: 30px;">key2 -&gt; b2</div>
<p>and the others we can just alias to existing points:</p>
<div style="padding-left: 30px;">Start = A1</div>
<div style="padding-left: 30px;">Finish = Z2</div>
<div style="padding-left: 30px;">key3 = 2.b2</div>
<div style="padding-left: 30px;">key1 = 8.b1</div>
<h2>Solving the Path!</h2>
<p>Now we need to find a path that collects all keys and reaches the goal (door). The order of which keys to collect does not matter. Let&#8217;s just pick an arbitrary order of key collecting. Then find a path from &lt;Start&gt; to &lt;key1&gt; &#8230; &lt;keyN&gt; to &lt;Finish&gt;. Call these the checkpoints.</p>
<p>One solution is to run some search algorithm from each checkpoint to the next, then concatenate the paths together. We could use common search algorithms (DFS, BFS) to traverse though the nodes until we find the goal. DFS backtracks when it reaches a dead end, while BFS searches all paths in parallel, one step at a time.</p>
<p>A better way is to run a global shortest path algorithm, that finds shortest path from one point to every other point, such as Dijkstra&#8217;s algorithm. This algorithm is nice, because it only needs to check each node once, not doing any actual traversal. A bonus: We can select whichever order of collecting keys that gives the shortest total path. We can also give weights to the edges (e.g. I used cost = 1 to travel inside a square, but cost=10 to go between squares).</p>
<p>This does not take into account how many moves are required in the macro puzzle to shuffle the squares around to make the desired connection. Assigning a weight to each inter-square connection equal to number of &#8220;shuffles&#8221; might work, except this number depends on the previous arrangement of squares. Thus we would have to track the state of the macro puzzle with each step in a DFS or BFS search, and the weight would only be valid for that state; we&#8217;d have to recompute at each new state. Not only that, but DFS/BFS are not well-suited for weighted search. It wouldn&#8217;t work at all using the Dijkstra&#8217;s shortest path method, since that relies on global costs of each path that are known beforehand to be unchanging.</p>
<p>In any case, that is enough, because shifting two squares next to each other is extremely easy.</p>
<h2>Coding</h2>
<p>Here is the best part about Python. It is extremely easy to go from pseudo-code of a Dijkstra&#8217;s algorithm to Python code, thanks to its built in list and dictionary types and short syntax.</p>
<p>I used some object-oriented features (to encapsulate squares, each which hold a list of its points, each point holds an adjacency list of connected points), or you can go C-style and use global list variables like you would arrays. In fact, I ended up with a mix of both styles.</p>
<h2>The Final Solution</h2>
<h3>Level 31</h3>
<p>Here are the results for Level 31. I grabbed a <a href="http://snippets.dzone.com/posts/show/753">permutation function</a> off the Internet that was only 7 lines (wow!), and so found all the solutions for each different order of collecting the 3 keys. This was the shortest one:</p>
<pre>###############
Solving for Permutation 6 of key collecting order:
-------------------
Finding shortest path from Sq 5-A1 (left top) to Sq 8-b1 (right top).
Sq 5-A1 (left top)
Sq 4-a1 (right top)
Sq 4-y1 (bottom left)
Sq 2-Y1 (top left)
Sq 2-B1 (left top)
Sq 8-b1 (right top)
Distance is 32
Finding shortest path from Sq 8-b1 (right top) to Sq 2-b2 (right bottom).
Sq 8-b1 (right top)
Sq 3-B1 (left top)
Sq 3-B2 (left bottom)
Sq 2-b2 (right bottom)
Distance is 21
Finding shortest path from Sq 2-b2 (right bottom) to key2.
Sq 2-b2 (right bottom)
Sq 7-B2 (left bottom)
Sq 8-b2 (right bottom)
Sq 8-w1 (bottom )
Sq 3-W1 (top )
Sq 3-a2 (right bottom)
Sq 1-A2 (left bottom)
Sq 1-z1 (bottom left)
Sq 8-Z1 (top left)
key2
Distance is 54
Finding shortest path from key2 to Sq 6-Z2 (top right).
key2
Sq 8-w1 (bottom )
Sq 3-W1 (top )
Sq 3-a2 (right bottom)
Sq 1-A2 (left bottom)
Sq 5-a2 (right bottom)
Sq 5-z2 (bottom right)
Sq 6-Z2 (top right)
Distance is 43
Total Distance is 150</pre>
<h3>&nbsp;</p>
<div>
<dl>
<dt><img title="Continuity Level 31" src="http://zalbee.intricus.net/pics/continuity31_labels.png" alt="" width="640" height="480" /></dt>
<dd>Level 31 again, for cross-reference.</dd>
</dl>
</div>
</h3>
<h3>Level 32</h3>
<p>As a bonus, here is the best solution for Level 32 using the same technique. Being the last level, the difficulty is higher, and you can see because of the very few common sides between squares. Four of the sides do not even have a corresponding match (A, F, h, i). But it could be worse &#8212; at least all the bottom sides have some square to fall into! For this level, the shortest path for the best permutation of key collecting had distance 143 and the worst was 283. So that&#8217;s about half. Bet your Youtube video walkthrough didn&#8217;t have that information <img src='http://zalbee.intricus.net/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> .</p>
<p>&nbsp;</p>
<div>
<dl>
<dt><img title="Continuity Level 32" src="http://zalbee.intricus.net/pics/continuity32_labels.png" alt="" width="640" height="480" /></dt>
<dd>This one is harder.</dd>
</dl>
</div>
<p>&nbsp;</p>
<pre>###############</pre>
<pre>Solving for Permutation 3 of key collecting order:
-------------------
Finding shortest path from Sq5 Central Area to Sq 2-V3 (top right).
Sq5 Central Area
Sq 5-d2 (right bottom)
Sq 4-D2 (left bottom)
Sq 1-d2 (right bottom)
Sq 1-v3 (bottom right)
Sq 2-V3 (top right)
Distance is 32
Finding shortest path from Sq 2-V3 (top right) to Sq 7-w1 (bottom ).
Sq 2-V3 (top right)
Sq 2-x3 (bottom right)
Sq 6-X3 (top right)
Sq 6-c1 (right top)
Sq 3-C1 (left top)
Sq 3-W1 (top )
Sq 7-w1 (bottom )
Distance is 33
Finding shortest path from Sq 7-w1 (bottom ) to Sq 2-B1 (left top).
Sq 7-w1 (bottom )
Sq 3-W1 (top )
Sq 3-g1 (right top)
Sq 7-G1 (left top)
Sq 7-U1 (top left)
Sq 6-u1 (bottom left)
Sq 1-U1 (top left)
Sq 1-A1 (left top)
Sq 1-A2 (left bottom)
Sq 1-v1 (bottom left)
Sq 2-V1 (top left)
Sq 2-B1 (left top)
Distance is 56
Finding shortest path from Sq 2-B1 (left top) to Sq 2-b1 (right top).
Sq 2-B1 (left top)
Sq 2-x1 (bottom left)
Sq 8-X1 (top left)
Sq 8-B1 (left top)
Sq 2-b1 (right top)
Distance is 22
Total Distance is 143</pre>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://zalbee.intricus.net/2010/04/solving-continuity-levels/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

