What’s next for 10000000?

 

I’ve been getting a lot of requests for updates on what is happening with 10000000, so here is a sneak peek. The screenshots are all work-in-progresses with placeholder art, so take them with a pinch of salt. but here you go:

 

In the Turn Based Challenge you can take your time to think and complete a dungeon in as few moves as possible

Massive Free Content Update

The only updates to 10000000 have been small bugfixes rather than content, I probably should have been more AGILE and done smaller incremental updates. Lesson learned

But there is an upside to that: a big free content update that really refreshes the game. Importantly: the game still has a clear endpoint where you have beat the game, but when you finish it you’ll be able to refit your probably-now-finished rooms, into rooms that give additional challenges and fun different ways to play the game.

It has full gamecenter integration so you can compare scores with your friends too. I really wanted to have this out by Christmas, but there is so much new stuff I want to make sure its really polished, January then.

Find out lore and stats in the library

Android Version

The android version is pretty very overdue.

There are two reasons really, first It’s really hard to test on android devices because I’ve only got one, which it works fine on, but not so well on others, It means its taken more time to work out the edge cases on different devices to make sure it works.

The other is that I decided to digest all the iOS feedback so the android release fixes those problems. So the android version will include all of this new cool content and fix the major complaints. Woohoo!

 

The Smash Challenge; Test your matching speed to clear your path and evade the zombie chasing you

 

PC/Mac/Linux

The game was actually developed completely on PC ( I didn’t have a mac at the time ) so it plays really well on the desktop. I know some people have been interested in this, and it hasn’t been a lot of work to have it as a more true desktop experience ( wide aspect ratios, scrollbars rather than swipes, etc)

So this is done (sans updates for now)  And should be coming to you soon

 

 

 

 

In Other News

  • You can now get the iconic 10000000 hat in Beavertap’s awesome iOS game Mikey Shorts
  • 10000000 is Puzzle/Word GOTY over at Pocket Tactics Thanks Guys!
  • 10000000 was in the top 50 games of 2012 and won the Best Mobile Exclusive award over at GameInformer. They are also running a poll for the reader’s choice too. How about you vote 10000000 eh? eh? :D

 

On Updating your Game

 

The Story So Far

On mobile devices there is much less finality on what you ship than other mediums. It’s a good thing that you can fix things that weren’t quite right at release, and updates and tweaks are encouraged, but there is some hidden danger there. In fixing a bad, broken feature, I almost lost one of the things that, unintentionally made the game fun.

 

Now that I’ve quit my day job, I’ve actually got time to work on 10000000, One feature that annoyed me at the time I wrote it, but I didn’t have time to fix was what happens when you get to the end of the corridor:

What now?

 

You can see the mechanical reason for needing to do something here If the player is at the end of the corridor, they can’t see anything ahead, we can’t move the character any further and its generally not a good state. In the released version, I got around this by setting it as a “goal” and giving a bonus when the player got to the end:

Excellent?

It didn’t work. One of the most common, and fair complaints is that the player feels like they are being punished for doing well, something I agree with. I tried a simple “fix” and it yielded some surprising results, making the game less fun

 

In The Beginning

To give a bit of background on how the corridor works; your character’s position on the screen, represents the amount of time you have left in the game. It’s not something that fits well with any existing metaphors, so I searched for something to make it fit in with the lore and failed. In the end, I just had to (try) to explain it in a tutorial

The most clear tutorial message in the world

Internally, this is just represented as a float “progress” which is from 0 (failure) to 100 (hurray), with the bonus occurring when the player hits ~90-95 or so.

One thing that came up when playing around with this, is that its a fun experience to be on the cusp of failure and recover and it’s an exciting experience to constantly near failure, but holding your own, so rather than using a simple linear interpolation to map the characters progress to screen position, I used a sinusoidal interpolation.

Linear Interpolation

Current version - Sinusoidal Interpolation. Exciting!

 

Simple Fix

So, I thought the easiest thing to do, is just cap the player when they get past the line and just start incrementing a counter, so long as they stay ahead of the line, that counter goes up.

99 Free Wood.

Now this in itself has some good points, the player is rewarded rather then penalised for staying there, there is an equilibrium that disrupts the player back to a normal state (less warning about upcoming stuff)

But here is where it went wrong: In the original version, there was a great, unintentional tension, everyone I saw, and if I think about it, myself too, would try to get towards the end, but not too far, not enough that you’d get the ‘bonus’ that set you back, but enough to give you the biggest buffer of time, even when you were performing well you were on the edge of your seat trying to maintain an optimum lead.

While the result is bad, the gameplay it creates is great fun.

In the new version, once you were doing well It was just a matter of matching, reacting, and trying to keep your lead. no tension, so much of the game was lost.

 

 

A Solution

I’m trying a varation on that theme now. When you cross the line, you get a counter ticking up. If you manage to stay in front of that line until the counter reaches maximum, you get the bonus, if you cross back over the line on the left side (minus a bit of grace) you get nothing. It motivates you to really stay above that line, the tension is still there, but now its more about falling back rather than falling forward. You also have the nice surprise of seeing what kind of resource you are going to be getting, and a range of values it could be

Ante status: Up

It still wasn’t quite perfect though. Remember that sinusodial interpolation? It worked as a detriment here. 1 point of “progress” translates into quite a lot of z space so when you start losing time you don’t really get much of a visual warning and it feels fast and unfair. I’ve changed it so once you hit the 90% mark you start moving on a second round sinusodial easing.

And the final result (in the case of a failure at least):

Final Version

 

I think this still captures the tension that was there originally, but is much more pleasing to the player.

To try to keep some of the tread-the-edge-of-optimality, if you do complete your contract, you’ll need to move back out and in again to restart a new counter. I’m still not sure whether this captures the original magical tension. I’ll have to test some more.

 

Any feedback? Hit me up on twitter

 

 

So, are you here about 10000000?

Sorry, there isn’t a lot for you to see here.

The truth is that this all kind of happened overnight I woke up this morning to a bunch of messages from friends and found out about @hodapp campaign for 10000000

I’ll put plenty of stuff here, but I’m still at my day job at the moment(!) So in the meantime, here is the official trailer:

http://www.youtube.com/watch?v=TPlkZRqnxUQ

Also, feel free to drop me a line – Luca (at) EightyEightGames (dot) com

Extension Methods in Unity

 

I’ve recently come up with a couple of situations where Extension Methods have been useful when coding in Unity3D. This is intended to be a rough introduction with some practical examples for how to make your life easier. Lets start by talking about

Enhancing Assets from the Asset Store

I’ve been getting more and more things from the Unity Asset Store.

But, imagine the situation where you get a tool that does just not quite what you want, or a little change would make your life a lot easier; or you have encountered a bug.

Usually, you are going to get source access to the scripts when you download something, so you are free to modify them, but even then this presents a problem: When you update to a new version, you’ll lose your changes and have to merge to the new update. a bit of a pain.

We can solve this problem using Extension Methods. By using Extension Methods we can add methods to another object without changing the original file. Let’s work an example.

Recently, I’ve been using the marvelous 2D Toolkit For our last game RollRover, I cut up and managed a sprite atlas myself which ended up taking an inordinate amount of time.  2DToolkit takes away all that pain and then some. It’s well worth checking out.

But, changing the text on a tk2dTextMesh object can be a bit annoying, because you have to do two calls.

   someMesh.text = "Hello World!";
   someMesh.Commit();

The author provides a good reason for this, It means you can change multiple properties, for example, the colour and the text, and not have to calculate the mesh twice, but sometimes, i just want to change the text, and i know i that’s all I’m going to do, and i don’t want to have to call Commit() every time.

So, using extension methods, I can add a new SetText method to the tk2dTextMesh class, so i only have to write one line when calling. I tend to make a new file for extension methods called ExtensionMethods.cs ; you can keep them wherever you want or put them over multiple files as it pleases you. Here is what it looks like:

internal static class ExtensionMethods
{
    public static void SetText(this tk2dTextMesh mesh, string newText)
    {
        mesh.text = newText;
        mesh.Commit();
    }
}

With this code in place, you should see a new method available, on the tk2dTextMesh class, even though there is no such method in that class.

Neato! So how does it work? Let’s break it down.

internal static class ExtensionMethods

The only important particularly important thing here, is the static modifier, the class name doesn’t matter, and you can have it public or internal so long as you can access it from wherever you are calling, but extension methods must be declared in a static class.

public static void SetText(this tk2dTextMesh mesh, string newText)

The important bit here the this keyword. this (at least in this context) is the hint to the compiler that its an extension method, not a regular method. When you call the method, the first parameter is implicit you only provide the second parameter onwards. Underneath, whatever object you actually called the method on is passed in, we’ll see that later.

        mesh.text = newText;
        mesh.Commit();

with that passed in we can now act on the mesh object, in this case we’ll set the text to the second parameter, newText and call Commit()

Now, setting the text is a simpler call:

someMesh.SetText("Hello World!")

When we call SetText, control will flow into the extension method, passing in someMesh as the first parameter, and the method will set the text to the new value and commit the change. Cool.

There is a bunch of neat stuff you can do with this. Another example using 2D Toolkit is setting a sprite – You have to set a sprite to a spriteID but to get the spriteID for a given asset name, you need to call GetSpriteIdByName With extension methods again, you can collapse this down to a single call:

  public static void SetSpriteTo(this tk2dSprite sprite, string spritename)
    {
        var spriteID = sprite.GetSpriteIdByName(spritename);
        sprite.spriteId = spriteID;
    }
        someEnemy.SetSpriteTo("Dead");

 

Improving UnityEngine

Just like you can change things in the asset store without using the source, You can also use this for things that arent quite filling expectations in UnityEngine without even having the source, take FindObjectOfType. a while ago, Unity added a generic implementation of GetComponent but neglected to to do so for FindObjectOfType

The result is having to write an ugly line like:

statTracker = (LevelStatTracker) FindObjectOfType(typeof(LevelStatTracker));

again, with Extension methods we can do better. Lets add a generic version onto UnityEngine.Object

  public static T FindObjectOfType(this Object obj) where T: Object
    {
        return (Object.FindObjectOfType(typeof (T)) as T);
    }

Here we take a generic argument of Type T and return an object of Type T meaning now when you need to find an object of a type, you can simply call it right in the monobehaviour

statTracker = this.FindObjectOfType

 

Another cool thing is that, as users of C# in unity will know, this won’t work:

myGameObject.transform.position.x = 5f;

The reason you can’t do this is that position is a value type, so you would only be editing a copy – useless. But still, this can be a real pain, if you want to just change the x to a defined value you’ll have to do:

        gameObject.transform.position = new Vector3(
            5f,
            gameObject.transform.position.y,
            gameObject.transform.position.z);

which is kinda verbose. So, what we will do is add an Extension Method on the Transform component to let us set it in one line. Here is what the extension method looks like:

 public static void SetX(this Transform trans, float x)
    {
        trans.position = new Vector3(x,trans.position.y,trans.position.z);
    }

which allows us to set our X much easier:

 gameObject.transform.SetX(5f);

 

Other Cool Stuff

Extension Methods can also be used to make fluent interfaces. generally speaking, I hate these, but used sparingly it can make some things much nicer.

For example In the current 2D game I’m working on, I often want to say, i want to say: “move this object over here for x and y, but not for z, use this value for z.” This manifests in code like this:

      buttonOverlay.transform.position = new Vector3(
                      button.transform.position.x,
                      button.transform.position.y,
                      5f);

It can be a bit of a pain because that is quite a common operation.

So using extension methods i can extend the Vector3 struct to make my life easier:

    public static Vector3 OnLayer(this Vector3 vector,float layer)
    {
        return new Vector3(vector.x,vector.y,layer);
    }

So, this is an extension method which attaches to Vector3, and returns a new Vector3 with the first parameter’s X, the first parameter’s Y and the second parameter’s Z. Moving an item is now much cleaner!

buttonOverlay.transform.position = button.transform.position.OnLayer(5f);

 

The idea with a fluent interface is we can create things that read really fluently, in this case it does “Put it at this position on layer X”. Taking the idea further, if we extend Transform with a few extension methods that return the same Transform We can make some operations more fluent

transform = button.transform.OnLayer(5f).WithRotation(Quaternion.Identity).ScaledBy(2f);

Note that fluent != better. I wouldn’t do the above example myself. it violates POLA and I’d count it as misuse/overuse of extension methods.

 

Closing Words

Extension methods are cool, but I’ve seen them misused. They are particularly useful when you don’t have access to the source, or the source is otherwise hard to modify. But (imo) it should be a tool in your box rather than some standard development practice.

Also, in the example of adding a SetX method to the Transform component you might be tempted to add a SetX method to Vector3; but you may end up scratching your head over why it doesnt work. With Vector3 being a value type, we are actually passed in a copy on the extension method, and modifying it will do precisely nothing; Just a gotcha to look out for.

Finally there is nothing really magical about Extension Methods that mean you can do something that you couldn’t do before, but it just makes some things make a bit more sense.

iPhone Piracy Rate

Version 1.0.1 of RollRover was released on the 14th March. It was just a minor bugfix release, but I tried to convince everyone I met to check out my game to promote a little bit. this led to 20 (!) sales. I was pretty pleased. On the 16th though, the amount of users shot up. At first i thought I’d been featured on the appstore or something:

Wow, from 30 lifetime sales, to 638 in a day?

Unfortunatley though, i hadnt become an overnight hundredaire. I’ve set up a google alert for RollRover to keep track of any reviews and the like and it informed me of a cracked IPA out and about on the interwebs.

So, RollRover’s current piracy rate:

1 legitimate : 40 pirate copies.

The amount of pirate copies in one day even dwarfs the total downloads of RollRover Free :

So how does this make me feel?

 

Not that bad at all really. The idea that each of these downloads is a ‘lost sale’ is ridiculous. These people probably would have never even seen my game if not for the fact they could get it for free.

Hell, I’m just pretty stoked people are playing it. I wish people would get it on the appstore to empower me to make more games, but I’m at least learning some good things here. I didnt try to put any copy protection in and I won’t. Its stupid, It will easily be cracked again, and it could just end up hurting the end user.

Looking at the sales it looks like nobody who downloaded the pirate version went on to buy it (even the ones who completed it). So what i can do is try to win these guys over. When you finish the game it asks what you want in the next update, I thought this would be a nice way to democratize the game’s development, The options in this release are ‘More Levels’ ‘Achievements’ or ‘Game Modes’

If we set aside for the moment that the people voting for what they want in the next update havent actually bought the game, More levels is a pretty clear winner. But I’m surprised that people are interested in more game modes, and i’ll definitley be looking at that. Who knows, perhaps i can convert these guys on the next update?

 

- Luca

 

 

RollRover Source analysis

Visualising Code.

A while ago i went to a course run by computer man Kevlin Henney. He mentioned a technique for looking at your code, and seeing whether you’ve been good about coding in your domain.

It involves using Wordle to generate a tag cloud of your source. The larger the tag is the more times you have used that word. If you are coding in the domain your domain concepts should be big and bold. If you are being imperative, you’ll have lots of syntax code in there.

The results are not pretty.

 

Clicky for full size

Not great.

#1 – Keep your privates private! public is the biggest word on there so that probably isnt good mojo. I think there is some leeway here given that the Unity engine prefers publics – you can mess around with them in the inspector then

#2 – Try to have a look for domain words. I can spot a Wheel in the top, and a checkpoint to the right side. I suppose Vector3 is in the domain for a 3D engine

Some Numbers

The total size of the scripted source came in surprisingly low, I guess this shows that you don’t have to do a massive amount of scripting to get a fantastic game wow amazing buy it on the appstore now this is the greatest game ive ever played in my entire life. this game is so amazing i am lost for words. out of unity. According to notepad++

—————————
TextFX
—————————
Words:11314
Characters (no spaces):94421
Characters:136832
UTF-8 Characters:136832
UTF-8 Efficiency:100%
Lines:5023
Longest Line:230
Shortest nonblank line:1
Nonblank lines:4105
—————————
OK
—————————

 

How 2 do it

Its actually pretty simple.

1. First I cat’d together all of the *.cs files together using Cygwin:

find ./ -regex ".*\(cs\)$" | xargs cat > out.txt

2. Opened out.txt, copied it all and pasted into Wordle

3. Pressed Generate

 

Enjoy

 

- Luca

 

Week 1

Hello everybody.

Its now been around a week since RollRover was released so I’ll break down whats new.

First off, we’ve got two reviews up, Both favourable and i agree with there criticisms, thanks alot guys:

http://touchreviews.net/rollrover-iphone-addictive-puzzle-game/

http://www.nineoverten.com/2011/03/10/rollrover-iphone-game-review-not-being-a-pushover-with-excellent-fun/

Neon Highwire, whose excellent features is the main theme for RollRover have mentioned us:

http://www.neonhighwire.com/archives/557

 

Afew bugs have come up since releasing, the most obvious one being if you try to upgrade from RollRover Free to RollRover Full you’ll get a page not found error because i typed the itunes link wrong. my bad! Their[1] is an update with Apple for review that fixes it

 

I’ll surely be publishing some interesting statistics here, so stay tuned. In the meantime if theres anything you want to know drop me a line at Luca at EightyEightGames dot com

 

[1] Problem?

The Last 3 Days

Well whats happened:

First off, RollRover is now deployed in 18 different countries according to iTunes statistics. thats pretty special. Hello my South Korean Friends.

The lite version of RollRover got approved, you can get it here -> RollRover Free

I sent out some promo codes to review sites/blogs. Hopefully that will generate some coverage.

In Review

Received a pleasant email today

Dear EightyEight Games,The status for the following app has changed to In Review.

App Name: RollRover

Hurray.

In other news, I installed wordpress. Its pretty amazing, i don’t know why i’d been fooling around with static html/css or overweight cms systems. this does everything i need and is pretty polished.