Statistics

Now that Rare Earth has been out for a few months, I’d like to take a look at some of the data that’s been gathered from players, as well as reflect on the implications.

Analytics have been a big part of the Rare Earth experiment. I used Flurry for this. It was incredibly easy to implement (they actually have a Windows Phone SDK!) and free.

That said, the service isn’t perfect. For example, according to Flurry, 6308 people have downloaded Rare Earth. Microsoft’s App Hub statistics say the number is 10617. Assuming Microsoft is right, since they control the servers and all, Flurry is missing a full 40% of users.

Even so, the numbers should be good enough to draw some conclusions. Let’s get started!

General

Between 6308 users and 1503 new games, 7811 solar systems have been created

A reported 16660 play sessions

15478 new planets have been created

9359 planets were consumed by stars (judging by some reviews, this often wasn’t intentional!)

79211 asteroid waves have entered, as well as 105450 comets

4840 star upgrades have been purchased

56 stars have reached the end of their lives (version 0.6 introduced stellar evolution, and has only been live for a few days)

Life

379 users have discovered life, and have nurtured its existence on 1024 planets

Beyond the initial required spark to the single-cell organism stage, users have also used the spark to shortcut to:

  • Plant-level 289 times
  • Animal-level 368 times
  • City-level 360 times
  • Space-faring-level 251 times

Curious that people generally skip forward in the middle stages most, rather than the highest level (which takes the most time to advance naturally)

2702 gamma ray bursts have torn through systems with life

1819 of those GRBs have caused mass extinctions

In other words, 67% of GRBs were fatal, which indicates the difficulty for this obstacle is quite high. I’ve received this feedback independently from several players, but this data really crystallizes that

3170 rockets have been launched from space-faring planets (about half of which were planet evacuations)

Only 275 have successfully landed and colonized planets (~9%; perhaps space-faring life is due for an intelligence upgrade?)

Features

6113 orbits have been normalized (a surprisingly popular feature – maybe the standard controls could use with a bit of “assist” if the difficulty is so high that people happily trade valuable earned orbits for more-stable planet orbits?)

A dismal 11 people have clicked on the referral for BuildDown. Is the game not appealing to those in the market for a gravity/life sim/arcade game? Or do people just ignore the About menu? Actually, I can’t tell. I didn’t hook menu transitions, so I don’t have the data to answer that question. Big oversight, and lesson learned for next time!

Other

34101 invaders have made their way into systems

8594 were shot down

I figured a fair number of kills were accidental, as invaders in early versions used to get tripped up around stars and crash themselves.
However, since they were upgraded to avoid stars a few versions ago, the kill rate has actually improved, which shows that the only thing holding players back before was their enemies’ own stupidity

Before the feature was removed, 9383 “orbits for matter” transactions occurred. While a popular option, ultimately it hurt balancing for other orbit-powered features, like life and orbit normalization. Instead, I’m trying other ways of making more matter available to players

The email feedback button was pushed 211 times (my inbox says 72 people went through with it, and I really appreciate all that incredible feedback!)

Even with the inaccuracies, these analytics have been very helpful, providing another dimension of insight to complement the impressive volume of marketplace reviews and feedback emails.

The Bug

Start new game. Exit game. Resume game.
Expected result: Game resumes where player left off.
Actual result: Camera appears stuck inside sun OR game crashes

After Rare Earth 0.1 was released, it wasn’t long before the first bug reports started rolling in. This issue bubbled to the top quickly. However, I was just about to leave on a trip to Europe and only had time for one quick update to the game, so I instead addressed the bug that was getting the most complaints and added instructions.

Maybe being immersed in foreign cultures gave me the idea, but as soon as I got back, the first thing I tried was to change the region format on my phone. Sure enough, I could suddenly repro the bug. Why should the region format matter? Math is the same in any language, and all the game UI treats numbers as invariant culture, specifically to avoid issues like this.

Ah, but I overlooked another point of vulnerability – the game save. Each object in the game is serialized as a collection of XML attributes: mass, radius, etc. For example, a sphere looks like this:

var element = new XElement("Sphere");
element.Add(new XAttribute("Radius", body.Radius));
element.Add(Serialize((Body)body));

…where Body includes universal physics properties, like position and mass. Loading is a bit more nuanced, but ultimately ends up with something like this:

var radius = float.Parse(xAttribute.Value);

This would work fine, if creating an XML attribute and parsing a float defaulted to the same culture format (either both current or both invariant). But if they did, this post wouldn’t exist. My saved attributes always had floats formatted the U.S. English way (e.g. 0.45), but float.Parse apparently defaults to the current culture. In a region format like Italian, 0.45 reads like 0,45 would in English – 45 with some junk in front. So a star that was 0.90 units wide at save time is 90 units wide at load time, which is bigger than the entire game world, which means you’re stuck inside the sun forever. Best case scenario. Worst case, some numbers can’t even be parsed, the load operation fails, and now the game crashes every time. Fortunately, there is a pretty simple fix:

float.Parse(xAttribute.Value, CultureInfo.InvariantCulture);

I could alternately serialize my value types to the current culture by hand, but that could have other consequences, so I stuck with the simple fix.

Ultimately, it’s a pretty embarrassing mistake, but I learned a valuable lesson about testing my game for an international audience.