Tuesday, September 17, 2013

Cross-platform puzzle game animation architecture

I'm playing around with a puzzle game. The goal is simple. I want to see how much code I can put in a cross platform portable library to be shared. I also should say that I'm using Xamarins stuff and MonoGame.

Short story

Create a core-library that uses coordinates that you later on resolve to actual pixels on the device. Decouple from screen resolutions early on and handle animations in the shared library. The platform-specific code should just act as a view.

Longer story

I started out creating what I usually call the Core-library. In this library all the shared stuff is pushed into. The game (not important) is a simple three-in-a-row-with-a-twist kinda game. That means that it has a grid defined in the core library. On top of that we have a Controller that handles your selections by evaluating them and finally telling you if its a valid selection.

All of the above was simple enough. The problems started when I was going to create animations. For example, when combining elements, I want them to animate nicely into a common point. How do I pull that of without having to write a lot of platform specific code?

My approuch to solve that was to create a MoveReport that has MoveItems in it. It simply tells the UI how stuff in the UI is supposed to move. It doesn't tell you exact pixel positions, rather grid positions and an interpolation value.

The MoveReport is a class with two properties

    IsSuccessful : bool 
    Items : List<MoveItems> 

The MoveItem

   From : Position
   To : Position
   FrameNumber : int
   ElementIdentifer : string

The To and From Position is integer-based grid positions. The FrameNumber describes in what frame the animation will be active and the ElementIdentifer describes which element (game specific stuff) to draw.

To govern the animation I created an AnimationController that keeps track of the current animation frame. The blocks ask this controller of the current state of the block and draws whatever the animation controller hands over. The only thing the UI code need to do is to translate the interpolation value into real pixel coordinates.

The UI needs to tell the grid what we selected. If the selection is valid, start an animation.

private void HandleSelection()
{
    // _currentSelection is a List of grid positions {0,2}{0,3} and so on
    var report = _grid.Select( _currentSelection );
    if(report.IsSuccessful)
    {
        // Start the animation and let each frame be 100 milliseconds long. That means that
        // moving one item between to cells will take 100 milliseconds.
       _animationController.Start(report, 100); 
    }
}

On Update the controller is poked

private void Update(GameTime gameTime)
{
    if(_animationController.IsRunning)
    {
        _animationController.Update(gameTime.ElapsedTime.Milliseconds);
    }
}

The UI then draws each block in turn

public void Draw(SpriteBatch batch)
{
     if(_animationController.IsRunning)
     {
          var desc = _animationController.GetAnimationDescription( this.Position );

          if(desc!=null)
          {
              var pixelPosition = ResolvePosition( desc );
              var texture = TextureHelper.ResolveTexture( desc.ElementIdentifier );
              batch.Draw(texture, pixelPosition, Color.White);
              return;
          }
     }
     
     // Draw regular stuff - simplyfied
     batch.Draw(this.Element.Texture, ResolvePosition(), Color.White);
}

The GetAnimationDescription takes a grid position, for example {0,3}, and returns a description of what to draw.

public class AnimationDescription
{
     public Position From;
     public Position To;
     public float LerpValue;
     public string ElementIdentifier;
}

The AnimationController is updated each frame with the number of milliseconds passed since last update and advances an internal framecount to be able to feed the blocks with the description-objects. When the last frame is passed it sets the IsRunning to false to return to basic drawing.

Well, this is just a basic outline. Kinda messy. I'll clean it up if anyone's interested in details :)


Thursday, August 29, 2013

Paying users play more

I've been running an experiment on WordRoom for iOS since the launch. At first we charged for the app and the usage from iOS numbers rose to the top compared to the other platforms. A month later we desided to release WordRoom for free. The result of this move, after an initial peak, was that usage dropped way below the other platforms.

I was sure this was just a coincident and left it free for the entire summer. Usage numbers dropped to below 5% iOS.

With nothing to lose I switched to a paid app once again and the players who buy the app return again.

My thesis from the beginning of the project seems valid in a non-statistically secured way. Players who pay for an app, even if it's just 99 cents, play that game a lot more since you don't want to uninstall a paid app.

Tuesday, June 11, 2013

Azure Servicebus and Topic Subscriptions

This post is about getting your subscriptions deleted if you are using AutoDeleteOnIdle on the subscription.

SHORT STORY:

If your topic subscriptions gets deleted, send a dummy message to the topic every half hour or something.

LONG STORY:

This is just a little tip. If you're using Azure Servicebus and subscribing to topics using a autogenerated subscription name you have to make sure that the subscription is deleted when it goes out of scope. Since the service bus is disconnected by design it's impossible for Azure to really know when you subscription is invalid.

Luckily the greats guys at the Azure team thought of this and introduced the AutoDeleteOnIdle-property for you to use.

This property is set when you create a subscription. In the example below set the AutoDeleteOnIdle to one (1) hour. This means that if the client is not in an active call to receive within one hour, the subscription is deleted, saving the total message count and your hard earned cash.

The code below creates the subscription. Keep track of your subscription Id. In this example it's a guid but you can really use any string.

var manager = GetNameSpaceManager();
_subscriptionId = Guid.NewGuid().ToString();
var description = new SubscriptionDescription(topic, _subscriptionId);
description.AutoDeleteOnIdle = TimeSpan.FromHours(1);
manager.CreateSubscription(description);

After the subscription is created we need to receive some messages. There are several ways to do this, but in my example I use the blocking Receive-method. That is, run this on a background thread and when a message arrives, raise an event, create a worker or do what-ever to handle it. Also, replace <T> with your expected message type or create a generic handler.

while(_running)
{
    if (_subscriptionId == null)
        break;

    var message = client.Receive(TimeSpan.FromMinutes(30)); 
    if (message != null)
    {
        var body = message.GetBody<T>();
        // Do stuff with message
        message.Complete();
    }
}

However, this will not work as expected at the moment. The docs and my communication with Microsoft says that this will work but the subscription will be deleted sooner or later.

The work-around that I implemented is that I send a dummy message every half hour to the topic. This seems to keep the subscription alive as intended.

Wednesday, May 29, 2013

What kinda game would I like to make?

I know what kind of game I want to create. Or rather, I know what kind of feeling I would like to have when I play that game that I've created.


I want a game that starts with micromanagement and continues on to macromanagement with the possiblity to dive into the details if I’d like to. The game should live online and evolve when I’m not in it, it should notify me when something important happens and it should let me high-level-manage it from outside the game universe.


I’m thinking of a game that let’s you create the machines that refine your resources. Trade with other players and even work for other players by selling the machines that make the stuff.


It should be a multiple screen game that morphs function after available screen size. It should be snappable in Windows 8 and look like a business app in order to fool you boss.


The graphics should be dark to highlight the fact that this is a cruel and competitive universe. Features should be added but not communicated to add to the feeling that there´s always something new to be found.


There shall be no predetermined missions and no guided gameplay. Definitly no story to follow.


You make the story by interacting with other players.


All I need now is a year or two to finish it in...


Thursday, May 23, 2013

Creating a multi-language, multi-platform game - the outline

So our first game is a multi-language, multi-platform product. How do you pull that off with close to zero resources and a full-time day job? The list below outlines the most important steps that we've discovered during the last year. You may notice that marketing is missing and that's because we haven't got that far yet. All our users are basically by referal. We also belieive in a rock solid experience before we use the big drums.

Here we go!

  • Find a creative partner - we paired up with Microsoft and took advantage of their BizSpark program. Also their technical evangelists do a hell of a job to inspire us by providing technical excellence. This is the most important step I would say! Especially thanks to Tess Ferrandez (@TessFerrandez) and Peter Bryntesson (@petbry57) who was our first contact with Microsoft! Also there is a lot of other great people helping at Microsoft helping us out.
  • Get local help - to enable multi-language support we started our ambassador program. That means that you as an ambassador can adopt a language and get 10% of revenue generated from that language. We are based in Sweden, we have no concept of what word lists that we can use in Spain. You need someone with a local connection. We manage our contacts with our ambassadors through a private facebook group. Doesn't have to be fancy. Give regular feedback.
  • Don't be alone - start the company with someone else. This will get you motivational support. It's a great feeling to see checkins from other people and to know that the product is moving forward even when you're not in front of the computer.
  • Statistics - Create tracking system or use one of the free available ones, such as PlayHaven. It is absolutly critical that you have a grasp of what your players are doing in your game. This topic is a book on it self.
  • Prepare for a large number of users - if your game is dependent upon a backend then you must design it to be able to scale up to 100 000 daily users. If you don't your pretty much doomed from the beginning. We use a load balanced Azure farm to take care of our gamers.
  • BETA TEST - Always beta test. Even if you're 100% sure that this is the best thing since sliced bread. Force your friends to play it and hang out on forums to drag total strangers into your beta process. The strangers are usually the best critics since they have no connection to you what so ever. Remember to listen to everyone, but you always have the last say yourself.
  • Documentation - Fire up a wiki to share info among developers and make sure to document as you go along. We used a simple prepackaged azure website and incentive. Free for up to three users.
  • Blog - Write about your experiences to get a distance to what you are doing.
I'm sure I've forgotten something, but hey, I can always add it later on.

If you're an indie developer yourself I would love to here your comments on this!

Friday, May 17, 2013

Got motivation?

This will be a short, spontaneous post about the importance of beta testers. While drinking my morning coffee, minding my own business, I got a mail...

"You have been challenged in WordRoom by Karl-Henrik Nilsson"

That sentence really made me happy! (strange since I wrote the template myself)...

I played my part of the match, lost and started to chat with Karl-Henrik instead. He gave me about 10 new points on how to improve the game right of the bat! This kind of feedback really energizes me since it gives me an opportunity to fix problems and be able to make a better version of WordRoom that is based on someones perception of the game! And it's always those tiny, small things that will make or break your game.

The point of the post is to invite testers early. Invest your time in people that will help you back and stand ready to return the favor!

And follow KH on twitter @KHNilsson for good insights into the IT world.

Wednesday, May 8, 2013

The 15-minute project

I get this question a lot.

"You work full time at Sogeti, got two kids at home and a house to tend to. How do you find the time to create and maintain a multiplatform game?"

The answer to this question is simple. Use all the available time you got! If you have 5 minutes on the bus, use it to correct a tiny piece of code, perhaps refactor something? Seven minutes at breakfast? Perfect! Write a todo-list! And the golden 15 minutes after lunch, use them to kill an item off from the breakfast todo-list. Think of it this way, if you manage to get half an hour of administrative stuff done during the day, it's half an hour less when you sit down for a longer session.

The bulk part of development happens at night between 9pm and 11pm. Usually every night. It also keeps my wife happy since she can watch whatever TV-show she wants to. :) At this point, I'm pretty clear on what to focus on since I've already made my mini-sprint backlog during the day.

But what's more important is to try to be happy with the fact that something got done today. It doesn't matter  if you only found five minutes in a day to work on your project because something got done! You are getting somewhere!

Also, try not to steal family time to develop your free-time-project. It DOES NOT work in the long run. Spend time with your kids!

Sensmoral


The sensmoral in this is that all of these tiny dev sessions really add up. Get small stuff out of the way during the day (like planning and minor refactoring) to clear the path for the two hour nightly development session!

To sum up


The golden 15-minute project rules:

  • Use small fractions of time to organize stuff. Less than 5 minutes available? Write todos on a post-it and attach to forehead).
  • Medium sized timeslots, up to 15 minutes? Open your code and refactor or just browse it. It will help you find your way around it for the late night dev session.
  • Prepare for the 1-2 hour nightly dev session during the day! Make sure you know what to do!
  • Force yourself to sit down at night, the first 5 minutes sucks. If you can't find inspiration after that, sit five more minutes. Fix just one thing more!
  • Spend time with your family! They are only kids once.

Friday, May 3, 2013

GAH - "unable to build project output 'content files from WebApplicationName"

I'll split this post into a short/long story in case your searching for any tips on how to fix it and don't wanna hear me rant about it.

Short story

* Error on setup build "unable to build project output 'content files from WebApplicationName"
* Followed Mr Hanselmans instructions at http://www.hanselman.com/blog/VisualStudioMSIProblemsUnableToBuildProjectOutputGroupContentFilesFromSOMEWEBActive.aspx
* Edited the project file - removed all content references
* Readded each content file in Visual Studio.
* Everyone's happy

Long story

Alright, so I'm sitting at work. Happily coding in VS2010, creating a small web-app for my client. Following the corporate install routines and creating a Web Setup project. Everything is perfect. With less than an hour left on the project it all goes to %¤#%.

My setup project doesn't build anymore. It just keeps saying "unable to build project output 'content files from WebApplicationName". Why, oh why can't you just print out the name of the file that is missing?

A quick internet search brought me to Hanslemans blog, a post from June 22, '04. You would think they would have patched this and at least created a better error message in 9 years?

http://www.hanselman.com/blog/VisualStudioMSIProblemsUnableToBuildProjectOutputGroupContentFilesFromSOMEWEBActive.aspx

Yup, files we're missing on disk. Thinking back it might have been when I tried the Install/Uninstall option you get when right-clicking your setup project.

Restored the files again, but STILL got the error above. Spent another hour painfully checking each file in the project files content group. File by file... Nothing missing, it's all on disk.

Recreated the setup project. Still the same error. Restored my code to a point in time where I know that it worked. Still the same error.

What I ended up doing was deleting every content reference in the project file and readded them in Visual Studio. Seems to work now... For the moment...


Thursday, May 2, 2013

Design by statistics

WordRoom has been live for roughly seven months now, from the launch of Windows 8 in october 2012. We've learned a lot on the way but the most important lession is that of statistics. You need to know what your users are doing in the game. In this post I make an mini-analysis of the startpage on iPhone and Windows Phone.

iPhone


For example, iPhone users play longer sessions than any other platform. The wierd part is that they favor single player. They simply hit the large "Single player" button on the start page and ignore the multiplayer part. What we could do is try to educate the users by adding some more info to the startup-guide or rephrase "tap to challenge" or color it differently to stand out.



Windows Phone


WP users on the other hand play a lot online in direct matches. Most definitely because the online button is the first thing they see when they log on. When they press "start a new game" they are passed on to the online page. There is simply no way to know that the single player is tucked away in the panorama item to the right.


By tracking the usage we can make small changes to a platform and evaluate the result. By having WordRoom on five different platforms gives us the possibility to make minor adjustments to one platform and evaluate a change before we go live with the rest.

This is just two out of five platforms available. Each having their own usage patterns.


Tuesday, April 16, 2013

Adding Mobile Service to Whack-a-bug - PART 1

In a weak (beer influenced) moment on the Microsoft Windows Azure Gaming Summit on April 9th I promised someone that I'd make a point out of how simple it would be to add an online hiscore list to my development tool/game called "whack-a-bug". Since I'm a man of my word I sat down and did so. In less than an hour.

Whack-a-bug is a game, designed and constructed within 8 hours just to prove a point that developing for Windows Store is easy and deployment is fast.



"The game is very simple, whack those bugs and avoid destroying unit-tests."

The features I added was the ability to post your score to an online hiscore-list if your sprint is successful. Authentication will not be included in this first post but my plans are to incorprate that in a subsequent post.

So the outline of my work is

  • Create a Mobile Service
  • Wire up Whack-a-bug to that Mobile Service
  • Post data to a hiscore-table
  • Retrieve the hiscore list
  • Play the game!


And YES I know, since we are not adding authentication, anyone can post using any name at the moment. :)

Create a Mobile Service


The process is pretty straight forward. I browsed to http://www.azure.com and sign in (create account if necessary).

I selected "MOBILE SERVICES" on the left and clicked "CREATE NEW MOBILE SERVICE". The dialog below appeard and I simply typed in whackabug as the URL. A also chose to create a new database, you can also select an existing database. Lastly, I set the region to East US.

The service is then created for you. It takes less than half a minute to have it up and running. When it's done it looks this.


Wire up Whack-a-bug to Mobile Services


It's very simple to wire up you application. Just select the platform you are interested in and read the instructions. In my case it's a Windows Store app and I've already installed Mobile Services SDK. The SDK is also available on nuget.

What I did was to copy the codesnippet to my project as described.


Post data to a hiscore-table


Mobile Services is configured default to accept dynamic schema. That means that we just have to create a simple POCO with our required fields. But you do need to create the table in the portal. I created a table called "HiscoreEntry". The name is important to remember since you need to create a POCO class with the same name.


In the Create New Table dialog you enter the name of the table and then set permissions. For the first part of this blog series will just allow any application with the correct application key to perform any CRUD operation. The application key is a long string that I masked out in the code snippet we copied in the step before.

The POCO I created looks like this.

 public class HiscoreEntry  
 {  
   public int Id { get; set; }  
   public int BugsKilled { get; set; }  
   public string Username { get; set; }  
 }  

Simple enough! One thing worth pointing out when using dynamic schema is that you must provide a value for nullable types, like string. Otherwise the serializer will serialize this as JSON object with the value set to null. Mobile Services cannot create a column based on null since it wouldn't know the type. Check out this blog post for some more info around this specific tip: http://timrayburn.net/blog/working-with-dynamic-schema-in-azure-mobile-services

Well, back to Whack-a-bug. The UI needed to be modified. I added a textbox for the username and a button to submit the score to the game over control. These are only displayed if the sprint was successful. We also check that we have entered something in the box before posting it.

The post method looks like this:

 private async void SubmitScore(string username, string bugsKilled)  
 {  
   var item = new HiscoreEntry()  
   {  
     Username = username,  
     BugsKilled = bugsKilled  
   };  
   var table = App.MobileService.GetTable<HiscoreEntry>();  
   await table.InsertAsync(item);  
 }  

Error handling code is omitted for the sake of simplicity. But you should wrap the insert in an exception-handler.

Retrieve the hiscore list


I needed a placed the hiscore list in a UserControl with the pinned note background. The data is displayed in a grid. After that I wrote some code to retrieve the hiscore list. For this we need to query mobile services for the top eight players. Why eight? I didn't feel like redrawing the background! :)

I also make use of the wonder that is await/async when I populate the data into the grid.

 public async void ReloadData()  
 {  
   var table = App.MobileService.GetTable<HiscoreEntry>();  
   var list = await table.OrderByDescending(e => e.BugsKilled).Take(6).ToListAsync();  
   HiscoreListView.ItemsSource = list;  
 }  

The HiscoreListView is a simple ListView with an ItemTemplate defined like below.

     <ListView x:Name="HiscoreListView" Width="200" Canvas.Left="59" Canvas.Top="66">  
       <ListView.ItemTemplate>  
         <DataTemplate>  
           <Grid Width="170" Height="30">  
             <Grid.ColumnDefinitions>  
               <ColumnDefinition Width="1*"></ColumnDefinition>  
               <ColumnDefinition Width="1*"></ColumnDefinition>  
             </Grid.ColumnDefinitions>  
             <TextBlock Grid.Column="0" Text="{Binding Username}" FontSize="18" Foreground="Black" />  
             <TextBlock Grid.Column="1" Text="{Binding BugsKilled}" FontSize="18" Foreground="Black" TextAlignment="Right" />  
           </Grid>  
         </DataTemplate>  
       </ListView.ItemTemplate>  
       <ListView.ItemContainerStyle>  
         <Style TargetType="ListViewItem">  
           <Setter Property="Height" Value="30" />  
         </Style>  
       </ListView.ItemContainerStyle>  
     </ListView>  

That's it!



You can download it by clicking on this link!

Of course, the obvious problems with this example is that we don't have any error handling and no user authentication. The error handling will be added before I submit the final version to the store. When I do so, I'll edit this post and add what I did below.

Wednesday, April 10, 2013

Microsoft Windows Azure Gaming Summit

Just got home from an amazing event at Heathrow. The visit started of with some beer in the bar the night before the offical event. Had a great talk with Peter Warman, CEO of Newzoo. That guy know what he's talking about and opened up my eyes on the importance of market analysis. His talk at the summit the day after was even better! Might have been the best talk of the event.

Rob Craft from Microsoft also delivered a great talk about the cloud and games. It amazing to watch the transformation of Microsoft to the open alternative that it is today.

Also a couple of sneak previews of some great upcoming games, like Galaxy Fire and League of the Damned.

And what I would see as one of the coolest games out right now, Galactic Reign from Microsoft Studios. Check it out!

I also promised at a week moment to write a blog post of how easy it would be to start using mobile services by adding a leaderboard to my game Whack-A-Bug (created in 8 hours to test out the Windows Store Certification experience). So I'd better get started on that aswell.

Also we got a lot of new input on the subject of our game WordRoom and where we should take it in the future.

Friday, April 5, 2013

TFS, Git and Xamarin Studio (on Mac)

Two things that could be handy to know if you are trying to use TFS Git and Xamarin Studio on Mac.

1. The username cannot contain @
2. If you mistype your password, you have to remove the keychain entry (http://forums.xamarin.com/discussion/2514/change-version-control-credentials#latest)

Both will fail with an UnauthorizedException and no further info.

And for the first part to work you must specify an alternative login. This is well documented when you've created your repository however.

EDIT: Still some trouble with pushing to remote GIT. Everytime I want to push I have to:

 1. Delete the keychain entry
 2. Enter my credentials
 3. An error message is displayed, but the changes are pushed anyhow

Hopefully this will be fixed in the 4.0.4 release!

Thursday, April 4, 2013

Accessing non-Mobile Services tables in Server Scripts

This is a useful how-to if you are using Mobile Services as an addition to an already existing system. When setting up Mobile Services you need to specify a database. If you specify an existing database you can access the data from the tables within it but you must allow access to the Mobile Service user.

The problem is that you cannot use SQL Server Management Studio's nice graphical tools to do so since this is Sql Azure. It's time to write some queries!

Prereq - you are familiar with Mobile Services Server Scripts. If not, check out this great video from Nick Harris.

http://channel9.msdn.com/Series/Windows-Azure-Mobile-Services/Windows-Store-app-Validate-and-Modify-Data-with-Server-Scripts-in-Windows-Azure-Mobile-Services

The Scenario

Let's say you have a table in Mobile Services called Notification. (The tables are named directly after the POCOs, hence no pluralization at the moment). The main function of this table is to allow us to intercept insertions to it and send out notifications.

What we also can do is to query other tables within this script.

    var sql = 'select Name from Users where Id = ?';
   
    mssql.query(sql, [item.UserId],
     {
         success: function(results) {
              console.log("The name is " + results[0].Name);
         },
         error: function(error) {
             console.log('Error querying sql: ' + sql, error);
         }
     });


If you run this directly you will get an access denied message looking like this:

Error querying sql: select Name from Users where Id = ? { [Error: [Microsoft][SQL Server Native Client 10.0][SQL Server]The SELECT permission was denied on the object 'Users', database 'YourDatabase', schema 'dbo'.] sqlstate: '42000', code: 229 }

The fix is to grant rights to this user.

Step 1 - Identify the Mobile Services user


Open Sql Management Studio and select the database (in this case 'YourDatabase' in lack of better example naming.

Run

select * from sysusers where isSqlUser = 1 and hasDbAccess = 1

This will return a number of users. Look for the one having a name simular to AMJCKxGdWNLoginUser. (a bunch of random letters and the LoginUser).

Step 2 - Grant rights to this user


GRANT SELECT ON Users TO AMJCKxGdWNLoginUser

THAT'S IT, you are good to go!

In addition, if you need to insert or delete data then grant the appropriate permissions.
 

Tuesday, March 19, 2013

Game complete - todo: get rich;

This post is about something that most indie gamedevs suck at. Marketing... Or really what to do before marketing. Our game WordRoom is completed and shipped to four platforms with a common Windows Azure based back end. There will always be updates and new ideas, but the game is playable and most bugs are killed off.

We have a constant stream of new players and in this volatile online environment most of the try it once and disappear in the search for a game that suits their preferences better. That's perfectly fine, our game is a niche game for word gamers. The number of played minutes per day stays pretty much constant. Of course we want the numbers to increase, but how do we do that?

As I see it we have several ways to increase the amount of minutes played.

Try to keep players

 

The first way is to try to keep players to stay and one way to do that is to merge a small amount of social gaming into this game. In the current version we have a chat but it only works for the Windows 8 version due to the restriction of screen space on mobile devices. The players are pretty much cut of from each other apart from the gameplay itself. There is also no way to mock your opponents, like posting it to Facebook. This is something that we will have to add.

We have a new secret social feature being developed right now that will help to keep players around.

However, there is a very special kind of players, the POWER PLAYERS that play a lot. These are the people we need to reward. Some of them even posts new word lists to us. An idea is to create a reward system within the game so that you perhaps earn rank every time someone plays a category that you created.

Yet another feature is badges and achievements.

All of the above boils down to communicating back to the user. That is what we need to improve!

Advertisement 

 

After all the above is fixed, we need to advertise. This is where our skills are next to zero. I don't know how to market a game or where to place the ads. Also the amount of cash we can spend here is limited. We have been pondering a lot about alternative marketing, such as funny Youtube videos and so on. Anyhow, this is where we need to improve, big time...






Monday, March 18, 2013

Artifical value

I have an ongoing experiment. We have a game called WordRoom that is supported on four platforms. Three of those are free (with ads) and one is $1 for a download. The platform we charge for is iOS.

My thesis is:

"By paying for a game, you are less likely to uninstall it since you've created a fictional value. By uninstalling the game you'll feel that you've thrown you money away and/or admit a bad decision".

My data is not statistically secure yet but it points towards that our iOS users have the highest return rate of all platforms.

The experiment goes on...

The other platsforms are Windows 8, Windows Phone and Android.

Monday, March 11, 2013

More polish - all that extra

Looking at WordRoom, we are closing in on a final set of features that we want to include. One new *secret* feature is under development and will be shipped in the Windows 8 version first and then ported to iOS, Android and WinPhone. Why Win8 first? Simply because we find it to be the easiest ecosystem to develop for and the certification time is only hours.

Are we done then?

Putting aside the fact that we always need new word lists and languages, we still have to continue to polish the game. Adding animations, sounds and fine tuning the graphics and such stuff. The new iOS version, for example, is a complete graphical remake. Every image is pixel perfect and nothing has to scale. The next update will focus on bringing more animations into the game. Like dust and smoke when you get your stars and perhaps achivements. I think people are more likely to return if the package looks good.

It's very satifying to have reached this stage of the project and somewhat scary to realize that the actual gameplay part of the game is so small compared to the polish...

What do you think could be added to the game that would fall under the categories of 'polish' or 'extras'?

Thursday, March 7, 2013

Polish your game, programmer art style

This is just a short reminder of how important it is to polish your game. To begin with, I'm a programmer. I make programmer art. If you are a designer that would like to contribute to WordRoom (4 different clients and styles), please contact me!


Before polish number 1
The first image is the original iPhone version released about a week ago, in the beginning of march. It has kind of a design, but I'm not really happy with it. The buttons are different heights and since I'm using a generic background image, the edges are blurred. The icon used to represent a player looks just plain bad.

I needed to take this one step further. So what I did was:
  • Fixed margins on each side. Aligning the logotype and buttons to those margins
  • Created pixel perfect button backgrounds for each width and with a common height
  • New User icon. This will later be replaced with avatars in the near future.
  • Tried to balance the color scheme to get a balance between the buttons and background.
After polish number 1
My next step is to pass this around to get comments and tweak it a little more. After that I'll have to implement the new style on every layout in the game.

What do you think? And please remember, this is programmer art...

Monday, March 4, 2013

The experiment has begun!

As stated in a blog post earlier, WordRoom for iPhone is an experiment. The thesis to prove is that iOS users in general are more generous than any other platform users. I believe this is true.

Exibit A - myself

I try to use different platforms whenever possible and iPhone-using-me bought apps all the time. Mostly games for my son, but still I bought them. I never argued about 99 cents.

Exibit B - bad model in Microsoft Store

Microsofts store offers trials. That's great for the consumer but not so much for the developer. A lot of people will buy an app for 99 cents to try it out. Microsoft removes that business from developers and overall lowers the turn-around of their store.

Exibit C - android users in general

Always want everything for free. I haven't met an android user that wants to pay for anything. :) (oh, this is going to hurt)...

Results will be posted as soons as we have some hard (objective) facts! :)

Tuesday, February 19, 2013

Always go beta

This will be a short post and it has a very short message. Always put your software through beta testing. I'm currently working on the iOS port of WordRoom, well, not exactly right now since I'm at home being sick and thought I'd write this instead.

Last week, after thorough testing, I put the iOS port out for beta. I really thought there would be no issues, at least not any major ones. Both me and my wife had been testing it for about a week and there were only about ten people in the beta group.

It was clear to me within an hour that there would be a second beta. At the point of writing this I have a list of about 10 major bugs that needs to be fixed.

The message is simple: ALWAYS PUT YOUR SOFTWARE THROUGH PEER REVIEW!

Wednesday, February 13, 2013

The shy game maker

I have a problem!

We made a game me and my friend. The game works fine and after six months of fine tuning it's actually a high quality product. That's not the problem.

The problem is, how do we let people know about the game? We need to market it as well. It's not enough to put it out on the store and hoping that it downloads itself. We don't have the cash for broad marketing since we have only about 3K downloads so far. We've recently turned to AdDuplex for win8 and winphone but still it's not enough to get the ball rolling.

So what's the solution?

I would say that you could go two ways. The first way is to pay good money for online ads. But again that's not our solution since we don't have the cash. It would probably cost tens of thousands of dollars to pull of on a large scale. I am temped however to try out the 100K impressions a month on AdDuplex for about $400. I do not think my wife is as enthusiastic about that as I am. So the first way is pretty much a no-go.

The second way is to know people or get to know them. Somebody famous needs to say that they like the game. A game blogger or someone who made a random large block placing game. This brings the biggest problem to the surface (I'm writing this on a Surface as well, pun intended). I don't want to bother people, even less calling them up to talk about my game. I guess I'm shy, that's my problem.

Tuesday, February 12, 2013

The fear of monetizing

Our game WordRoom was released for windows 8 in november of 2012, followed by Windows Phone in late december. Combined we have about 3000 downloads and a couple of hundred active users that play every day. The game is free and our initial thought was to monetize through ads. Well, as you can guess we're not making any money at all with the current download numbers so we added In-App-Purchase for those who just can't stand ads. The number of purchases is below 10. Since we aren't making any cash from ads we recently switched to AdDuplex to promote the app instead. I'll follow up with a specific post about how AdDuplex works out.

So far, this is not a problem. This is a start-up that will take time and determination. The problem is that at the moment, I don't want to bother the user with popups to buy premium since I feel that it will scare the few users away. I feels like we are punishing those who actually play the game!

We are very soon releasing for iOS and Android. For the iOS version we are going to try something different to break this trend. We are going to charge $1 for the app and this for two reasons.

1) iOS users are more likely to pay than any other user group
2) A user finds value in a paid app and it's more unlikely to be deleted

Comments on that?

About WordRoom

WordRoom is a Competitive Word Search game that focus on direct online gaming between two peers. You can also play single player. It is cross platform using MonoTouch.

WordRoom is available in Swedish and English, soon also Italian and Spanish.
Available for Windows 8, Windows Phone
Soon on iOS and Android using MonoTouch

Monday, February 11, 2013

What's so great about XNA/MonoGame?

When Microsoft first released XNA I was sceptical. At the time I was playing around with C++ and DirectX, feeling cool but slightly unmanaged. Not really making any progress at all. What forced me into XNA was XBOX and WP7 development. Loved it from the first Hello World.

So why do I like it?

1) First of, it is managed! Memory management problems gone. Well almost gone, Compact Framework and the 1-gen GC introduced a new type of memory management problem instead. But that's hopefully history in WP8.

2) It is simplified but yet extremly powerful. You must love the content pipeline and the very well defined life cycle that puts your right in the correct place of complexity. You still have to roll up your own game engine but all the extra low level details are taken care of for you.

3) It's now cross platform through MonoGame!

Why do you like XNA/MonoGame?

Thursday, February 7, 2013

The death of XNA, does it matter?

No, not really I would say. I would however like to split XNA into two parts:

* The first being the XNA API
* The second being Microsoft implementation of that API.

What's really dead (not counting XBLIG) is Microsoft commitment to further develop the API and the implementation of it. The API in its current version still exists and MonoGame has made a great job implementing it and making it cross platform. In fact, I would say XNA (the API) is way better of this way since it's now an open source, cross platform product driven by the community around MonoGame.

So is it all happiness and flowers from now on? No, there are risks of this unoffical handover and that risk is fragmentation of the API. Or even worse, bad design decisions from the MonoGame team on where to take the XNA API in the future.

Let's hope that the MonoGame team keeps the quality of the work done so far and make sure to donate to the project!

Wednesday, February 6, 2013

Do we have to go multiplayer?

Multiplayer games are sexy! I've realized that most of my game ideas always involved massive multiplayer capabilities and it has been this single feature that has killed most of my projects. It just gets to be to much message sending, syncing and fine-tuning that in the end kills the ambition to finish anything. I just takes to much time to add a single new feature to the game after a while. Of course this can be caused by me not having enough experience and lack of an organized framework.

So how do I feel about multiplayer gaming today?

I say, don't go multiplayer. Being an indie developer means having a very limited amount of time to finish your projects in. Multiplayer will be 75% of your project, I guarantee from my own experience. On top of that extra time you need to pay for servers and someone needs to be managing them. (read you). I would urge you to create a game that stands on its own, with unique gameplay instead.

The current game in the pipe after WordRoom (a multiplayer game) will NOT be a multiplayer game. I've realized that I need to make a game that is a great experience WITHOUT multiplayer support. Also by making the game pretty much storyless with a world that premiers exploration, time can be cut. I really don't have time to fill it with content in the form of stories but rather the game generates content as you go along.

I always have the intent to finish my games. Most of the times I don't and I realize that I need to be more time efficient in the future.

And last up, I stumbled upon this video of Michael Todd where he talks about depression in game development. I would say you wouldn't have to be depressed to follow his advice. It's a really good talk about what to think about. Replace depression with lack of time!

Tuesday, February 5, 2013

Why is making games so interesting?

What is it about making a game that makes us nerds go crazy? I'm talking about the single programmer who's been trying to make a game his/hers whole life but never seems to be able to finish it? The once of us sitting up late nights hacking away in c++/c#/objective-C, knowing that we probably could finish this faster using GameMaker.

Personally it took until being 33 before finishing my first game (WordRoom for Win 8, WP, iOS and Android) and that was mostly because we (I write we, since we are actually two people making the game) had a good deal of help from Microsoft to start our business up. Thx @microsoft. I still work at Sogeti and will do so for many years.

How many games have I started? Who knows, but the start to finish ratio is not looking good? I know I'm not the only one with this crappy ratio around. So the question is: "Why do we keep starting new projects"?

After a lot of thought I can only come up with these conclusions:

* We like to solve problems that we can choose to solve. At work you get assigned a boring business related problem, at home you choose your problem. Can I add smoke to that car while it's burning? Well YES I CAN! (another evening lost)

* We think we are going to get rich! :) Admit it, you want to make the next Minecraft.

* We imagine it would be heaven to be working with games! Working late nights with WordRoom, especially the back end parts, I realized that this is just another business. The pro's of this business is that there is almost no support to end users.

* Game makers are nerd rock stars? And who doesn't wanna be a rock star!

I'll keep looking into this subject from time to time.


If anyone's interested in WordRoom, here's the link: WordRoom for Win8