<?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>Struct.ca &#187; Matt</title>
	<atom:link href="http://struct.ca/author/matt/feed/" rel="self" type="application/rss+xml" />
	<link>http://struct.ca</link>
	<description>Words On Play</description>
	<lastBuildDate>Sun, 23 Oct 2011 20:41:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>In Defence of Freemium</title>
		<link>http://struct.ca/2011/in-defence-of-freemium/</link>
		<comments>http://struct.ca/2011/in-defence-of-freemium/#comments</comments>
		<pubDate>Sat, 22 Oct 2011 03:10:14 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Game Design]]></category>

		<guid isPermaLink="false">http://struct.ca/?p=790</guid>
		<description><![CDATA[Note: this was originally intended to be a comment on Adam Saltsman&#8217;s &#8220;Contrivance and Extortion II&#8221; post on Gamasutra, but it got way too long, so I decided to post it here instead Hey Adam, I&#8217;m glad that you&#8217;re bringing &#8230; <a href="http://struct.ca/2011/in-defence-of-freemium/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><em>Note: this was originally intended to be a comment on Adam Saltsman&#8217;s &#8220;<a href="http://www.gamasutra.com/blogs/AdamSaltsman/20111020/8703/Contrivance_and_Extortion_II_Clarifications_Feedback__Suggestions.php">Contrivance and Extortion II</a>&#8221; post on Gamasutra, but it got way too long, so I decided to post it here instead</em></p>
<p>Hey Adam, I&#8217;m glad that you&#8217;re bringing all these issues up and starting this discussion, and I think (maybe) I can convince you of the benefits of freemium games, or at least present an alternative viewpoint. I should also point out that I&#8217;ve never made a freemium game, and that I usually make the kind of games I imagine you&#8217;d <a href="http://trainyard.ca">enjoy</a>.</p>
<p>To start off, I think we need to talk about perspective.</p>
<p>You (just like me, and a lot of other people here), approach games as a game designer first. This has a bunch of interesting side-effects. The first is that we have &#8220;game-designer-itis&#8221;, where we play a lot of games, but usually only play them long enough to grok what they&#8217;re about and to experience whatever it is that makes them unique. This is why people like us love games like Braid where there&#8217;s very little repetition. Every single level introduces a new element, a new twist. There&#8217;s no fluff, no filler.</p>
<p>On the other hand, we never finish most blockbuster games for the same reason. They just get too repetitive. I&#8217;ve never finished Halo, Gears of War, GTA, etc. It&#8217;s not because I couldn&#8217;t finish them, in fact, it&#8217;s just the opposite: I knew I could finish them, so I didn&#8217;t see the point; I had already explored all of the systems that the game had to offer.</p>
<p>Now let&#8217;s be clear, there&#8217;s absolutely nothing wrong with the way we approach games, but I don&#8217;t think it&#8217;s fair to assume all gamers are the same as us. A lot of people play games purely as a form of entertainment, and so they want as much of it as they can. They&#8217;re not nearly as concerned about whether each moment they&#8217;re experiencing is unique or not, they just play games as a way to escape normal life, a way to kill time, a way to be someone they aren&#8217;t.</p>
<p>Ok, so how does this all tie in with freemium games? There was a fantastic presentation at GDC 2011 called &#8220;The Fantasy of Labor&#8221;. If you have access to the <a href="http://www.gdcvault.com/">GDC Vault</a>, I highly recommend you check it out. The ideas I&#8217;m writing about here are rooted in the concepts that were presented there.</p>
<p>The core idea of the talk is that all games require three things from a player, in varying amounts depending on the game: skill, luck, and labor. A game like Street Fighter requires mostly skill, a game like roulette requires mostly luck, Farmville requires mostly labor, etc.</p>
<p>The common attitude in both the game development and &#8220;hardcore gamer&#8221; communities is heavily biased towards skill-based games. These games are appealing to the majority of the traditional gaming community, but they have flaws. The talk goes into detail into quite a few issues, but the most important take-away is this: *a lot of players do not want to play games that require skill*.</p>
<p>Now let&#8217;s move from skill to labour. There are a huge number of players (a large portion of the &#8220;casual&#8221; demographic) who *enjoy* games that are labour based, and dislike games that are skill based. They want a game where they know that the longer they work, they will always improve, no matter what.</p>
<p>It took me a long time to come to grips with the fact that some players really don&#8217;t want a game with interesting gameplay or systems for them to grok. They just want something where the more time they spend, the more results they&#8217;ll get. They aren&#8217;t looking to be rescued by some well-meaning game designer, saving the day, saying &#8220;no, this is what games really are! Try all these interesting systems, look how intrinsically motivating this game is!&#8221;, instead they just want to check boxes on a checklist. They *want* to.</p>
<p>Alright, now for the final piece of the puzzle. In your post you implied that the only reason someone will pay to skip ahead is if their urge to complete the extrinsic checklist overpowers their enjoyment of the intrinsic mechanics of the game. I heard someone summarize the main take-away of your post as this: &#8220;If a game lets you pay to skip playing, it&#8217;s not fun. Why wouldn&#8217;t you want to play?&#8221;.</p>
<p>One issue with this argument is that it doesn&#8217;t consider all of the other elements that make up a game, especially the aesthetics and mythology. I think we can agree that it&#8217;s possible for these to motivate certain players way more than &#8220;the desire to experience the mechanics&#8221; or &#8220;the desire to improve their skill&#8221;. Players will sometimes want to advance just so they can experience more of the story or more of the aesthetics, and there&#8217;s nothing wrong with that.</p>
<p>Now coming back to the checklist. I think this is probably the main point I want to make: some people actually enjoy filling out the checklist. And really, it&#8217;s not just some people, but a large portion of players in the casual gaming space. Even more importantly, they don&#8217;t enjoy the kind of games that *you or I* wish they would enjoy. Specifically, they don&#8217;t want games that require skill, and they don&#8217;t want games with interesting mechanics (unless there&#8217;s also a checklist attached).</p>
<p>One more thing: even if you think I&#8217;m completely fabricating the existence of this type of player (I can assure you, I&#8217;m not), I think we can probably agree that even regular gamers can become this type of player *some of the time*. For example, long after I&#8217;d grokked all of the core mechanics of Tiny Tower, I kept playing for weeks because of the desire to see my tower get taller, and I loved every minute of it.</p>
<p>So to wrap up: freemium games are giving players what they want.</p>
<p>&nbsp;</p>
<p><em>An afterword: I really want to be clear that I&#8217;m not saying &#8220;freemium games can do no evil&#8221;, because they can, and a lot of them do. I simply want to point out that the core mechanics of these games are not inherently evil, and that they fulfill the needs of certain types of players.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://struct.ca/2011/in-defence-of-freemium/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>Luna Soul</title>
		<link>http://struct.ca/2011/luna-soul/</link>
		<comments>http://struct.ca/2011/luna-soul/#comments</comments>
		<pubDate>Sun, 18 Sep 2011 03:27:31 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Game Design]]></category>
		<category><![CDATA[iDevBlogADay]]></category>
		<category><![CDATA[iOS Development]]></category>

		<guid isPermaLink="false">http://struct.ca/?p=772</guid>
		<description><![CDATA[This iDevBlogADay post is about Luna Soul, the game I made during the game jam at the 360iDev conference last week. The Conference I really want to keep this post short, so I won&#8217;t go into too many details about &#8230; <a href="http://struct.ca/2011/luna-soul/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>This <a href="http://idevblogaday.com">iDevBlogADay</a> post is about Luna Soul, the game I made during the game jam at the <a href="http://360idev.com">360iDev</a> conference last week.</p>
<h2>The Conference</h2>
<p>I really want to keep this post short, so I won&#8217;t go into too many details about 360iDev itself. I could spend more than a few paragraphs just talking about all the things I ate, but instead I&#8217;ll  summarize the whole conference: it was great.  I loved learning and being inspired by presentations, I loved eating copious amounts of meat and fried food, and I loved hanging out with &#8220;old&#8221; friends and meeting new ones that&#8217;d I&#8217;d previously only known through Twitter.</p>
<h2>The Jam</h2>
<p>A game jam is usually where a bunch of people get together and make games over a short period of time, and the 360iDev game jam was no different. It started on Tuesday at 8pm and went through the night. There was no defined end time, except that the games had to be done by noon on Wednesday so they could be presented to everyone else. This was a pretty crazy schedule, especially considering that Wednesday was a regular conference day.</p>
<h2>The Theme</h2>
<p>The theme for the jam was &#8220;opposite&#8221;, which was announced at noon on Tuesday, giving everyone about 6 hours to come up with a game idea. I had already decided that no matter what the theme was, I wanted to make a &#8220;freemium style&#8221; game. This isn&#8217;t really because I enjoy that kind of game, but more because I wanted to try that genre out so I could learn more about it.</p>
<p>I struggled with combining &#8220;opposite&#8221; and &#8220;freemium&#8221; for a while, and actually didn&#8217;t come up with an idea until 45 minutes *after* the jam had started. I considering things like magnets and &#8220;opposites attract&#8221;, but it wasn&#8217;t until I thought about actual opposites, like &#8220;hot and cold&#8221; and &#8220;up and down&#8221;, that I found my starting point: &#8220;night and day&#8221;.</p>
<p><a href="http://struct.ca/wp-content/uploads/2011/09/Screen-shot-2011-09-17-at-10.46.17-PM.png"><img class="alignnone size-full wp-image-779" title="Luna Soul " src="http://struct.ca/wp-content/uploads/2011/09/Screen-shot-2011-09-17-at-10.46.17-PM.png" alt="" width="640" height="480" /></a></p>
<h2>The Result</h2>
<p>I spent the first 7 hours in the jam room, and the last 5 in my hotel room, where it was quieter, finally finishing at 10am. The result is a game I call &#8220;Luna Soul&#8221;, a play on luna (moon) and sol (sun). The game features a constant day-night cycle. In daytime, flowers grow, and at night, mushrooms grow. Your job is to harvest both types of plants and combine them as herbal &#8220;recipes&#8221;, which you then sell. You can use the money from selling plants to buy more complicated recipes.</p>
<p><a href="http://struct.ca/wp-content/uploads/2011/09/Screen-shot-2011-09-17-at-10.49.00-PM.png"><img class="alignnone size-full wp-image-780" title="Recipes" src="http://struct.ca/wp-content/uploads/2011/09/Screen-shot-2011-09-17-at-10.49.00-PM.png" alt="" width="640" height="480" /></a></p>
<p>I developed the game in Flash, because of just how fast it is to develop in, and because I knew I wanted to have a bunch of animations. I used Adobe&#8217;s AIR-to-iOS packager, so people could actually play the game on my iPad at the jam. Due to the magic of Flash, you can even <a href="http://struct.ca/games/lunasoul">play the game right now</a>. This is the *exact state* the game was in at the end of the game jam after 12 hours of work. I haven&#8217;t changed anything since then.</p>
<h2>The Music</h2>
<p>The final thing I wanted to mention is the music. The multi-talented <a href="http://twitter.com/PhilHassey">Phil Hassey</a> (creator of <a href="http://galcon.com">Galcon</a>) brought his fiddle to the game jam and offered to create music for anyone that wanted it. There were four games that ended up using his music, including mine. It really helps to signify the exact change between night and day, and more importantly, it adds a lot of character to the game. I&#8217;ve included a video of him performing at the jam below.</p>
<p><object width="640" height="385" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/njDFC84aXSk?fs=1&amp;hl=en_US" /><param name="allowfullscreen" value="true" /><embed width="640" height="385" type="application/x-shockwave-flash" src="http://www.youtube.com/v/njDFC84aXSk?fs=1&amp;hl=en_US" allowFullScreen="true" allowscriptaccess="always" allowfullscreen="true" /></object></p>
<h2>Wrapping Up</h2>
<p>Luna Soul is far from perfect but I&#8217;m pretty proud of how far I got with it. I&#8217;m not sure if I&#8217;m going to do anything else with the game, but I do have a bunch of ideas for how it could be improved.</p>
<p>One last thing: make sure you check out all of the other <a href="http://gamejam.360idev.com">game jam entries</a>,  there were lots of really impressive games demoed at the jam, so it&#8217;s worth browsing that site to see how much stuff was made in a single night. If I had to pick a favourite entry, I think it&#8217;d be <a href="http://gamejam.360idev.com/vocab-bots/">Vocab Bots</a> by <a href="http://twitter.com/rwenderlich">Ray</a> and <a href="http://twitter.com/vwenerlich">Vicki</a> Wenderlich. Great idea and great execution.</p>
<p>Thanks for reading this post. As usual, if you have any feedback, you can post it here or send it to <a href="http://twitter.com/MattRix">@MattRix on Twitter</a>. Cheers!</p>
]]></content:encoded>
			<wfw:commentRss>http://struct.ca/2011/luna-soul/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Engineering An Update &#8211; Part Two</title>
		<link>http://struct.ca/2011/engineering-an-update-part-2/</link>
		<comments>http://struct.ca/2011/engineering-an-update-part-2/#comments</comments>
		<pubDate>Mon, 05 Sep 2011 08:50:08 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[App Store]]></category>
		<category><![CDATA[Game Design]]></category>
		<category><![CDATA[iOS Development]]></category>
		<category><![CDATA[Trainyard]]></category>

		<guid isPermaLink="false">http://struct.ca/?p=743</guid>
		<description><![CDATA[Recap I wrote a post last week about my struggles and dilemmas while creating the new Trainyard Engineer Update. This week I&#8217;d like to talk about what I actually did in this update. I&#8217;m not going to get too technical, but &#8230; <a href="http://struct.ca/2011/engineering-an-update-part-2/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><span class="Apple-style-span" style="color: #000000; font-size: 22px; line-height: 32px;">Recap</span></p>
<p>I wrote a post <a href="http://struct.ca/2011/engineering-an-update-part-1">last week</a> about my struggles and dilemmas while creating the new <a href="http://trainyard.ca">Trainyard</a> Engineer Update. This week I&#8217;d like to talk about what I actually did in this update. I&#8217;m not going to get too technical, but if you have technical questions about anything I did, I&#8217;d love to answer them, just ask in the comments section.</p>
<h2>Backend</h2>
<p>The backend for this update was probably the biggest area of concern for me. I was seriously considering switching to something like Amazon Web Services, but eventually decided to stick with my current backend (PHP+MySQL on Dreamhost PS). I finally got around to learning a whole lot more about SQL (big thanks to <a href="http://twitter.com/torontogamejam">Jim McGinley</a>) and optimized the database with better indexes and smarter queries. I also wrote dozens of new scripts for handling uploaded puzzles, solutions, and other user data.</p>
<p>I rewrote most of the frontend code on the website, creating &#8220;AJAX-style&#8221; <a href="http://trainyard.ca/puzzles">puzzle and solution browsing systems</a>. I added the ability to comment on puzzles, and the ability to open puzzles directly from the site if you&#8217;re browsing on an iOS device with Trainyard installed.</p>
<h2>The editor</h2>
<p>The in-game puzzle editor itself was a huge amount of work, and took a ton of planning to get right. I went through pages and pages of sketches and potential interface designs before I settled on its current look and flow. I&#8217;m really happy with how it turned out, but man, it took a lot of effort to get there.</p>
<p>Although creating the puzzle editor itself took a lot of time, I spent even more time creating all the extra stuff to surround it. For example, there&#8217;s a screen to enter the puzzle name and description, a screen to let you solve your own puzzles, and even a screen to show you the data you&#8217;re about to submit, so you can verify that it&#8217;s correct before submitting it.</p>
<p>On top of all that, there are also tons of little subtle features that most people will never see. One small example: if you submit a puzzle that&#8217;s identical to a puzzle someone else submitted, it&#8217;ll warn you and even allow you to download their puzzle instead.</p>
<p>If you want to see how the editor works and the whole process of creating a puzzle,  just watch the video below:</p>
<p><object width="640" height="385" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/XbyT_pRzoDs?fs=1&amp;hl=en_US" /><param name="allowfullscreen" value="true" /><embed width="640" height="385" type="application/x-shockwave-flash" src="http://www.youtube.com/v/XbyT_pRzoDs?fs=1&amp;hl=en_US" allowFullScreen="true" allowscriptaccess="always" allowfullscreen="true" /></object></p>
<h2>Browsing</h2>
<p>Creating the system for browsing puzzles was also a lot of work. One of the key issues for me was discovery; I needed players to be able to find great puzzles without having to shuffle through thousands of so-so puzzles. The solution I arrived at is now called &#8220;featured puzzles&#8221;. This is a list of puzzles that I&#8217;ve hand-picked, and that I can update online at any time. This ensures that there will always be a stream of fresh, interesting puzzles.</p>
<p>For players that are brave enough to explore all of the user-made puzzles, I made a &#8220;worldwide puzzles&#8221; section. There are a bunch of different search options there, so for example, you can find puzzles that are new, popular, or unsolved. I also created a Facebook-ish &#8220;like&#8221; system where players can choose to like a puzzle after they&#8217;ve solved it. As of writing this 5 days after release, there have already been over 10000 likes submitted.</p>
<p>The last two areas of puzzles are &#8220;my puzzles&#8221; and &#8220;saved puzzles&#8221;. &#8220;My puzzles&#8221; is a list of puzzles that the user has created, regardless of whether they&#8217;ve been submitted or they&#8217;re still being created. &#8220;Saved puzzles&#8221; is a list of all the puzzles that a given user has tried, whether they&#8217;re solved or not.</p>
<p>The video below shows me going through all the different puzzle browsing sections so you can see how they work:</p>
<p><object width="640" height="385" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/EmMmemETgQg?fs=1&amp;hl=en_US" /><param name="allowfullscreen" value="true" /><embed width="640" height="385" type="application/x-shockwave-flash" src="http://www.youtube.com/v/EmMmemETgQg?fs=1&amp;hl=en_US" allowFullScreen="true" allowscriptaccess="always" allowfullscreen="true" /></object></p>
<h2>Wrenches</h2>
<p>If you&#8217;re familiar with the normal game in Trainyard, you&#8217;ll remember that all puzzles award &#8220;stars&#8221; when solved. I decided to do the same thing in engineer mode, but with &#8220;wrenches&#8221; (spanners for you UK people). I let users assign their puzzles an arbitrary wrench count between 1 and 30 when they submit the puzzle. In theory the wrench count represents the difficulty of the puzzle, but in reality it&#8217;s not always accurate, which is totally fine. I considered some more accurate systems for determining puzzle difficulty, but it just wasn&#8217;t worth the effort, because wrenches really don&#8217;t matter for anything anyway.</p>
<h2>Goodies</h2>
<p>The last major thing I added to the game is the &#8220;Goodies&#8221; section. Goodies is essentially just a catch-all for all the features I had wanted to add but didn&#8217;t have a chance. It&#8217;s also very flexible so it&#8217;s super easy to add more features to it in the future if needed. Here are the items that are there right now: News, Achievements, Tutorials, Mailing List, Tips &amp; Tricks, Solutions.</p>
<h2>Goodies: News</h2>
<p>News is a list of Trainyard related news items for users to read. The data comes from an xml file hosted on Amazon S3. Each news item has HTML content that can be shown in a webview, which allows for stuff like embedding YouTube videos.</p>
<p>If I want I can also specify that a news item is an &#8220;alert&#8221;, and then it will pop up when the user starts the game. I can also do things like targeting news alerts to specific users, for example, to those who have a certain version of the game, or to those for whom this version is an update (rather than the first time they&#8217;ve played).</p>
<h2>Goodies: Achievements</h2>
<p>One of the biggest requests for Trainyard has been Game Center support, so I finally decided to put it in this version. The tough part of integrating it was that Trainyard allows you to have two local users, so I had to figure out how to make that work with Game Center.</p>
<p>What I ended up doing is making it so that the local data is authoritative on achievements. The game will never download achievement progress from Game Center. Instead, if an achievement has more progress locally than in Game Center, it&#8217;ll automatically push that progress to the server.</p>
<p>This has the benefit that both of the local users can still earn achievements by themselves independently. It doesn&#8217;t matter what has happened in Game Center. It&#8217;s almost like Game Center acts like a &#8220;high score list&#8221; for your achievements, they&#8217;re only submitted when they&#8217;ve improved.</p>
<p>I also have a really cool technical system for keeping track of the achievements. I won&#8217;t go into it here too much, but basically any time something good happens, an &#8220;achievement source&#8221; gets incremented. You can base multiple achievements on a single achievement source (ex solve 1 puzzle, solve 5 puzzles, solve 10 puzzles). It also has a system for tracking uniqueness, so that if you solve the same puzzle 10 times, it&#8217;ll only count as one puzzle in the &#8220;solve a puzzle&#8221; achievement.</p>
<p>All of this was pretty complicated to create, but now I have an extremely robust and flexible way to do achievements that will work for any kind of game in the future.</p>
<h2>Goodies: Compare Stars</h2>
<p>It&#8217;s not in the actual &#8220;Goodies&#8221; list, but Compare Stars is an option under Achievements. It&#8217;s basically just a Game Center high scores list where you can compare how many stars you&#8217;ve earned to how many your friends have earned.</p>
<h2>Goodies: Tutorials</h2>
<p>A tutorial list has been a highly requested feature for a long time. Normally the tutorials are interspersed throughout the levels, but this makes them a lot easier to browse through.</p>
<h2>Goodies: Mailing List</h2>
<p>I&#8217;ve had a Trainyard mailing list set up for a long time, but it&#8217;s always been on an obscure area of the Trainyard site where it was super hard to find. I decided I&#8217;d finally make it easier to sign up in this update. I&#8217;ve been using MailChimp, and they have a super easy API that was really easy to integrate.</p>
<p>Since the update went live 5 days ago, more than 200 people have signed up for the mailing list. That&#8217;s not too shabby considering there were only 300 people in the list a week ago. The way I look at it, that&#8217;s 200 people who are likely to buy whatever my next game is. I wish I&#8217;d put it in sooner.</p>
<h2>Goodies: Tips &amp; Tricks</h2>
<p>I really wasn&#8217;t sure about this section but I threw it in at the last minute. It works similarly to the news section, but each item just contains a single YouTube video. Each of the videos is a short tutorial on some aspect of the game. You can watch them all in this <a href="http://www.youtube.com/playlist?list=PL260A80266AF67A2E">YouTube playlist</a> if you want.</p>
<h2>Goodies: Solutions</h2>
<p>Not much to say about this. It&#8217;s just a link to <a href="http://trainyard.ca/solutions">http://trainyard.ca/solutions</a>. I&#8217;m hoping it&#8217;ll cut down on the number of &#8220;How do I solve *****?&#8221; emails, and if I&#8217;m really lucky, it&#8217;ll cut down on the number of &#8220;Trainyard Solutions&#8221; copycat apps as well.</p>
<h2>Wrapping Up</h2>
<p>Phew. Ok, a golden horse to everyone who made it this far. There were a ton of other smaller features that I didn&#8217;t cover in this post, but I think I hit on most of the major ones. Once you consider creating all of these elements and integrating them all cleanly (and mostly buglessly), I think you can probably see why this update took me 3 months to make, hah.</p>
<p>I hope you enjoyed these last two posts. If you have any questions, especially about technical stuff, I&#8217;d love to hear it, so just leave a comment down below. As usual you can also reach me on Twitter at <a href="http://twitter.com/MattRix">@MattRix</a>, cheers!</p>
]]></content:encoded>
			<wfw:commentRss>http://struct.ca/2011/engineering-an-update-part-2/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Engineering An Update &#8211; Part One</title>
		<link>http://struct.ca/2011/engineering-an-update-part-1/</link>
		<comments>http://struct.ca/2011/engineering-an-update-part-1/#comments</comments>
		<pubDate>Fri, 02 Sep 2011 06:46:05 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[App Store]]></category>
		<category><![CDATA[iDevBlogADay]]></category>
		<category><![CDATA[iOS Development]]></category>
		<category><![CDATA[Trainyard]]></category>
		<category><![CDATA[Workflow]]></category>

		<guid isPermaLink="false">http://struct.ca/?p=736</guid>
		<description><![CDATA[I&#8217;m finally back doing iDevBlogADay after many months away. This post is the first in a two part series about my struggles and successes while creating the new Trainyard &#8221;Engineer Update&#8221;. A promise Never promise anything. Seriously. Ok, well at least never promise &#8230; <a href="http://struct.ca/2011/engineering-an-update-part-1/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><em>I&#8217;m finally back doing <a href="http://idevblogaday.com">iDevBlogADay</a> after many months away. This post is the first in a two part series about my struggles and successes while creating the new <a href="http://trainyard.ca">Trainyard</a> &#8221;Engineer Update&#8221;.</em></p>
<h2>A promise</h2>
<p><strong>Never promise anything.</strong> Seriously. Ok, well at least never promise anything if you&#8217;re a game developer, no matter how tempting it is, and no matter how much you think you&#8217;re going to be able to deliver it.</p>
<p>So here&#8217;s what happened: Back in December I was wrapping up my old job, and I was super excited about finally starting to work for myself as an independent game developer. I was thinking &#8220;oh, I&#8217;ll get so much work done now that I&#8217;m working full-time&#8221;.</p>
<p>So I did something silly; I put out a Trainyard update with a video message that was seen by around 80,000 players, and in that video I promised that a massive new Trainyard update with a puzzle editor would be coming in the first couple months of 2011. Whoops.</p>
<p><object width="640" height="385" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/uDA0cTlqj7M?fs=1&amp;hl=en_US" /><param name="allowfullscreen" value="true" /><embed width="640" height="385" type="application/x-shockwave-flash" src="http://www.youtube.com/v/uDA0cTlqj7M?fs=1&amp;hl=en_US" allowFullScreen="true" allowscriptaccess="always" allowfullscreen="true" /></object></p>
<h2>Dread and fear</h2>
<p>January came and for a few weeks I got caught up in a bunch of company-forming stuff, but I eventually started thinking about the Trainyard update. When I began to figure out the logistics of it, it quickly dawned on me just how much work it was going to be. And then I did what most people do when they&#8217;re faced with a daunting task: I procrastinated. A lot.</p>
<p>I worked on all kinds of other projects, including <a href="http://www.youtube.com/watch?v=sXqXpwyBI1k">a Playbook app</a>, a <a href="http://nodetris.com">multiplayer HTML5 Tetris game</a>, and a <a href="http://struct.ca/ex/matto/">music generation toy</a>, as well as a ton of game prototypes. The one thing I didn&#8217;t do was actually work on the update.</p>
<p>In late March I wrote a post about what I&#8217;d been up to for the past <a href="http://struct.ca/2011/four-months/">four months</a>, where I said I was hard at work on the Trainyard update, although in reality, I hadn&#8217;t even started. Time and distractions kept dragging on. In fact, it would take a few more months, until June, when I would finally, actually, for real, start working on the update.</p>
<h2>Decisions</h2>
<p>What was holding me back? Aside from being overwhelmed, there were a few tough choices that every other new feature hinged on. One of the biggest decisions was whether I was going to rewrite the backend code from scratch on &#8220;the cloud&#8221;, or just retrofit my current backend code. Among other problems, I also had to decide how to integrate Game Center achievements with my current dual-user system, and how to squeeze Engineer mode into the rest of the game.</p>
<p>Along with the technical decisions, I had to make numerous choices about the design and user experience of the new content. There were over a dozen new screen types to add to the game, each with its own special caveats and issues.</p>
<h2>Scope</h2>
<p>It&#8217;s worth taking a second to talk about the scope of this update: I bit off way more than I should have been chewing. Note my wording: just because you can do it, doesn&#8217;t mean you should. If you learn nothing else from this post, you should at least learn to <strong>keep your updates small and quick.</strong></p>
<p>I decided that with this update, I&#8217;d add all of the little things I felt were missing from the game, including a news feed, mailing list signup form, &#8220;tips and tricks&#8221; video list, tutorial list, and more. I created a section called &#8220;goodies&#8221; to hold all of them.</p>
<p>There were a few times when I seriously considered releasing a web-based puzzle editor. It would have been way simpler, and it would have still accomplished my goal of allowing people to make their own puzzles. It also would have literally saved me two months of work. I just couldn&#8217;t do it though. I knew it&#8217;d be a second-rate solution, and I didn&#8217;t want to cut corners.</p>
<h2>Buckling down</h2>
<p>Ok, so how did I eventually get focused? At the end of May I went on a vacation, and when I returned, I was determined to get down to business. I created a carefully structured schedule that I <span style="color: #000000;"><strong>forced </strong>myself </span>to follow every single day. I gave myself rules and stuck to them. I won&#8217;t go over my new focusing methods here because I&#8217;m planning to write a post about them soon, but they worked like a charm, and I spent the next three months working on Trainyard for over 8 hours every day.</p>
<p><img class="alignnone size-full wp-image-746" title="Schedule" src="http://struct.ca/wp-content/uploads/2011/09/Schedule.jpg" alt="" width="640" height="492" /></p>
<h2>The results</h2>
<p>I was originally planning to write all about what&#8217;s actually in the update, but this post is already way too long so I&#8217;ll save that for part two (coming in the next couple days).</p>
<p>For now, let me just leave you with this: I&#8217;m really, really happy with how the update turned out, and I&#8217;m proud to have created it&#8230; However, there are zero good business reasons for making an update this large. If I&#8217;m lucky, it&#8217;ll give Trainyard a temporary boost in sales, but even then it&#8217;ll quickly drop back down to where it was before. If I knew just how long this update would take to make, there&#8217;s no way I would have done it. Let me be even more clear: <em>I hated working on this update</em>; it was a bad idea.</p>
<p>What&#8217;s the moral of the story? <strong>Never promise anything</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://struct.ca/2011/engineering-an-update-part-1/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
		<item>
		<title>Big Runner</title>
		<link>http://struct.ca/2011/big-runner/</link>
		<comments>http://struct.ca/2011/big-runner/#comments</comments>
		<pubDate>Thu, 14 Jul 2011 22:13:00 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Game Design]]></category>
		<category><![CDATA[Other Games]]></category>

		<guid isPermaLink="false">http://struct.ca/?p=693</guid>
		<description><![CDATA[This past Sunday I attended the first ever Guelph Game Jam. In this post I&#8217;ll explain a little bit about the game jam, and then I&#8217;ll talk about the game I made (note: it&#8217;s a Flash game, so you can &#8230; <a href="http://struct.ca/2011/big-runner/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><em>This past Sunday I attended the first ever <a href="http://guelphgamejam.com">Guelph Game Jam</a>. In this post I&#8217;ll explain a little bit about the game jam, and then I&#8217;ll talk about the game I made (note: it&#8217;s a Flash game, so you can actually play it, woot!). </em></p>
<h2>The Guelph Game Jam</h2>
<p>This is the second game jam I&#8217;ve participated in. The first was <a href="http://tojam.ca">TOJam</a>, which I <a href="http://struct.ca/2011/wjh/">wrote about</a> back in May. I enjoyed TOJam so much that when I heard about another game jam in the area, I just had to go. The jam was organized by <a href="http://twitter.com/OwenGoss">Owen Goss</a>, and despite being the first Guelph Game Jam ever, it went really smoothly (great job Owen!).</p>
<p>If you&#8217;re not familiar with what a game jam is, it&#8217;s basically just when a group of people get together to make games over a short period of time. In the case of the GGJ, it went from 12pm until 7:30pm (with a 30 minute dinner break), so it lasted only 7 hours. This may seem like a really short amount of time, and it was, but everyone was still able to make some cool stuff. The theme of the jam was &#8220;Big&#8221;, and there were a total of 16 participants. If you want to see the other games, I encourage you to <a href="http://guelphgamejam.com/">check them out on the GGJ site</a>, there are some really interesting games there.</p>
<p><img class="alignnone size-full wp-image-707" title="GGJSetup" src="http://struct.ca/wp-content/uploads/2011/07/GGJSetup.jpg" alt="" width="640" height="427" /></p>
<h2>Ideas and Technologies</h2>
<p>I spent some time during the week leading up the jam trying to come up with an idea for a game, but I was having a hard time arriving at a solid idea that could also be executed in only 7 hours. Knowing that the theme was &#8220;Big&#8221;, I came up with a lot of concepts for physics games, but none of them really stuck out to me.</p>
<p>At this time I also wasn&#8217;t 100% sure of what technology/platform I wanted to create the game with. I had just received my <a href="http://struct.ca/2011/icademanager">iCade</a>, so I knew I wanted to create something that used it, but I wasn&#8217;t sure whether I wanted to create a game for the iPad or a Flash game. After a ton of internal debating, I finally settled on going with Flash. Using Flash would give me a lot more development flexibility and speed, especially when it came to making art and animations.</p>
<p>On the morning of the jam, I knew what tech I was going to use, but I still didn&#8217;t have a game idea. The trip from my home (in Mississauga) to Guelph takes about an hour, so I figured I could finalize the game as I was driving. The game I came up with on that trip became &#8220;Big Runner&#8221;.</p>
<p><img class="alignnone size-full wp-image-708" title="GameScreen" src="http://struct.ca/wp-content/uploads/2011/07/GameScreen.jpg" alt="" width="640" height="341" /></p>
<h2>The Big Idea</h2>
<p>The gist of &#8220;Big Runner&#8221; is that the main character is a skinny guy, but his goal is to burn as many calories as he can, so he&#8217;s trying to get as fat as possible so he can burn more calories. The catch is that the fatter he is, the slower he&#8217;ll move, and the screen is constantly moving, so he can&#8217;t get too fat or else he&#8217;ll go off the edge of the screen. I realize this game makes no sense, and I can&#8217;t be bothered to make up a decent story for it, so you&#8217;re just going to have to invent your own.</p>
<p>I decided that there&#8217;d be cake in the game as the food that makes him fat, because I love cake. Nom. I knew I was using the iCade and wanted him to be able to do more than just move around, so I planned on giving him two actions: puke (to make him lose weight), and jump (to burn extra calories &#8211; I later took this out).</p>
<div style="margin-bottom: 25px;">
      <div id="banner_container" class="jj_swf_object_container" style="height:260px;overflow:hidden;">
        <div id="banner" class="jj_swf_object_container_wrapper" style="width:640px;height:260px;overflow:hidden;">
          <img src='wp-content/uploads/2011/07/FatPulseShare.jpg' />
        </div>
      </div>
      <script type="text/javascript">
        swfobject.embedSWF("/wp-content/uploads/2011/07/FatPulseShare.swf", "banner", "640", "260", "9.0.0", "http://struct.ca/wp-content/plugins/jj-swfobject/swfobject/expressInstall.swf", {}, {}, {});
      </script></div>
<h2>The Big Animations</h2>
<p>When the jam started, I quickly sketched out what the guy might look like as he gets fat, and then I then started making all the assets in Flash. If you have Flash enabled, you can see some of the awful sketches and the animation above. I knew I had to work fast, because with only 7 hours, I couldn&#8217;t afford to spend very much time on art.</p>
<p>I made the guy, the cake, and the street background. I also had to make a bunch of UI elements (main menu, score, etc.).  The key with the guy was that I wanted him to visibly get fat, and do it gradually, rather than simply snapping to different fatness levels. Flash&#8217;s shape-tweens really helped to create a seamless transition between different amounts of fatness.</p>
<p>Late in the jam, I still needed some sort of &#8220;enemy&#8221;, and I happened to overhear Connor Pridham (son of <a href="https://twitter.com/madgarden">@madgarden</a>) jokingly saying something about how every game should have tanks. I realized that tanks would be a perfect fit for Big Runner, so I decided to put them in. Oh, and it turns out that Connor was working on a sweet mix of tanks and Minecraft called <a href="http://guelphgamejam.com/2011/07/11/tankcraft/">TankCraft</a>.</p>
<p><img class="alignnone size-full wp-image-715" title="GGJScreen" src="http://struct.ca/wp-content/uploads/2011/07/GGJScreen2.jpg" alt="" width="640" height="427" /></p>
<h2>The Big Finish</h2>
<p>I spent 2 hours on art and animation, and the rest of the time coding. I finished implementing the tanks right as the jam ended at 7:30 (ok, a few minutes after). The &#8220;finished&#8221; game was playable with the iCade, and it was actually kind of fun. The music was made by Guelph local <a href="http://ftylershaw.com/">Tyler Shaw</a>. My request to Tyler was &#8220;music that sounds kinda super-nintendoish, and upbeat, with the melody from Happy Birthday&#8221;, and he nailed it (Tyler also made the music for a few other games during the same time period &#8211; impressive!).</p>
<p>That 7-hour version had a bunch of things missing, including sound effects and a jumping mechanic. There are also some weird bugs and the hit areas on the tanks are really bad. I hadn&#8217;t finalized what I wanted to do with the puking mechanic, so you can puke almost all the time. Through the magic of Flash, you can <a href="http://struct.ca/games/flash/BigRunnerOriginal">play the original version right now</a>.</p>
<h2>Polish</h2>
<p>On the drive home from the jam, I came up with a bunch of ideas for how to tweak the game. The next day, I spent two hours adding sound effects, changing how the puking works, and fixing most of the bugs. I decided it was good enough to put on Kongregate (a popular Flash games site), so I spent another hour implementing the Kongregate API (highscores, achievements, etc), and then I put it up there on Wednesday, after a total of 10 hours of work. <a href="http://www.kongregate.com/games/MattRix/big-runner">You can play the Kongregate version here</a>. See if you can beat 1500 calories.</p>
<h2>Game Design</h2>
<p>The game is a simple side-scroller with very few elements, and yet it has a surprising amount of depth. The original version allowed you to puke whenever you wanted, so you could control your weight precisely, but I realized that having that much control actually took a way a lot of the decision making and planning. The final version has the limitation that you can only puke when you&#8217;re at your fattest, which adds a lot of interesting dynamics.</p>
<p>I really wanted the way you play the game to naturally change and evolve as you play it, and that&#8217;s exactly what happens. At the start of the game, you want to eat all the cakes you can, so you&#8217;re running around trying to collect cakes. By the later stages of the game, you actually want to stay skinny, so you start having to avoid the cakes. I think twisting something good into something bad over the course of a run is a pretty novel way to create depth and choices for the player, and at the end of the day, this is a game about trade-offs.</p>
<p>There were many happy accidents with the game design of the game, and one of them was with the tank; I really like how the tank&#8217;s turret gives a visual warning that the tank is coming. It comes far ahead of the tank&#8217;s hit area, so in the early stages of the game, you can tell exactly where the tank is going to come from before the full body of the tank arrives on screen &#8211; a subtle but interesting element.</p>
<p><img class="alignnone size-full wp-image-713" title="GGJWorking" src="http://struct.ca/wp-content/uploads/2011/07/GGJWorking2.jpg" alt="" width="640" height="427" /></p>
<h2>Wrapping up</h2>
<p>I think that&#8217;s just about all I have to say about Big Runner. Please <a href="http://www.kongregate.com/games/MattRix/big-runner">try out the game</a> and let me know what you think! Feel free to send it around on Twitter and Google+ too, I&#8217;d love to see how high the scores can go. Also, make sure you check out the <a href="http://guelphgamejam.com">other Guelph Game Jam games</a>, there are some cool projects there. As usual, you can post your comments here or send them <a href="http://twitter.com/MattRix">@MattRix</a>. Cheers.</p>
]]></content:encoded>
			<wfw:commentRss>http://struct.ca/2011/big-runner/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Thoughts on the iCade (and on using it with Flash games)</title>
		<link>http://struct.ca/2011/icademanager/</link>
		<comments>http://struct.ca/2011/icademanager/#comments</comments>
		<pubDate>Wed, 13 Jul 2011 14:45:13 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[iOS Development]]></category>

		<guid isPermaLink="false">http://struct.ca/?p=643</guid>
		<description><![CDATA[I got an ION iCade a few days ago. This post is about my thoughts on the iCade, and also on how to use it with Flash games. The iCade So the basic idea with the iCade is that it&#8217;s &#8230; <a href="http://struct.ca/2011/icademanager/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><em>I got an <a href="http://www.ionaudio.com/products/details/icade">ION iCade</a> a few days ago. This post is about my thoughts on the iCade, and also on how to use it with Flash games.</em></p>
<p><em><img class="alignnone size-full wp-image-664" title="iCadeStandalone" src="http://struct.ca/wp-content/uploads/2011/07/iCadeStandalone.jpg" alt="" width="640" height="500" /><br />
</em></p>
<h2>The iCade</h2>
<p>So the basic idea with the iCade is that it&#8217;s meant to give you physical controls for iPad games. First of all, the physical build quality of the device is fantastic. I&#8217;ve heard some people say that it looks small after seeing photos of it, but it&#8217;s definitely not small in real life; it&#8217;s actually quite big compared to the iPad, and it&#8217;s very sturdy. The joystick and the buttons feel solid and substantial, and they&#8217;re very responsive. The idea of the iCade may seem like a gimmick or a joke, but the actual execution of it is anything but.</p>
<p>The iCade runs on two AA batteries. It acts like a Bluetooth keyboard, so setting it up is really easy. The only issue is that because the iPad thinks it has a real keyboard attached, it doesn&#8217;t show the normal virtual touch keyboard when the iCade is synced, which can be a big pain. This is compounded by the fact that the iCade doesn&#8217;t have a power off button (it just turns off after a few minutes of being unused), so you either have to wait for a while or un-sync it just to type text. This is annoying but most of the time it doesn&#8217;t really matter, because you&#8217;re using it to play games, not type stuff.</p>
<p>Some people have asked if it has speakers: it doesn&#8217;t, but the shape of the cabinet amplifies the iPad&#8217;s sound a lot, which it really does make it seem louder.</p>
<p><img class="alignnone size-full wp-image-672" title="iCadeGlamour" src="http://struct.ca/wp-content/uploads/2011/07/iCadeGlamour.jpg" alt="" width="640" height="427" /></p>
<h2>The games</h2>
<p>Most iPad games are built for touch controls, not keyboard controls, so there aren&#8217;t very many games that support the iCade. Luckily, ION convinced Atari to build iCade support into every game in their <a title="Atari Greatest Hits" href="http://itunes.apple.com/app/id422966028">Atari&#8217;s Greatest Hits</a> iPad app, so for $14.99 you can have 99 retro games to play. I really enjoyed playing through a bunch of classic arcade games on the iCade, it is definitely much more fun than playing them on a touch screen.</p>
<p>If you&#8217;re worried you&#8217;re gonna get bored of retro games, there are also a few indie devs that have built iCade support into their apps. <a href="http://itunes.apple.com/app/id372249567">Compression HD</a> from Little White Bear is a great puzzle game that supports the iCade, and Retro Dreamer <a href="http://retrodreamer.com/blog/2011/07/velocispider-icade-support-teaser/">just announced</a> that the next Velocispider update will have iCade support. I&#8217;m really excited for that one. For a list of other games with iCade support, you can check out the <a href="http://en.wikipedia.org/wiki/ICade">wikipedia page</a>.  The list is pretty short, but I have no doubt it&#8217;ll get longer over time.</p>
<h2>Implementing iCade support into iOS games</h2>
<p>So how do you add iCade support on iOS? Luckily <a href="http://twitter.com/stuartcarnie">someone</a> made a library that makes it super easy: <a href="https://github.com/scarnie/iCade-iOS/">https://github.com/scarnie/iCade-iOS/</a> &#8211; basically you just add a special view to your main view controller which listens to keyboard events, and that view then sends messages to a delegate when buttons are pushed. There&#8217;s really not much more to it. The one big catch is that for some reason Apple won&#8217;t let you mention the word &#8220;iCade&#8221; <strong>anywhere</strong>. You can&#8217;t put &#8220;iCade&#8221; in your app&#8217;s name or description, and you can&#8217;t even mention the word iCade *in your app*. That&#8217;s crazy.</p>
<h2>Ok, but how does the iCade actually work?</h2>
<p>Alright, so when I said the iCade acts like a Bluetooth keyboard, that was true, but it&#8217;s not quite that simple. Rather than just emulating keys, the iCade actually emulates two keys for each control. Each button fires one key when it&#8217;s pressed down, and a different key when it&#8217;s released. For example, the red button in the top left fires a <strong>Y</strong> when pressed, and a <span style="color: #000000;"><strong>T</strong></span> when released. The joystick does the same for each of the 4 directions. The image below is a diagram from the <a href="http://www.thinkgeek.com/files/iCADE/iCade_Dev_Resource_v1_3.pdf" target="_blank">iCade Developer PDF</a> that shows exact which keys are fired by which control.</p>
<p><img class="alignnone size-full wp-image-673" title="iCadeControls" src="http://struct.ca/wp-content/uploads/2011/07/iCadeControls.jpg" alt="" width="640" height="400" /></p>
<h2>The magic of Bluetooth</h2>
<p><span style="color: #444444; font-size: 16px; line-height: 24px;">When I realized that the iCade was acting like a normal Bluetooth keyboard, I decided to do some tests; sure enough, it can connect to any device that works with Bluetooth keyboards: an iPhone, iPod Touch, PC, Mac, or even a Playbook (more on that later). </span>Being able to connect it to a device other than an iPad is cool, but it&#8217;s not much use if there are no games that support it, so I set out to do what I could to change that.</p>
<h2><span style="font-size: xx-small;"><span style="line-height: 24px;"><img class="alignnone size-full wp-image-674" title="iCadePlaybook" src="http://struct.ca/wp-content/uploads/2011/07/iCadePlaybook.jpg" alt="" width="640" height="480" /><br />
</span></span></h2>
<h2>iCadeManager.as</h2>
<p>Flash games are awesome. They&#8217;re constantly pushing the envelope, especially when it comes to game design, and they run on pretty much everything except iOS devices. There&#8217;s also a huge Flash development community. Before I started doing iOS work, I worked for 5 years as a Flash developer, so the Flash world still holds a warm place in my heart.</p>
<p>I decided to create a library to make it really easy for Flash developers to add iCade support to their games. Even calling it a library is a bit of a stretch, it&#8217;s really just a single class, and it only takes a couple lines of code to implement:</p>
<pre class="brush:as3">        
iCadeManager.start(stage);
iCadeManager.mapControl(Keyboard["SPACE"],"A");
        </pre>
<p>The iCadeManager API is super simple, but getting it to work correctly was pretty tricky. The main issue I had to overcome was that the iCade uses 24 different keys to send its messages, but most Flash games already use the keyboard, so there could be tons of conflicts. In Flash, you can&#8217;t tell which keyboard a key press comes from, so it&#8217;s impossible to tell whether a key press is a real key being pressed or one of the many keys the iCade uses.</p>
<p>My solution was to implement a special &#8220;iCade&#8221; toggle to turn on and off iCade mode in Flash games. You activate it by holding the top four buttons of the iCade at the same time. When the game is in iCade mode, it swallows up every incoming key event and converts it into the key event you&#8217;ve assigned for that iCade input. Check it out in the video below:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="640" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/-IghsoBoK8E?fs=1&amp;hl=en_US" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="640" height="385" src="http://www.youtube.com/v/-IghsoBoK8E?fs=1&amp;hl=en_US" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<h2>The Playbook</h2>
<p>My final challenge was getting the iCade working with the Playbook. Unlike the iPad, the Playbook supports Flash in the browser, but unfortunately a huge number of Flash games are still left unplayable because they&#8217;re built for use with a keyboard. Luckily, the Flash Player in the Playbook&#8217;s browser still gets keyboard events from any synced Bluetooth keyboard, so iCadeManager worked perfectly, which you can see in the video below.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="640" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/Qk6mnpIUYVY?fs=1&amp;hl=en_US" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="640" height="385" src="http://www.youtube.com/v/Qk6mnpIUYVY?fs=1&amp;hl=en_US" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<h2>Get the code</h2>
<p>All the code for iCadeManager is on Github, and like I said before, it&#8217;s literally a single file, so you have no excuse not to use it! <a href="https://github.com/MattRix/iCadeManager">https://github.com/MattRix/iCadeManager</a></p>
<p>If you want to see a demo of it in action, I retrofitted the <a href="http://flashgamedojo.com/wiki/index.php?title=EZPlatformer_(Flixel)">Flixel EZPlatformer</a> tutorial with iCadeManager: <a href="http://struct.ca/ex/ezicade/">try it out here</a> (remember to hold the top 4 buttons to turn on iCade mode).</p>
<h2>Parting thoughts</h2>
<p>So to wrap up, the iCade is awesome, and being able to use it with Flash games is pretty sweet. Now all we need is a bunch of Flash devs to add iCade support to their games <img src='http://struct.ca/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>If you have any questions or issues, please post a comment on this post or send a message <a href="http://twitter.com/MattRix">@MattRix</a>. I&#8217;m tempted to start curating a list of Flash and iPad games that support iCade, so if you think that&#8217;d be cool, let me know. Oh, and if you make any games using iCadeManager, I&#8217;d love to hear about them. Cheers.</p>
]]></content:encoded>
			<wfw:commentRss>http://struct.ca/2011/icademanager/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>What Just Happened?!</title>
		<link>http://struct.ca/2011/wjh/</link>
		<comments>http://struct.ca/2011/wjh/#comments</comments>
		<pubDate>Thu, 19 May 2011 20:36:45 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Game Design]]></category>
		<category><![CDATA[Other Games]]></category>

		<guid isPermaLink="false">http://struct.ca/?p=615</guid>
		<description><![CDATA[Last weekend I went to TOJam, and it was awesome. In this post I&#8217;m going to explain a little bit about what TOJam is, and then I&#8217;ll explain what I ended up making there. TOJam TOJam is Toronto&#8217;s big annual &#8230; <a href="http://struct.ca/2011/wjh/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><em>Last weekend I went to <a href="http://tojam.ca">TOJam</a>, and it was awesome. In this post I&#8217;m going to explain a little bit about what TOJam is, and then I&#8217;ll explain what I ended up making there.</em></p>
<h2>TOJam</h2>
<p>TOJam is Toronto&#8217;s big annual game jam. This year there were over 250 game devs all making crazy games for 3 days straight. Everyone got there on Friday and worked through the weekend. Some people even slept at the building (or didn&#8217;t sleep at all!). It was held at the George Brown College Autodesk Building, and there were tons of great computers (dual quad core Mac Pros with 12gb ram) and great monitors (Apple 24&#8243;) for everyone to use.</p>
<p>Being at TOJam was a great experience. Everyone had a ton of energy and enthusiasm the whole weekend long. There seemed to be a pretty even mix of artists to coders, so I got to see tons of game art getting made over the course of the weekend. Lots of people were using Unity to make their games, although I think the most popular tech was still Flash.</p>
<h2>Bonus</h2>
<p>One of the best things about TOJam was how much free food there was. It was completely free to attend, and yet throughout the weekend there was a TON of stuff being given away. There were bagel and pastry breakfasts, a chinese food dinner, a pizza dinner, and an unending supply of candy, chips, and drinks. I was given the opportunity to sponsor something at TOJam, and so I decided to sponsor the candy area, which was named &#8220;Trainyard&#8217;s Candy Yard&#8221;.</p>
<p><a href="http://struct.ca/wp-content/uploads/2011/05/candy-yard.jpg"><img class="alignnone size-full wp-image-621" title="candy-yard" src="http://struct.ca/wp-content/uploads/2011/05/candy-yard.jpg" alt="" width="640" height="478" /></a></p>
<h2>Who?!</h2>
<p>I didn&#8217;t dare do my first game jam ever by myself. I partnered up with <a href="http://twitter.com/OwenGoss">Owen Goss</a> and <a href="http://twitter.com/wblackall">Whitaker Blackall</a>. Together we formed Team RGB (Rix, Goss, Blackall). The plan was for Owen and me to do art and coding, and then Whit, who lives in Chicago, would do all the sounds and music remotely.</p>
<p><a href="http://struct.ca/wp-content/uploads/2011/05/dreamteam.jpg"><img class="alignnone size-full wp-image-619" title="dreamteam" src="http://struct.ca/wp-content/uploads/2011/05/dreamteam.jpg" alt="" width="640" height="361" /></a></p>
<h2>What?!</h2>
<p>Alright, so what did we actually make? Well, the theme of the jam was &#8220;What Just Happened!?&#8221; and so we decided to make a gameshow style party game called &#8220;What Just Happened?!&#8221; (note the punctuation, hah). The idea was that something would happen, and then as a player, you&#8217;d have to answer a question about what just happened. The key was that each player would have their own device to play on, and so we could do things like giving different information to each player and making them work together (or not) to answer correctly.</p>
<p><a href="http://struct.ca/wp-content/uploads/2011/05/logo.png"><img class="alignnone size-full wp-image-622" title="logo" src="http://struct.ca/wp-content/uploads/2011/05/logo.png" alt="" width="516" height="282" /></a></p>
<h2>How?!</h2>
<p>Neither Owen or I had done much work with HTML5 Canvas stuff, yet we decided that it was the best option. It was kind of a strange choice considering that we&#8217;re both professional iOS developers, but it really just made sense. We wanted to make something that anyone could play just by going to a website on their phone, rather than having to download a specific app. Creating it in HTML5 also meant that it would work on all kinds of devices, including iPhones, iPads, Android phones, and even Playbooks.</p>
<p>The golden rule of game jams is that you should use tech you&#8217;re very familiar with, but we blatantly disregarded that. Luckily, we found a framework called <a href="http://easeljs.com/">EaselJS</a> which let us get up-and-running with HTML5 dev pretty quickly. The backend multiplayer code is written with <a href="http://nodejs.org/">Node.js</a> and <a href="http://socket.io">Socket.io</a>, which I had used once before when creating <a href="http://nodetris.com">Nodetris</a>.</p>
<p>We split up the coding work pretty evenly between us. Owen did the majority of the frontend UI work, and I did most of the backend stuff and minigames, although we definitely switched roles a few times over the weekend (the Goat minigame was 100% Owen, for example). All of the work on art was also split between Owen and me, with some small debates about what style to use for the buttons and the logo, among other things <img src='http://struct.ca/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>We gave Whit the rough guideline of &#8220;create music that sounds like an old game show, something like The Price Is Right or Jeopardy&#8221;, and he did an amazing job. Whit also did all the announcer voices and other sound effects as well, all of which were spot-on.</p>
<p>Whit&#8217;s The Price Is Right style theme: <!-- degradable html5 audio and video plugin --><div class="audio_wrap html5audio"><div style="display:none;"><a href="http://struct.ca/wp-content/uploads/2011/05/music_mainTheme.mp3" title="Click to open" id="f-html5audio-0">Audio MP3</a><script type="text/javascript">AudioPlayer.embed("f-html5audio-0", {soundFile: "http://struct.ca/wp-content/uploads/2011/05/music_mainTheme.mp3"});</script></div><audio controls autobuffer id="html5audio-0" class="html5audio"><source src="http://struct.ca/wp-content/uploads/2011/05/music_mainTheme.mp3" type="audio/mpeg" /><a href="http://struct.ca/wp-content/uploads/2011/05/music_mainTheme.mp3" title="Click to open" id="f-html5audio-0">Audio MP3</a><script type="text/javascript">AudioPlayer.embed("f-html5audio-0", {soundFile: "http://struct.ca/wp-content/uploads/2011/05/music_mainTheme.mp3"});</script></audio></div><script type="text/javascript">if (jQuery.browser.mozilla) {tempaud=document.getElementsByTagName("audio")[0]; jQuery(tempaud).remove(); jQuery("div.audio_wrap div").show()} else jQuery("div.audio_wrap div *").remove();</script></p>
<p>Whit&#8217;s Jeopardy style theme: <!-- degradable html5 audio and video plugin --><div class="audio_wrap html5audio"><div style="display:none;"><a href="http://struct.ca/wp-content/uploads/2011/05/music_waiting.mp3" title="Click to open" id="f-html5audio-1">Audio MP3</a><script type="text/javascript">AudioPlayer.embed("f-html5audio-1", {soundFile: "http://struct.ca/wp-content/uploads/2011/05/music_waiting.mp3"});</script></div><audio controls autobuffer id="html5audio-1" class="html5audio"><source src="http://struct.ca/wp-content/uploads/2011/05/music_waiting.mp3" type="audio/mpeg" /><a href="http://struct.ca/wp-content/uploads/2011/05/music_waiting.mp3" title="Click to open" id="f-html5audio-1">Audio MP3</a><script type="text/javascript">AudioPlayer.embed("f-html5audio-1", {soundFile: "http://struct.ca/wp-content/uploads/2011/05/music_waiting.mp3"});</script></audio></div><script type="text/javascript">if (jQuery.browser.mozilla) {tempaud=document.getElementsByTagName("audio")[0]; jQuery(tempaud).remove(); jQuery("div.audio_wrap div").show()} else jQuery("div.audio_wrap div *").remove();</script></p>
<h2>The Result</h2>
<p>So after 3 days, TOJam ended at 8pm on Sunday night, and we finished right on time. The final game has six different minigame types (clock, robot, numbers, colours, penguins, goats). Each minigame has 3-4 possible questions that could be asked. For example, in the number game, it puts a different number on each person&#8217;s screen for a few seconds, and then asks a question like &#8220;which number was on the most screens&#8221; or &#8220;what&#8217;s the total of all the numbers that were shown&#8221;. Every minigame has tons of random variables, so no two games will ever be the same. Below is a quick quick demo video I made of the game:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="640" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/jm3nBXhrTKw?fs=1&amp;hl=en_US" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="640" height="385" src="http://www.youtube.com/v/jm3nBXhrTKw?fs=1&amp;hl=en_US" allowfullscreen="true" allowscriptaccess="always"></embed></object></p>
<h2>Try it out</h2>
<p>If you want to try it out right now, just go to <a href="http://whatjh.com">WhatJH.com</a>. It&#8217;s set up so that you can create a room at whatever subdomain you want. You can play it by yourself by opening up a few browser tabs, although it&#8217;s a lot more fun to play with real people. It&#8217;s worth noting that if you want the awesome sounds+music, the host should be run in a real browser with Flash, because <a href="http://www.phoboslab.org/log/2011/03/the-state-of-html5-audio">HTML5 audio support is awful</a>.</p>
<p>So that&#8217;s about it! Let me know what you think in a comment or on Twitter. I&#8217;ve also included Owen&#8217;s demo video of it below, because he does a great job of showing what it looks like to go through a full game.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="640" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/lp6wQNGRlgU?fs=1&amp;hl=en_US" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="640" height="385" src="http://www.youtube.com/v/lp6wQNGRlgU?fs=1&amp;hl=en_US" allowfullscreen="true" allowscriptaccess="always"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://struct.ca/2011/wjh/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
<enclosure url="http://struct.ca/wp-content/uploads/2011/05/music_mainTheme.mp3" length="1520872" type="audio/mpeg" />
<enclosure url="http://struct.ca/wp-content/uploads/2011/05/music_waiting.mp3" length="309387" type="audio/mpeg" />
		</item>
		<item>
		<title>Introducing EasyIPA</title>
		<link>http://struct.ca/2011/easyipa/</link>
		<comments>http://struct.ca/2011/easyipa/#comments</comments>
		<pubDate>Wed, 30 Mar 2011 17:15:23 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[iOS Development]]></category>
		<category><![CDATA[Workflow]]></category>

		<guid isPermaLink="false">http://struct.ca/?p=590</guid>
		<description><![CDATA[This post is different from the usual struct.ca fare: it&#8217;s focused on Flash instead of iOS, and it gets a little technical. Consider yourself warned. Flash to iOS For the past week I&#8217;ve been playing around with the Adobe AIR &#8230; <a href="http://struct.ca/2011/easyipa/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><em>This post is different from the usual <strong>struct.ca</strong> fare: it&#8217;s focused on Flash instead of iOS, and it gets a little technical. Consider yourself warned. <img src='http://struct.ca/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </em></p>
<h2>Flash to iOS</h2>
<p>For the past week I&#8217;ve been playing around with the Adobe AIR 2.6 SDK. I used to be a Flash developer and I still really enjoy using AS3, so when Adobe announced a version of AIR with better support for iOS, I had to check it out. It&#8217;s pretty impressive, or at least, it&#8217;s not awful anymore. You can see an example of it in action here (note that this is NOT something I made, just an example I found):</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="640" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/5rp7UNCWbyc?fs=1&amp;hl=en_US" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="640" height="385" src="http://www.youtube.com/v/5rp7UNCWbyc?fs=1&amp;hl=en_US" allowfullscreen="true" allowscriptaccess="always"></embed></object></p>
<p>I tried porting a couple random Flash projects to iOS and they worked well. They didn&#8217;t run perfectly, but they ran well enough to say that Flash-to-iOS is actually viable now. <em>(For the record, the iPad doesn&#8217;t run Flash stuff nearly as well as the Playbook, but I haven&#8217;t had a chance to try it out on an iPad 2 yet.)</em></p>
<h2>The problem</h2>
<p>I do my Flash development on Windows (now I&#8217;ve really lost everyone <img src='http://struct.ca/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ), and one of the issues that frequently comes up while testing Flash-to-iOS apps is the pain of getting IPA files onto my iPhone and iPad. On OSX, it&#8217;s easy, you just drag and drop IPA files directly onto the device in Xcode&#8217;s Organizer, there&#8217;s no need to even bother with iTunes.</p>
<p>On Windows, it&#8217;s trickier. You could use iTunes, but its syncing is just way too slow. You could also use Apple&#8217;s <a href="http://support.apple.com/kb/dl926">iPhone Configuration Utility</a>, which is pretty sweet when it works. Unfortunately, I get errors and other weird glitches with it most of the time, but maybe you&#8217;ll fare better.</p>
<p>The third option is jailbreaking, which just isn&#8217;t worth the hassle, and the fourth is using something like <a href="http://TestFlightApp.com">TestFlight</a> or <a href="http://github.com/TheRealKerni/HockeyKit">HockeyKit</a>. These tools are awesome when you want to send out ad hoc betas to testers, but it&#8217;d be overkill to use them for actual development.</p>
<h2>A different way</h2>
<p>The way TestFlight works intrigued me, so I decided to do some further investigation. In iOS 4, Apple added the ability to wirelessly download apps directly from your browser, as long the apps are signed and provisioned correctly for your device. <a href="http://developer.apple.com/library/ios/#featuredarticles/FA_Wireless_Enterprise_App_Distribution/Introduction/Introduction.html">This article has all the necessary info on how to do it</a>. You have to create a webpage that links to a plist, and the plist then has links to some icon PNG files and the actual IPA file. There are some caveats, but that&#8217;s the gist of it; it&#8217;s actually pretty straight forward.</p>
<p>I decided I would create a local web server to host a basic html page and all the required files for wireless app distribution. Think of it like a local version of TestFlight running on your computer. The beauty of it is that it works over wifi, and the IPA gets served directly from wherever it is on your computer, with no uploading required. The issue with most web servers is that they&#8217;re usually a bit of work to get running, and I wanted something that was super-lightweight and ridiculously easy to set up, which is how I ended up with good old Adobe AIR.</p>
<h2>Over the AIR</h2>
<p>Server Sockets are an oft-forgotten feature of Adobe AIR that let you create HTTP servers. <a href="http://coenraets.org/blog/2009/12/air-2-0-web-server-using-the-new-server-socket-api/">This great article by Chrisophe Coenraets</a> is a solid primer on how it&#8217;s done. The ability to write a *cross-platform* web server in less than 100 lines of code is pretty powerful.</p>
<p>To get it working all you have to do is start the server and select an IPA file. It even monitors the IPA file for changes using the ideas from <a href="http://www.mikechambers.com/blog/2009/03/11/monitoring-file-changes-in-adobe-air/">this post</a>, so that any time it&#8217;s modified, a chime will sound. This is handy because AIR&#8217;s IPA packager usually takes a couple minutes, so it&#8217;s nice to know when your IPA has been created. I also set it up so that if you keep your device&#8217;s browser open, it&#8217;ll actually automatically trigger the new IPA to install when it&#8217;s been changed.</p>
<p>I use the <a href="http://codeazur.com.br/lab/fzip/">FZip library</a> to browse through the IPA file (which is really just a zip file), and extact some data from the Info.plist, specifically the bundle identifier, the version number and the app name. These pieces of info only matter while the app is downloading, because after the download finishes, the values in the app&#8217;s Info.plist take over.</p>
<p><a href="http://struct.ca/wp-content/uploads/2011/03/inBrowser.png"><img class="alignnone size-full wp-image-597" title="In Browser" src="http://struct.ca/wp-content/uploads/2011/03/inBrowser.png" alt="" width="320" height="480" /></a></p>
<p>Once you start the server, all you have to do is navigate to the correct url on your phone (usually something like 192.168.0.10:9999) and you&#8217;ll be good to go. Just wait a few seconds or hit the &#8220;GET APP&#8221; link and the app will download straight to your phone.</p>
<p>Here&#8217;s something sneaky: every time you download the app, it appends an incrementing integer to the version number, so that the device always thinks it&#8217;s a new build. When the version number says &#8220;1.5.1&#8243;, it&#8217;s actually using &#8220;1.5.1.44&#8243;, &#8220;1.5.1.45&#8243;, &#8220;1.5.1.46&#8243;, etc.</p>
<p><a href="http://struct.ca/wp-content/uploads/2011/03/onDesktop.jpg"><img class="alignnone size-full wp-image-598" title="On Desktop" src="http://struct.ca/wp-content/uploads/2011/03/onDesktop.jpg" alt="" width="640" height="460" /></a></p>
<p>It&#8217;s called &#8220;EasyIPA&#8221;. The magic of AIR means it&#8217;ll work on Windows, OSX, and Linux. Just be aware that I didn&#8217;t test it very much on OSX (or at all on Linux).</p>
<h3>Known issues:</h3>
<ul>
<li>On OSX (and probably Linux), you&#8217;ll have to manually figure out your machine&#8217;s local ip (look in network settings).</li>
<li>If you get a &#8220;Port #### may be in use&#8221; error when starting the server, refresh your device&#8217;s browser then restart the server.</li>
<li>It can&#8217;t extract data from binary Info.plists. This isn&#8217;t really a big deal, you&#8217;ll just have to enter the info manually (the info doesn&#8217;t really matter anyway).</li>
</ul>
<p>To get it, <a href="http://struct.ca/files/easyipa/EasyIPA.air">download and run this</a>.</p>
<p>The AIR runtime should install automatically, but if it doesn&#8217;t, <a href="http://get.adobe.com/air/">get it here</a>.</p>
<p>I threw this together really quickly just as a proof of concept, so the code isn&#8217;t very pretty, but if you want to have a look, <a href="http://struct.ca/files/easyipa/EasyIPA.zip">you can get it here</a>. Feel free to do whatever you want with it.</p>
<p>Please post a comment if you find the app useful or if you run into any issues. Thanks!</p>
<p><em>UPDATE April 7th: Just made a new version and updated the links above. The only change is that now there&#8217;s a field for you to manually specify the server&#8217;s IP. This should help in those cases where it can&#8217;t figure out your local IP automatically. </em></p>
]]></content:encoded>
			<wfw:commentRss>http://struct.ca/2011/easyipa/feed/</wfw:commentRss>
		<slash:comments>34</slash:comments>
		</item>
		<item>
		<title>Four Months</title>
		<link>http://struct.ca/2011/four-months/</link>
		<comments>http://struct.ca/2011/four-months/#comments</comments>
		<pubDate>Mon, 21 Mar 2011 03:52:17 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[iDevBlogADay]]></category>
		<category><![CDATA[Meta]]></category>
		<category><![CDATA[Trainyard]]></category>

		<guid isPermaLink="false">http://struct.ca/?p=555</guid>
		<description><![CDATA[It&#8217;s been four months since my last post back in November. I know I said I&#8217;d keep blogging, but that just didn&#8217;t happen. Luckily, it&#8217;s been so long that it&#8217;s my turn to do iDevBlogADay again. Due to the new &#8230; <a href="http://struct.ca/2011/four-months/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been four months since my last post back in November. I know I said I&#8217;d keep blogging, but that just didn&#8217;t happen. Luckily, it&#8217;s been so long that it&#8217;s my turn to do <a href="http://idevblogaday.com">iDevBlogADay</a> again. Due to the new rules, this means you can expect me to post every other Sunday, although I&#8217;m actually planning(*hoping) to post every week.</p>
<p>I figure the best way to re-start blogging with is a summary of the past four months, in semi-chronological order, so that&#8217;s what this week&#8217;s post is gonna be.</p>
<h2>Quitting</h2>
<p>I finally finished my job at the end of the year. I was employed at <a href="http://indusblue.com">Indusblue</a> for over five years, basically since graduating college, so it was bittersweet to leave. I worked with some really awesome people there, learned a ton of stuff, and just generally had a great time. As much as I loved it, I knew it just didn&#8217;t make sense to stay there if I wanted to have a career making games, and so the end of the year was a great time to start fresh.</p>
<h2>Christmas</h2>
<p>I did a Christmas sale that started a couple days before the 25th of December.  I dropped the price of <a href="http://trainyard.ca">Trainyard</a> to $0.99 from $2.99 and made a couple videos to tell current Trainyard players about the sale. The <a href="http://www.youtube.com/watch?v=uDA0cTlqj7M">video that went to the regular players</a> basically just explained what was going on with Trainyard, what was in the new update, and was was coming up in the future. The <a href="http://www.youtube.com/watch?v=7AGW6kKbUQM">video that went to the free players</a> was more of an upsell video, trying to explain why they might want to buy the full version.</p>
<p>The sale wasn&#8217;t as successful as I&#8217;d hoped, but it worked pretty well. A week before Christmas, Trainyard was making around $800 per day, but on Christmas it made $1500. All in all, it made over $1000/day for the first 10 days of the sale. I definitely can&#8217;t complain about that.</p>
<h2>People to watch</h2>
<p>One really sweet thing that happened is that I was featured in a Toronto Star article called &#8220;People to Watch 2011&#8243;. Going to the photo shoot for this article was fun, as I got to meet a bunch of interesting people in all kinds of fields. After the article was printed, I received lots of encouraging messages from old friends, family, and school teachers. The whole experience was very cool, and I was honoured to be chosen for the list. You can view the full article if you click the image below.</p>
<div id="attachment_571" class="wp-caption alignnone" style="width: 610px"><a href="http://struct.ca/wp-content/uploads/2011/03/TorStar-LargeDouble.jpg"><img class="size-full wp-image-571" title="Toronto Star - February 3rd" src="http://struct.ca/wp-content/uploads/2011/03/TorStar.jpg" alt="Toronto Star - February 3rd" width="600" height="400" /></a><p class="wp-caption-text">Click on the image to view the full article</p></div>
<h2>Starting a company</h2>
<p>In January, with my old job out of the way, I officially started my new company. It&#8217;s called <a href="http://magicule.com">Magicule</a>. People seem to either love or hate the name. I go back and forth on it every day, sometimes I hate it, sometimes I kinda don&#8217;t mind it, hah. It&#8217;s meant to be a portmanteau of &#8220;magic&#8221; and &#8220;molecule&#8221;, because games are like mix of magic and science, or something like that. I still haven&#8217;t bothered to get a logo made for it, but when I do, I&#8217;m hoping it&#8217;ll help to convey the meaning.</p>
<h2>PlayBook</h2>
<p>For some reason, I decided to make an app for the Blackberry PlayBook in January. I used to be a Flash developer before I did iOS development, so making a PlayBook app was actually really easy to do, and it helped that Blackberry has a deal where if you make an app before the PlayBook comes out, they&#8217;ll give you one for free.</p>
<p>My app is called Scorekeeper. It&#8217;s a really simple tool for keeping track of scores while playing party games or board games with friends. I&#8217;d show a screenshot here, but it&#8217;s really hard to appreciate until you see it in motion. I don&#8217;t expect it to make very much money; I just made it for fun, to do something completely different for a while.</p>
<p>I got to present my app at the FlashInTO user group here in Toronto. RIM brought a PlayBook to the event, so I got to try Scorekeeper on a real PlayBook. The device was pretty impressive, and ran my app at a smooth 60fps. It&#8217;s a great product. People keep saying it&#8217;s not an &#8220;iPad killer&#8221;, but I don&#8217;t think that&#8217;s what RIM is trying to be at all. The way I see it, they&#8217;re targeting it solely at current Blackberry users, and I think they&#8217;re going to do really, really well with that audience.</p>
<h2>GDC</h2>
<p>At the start of March, I finally got to attend the Game Developer&#8217;s Conference. Of all the conferences I&#8217;ve wanted to attend, GDC was at the top of the list, and it didn&#8217;t disappoint. There were lots of phenomenal sessions, and it was awesome to get to meet with the rest of the &#8220;indie iOS&#8221; community.  I highly, highly recommend it.</p>
<p>One of the best parts of GDC is just that fact that it&#8217;s in San Francisco. The food is great, the people are nice, and the scenery is fantastic. I spent my second day in San Fran up in Berkeley hanging out with <a href="http://twitter.com/songadaymann">Jonathan Mann</a>. In my opinion, Jonathan is the most under-appreciated person on the internet. Seriously. He writes a new song and posts it online *every single day* and he&#8217;s been doing it for 808 days straight. How crazy is that? And some of them are really, really good. He wrote a bunch of songs you&#8217;re probably heard, like the <a href="http://www.youtube.com/watch?v=VKIcaejkpD4">iPhone Antenna Song</a>, the <a href="http://www.youtube.com/watch?v=I8jkz0pdHk8">Pocket God Update Song</a>, and countless (well, 808) other songs. One of my favourites is <a href="http://www.youtube.com/watch?v=bA-wL6ymkIY">String Theory</a>, or if you want to see my cameo from the day I was there, check out his song on <a href="http://www.youtube.com/watch?v=mAAujVkU5Ys">Settlers of Catan</a>.</p>
<h2>Where did the time go?</h2>
<p>Right now when I look back over the past three months, I wonder what I was doing the whole time. I&#8217;ve definitely done some work, but it sure doesn&#8217;t seem like three months worth. I guess time flies when you&#8217;re working for yourself. Doing business-y stuff also gets in the way and just seems to suck up infinite amounts of time. I&#8217;m quickly learning that when you&#8217;re working solo, it&#8217;s more important than ever to carefully structure your time and hold yourself to strict deadlines.</p>
<h2>What now?</h2>
<p>I&#8217;m still working on the Trainyard &#8220;Engineer&#8221; update, which should be pretty sweet when it finally comes out. Along with that, I had a cool idea for a game on the way back from GDC, so I decided to prototype it. It&#8217;s an indie-style pixel platformer that I&#8217;m making in Flash (<a href="http://flixel.org">Flixel</a>, specifically). I&#8217;m not really sure what I want to do with it, I might just release it as a webgame in its rough form, because I don&#8217;t see a good way to make it into a &#8220;real&#8221; game without a ton more work, and I&#8217;ve already got way too much to do.</p>
<p>I&#8217;m also working on another iOS puzzle game (or two?), and a game that&#8217;s very hard to explain. There&#8217;s definitely way too much on my plate, but I&#8217;m trying to tackle it one thing at a time, so I&#8217;m sure it&#8217;ll all get done eventually.</p>
<h2>Tips</h2>
<p>So that this post isn&#8217;t completely useless, I figured I&#8217;d throw a couple tips in:</p>
<h3>Form a corporation before you sell a game on the App Store</h3>
<p style="padding-left: 30px;">Not incorporating has given me so many headaches. It&#8217;s really not that hard or expensive to create one, but it&#8217;ll save you from so many hassles later on.</p>
<h3>Give yourself very strict deadlines</h3>
<p style="padding-left: 30px;">You need to treat each one of your own projects as if they&#8217;re for a client, or else you&#8217;ll never get any of them done. I&#8217;m really bad at this, but I&#8217;m working on it.</p>
<h3>Don&#8217;t use Twitter or email or Reddit during the day</h3>
<p style="padding-left: 30px;">This is something I struggle with, but it improves my productivity a ton when I do it. Yes, even ignore email. Unless you&#8217;re a sysadmin (you&#8217;re not), then you&#8217;re probably not getting an urgent email. At the very least, don&#8217;t check Twitter and email first thing in the morning, it sets a horrible tone for the rest of the day. And if you&#8217;re not on Reddit already, don&#8217;t start, it&#8217;ll suck your time away like an evil meme-filled vacuum.</p>
<h3>Make a goal for your company</h3>
<p style="padding-left: 30px;">This was the key message I got from <a href="http://twitter.com/akgfx">Arash&#8217;s</a> talk at GDC. All the decisions you make for your company become a lot simpler if you know what you want your company to become. You need some kind of mission statement, some kind of idea of what your purpose is. I think this applies to individuals as well. Spend a couple hours and really figure out exactly what your goals and ambitions are, then write them down and put them somewhere visible.</p>
<p>So with that, I think I&#8217;ll draw this post to a close. Many thanks if you&#8217;ve actually read this far. I promise the posts in the weeks to come will be a lot more interesting, so don&#8217;t forget to come back next Sunday!</p>
]]></content:encoded>
			<wfw:commentRss>http://struct.ca/2011/four-months/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>How To Price Your Game</title>
		<link>http://struct.ca/2010/how-to-price-your-game/</link>
		<comments>http://struct.ca/2010/how-to-price-your-game/#comments</comments>
		<pubDate>Wed, 17 Nov 2010 04:59:24 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[App Store]]></category>
		<category><![CDATA[iDevBlogADay]]></category>

		<guid isPermaLink="false">http://struct.ca/?p=525</guid>
		<description><![CDATA[For this week&#8217;s iDevBlogADay post, I&#8217;m going to give my thoughts and recommendations on game pricing. This is a something I skimmed in last week&#8217;s post, but it&#8217;s a highly requested topic, so I figured it was worth delving into. &#8230; <a href="http://struct.ca/2010/how-to-price-your-game/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>For this week&#8217;s <a href="http://idevblogaday.com">iDevBlogADay</a> post, I&#8217;m going to give my thoughts and recommendations on game pricing. This is a something I skimmed in <a href="http://struct.ca/2010/slides-and-such">last week&#8217;s post</a>, but it&#8217;s a highly requested topic, so I figured it was worth delving into. Both paid and freemium are valid strategies for making money the App Store, but I&#8217;m saving freemium games and IAP in general for a future post, so this one will only cover paid games.</p>
<h2>Surgeon General&#8217;s Warning</h2>
<p>I am not an expert on game pricing. I have absolutely no background in economics or any other kind of business-y stuff. Really, most of this is just guesswork and extrapolation from my own experiences with <a href="http://trainyard.ca">Trainyard</a> and from what I&#8217;ve heard from other developers. If you lose a million dollars from following my advice, I&#8217;m sorry. On the other hand, if you make a million dollars, you owe me half <img src='http://struct.ca/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h2>An overabundance of apps</h2>
<p>Apple enjoys telling us that there are more than 250,000 apps on the App Store, but the thing they don&#8217;t tell us is that 99% of those apps are awful. There is a serious ton of junk out there. The ridiculous goodness-to-crapness ratio means that anyone who is even slightly adventurous with their purchases is going to run into a lot of duds.</p>
<p><img class="alignnone size-full wp-image-536" title="250kAppsORLY" src="http://struct.ca/wp-content/uploads/2010/11/250kAppsORLY.jpg" alt="" width="640" height="231" /></p>
<p>People love comparing the price of apps to <a href="http://theoatmeal.com/blog/apps">all kinds of things</a>, especially coffee, but here&#8217;s the thing: when you buy a coffee, you know you&#8217;re getting a coffee. When you buy something on the App Store, you really don&#8217;t know exactly what you&#8217;re going to get. Imagine you bought your coffee, only to open the lid and find it was only half-full, or that it wasn&#8217;t coffee, but lemonade. If only 1 in 5 cups of coffee you bought actually contained coffee, a $3.99 coffee price would suddenly seem pretty high.</p>
<h2>It&#8217;s all about risk</h2>
<p>$2.99 is not a lot to pay for a good game, *if* a user knows it&#8217;s a good game. The problem is that with every App Store purchase, there&#8217;s a very high likelihood that the user is going to get a bad game. Over time, most users will have come to know and accept this about the App Store, and they&#8217;ll perceive a certain risk for every purchase. They subconsciously weigh the cost of the game against the chance that they&#8217;re going to be ripped off.  We can use this knowledge to our advantage when we price our games, by figuring out the perceived risk.</p>
<p><img class="alignnone size-full wp-image-537" title="PerceivedRisk" src="http://struct.ca/wp-content/uploads/2010/11/PerceivedRisk.jpg" alt="" width="640" height="200" /></p>
<h2>Risk reduction</h2>
<p>There are a number of factors that affect how risky a game seems to a user. The most obvious are ratings and reviews. Apple has put these in place to give users a good sense of what other users think about the game. They help, but unfortunately they can also be gamed and abused, so they&#8217;re not as useful as they could be.</p>
<p>Being featured by Apple does a huge amount to reduce the risk of a game, because it tells a user that the almighty Apple has decided the game is worthy of the featured apps list. It also increases the exposure of a game a huge amount, which is why it&#8217;s such an effective boon for sales.</p>
<p>The top charts are similar to being featured in that they also increase the exposure of your game, and being in the top charts tells potential users that lots of other users are buying your game, which means it&#8217;s probably not a dud.</p>
<p>Another great factor is having a solid brand. Having a well known brand helps immensely to legitimize your game. That brand could be a licensed property, like Skee-Ball, a company brand you&#8217;ve built up over time, or even a publisher, although I <strong>really </strong>discourage you from getting a publisher.</p>
<p>Mentions from friends are the ultimate risk-reducer. I consider this as anything from Twitter to blogs and especially actual word-of-mouth. If people the users actually trust recommend the game, then they *know* it&#8217;s not going to be awful.</p>
<p>There are dozens of other subtler factors that affect the risk of your game as well, including the quality of the icon, screenshots, and description. Using these well can increase the appeal of your game, but using them poorly can actually push potential users away.</p>
<p><img class="alignnone size-full wp-image-538" title="Exposure" src="http://struct.ca/wp-content/uploads/2010/11/Exposure.jpg" alt="" width="640" height="200" /></p>
<h2>Launch time</h2>
<p>If you&#8217;re an indie developer, your game most likely won&#8217;t have anything but word-of-mouth and blog posts to go on at launch. Most users who get to the App Store &#8221;buy page&#8221; for your app will have come there from a specific link or from typing your app&#8217;s name in the App Store search. A user who is looking for your specific app already knows exactly what they&#8217;re getting, so their perceived risk is minimal. What this means is that you can afford to price the app at a higher price, because they aren&#8217;t simply browsing.</p>
<p>At launch you should price your game at close to what it&#8217;s truly worth, but you still have <a href="http://struct.ca/2010/pricing-games">consider the rest of the App Store market</a>. Some games really are lifetime $0.99 games, and usually have fairly shallow, repetitive gameplay. As a completely arbitrary rule: if your game couldn&#8217;t have a substantial lite version without giving away the whole game, it&#8217;s probably a lifetime $0.99 game. Most other games deserve the premium $2.99 price point. Unless you&#8217;ve got a very established brand, anything above $2.99 is pretty much App Store suicide.</p>
<p>I originally launched Trainyard at $1.99, but looking back, I think that was a mistake. There&#8217;s very little difference between $1.99 and $2.99 to most users, and my sales stayed steady when I bumped the price of Trainyard up to $2.99 a few months after launch.</p>
<p><img class="alignnone size-full wp-image-540" title="PricingGroups" src="http://struct.ca/wp-content/uploads/2010/11/PricingGroups1.jpg" alt="" width="640" height="200" /></p>
<p>Keep in mind that these prices are for the iPhone and iPod Touch. I&#8217;ve never released a game for the iPad, but in general, it seems that iPad prices should be $1 higher than their iPhone equivalents.</p>
<h2>Experiment</h2>
<p>This is a very young and volatile market, so there are no absolute rules. Feel free to experiment with the price of your app every so often. Apple makes it incredibly easy to change the price as much as you want, although you should keep in mind that there&#8217;s usually around an hour long delay before it fully propagates through the App Store. One of the big things I hear some people worry about is whether they&#8217;re going to anger their current user base when they have a sale. Don&#8217;t worry! Most of your current users won&#8217;t even know you&#8217;re having a sale, and the ones that do usually won&#8217;t care.</p>
<p>Having a sale probably won&#8217;t rocket your app up the charts, but it&#8217;s a great reason to send an email around to your favourite blogs to drum up some more publicity. There are some apps, like <a href="http://itunes.apple.com/app/canabalt/id333180061">Canabalt</a>, that never go on sale, which becomes part of their &#8220;mystique&#8221;. I guess that&#8217;s fine if you want to be hardcore like that, but I really don&#8217;t see the point.</p>
<h2>Push for the top</h2>
<p>When your app gets featured by Apple, it&#8217;s time to start planning for a sale. I can only advise you to do <a href="http://struct.ca/2010/the-story-so-far">what I did</a>. Featuring only lasts a week, so your goal is to go as high in the charts as you can to extend your popularity well after the feature is over. That being said, I&#8217;d say wait a few days before you do the sale, because I think it only takes a couple days of being featured to max out your rank. Apps are always featured on Thursdays, and in my case, I waited till the Tuesday to do the sale, which was <a href="http://struct.ca/2010/the-week-that-was">quite successful</a>.</p>
<p>I know my situation was pretty much a perfect storm of dozens of factors all converging, but that doesn&#8217;t mean it couldn&#8217;t happen to you. Your circumstances could literally be once-in-a-lifetime, so you&#8217;ve got to take the chance when you get it. Even if you don&#8217;t hit the top 10 or even the top 100, your rank will still rise further than it would have at the higher price point, and therefore your descent should be slower. Feel free to raise the price back up when you&#8217;re off any of the major charts.</p>
<h2>Wrapping up</h2>
<p>I think that&#8217;s about it for my paid game pricing advice. There are a bunch of subtler things I didn&#8217;t cover because this post would have been a bajillion words long, but I think you probably get the gist. As usual, if you&#8217;ve got any comments or questions, please <a href="http://twitter.com/MattRix">message me on twitter</a>, <a href="mailto:matt@matt-rix.com">send me an email</a>, or just post a comment.</p>
<p><em>One final note: I&#8217;m going to follow in the footsteps of <a href="http://www.paradeofrain.com/">Alex </a>and <a href="http://gamesfromwithin.com/">Noel</a> and make this my last <a href="http://idevblogaday.com">iDevBlogADay</a> post. The waiting list is getting way too long, and I&#8217;m so ridiculously busy right now that I really shouldn&#8217;t be spending as much time as I do writing these posts. That being said, I&#8217;ll keep writing stuff, so stick <a href="http://struct.ca/feed">http://struct.ca/feed</a> into your rss thingie. </em></p>
]]></content:encoded>
			<wfw:commentRss>http://struct.ca/2010/how-to-price-your-game/feed/</wfw:commentRss>
		<slash:comments>35</slash:comments>
		</item>
	</channel>
</rss>

