<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Flower-Garden on Games From Within</title><link>https://gamesfromwithin.com/tag/flower-garden/</link><description>Recent content in Flower-Garden on Games From Within</description><generator>Hugo</generator><language>en-us</language><copyright>2004–2026 Noel Llopis</copyright><lastBuildDate>Fri, 16 Dec 2011 00:00:00 +0000</lastBuildDate><atom:link href="https://gamesfromwithin.com/tag/flower-garden/index.xml" rel="self" type="application/rss+xml"/><item><title>Trying Out Multisampling On iOS</title><link>https://gamesfromwithin.com/trying-out-multisampling-on-ios/</link><pubDate>Fri, 16 Dec 2011 00:00:00 +0000</pubDate><guid>https://gamesfromwithin.com/trying-out-multisampling-on-ios/</guid><description>&lt;p&gt;I only recently broke free of iOS3.x for Flower Garden, so I&amp;rsquo;m finally adding all the features I had been itching to add that required higher OS support. I had already added some iOS4+ features, but I was keeping them to a minimum because it&amp;rsquo;s always a huge cause of bugs to target multiple versions of the OS at once.&lt;/p&gt;
&lt;p&gt;One of the first features I looked into adding was &lt;a href="http://en.wikipedia.org/wiki/Multisample_anti-aliasing"&gt;multisample antialiasing (MSAA)&lt;/a&gt; support for OpenGL, which was originally introduced in iOS 4.0. The geometry generated for the petals in Flower Garden is fairly high contrast, and since it&amp;rsquo;s not like the textures were carefully created and laid out by an artist, the result is pretty bad aliasing around the edges. Perfect candidate for multisampling!&lt;/p&gt;</description><content:encoded><![CDATA[<p>I only recently broke free of iOS3.x for Flower Garden, so I&rsquo;m finally adding all the features I had been itching to add that required higher OS support. I had already added some iOS4+ features, but I was keeping them to a minimum because it&rsquo;s always a huge cause of bugs to target multiple versions of the OS at once.</p>
<p>One of the first features I looked into adding was <a href="http://en.wikipedia.org/wiki/Multisample_anti-aliasing">multisample antialiasing (MSAA)</a> support for OpenGL, which was originally introduced in iOS 4.0. The geometry generated for the petals in Flower Garden is fairly high contrast, and since it&rsquo;s not like the textures were carefully created and laid out by an artist, the result is pretty bad aliasing around the edges. Perfect candidate for multisampling!</p>
<p>I based everything on the <a href="http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithEAGLContexts/WorkingwithEAGLContexts.html#//apple_ref/doc/uid/TP40008793-CH103-SW12">Apple documentation on multisampling</a>. It was very straightforward and it works for both off-screen and view-based render targets. It was also extremely helpful to keep both the ability to use regular and multisampled render targets. That way I can easily run performance and visual comparisons, and, if necessary, I can disable multisampling on a particular device.</p>
<p>The main gotcha was making sure I used the GL_RGBA8_OES color format on the multisampling color buffer (otherwise it won&rsquo;t work, and all you&rsquo;ll get are 1282 &ldquo;invalid operation&rdquo; OpenGL errors). Also, if you&rsquo;re in the same boat as Flower Garden, which uses OpenGL ES 1.1 and the fixed function pipeline, you&rsquo;ll have to add _OES to just about every constant in the documentation.</p>
<h2 id="visual-results">Visual results</h2>
<p>I will let the screenshots speak for themselves.</p>
<p><img alt="Multisample" loading="lazy" src="/trying-out-multisampling-on-ios/images/multisample.png"></p>
<p>In this screenshot you can see the rendering of the pots using off-screen render targets.</p>
<p><img alt="Multisample2" loading="lazy" src="/trying-out-multisampling-on-ios/images/multisample2.png"></p>
<p>Pretty impressive improvement, even if I say so myself! The improvement is even more striking in-game because the animation of the flowers moving in the wind doesn&rsquo;t have jaggies popping in and out.</p>
<p>The improvements are more noticeable on the iPad because the pixels are bigger, and, not surprisingly, less so on retina-display iPhones. But even on the retina displays, jaggies are less noticeable during the flower wind-swaying animations.</p>
<h2 id="performance">Performance</h2>
<p>So, no doubt: They look pretty. But how about performance? Under the hood, the rasterizer is generating four samples for every pixel, and then combining them at the end in a separate step. So you&rsquo;ll get more of a performance hit with complex pixel shaders. <strong>Edit:</strong> My bad. I spaced out and I forgot that MSAA only evaluates the pixel shader once, so performance doesn&rsquo;t depend on pixel shader complexity. Instead, the performance hit probably comes from the extra writes (four per pixel) to the render target, and should be fairly similar between games.</p>
<p>It turns out that Flower Garden is still using OpenGL ES 1.1, which is implemented using shaders at the driver level. Fortunately, even though I&rsquo;m using some texture combiner operations and several input textures, those pixel shaders aren&rsquo;t all that complex.</p>
<p>These are the frames per second I recorded with one particular flower pot on the different devices I have for testing. Notice that the lowest device I have listed is the iPhone 3GS. That&rsquo;s because I have also stopped supporting arm6 CPUs to keep things simpler (and the market share is minimal).</p>
<p><strong>Update:</strong> I was only running the game loop at 30 fps, so the initial performance numbers I had listed are pretty meaningless. Here are the correct numbers running at a max of 60 fps.</p>
<table>
	<thead>
			<tr>
					<th>Device</th>
					<th>Without MSAA</th>
					<th>With MSAA</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>iPhone 3GS</td>
					<td>39 fps (25.6 ms)</td>
					<td>37 fps (27.0 ms)</td>
			</tr>
			<tr>
					<td>iPhone 4</td>
					<td>48 fps (20.8 ms)</td>
					<td>23 fps (43.5 ms)</td>
			</tr>
			<tr>
					<td>iPhone 4S</td>
					<td>60 fps (16.7 ms)</td>
					<td>60 fps (16.7 ms)</td>
			</tr>
			<tr>
					<td>iPad 1</td>
					<td>60 fps (16.7 ms)</td>
					<td>18 fps (55.6 ms)</td>
			</tr>
			<tr>
					<td>iPad 2</td>
					<td>60 fps (16.7 ms)</td>
					<td>60 fps (16.7 ms)</td>
			</tr>
	</tbody>
</table>
<p>Of the devices I tested, MSAA didn&rsquo;t slow down things much on the iPhone 3GS, and the iPhone 4S was maxed out at 60 fps both ways. The iPad 1 was a different story, and performance crashed from 60 fps to 18 fps. Like Rory pointed in the comments, looking at the actual time instead of the fps gives a better insight. Using MSAA adds 38.9 ms to each frame! The iPhone 4 also suffered from a big performance hit due to all the extra pixels in the retina display. I don&rsquo;t care how pretty the flowers are, that&rsquo;s just not acceptable (and no, I&rsquo;m not adding user-tweakable graphics settings like PC games).</p>
<p>I should also add that Flower Garden is hugely CPU bound. It generates all that geometry every frame on the CPU, and that&rsquo;s a lot of vector transforms. So if your game is GPU bound, you&rsquo;re likely to see higher performance hits.</p>
<p>I was initially very surprised to see that the performance on the simulator tanked big time (as in, going from 30 fps to 5 fps). This was news to me, but apparently the iOS simulator runs completely in software, so the quadrupling of pixels brings it to its knees. I&rsquo;m really, really, impressed at how smoothly it usually runs for being in software though. It had me fooled thinking it was using OpenGL under the hood!</p>
<p>As far as memory goes, after an <a href="https://twitter.com/#!/Frogblast/status/144811240177405952">animated discussion on Twitter</a>, it seems that the iPhone does create full buffers for the multisample frame buffers, so there is a significant increase in memory usage. It&rsquo;s not something easy to track because it all happens at the driver level, but it&rsquo;s something to be aware of. Because of this, I might consider turning multisampling off on retina displays, since the improvement is not mind-blowing (and the extra memory is very significant because of the amount of pixels). I&rsquo;ll also probably turn it off in the simulator so I can achieve a decent frame rate during development.</p>
<h2 id="conclusions">Conclusions</h2>
<p>Multisampling only required adding a few lines of code and resulted in an impressive visual improvement and minimal performance impact in some devices. It&rsquo;s a no-brainer on the 3GS and iPad 2. I&rsquo;m wishing I had implemented it earlier!</p>]]></content:encoded></item><item><title>Duplicating Launchboard Wobble</title><link>https://gamesfromwithin.com/duplicating-launchboard-wobble/</link><pubDate>Fri, 30 Sep 2011 00:00:00 +0000</pubDate><guid>https://gamesfromwithin.com/duplicating-launchboard-wobble/</guid><description>&lt;p&gt;One of the most requested features for Flower Garden is to be able to move pots around. Not only do players want to group similar flowers or colors together, but they also want to be able to take advantage of the properties of the different gardens. I figured the best thing to do this is by mimicking the wobble on the iPhone launchboard icons when you enter edit mode.&lt;/p&gt;</description><content:encoded><![CDATA[<p>One of the most requested features for Flower Garden is to be able to move pots around. Not only do players want to group similar flowers or colors together, but they also want to be able to take advantage of the properties of the different gardens. I figured the best thing to do this is by mimicking the wobble on the iPhone launchboard icons when you enter edit mode.</p>
<p>I have to say, I&rsquo;m not a huge fan of the wobble movement, but it does indicate that icons are &ldquo;loose&rdquo; and movable. And since most players are already familiar with that metaphor, and the overhead view of Flower Garden resembles the launchboard quite a bit (not coincidence), I might as well go with it.</p>
<p><img alt="Garden02" loading="lazy" src="/duplicating-launchboard-wobble/images/garden02.jpg"></p>
<p>Each pot is a UIButton with a custom image (<a href="/opengl-and-uikit-demo/">rendered from OpenGL into an off-screen target</a>). So when I enter edit mode, I need to wobble them like the launchboard. Easier said than done.</p>
<p>I searched online and <a href="http://twitter.com/#!/noel_llopis/status/119795265069785088">asked on Twitter</a>, but surprisingly, nobody had done a perfect, reverse-engineering of the wobble movement. Most mentions just do a z rotation on a sine wave, which is not that close of the launchboard animation.</p>
<p>I found that to get closer to the real thing, you need to do that rotation around a random point offset from the center. That&rsquo;s better, but it&rsquo;s still not perfect. There&rsquo;s an additional extra twitch in the original Apple animation. I&rsquo;d love it if someone already reverse-engineered it and has a better model for that animation.</p>
<p>In the meanwhile, I figured I would share the core I&rsquo;m using. It&rsquo;s all very straightforward, except for the part about rotating a UIView around a different point other than the center. I initially thought I could just concatenate transforms, but no matter how you do it, UIKit always interprets the transform around the center.</p>
<p>To be more precise, it interprets the rotation around the anchor point, and that&rsquo;s what you need to modify. The anchor point is defined in units that are a percentage of the layer&rsquo;s size, so by default it&rsquo;s 0.5, 0.5. When you move the anchor point, the layer itself will move, so you need to fix it up by moving the layer&rsquo;s position by the same amount in the opposite direction.</p>
<p>This is what the final code looks like:</p>
<pre tabindex="0"><code>void StartPotWobble(UIButton* button, Random&amp; random)
{
	const Range posOffset(0.10f, 0.2f);
	const float amplitude = random.GetFloat(1,1.5f);
	const Vec2 startCenter(Sign(random.GetFloat(-1,1))*random.GetFloat(posOffset), Sign(random.GetFloat(-1,1))*random.GetFloat(posOffset));
	const Vec2 endCenter(Sign(random.GetFloat(-1,1))*random.GetFloat(posOffset), Sign(random.GetFloat(-1,1))*random.GetFloat(posOffset));

	CGPoint center = button.center;	
	button.layer.anchorPoint = CGPointMake(0.5f + startCenter.x, 0.5f + startCenter.y);
	CGRect bounds = button.bounds;
	button.layer.position = CGPointMake(button.layer.position.x + bounds.size.width*startCenter.x, 
									button.layer.position.y + bounds.size.height*startCenter.y);
	button.transform = CGAffineTransformMakeRotation(-amplitude*DegToRad);
		
	[UIView beginAnimations:nil context:NULL];
	[UIView setAnimationRepeatAutoreverses:YES];
	[UIView setAnimationRepeatCount:FLT_MAX];
	[UIView setAnimationDuration:0.12];
	[UIView setAnimationDelay:random.GetFloat(0,0.09f)];
		button.transform = CGAffineTransformMakeRotation(+amplitude*DegToRad);
	[UIView commitAnimations];
}
	
	
void StopPotWobble(UIButton* button)
{
	[button cancelAllAnimationsRecursively];
	button.transform = CGAffineTransformIdentity;
	CGPoint anchor = button.layer.anchorPoint;
	CGPoint offset = CGPointMake((0.5f - anchor.x)*button.width, (0.5f - anchor.y)*button.height);
	button.layer.anchorPoint = CGPointMake(0.5f, 0.5f);
	button.layer.position = CGPointMake(button.layer.position.x + offset.x, button.layer.position.y + offset.y);
}
</code></pre><p>Ah yes, and I couldn&rsquo;t find a way to loop the animation infinitely (without using the new UIView animation syntax), so FLT_MAX will have to do :-) Any cleaner way?</p>
<p>If someone has an animation that more closely resembles the iPhone launchboard, I&rsquo;d love to hear about it. Let me know and I&rsquo;ll update this post.</p>]]></content:encoded></item><item><title>URL Shorteners In Under Two Minutes</title><link>https://gamesfromwithin.com/url-shorteners-in-under-two-minutes/</link><pubDate>Fri, 26 Aug 2011 00:00:00 +0000</pubDate><guid>https://gamesfromwithin.com/url-shorteners-in-under-two-minutes/</guid><description>&lt;p&gt;This morning I added the goo.gl URL shortener to Flower Garden, so I thought a quick post with sample code might be helpful for other developers looking to do something similar.&lt;/p&gt;
&lt;p&gt;I use the URL shortener in Flower Garden to send bouquets through SMS. Space is limited in a text message, so the message just contains some text explaining what is it and the URL pointing to the bouquet image. (Yes, I would much rather send them through MMS, but Apple isn&amp;rsquo;t exposing that yet to developers).&lt;/p&gt;
&lt;p&gt;&lt;img alt="Sms" loading="lazy" src="https://gamesfromwithin.com/url-shorteners-in-under-two-minutes/images/sms.png"&gt;&lt;/p&gt;
&lt;p&gt;In this case, the full URL is &lt;a href="http://flowers.snappytouch.com/sms.php?id=949618b4b3c6f3d76e32b45446e238a0"&gt;http://flowers.snappytouch.com/sms.php?id=949618b4b3c6f3d76e32b45446e238a0&lt;/a&gt; which gets thankfully shortened to &lt;a href="http://goo.gl/IV5cq"&gt;http://goo.gl/IV5cq&lt;/a&gt;.&lt;/p&gt;</description><content:encoded><![CDATA[<p>This morning I added the goo.gl URL shortener to Flower Garden, so I thought a quick post with sample code might be helpful for other developers looking to do something similar.</p>
<p>I use the URL shortener in Flower Garden to send bouquets through SMS. Space is limited in a text message, so the message just contains some text explaining what is it and the URL pointing to the bouquet image. (Yes, I would much rather send them through MMS, but Apple isn&rsquo;t exposing that yet to developers).</p>
<p><img alt="Sms" loading="lazy" src="/url-shorteners-in-under-two-minutes/images/sms.png"></p>
<p>In this case, the full URL is <a href="http://flowers.snappytouch.com/sms.php?id=949618b4b3c6f3d76e32b45446e238a0">http://flowers.snappytouch.com/sms.php?id=949618b4b3c6f3d76e32b45446e238a0</a> which gets thankfully shortened to <a href="http://goo.gl/IV5cq">http://goo.gl/IV5cq</a>.</p>
<p>Sending bouquets through SMS has been in Flower Garden for several months, but it was using bit.ly before, which is probably the most popular URL shortener out there. I like their web interface and their super-easy to use API, but unfortunately it seems that I hit some mysterious API limit during the Mother&rsquo;s Day Flower Garden promotion. That limit isn&rsquo;t public anywhere, and as far as I can tell, I can&rsquo;t even see it myself through the web interface or through an API query.</p>
<p>Finding out that I reached the API limit was quite shocking, because sending bouquets through SMS isn&rsquo;t a particularly popular feature. Unfortunately I don&rsquo;t have <a href="/analytics-for-ios-games/">good analytics hooked up to that step</a>, but I can&rsquo;t imagine there were more than a few thousand per day.</p>
<p>They were very nice and contacted me instead of shutting down my account since it was just a spike. They also tried to sell me their &ldquo;Enterprise&rdquo; account, but $995/month is a tad too expensive for me. By about $990 probably, so I had to look for other options.</p>
<p>After a very quick research, <a href="http://googlesystem.blogspot.com/2011/01/api-for-google-url-shortener.html">goo.gl</a> was the perfect alternative. Not only is it very fast (and backed up by the giant Google no less), but they have an API limit of 1,000,000 queries/day. If I ever blow that budget, I&rsquo;ll be able to afford the $995/month without a problem :-)</p>
<p>All URL shorteners are very easy to use. You need an API key, and figure out the exact format of the HTTP message you send and the response you get.</p>
<h3 id="googl">goo.gl</h3>
<p><a href="http://goo.gl">Goo.gl</a> has a great <a href="http://code.google.com/apis/urlshortener/v1/getting_started.html">Getting Started Guide</a> that tells you everything you need to know. Get your private API key from <a href="https://code.google.com/apis/console">here</a>, and you&rsquo;re ready to rock.</p>
<p>Drop this in your app and start shortening away. You&rsquo;ll notice I used a synchronous HTTP request, which is usually a big no-no. Here I felt it was justified since the user is blocked waiting for the SMS to be prepared and sent. Besides, goo.gl is very, very fast, so it&rsquo;s never even noticeable.</p>
<pre tabindex="0"><code>const NSString* GooGlAPIURL = @&#34;https://www.googleapis.com/urlshortener/v1/url?key=YOUR_API_KEY_HERE&#34;;

NSString* ShortenURLWithGooGl(NSString* longURL)
{
	NSURL* apiUrl = [NSURL URLWithString:GooGlAPIURL];
	
	NSMutableURLRequest* req = [[NSMutableURLRequest alloc] initWithURL:apiUrl];
	[req setHTTPMethod:@&#34;POST&#34;];
	[req setTimeoutInterval:Timeout];
	[req setValue:@&#34;application/json&#34; forHTTPHeaderField:@&#34;Content-Type&#34;];
	
	NSString* body = [[NSString alloc] initWithFormat:@&#34;{\&#34;longUrl\&#34;: \&#34;%@\&#34;}&#34;, longURL];
	[req setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]];
	[body release];
	
	NSError* error = [[NSError alloc] init];
	NSHTTPURLResponse* urlResponse = nil;
	NSData* data = [NSURLConnection sendSynchronousRequest:req returningResponse:&amp;urlResponse error:&amp;error];
	[error release];
	if (data == NULL || ([urlResponse statusCode] &lt; 200 &amp;&amp; [urlResponse statusCode] &gt;= 300))
		return NULL;

	NSString* response = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
	NSDictionary* responseDict = [response JSONValue];
	NSString* shortURL = [[responseDict objectForKey:@&#34;id&#34;] retain];
	[response release];
	return shortURL;
}
</code></pre><p>I&rsquo;m using a <a href="https://github.com/stig/json-framework/">JSON framework</a> to parse the answer, but it&rsquo;s so simple I probably wouldn&rsquo;t even have to. I only used it because it&rsquo;s already part of the project because of <a href="https://developers.facebook.com/docs/guides/web/">Facebook Connect</a>.</p>
<h3 id="bitly">bit.ly</h3>
<p>Even though it&rsquo;s not my favorite shortener, I&rsquo;m adding it here for completeness (and because I had the code already written).</p>
<p>The one thing that bit.ly has going for it is that it&rsquo;s even easier to use than goo.gl. No JSON involved, and you don&rsquo;t even need to send a body with your request. As usual, get your API key by <a href="http://bitly.com/a/sign_up">signing up with bit.ly</a>.</p>
<pre tabindex="0"><code>const NSString* BITLYAPIURL = @&#34;http://api.bit.ly/v3/shorten?login=%@&amp;apiKey=%@&amp;format=txt&amp;&#34;;

NSString* ShortenURLWithBitLy(NSString* longURL)
{
	NSString* urlWithoutParams = [NSString stringWithFormat:BITLYAPIURL, LoginName, APIKey];	
	CFStringRef encodedParamCF = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
															 (CFStringRef) longURL, 
															 nil, (CFStringRef) @&#34;&amp;+&#34;, kCFStringEncodingUTF8); 
	NSString* encodedURL = (NSString*)encodedParamCF;
	NSString* parameters = [NSString stringWithFormat:@&#34;longUrl=%@&#34;, [encodedURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
	NSString* finalURL = [urlWithoutParams stringByAppendingString:parameters];
	
	NSURL* url = [NSURL URLWithString:finalURL];
	
	NSMutableURLRequest* req = [[NSMutableURLRequest alloc] initWithURL:url];
	[req setTimeoutInterval:Timeout];
	
	NSHTTPURLResponse* urlResponse = nil;  
	NSData* data = [NSURLConnection sendSynchronousRequest:req returningResponse:&amp;urlResponse error:NULL];
	if (data == NULL || ([urlResponse statusCode] &lt; 200 &amp;&amp; [urlResponse statusCode] &gt;= 300))
		return NULL;

	NSString* response = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
	return response;
}
</code></pre><p>That&rsquo;s it. You should be able to drop in either one of those snippets in your project and spend your time working on the things that really matter in your games.</p>]]></content:encoded></item><item><title>One Price Does Not Fit All</title><link>https://gamesfromwithin.com/one-price-does-not-fit-all/</link><pubDate>Sun, 24 Jul 2011 00:00:00 +0000</pubDate><guid>https://gamesfromwithin.com/one-price-does-not-fit-all/</guid><description>&lt;p&gt;A few days ago I gave &lt;a href="http://www.developconference.com/page.cfm/Action=Seminars/SeminarID=20"&gt;a talk at Evolve 2011&lt;/a&gt; (part of the &lt;a href="http://www.developconference.com/"&gt;Develop Conference&lt;/a&gt; in Brighton, England) titled &amp;ldquo;One Price Does Not Fit All&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;The main idea of the talk was the importance of &amp;ldquo;flexible pricing&amp;rdquo;: Letting players spend as much money as they want to get more enjoyment out of the game and customize their play experience. Flexible pricing can result in revenues much higher than the traditional fixed price approach (derived from manufactured goods). It&amp;rsquo;s also orthogonal to the concepts of freemium and social games, and we&amp;rsquo;re only scratching the surface in ways to effectively implement it in games.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the official conference abstract:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Did the biggest fans of your game spend more money on it than someone who played it just a few times? If not, you&amp;rsquo;re leaving a huge percentage of money on the table. This session will talk about how digital distribution has made fixed prices obsolete and how you can take advantage of flexible pricing through in-app purchases in your games. We&amp;rsquo;ll also talk about the consequences (good and bad) of making a game free to play. The session will present hard data from iOS platforms, but applies to all digital distribution platforms.&lt;/em&gt;&lt;/p&gt;</description><content:encoded><![CDATA[<p>A few days ago I gave <a href="http://www.developconference.com/page.cfm/Action=Seminars/SeminarID=20">a talk at Evolve 2011</a> (part of the <a href="http://www.developconference.com/">Develop Conference</a> in Brighton, England) titled &ldquo;One Price Does Not Fit All&rdquo;.</p>
<p>The main idea of the talk was the importance of &ldquo;flexible pricing&rdquo;: Letting players spend as much money as they want to get more enjoyment out of the game and customize their play experience. Flexible pricing can result in revenues much higher than the traditional fixed price approach (derived from manufactured goods). It&rsquo;s also orthogonal to the concepts of freemium and social games, and we&rsquo;re only scratching the surface in ways to effectively implement it in games.</p>
<p>Here&rsquo;s the official conference abstract:</p>
<p><em>Did the biggest fans of your game spend more money on it than someone who played it just a few times? If not, you&rsquo;re leaving a huge percentage of money on the table. This session will talk about how digital distribution has made fixed prices obsolete and how you can take advantage of flexible pricing through in-app purchases in your games. We&rsquo;ll also talk about the consequences (good and bad) of making a game free to play. The session will present hard data from iOS platforms, but applies to all digital distribution platforms.</em></p>
<p><img alt="Screen shot 2011 07 24 at 12 11 23 PM" loading="lazy" src="/one-price-does-not-fit-all/images/Screen-shot-2011-07-24-at-12.11.23-PM.png"></p>
<p>Answering questions preemptively: I definitely don&rsquo;t think that allowing players to spend the amount of money they want is &ldquo;evil&rdquo; in any way. And someone during the comment came up with a great point: Isn&rsquo;t it more &ldquo;evil&rdquo; to have players spend $60 on a game, just to find out 10 minutes afterwards that they don&rsquo;t like it or it doesn&rsquo;t run very well on their system/network?</p>
<p> </p>
<p>I was going to record the audio, but unfortunately I forgot to turn on Audacity before the talk. Note to self: Start recording when I set up the laptop, even if it&rsquo;s 10 minutes ahead of time.</p>
<p><strong><a href="http://www.slideshare.net/llopis/one-price-does-not-fit-all" title="One Price Does Not Fit All">One Price Does Not Fit All</a></strong></p>
<iframe src="http://www.slideshare.net/slideshow/embed_code/8675456" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="425" height="355"></iframe>
<p>View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/llopis">Noel Llopis</a></p>
<p> </p>
<p>[<a href="http://m.slideshare.net/llopis/one-price-does-not-fit-all">Slideshare mobile</a>] [<a href="/wp-content/uploads/2011/07/Evolve2011_Llopis.pdf">Slides in pdf format</a>]</p>]]></content:encoded></item><item><title>Flower Garden Featured For Valentine's Day!</title><link>https://gamesfromwithin.com/flower-garden-featured-for-valentines-day/</link><pubDate>Thu, 10 Feb 2011 00:00:00 +0000</pubDate><guid>https://gamesfromwithin.com/flower-garden-featured-for-valentines-day/</guid><description>&lt;p&gt;Two years ago, when I was working on the first release of Flower Garden, Valentine&amp;rsquo;s Day was my target ship date. Unfortunately (or fortunately depending on how you look at it), I missed it and rescheduled it for April. Last year I was eagerly awaiting the Valentine&amp;rsquo;s Day features hoping for a feature by Apple, but Flower Garden wasn&amp;rsquo;t one of the apps to be selected. It was disappointing but understandable given how many newer quality apps are out there.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Two years ago, when I was working on the first release of Flower Garden, Valentine&rsquo;s Day was my target ship date. Unfortunately (or fortunately depending on how you look at it), I missed it and rescheduled it for April. Last year I was eagerly awaiting the Valentine&rsquo;s Day features hoping for a feature by Apple, but Flower Garden wasn&rsquo;t one of the apps to be selected. It was disappointing but understandable given how many newer quality apps are out there.</p>
<p>Fast-forward another year, and this morning I woke up to a very pleasant and unexpected surprise: Flower Garden was featured on the App Store under Apps For Valentine&rsquo;s Day!</p>
<p><img alt="Valentines apple feature" loading="lazy" src="/flower-garden-featured-for-valentines-day/images/valentines_apple_feature.png"></p>
<p>Flower Garden is still going strong, but I wasn&rsquo;t expecting that at all. Thank you, Apple! Not only that, but this feature also appears on the device App Store. Flower Garden was featured twice before by Apple, but never before on a spot that appeared on the device. So that&rsquo;s a first for Flower Garden!</p>
<p><img alt="Valentines apple feature iphone" loading="lazy" src="/flower-garden-featured-for-valentines-day/images/valentines_apple_feature_iphone.png"></p>
<p>To make things more interesting, I had been planning on doing a bit of promotion around Valentine&rsquo;s Day like last year. So a few days ago I <a href="http://www.facebook.com/iphoneflowergarden/posts/165687373479182">released a new update</a>, and included another in-app purchase for the most asked-for feature: More pots in another garden space.</p>
<p><img alt="Secret Garden" loading="lazy" src="/flower-garden-featured-for-valentines-day/images/Secret_Garden.jpg"></p>
<p>Finally, to round things off, I planned on doing a similar promotion to what I did last year around Mother&rsquo;s Day, and I set Flower Garden to be free from today until Valentine&rsquo;s Day to encourage even more people to try it. To get the word out of the price drop, I got some promotion going from <a href="http://itunes.apple.com/us/app/pocket-frogs/id386644958?mt=8">Pocket Frogs</a> and a few other apps encouraging users try out the now free Flower Garden. I&rsquo;m also hoping a few media outlets cover the sale to get the word out as much as possible.</p>
<p><img alt="Pf fg" loading="lazy" src="/flower-garden-featured-for-valentines-day/images/pf_fg.jpg"></p>
<p>As of this moment, Flower Garden is in the top 100 apps in the US and in the top 50 games, so the combination of everything seems to be working. We&rsquo;ll see how things develop over this coming week. Until then, it&rsquo;s going to be an exciting ride.</p>
<p>For the latest news on Flower Garden, join the Facebook page by clicking &ldquo;Like&rdquo;:</p>
<iframe src="http://www.facebook.com/plugins/likebox.php?href=http%3A%2F%2Ffacebook.com%2Fiphoneflowergarden&amp;width=500&amp;colorscheme=light&amp;show_faces=true&amp;stream=true&amp;header=true&amp;height=427" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:427px;" allowtransparency="true"></iframe>
]]></content:encoded></item><item><title>The Power Of In-App Purchases</title><link>https://gamesfromwithin.com/the-power-of-in-app-purchases/</link><pubDate>Tue, 09 Nov 2010 00:00:00 +0000</pubDate><guid>https://gamesfromwithin.com/the-power-of-in-app-purchases/</guid><description>&lt;p&gt;I finally managed to get through the hotel wifi and upload the slides for this morning&amp;rsquo;s &lt;a href="http://360idev.com"&gt;360iDev&lt;/a&gt; talk: The Power Of In-App Purchases. Thanks everybody who attended for the great questions and feedback!&lt;/p&gt;
&lt;h3 id="session-description"&gt;Session description&lt;/h3&gt;
&lt;p&gt;The common-sense approach to make money on the App Store used to be to do anything to get on the top charts. In-app purchases changed all of that. Good in-app purchases can make your app profitable without being anywhere on the charts, and are the best hope for the independent developer. Come to this session to learn why IAPs can be so effective and how to leverage them effectively: what makes a good IAP, how to increase your user involvement, how to present IAPs in an attractive way, what things attract users, and what things turn them away. We&amp;rsquo;ll go through lots of detailed real-world data from Flower Garden and other games with strong IAPs.&lt;/p&gt;</description><content:encoded><![CDATA[<p>I finally managed to get through the hotel wifi and upload the slides for this morning&rsquo;s <a href="http://360idev.com">360iDev</a> talk: The Power Of In-App Purchases. Thanks everybody who attended for the great questions and feedback!</p>
<h3 id="session-description">Session description</h3>
<p>The common-sense approach to make money on the App Store used to be to do anything to get on the top charts. In-app purchases changed all of that. Good in-app purchases can make your app profitable without being anywhere on the charts, and are the best hope for the independent developer. Come to this session to learn why IAPs can be so effective and how to leverage them effectively: what makes a good IAP, how to increase your user involvement, how to present IAPs in an attractive way, what things attract users, and what things turn them away. We&rsquo;ll go through lots of detailed real-world data from Flower Garden and other games with strong IAPs.</p>
<p><img alt="purchases_vs_users.png" loading="lazy" src="/the-power-of-in-app-purchases/images/purchases_vs_users.png"></p>
<p><strong>Presentation slides:</strong> [<a href="http://www.slideshare.net/llopis/power-iap">Slideshare</a>] [<a href="/wp-content/uploads/2010/11/power_iap.pdf">pdf</a>]</p>
]]></content:encoded></item><item><title>Chronicle Of A Failed Experiment</title><link>https://gamesfromwithin.com/chronicle-of-a-failed-experiment/</link><pubDate>Thu, 04 Nov 2010 00:00:00 +0000</pubDate><guid>https://gamesfromwithin.com/chronicle-of-a-failed-experiment/</guid><description>&lt;p&gt;In the last year and a half, I&amp;rsquo;ve written about the different things that I&amp;rsquo;ve tried with Flower Garden and their effects on sales. From &lt;a href="https://gamesfromwithin.com/making-a-living-barely-on-the-iphone-app-store/"&gt;adding Facebook support, creating a free version&lt;/a&gt;, &lt;a href="https://gamesfromwithin.com/making-a-living-comfortably-on-the-app-store/"&gt;adding in-app purchases&lt;/a&gt;, or &lt;a href="https://gamesfromwithin.com/the-power-of-free/"&gt;giving Flower Garden for free for a limited time&lt;/a&gt;. Some strategies worked and some didn&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;Today I want to share my latest experiment, and how it was a total and complete failure: Adding the option to gift IAP items from within the game.&lt;/p&gt;</description><content:encoded><![CDATA[<p>In the last year and a half, I&rsquo;ve written about the different things that I&rsquo;ve tried with Flower Garden and their effects on sales. From <a href="/making-a-living-barely-on-the-iphone-app-store/">adding Facebook support, creating a free version</a>, <a href="/making-a-living-comfortably-on-the-app-store/">adding in-app purchases</a>, or <a href="/the-power-of-free/">giving Flower Garden for free for a limited time</a>. Some strategies worked and some didn&rsquo;t.</p>
<p>Today I want to share my latest experiment, and how it was a total and complete failure: Adding the option to gift IAP items from within the game.</p>
<p><img alt="gift_this.png" loading="lazy" src="/chronicle-of-a-failed-experiment/images/gift_this.png"></p>
<h3 id="promo-codes">Promo Codes</h3>
<p>Before I can talk about how I implemented the &ldquo;Gift This&rdquo; feature, we need to talk about promo codes. Since Flower Garden has so many in-app purchases, I figured it would be very handy to have the ability to give some of them away to people for any reason: They mistakenly downloaded the wrong thing, they bought it in the free version and want to upgrade to the full one, or they supposedly paid for one but they never got it. Whatever the reason, having my own promo codes for in-app purchases was one of the best decisions I could have made. I would highly recommend it if you have IAPs, especially consumables.</p>
<p>The implementation of promo codes was totally straightforward. I have two tables in the Google App Engine: One for active promo codes and one for redeemed ones. The active promo code includes the code itself, the IAP item it refers to, the amount, and whether it&rsquo;s limited to one user or not (if it&rsquo;s limited to one user, the code goes away as soon as it&rsquo;s redeemed, otherwise, any amount of users can redeem it).</p>
<p>Here&rsquo;s an example of a code I just added (yes, feel free to redeem it in the Flower Shop):</p>
<p><img alt="promo_code.png" loading="lazy" src="/chronicle-of-a-failed-experiment/images/promo_code.png"></p>
<p>Whenever a promo code is redeemed, I enter that data in the other table. That way not only do I have a log of what codes where redeemed and when, but I can also check and prevent the same device from redeeming the same code multiple times.</p>
<p>Another important reason to keep a redeemed promo code table is that I want promo codes to be as valid as purchasing the IAP directly. That means that if you ever attempt to purchase an item, I check first to see if you&rsquo;ve redeemed a promo code for it, and if so, you can re-download it for free. Same thing when you do a restore purchases (although I believe I haven&rsquo;t gotten around to implementing that part yet :-)</p>
<p>Here&rsquo;s my plea to Apple: <strong>Please, please, please, give us an &ldquo;iTunes Account ID&rdquo; along with the IAP data</strong>. Right now the best we can do is associate a purchase with a device (which is not good enough), or have a whole registration system for users (which is a pain and more time consuming for users). They&rsquo;re already doing this with a Game Center ID, so why not with an iTunes Account?</p>
<h3 id="gift-this">Gift This</h3>
<p>Once the promo code system was in place and field tested for a couple of months, I finally implemented the Gift This functionality. In the Flower Shop, users have the option to buy an item for themselves, or for someone else.</p>
<p>The first time you use the Gift This feature it explains how it works: You purchase the item and then you send it to someone else through email.</p>
<p>Under the hood, it purchases the IAP, contacts the server to generate a new promo code for that item, and then creates an email with the promo code and even a custom URL. Whenever someone receives a gift email, they can just click on the custom link and they immediately receive the item (assuming they have Flower Garden installed, of course).</p>
<p><img alt="gift_email.png" loading="lazy" src="/chronicle-of-a-failed-experiment/images/gift_email.png"></p>
<p>One interesting consequence is that to implement this, you need to create one new IAP item for every item you want to gift (especially if they&rsquo;re not consumable). Otherwise, someone couldn&rsquo;t gift an item they had already purchased, or they couldn&rsquo;t gift it more than once. This can add quite a few extra IAPs in your list!</p>
<p>In the case of Flower Garden, I started with the easiest case, and I only implemented gifting for fertilizer purchases (because they&rsquo;re consumable, so I don&rsquo;t have to keep track of who receives them and restoring them).</p>
<h3 id="total-failure">Total Failure</h3>
<p>I really had great hopes for the Gift This feature. I had already envisioned writing a blog post showing IAP revenue going up 20-30% because of that feature. Not quite! It was pretty much a complete flop. The only positive thing I can say about it is that it didn&rsquo;t actually lower regular sales.</p>
<p>See for yourself. In a period of about a month and a half, all the fertilizer gifting in the free and paid versions of Flower Garden amounted to a whopping $191!</p>
<p><img alt="gift_revenue.png" loading="lazy" src="/chronicle-of-a-failed-experiment/images/gift_revenue.png"></p>
<p>Definitely not worth the 3-4 days it took me to implement it (and the opportunity cost of not being able to add some other feature or IAP).</p>
<p>Compare it to fertilizer sales during that period of over $7,000:</p>
<p><img alt="fertilizer_revenue.png" loading="lazy" src="/chronicle-of-a-failed-experiment/images/fertilizer_revenue.png"></p>
<p>(That&rsquo;s the spike of the new feature plus <a href="/communicating-with-players/">the Pocket Frogs cross promotion</a> if you were wondering about it).</p>
<p>I&rsquo;d love to know how the Gift This feature on the App Store is working out for Apple. I&rsquo;m sure it&rsquo;s doing better than my attempt at it, but I&rsquo;m going to bet it&rsquo;s still a very small percentage compared to regular sales.</p>
<p>Here comes the important question: Why was it a failure? Do people don&rsquo;t like to gift? Was it presented badly? Did most people not know it existed?</p>
<p>There&rsquo;s no way to know for sure, but my current guess is that <strong>people don&rsquo;t like to gift something they don&rsquo;t already own</strong>. Psychologically, there are several too many steps involved: Oh, I want to gift something, look for it in the store, purchase it, and send the email. Not a very fulfilling experience.</p>
<p>On the other hand, gifting something you already own is much more appealing. You have it in front of you, you&rsquo;re proud of it and it looks great. You tap on a button and send it to someone. That is a lot more satisfying. So in the future I&rsquo;ll take that approach and allow people to gift things they already own, even if they had to previously pay for it in some way.</p>
<p>What do you think? Do you have a better theory? How could it have been improved?</p>
<p><em>This post is part of <a href="http://idevblogaday.com/">iDevBlogADay</a>, a group of indie iPhone development blogs featuring two posts per day. You can keep up with iDevBlogADay through the <a href="http://idevblogaday.com/">web site</a>, <a href="http://feeds.feedburner.com/idevblogaday">RSS feed</a>, or <a href="http://twitter.com/#search?q=%23idevblogaday">Twitter</a>.</em></p>
]]></content:encoded></item><item><title>Life In The Top 100 And The Google App Engine</title><link>https://gamesfromwithin.com/life-in-the-top-100-and-the-google-app-engine/</link><pubDate>Thu, 07 Oct 2010 00:00:00 +0000</pubDate><guid>https://gamesfromwithin.com/life-in-the-top-100-and-the-google-app-engine/</guid><description>&lt;p&gt;A few weeks ago I wrote about &lt;a href="https://gamesfromwithin.com/google-app-engine-as-back-end-for-iphone-apps/"&gt;using the Google App Engine as a back end for Flower Garden&lt;/a&gt;. One of the comments I heard from several people is that the Google App Engine pricing scheme is &amp;ldquo;scary&amp;rdquo; due to its unpredictability. What if your server gets very busy and you find yourself with a huge bill?&lt;/p&gt;
&lt;h3 id="google-app-engine-costs"&gt;Google App Engine Costs&lt;/h3&gt;
&lt;p&gt;At the time I wrote that post, the bandwidth of Flower Garden (and Flower Garden Free) was just under the free bandwidth allowance, so I didn&amp;rsquo;t have to pay anything. However, this last week, after &lt;a href="https://gamesfromwithin.com/communicating-with-players/"&gt;riding the Pocket Frogs rocket&lt;/a&gt;, Flower Garden Free shot up to the #56 overall app in the US. And boy, did that make a difference in server usage!&lt;/p&gt;</description><content:encoded><![CDATA[<p>A few weeks ago I wrote about <a href="/google-app-engine-as-back-end-for-iphone-apps/">using the Google App Engine as a back end for Flower Garden</a>. One of the comments I heard from several people is that the Google App Engine pricing scheme is &ldquo;scary&rdquo; due to its unpredictability. What if your server gets very busy and you find yourself with a huge bill?</p>
<h3 id="google-app-engine-costs">Google App Engine Costs</h3>
<p>At the time I wrote that post, the bandwidth of Flower Garden (and Flower Garden Free) was just under the free bandwidth allowance, so I didn&rsquo;t have to pay anything. However, this last week, after <a href="/communicating-with-players/">riding the Pocket Frogs rocket</a>, Flower Garden Free shot up to the #56 overall app in the US. And boy, did that make a difference in server usage!</p>
<p><img alt="serverload.jpg" loading="lazy" src="/life-in-the-top-100-and-the-google-app-engine/images/serverload.jpg"></p>
<p>That screenshot shows the Google App Engine dashboard with the number of requests per second for a 4 day period. Can you guess when the Pocket Frogs cross-promotion started? It went from an average of 1.5 requests per second, to a peak of about 16. That&rsquo;s a factor of 10 right there.</p>
<p>Let&rsquo;s see what that means in terms of cost. With the Google App Engine, you get charged for different resources you consume: CPU usage, incoming bandwidth, outgoing bandwidth, data storage, and recipients emailed. Of those, the only one that Flower Garden makes any dent on is outgoing bandwidth (mostly the HTML pages and images in the Flower Shop).</p>
<p>For each of those resources, you get a free amount every day. In the case of outgoing bandwidth, we get 1GB before we have to start paying anything. Afterwards, it&rsquo;s $0.12 per GB. The peak day for Flower Garden Free, when it was all the way at #56, it consumed 7.8 GB. Now that it&rsquo;s back down, it&rsquo;s using up at around 2-3 GB of outgoing data every day.</p>
<p>That means, that the busiest day I was charged $0.82 in bandwidth, but the profits for that day were over $1500! I can only hope for days just as busy!</p>
<p><img alt="charges.png" loading="lazy" src="/life-in-the-top-100-and-the-google-app-engine/images/charges.png"></p>
<p>As a reference, these are my Google App Engine charges for the busy week during the promotion. $3.28 for the week? Bring it on! :-)</p>
<h3 id="minimizing-bandwidth">Minimizing Bandwidth</h3>
<p>When I first saw the first day&rsquo;s bandwidth, I was pretty surprised it was taking up that much. I hadn&rsquo;t tried to minimize it first, but 8 GB seemed like a significant amount.</p>
<p>The first thing I did was to forward any requests to the <a href="http://st-flowershop.appspot.com/moregames/index.html">&ldquo;More Games&rdquo;</a> and &ldquo;News&rdquo; section back to the Dreamhost account. After all, if that server goes down, it doesn&rsquo;t really matter, and they can take up significant bandwidth with all the images.</p>
<p>To forward something, I couldn&rsquo;t just do it from the configuration file. Instead, I set a handler for the moregames directory like this:</p>
<pre tabindex="0"><code>- url: /moregames/.*
  script: redirect.py
</code></pre><p>And the redirect script is very simple:</p>
<pre tabindex="0"><code>import os
import sys
import logging
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

class RedirectMoreGames(webapp.RequestHandler):
	def get(self, params):
		url = &#34;http://flowers.snappytouch.com/moregames/Snappy_Touch_More_Games/More_Games.html&#34;
		self.redirect(url, permanent=True)
	
application = webapp.WSGIApplication(
							[(r&#39;/(.*)&#39;, RedirectMoreGames),
							 ],
							debug=True)

def main():
	run_wsgi_app(application)

if __name__ == &#34;__main__&#34;:
	main()
</code></pre><p>Another thing you can do is to turn on <a href="http://code.google.com/appengine/docs/python/config/appconfig.html#Static_File_Handlers">explicit caching of files in the app.yaml</a> file for your Google App Engine app. I don&rsquo;t know how much that helps with data requested from within an iPhone app, but it can&rsquo;t hurt.</p>
<p>Finally, I made some changes to Flower Garden. I never had bandwidth minimization in mind, so for example, I was happily requesting updated news and other data at the beginning of every session. I wised up a bit and now it only requests that data at most once every few hours or days.</p>
<p>In case you&rsquo;re ever getting close to using up your quotas, I learned that you can <a href="http://code.google.com/appengine/docs/quotas.html">query them at runtime</a>. I haven&rsquo;t done anything about it yet, but I suppose I could start forwarding image fetches to a backup server whenever I get close to the limit. But for that, I&rsquo;ll have to sell many more units of Flower Garden!</p>
<h3 id="google-app-engine-shortcomings">Google App Engine Shortcomings</h3>
<p>Overall, I&rsquo;m very happy with the Google App Engine. But it&rsquo;s not all a bed of roses over here. I think the Google App Engine excels at scaling under heavy load, but surprisingly, it doesn&rsquo;t have anything close to 100% uptime. I&rsquo;m going to say it probably doesn&rsquo;t even have 95% uptime! With such a massive system and all the redundancy underneath, I&rsquo;m surprised they can&rsquo;t have better uptime. Supposedly <a href="http://code.google.com/status/appengine">their status page</a> makes you think everything is perfect, but it&rsquo;s really far from it.</p>
<p>Apart from downtime, people are also reporting <a href="http://groups.google.com/group/google-appengine/browse_frm/thread/f8dd1f332ab32909#">severe latency issues sometimes</a>, and I&rsquo;ve seen some errors like that in my log every so often. Chalk it up to being a beta I suppose. I imagine it&rsquo;s only going to get better with time.</p>
<p>I would still use the Google App Engine for any new game I&rsquo;ll release in the future, whether it has big or small backend needs. If nothing else, the ease of development and testing beats every alternative for me.</p>
<p><em>This post is part of <a href="http://idevblogaday.com/">iDevBlogADay</a>, a group of indie iPhone development blogs featuring two posts per day. You can keep up with iDevBlogADay through the <a href="http://idevblogaday.com/">web site</a>, <a href="http://feeds.feedburner.com/idevblogaday">RSS feed</a>, or <a href="http://twitter.com/#search?q=%23idevblogaday">Twitter</a>.</em></p>
]]></content:encoded></item><item><title>Communicating With Players</title><link>https://gamesfromwithin.com/communicating-with-players/</link><pubDate>Thu, 30 Sep 2010 00:00:00 +0000</pubDate><guid>https://gamesfromwithin.com/communicating-with-players/</guid><description>&lt;p&gt;By now every iOS developer knows that making a great game and putting it on the App Store is only part of the work. In order to get significant sales, it needs to be noticed. You need to spend a significant amount of time in marketing and PR, making sure that blogs cover it, magazines review it, or at least jump-starting it with a group of devoted and vocal forum fans.&lt;/p&gt;</description><content:encoded><![CDATA[<p>By now every iOS developer knows that making a great game and putting it on the App Store is only part of the work. In order to get significant sales, it needs to be noticed. You need to spend a significant amount of time in marketing and PR, making sure that blogs cover it, magazines review it, or at least jump-starting it with a group of devoted and vocal forum fans.</p>
<p>Most often, the advice stops there. So you get your initial sales spike and then sales go way down. What do you do then? Usually, developers release new features and updates. That&rsquo;s great, but how do you get people to notice it. You need to establish some form of communication with your players.</p>
<h3 id="update-messages">Update Messages</h3>
<p>The simplest form of communication is through the &ldquo;What&rsquo;s new&rdquo; section in the update. You can use that section not just to list what features you added and what bugs you fixed, but also to let your players know about other things: plans for the future, other games to try, or even the URL for your Facebook group.</p>
<p>Credit goes to <a href="http://twitter.com/limasky">Igor</a> for bringing up this idea and pointing out the URLs are even clickable in this field (but they aren&rsquo;t in the app description).</p>
<p>Of course, if you&rsquo;re like me and you update your apps only once in a while, this technique isn&rsquo;t as effective. Right now my iPhone tells me I have 67 new updates available. I&rsquo;m clearly not going to be reading through the release notes of each one.</p>
<h3 id="in-game-news">In-Game News</h3>
<p><img alt="fg_promo.jpg" loading="lazy" src="/communicating-with-players/images/fg_promo.jpg">A more direct way of reaching out to your players is to have some sort of in-game news system. At any point you can update a file in your web server with any news, and it is displayed in the game. It can be implemented in many different ways depending on &ldquo;on your face&rdquo; you want to be about it: a pop up that comes up when the user runs the game, a ticker that runs constantly across the bottom of the screen, or, what I did for Flower Garden, a news icon with a badge indicating how many unread items there are, that brings up the news page when you tap it.</p>
<p>Make sure players are able to click on URLs in your news messages so you can direct them to different web pages easily. More on that on a bit.</p>
<h3 id="emails">Emails</h3>
<p>Update messages are only good for players who update their apps (ahem, ahem), and in-game news for active players who&rsquo;re currently launching your apps. For maximum effect, you can send an email newsletter and that way you can also reach users who played the game at some point in the past, but aren&rsquo;t currently playing it now. They&rsquo;re the ones probably most interested in new updates and features, and chances are you can rekindle their interest in the game.</p>
<p>To do this, you should encourage users to register for your mailing list, or collect their emails with their consent in some other way. This was a technique I started using back in December of last year <a href="/making-a-living-barely-on-the-iphone-app-store/">with great success</a>.</p>
<p>I&rsquo;m currently using <a href="http://www.yourmailinglistprovider.com/">Your Mailing List Provider</a> as a means to delivering thousands and thousands of emails <a href="#1">[1]</a>. By the way, <a href="http://ymlp.com/xgemmyyugmgj">don&rsquo;t miss a chance to join the Flower Garden mailing list</a> :-)</p>
<h3 id="facebook">Facebook</h3>
<p>Similar to the mailing list approach, <a href="http://www.facebook.com/iphoneflowergarden">Facebook groups</a> can be a very effective form of communication. An additional benefit is that friends of your players might see them participating in the page and might make them try out your game.</p>
<h3 id="case-study-pocket-frogs-cross-promotion">Case Study: Pocket Frogs Cross-Promotion</h3>
<p>All that is fine in theory. How does it work in practice? I have been using all four forms of communication for a while, and I&rsquo;m definitely seeing good bumps of sales and downloads with each update and each major communication.</p>
<p>Last week, <a href="http://twitter.com/eeen">Ian</a> and <a href="http://twitter.com/NimbleDave">Dave</a> from <a href="http://nimblebit.com/">Nimblebit</a> and I, decided to set up a cross promotion between Pocket Frogs and Flower Garden.</p>
<p><img alt="pf_promo.jpg" loading="lazy" src="/communicating-with-players/images/pf_promo.jpg"></p>
<p>I updated the in-game news and send out an email newsletter coinciding with the latest Flower Garden update telling the players that if they downloaded Pocket Frogs from within Flower Garden, they would be awarded 5 doses of fertilizer. Nimblebit awarded players a flower if they downloaded Flower Garden Free from within Pocket Frogs.</p>
<p>When you have over a million downloads in a week like Pocket Frog did, that kind of player communication is the equivalent of a nuclear cannon. The effects of the cross-promotion were obvious the instant the news went live:</p>
<p><img alt="fgf_chart.png" loading="lazy" src="/communicating-with-players/images/fgf_chart.png"></p>
<p>As you can see, Flower Garden Free made it all the way to the <a href="http://www.topappcharts.com/327466677/app-details-flower-garden-free-grow-flowers-and-send-bouquets.php">number 56 in the iPhone Top Apps chart</a> in the US! The effect even <a href="http://www.topappcharts.com/311265471/app-details-flower-garden-grow-flowers-and-send-bouquets.php">spread to the paid version of Flower Garden</a>:</p>
<p><img alt="fg_charts.png" loading="lazy" src="/communicating-with-players/images/fg_charts.png"></p>
<p>Pocket Frogs at the time was hovering at around #9 on the charts, so it was difficult to have much of an impact on that position without major numbers, but we suspect it might have hovered there a little longer because of the extra downloads from Flower Garden.</p>
<p>Here is what the downloads for Flower Garden Free looked like for the last month. The Pocket Frogs cross-promotion is quite noticeable:</p>
<p><img alt="fg_downloads.png" loading="lazy" src="/communicating-with-players/images/fg_downloads.png"></p>
<p>All those downloads also translated into in-app sales through the Flower Shop. Here are the revenues for that time period:</p>
<p><img alt="fg_revenue.png" loading="lazy" src="/communicating-with-players/images/fg_revenue.png"></p>
<p>One consequence I wasn&rsquo;t expecting, but in retrospect I&rsquo;m not that surprised about, is that the ratings for Flower Garden Free dropped by a whole star (from 4 to 3), with a large percentage of 1-star reviews. That&rsquo;s because a lot of people who wouldn&rsquo;t have downloaded Flower Garden otherwise did it anyway, didn&rsquo;t like it, and deleted it right away.</p>
<p>To wrap things up on a better note, there was yet another side effect of the cross promotion. The Pocket Frogs link was using my LinkShare referral code. Sending all those users to the App Store to download a free game link resulted in about $200 in referral profit for the week.</p>
<h3 id="conclusion">Conclusion</h3>
<p>Communicating with your players is more than just profitable: It&rsquo;s crucial to the sustained success of your games. Make sure you try to engage with them in every way you can, keep them up to date with developments in your game, and don&rsquo;t hesitate to run the occasional cross-promotion, especially with other games that are a good match for your target audience.</p>
<p>[1] If you <a href="http://ymlp.com/psignup_promo">decide to use them</a> and wouldn&rsquo;t mind using my referral code (WQHVUF), I can get a small percentage back.</p>
<p><em>This post is part of <a href="http://idevblogaday.com/">iDevBlogADay</a>, a group of indie iPhone development blogs featuring two posts per day. You can keep up with iDevBlogADay through the <a href="http://idevblogaday.com/">web site</a>, <a href="http://feeds.feedburner.com/idevblogaday">RSS feed</a>, or <a href="http://twitter.com/#search?q=%23idevblogaday">Twitter</a>.</em></p>
]]></content:encoded></item><item><title>Customizable Color Sections With OpenGL ES 1.1</title><link>https://gamesfromwithin.com/customizable-color-sections-with-opengl-es-1-1/</link><pubDate>Thu, 19 Aug 2010 00:00:00 +0000</pubDate><guid>https://gamesfromwithin.com/customizable-color-sections-with-opengl-es-1-1/</guid><description>&lt;p&gt;One of the items in my ever-growing list of things to write about, is the rendering techniques I used in Flower Garden. In the end, it would make for a post with lots of pretty pictures, but there&amp;rsquo;s nothing particularly ground-breaking. After all, it&amp;rsquo;s all limited to OpenGL ES 1.1 on the iPhone, which means only two texture units and a two-stage texture combiner. As a result, more interesting ideas keep bubbling up to the top of the list and the poor rendering idea keeps getting passed over.&lt;/p&gt;</description><content:encoded><![CDATA[<p>One of the items in my ever-growing list of things to write about, is the rendering techniques I used in Flower Garden. In the end, it would make for a post with lots of pretty pictures, but there&rsquo;s nothing particularly ground-breaking. After all, it&rsquo;s all limited to OpenGL ES 1.1 on the iPhone, which means only two texture units and a two-stage texture combiner. As a result, more interesting ideas keep bubbling up to the top of the list and the poor rendering idea keeps getting passed over.</p>
<p>Every so often, something happens that bumps up the priority of one of the items in my list. Maybe it&rsquo;s another related blog post, or a game coming out with something relevant to what I wanted to write about. In this case it was <a href="http://twitter.com/madgarden/status/20999821267">a tweet from Paul Pridham</a> <a href="#1">[1]</a>:</p>
<p><a href="http://twitter.com/madgarden/status/20999821267"><img alt="tweet.png" loading="lazy" src="/customizable-color-sections-with-opengl-es-1-1/images/tweet.png"></a></p>
<p>Customizing colors in a sprite or texture is very frequent in games, from changing player characters into blue and red teams, to creating color variations of an armor piece, to letting the player pick the exact shade for their pet&rsquo;s fur color. Or, in the case of Flower Garden, to change the colors of the petals on the fly.</p>
<p>There are two requirements for this:</p>
<ul>
<li>We want to change colors dynamically.</li>
<li>We only want to affect certain areas of the original texture.</li>
</ul>
<p>That rules out creating texture variations ahead of time, although that might be a valid approach sometimes if you have lots of art resources, don&rsquo;t mind increasing the download size, and you have a fixed number of variation to deal with. It also rules out modulating/blending the texture by a particular color because it would tint all the texture, and we want to limit the effect to particular areas (leave the player&rsquo;s arms their normal color, but change their shirt color).</p>
<p>This is one of those funny cases that it was a lot easier to do many years ago, when we used palletized color modes. You could set all the custom color areas to a particular palette entry, and then update that entry on the fly. Ah, all the <a href="http://ahefner.livejournal.com/11670.html">awesome tricks</a> palettes opened up the door to! I still miss them to this day.</p>
<p><img alt="color.jpg" loading="lazy" src="/customizable-color-sections-with-opengl-es-1-1/images/color.jpg">In modern hardware it&rsquo;s also really easy to do with a shader, but Paul wanted to use it across any iPhone device, and the majority of them are still stuck on OpenGL ES 1.1, so fixed-function pipeline it is.</p>
<p>The simplest approach would be to just render the model twice: First pass renders the texture, and second pass renders the custom color bits (you can render them with a white texture modulated by the global color to get the right color). The main drawbacks are that you&rsquo;re doubling the number of draw calls, and, with 3D objects, it gets a bit tricker because the second pass needs to use the glDepthFunc(GL_EQUAL) depth comparison function.</p>
<p>The better way to do this is using the <a href="http://www.opengl.org/wiki/Texture_Combiners">texture combiners</a>. Texture combiners allow us to perform a limited number of operations to control the final look of a pixel. We can add two textures, or multiply them, or even do a few <a href="http://www.khronos.org/opengles/sdk/1.1/docs/man/glTexEnv.xml">more complex operations</a>. The true power of the combiners is that they can be chained together, so the output from one feeds into the input of another, allowing us to create much more complex operations.</p>
<p>The iPhone 3G is limited two two texture combiner units <a href="#2">[2]</a>, but even two combiners are good to create a good range of effects.</p>
<p>Let&rsquo;s think about what we want to accomplish. We want to leave some parts of the texture completely alone and display the original pixel value. In some other parts of the texture, we want to replace the pixels there with a custom color. Actually even better, we probably want to multiply those pixels by a custom color. That way we can author the part of the texture that is going to change with grayscale details, and our color adds the tint to it.</p>
<p>Let&rsquo;s express it mathematically. Let&rsquo;s make a function M that is 1 for every pixel we want to color, and 0 for the ones where the original texture is supposed to be displayed. Our desired color is c and the texture it t. In that case, the final pixel color (p) is:</p>
<p>p = M*(c*t) + (1 - M)*t</p>
<p><img alt="texture.jpg" loading="lazy" src="/customizable-color-sections-with-opengl-es-1-1/images/texture.jpg"><img alt="mask.jpg" loading="lazy" src="/customizable-color-sections-with-opengl-es-1-1/images/mask.jpg"></p>
<p>We could express that with two combiners: The first one is a modulate (multiply) operation with c and t, and the second one an interpolation operation between the result of the previous combiner and the original texture, based on the function M.</p>
<p>Obviously M is just a mask texture. We can paint it white where we want to color the texture, and black elsewhere. We could even use the alpha channel of the original texture, but there&rsquo;s one big thing to watch out for: If you have your texture as a png and process it through the default iPhone resource operations, the image will be premultiplied for you (whether you want it or not), so your color information will be set to zero everywhere that the alpha channel is zero. Oops. You&rsquo;ll probably want to use the alpha channel to store transparency anyway, so we&rsquo;ll keep the mask separate. If not, make sure you encode the image yourself (as raw or PVRT formats) so it&rsquo;s not premultiplied ahead of time.</p>
<p>Are we ready transfer that formula to the texture combiners? Not quite. Apparently (and this was just trial and error, I haven&rsquo;t seen it documented), the texture assigned to a combiner can only be the one at that stage. If you look at the second combiner, we would need to have the first texture as one of the parameters, in addition to the mask.</p>
<p>So instead, we can reorganize the function above like this:</p>
<p>p = c*(M*t) + (t - M*t)</p>
<p>What did we gain by that? The color is what&rsquo;s going to change dynamically, but the mask and the texture always stay the same. We could precompute the M*t term by simply multiplying the texture and the mask. We can call that new term A. We can do the same thing with the (t - M*t) term, which just means turning black all the pixels in the texture where mask will go. That one will be B. The easiest way to &ldquo;precompute&rdquo; those values is just doing it in Photoshop and exporting it as a new png.</p>
<p><img alt="A.jpg" loading="lazy" src="/customizable-color-sections-with-opengl-es-1-1/images/A.jpg"><img alt="B.jpg" loading="lazy" src="/customizable-color-sections-with-opengl-es-1-1/images/B.jpg"></p>
<p>Our new formula is now:</p>
<p>p = c*A + B</p>
<p>Nice and simple! Now we can really add that to the texture combiners like this:</p>
<pre tabindex="0"><code>// c
glColor4f(m_customColor.r, m_customColor.g, m_customColor.b, 1);

glActiveTexture(GL_TEXTURE0);
// A = M*t (precomputed)
glBindTexture(GL_TEXTURE_2D, m_maskHandle);
glEnable(GL_TEXTURE_2D);
// c*A
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

glActiveTexture(GL_TEXTURE1);
// B = t - M*t (precomputed)
glBindTexture(GL_TEXTURE_2D, m_textureHandle);
glEnable(GL_TEXTURE_2D);

// c*A + B
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
</code></pre><p>One more thing to watch out for: Because we&rsquo;re using two textures, you need to have two sets of texture coordinates. In this case, we want them to be the same, so we can just point them to the same set of data:</p>
<pre tabindex="0"><code>glClientActiveTexture(GL_TEXTURE0);
glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), &amp;vertices[0].u);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glClientActiveTexture(GL_TEXTURE1);
glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), &amp;vertices[0].u);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
</code></pre><p>That&rsquo;s it! You can see the results in the included project and play with the register combiners to achieve different operations.</p>
<p>At this point I was going to describe the texture combiner setup I use in Flower Garden to render the petals, but this post ended up taking longer than I had hoped for (I&rsquo;m trying to shoot for an hour per post, but this has taken me already two hours between the code and the the post itself), so I&rsquo;ll save that for another time.</p>
<ul>
<li><a href="/wp-content/uploads/2010/08/CustomColor.zip" title="CustomColor.zip">Demo source code</a>. Released under the MIT license.</li>
</ul>
<p>[1] Paul developed <a href="http://itunes.apple.com/us/app/sword-of-fargoal/id343242870?mt=8">Sword of Fargoal</a>, by far my favorite iPhone RPG. [2] The 3GS allows up to eight I believe.</p>
<p><em>This post is part of <a href="http://idevblogaday.com/">iDevBlogADay</a>, a group of indie iPhone development blogs featuring two posts per day. You can keep up with iDevBlogADay through the <a href="http://idevblogaday.com/">web site</a>, <a href="http://feeds.feedburner.com/idevblogaday">RSS feed</a>, or <a href="http://twitter.com/#search?q=%23idevblogaday">Twitter</a>.</em></p>
]]></content:encoded></item><item><title>IAP Bundles: More Than Just Good Deals</title><link>https://gamesfromwithin.com/iap-bundles-more-than-just-good-deals/</link><pubDate>Thu, 29 Jul 2010 00:00:00 +0000</pubDate><guid>https://gamesfromwithin.com/iap-bundles-more-than-just-good-deals/</guid><description>&lt;p&gt;&lt;img alt="fg_bundles.jpg" loading="lazy" src="https://gamesfromwithin.com/iap-bundles-more-than-just-good-deals/images/fg_bundles.jpg"&gt;In-game point bundles are nothing new. Even before the time of in-app purchases, &lt;a href="http://www.zynga.com/"&gt;Zynga&lt;/a&gt; was famous for releasing &lt;a href="http://itunes.apple.com/us/app/mafia-wars-170-reward-points/id311944014?mt=8"&gt;&amp;ldquo;points&amp;rdquo; apps&lt;/a&gt; to increase your game reputation or other stats. The fact that they released not just one way of getting points, but many different apps at different price points, was something I dismissed as a marketing tactic to try to get noticed on the charts.&lt;/p&gt;
&lt;p&gt;Fast-forward to now, and as more companies are jumping into the bandwagon of &lt;a href="http://itunes.apple.com/us/app/we-rule/id339274852?mt=8"&gt;games that need &amp;ldquo;points&amp;rdquo; to make progress&lt;/a&gt;, we&amp;rsquo;re still bundles. Again, I chucked that up to legacy reasons and doing what worked with the standalone apps.&lt;/p&gt;</description><content:encoded><![CDATA[<p><img alt="fg_bundles.jpg" loading="lazy" src="/iap-bundles-more-than-just-good-deals/images/fg_bundles.jpg">In-game point bundles are nothing new. Even before the time of in-app purchases, <a href="http://www.zynga.com/">Zynga</a> was famous for releasing <a href="http://itunes.apple.com/us/app/mafia-wars-170-reward-points/id311944014?mt=8">&ldquo;points&rdquo; apps</a> to increase your game reputation or other stats. The fact that they released not just one way of getting points, but many different apps at different price points, was something I dismissed as a marketing tactic to try to get noticed on the charts.</p>
<p>Fast-forward to now, and as more companies are jumping into the bandwagon of <a href="http://itunes.apple.com/us/app/we-rule/id339274852?mt=8">games that need &ldquo;points&rdquo; to make progress</a>, we&rsquo;re still bundles. Again, I chucked that up to legacy reasons and doing what worked with the standalone apps.</p>
<h3 id="discovering-bundles">Discovering Bundles</h3>
<p>It was at the last <a href="http://www.360idev.com/">360iDev in San Jose</a>, that <a href="http://twitter.com/markjnet">Mark Johnson</a> said something that really stuck with me. I can still hear him say it with his fine British accent: &ldquo;I think we might be underestimating how much people are willing to pay for in-app purchases&rdquo;. Really?</p>
<p>As soon as I had a chance, I looked at the best-selling IAPs for some popular games. The screenshots below were taken today, not back when I looked at them, but the results are very much the same. I let you guess which games these IAPs came from.</p>
<p><img alt="werule.png" loading="lazy" src="/iap-bundles-more-than-just-good-deals/images/werule.png"><img alt="wefarm.png" loading="lazy" src="/iap-bundles-more-than-just-good-deals/images/wefarm.png"><img alt="castlecraft.png" loading="lazy" src="/iap-bundles-more-than-just-good-deals/images/castlecraft.png"><img alt="farmville.png" loading="lazy" src="/iap-bundles-more-than-just-good-deals/images/farmville.png"></p>
<p>I was very surprised with what I saw. The top-selling IAP was never a $0.99 one, and there were bundles of $49.99 or higher towards the top! That was crazy! I was indeed underestimating what players are willing to buy by only offering a measly $0.99 fertilizer bottle in Flower Garden!</p>
<h3 id="bundles-in-flower-garden">Bundles In Flower Garden</h3>
<p>As part of the next Flower Garden update, I decided to run a little experiment and add two more fertilizer options: A $2.99 one and a $5.99 one, each of them giving you a slightly better deal on fertilizer (20, 70, and 150 doses). That was still nothing compared to the price tags I was seeing in those other games, but I didn&rsquo;t want to alienate users by slapping some ridiculously high bundle prices.</p>
<p>The results?</p>
<p>The most popular item by number of sales was still the single fertilizer bottle for $0.99. But a lot of people took advantage of the the other two bundles as well. This is how fertilizer sales for Flower Garden Free have been for the last two months:</p>
<p><img alt="fertilizer_sales.png" loading="lazy" src="/iap-bundles-more-than-just-good-deals/images/fertilizer_sales.png"></p>
<p>But now, let&rsquo;s look at that same period by plotting revenue (again, only Flower Garden Free, the full version is very similar but it wasn&rsquo;t easy to combine the two to display them here):</p>
<p><img alt="fertilizer_revenue.png" loading="lazy" src="/iap-bundles-more-than-just-good-deals/images/fertilizer_revenue.png"></p>
<p>Now the two bundles are a lot closer to the single bottle, especially the larger, $5.99 bundle.</p>
<h3 id="more-than-meets-the-eye">More Than Meets The Eye</h3>
<p>In the end, were bundles effective, or are people buying the same amount of fertilizer and leaving less money in the process? Unfortunately I can&rsquo;t answer that question from a pure data point of view. Looking at fertilizer sales before and after I introduced the bundles is no good because the number of users increased dramatically at each update. I can&rsquo;t even normalize them by the number of sales, it would have to be by the number of daily users, and unfortunately that&rsquo;s not a statistic that I&rsquo;m tracking.</p>
<p>However, I think we can argue two really good points about why bundles are great.</p>
<h4 id="1-more-choice">1. More choice</h4>
<p>Having different levels of bundles give players more choice on how they want to purchase something. From what I&rsquo;ve read about buyer psychology, people love having choices when buying something (just don&rsquo;t give them <a href="http://www.columbia.edu/~ss957/whenchoice.html">too many choices</a>!). They are more involved in the buying process, they evaluate it, and they feel better about the decision they eventually make. So that seems to indicate that more people might buy fertilizer if there are a few bundle options than if there&rsquo;s only one.</p>
<h4 id="2-commitment">2. Commitment</h4>
<p>This is the biggie. Whenever a user purchases a $5.99 bundle (or a $49.99 one!), they became more committed to your game. You can also guarantee they will come back again to get their money&rsquo;s worth from that purchase. Even if they had the intention of coming back to your game without the purchase, having spent that money is a nice reminder to do so. And having people come back to your game is what this is all about: They will explore more of the game, get hooked more, make more in-app purchases, show it to more of their friends, and send more bouquets to their family.</p>
<p>I have no doubt that I&rsquo;ll be using bundles in the future. Players get a good deal, and you get committed players. It&rsquo;s a win-win situation.</p>
<p><em>This post is part of <a href="http://idevblogaday.com/">iDevBlogADay</a>, a group of indie iPhone development blogs featuring two posts per day. You can keep up with iDevBlogADay through the <a href="http://idevblogaday.com/">web site</a>, <a href="http://feeds.feedburner.com/idevblogaday">RSS feed</a>, or <a href="http://twitter.com/#search?q=%23idevblogaday">Twitter</a>.</em></p>
]]></content:encoded></item><item><title>Remote Game Editing</title><link>https://gamesfromwithin.com/remote-game-editing/</link><pubDate>Thu, 22 Jul 2010 00:00:00 +0000</pubDate><guid>https://gamesfromwithin.com/remote-game-editing/</guid><description>&lt;p&gt;I&amp;rsquo;ve long been a fan of minimal game runtimes. Anything that can be done offline or in a separate tool, should be out of the runtime. That leaves the game architecture and code very lean and &lt;a href="https://gamesfromwithin.com/simple-is-beautiful/"&gt;simple&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One of the things you potentially give up by keeping the game runtime to a minimum is an &lt;a href="http://www.unrealtechnology.com/features.php?ref=editor"&gt;editor built in the game itself&lt;/a&gt;. But that&amp;rsquo;s one of those things that sounds a lot better than it really is. From a technical point of view, having an editor in the game usually complicates the code a huge amount. All of a sudden you need to deal with objects being created and destroyed randomly (instead of through clearly defined events in the game), and you have to deal with all sorts of crazy inputs and configurations.&lt;/p&gt;</description><content:encoded><![CDATA[<p>I&rsquo;ve long been a fan of minimal game runtimes. Anything that can be done offline or in a separate tool, should be out of the runtime. That leaves the game architecture and code very lean and <a href="/simple-is-beautiful/">simple</a>.</p>
<p>One of the things you potentially give up by keeping the game runtime to a minimum is an <a href="http://www.unrealtechnology.com/features.php?ref=editor">editor built in the game itself</a>. But that&rsquo;s one of those things that sounds a lot better than it really is. From a technical point of view, having an editor in the game usually complicates the code a huge amount. All of a sudden you need to deal with objects being created and destroyed randomly (instead of through clearly defined events in the game), and you have to deal with all sorts of crazy inputs and configurations.</p>
<p>The worse part though, is having to implement some sort of GUI editing system in every platform. Creating the GUI to run on top of the game is not easy, requiring that you create custom GUI code or try to use some of the OpenGL/DirectX libraries available. And even then, a complex in-game GUI might not be a big deal on a PC, but wait and try to use that interface on a PS3 or iPhone. After all, making games is already complicated and time-consuming enough to waste more time reinventing the widget wheel.</p>
<p>Remote game editing manages to keep a minimal runtime and allow you to quickly create native GUIs that run on a PC. It&rsquo;s the best of both worlds, and although it&rsquo;s not quite a perfect solution, it&rsquo;s the best approach I know.</p>
<h3 id="debug-server">Debug Server</h3>
<p><a href="http://twitter.com/mysterycoconut">Miguel Ãngel Friginal</a> <a href="http://mysterycoconut.com/blog/2010/07/tweak-away/">already covered the basics of the debug server</a>, so I&rsquo;m not going to get in details there.</p>
<p>The idea is that you run a very simple socket server on the game, listening in a particular port. This server implements the basic <a href="http://www.faqs.org/rfcs/rfc854.html">telnet protocol</a>, which pretty much means that it&rsquo;s a line-based, plain-text communication.</p>
<p>The main difference between my debug server and Miguel&rsquo;s (other than mine is written in cross-platform C/C++ instead of ObjC), is that I&rsquo;m not using Lua to execute commands. Using Lua for that purpose is a pretty great idea, but goes against the philosophy of keeping the runtime as lean and mean as possible.</p>
<p>Instead, I register variables with the server by hand. For each variable, I specify its memory address, it&rsquo;s type, any restrictions (such as minimum and maximum values), and a &ldquo;pretty name&rdquo; to display in the client. Sounds like a lot of work, but it&rsquo;s just one line with the help of a template:</p>
<pre tabindex="0"><code>registry.Add(Tweak(&amp;plantOptions.renderGloss, &#34;render/gloss&#34;, &#34;Render gloss&#34;));
registry.Add(Tweak(&amp;BouquetParams::FovY, &#34;bouquet/fov&#34;, &#34;FOV&#34;, Pi/32, Pi/3))
</code></pre><p>And yes, if I were to implement this today, I would probably get rid of the templates and make it all explicit instead (ah, the follies of youth :-)</p>
<pre tabindex="0"><code>TweakUtils::AddBool(registry, &amp;plantOptions.renderGloss, &#34;render/gloss&#34;, &#34;Render gloss&#34;);
TweakUtils::AddFloat(registry, &amp;BouquetParams::FovY, &#34;bouquet/fov&#34;, &#34;FOV&#34;, Pi/32, Pi/3);
</code></pre><p>The debug server itself responds to three simple commands:</p>
<ul>
<li><strong>list</strong>. Lists all the variables registered in the server.</li>
<li><strong>set varname value</strong>. Sets a value.</li>
<li><strong>print varname</strong>. Gets the value for that variable.</li>
</ul>
<p>For example, whenever the server receives a set command, it parses the value, verifies that it&rsquo;s within the acceptable range, and applies it to the variable at the given memory location.</p>
<h3 id="telnet-clients">Telnet Clients</h3>
<p><img alt="telnet.png" loading="lazy" src="/remote-game-editing/images/telnet.png">Because we used the standard telnet protocol, we can start playing with it right away. Launch the game, telnet into the right port, and you can start typing away.</p>
<p>However, most telnet clients leave much to be desired for this. They all rely on the history and cursor manipulation being handled by the shell they assume you&rsquo;re connected to. Here we aren&rsquo;t connected to much of anything, but I&rsquo;d like to be able to push up arrow and get my last command, and be able to move to the beginning of the line or the previous word like I would do in any text editor. The easiest solution I found for that was to use a telnet client prepared for that kind of thing: A MUD client! Just about any will do, but one that works well for me is <a href="http://www.riverdark.net/atlantis/">Atlantis</a>.</p>
<p>So far, we&rsquo;ve implemented the equivalent of a FPS console, but working remotely. And because the code is fully portable, our game can be in just about any platform and we can always access it from our PC. Not just that, but we can even open multiple simultaneous connections to various development devices if you need to run them all at once.</p>
<h3 id="custom-clients">Custom Clients</h3>
<p>Game parameter tweaking is something that is OK through a text-based console, but really comes into its own when you add a GUI. That&rsquo;s exactly what we did at <a href="/tag/power-of-two/">Power of Two Games</a>. We created a generic GUI tool (based on WinForms since we were on Windows at the time), that would connect to the server, ask for a list of variables, and generate a GUI on the fly to represent those variables. Since we knew type and name of each variable, it was really easy to construct the GUI elements on the fly: A slider with a text field for floats and ints, a checkbox for bools, four text fields for vectors, and even a color picker for variables of the type color.</p>
<p>It worked beautifully, and adjusting different values by moving sliders around was fantastic. We quickly ran into two problems through.</p>
<p>The first one is that we added so many different tweaks to the game, that it quickly became unmanageable to find each one we wanted to tweak. So, in the spirit of keeping things as simple as possible (and pushing the complexity onto the client), we decided that the / symbol in a name would separate group name and variable name. That way we could group all related variables together and make everything usable again.</p>
<p>The second problem was realizing that some variables were changing on the runtime without us knowing it on the client. That created weird situations when moving sliders around. We decided that any time a registed variable changes on the server, it should notify any connected clients. That worked fine, but, as you can imagine, it became prohibitively expensive very quickly. To get around that, we added a fourth command: <strong>monitor varname</strong>. This way clients need to explicitly register themselves to receive notifications whenever a variable changes, and the GUI client only did it for the variables currently displayed on the screen.</p>
<p><img alt="tweaker.png" loading="lazy" src="/remote-game-editing/images/tweaker.png"></p>
<p>During this process, it was extremely useful to be able to display a log console to see what kind of traffic there was going back and forth. It helped me track down a few instances of bugs where changing a variable in the client would update it in the server, sending an update back to the client, which would send it again back to the server, getting stuck in an infinite loop.</p>
<p>You don&rsquo;t need to stop at a totally generic tool like this either. You could create a more custom tool, like a level editor, that still communicates with the runtime through this channel.</p>
<h3 id="flower-garden-example">Flower Garden Example</h3>
<p>For Flower Garden, I knew I was going to need a lot of knobs to tweak all those plant DNA parameters, so I initially looked into more traditional GUI libraries that worked on OpenGL. The sad truth is that they all fell way short, even for development purposes. So I decided to grab what I had at hand: My trusty tweaking system from Power of Two Games.</p>
<p>I&rsquo;m glad I did. It saved a lot of time and scaled pretty well to deal with the hundreds of parameters in an individual flower, as well as the miscellaneous tweaks for the game itself (rendering settings, infinite fertilizer, fast-forwarding time, etc).</p>
<p>Unfortunately, there was one very annoying thing: The tweaker GUI was written in .Net. Sure, it would take me a couple of days to re-write it in Cocoa (faster if I actually knew any Cocoa), but as an indie, I never feel I can take two days to do something tangential like that. So instead, I just launched it from VMWare Fusion running Windows XP and&hellip; it worked. Amazingly enough, I&rsquo;m able to connect from the tweaker running in VMWare Fusion to the iPhone running in the simulator. Kind of mind boggling when you stop and think about it. It also connects directly to the iPhone hardware without a problem.</p>
<p>VMWare Fusion uses up a lot of memory, so I briefly looked into running the tweaker client in Mono. Unfortunately Mono for the Mac didn&rsquo;t seem mature enough to handle it, and not only was the rendering of the GUI not refreshing correctly, but events were triggered in a slightly different order than in Windows, causing even more chaos with the variable updates.</p>
<p>Here&rsquo;s a time-lapse video of the creation of a Flower Garden seed from the tweaker:</p>
<h3 id="drawbacks">Drawbacks</h3>
<p>As I mentioned earlier, I love this system and it&rsquo;s better than anything else I&rsquo;ve tried, but it&rsquo;s not without its share of problems.</p>
<p>Tweaking data is great, but once you find that set of values that balances the level to perfection&hellip; then what? You write those numbers down and enter them in code or in the level data file? That gets old fast. Ideally you want a way to automatically write those values back. That&rsquo;s easy if the tool itself is the editor, but if it&rsquo;s just a generic tweaker, it&rsquo;s a bit more difficult.</p>
<p>One thing that helped was adding a Save/Load feature to the tweaker GUI. It would simply write out a large text-based file with all the variables and their current values. Whenever you load one of those, it would attempt to apply those same values to the current registered variables. In the end, I ended up making the Flower Garden offline seed file format match with what the tweaker saved out, so that process went pretty smoothly.</p>
<p>Another problem is if you want lots of real-time (or close to real time) updates from the server. For example, you might want to monitor a bunch of data points and plot them on the client (fps, memory usage, number of collisions per frame, etc). Since those values change every frame, it can quickly overwhelm the simple text channel. For those cases, I created side binary socket channels that can simply send real-time data without any overhead.</p>
<p>Finally, the last drawback is that this tweaking system makes editing variables very easy, but calling functions is not quite as simple. For the most part, I&rsquo;ve learned to live without function calls, but sometimes you really want to do it. You can extend the server to register function pointers and map those to buttons in the client GUI, but that will only work for functions without any parameters. What if you wanted to call any arbitrary function? At that point you might be better off integrating Lua in your server.</p>
<h3 id="future-directions">Future Directions</h3>
<p>This is a topic I&rsquo;ve been interested in for a long time, but the current implementation of the system I&rsquo;m using was written 3-4 years ago. As you all know by now, <a href="/the-always-evolving-coding-style/">my coding style and programming philosophy changes quite a bit over time</a>. If I were to implement a system like this today, I would do it quite differently.</p>
<p>For all I said about keeping the server lean and minimal, it could be even more minimal. Right now the server is receiving text commands, parsing them, validating them, and interpreting them. Instead, I would push all that work on the client, and all the server would receive would be a memory address, and some data to blast at that location. All of that information would be sent in binary (not text) format over a socket channel, so it would be much more efficient too. The only drawback is that we would lose the ability to connect with a simple telnet client, but it would probably be worth it in the long run.</p>
<p><em>This post is part of <a href="http://idevblogaday.com/">iDevBlogADay</a>, a group of indie iPhone development blogs featuring two posts per day. You can keep up with iDevBlogADay through the <a href="http://idevblogaday.com/">web site</a>, <a href="http://feeds.feedburner.com/idevblogaday">RSS feed</a>, or <a href="http://twitter.com/#search?q=%23idevblogaday">Twitter</a>.</em></p>
]]></content:encoded></item><item><title>The Power of Free (aka The Numbers Post #3)</title><link>https://gamesfromwithin.com/the-power-of-free/</link><pubDate>Thu, 08 Jul 2010 00:00:00 +0000</pubDate><guid>https://gamesfromwithin.com/the-power-of-free/</guid><description>&lt;p&gt;It has been two months since &lt;a href="https://gamesfromwithin.com/making-a-living-comfortably-on-the-app-store/"&gt;the last &amp;ldquo;numbers post&amp;rdquo;&lt;/a&gt;. It covered the Valentine&amp;rsquo;s Day promotion, spike in sales, and subsequent settling out at a very nice level. Here&amp;rsquo;s a recap of what things looked like at the beginning of May (revenue was about $1500 per week):&lt;/p&gt;
&lt;p&gt;&lt;img alt="fg_before.png" loading="lazy" src="https://gamesfromwithin.com/the-power-of-free/images/fg_before.png"&gt;&lt;/p&gt;
&lt;h3 id="the-plan"&gt;The Plan&lt;/h3&gt;
&lt;p&gt;Mother&amp;rsquo;s Day happens at the beginning of May (in the US and Canada anyway, I&amp;rsquo;m afraid I was too busy in April and I missed Mother&amp;rsquo;s Day in a lot of European countries). I figured it would be the perfect time to do another push.&lt;/p&gt;</description><content:encoded><![CDATA[<p>It has been two months since <a href="/making-a-living-comfortably-on-the-app-store/">the last &ldquo;numbers post&rdquo;</a>. It covered the Valentine&rsquo;s Day promotion, spike in sales, and subsequent settling out at a very nice level. Here&rsquo;s a recap of what things looked like at the beginning of May (revenue was about $1500 per week):</p>
<p><img alt="fg_before.png" loading="lazy" src="/the-power-of-free/images/fg_before.png"></p>
<h3 id="the-plan">The Plan</h3>
<p>Mother&rsquo;s Day happens at the beginning of May (in the US and Canada anyway, I&rsquo;m afraid I was too busy in April and I missed Mother&rsquo;s Day in a lot of European countries). I figured it would be the perfect time to do another push.</p>
<p>If there&rsquo;s something I learned from past experience, is that the more you manage to concentrate any kind of promotion, the more effective it will be. So in preparation for Mother&rsquo;s Day, I created a new update (with iPad support), a couple of new in-app purchase items (new set of seeds and some fertilizer bundles), and sent out the usual announcement on the <a href="/">Flower Garden mailing list</a>, <a href="http://www.facebook.com/iphoneflowergarden">Facebook page</a>, and <a href="http://twitter.com/SnappyTouch">Twitter</a>.</p>
<p>But in addition to all of that, I tried a new strategy: <a href="/flower-garden-is-free-this-weekend-to-celebrate-mothers-day/">I gave Flower Garden away for free</a>. Yes, completely for free.</p>
<p>The idea sounded really scary at first. After all, I would be giving away my baby for free. Would I lose a lot of money doing that? Would it depreciate the perceived value of Flower Garden? Would it annoy loyal users seeing an app they paid for given away? Fortunately it appears that the answer to those questions was no.</p>
<p>The reason I decided to give Flower Garden away for free was mostly to get it into more people&rsquo;s hands. I was thinking I would lose some money initially, but then more than make up for it when I turned it back to paid because of all the extra users and word of mouth. There is already a free version with a limited number of pots and seeds, but people are hungry to download paid apps for free.</p>
<p>To add extra impact to this price change, I had Flower Garden featured as the free app for Mother&rsquo;s Day weekend in <a href="http://www.freeappcalendar.com/">Free App Calendar</a>. Unlike other free app web sites, the <a href="http://www.twitter.com/freeAppCalendar">folks at Free App Calendar</a> are very developer friendly and are not out to take a cut of your profits or charge outrageous fees. It was an absolute pleasure dealing with them.</p>
<h3 id="mothers-day">Mother&rsquo;s Day</h3>
<p>On Saturday May 8th, a few minutes past midnight the day before Mother&rsquo;s Day, I switched Flower Garden over to free. Now I was committed!</p>
<p>Right away there was a lot of positive reaction around the announcement. Everybody on Twitter and Facebook were responding really well and spreading the word. Major sites like <a href="http://toucharcade.com/2010/05/08/flower-garden-for-iphone-ipad-free-this-weekend/">Touch Arcade</a> and <a href="http://www.148apps.com/news/flower-garden-free-mothers-day/">148Apps</a> covered the Mother&rsquo;s Day promotion and got lots of extra eyeballs on the sale.</p>
<p>After the first day, the data was in: Flower Garden had been downloaded 12,500 times. That was great! As a reference, Flower Garden Free was usually downloaded between 800 and 1,000 times per day, so that was a 10x improvement.</p>
<p>On Sunday, Mother&rsquo;s Day, things got even better. News had time to propagate more, and people were sending bouquets like crazy, so by the end of the day there had been an additional 26,000 downloads. That&rsquo;s exactly what I was hoping for!</p>
<p>As a matter of fact, it was doing so great, that I decided to leave it for free as long as the number of downloads was significantly higher than what the free version was normally getting. After Mother&rsquo;s Day downloads started going down, but they were still pretty strong the following Sunday. Here&rsquo;s what the download numbers looked like for those 9 days:</p>
<p><img alt="fg_week_downloads.png" loading="lazy" src="/the-power-of-free/images/fg_week_downloads.png"></p>
<p>The important question is how much revenue was there during that time? I was giving the app away for free but it had in-app purchases. Would they make up for it? The answer was a resounding yes!</p>
<p><img alt="fg_week_revenue.png" loading="lazy" src="/the-power-of-free/images/fg_week_revenue.png"></p>
<p>Mother&rsquo;s Day went on to become the biggest day in terms of revenue since Flower Garden was launched. Bigger even than Christmas or Valentine&rsquo;s Day! Things started going down after that, but still at a very high level. The little bump towards the end of the week is a combination of the weekend (which always results in more sales), and the <a href="/flower-garden-selected-as-an-apple-staff-favorite-across-europe/">feature of Flower Garden on the App Store across most of Europe</a>.</p>
<p>These numbers took a bit to sink in. It really shows that in-app purchases are definitely tied to the number of downloads. If you manage to give away twice as many copies, you&rsquo;ll probably get close to twice as many in-app purchases. That effect is amplified if you have multiple in-app purchase items available.</p>
<p>It&rsquo;s also interesting to notice that revenue didn&rsquo;t follow the same drop-off curve as downloads. It wasn&rsquo;t nearly as sharp. I suspect two things are going on in there:</p>
<ul>
<li>Some users downloaded Flower Garden during the sale weekend and weren&rsquo;t interested in it at all. Downloading it was a knee-jerk reaction to any app that goes free, so that never translated into an in-app purchase. Users later in the week however, probably downloaded it because they received a bouquet or were interested in it, so they had a much higher likelihood of buying something through the Flower Shop.</li>
<li>Fertilizer. Fertilizer is the only consumable item available for purchase in Flower Garden. Unlike a non-consumable item, the number of sales is not tied to the number of new users, but to the number of current, daily users. The more users launch your app every day, the higher the sales of consumable items. Some of the new users of Flower Garden went on to buy fertilizer later in the week, making revenue higher than you would expect from the download curve.</li>
</ul>
<h3 id="flipping-the-switch">Flipping The Switch</h3>
<p>The number of downloads on Sunday May 16th was slightly over 2,000. At that point I decided that it was close enough to the number of downloads Flower Garden Free was normally getting, so I flipped the switch back to paid. Things were going great, so messing with it was a pretty scary thing to do. Even scarier than it had been setting it free in the first place.</p>
<p>During that week, Flower Garden rose up on the charts. It reached #73 in the top games in the US and was charting very high in all the subcategories and on the iPad charts. As soon as I flipped the switch back to paid, it dropped out of sight from the charts. Fortunately, within a couple of days it came back to its position before that crazy week.</p>
<p>Most importantly, Flower Garden Free, which had dropped quite a bit during that promotion, immediately went back up to the top 100 in the Kids and Family subcategories like before.</p>
<p>As you can expect, as a result of giving it away for free, the ratings on the App Store went down quite a bit. While it was a paid application, the ratings were around 4 stars, but they dropped down to 2.5 stars after that week. It seems people love a free app, but are very quick to criticize it and give it a low rating (especially if it has in-app purchases).</p>
<p>Fortunately bad ratings can be easily fixed with a new update, and some encouragement to users to <a href="/increase-your-app-ratings-on-the-app-store/">leave positive rating on the App Store</a>. Now it&rsquo;s back up to over 4.5 stars.</p>
<h3 id="aftermath">Aftermath</h3>
<p>Now it&rsquo;s two months later and the dust has had a chance to settle down. Apart from the very nice sales spike during the sale, was it worth it? Again, the answer is a definite yes.</p>
<p>Here&rsquo;s the revenue since the start of the promotion:</p>
<p><img alt="fg_two_months.png" loading="lazy" src="/the-power-of-free/images/fg_two_months.png"></p>
<p>As you can see, it quickly went down, but it settled at a reasonably high level. In fact, compare this two-month period (highlighted in blue) with the previous sales:</p>
<p><img alt="fg_after2.png" loading="lazy" src="/the-power-of-free/images/fg_after2.png"></p>
<p>Before the promotion revenue was hovering around $1,500 per week, now it settled down to about $2,400 per week. An average day today is bigger than Christmas day! Very nice change!</p>
<p>I think the reason why it settled at a higher revenue level than before is because it got more exposure during that week. Lots of people sent bouquets, which introduced new users to Flower Garden. It&rsquo;s the viral effect I was hoping for from the start, and although it never reached epidemic proportions, it has been enough to keep Flower Garden alive and well.</p>
<p>Adding iPad support as part of the latest update probably helped too. The iPad market is smaller than the iPhone one, but a lot of early adopters are eager to find good apps for their new toys. The smaller market size also allowed Flower Garden to appear in the iPad charts more easily, increasing exposure that way.</p>
<p>Here&rsquo;s a breakdown of where revenue came from in the last month (I&rsquo;m excluding the period where Flower Garden was free to get a more accurate view):</p>
<p><img alt="sales_breakdown.png" loading="lazy" src="/the-power-of-free/images/sales_breakdown.png"></p>
<p>As you can see, consumable items (fertilizer) account for almost half the revenue. Consumable items are a factor of your current userbase, so getting a large influx of new users can result in a permanent revenue increase instead of just a sales spike. It also shows what a small percentage actual app sales are, which explains why even while Flower Garden was free, revenue was still up.</p>
<h3 id="conclusion">Conclusion</h3>
<p>This was a wild ride again! It was definitely worth doing the promotion and it definitely brought home how powerful free can be. However, I&rsquo;m trying to decide the pricing scheme for my next game, and even though free plus in-app purchases is very tempting, I&rsquo;m not sure it&rsquo;s the way to go.</p>
<p><strong>What do you think? Are new games better off being free with in-app purchases, or can indie games be successful being paid (and still having in-app purchases)?</strong></p>
<p><em>This post is part of <a href="http://idevblogaday.com/">iDevBlogADay</a>, a group of indie iPhone development blogs featuring two posts per day. You can keep up with iDevBlogADay through the <a href="http://idevblogaday.com/">web site</a>, <a href="http://feeds.feedburner.com/idevblogaday">RSS feed</a>, or <a href="http://twitter.com/#search?q=%23idevblogaday">Twitter</a>.</em></p>
]]></content:encoded></item><item><title>Flower Garden Selected As An Apple Staff Favorite Across Europe</title><link>https://gamesfromwithin.com/flower-garden-selected-as-an-apple-staff-favorite-across-europe/</link><pubDate>Fri, 14 May 2010 00:00:00 +0000</pubDate><guid>https://gamesfromwithin.com/flower-garden-selected-as-an-apple-staff-favorite-across-europe/</guid><description>&lt;p&gt;&lt;img alt="fg_europe.jpg" loading="lazy" src="https://gamesfromwithin.com/flower-garden-selected-as-an-apple-staff-favorite-across-europe/images/fg_europe.jpg"&gt;Right on the heels of the Mother&amp;rsquo;s Day promotion, &lt;a href="http://bit.ly/fg_gfw"&gt;Flower Garden&lt;/a&gt; just got its &lt;a href="https://gamesfromwithin.com/flower-garden-now-an-apple-staff-favorite-on-the-app-store-worldwide/"&gt;second&lt;/a&gt; ever App Store feature. This time it was selected as a Staff Favorite across most of Europe (UK, Spain, Ireland, Denmark, Finland, Greece, Netherlands, Norway, Portugal, Switzerland, and Sweden!).&lt;/p&gt;
&lt;p&gt;And if you haven&amp;rsquo;t picked up your &lt;strong&gt;free&lt;/strong&gt; copy of Flower Garden, make sure to do it now. It will probably go back to full price after this weekend.&lt;/p&gt;</description><content:encoded><![CDATA[<p><img alt="fg_europe.jpg" loading="lazy" src="/flower-garden-selected-as-an-apple-staff-favorite-across-europe/images/fg_europe.jpg">Right on the heels of the Mother&rsquo;s Day promotion, <a href="http://bit.ly/fg_gfw">Flower Garden</a> just got its <a href="/flower-garden-now-an-apple-staff-favorite-on-the-app-store-worldwide/">second</a> ever App Store feature. This time it was selected as a Staff Favorite across most of Europe (UK, Spain, Ireland, Denmark, Finland, Greece, Netherlands, Norway, Portugal, Switzerland, and Sweden!).</p>
<p>And if you haven&rsquo;t picked up your <strong>free</strong> copy of Flower Garden, make sure to do it now. It will probably go back to full price after this weekend.</p>
<p>Gracias! Obrigado! Grazie! Î£Î±Ï‚ ÎµÏ…Ï‡Î±ÏÎ¹ÏƒÏ„ÏŽ! Tak!</p>
]]></content:encoded></item><item><title>Making A Living (Comfortably) On The App Store (aka The Numbers Post #2)</title><link>https://gamesfromwithin.com/making-a-living-comfortably-on-the-app-store/</link><pubDate>Fri, 14 May 2010 00:00:00 +0000</pubDate><guid>https://gamesfromwithin.com/making-a-living-comfortably-on-the-app-store/</guid><description>&lt;p&gt;A few months ago, I wrote &lt;a href="https://gamesfromwithin.com/making-a-living-barely-on-the-iphone-app-store/"&gt;a post analyzing how Flower Garden had done since it was released&lt;/a&gt;. It was a story with lots of ups and downs, tales of trials and failure, but ending on a positive, optimistic note. It went on to become one of the most read posts in this blog, and the comments were all very encouraging. Clearly, people, and especially other developers, are hungry for this kind of data.&lt;/p&gt;</description><content:encoded><![CDATA[<p>A few months ago, I wrote <a href="/making-a-living-barely-on-the-iphone-app-store/">a post analyzing how Flower Garden had done since it was released</a>. It was a story with lots of ups and downs, tales of trials and failure, but ending on a positive, optimistic note. It went on to become one of the most read posts in this blog, and the comments were all very encouraging. Clearly, people, and especially other developers, are hungry for this kind of data.</p>
<p>So here we go with the second part. How did Flower Garden fare after the new year? Was it just the Christmas purchasing frenzy that had a momentary effect on sales, or was there something more to it?</p>
<h2 id="recap-and-overview">Recap and Overview</h2>
<p>Here&rsquo;s where we left off last time. The unusual part was how profits increased as soon as I added in-app purchases to Flower Garden in early December. It made for a very atypical sales plot.</p>
<p><img alt="Full" loading="lazy" src="/making-a-living-comfortably-on-the-app-store/images/Full.png" title="Flower Garden profit"></p>
<p>And here is how things look now. This plot includes the previous data so it&rsquo;s easier to contrast before and after. The area in blue is the new data since the last post.</p>
<p><img alt="fg_total.png" loading="lazy" src="/making-a-living-comfortably-on-the-app-store/images/fg_total.png"></p>
<p>Just glancing at that chart makes it clear that that the increase around Christmas wasn&rsquo;t a fluke. It actually wasn&rsquo;t even done going up. After all the spikes, and the weekly ups and downs, Flower Garden ended up settling to about $1,500/week. And that, even in California, I would consider it to be a comfortable living. What a different from the $50/day it was making last year!</p>
<p>So what exactly happened there? Let&rsquo;s look at the new data in more detail.</p>
<p><img alt="fg_recent.png" loading="lazy" src="/making-a-living-comfortably-on-the-app-store/images/fg_recent.png"></p>
<p>At a glance, there are three, very different sections.</p>
<h2 id="the-feature">The Feature</h2>
<p>The first one starts with a significant increase in sales (A), and is in large part due to <a href="/flower-garden-now-an-apple-staff-favorite-on-the-app-store-worldwide/">being featured on the App Store worldwide as a Staff Favorite</a>. It&rsquo;s a nice spike, but it&rsquo;s nothing like the x10 spikes other developers have seen with App Store features. That&rsquo;s because the Staff Favorite slot, even though it&rsquo;s a very prestigious one, it does not appear on the iPhone, only on iTunes. I do all my browsing and shopping through iTunes, but apparently I&rsquo;m in the minority, so the effect on sales is greatly reduced.</p>
<p>That spike is also in part due to <a href="/making-a-living-barely-on-the-iphone-app-store/">my last &ldquo;numbers post&rdquo;</a>, which happened right at the same time (not completely accidentally). The page attracted about 15,000 views in a few days, so I&rsquo;m sure a few of them translated in people checking out Flower Garden out of curiosity.</p>
<h2 id="valentines-day">Valentine&rsquo;s Day</h2>
<p>The second spike isn&rsquo;t hard to guess: It&rsquo;s the weekend of February 14th, Valentine&rsquo;s Day. The more things happen at once and the more something is in the public eye, the more of an impact it has. PR people have known that for a long time, and it was really brought home for me back <a href="/making-a-living-barely-on-the-iphone-app-store/">in December</a>.</p>
<p>Fortunately, I managed to make quite a few things happen in the days leading to Valentine&rsquo;s Day weekend:</p>
<ul>
<li>I released an update with couple new in-app purchases: A new set of seeds (Seeds of Love), and a greenhouse garden, for $0.99 each.</li>
<li>I sent out a newsletter to the 25,000 subscribers to <a href="http://www.facebook.com/l.php?u=http%3A%2F%2Fymlp.com%2Fsignup.php%3Fid%3Dgemmyyugmgj&amp;h=cf570">the mailing list</a> announcing the new items.</li>
<li>I put Flower Garden on sale for $0.99 (down from the regular price of $2.99).</li>
<li>Several web sites, <a href="http://toucharcade.com/2010/02/14/valentines-day-picks-for-that-special-iphone-in-your-life/">including TouchArcade</a>, covered the sale and the new update, giving it lots of visibility.</li>
<li>Flower Garden Free was the free app for February 14th on the <a href="http://bit.ly/iPhoneValentine">Valentine&rsquo;s Day Calendar</a>.</li>
</ul>
<p>All of that combined to cause the big spike in profits (B). You really need to look at the first plot to put it in perspective. Two days in around Valentine&rsquo;s Day had higher profit than the initial release spike back in April of last year!</p>
<h2 id="winding-down">Winding Down</h2>
<p>Of course, everything that goes up, must eventually come down. So the weeks following Valentine&rsquo;s Day profits went rapidly down. It was at the very end of April that I started working on <a href="/dr-seuss-lorax-garden-up-the-charts/">Lorax Garden</a>, so for that period of time I wasn&rsquo;t able to do anything related to Flower Garden. For a while sales were dropping quite rapidly, but they eventually flattened out to about $1,500/week (C).</p>
<p>The good thing about having consumable items as in-app purchases (fertilizer in this case), is that profits are related to active user base, not just initial sales. So even though the amount of downloads decreased significantly during this time, the user base had grown a large amount, and with it, the daily profits.</p>
<h2 id="flower-garden-free">Flower Garden Free</h2>
<p>Back in December, there seemed to be a connection between the amount of downloads of the free version of Flower Garden and profits. They both picked up right around the time I added in-app purchases, although I was never able to tell if it was cause or consequence.</p>
<p>This is the amount of downloads of the free version for this period of time.</p>
<p><img alt="fg_free.png" loading="lazy" src="/making-a-living-comfortably-on-the-app-store/images/fg_free.png"></p>
<p>It stays pretty regularly at about 800 downloads per day (which is not much compared to a lot of free versions out there), and has a massive spike on Valentine&rsquo;s Day (caused by word of mouth, lots of sent bouquets, and the <a href="http://bit.ly/iPhoneValentine">Valentine&rsquo;s Day Calendar</a>).</p>
<p>Notice that the App Store feature for Flower Garden (full version) in January had virtually no effect on downloads of the free version. It seems that people are willing to buy something full price without trying the free version first if Apple features it.</p>
<p>Both versions of Flower Garden (free and full) have in-app purchases in them. Even though there&rsquo;s a higher percentage of users with the full version that buy in-app purchases, the free version is much more popular and the majority of the revenue comes from the free version (orange). This is a tren that was already noticable around the holidays, but now is much more clear, with over 50% of the revenue coming from in-app purchases in the free version.</p>
<p><img alt="iap_profit.png" loading="lazy" src="/making-a-living-comfortably-on-the-app-store/images/iap_profit.png"></p>
<h2 id="the-future">The Future</h2>
<p>The data for this post stops at May 5th. That&rsquo;s because on May 6th I released a new set of seeds and <a href="/flower-garden-is-free-this-weekend-to-celebrate-mothers-day/">gave Flower Garden away for free as part of the Mother&rsquo;s Day promotion</a>. As soon as the dust settles from that, I&rsquo;ll write a third post detailing how it turned out.</p>
]]></content:encoded></item><item><title>Going The iPad Way: All You Wanted to Know About Creating Universal Apps</title><link>https://gamesfromwithin.com/going-the-ipad-way-all-you-wanted-to-know-about-creating-universal-apps/</link><pubDate>Mon, 10 May 2010 00:00:00 +0000</pubDate><guid>https://gamesfromwithin.com/going-the-ipad-way-all-you-wanted-to-know-about-creating-universal-apps/</guid><description>&lt;p&gt;&lt;img alt="flower_garden_ipad.jpg" loading="lazy" src="https://gamesfromwithin.com/going-the-ipad-way-all-you-wanted-to-know-about-creating-universal-apps/images/flower_garden_ipad.jpg"&gt; It&amp;rsquo;s one thing to go on record saying &lt;a href="https://gamesfromwithin.com/figuring-out-the-ipad/"&gt;I wouldn&amp;rsquo;t be creating an iPad-specific version of Flower Garden&lt;/a&gt;, and another seeing the iPhone version running on an iPad with all the ugly jaggies and huge, pixelated text. So when it came time to do a new update, I decided to at least take advantage of the iPad capabilities to make the existing app prettier by making Flower Garden into a universal app. It&amp;rsquo;s &lt;a href="http://bit.ly/fg_gfw"&gt;now available on the App Store&lt;/a&gt;, so go get it and check it out!&lt;/p&gt;</description><content:encoded><![CDATA[<p><img alt="flower_garden_ipad.jpg" loading="lazy" src="/going-the-ipad-way-all-you-wanted-to-know-about-creating-universal-apps/images/flower_garden_ipad.jpg"> It&rsquo;s one thing to go on record saying <a href="/figuring-out-the-ipad/">I wouldn&rsquo;t be creating an iPad-specific version of Flower Garden</a>, and another seeing the iPhone version running on an iPad with all the ugly jaggies and huge, pixelated text. So when it came time to do a new update, I decided to at least take advantage of the iPad capabilities to make the existing app prettier by making Flower Garden into a universal app. It&rsquo;s <a href="http://bit.ly/fg_gfw">now available on the App Store</a>, so go get it and check it out!</p>
<p>Surprisingly, there wasn&rsquo;t that much documentation on how to go about making a universal iPhone/iPad version. There&rsquo;s <a href="http://developer.apple.com/iphone/library/documentation/General/Conceptual/iPadProgrammingGuide/StartingYourProject/StartingYourProject.html#//apple_ref/doc/uid/TP40009370-CH9-SW1">a document from Apple showing some initial steps</a>, but that&rsquo;s about it. So I wanted to share what I learned along the way, including some very useful tips I learned through trial and error or by doing a lot of digging through Twitter and the development forums.</p>
<p>Flower Garden is a <a href="/gdc-2010-the-best-of-both-worlds-using-uikit-with-opengl/">strange hybrid of OpenGL and UIKit</a>, which made things more complicated than if it were just one or the other. Learning curve and all, it took two full days of my time. If you&rsquo;re using just OpenGL or just UIKit, the conversion to a universal app will be significantly faster.</p>
<h2 id="universal-project">Universal Project</h2>
<p>The first thing you need to do is understand what&rsquo;s going on with all the SDK versions. At this time, the latest iPhone OS version is 3.1.3, but you&rsquo;re going to be developing the universal app with SDK 3.2. You want the resulting binary to run on both 3.X OS on iPhones and 3.2 OS on iPad. It&rsquo;s a very similar situation to when we were <a href="/targeting-2-x-with-3-0-features-trouble-ahead/">writing apps that worked on both 3.X and 2.X</a>.</p>
<p>So fire up XCode 3.2.2 (yes, all those version numbers start getting very confusing&ndash;that&rsquo;s the XCode version that comes with SDK 3.2), and load your iPhone project you want to make into a universal one. If you look under the Project menu item, you&rsquo;ll see an entry called &ldquo;Upgrade Current Target For iPad&rdquo;. The Apple documentation even warns you not to create a universal app in any other way.</p>
<p>Go ahead and use it if you want. It will work&hellip; as long as you have a single target you want to convert. For some inexplicable reason <a href="#1">[1]</a>, it will only work once per project (even though it&rsquo;s phrased as working with whatever the current target is). When would you have more than one target executable? If you have a <a href="/from-full-to-lite-in-under-an-hour/">free and a paid version</a> for example.</p>
<p>Besides, I&rsquo;m uncomfortable with automated &ldquo;smart&rdquo; tools that do things behind my back without me knowing exactly what&rsquo;s going on, so I upgraded by hand by looking at the diffs of what the upgrade command did. It turns out it&rsquo;s extremely simple.</p>
<ol>
<li>Under the project properties, set your base SDK to 3.2.</li>
<li>Set Architectures to &ldquo;Optimized (arm6, arm7)&rdquo;</li>
<li>Uncheck &ldquo;Build Active Architectures Only&rdquo;
<img alt="proejct_settings_1.png" loading="lazy" src="/going-the-ipad-way-all-you-wanted-to-know-about-creating-universal-apps/images/proejct_settings_1.png">5. In the Deployment section, set it to SDK 3.1.3 (or whatever 3.X you want to target)
<img alt="project_settings_2.png" loading="lazy" src="/going-the-ipad-way-all-you-wanted-to-know-about-creating-universal-apps/images/project_settings_21.png"></li>
</ol>
<p>That&rsquo;s it, really. That&rsquo;s all you need to compile and run your app both on an iPhone and an iPad. When you build for the device, it will compile both arm6 and arm7 versions and create a combined fat executable with both. And yes, this means the size of your executable is going to double (which could be an issue if you&rsquo;re near the 20MB limit). In the case of Flower Garden, the combined executable is 3.4MB, so that&rsquo;s not a big deal.</p>
<h2 id="ipad-functionality">iPad Functionality</h2>
<p>What about that new xib file that the upgrade process creates? You don&rsquo;t really need it. It&rsquo;s there in case you want to have a different set of xibs for each platform, and it&rsquo;s hooked up to the info file so the app knows to load it at startup.</p>
<p><img alt="ib.png" loading="lazy" src="/going-the-ipad-way-all-you-wanted-to-know-about-creating-universal-apps/images/ib.png">For the universal version of Flower Garden, I wasn&rsquo;t trying to make a whole new brand experience on the iPad. Instead, I was looking for a quick and easy way to make it look much better. Because of it, I decided to reuse the same xib files as for the iPhone version.</p>
<p>That meant I had to go in Interface Builder, and adjust the autosize properties for a lot of the views. Some of them I wanted to stretch and get bigger with the high resolution iPad screen (background views). Others, I wanted to leave at the same size, but remain at the same relative distance from a particular border (buttons). Some other ones, I left the same size and their position just scaled up with the resolution (info boxes). All in all, that was the most time-consuming part of the process. It also required a few tweaks here and there to support the resolution change correctly.</p>
<p>The other big change was updating the resolution of the 3D views. Fortunately, that was just worked without a single line change. The <a href="/opengl-and-uikit-demo/">render target code</a> I&rsquo;m using, takes the view dimensions and creates a frame buffer of the correct size. And it&rsquo;s not just the dimensions: Remember that the iPad has a different aspect ratio (grumble, grumble), so you need to make sure your perspective and orthographic projections take that into account.</p>
<p>The only other changes I had to make was supporting an upside-down portrait orientation. That was very easy because the frame buffer didn&rsquo;t have to change. Make sure you support it both at launch time and during gameplay. If you have a root controller whose view is attached directly to the main window from the start, it&rsquo;s as easy as adding this to your controller:</p>
<pre tabindex="0"><code>- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait ||
            interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown);
}
</code></pre><p>And make sure you add the supported orientations to your plist.</p>
<p><img alt="plist.png" loading="lazy" src="/going-the-ipad-way-all-you-wanted-to-know-about-creating-universal-apps/images/plist.png"></p>
<p>Finally, before you submit it to the App Store, you&rsquo;ll need an iPad-specific icon. The documentation explains how to explicitly list all the icons in the info file, but at the very least, you can provide a file called Icon-72.png that is a 72x72 image and you&rsquo;re done.</p>
<h2 id="running-on-the-simulator">Running On The Simulator</h2>
<p>This is one that should be a lot easier than it is. You&rsquo;re creating a universal binary with SDK 3.2. Now you want to run it on the simulator. No problem, you run it as usual and you get the iPad simulator. You can debug it and do everything you normally do.</p>
<p>Now you want to run it on the simulator on iPhone mode. It turns out, that&rsquo;s not so obvious.</p>
<p>You can&rsquo;t just turn the simulator hardware setting to iPhone, because whenever you launch it from XCode it will override that again with the iPad one. Building and running on the 3.1.3 SDK is a no-no because you&rsquo;re really running a different build than you&rsquo;re going to be submitting (3.2) and all 3.2 SDK features you&rsquo;re using are going to result in compile errors.</p>
<p>So after much searching and tweeting, here&rsquo;s the solution:</p>
<ul>
<li>Build for 3.2 SDK on the simulator platform.</li>
<li>Change project drop-down to 3.1.3 SDK
<img alt="sdk_version.png" loading="lazy" src="/going-the-ipad-way-all-you-wanted-to-know-about-creating-universal-apps/images/sdk_version.png">- Launch with debugger (Cmd + Options + Y). Don&rsquo;t build and run!</li>
</ul>
<p>That will launch the simulator on iPhone mode, but still run your 3.2 build. Talk about unintuitive! <a href="#2">[2]</a>. The worst thing is, when you&rsquo;re done, you need to switch the project to 3.2 again or you&rsquo;ll get tons of compiler errors. That definitely has to go for SDK 4.0.</p>
<p>Here&rsquo;s an invaluable tip. Maybe it&rsquo;s obvious to long-term Mac users, but it baffled me for a while. The iPad simulator is very well thought out, and it has a 100% and a 50% mode. That makes it possible to use the simulator on screens without very high resolution. Even my external monitor at 1680x1050 can&rsquo;t display the iPad simulator at full 1024x768 resolution in portrait mode because of the window borders.</p>
<p>The problem comes in when you want to take a screenshot to add to the App Store or anything else. On the iPhone simulator it was easy, but how do you do that with the iPad since you can&rsquo;t fit it on the screen? Cmd + Ctrl + C will take a screenshot <strong>at full resolution</strong> even when running at 50% mode and add it to the clipboard! Switch over to Preview and select New from Clipboard and voila! Full resolution screenshot!</p>
<h2 id="sdk-32-features">SDK 3.2 Features</h2>
<p>Chances are that even if you do a simple iPad port, you&rsquo;re going to end up using a few 3.2 features. The main one I used in the case of Flower Garden is a UIPopoverController. Here you should follow the steps outlined in the Apple documentation down to a T. But it comes down to this: If a symbol that is defined on 3.2 appears anywhere, even as a member pointer variable in a class, it will compile and run on the iPad fine, but will crash and burn on the iPhone.</p>
<p>So you need to both check that the 3.2 features are available, and you need to &ldquo;hide&rdquo; the new symbol so it never appears anywhere: Use an id variable and cast it based on the class info. Even casting it directly to the symbol you want will cause a crash.</p>
<pre tabindex="0"><code>Class classPopoverController = NSClassFromString(@&#34;UIPopoverController&#34;);
if (classPopoverController)
{
    m_moreGamesPopover = [[classPopoverController alloc] initWithContentViewController:moreGames]; 
    [m_moreGamesPopover setDelegate:self];
    [m_moreGamesPopover setPopoverContentSize:CGSizeMake(320, moreGamesHeight) animated:NO];
    [m_moreGamesPopover presentPopoverFromRect:m_moreGamesButton.frame inView:self.view
                        permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
}
</code></pre><p>Not pretty, uh? It works, but I couldn&rsquo;t imagine doing this all over the place.</p>
<h2 id="gotchas">Gotchas</h2>
<p>In the process of creating a universal app, I found a couple more things to watch out for.</p>
<p>When you submit the new binary through iTunes Connect and it&rsquo;s accepted, the application status will change to something like &ldquo;Missing screenshot&rdquo;. If you go back and edit the app information, you&rsquo;ll see there&rsquo;s a new set of screenshots you can submit. You&rsquo;ll need at least one for your application to enter &ldquo;Waiting for Review&rdquo; state. And if you have localized descriptions of your app, you&rsquo;ll need to do that for every language.</p>
<p>Last, and perhaps most puzzling because I never figured this one out: I was not able to get in-app purchases to work with a test account from a development version of a universal app running on the iPad. I must have tried everything, but whenever I tried purchasing anything, it never brought up the familiar &ldquo;sandbox environment&rdquo; message. Also, items that hadn&rsquo;t been approved yet did not show up in the list of available items. The exact same code worked fine on an iPhone, so that&rsquo;s quite puzzling. Is it a major bug on Apple&rsquo;s part, or did I miss some obscure &ldquo;enable IAPs in debug mode&rdquo; checkbox somewhere? It was a bit of a gamble submitting it like that, but fortunately, the approved version on the App Store allows in-app purchases without any problem.</p>
<p>I thought afterwards that maybe that was because the app version on the App Store was no universal, so the Store Kit server was not allowing the iPad version to access the store through the test account. But I tried it again even after it was approved and I had the same problem.</p>
<p>Has anybody managed to use an App Store test account from an iPad on a universal app?</p>
<h2 id="conclusion">Conclusion</h2>
<p>All in all, it was a relatively painless process considering it&rsquo;s different hardware, with a different resolution, and it&rsquo;s the first iteration of the SDK. Was it worth it? I think so. Apart from looking a lot better on an iPad, universal apps get ranked on both iPhone and iPad charts. Flower Garden managed to get all the way up to #14 on the free games chart on the iPad (and around #60 free app overall on the iPad). I&rsquo;m sure it got some exposure from being so high up, which in turn helped the iPhone rankings as well.</p>
<p>I can&rsquo;t imagine that my next game is going to be iPad-only, but I&rsquo;ll certainly have the iPad in mind from the beginning and release it on both platforms. Whether I choose to go universal or separate apps will depend on the game and business decisions, but at least it&rsquo;s good to know that it&rsquo;s fairly easy to create a universal app.</p>
<p><img alt="flower_garden_ipad_charts.jpg" loading="lazy" src="/going-the-ipad-way-all-you-wanted-to-know-about-creating-universal-apps/images/flower_garden_ipad_charts.jpg"></p>
<p>[1] Actually, there&rsquo;s a pattern that is clear by looking at the hoops we have to jump to do a universal build: Apple was clearly scrambling to get this out the door. As a result, things are buggy, unintuitive, and clunky. Hopefully all that will be fixed for SDK 4.0.</p>
<p>[2] See? That confirms point <a href="#1">[1]</a>.</p>
]]></content:encoded></item><item><title>Flower Garden Is Free This Weekend To Celebrate Mother's Day!</title><link>https://gamesfromwithin.com/flower-garden-is-free-this-weekend-to-celebrate-mothers-day/</link><pubDate>Sat, 08 May 2010 00:00:00 +0000</pubDate><guid>https://gamesfromwithin.com/flower-garden-is-free-this-weekend-to-celebrate-mothers-day/</guid><description>&lt;p&gt;&lt;img alt="Icon-128x128.png" loading="lazy" src="https://gamesfromwithin.com/flower-garden-is-free-this-weekend-to-celebrate-mothers-day/images/Icon-128x128.png"&gt;&lt;img alt="flower_shop.jpg" loading="lazy" src="https://gamesfromwithin.com/flower-garden-is-free-this-weekend-to-celebrate-mothers-day/images/flower_shop.jpg"&gt;Since this Sunday is Mother&amp;rsquo;s Day (in the US at least), I&amp;rsquo;m making &lt;a href="http://freeappcalendar.com/details.php?id=159"&gt;Flower Garden &lt;strong&gt;FREE&lt;/strong&gt; for the weekend&lt;/a&gt;. Yes, that&amp;rsquo;s right, completely free!&lt;/p&gt;
&lt;p&gt;Am I going crazy? Giving away the fruit of my labor for so many months? The App Store will do that to people, but this is a bit more sane. The idea is to encourage many more people to try it out. I&amp;rsquo;m actually hoping some of them will like it so much, they&amp;rsquo;ll buy a few of the in-app purchases from the Flower Shop. And even if they don&amp;rsquo;t, hopefully they&amp;rsquo;ll spread the (good) word about Flower Garden and they might also sign up for the mailing list. And in this business, expanding your user base is a great strategy that can be leveraged for future projects.&lt;/p&gt;</description><content:encoded><![CDATA[<p><img alt="Icon-128x128.png" loading="lazy" src="/flower-garden-is-free-this-weekend-to-celebrate-mothers-day/images/Icon-128x128.png"><img alt="flower_shop.jpg" loading="lazy" src="/flower-garden-is-free-this-weekend-to-celebrate-mothers-day/images/flower_shop.jpg">Since this Sunday is Mother&rsquo;s Day (in the US at least), I&rsquo;m making <a href="http://freeappcalendar.com/details.php?id=159">Flower Garden <strong>FREE</strong> for the weekend</a>. Yes, that&rsquo;s right, completely free!</p>
<p>Am I going crazy? Giving away the fruit of my labor for so many months? The App Store will do that to people, but this is a bit more sane. The idea is to encourage many more people to try it out. I&rsquo;m actually hoping some of them will like it so much, they&rsquo;ll buy a few of the in-app purchases from the Flower Shop. And even if they don&rsquo;t, hopefully they&rsquo;ll spread the (good) word about Flower Garden and they might also sign up for the mailing list. And in this business, expanding your user base is a great strategy that can be leveraged for future projects.</p>
<p>The idea of giving away a free app isn&rsquo;t anything new. There are whole sites like <a href="http://freeappcalendar.com">FreeAppCalendar</a> dedicated to doing exactly that, and other developers, like <a href="http://nimblebit.com">NimbleBit</a> have been doing that on and off very successfully to reach a wider audience with their games.</p>
<p>How will it work out? I don&rsquo;t know yet, but Flower Garden is quickly going up the charts even early on Saturday. It&rsquo;s currently in the top 50 free apps in Japan, and about to get in the top 10 kids games in the US, so it&rsquo;s looking good.</p>
<p>If you haven&rsquo;t picked it up yet, this is the time. And if you have, make sure you tell your friends and family to download it and check it out before it goes back to the regular price. I&rsquo;ll report back on the results of this promotion in a few days.</p>
]]></content:encoded></item><item><title>Flower Garden a Finalist for The 2010 Pocket Gamer Awards for Most Innovative Game!</title><link>https://gamesfromwithin.com/flower-garden-a-finalist-for-the-2010-pocket-gamer-awards-for-most-innovative-game/</link><pubDate>Wed, 03 Mar 2010 00:00:00 +0000</pubDate><guid>https://gamesfromwithin.com/flower-garden-a-finalist-for-the-2010-pocket-gamer-awards-for-most-innovative-game/</guid><description>&lt;p&gt;&lt;a href="http://www.pocketgamer.co.uk/r/Various/Pocket%20Gamer%20Awards/feature.asp?c=17875"&gt;&lt;img alt="10AF654B-A6A5-4C29-BE46-D58B3A09BAEA.jpg" loading="lazy" src="https://gamesfromwithin.com/flower-garden-a-finalist-for-the-2010-pocket-gamer-awards-for-most-innovative-game/images/10AF654B-A6A5-4C29-BE46-D58B3A09BAEA.jpg"&gt;&lt;/a&gt;Pocket Gamer just announced the finalists for the &lt;a href="http://www.pocketgamer.co.uk/r/Various/Pocket%20Gamer%20Awards/feature.asp?c=17875"&gt;2010 Pocket Gamer Awards&lt;/a&gt;. I was thrilled to see that Flower Garden has been selected as a finalist for the Most Innovative iPhone Game award.&lt;/p&gt;
&lt;p&gt;On a personal level, this nomination means quite a bit for me. Flower Garden has gotten &lt;a href="http://fingergaming.com/2009/04/24/review-flower-garden/"&gt;some&lt;/a&gt; &lt;a href="http://theportablegamer.com/2009/04/iphone-review-flower-garden/"&gt;great&lt;/a&gt; &lt;a href="http://www.pocketgamer.co.uk/r/iPhone/Flower+Garden/review.asp?c=12825"&gt;reviews&lt;/a&gt;, and some incredible user feedback, and it was even featured as an &lt;a href="https://gamesfromwithin.com/flower-garden-now-an-apple-staff-favorite-on-the-app-store-worldwide/"&gt;Apple Staff Favorite on the App Store&lt;/a&gt;, but it had never been up for an award of this importance.&lt;/p&gt;</description><content:encoded><![CDATA[<p><a href="http://www.pocketgamer.co.uk/r/Various/Pocket%20Gamer%20Awards/feature.asp?c=17875"><img alt="10AF654B-A6A5-4C29-BE46-D58B3A09BAEA.jpg" loading="lazy" src="/flower-garden-a-finalist-for-the-2010-pocket-gamer-awards-for-most-innovative-game/images/10AF654B-A6A5-4C29-BE46-D58B3A09BAEA.jpg"></a>Pocket Gamer just announced the finalists for the <a href="http://www.pocketgamer.co.uk/r/Various/Pocket%20Gamer%20Awards/feature.asp?c=17875">2010 Pocket Gamer Awards</a>. I was thrilled to see that Flower Garden has been selected as a finalist for the Most Innovative iPhone Game award.</p>
<p>On a personal level, this nomination means quite a bit for me. Flower Garden has gotten <a href="http://fingergaming.com/2009/04/24/review-flower-garden/">some</a> <a href="http://theportablegamer.com/2009/04/iphone-review-flower-garden/">great</a> <a href="http://www.pocketgamer.co.uk/r/iPhone/Flower+Garden/review.asp?c=12825">reviews</a>, and some incredible user feedback, and it was even featured as an <a href="/flower-garden-now-an-apple-staff-favorite-on-the-app-store-worldwide/">Apple Staff Favorite on the App Store</a>, but it had never been up for an award of this importance.</p>
<p>It&rsquo;s also the category that it was nominated for. It makes me really proud that it was nominated for Most Innovative Game, because one of my original goals was to create something unique and original.</p>
<p>Finally, these awards are particularly meaningful because they&rsquo;re not based on popularity, sales, or voting, which are bound to bias awards towards best-selling titles. Instead, these finalists were hand-picked by the editors of Pocket Gamer. With the crazy amount of good apps out there, it really is an honor that they selected Flower Garden as one of the top 5 for 2009.</p>
<p>Thank you, Pocket Gamer!</p>
]]></content:encoded></item><item><title>Buy Flower Garden This Wednesday To Help Haiti</title><link>https://gamesfromwithin.com/buy-flower-garden-this-wednesday-to-help-haiti/</link><pubDate>Tue, 19 Jan 2010 00:00:00 +0000</pubDate><guid>https://gamesfromwithin.com/buy-flower-garden-this-wednesday-to-help-haiti/</guid><description>&lt;p&gt;As part of &lt;a href="http://www.indierelief.com/"&gt;Indie+Relief&lt;/a&gt;, all proceeds from &lt;a href="http://click.linksynergy.com/fs-bin/stat?id=aDkhM0mDflg&amp;amp;offerid=146261&amp;amp;u1=st_fg&amp;amp;type=3&amp;amp;subid=0&amp;amp;tmpid=1826&amp;amp;RD_PARM1=http%253A%252F%252Fitunes.apple.com%252FWebObjects%252FMZStore.woa%252Fwa%252FviewSoftware%253Fid%253D311265471%2526mt%253D8%2526uo%253D6%2526partnerId%253D30"&gt;Flower Garden&lt;/a&gt; this Wednesday will be donated to Haiti through &lt;a href="http://www.msf.ca//"&gt;Doctors Without Borders&lt;/a&gt;. Encourage your friends to buy Flower Garden for a good cause! That includes in-app purchases, so feel free to load up on fertilizer :-)&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve already purchased Flower Garden and you&amp;rsquo;d still like to help out, you can check out &lt;a href="http://www.indierelief.com"&gt;the great lineup of Mac and iPhone apps at Indie+Relief&lt;/a&gt;, or &lt;a href="http://www.msf.ca/donate/"&gt;donate directly to Doctors Without Borders here&lt;/a&gt;.&lt;/p&gt;</description><content:encoded><![CDATA[<p>As part of <a href="http://www.indierelief.com/">Indie+Relief</a>, all proceeds from <a href="http://click.linksynergy.com/fs-bin/stat?id=aDkhM0mDflg&amp;offerid=146261&amp;u1=st_fg&amp;type=3&amp;subid=0&amp;tmpid=1826&amp;RD_PARM1=http%253A%252F%252Fitunes.apple.com%252FWebObjects%252FMZStore.woa%252Fwa%252FviewSoftware%253Fid%253D311265471%2526mt%253D8%2526uo%253D6%2526partnerId%253D30">Flower Garden</a> this Wednesday will be donated to Haiti through <a href="http://www.msf.ca//">Doctors Without Borders</a>. Encourage your friends to buy Flower Garden for a good cause! That includes in-app purchases, so feel free to load up on fertilizer :-)</p>
<p>If you&rsquo;ve already purchased Flower Garden and you&rsquo;d still like to help out, you can check out <a href="http://www.indierelief.com">the great lineup of Mac and iPhone apps at Indie+Relief</a>, or <a href="http://www.msf.ca/donate/">donate directly to Doctors Without Borders here</a>.</p>
<p><a href="http://www.indierelief.com/"><img alt="ir_500" loading="lazy" src="/buy-flower-garden-this-wednesday-to-help-haiti/images/ir_500.png" title="ir_500"></a></p>
]]></content:encoded></item><item><title>Making A Living (Barely) On The iPhone App Store (aka The Numbers Post)</title><link>https://gamesfromwithin.com/making-a-living-barely-on-the-iphone-app-store/</link><pubDate>Fri, 15 Jan 2010 00:00:00 +0000</pubDate><guid>https://gamesfromwithin.com/making-a-living-barely-on-the-iphone-app-store/</guid><description>&lt;p&gt;The App Store is a very hit-driven environment. A few apps sell a large amount of units, and the great majority sell next to nothing. That&amp;rsquo;s somewhat similar to the music industry, except that the audience for music is much larger, so both the big hits and the small players get more sales. We&amp;rsquo;ve drooled over the numbers &lt;a href="http://firemint.com/blog/?p=123"&gt;chart&lt;/a&gt; &lt;a href="http://games.venturebeat.com/2009/07/10/pocket-god-is-a-case-study-of-a-hit-iphone-game/"&gt;toppers&lt;/a&gt; sold, I&amp;rsquo;ve seen sales reports of very &lt;a href="http://toucharcade.com/wp-content/uploads/2009/09/featured.png"&gt;successful&lt;/a&gt; &lt;a href="http://www.nimblebit.com/2010/01/nimblebit-numbers-2009/"&gt;games&lt;/a&gt;, and we&amp;rsquo;ve also seen what happens when &lt;a href="http://www.streamingcolour.com/blog/2009/03/09/the-numbers-post-aka-brutal-honesty/"&gt;apps&lt;/a&gt; languish at the bottom.&lt;/p&gt;</description><content:encoded><![CDATA[<p>The App Store is a very hit-driven environment. A few apps sell a large amount of units, and the great majority sell next to nothing. That&rsquo;s somewhat similar to the music industry, except that the audience for music is much larger, so both the big hits and the small players get more sales. We&rsquo;ve drooled over the numbers <a href="http://firemint.com/blog/?p=123">chart</a> <a href="http://games.venturebeat.com/2009/07/10/pocket-god-is-a-case-study-of-a-hit-iphone-game/">toppers</a> sold, I&rsquo;ve seen sales reports of very <a href="http://toucharcade.com/wp-content/uploads/2009/09/featured.png">successful</a> <a href="http://www.nimblebit.com/2010/01/nimblebit-numbers-2009/">games</a>, and we&rsquo;ve also seen what happens when <a href="http://www.streamingcolour.com/blog/2009/03/09/the-numbers-post-aka-brutal-honesty/">apps</a> languish at the bottom.</p>
<p>I want to share the sales data for <a href="http://www.snappytouch.com/flowergarden">Flower Garden</a>. Not just the raw data, but a bit of the story behind it, my thoughts, struggles, and why things happened the way they did.</p>
<p>The first thing that you&rsquo;ll notice is that Flower Garden is a strange in-between app. It&rsquo;s far from being very successful or being at the top of any chart, but at the same time it probably made more money than 99% of the apps on the App Store. It was also relelased on April 10th, so this represents 10 months of data, an age after which most apps are usually on drip support. So this should be an interesting new data point.</p>
<h2 id="the-full-monty">The Full Monty</h2>
<p>I know that if I put it off, you&rsquo;re just going to skip to the end to see the sales plot, so let&rsquo;s get that out of the way. Here it is.</p>
<p><img alt="Full" loading="lazy" src="/making-a-living-barely-on-the-iphone-app-store/images/Full.png" title="Flower Garden profit"></p>
<p>The vertical axis is daily profit in US $ (after Apple&rsquo;s 30% cut). Flower Garden generated a bit over $21,500 over a period of 10 months. I would hardly consider that an entry-level salary, much less in California, but it&rsquo;s enough for someone without a family or mortgage to (barely) make a living. I supplemented that with some <a href="http://www.mobileorchard.com/iphone-opengl-programming-training-class/">teaching</a>, <a href="http://gdmag.com/homepage.htm">writing</a>, contracting and consulting, so overall I managed do fine and even save a bit of money last year, all while being totally indie and having full creative control over what I did every day. I&rsquo;m not getting rich, but it&rsquo;s not a bad life, really.</p>
<p>How many hours of work does Flower Garden represent? It&rsquo;s really hard to say. It was 6 solid months of work from conception to release, but then there was the fuzzy time spent on marketing, updates, support, new features, etc. I would estimate it was a total of 8 months of full time work, which, at 50 hours per week, makes it 1600 hours. So that&rsquo;s a depressing $13.44/hour. At least it&rsquo;s over minimum wage! :-) On the positive side, Flower Garden should continue to sell in the foreseeable future, so that amount will go up a bit over time.</p>
<p>There&rsquo;s clearly a story behind that graph. It&rsquo;s not the usual exponential drop off you expect from most (unsuccessful apps) and shows how an aging app can pick up steam on its own after many months on the store, without ever being featured by Apple.</p>
<h2 id="launch">Launch</h2>
<p>Let&rsquo;s start from the beginning. Release day!</p>
<p><img alt="Beginning2" loading="lazy" src="/making-a-living-barely-on-the-iphone-app-store/images/Beginning2.png" title="Flower Garden initial profit"></p>
<p>After six hard months of work, I submitted Flower Garden to Apple sometime at the beginning of April, and on April 10th I was surprised to see it had been approved. It caught me a bit off guard without my marketing campaign in place, but I announced it high and wide on <a href="/flower-garden-released/">this blog</a>, Twitter, Facebook, and I even spammed all my friends with an email. The results are the area marked as (A): About $50-$60 in revenue per day (so about 25-30 sales). Not bad considering that was mostly my friends taking pity on me and people randomly seeing it on the new releases list, but it was far from an auspicious start.</p>
<p>I also contacted all the media sites I knew with a press release and promo codes to entice them to write a review. I was lucky that many reviews appeared over the next couple of weeks, but unfortunately they were all spread out, minimizing the PR effect. The biggest effect was when Flower Garden was simultaneously covered on <a href="http://toucharcade.com/2009/04/16/flower-garden-well-its-not-really-a-game/">TouchArcade</a> and <a href="http://www.macrumors.com/iphone/2009/04/16/flower-garden-for-iphone-is-a-beautifully-designed-app/">MacRumors</a>. That&rsquo;s what caused the big sales spike (B). From there, it was a standard exponential drop off, until, on the last day of the month, just three weeks after launch, revenue dropped below $100/day again. If that was all there was to it, Flower Garden was a big flop and I should start dusting off my resume.</p>
<h2 id="mothers-day">Mother&rsquo;s Day</h2>
<p>I wasn&rsquo;t ready to throw in the towel yet. I had a couple cards up my sleeve that I was hoping would change things around. After all, May 5th is Mother&rsquo;s Day in the US. What better time to do some promotion and get Flower Garden noticed?</p>
<p>I decided to run a contest and give away $100 in real flowers to the winner at the same time I put Flower Garden on sale for $1.99 for the week of Mother&rsquo;s Day. The result? The revenue dip you see in (A).</p>
<p><img alt="Middle_long" loading="lazy" src="/making-a-living-barely-on-the-iphone-app-store/images/Middle_long.png" title="Flower Garden profit in the middle"></p>
<p>Mother&rsquo;s day is probably the small, second spike in that period, but overall, that week was a loss. Lesson learned: Don&rsquo;t make a sale unless your app is in a visible position (on a top chart somewhere). Flower Garden was nowhere to be seen, so the sale had no effect other than to cut profits by 33%.</p>
<p>I released a couple updates and did the trick updating the release date to get on the new releases list (which no longer works) and I got a couple minor spikes with (B) and (C). Subsequent updates later that summer had almost no effect anymore on sales. The trend was worryingly clear as profits dipped as low as $10/day in mid June (I have no idea what happened that day, but it was the lowest day ever for Flower Garden).</p>
<h2 id="app-treasures">App Treasures</h2>
<p>In early June we launched <a href="http://apptreasures.com">App Treasures</a>. App Treasures is a label for indie iPhone game developers with top-quality games, and one of the main tools we&rsquo;re leveraging is some cross-promotion for our games, both through the web site, and from an in-game view liking to each other&rsquo;s games.Â Initially there was no measurable effect, but then <a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=313014213&amp;mt=8">Harbor Master</a> was released and shot all the way to the #2 position on the US store and held its position on the top 50 for a while. The results is the area under (D). It definitely brought in some sales to Flower Garden and reversed the downward trend.</p>
<p>Unfortunately all good things come to an end, and referrals from Harbor Master dropped off and its slipped down the charts, and Flower Garden sales continued sinking.</p>
<h2 id="facebook-and-lite">Facebook and Lite</h2>
<p>At this point I had to face reality. Was it time to give up on Flower Garden and move on to another project? I was ready to do that, but every day I would get several emails from users saying how much they loved Flower Garden, how much happiness it was bringing to their lives, etc. Some of the stories were really touching.</p>
<p>At the same time, every time I would show the game to someone, they usually really liked it. Not liked-it-because-I&rsquo;m-there, but really, genuinely liked it. Why weren&rsquo;t more people buying it then? Two problems: First, screenshots were not conveying how cool growing, animated flowers you could touch were, and second, most people didn&rsquo;t even know Flower Garden existed. It had never been featured by Apple on the App Store, and the audience I was trying to reach didn&rsquo;t read TouchArcade or other iPhone review sites.</p>
<p>It was at this point that I decided to give it one more try. My goal wasn&rsquo;t adding more features as I had done with the updates so far, but to make Flower Garden more visible. I wanted more people to know that Flower Garden existed.</p>
<p>The first thing I did was to add Facebook integration. Not only could you send bouquets through email, but you were able to send them directly to your Facebook friends. The advantage of that approach from my point of view is that all your friends also saw the flowers so for every bouquet sent on Facebook, hopefully dozens or hundreds of people were being exposed to Flower Garden. The result on sales: Not much. Maybe it made the early part of July a little higher than it would have been otherwise, but no noticeable difference.</p>
<p>The second approach was to release a lite version of Flower Garden in early September. I was confident that Flower Garden was a good app, and I was hoping that once people had a chance to try the lite version, they would purchase the full version. Fortunately I was right and the effect on sales was very noticeable, pretty much doubling sales (E),Â but it never really took off in any significant way, and sales slowly declined over time.</p>
<h2 id="second-wind">Second Wind</h2>
<p>You&rsquo;d think that I would give up at this point, wouldn&rsquo;t you? And I don&rsquo;t say that with pride. I mean, it probably would have been smarter to quit a long time ago. But somehow, every time I was ready to move on , something else would come up that would entice me to try something else with Flower Garden.</p>
<p>This time it was in-app purchases (IAP). <a href="http://developer.apple.com/iphone/program/sdk/inapppurchase.html">Apple had announced IAP</a> back in June. They seemed like a very natural fit for Flower Garden, but given how few units Flower Garden had sold, I would have a very limited audience for IAP. A small percentage of a small number is a tiny number! :-( However, in late October Apple announced that <a href="http://theappleblog.com/2009/10/15/apple-allows-iphone-in-app-purchases-for-free-apps/">IAP were finally allowed from free apps</a> as well. That encouraged me to give Flower Garden one&hellip; last&hellip; try&hellip;</p>
<p>To be totally honest, I wasn&rsquo;t expecting very much. Even including all the units of the Lite version out there, there just weren&rsquo;t that many units. Especially not that many people using it on a daily basis (I&rsquo;m sure a lot of the free ones were downloaded and quickly forgotten). But I thought it would be a good experience and if I only spent a week on it and made $1,000 I could call it even.</p>
<p><img alt="End" loading="lazy" src="/making-a-living-barely-on-the-iphone-app-store/images/End.png" title="Flower Garden profit after IAP"></p>
<p>The result was totally unexpected. The Flower Shop opened on December 6th and revenue immediately shot up (A). On December 21st I released a new IAP called Seeds of Winter with 8 new winter-themed flowers, and people loved it and immediately purchased it. Christmas day came and went with somewhat of an increase in sales (C) but nothing really spectacular. Finally, to wrap up the year, there was a big spike on New Year&rsquo;s Eve (D) (do people send flowers on New Year&rsquo;s Eve? Really?).</p>
<p>Afterwards revenue flattened out, but at a much higher amount than before.Â Before IAP, daily revenue was about $50/day. Now it&rsquo;s more around $180/day. That&rsquo;s totally beyond any of my expectations!</p>
<p>But hang on, where is the revenue coming from? There are three possible sources: You can purchase Flower Garden, you can make IAP in the full version, and you can also make purchases in the free version. Here&rsquo;s the breakdown:</p>
<p><img alt="End_broken_down" loading="lazy" src="/making-a-living-barely-on-the-iphone-app-store/images/End_broken_down.png" title="Flower Garden IAP profit broken down"></p>
<p>It looks like sales for Flower Garden (blue) continue to be more or less the same, with a slight increase after Christmas. The IAP from the full version of Flower Garden (green) account for most of the extra revenue, especially at the beginning. But it&rsquo;s very interesting that the purchases coming from Flower Garden Free (orange) are steadily increasing and, as of last week, they became almost as large as the ones from the full version.</p>
<p>That can be explained because more and more people are getting the free version and upgrading it instead of buying the full version (which is exactly what I was hoping for). What&rsquo;s also really interesting is the downloads of Flower Garden Free.</p>
<p><img alt="fg_free" loading="lazy" src="/making-a-living-barely-on-the-iphone-app-store/images/fg_free.png" title="Flower Garden Free downloads"></p>
<p>Flower Garden Free was never a big player. It had the usual big initial spike, but then it settled down at around 100-200 downloads per day (which is very few considering there were 50-60 purchases per day of Flower Garden Full during that period). But, as soon as the in-app Flower Shop was released, downloads started climbing, and on Christmas day they went through the roof (relatively speaking). So it&rsquo;s no surprise that IAP from Flower Garden Free picked up in these last few weeks.</p>
<h2 id="the-future">The Future</h2>
<p>I have no idea what the future will hold for Flower Garden. This week Apple selected Flower Garden and f<a href="/flower-garden-now-an-apple-staff-favorite-on-the-app-store-worldwide/">eatured it on the App Store as a Staff Favorite</a> worldwide (that period is not show in the sales graphs). I&rsquo;m also already preparing a new update and some more IAP for Valentine&rsquo;s Day, so I&rsquo;m sure there will be more ups and downs in the near future. I&rsquo;d certainly like to continue supporting Flower Garden for as long as it&rsquo;s profitable.</p>
<p>I&rsquo;ll follow up this post in a couple of months with the aftermath of the App Store feature and Valentine&rsquo;s Day. Also, stay tuned for another post with more details of the IAP, what&rsquo;s successful, purchase patterns, and more.</p>
]]></content:encoded></item><item><title>Flower Garden Now An Apple Staff Favorite On The App Store Worldwide!</title><link>https://gamesfromwithin.com/flower-garden-now-an-apple-staff-favorite-on-the-app-store-worldwide/</link><pubDate>Tue, 12 Jan 2010 00:00:00 +0000</pubDate><guid>https://gamesfromwithin.com/flower-garden-now-an-apple-staff-favorite-on-the-app-store-worldwide/</guid><description>&lt;p&gt;Aparently Santa came to town a little later this year. Or maybe it was the &lt;a href="http://en.wikipedia.org/wiki/Biblical_Magi#Traditions"&gt;Reyes Magos&lt;/a&gt; (also bit late). In either case, I woke up this morning to find a very nice present waiting for me at my &lt;a href="http://twitter.com/MKripalani/status/7660447268"&gt;computer&lt;/a&gt;: Apple featured Flower Garden as an Apple Staff Favorite! Apparently this is in all App Stores worldwide too (I have confirmations for &lt;a href="http://twitter.com/OwenGoss/status/7668421503"&gt;Canada&lt;/a&gt; and &lt;a href="http://www.facebook.com/photo.php?pid=3204730&amp;amp;id=74897183702&amp;amp;comments&amp;amp;ref=mf"&gt;Thailand&lt;/a&gt;, so I imagine it applies to other territories as well).&lt;/p&gt;</description><content:encoded><![CDATA[<p>Aparently Santa came to town a little later this year. Or maybe it was the <a href="http://en.wikipedia.org/wiki/Biblical_Magi#Traditions">Reyes Magos</a> (also bit late). In either case, I woke up this morning to find a very nice present waiting for me at my <a href="http://twitter.com/MKripalani/status/7660447268">computer</a>: Apple featured Flower Garden as an Apple Staff Favorite! Apparently this is in all App Stores worldwide too (I have confirmations for <a href="http://twitter.com/OwenGoss/status/7668421503">Canada</a> and <a href="http://www.facebook.com/photo.php?pid=3204730&amp;id=74897183702&amp;comments&amp;ref=mf">Thailand</a>, so I imagine it applies to other territories as well).</p>
<p><img alt="fg_appstore_feature" loading="lazy" src="/flower-garden-now-an-apple-staff-favorite-on-the-app-store-worldwide/images/fg_appstore_feature.jpg" title="fg_appstore_feature"></p>
<p>This is the first time Flower Garden has received any kind of &ldquo;Apple love&rdquo;, so it&rsquo;s particularly exciting, especially considering that Flower Garden was released all the way back in April. I imagine the recent update, which included the Flower Shop with in-app purchases, must have caught someone&rsquo;s eye.</p>
<p>The only downside is that the featuring might throw off the sales data I was collecting to show the effect on sales that in-app purchases and the holiday season had. But I&rsquo;m not really complaining. That&rsquo;s a very nice reason to have the data thrown off :-) Thank you Apple!</p>
]]></content:encoded></item><item><title>Balancing Flowers</title><link>https://gamesfromwithin.com/balancing-flowers/</link><pubDate>Wed, 29 Jul 2009 00:00:00 +0000</pubDate><guid>https://gamesfromwithin.com/balancing-flowers/</guid><description>&lt;p&gt;I feel bad for the &lt;a href="http://www.designer-notes.com/"&gt;designers&lt;/a&gt; of games like Civilization or Supreme Commander. And I don&amp;rsquo;t even want to think about World of Warcraft. I thought it was tricky to balance the different flowers in &lt;a href="http://snappytouch.com/flowergarden"&gt;Flower Garden&lt;/a&gt;, so I can only imagine the amount of time and effort than went into tweaking all the properties of the many dozens of units in those games to balance them just right.&lt;/p&gt;
&lt;p&gt;At first, things sounded simple enough: Create 20 different seeds, with varied looks and properties. I had &lt;a href="http://www.facebook.com/video/video.php?v=79362357780"&gt;a really cool tool to tweak the flower DNA in real time&lt;/a&gt; (more on that another day), so how hard could it be?&lt;/p&gt;</description><content:encoded><![CDATA[<p>I feel bad for the <a href="http://www.designer-notes.com/">designers</a> of games like Civilization or Supreme Commander. And I don&rsquo;t even want to think about World of Warcraft. I thought it was tricky to balance the different flowers in <a href="http://snappytouch.com/flowergarden">Flower Garden</a>, so I can only imagine the amount of time and effort than went into tweaking all the properties of the many dozens of units in those games to balance them just right.</p>
<p>At first, things sounded simple enough: Create 20 different seeds, with varied looks and properties. I had <a href="http://www.facebook.com/video/video.php?v=79362357780">a really cool tool to tweak the flower DNA in real time</a> (more on that another day), so how hard could it be?</p>
<p>The main properties I had to balance were amount of care required (as in, how often you had to water them before they would go dry) and how long the flower took to grow. The first few flowers came along just fine, but after the fifth or sixth seed, they all started blurring together. Did I have a fast-growing flower that needed a lot of care already? To get around this, I started writing all the seeds I had done so far and their characteristics in a text file so I could refer to them easily.</p>
<p>After a few more seeds, I knew I was in trouble again. Reading through all the flowers was a pain, but now I was starting to forget what they looked like. Did I already have an orange flower with a few, large petals? How about a small white one with lots of rounded petals and glossy leaves? The text file didn&rsquo;t cut it anymore, I had to go graphical. So I created a document with a picture of each flower along with all its relevant information (name, growth time, and amount of care).</p>
<p>This helped a lot, but it eventually became inadequate when I started creating the unlock conditions and balancing and the different seeds in order of difficulty. I just wasn&rsquo;t able to look at a list of 20 entries, each of them with 3 key elements (care, duration, and unlock condition) and keep it all in my head to make intelligent decisions based on it.</p>
<p>I&rsquo;m a very visually-oriented person. Whenever I can, I try to solve problem visually instead of memorizing lists or plugging equations. In particular, I love to take a multi-dimensional problem and visualize it along its main axes. So I took the next logical step to help me make sense of all that data and created a seed chart.</p>
<p><a href="/wp-content/uploads/2009/07/FlowerSequence.jpg"><img alt="FlowerSequence_s" loading="lazy" src="/balancing-flowers/images/FlowerSequence_s.jpg" title="FlowerSequence_s"></a></p>
<p>This seed chart is a two-dimensional arrangement of all the common seeds in the game, along with their picture and the key information we had before (there are another dozen bonus seeds that aren&rsquo;t listed in this chart). The horizontal axis indicates how much care a plant needs. Specifically, it shows how many segments in the water meter before it dries out (and each segment is 3 hours). The vertical axis indicates the growth duration for the plant in real time. Instead of making it a straight, linear scale, I decided to go with regions, which is how they are presented in the game (&ldquo;Instant&rdquo;, &ldquo;A few hours&rdquo;, &ldquo;Overnight&rdquo;, &ldquo;A few days&rdquo;, &ldquo;About a week&rdquo;, and &ldquo;Quite a while!&rdquo;). Within the region, they&rsquo;re roughly ordered by duration (shorter towards the top, longer towards the bottom).</p>
<p>Now it was really easy to see at a glance the key characteristics for each seed, see where I had clusters, and where I had empty spaces that no seeds were currently using. As a bonus, I was able to come up with a rough ordering indicating the level of difficulty for each seed. The further down and to the right a seed was, the more difficult it was to grow.</p>
<p>That allowed me to block out some regions (dotted red lines) indicating difficulty ratings, which are listed in the game in the seed information as &ldquo;Piece of cake&rdquo;, &ldquo;Easy&rdquo;, &ldquo;Moderate&rdquo;, &ldquo;Hard&rdquo;, or &ldquo;Experts only&rdquo;. Notice how the lines separating the regions are not parallel (even though the vertical axis is kind of logarithmic). That&rsquo;s because moving along the horizontal axis increases difficulty a lot faster than moving down the vertical axis. So even a relatively complex relationship like that can be observed at a glance from the chart.</p>
<p>Another great benefit of the seed chart is that I was able to draw paths between seeds, showing the unlocking relationships between them. Before it was hard to see these relationships in text, but now it was very visual, and I could make sure that easier flowers unlocked the path to harder ones as long as the unlock relationship flowed roughly from the top left to the bottom right.</p>
<p>As a side effect, the chart allowed me to learn even more things about the data than I had expected. For example, I was able to see which colors I had used so far, and which colors I still needed to use. One really interesting thing I noticed is that colors were clustering around specific areas. Red colors seemed to be mostly in the harder flowers. Yellow colors were predominant with the dry plants, and blue colors with the wetter ones. I thought that was pretty neat, so I tweaked a few seeds here and there to make that color connection even stronger.</p>
<p>The lesson learned here is that the old saying applies even more in this age of information: One picture is worth one mega of words.</p>
]]></content:encoded></item></channel></rss>