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

<channel>
	<title>Games from Within &#187; flower garden</title>
	<atom:link href="http://gamesfromwithin.com/tag/flower-garden/feed" rel="self" type="application/rss+xml" />
	<link>http://gamesfromwithin.com</link>
	<description>Living the indie life</description>
	<lastBuildDate>Mon, 16 Jan 2012 20:37:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Trying Out Multisampling On iOS</title>
		<link>http://gamesfromwithin.com/trying-out-multisampling-on-ios</link>
		<comments>http://gamesfromwithin.com/trying-out-multisampling-on-ios#comments</comments>
		<pubDate>Fri, 16 Dec 2011 21:03:33 +0000</pubDate>
		<dc:creator>Noel</dc:creator>
				<category><![CDATA[Graphics]]></category>
		<category><![CDATA[iDevBlogADay]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[flower garden]]></category>

		<guid isPermaLink="false">http://gamesfromwithin.com/?p=1578</guid>
		<description><![CDATA[I only recently broke free of iOS3.x for Flower Garden, so I&#8217;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 &#8230; <a href="http://gamesfromwithin.com/trying-out-multisampling-on-ios">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I only recently broke free of iOS3.x for Flower Garden, so I&#8217;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&#8217;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&#8217;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!<span id="more-1578"></span>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&#8217;t work, and all you&#8217;ll get are 1282 &#8220;invalid operation&#8221; OpenGL errors). Also, if you&#8217;re in the same boat as Flower Garden, which uses OpenGL ES 1.1 and the fixed function pipeline, you&#8217;ll have to add _OES to just about every constant in the documentation.</p>
<h2>Visual results</h2>
<p>I will let the screenshots speak for themselves.</p>
<div style="text-align:center;"><img  src="http://gamesfromwithin.com/wp-content/uploads/2011/12/multisample.png" alt="Multisample" border="0" width="600" height="451" /></div>
<p>In this screenshot you can see the rendering of the pots using off-screen render targets.</p>
<div style="text-align:center;"><img  src="http://gamesfromwithin.com/wp-content/uploads/2011/12/multisample2.png" alt="Multisample2" border="0" width="600" height="450" /></div>
<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&#8217;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>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. <strike>So you&#8217;ll get more of a performance hit with complex pixel shaders</strike>. <b>Edit:</b> My bad. I spaced out and I forgot that MSAA only evaluates the pixel shader once, so performance doesn&#8217;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&#8217;m using some texture combiner operations and several input textures, those pixel shaders aren&#8217;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&#8217;s because I have also stopped supporting arm6 CPUs to keep things simpler (and the market share is minimal).</p>
<p><b>Update:</b> 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>
<tr>
<th>Device</th>
<th>Without MSAA</th>
<th>With MSAA</th>
</tr>
<tr>
<td>iPhone 3GS</td>
<td align="center">39 fps (25.6 ms)</td>
<td align="center">37 fps (27.0 ms)</td>
</tr>
<tr>
<td>iPhone 4</td>
<td align="center">48 fps (20.8 ms)</td>
<td align="center">23 fps (43.5 ms)</td>
</tr>
<tr>
<td>iPhone 4S</td>
<td align="center">60 fps (16.7 ms)</td>
<td align="center">60 fps (16.7 ms)</td>
</tr>
<tr>
<td>iPad 1</td>
<td align="center">60 fps (16.7 ms)</td>
<td align="center">18 fps (55.6 ms)</td>
</tr>
<tr>
<td>iPad 2</td>
<td align="center">60 fps (16.7 ms)</td>
<td align="center">60 fps (16.7 ms)</td>
</tr>
</table>
<p>Of the devices I tested, MSAA didn&#8217;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&#8217;t care how pretty the flowers are, that&#8217;s just not acceptable (and no, I&#8217;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&#8217;s a lot of vector transforms. So if your game is GPU bound, you&#8217;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&#8217;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&#8217;s not something easy to track because it all happens at the driver level, but it&#8217;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&#8217;ll also probably turn it off in the simulator so I can achieve a decent frame rate during development.</p>
<h2>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&#8217;s a no-brainer on the 3GS and iPad 2. I&#8217;m wishing I had implemented it earlier!</p>
]]></content:encoded>
			<wfw:commentRss>http://gamesfromwithin.com/trying-out-multisampling-on-ios/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Duplicating Launchboard Wobble</title>
		<link>http://gamesfromwithin.com/duplicating-launchboard-wobble</link>
		<comments>http://gamesfromwithin.com/duplicating-launchboard-wobble#comments</comments>
		<pubDate>Fri, 30 Sep 2011 19:04:45 +0000</pubDate>
		<dc:creator>Noel</dc:creator>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[flower garden]]></category>

		<guid isPermaLink="false">http://gamesfromwithin.com/?p=1524</guid>
		<description><![CDATA[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 &#8230; <a href="http://gamesfromwithin.com/duplicating-launchboard-wobble">Continue reading <span class="meta-nav">&#8594;</span></a>]]></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.<span id="more-1524"></span>I have to say, I&#8217;m not a huge fan of the wobble movement, but it does indicate that icons are &#8220;loose&#8221; 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>
<div style="text-align:center;"><img  src="http://gamesfromwithin.com/wp-content/uploads/2011/09/garden02.jpg" alt="Garden02" border="0" width="250" height="375" /></div>
<p>Each pot is a UIButton with a custom image (<a href="http://gamesfromwithin.com/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&#8217;s better, but it&#8217;s still not perfect. There&#8217;s an additional extra twitch in the original Apple animation. I&#8217;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&#8217;m using. It&#8217;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&#8217;s what you need to modify. The anchor point is defined in units that are a percentage of the layer&#8217;s size, so by default it&#8217;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&#8217;s position by the same amount in the opposite direction.</p>
<p>This is what the final code looks like:</p>
<pre>
void StartPotWobble(UIButton* button, Random&#038; 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);
}
</pre>
<p>Ah yes, and I couldn&#8217;t find a way to loop the animation infinitely (without using the new UIView animation syntax), so FLT_MAX will have to do <img src='http://gamesfromwithin.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Any cleaner way?</p>
<p>If someone has an animation that more closely resembles the iPhone launchboard, I&#8217;d love to hear about it. Let me know and I&#8217;ll update this post.</p>
]]></content:encoded>
			<wfw:commentRss>http://gamesfromwithin.com/duplicating-launchboard-wobble/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>URL Shorteners In Under Two Minutes</title>
		<link>http://gamesfromwithin.com/url-shorteners-in-under-two-minutes</link>
		<comments>http://gamesfromwithin.com/url-shorteners-in-under-two-minutes#comments</comments>
		<pubDate>Fri, 26 Aug 2011 17:26:09 +0000</pubDate>
		<dc:creator>Noel</dc:creator>
				<category><![CDATA[Game tech]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[flower garden]]></category>

		<guid isPermaLink="false">http://gamesfromwithin.com/?p=1488</guid>
		<description><![CDATA[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. I use the URL shortener in Flower Garden to &#8230; <a href="http://gamesfromwithin.com/url-shorteners-in-under-two-minutes">Continue reading <span class="meta-nav">&#8594;</span></a>]]></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&#8217;t exposing that yet to developers).</p>
<div style="text-align:center;"><img  src="http://gamesfromwithin.com/wp-content/uploads/2011/08/sms.png" alt="Sms" border="0" width="280" height="231" /></div>
<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>.<span id="more-1488"></span>
<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&#8217;s Day Flower Garden promotion. That limit isn&#8217;t public anywhere, and as far as I can tell, I can&#8217;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&#8217;t a particularly popular feature. Unfortunately I don&#8217;t have <a href="http://gamesfromwithin.com/analytics-for-ios-games">good analytics hooked up to that step</a>, but I can&#8217;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 &#8220;Enterprise&#8221; 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&#8217;ll be able to afford the $995/month without a problem <img src='http://gamesfromwithin.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </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>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&#8217;re ready to rock.</p>
<p>Drop this in your app and start shortening away. You&#8217;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&#8217;s never even noticeable.</p>
<pre>
const NSString* GooGlAPIURL = @"https://www.googleapis.com/urlshortener/v1/url?key=YOUR_API_KEY_HERE";

NSString* ShortenURLWithGooGl(NSString* longURL)
{
	NSURL* apiUrl = [NSURL URLWithString:GooGlAPIURL];

	NSMutableURLRequest* req = [[NSMutableURLRequest alloc] initWithURL:apiUrl];
	[req setHTTPMethod:@"POST"];
	[req setTimeoutInterval:Timeout];
	[req setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

	NSString* body = [[NSString alloc] initWithFormat:@"{\"longUrl\": \"%@\"}", longURL];
	[req setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]];
	[body release];

	NSError* error = [[NSError alloc] init];
	NSHTTPURLResponse* urlResponse = nil;
	NSData* data = [NSURLConnection sendSynchronousRequest:req returningResponse:&#038;urlResponse error:&#038;error];
	[error release];
	if (data == NULL || ([urlResponse statusCode] < 200 &#038;&#038; [urlResponse statusCode] >= 300))
		return NULL;

	NSString* response = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
	NSDictionary* responseDict = [response JSONValue];
	NSString* shortURL = [[responseDict objectForKey:@"id"] retain];
	[response release];
	return shortURL;
}
</pre>
<p>I&#8217;m using a <a href="https://github.com/stig/json-framework/">JSON framework</a> to parse the answer, but it&#8217;s so simple I probably wouldn&#8217;t even have to. I only used it because it&#8217;s already part of the project because of <a href="https://developers.facebook.com/docs/guides/web/">Facebook Connect</a>.</p>
<h3>bit.ly</h3>
<p>Even though it&#8217;s not my favorite shortener, I&#8217;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&#8217;s even easier to use than goo.gl. No JSON involved, and you don&#8217;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>
const NSString* BITLYAPIURL = @"http://api.bit.ly/v3/shorten?login=%@&#038;apiKey=%@&#038;format=txt&#038;";

NSString* ShortenURLWithBitLy(NSString* longURL)
{
	NSString* urlWithoutParams = [NSString stringWithFormat:BITLYAPIURL, LoginName, APIKey];
	CFStringRef encodedParamCF = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
															 (CFStringRef) longURL,
															 nil, (CFStringRef) @"&#038;+", kCFStringEncodingUTF8);
	NSString* encodedURL = (NSString*)encodedParamCF;
	NSString* parameters = [NSString stringWithFormat:@"longUrl=%@", [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:&#038;urlResponse error:NULL];
	if (data == NULL || ([urlResponse statusCode] < 200 &#038;&#038; [urlResponse statusCode] >= 300))
		return NULL;

	NSString* response = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
	return response;
}
</pre>
<p><br/></p>
<p>That&#8217;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>
			<wfw:commentRss>http://gamesfromwithin.com/url-shorteners-in-under-two-minutes/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>One Price Does Not Fit All</title>
		<link>http://gamesfromwithin.com/one-price-does-not-fit-all</link>
		<comments>http://gamesfromwithin.com/one-price-does-not-fit-all#comments</comments>
		<pubDate>Sun, 24 Jul 2011 13:00:46 +0000</pubDate>
		<dc:creator>Noel</dc:creator>
				<category><![CDATA[Conferences and events]]></category>
		<category><![CDATA[casey's contraptions]]></category>
		<category><![CDATA[flower garden]]></category>
		<category><![CDATA[sales data]]></category>

		<guid isPermaLink="false">http://gamesfromwithin.com/?p=1437</guid>
		<description><![CDATA[A few days ago I gave a talk at Evolve 2011 (part of the Develop Conference in Brighton, England) titled &#8220;One Price Does Not Fit All&#8221;. The main idea of the talk was the importance of &#8220;flexible pricing&#8221;: Letting players &#8230; <a href="http://gamesfromwithin.com/one-price-does-not-fit-all">Continue reading <span class="meta-nav">&#8594;</span></a>]]></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 &#8220;One Price Does Not Fit All&#8221;.</p>
<p>The main idea of the talk was the importance of &#8220;flexible pricing&#8221;: 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&#8217;s also orthogonal to the concepts of freemium and social games, and we&#8217;re only scratching the surface in ways to effectively implement it in games.</p>
<p>Here&#8217;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&#8217;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&#8217;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><span id="more-1437"></span>
<div style="text-align: center;"><img src="http://gamesfromwithin.com/wp-content/uploads/2011/07/Screen-shot-2011-07-24-at-12.11.23-PM.png" alt="Screen shot 2011 07 24 at 12 11 23 PM" width="498" height="376" border="0" /></div>
<p>Answering questions preemptively: I definitely don&#8217;t think that allowing players to spend the amount of money they want is &#8220;evil&#8221; in any way. And someone during the comment came up with a great point: Isn&#8217;t it more &#8220;evil&#8221; to have players spend $60 on a game, just to find out 10 minutes afterwards that they don&#8217;t like it or it doesn&#8217;t run very well on their system/network?</p>
<p>&nbsp;</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&#8217;s 10 minutes ahead of time.</p>
<p><center></p>
<div id="__ss_8675456" style="width: 425px;"><strong style="display: block; margin: 12px 0 4px;"><a title="One Price Does Not Fit All" href="http://www.slideshare.net/llopis/one-price-does-not-fit-all" target="_blank">One Price Does Not Fit All</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/8675456" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="425" height="355"></iframe></p>
<div style="padding: 5px 0 12px;">View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/llopis" target="_blank">Noel Llopis</a></div>
</div>
<p></center>&nbsp;</p>
<p>[<a href="http://m.slideshare.net/llopis/one-price-does-not-fit-all">Slideshare mobile</a>]<br />
[<a href="http://gamesfromwithin.com/wp-content/uploads/2011/07/Evolve2011_Llopis.pdf">Slides in pdf format</a>]</p>
]]></content:encoded>
			<wfw:commentRss>http://gamesfromwithin.com/one-price-does-not-fit-all/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Flower Garden Featured For Valentine&#8217;s Day!</title>
		<link>http://gamesfromwithin.com/flower-garden-featured-for-valentines-day</link>
		<comments>http://gamesfromwithin.com/flower-garden-featured-for-valentines-day#comments</comments>
		<pubDate>Thu, 10 Feb 2011 19:32:49 +0000</pubDate>
		<dc:creator>Noel</dc:creator>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[flower garden]]></category>

		<guid isPermaLink="false">http://gamesfromwithin.com/?p=1279</guid>
		<description><![CDATA[Two years ago, when I was working on the first release of Flower Garden, Valentine&#8217;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 &#8230; <a href="http://gamesfromwithin.com/flower-garden-featured-for-valentines-day">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Two years ago, when I was working on the first release of Flower Garden, Valentine&#8217;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&#8217;s Day features hoping for a feature by Apple, but Flower Garden wasn&#8217;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&#8217;s Day!</p>
<p><center><img src="http://gamesfromwithin.com/wp-content/uploads/2011/02/valentines_apple_feature.png" alt="Valentines apple feature" border="0" width="600" height="418" /></center></p>
<p>Flower Garden is still going strong, but I wasn&#8217;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&#8217;s a first for Flower Garden!</p>
<p><center><img style="display:block; margin-left:auto; margin-right:auto;" src="http://gamesfromwithin.com/wp-content/uploads/2011/02/valentines_apple_feature_iphone.png" alt="Valentines apple feature iphone" border="0" width="320" height="480" /></center></p>
<p>To make things more interesting, I had been planning on doing a bit of promotion around Valentine&#8217;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><center><img style="display:block; margin-left:auto; margin-right:auto;" src="http://gamesfromwithin.com/wp-content/uploads/2011/02/Secret_Garden.jpg" alt="Secret Garden" border="0" width="256" height="481" /></center></p>
<p>Finally, to round things off, I planned on doing a similar promotion to what I did last year around Mother&#8217;s Day, and I set Flower Garden to be free from today until Valentine&#8217;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&#8217;m also hoping a few media outlets cover the sale to get the word out as much as possible.</p>
<p><center><img style="display:block; margin-left:auto; margin-right:auto;" src="http://gamesfromwithin.com/wp-content/uploads/2011/02/pf_fg.jpg" alt="Pf fg" border="0" width="256" height="481" /></center></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&#8217;ll see how things develop over this coming week. Until then, it&#8217;s going to be an exciting ride.</p>
<p>For the latest news on Flower Garden, join the Facebook page by clicking &#8220;Like&#8221;:</p>
<p><center><br />
<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><br />
</center></p>
]]></content:encoded>
			<wfw:commentRss>http://gamesfromwithin.com/flower-garden-featured-for-valentines-day/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Power Of In-App Purchases</title>
		<link>http://gamesfromwithin.com/the-power-of-in-app-purchases</link>
		<comments>http://gamesfromwithin.com/the-power-of-in-app-purchases#comments</comments>
		<pubDate>Tue, 09 Nov 2010 03:43:43 +0000</pubDate>
		<dc:creator>Noel</dc:creator>
				<category><![CDATA[Conferences and events]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[flower garden]]></category>
		<category><![CDATA[sales data]]></category>

		<guid isPermaLink="false">http://gamesfromwithin.com/?p=1236</guid>
		<description><![CDATA[I finally managed to get through the hotel wifi and upload the slides for this morning&#8217;s 360iDev talk: The Power Of In-App Purchases. Thanks everybody who attended for the great questions and feedback! Session description The common-sense approach to make &#8230; <a href="http://gamesfromwithin.com/the-power-of-in-app-purchases">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I finally managed to get through the hotel wifi and upload the slides for this morning&#8217;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>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&#8217;ll go through lots of detailed real-world data from Flower Garden and other games with strong IAPs.</p>
<p><center><img src="http://gamesfromwithin.com/wp-content/uploads/2010/11/purchases_vs_users.png" alt="purchases_vs_users.png" border="0" width="407" height="262" /></center></p>
<p><b>Presentation slides:</b> [<a href="http://www.slideshare.net/llopis/power-iap">Slideshare</a>] [<a href="http://gamesfromwithin.com/wp-content/uploads/2010/11/power_iap.pdf">pdf</a>]</p>
]]></content:encoded>
			<wfw:commentRss>http://gamesfromwithin.com/the-power-of-in-app-purchases/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Chronicle Of A Failed Experiment</title>
		<link>http://gamesfromwithin.com/chronicle-of-a-failed-experiment</link>
		<comments>http://gamesfromwithin.com/chronicle-of-a-failed-experiment#comments</comments>
		<pubDate>Thu, 04 Nov 2010 16:22:22 +0000</pubDate>
		<dc:creator>Noel</dc:creator>
				<category><![CDATA[iDevBlogADay]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[flower garden]]></category>
		<category><![CDATA[IAP]]></category>

		<guid isPermaLink="false">http://gamesfromwithin.com/?p=1232</guid>
		<description><![CDATA[In the last year and a half, I&#8217;ve written about the different things that I&#8217;ve tried with Flower Garden and their effects on sales. From adding Facebook support, creating a free version, adding in-app purchases, or giving Flower Garden for &#8230; <a href="http://gamesfromwithin.com/chronicle-of-a-failed-experiment">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>In the last year and a half, I&#8217;ve written about the different things that I&#8217;ve tried with Flower Garden and their effects on sales. From <a href="http://gamesfromwithin.com/making-a-living-barely-on-the-iphone-app-store">adding Facebook support, creating a free version</a>, <a href="http://gamesfromwithin.com/making-a-living-comfortably-on-the-app-store">adding in-app purchases</a>, or <a href="http://gamesfromwithin.com/the-power-of-free">giving Flower Garden for free for a limited time</a>. Some strategies worked and some didn&#8217;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><center><img src="http://gamesfromwithin.com/wp-content/uploads/2010/11/gift_this.png" alt="gift_this.png" border="0" width="320" height="128" /></center></p>
<h3>Promo Codes</h3>
<p>Before I can talk about how I implemented the &#8220;Gift This&#8221; 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&#8217;s limited to one user or not (if it&#8217;s limited to one user, the code goes away as soon as it&#8217;s redeemed, otherwise, any amount of users can redeem it).</p>
<p>Here&#8217;s an example of a code I just added (yes, feel free to redeem it in the Flower Shop):</p>
<p><center><img src="http://gamesfromwithin.com/wp-content/uploads/2010/11/promo_code.png" alt="promo_code.png" border="0" width="544" height="55" /></center></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&#8217;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&#8217;t gotten around to implementing that part yet <img src='http://gamesfromwithin.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Here&#8217;s my plea to Apple: <b>Please, please, please, give us an &#8220;iTunes Account ID&#8221; along with the IAP data</b>. 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&#8217;re already doing this with a Game Center ID, so why not with an iTunes Account?</p>
<h3>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><center><img src="http://gamesfromwithin.com/wp-content/uploads/2010/11/gift_email.png" alt="gift_email.png" border="0" width="368" height="401" /></center></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&#8217;re not consumable). Otherwise, someone couldn&#8217;t gift an item they had already purchased, or they couldn&#8217;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&#8217;re consumable, so I don&#8217;t have to keep track of who receives them and restoring them).</p>
<h3>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&#8217;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><center><img src="http://gamesfromwithin.com/wp-content/uploads/2010/11/gift_revenue.png" alt="gift_revenue.png" border="0" width="600" height="397" /></center></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><center><img src="http://gamesfromwithin.com/wp-content/uploads/2010/11/fertilizer_revenue.png" alt="fertilizer_revenue.png" border="0" width="600" height="397" /></center></p>
<p>(That&#8217;s the spike of the new feature plus <a href="http://gamesfromwithin.com/communicating-with-players">the Pocket Frogs cross promotion</a> if you were wondering about it).</p>
<p>I&#8217;d love to know how the Gift This feature on the App Store is working out for Apple. I&#8217;m sure it&#8217;s doing better than my attempt at it, but I&#8217;m going to bet it&#8217;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&#8217;t like to gift? Was it presented badly? Did most people not know it existed?</p>
<p>There&#8217;s no way to know for sure, but my current guess is that <b>people don&#8217;t like to gift something they don&#8217;t already own</b>. 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&#8217;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&#8217;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><br/></p>
<p><i>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>.</i></p>
]]></content:encoded>
			<wfw:commentRss>http://gamesfromwithin.com/chronicle-of-a-failed-experiment/feed</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Life In The Top 100 And The Google App Engine</title>
		<link>http://gamesfromwithin.com/life-in-the-top-100-and-the-google-app-engine</link>
		<comments>http://gamesfromwithin.com/life-in-the-top-100-and-the-google-app-engine#comments</comments>
		<pubDate>Thu, 07 Oct 2010 20:44:21 +0000</pubDate>
		<dc:creator>Noel</dc:creator>
				<category><![CDATA[Game tech]]></category>
		<category><![CDATA[iDevBlogADay]]></category>
		<category><![CDATA[flower garden]]></category>

		<guid isPermaLink="false">http://gamesfromwithin.com/?p=1179</guid>
		<description><![CDATA[A few weeks ago I wrote about using the Google App Engine as a back end for Flower Garden. One of the comments I heard from several people is that the Google App Engine pricing scheme is &#8220;scary&#8221; due to &#8230; <a href="http://gamesfromwithin.com/life-in-the-top-100-and-the-google-app-engine">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A few weeks ago I wrote about <a href="http://gamesfromwithin.com/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 &#8220;scary&#8221; due to its unpredictability. What if your server gets very busy and you find yourself with a huge bill?</p>
<h3>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&#8217;t have to pay anything. However, this last week, after <a href="http://gamesfromwithin.com/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><center><img src="http://gamesfromwithin.com/wp-content/uploads/2010/10/serverload.jpg" alt="serverload.jpg" border="0" width="500" height="264" /></center></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&#8217;s a factor of 10 right there.</p>
<p>Let&#8217;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&#8217;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&#8217;s back down, it&#8217;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><center><img src="http://gamesfromwithin.com/wp-content/uploads/2010/10/charges.png" alt="charges.png" border="0" width="600" height="121" /></center></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! <img src='http://gamesfromwithin.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<h3>Minimizing Bandwidth</h3>
<p>When I first saw the first day&#8217;s bandwidth, I was pretty surprised it was taking up that much. I hadn&#8217;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">&#8220;More Games&#8221;</a> and &#8220;News&#8221; section back to the Dreamhost account. After all, if that server goes down, it doesn&#8217;t really matter, and they can take up significant bandwidth with all the images.</p>
<p>To forward something, I couldn&#8217;t just do it from the configuration file. Instead, I set a handler for the moregames directory like this:</p>
<pre>
- url: /moregames/.*
  script: redirect.py
</pre>
<p>And the redirect script is very simple:</p>
<pre>
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 = "http://flowers.snappytouch.com/moregames/Snappy_Touch_More_Games/More_Games.html"
		self.redirect(url, permanent=True)

application = webapp.WSGIApplication(
							[(r'/(.*)', RedirectMoreGames),
							 ],
							debug=True)

def main():
	run_wsgi_app(application)

if __name__ == "__main__":
	main()
</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&#8217;t know how much that helps with data requested from within an iPhone app, but it can&#8217;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&#8217;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&#8217;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&#8217;ll have to sell many more units of Flower Garden!</p>
<h3>Google App Engine Shortcomings</h3>
<p>Overall, I&#8217;m very happy with the Google App Engine. But it&#8217;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&#8217;t have anything close to 100% uptime. I&#8217;m going to say it probably doesn&#8217;t even have 95% uptime! With such a massive system and all the redundancy underneath, I&#8217;m surprised they can&#8217;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&#8217;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&#8217;ve seen some errors like that in my log every so often. Chalk it up to being a beta I suppose. I imagine it&#8217;s only going to get better with time.</p>
<p>I would still use the Google App Engine for any new game I&#8217;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><br/></p>
<p><i>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>.</i></p>
]]></content:encoded>
			<wfw:commentRss>http://gamesfromwithin.com/life-in-the-top-100-and-the-google-app-engine/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Communicating With Players</title>
		<link>http://gamesfromwithin.com/communicating-with-players</link>
		<comments>http://gamesfromwithin.com/communicating-with-players#comments</comments>
		<pubDate>Thu, 30 Sep 2010 22:42:08 +0000</pubDate>
		<dc:creator>Noel</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[iDevBlogADay]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[flower garden]]></category>

		<guid isPermaLink="false">http://gamesfromwithin.com/?p=1171</guid>
		<description><![CDATA[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 &#8230; <a href="http://gamesfromwithin.com/communicating-with-players">Continue reading <span class="meta-nav">&#8594;</span></a>]]></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&#8217;s great, but how do you get people to notice it. You need to establish some form of communication with your players.</p>
<h3>Update Messages</h3>
<p>The simplest form of communication is through the &#8220;What&#8217;s new&#8221; 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&#8217;t in the app description).</p>
<p>Of course, if you&#8217;re like me and you update your apps only once in a while, this technique isn&#8217;t as effective. Right now my iPhone tells me I have 67 new updates available. I&#8217;m clearly not going to be reading through the release notes of each one.</p>
<h3>In-Game News</h3>
<p><img class="alignright size-full wp-image-673" src="http://gamesfromwithin.com/wp-content/uploads/2010/09/fg_promo.jpg" alt="fg_promo.jpg" border="0" width="250" height="375" />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 &#8220;on your face&#8221; 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>Emails</h3>
<p>Update messages are only good for players who update their apps (ahem, ahem), and in-game news for active players who&#8217;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&#8217;t currently playing it now. They&#8217;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="http://gamesfromwithin.com/making-a-living-barely-on-the-iphone-app-store">with great success</a>.</p>
<p>I&#8217;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&#8217;t miss a chance to join the Flower Garden mailing list</a> <img src='http://gamesfromwithin.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<h3>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>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&#8217;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><center><img src="http://gamesfromwithin.com/wp-content/uploads/2010/09/pf_promo.jpg" alt="pf_promo.jpg" border="0" width="295" height="317" /></center></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><center><img src="http://gamesfromwithin.com/wp-content/uploads/2010/09/fgf_chart.png" alt="fgf_chart.png" border="0" width="367" height="237" /></center></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><center><img src="http://gamesfromwithin.com/wp-content/uploads/2010/09/fg_charts.png" alt="fg_charts.png" border="0" width="367" height="236" /></center></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><center><img src="http://gamesfromwithin.com/wp-content/uploads/2010/09/fg_downloads.png" alt="fg_downloads.png" border="0" width="600" height="420" /></center></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><center><img src="http://gamesfromwithin.com/wp-content/uploads/2010/09/fg_revenue.png" alt="fg_revenue.png" border="0" width="600" height="439" /></center></p>
<p>One consequence I wasn&#8217;t expecting, but in retrospect I&#8217;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&#8217;s because a lot of people who wouldn&#8217;t have downloaded Flower Garden otherwise did it anyway, didn&#8217;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>Conclusion</h3>
<p>Communicating with your players is more than just profitable: It&#8217;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&#8217;t hesitate to run the occasional cross-promotion, especially with other games that are a good match for your target audience.</p>
<p><br/></p>
<p><a name="1"></a>[1] If you <a href="http://ymlp.com/psignup_promo">decide to use them</a> and wouldn&#8217;t mind using my referral code (WQHVUF), I can get a small percentage back.</p>
<p><br/></p>
<p><i>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>.</i></p>
]]></content:encoded>
			<wfw:commentRss>http://gamesfromwithin.com/communicating-with-players/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Customizable Color Sections With OpenGL ES 1.1</title>
		<link>http://gamesfromwithin.com/customizable-color-sections-with-opengl-es-1-1</link>
		<comments>http://gamesfromwithin.com/customizable-color-sections-with-opengl-es-1-1#comments</comments>
		<pubDate>Thu, 19 Aug 2010 18:38:03 +0000</pubDate>
		<dc:creator>Noel</dc:creator>
				<category><![CDATA[Graphics]]></category>
		<category><![CDATA[iDevBlogADay]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[flower garden]]></category>

		<guid isPermaLink="false">http://gamesfromwithin.com/?p=1124</guid>
		<description><![CDATA[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&#8217;s nothing particularly &#8230; <a href="http://gamesfromwithin.com/customizable-color-sections-with-opengl-es-1-1">Continue reading <span class="meta-nav">&#8594;</span></a>]]></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&#8217;s nothing particularly ground-breaking. After all, it&#8217;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&#8217;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><center><a href="http://twitter.com/madgarden/status/20999821267"><img src="http://gamesfromwithin.com/wp-content/uploads/2010/08/tweet.png" alt="tweet.png" border="0" width="300" height="133" /></a></center></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&#8217;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&#8217;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&#8217;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 class="alignright size-full wp-image-673" src="http://gamesfromwithin.com/wp-content/uploads/2010/08/color.jpg" alt="color.jpg" border="0" width="256" height="476" />In modern hardware it&#8217;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&#8217;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&#8217;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&#8217;s express it mathematically. Let&#8217;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 &#8211; M)*t</p>
<p><center><br />
<img src="http://gamesfromwithin.com/wp-content/uploads/2010/08/texture.jpg" alt="texture.jpg" style="padding : 10px;" border="0" width="128" height="128" /><img src="http://gamesfromwithin.com/wp-content/uploads/2010/08/mask.jpg" alt="mask.jpg" style="padding : 10px;"border="0" width="128" height="128" /></center></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&#8217;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&#8217;ll probably want to use the alpha channel to store transparency anyway, so we&#8217;ll keep the mask separate. If not, make sure you encode the image yourself (as raw or PVRT formats) so it&#8217;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&#8217;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 &#8211; M*t)</p>
<p>What did we gain by that? The color is what&#8217;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 &#8211; 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 &#8220;precompute&#8221; those values is just doing it in Photoshop and exporting it as a new png.</p>
<p><center><img src="http://gamesfromwithin.com/wp-content/uploads/2010/08/A.jpg" alt="A.jpg" style="padding : 10px;" border="0" width="128" height="128" /><img src="http://gamesfromwithin.com/wp-content/uploads/2010/08/B.jpg" alt="B.jpg" style="padding : 10px;" border="0" width="128" height="128" /></center></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>
// 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);
</pre>
<p>One more thing to watch out for: Because we&#8217;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>
glClientActiveTexture(GL_TEXTURE0);
glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), &#038;vertices[0].u);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glClientActiveTexture(GL_TEXTURE1);
glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), &#038;vertices[0].u);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
</pre>
<p>That&#8217;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&#8217;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&#8217;ll save that for another time.</p>
<ul>
<li><a href="http://gamesfromwithin.com/wp-content/uploads/2010/08/CustomColor.zip" title="CustomColor.zip">Demo source code</a>. Released under the MIT license.
</ul>
<p><br/></p>
<p><a name="1"></a>[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.<br />
<a name="2"></a>[2] The 3GS allows up to eight I believe.</p>
<p><br/></p>
<p><i>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>.</i></p>
]]></content:encoded>
			<wfw:commentRss>http://gamesfromwithin.com/customizable-color-sections-with-opengl-es-1-1/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>IAP Bundles: More Than Just Good Deals</title>
		<link>http://gamesfromwithin.com/iap-bundles-more-than-just-good-deals</link>
		<comments>http://gamesfromwithin.com/iap-bundles-more-than-just-good-deals#comments</comments>
		<pubDate>Thu, 29 Jul 2010 15:34:28 +0000</pubDate>
		<dc:creator>Noel</dc:creator>
				<category><![CDATA[iDevBlogADay]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[flower garden]]></category>
		<category><![CDATA[sales data]]></category>

		<guid isPermaLink="false">http://gamesfromwithin.com/?p=1072</guid>
		<description><![CDATA[In-game point bundles are nothing new. Even before the time of in-app purchases, Zynga was famous for releasing &#8220;points&#8221; apps to increase your game reputation or other stats. The fact that they released not just one way of getting points, &#8230; <a href="http://gamesfromwithin.com/iap-bundles-more-than-just-good-deals">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-673" src="http://gamesfromwithin.com/wp-content/uploads/2010/07/fg_bundles.jpg" alt="fg_bundles.jpg" border="0" width="256" height="216" />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">&#8220;points&#8221; 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 &#8220;points&#8221; to make progress</a>, we&#8217;re still bundles. Again, I chucked that up to legacy reasons and doing what worked with the standalone apps.</p>
<h3>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: &#8220;I think we might be underestimating how much people are willing to pay for in-app purchases&#8221;. 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 src="http://gamesfromwithin.com/wp-content/uploads/2010/07/werule.png" alt="werule.png" border="0" width="217" height="134" /><img src="http://gamesfromwithin.com/wp-content/uploads/2010/07/wefarm.png" alt="wefarm.png" border="0" width="215" height="113" /><img src="http://gamesfromwithin.com/wp-content/uploads/2010/07/castlecraft.png" alt="castlecraft.png" border="0" width="220" height="193" /><img src="http://gamesfromwithin.com/wp-content/uploads/2010/07/farmville.png" alt="farmville.png" border="0" width="215" height="174" /></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>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&#8217;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 style="display:block; margin-left:auto; margin-right:auto;" src="http://gamesfromwithin.com/wp-content/uploads/2010/07/fertilizer_sales.png" alt="fertilizer_sales.png" border="0" width="567" height="371" /></p>
<p>But now, let&#8217;s look at that same period by plotting revenue (again, only Flower Garden Free, the full version is very similar but it wasn&#8217;t easy to combine the two to display them here):</p>
<p><img style="display:block; margin-left:auto; margin-right:auto;" src="http://gamesfromwithin.com/wp-content/uploads/2010/07/fertilizer_revenue.png" alt="fertilizer_revenue.png" border="0" width="569" height="370" /></p>
<p>Now the two bundles are a lot closer to the single bottle, especially the larger, $5.99 bundle.</p>
<h3>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&#8217;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&#8217;t even normalize them by the number of sales, it would have to be by the number of daily users, and unfortunately that&#8217;s not a statistic that I&#8217;m tracking.</p>
<p>However, I think we can argue two really good points about why bundles are great.</p>
<h4>1. More choice</h4>
<p>Having different levels of bundles give players more choice on how they want to purchase something. From what I&#8217;ve read about buyer psychology, people love having choices when buying something (just don&#8217;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&#8217;s only one.</p>
<h4>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&#8217;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&#8217;ll be using bundles in the future. Players get a good deal, and you get committed players. It&#8217;s a win-win situation.</p>
<p><br/></p>
<p><i>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>.</i></p>
]]></content:encoded>
			<wfw:commentRss>http://gamesfromwithin.com/iap-bundles-more-than-just-good-deals/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Remote Game Editing</title>
		<link>http://gamesfromwithin.com/remote-game-editing</link>
		<comments>http://gamesfromwithin.com/remote-game-editing#comments</comments>
		<pubDate>Thu, 22 Jul 2010 18:00:22 +0000</pubDate>
		<dc:creator>Noel</dc:creator>
				<category><![CDATA[Game tech]]></category>
		<category><![CDATA[iDevBlogADay]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[flower garden]]></category>

		<guid isPermaLink="false">http://gamesfromwithin.com/?p=1053</guid>
		<description><![CDATA[I&#8217;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 simple. One of the &#8230; <a href="http://gamesfromwithin.com/remote-game-editing">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;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="http://gamesfromwithin.com/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&#8217;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&#8217;s the best of both worlds, and although it&#8217;s not quite a perfect solution, it&#8217;s the best approach I know.</p>
<h3>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&#8217;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&#8217;s a line-based, plain-text communication.</p>
<p>The main difference between my debug server and Miguel&#8217;s (other than mine is written in cross-platform C/C++ instead of ObjC), is that I&#8217;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&#8217;s type, any restrictions (such as minimum and maximum values), and a &#8220;pretty name&#8221; to display in the client. Sounds like a lot of work, but it&#8217;s just one line with the help of a template:</p>
<pre>
registry.Add(Tweak(&#038;plantOptions.renderGloss, "render/gloss", "Render gloss"));
registry.Add(Tweak(&#038;BouquetParams::FovY, "bouquet/fov", "FOV", Pi/32, Pi/3))
</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 <img src='http://gamesfromwithin.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<pre>
TweakUtils::AddBool(registry, &#038;plantOptions.renderGloss, "render/gloss", "Render gloss");
TweakUtils::AddFloat(registry, &#038;BouquetParams::FovY, "bouquet/fov", "FOV", Pi/32, Pi/3);
</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&#8217;s within the acceptable range, and applies it to the variable at the given memory location.</p>
<h3>Telnet Clients</h3>
<p><img class="alignright size-full wp-image-673" src="http://gamesfromwithin.com/wp-content/uploads/2010/07/telnet.png" alt="telnet.png" border="0" width="236" height="174" />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&#8217;re connected to. Here we aren&#8217;t connected to much of anything, but I&#8217;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&#8217;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>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&#8217;s exactly what we did at <a href="http://gamesfromwithin.com/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><center><img src="http://gamesfromwithin.com/wp-content/uploads/2010/07/tweaker.png" alt="tweaker.png" border="0" width="542" height="591" /></center></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&#8217;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>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&#8217;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&#8230; it worked. Amazingly enough, I&#8217;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&#8217;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&#8217;s a time-lapse video of the creation of a Flower Garden seed from the tweaker:</p>
<p><object width="640" height="505"><param name="movie" value="http://www.youtube.com/v/j_j9nIQO_B8&amp;hl=en_US&amp;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/j_j9nIQO_B8&amp;hl=en_US&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"></embed></object></p>
<h3>Drawbacks</h3>
<p>As I mentioned earlier, I love this system and it&#8217;s better than anything else I&#8217;ve tried, but it&#8217;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&#8230; 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&#8217;s easy if the tool itself is the editor, but if it&#8217;s just a generic tweaker, it&#8217;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&#8217;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>Future Directions</h3>
<p>This is a topic I&#8217;ve been interested in for a long time, but the current implementation of the system I&#8217;m using was written 3-4 years ago. As you all know by now, <a href="http://gamesfromwithin.com/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><br/></p>
<p><i>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>.</i></p>
]]></content:encoded>
			<wfw:commentRss>http://gamesfromwithin.com/remote-game-editing/feed</wfw:commentRss>
		<slash:comments>35</slash:comments>
		</item>
		<item>
		<title>The Power of Free (aka The Numbers Post #3)</title>
		<link>http://gamesfromwithin.com/the-power-of-free</link>
		<comments>http://gamesfromwithin.com/the-power-of-free#comments</comments>
		<pubDate>Thu, 08 Jul 2010 17:38:53 +0000</pubDate>
		<dc:creator>Noel</dc:creator>
				<category><![CDATA[iDevBlogADay]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[flower garden]]></category>
		<category><![CDATA[sales data]]></category>

		<guid isPermaLink="false">http://gamesfromwithin.com/?p=989</guid>
		<description><![CDATA[It has been two months since the last &#8220;numbers post&#8221;. It covered the Valentine&#8217;s Day promotion, spike in sales, and subsequent settling out at a very nice level. Here&#8217;s a recap of what things looked like at the beginning of &#8230; <a href="http://gamesfromwithin.com/the-power-of-free">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>It has been two months since <a href="http://gamesfromwithin.com/making-a-living-comfortably-on-the-app-store">the last &#8220;numbers post&#8221;</a>. It covered the Valentine&#8217;s Day promotion, spike in sales, and subsequent settling out at a very nice level. Here&#8217;s a recap of what things looked like at the beginning of May (revenue was about $1500 per week):</p>
<p><center><img src="http://gamesfromwithin.com/wp-content/uploads/2010/07/fg_before.png" alt="fg_before.png" border="0" width="650" height="417" /></center></p>
<h3>The Plan</h3>
<p>Mother&#8217;s Day happens at the beginning of May (in the US and Canada anyway, I&#8217;m afraid I was too busy in April and I missed Mother&#8217;s Day in a lot of European countries). I figured it would be the perfect time to do another push.</p>
<p>If there&#8217;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&#8217;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="http://gamesfromwithin.com/">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="http://gamesfromwithin.com/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&#8217;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&#8217;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>Mother&#8217;s Day</h3>
<p>On Saturday May 8th, a few minutes past midnight the day before Mother&#8217;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&#8217;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&#8217;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&#8217;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&#8217;s Day downloads started going down, but they were still pretty strong the following Sunday. Here&#8217;s what the download numbers looked like for those 9 days:</p>
<p><center><img src="http://gamesfromwithin.com/wp-content/uploads/2010/07/fg_week_downloads.png" alt="fg_week_downloads.png" border="0" width="648" height="416" /></center></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><center><img src="http://gamesfromwithin.com/wp-content/uploads/2010/07/fg_week_revenue.png" alt="fg_week_revenue.png" border="0" width="638" height="418" /></center></p>
<p>Mother&#8217;s Day went on to become the biggest day in terms of revenue since Flower Garden was launched. Bigger even than Christmas or Valentine&#8217;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="http://gamesfromwithin.com/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&#8217;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&#8217;s also interesting to notice that revenue didn&#8217;t follow the same drop-off curve as downloads. It wasn&#8217;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&#8217;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>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="http://gamesfromwithin.com/increase-your-app-ratings-on-the-app-store">leave positive rating on the App Store</a>. Now it&#8217;s back up to over 4.5 stars.</p>
<h3>Aftermath</h3>
<p>Now it&#8217;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&#8217;s the revenue since the start of the promotion:</p>
<p><center><img src="http://gamesfromwithin.com/wp-content/uploads/2010/07/fg_two_months.png" alt="fg_two_months.png" border="0" width="649" height="418" /></center></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><center><img src="http://gamesfromwithin.com/wp-content/uploads/2010/07/fg_after2.png" alt="fg_after2.png" border="0" width="650" height="418" /></center></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&#8217;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&#8217;s a breakdown of where revenue came from in the last month (I&#8217;m excluding the period where Flower Garden was free to get a more accurate view):</p>
<p><center><img src="http://gamesfromwithin.com/wp-content/uploads/2010/07/sales_breakdown.png" alt="sales_breakdown.png" border="0" width="332" height="311" /></center></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>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&#8217;m trying to decide the pricing scheme for my next game, and even though free plus in-app purchases is very tempting, I&#8217;m not sure it&#8217;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><br/></p>
<p><i>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>.</i></p>
]]></content:encoded>
			<wfw:commentRss>http://gamesfromwithin.com/the-power-of-free/feed</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Making A Living (Comfortably) On The App Store (aka The Numbers Post #2)</title>
		<link>http://gamesfromwithin.com/making-a-living-comfortably-on-the-app-store</link>
		<comments>http://gamesfromwithin.com/making-a-living-comfortably-on-the-app-store#comments</comments>
		<pubDate>Fri, 14 May 2010 19:12:32 +0000</pubDate>
		<dc:creator>Noel</dc:creator>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[flower garden]]></category>
		<category><![CDATA[sales data]]></category>

		<guid isPermaLink="false">http://gamesfromwithin.com/?p=922</guid>
		<description><![CDATA[A few months ago, I wrote a post analyzing how Flower Garden had done since it was released. It was a story with lots of ups and downs, tales of trials and failure, but ending on a positive, optimistic note. &#8230; <a href="http://gamesfromwithin.com/making-a-living-comfortably-on-the-app-store">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A few months ago, I wrote <a href="http://gamesfromwithin.com/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>Recap and Overview</h2>
<p>Here&#8217;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 style="text-align: center;"><img class="size-full wp-image-816 aligncenter" title="Flower Garden profit" src="http://gamesfromwithin.com/wp-content/uploads/2010/01/Full.png" alt="Full" width="650" height="449" /></p>
<p>And here is how things look now. This plot includes the previous data so it&#8217;s easier to contrast before and after. The area in blue is the new data since the last post.</p>
<p style="text-align: center;"><img src="http://gamesfromwithin.com/wp-content/uploads/2010/05/fg_total.png" alt="fg_total.png" border="0" width="603" height="440" /></p>
<p>Just glancing at that chart makes it clear that that the increase around Christmas wasn&#8217;t a fluke. It actually wasn&#8217;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&#8217;s look at the new data in more detail.</p>
<p style="text-align: center;"><img src="http://gamesfromwithin.com/wp-content/uploads/2010/05/fg_recent.png" alt="fg_recent.png" border="0" width="609" height="446" /></p>
<p>At a glance, there are three, very different sections.</p>
<h2>The Feature</h2>
<p>The first one starts with a significant increase in sales (A), and is in large part due to <a href="http://gamesfromwithin.com/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&#8217;s a nice spike, but it&#8217;s nothing like the x10 spikes other developers have seen with App Store features. That&#8217;s because the Staff Favorite slot, even though it&#8217;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&#8217;m in the minority, so the effect on sales is greatly reduced.</p>
<p>That spike is also in part due to <a href="http://gamesfromwithin.com/making-a-living-barely-on-the-iphone-app-store">my last &#8220;numbers post&#8221;</a>, which happened right at the same time (not completely accidentally). The page attracted about 15,000 views in a few days, so I&#8217;m sure a few of them translated in people checking out Flower Garden out of curiosity.</p>
<h2>Valentine&#8217;s Day</h2>
<p>The second spike isn&#8217;t hard to guess: It&#8217;s the weekend of February 14th, Valentine&#8217;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="http://gamesfromwithin.com/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&#8217;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&#038;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&#8217;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&#8217;s Day had higher profit than the initial release spike back in April of last year!</p>
<h2>Winding Down</h2>
<p>Of course, everything that goes up, must eventually come down. So the weeks following Valentine&#8217;s Day profits went rapidly down. It was at the very end of April that I started working on <a href="http://gamesfromwithin.com/dr-seuss-lorax-garden-up-the-charts">Lorax Garden</a>, so for that period of time I wasn&#8217;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>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 style="text-align: center;"><img src="http://gamesfromwithin.com/wp-content/uploads/2010/05/fg_free.png" alt="fg_free.png" border="0" width="608" height="446" /></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&#8217;s Day (caused by word of mouth, lots of sent bouquets, and the <a href="http://bit.ly/iPhoneValentine">Valentine&#8217;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&#8217;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 style="text-align: center;"><img src="http://gamesfromwithin.com/wp-content/uploads/2010/05/iap_profit.png" alt="iap_profit.png" border="0" width="600" height="414" /></p>
<h2>The Future</h2>
<p>The data for this post stops at May 5th. That&#8217;s because on May 6th I released a new set of seeds and <a href="http://gamesfromwithin.com/flower-garden-is-free-this-weekend-to-celebrate-mothers-day">gave Flower Garden away for free as part of the Mother&#8217;s Day promotion</a>. As soon as the dust settles from that, I&#8217;ll write a third post detailing how it turned out.</p>
]]></content:encoded>
			<wfw:commentRss>http://gamesfromwithin.com/making-a-living-comfortably-on-the-app-store/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Flower Garden Selected As An Apple Staff Favorite Across Europe</title>
		<link>http://gamesfromwithin.com/flower-garden-selected-as-an-apple-staff-favorite-across-europe</link>
		<comments>http://gamesfromwithin.com/flower-garden-selected-as-an-apple-staff-favorite-across-europe#comments</comments>
		<pubDate>Fri, 14 May 2010 03:16:48 +0000</pubDate>
		<dc:creator>Noel</dc:creator>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[flower garden]]></category>

		<guid isPermaLink="false">http://gamesfromwithin.com/?p=916</guid>
		<description><![CDATA[Right on the heels of the Mother&#8217;s Day promotion, Flower Garden just got its second 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, &#8230; <a href="http://gamesfromwithin.com/flower-garden-selected-as-an-apple-staff-favorite-across-europe">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-673" src="http://gamesfromwithin.com/wp-content/uploads/2010/05/fg_europe.jpg" alt="fg_europe.jpg" border="0" width="308" height="200" />Right on the heels of the Mother&#8217;s Day promotion, <a href="http://bit.ly/fg_gfw">Flower Garden</a> just got its <a href="http://gamesfromwithin.com/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&#8217;t picked up your <b>free</b> 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>
			<wfw:commentRss>http://gamesfromwithin.com/flower-garden-selected-as-an-apple-staff-favorite-across-europe/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

