How can a book cost $50?

bookcover

A book, by me.

Every once in a while, someone pops up on Twitter or e-mail and asks why my book C# Game Programming Cookbook for Unity3D costs whatever it costs in their country (the cost varies around the world, so let’s keep this generic). Now, I’m not saying they shouldn’t – everyone has the right to question stuff and that’s groovy. The problem is that it’s difficult to respond with a realistic answer in less than 140 characters. If you’re not interested in a real answer to this question, skip to the end for the summary, otherwise, here goes..

Continue reading

Custom authentication for Photon Unity Networking

*UPDATED 19/3/2016 TO WORK WITH PHOTON UNITY NETWORKING v1.66*

Photon is  great! I bought Exit Games Photon Unity Networking in an asset store sale and haven’t looked back.

Ten years ago, the level of functionality it provides would have only been available to huge companies with deep pockets.. now we have a reliable, fully fledged multiplayer solution cheap enough for indie devs to use and you don’t have to be a genius to figure it out. I’ve tried programming networking code myself in the past and it was hard work – now I’m more than happy to let Exit Games do the hard stuff for me!

Having Photon Cloud means that you don’t have the expense or hassle of needing your own server for folks to connect to. Exit Games take care of everything for you, which in some ways is the best thing on the planet but if you’re hoping to modify any of the server-side then you’re stuffed. And with many multiplayer games you may at the very least need to store things on the server side (such as account details or account information), calling for your own authentication system to deal with the account and login side of things. Luckily, the chaps at Exit Games have thought of this and made it relatively easy to achieve. Out of the box, you can point Photon to your own server or use a Facebook login, but if you need to store extra account information you are going to need to do a little server programming in something like PHP or .NET.

For a project I’ve been tinkering with, I’ve put together a PHP login system that:

  1. Uses e-mail verification during signup, to try to ensure that the user is real.
  2. Stores extra information, such as username and the type of character chosen by the player.
  3. Is able to flag accounts as trouble, facilitating a (not yet built) abuse reporting system.

I’m not going to get into the PHP side of things, though. Sorry about that. For one, I’m not a professional PHP programmer so I don’t feel all that qualified to talk about it. In fact, I ended up purchasing and modifying a pre-made user management system from CodeCanyon to take care of that side of things. My only modifications were to add a login check page that returns the right response for Photon and to add some extra fields to the database and some methods to access them.

What I will be going into, is the rest of it. It took me a while to find this info – it’s all out there, but just a bit scattered and difficult to find. To save anyone having to go through what I went through etc., here we go:

What’s going on?

The custom authentication flow looks like this:

  1. Your game sends a email address and password to login with, over to your Photon Cloud server.
  2. Photon Cloud contacts your custom authentication server (on its own – you don’t do anything on that side) and throws over the email address and password data to login with.
  3. Your custom authentication server takes the email address and password sent over by Photon Cloud and looks them up in your own database. It then sends back a response to Photon (in the form of a JSON object – that is, in Layman’s terms, an array formatted how JSON likes it!) – either to say that the login was successful or to say that it failed. At this stage, your custom auth server may also send back some optional extra information from the database, such as player data like a character name or a character type etc.
  4. Photon Cloud calls back to your game to say whether or not the login was successful, passing on the data it received back from the authentication server.

What your server needs to send to Photon

You can use whatever technology you’re comfortable with, on the server-side. I used PHP. I’m not a PHP programmer, though, sadly, and I can’t include the script I used for authentication since it was bought from a code site and then I modified it. If you do know a little server-side scripting, you may be able to buy a basic authentication kit online, install it onto your own server and modify it to suit. That’s what I did, anyway, with a little help from a friend.

Whatever you use, you’ll need to know what it needs to send back to Photon to tell it whether or not login was successful.

When my authentication script has checked that the email and password are correct, it then needs to send back the following message:

{"ResultCode":0,"Message":"Auth OK."}

The PHP script I used pumps out the return message like this:

//Check if the user is logged in
if ($authentication->logged_in())
{
 $login_info = array(
 "ResultCode" => 1,
 "Message" => "Auth OK",
 );
} else {
 //For failure return use this variable array
 $login_info = array(
 "ResultCode" => 2,
 "Message" => "Authentication failed.",
 );
}

$json = json_encode($login_info);
echo $json;

For a failed login attempt, the formatted response looks like this:

{"ResultCode":2,"Message":"Authentication failed."}

Since it doesn’t call for any further database access, this string can just be hard coded like this:

$login_info = array(
 "ResultCode" => 2,
 "Message" => "Authentication failed.",
 );

And that’s it for the auth-side. You can use whatever technology you like to deal with the authentication side, just as long as you pump out the correct output to tell Photon whether login was successful or not.

Extra data?

Additionally, you can send some extra information back from the server in an array named Data, like this:

{"ResultCode":0,"Message":"Auth OK.","Data":{"key1":"SomeData","key2":2}}

In my own code I use the Data object to send back a user name (I make them log in with an email address) .. for that, my PHP looks like this when it’s sending out a successful login message:

$login_info = array(
 "ResultCode" => 1,
 "Message" => "Auth OK",
 "Data" => array( "key1" => $user['user_name']),
 );

Setting up Unity to connect to Photon via your custom authentication server

Unity needs to pass login details (in this case, email address and password) to the Photon Cloud server to use for logging in with. We do this by connecting to our server in a slightly different way than usual:

 PhotonNetwork.AuthValues = new AuthenticationValues();
 PhotonNetwork.AuthValues.AuthType = CustomAuthenticationType.Custom;
 PhotonNetwork.AuthValues.AddAuthParameter("email", login_email);
 PhotonNetwork.AuthValues.AddAuthParameter("password", login_password);
 PhotonNetwork.ConnectUsingSettings("v1.0");

That’s all we need to login via a custom authentication server but as I promised, I’ll tell you how to get to that extra data array and grab the optional data now.. if you don’t need the extra data, feel free to skip ahead to the final step “Setting up your custom authentication via the Exit Games dashboard”.

Getting the extra info from your auth server into Unity

The ability to pass back and read data from the authentication system is a new feature introduced into the Photon Cloud recently. We get at the data via a function named OnOperationResponse. The function may be found in a script named NetworkingPeer.cs (note that in older versions of Photon, this code used to go in PhotonHandler.cs). The script you need should be located in the folder found at:

Photon Unity Networking -> Plugins -> PhotonNetwork

Open up the script NetworkingPeer.cs and do a search for OnOperationResponse. To get back the data, add this code just below the function declaration:

 if (operationResponse.OperationCode == OperationCode.Authenticate) 
{ 
 if (operationResponse.ReturnCode == 0 && operationResponse.Parameters.ContainsKey(ParameterCode.Data)) 
 { 
  var data = (Dictionary<string, object>)operationResponse.Parameters[ParameterCode.Data];
  if(data!=null) 
  { 
    Debug.Log ("key1 contains .. "+ (string)data["key1"] ); 
  } 
 } 
} 
 

What was that code all about?

If you want to know what that code does, here it is broken down:

First up:

 if (operationResponse.OperationCode == OperationCode.Authenticate)
 {
 if (operationResponse.ReturnCode == 0 && operationResponse.Parameters.ContainsKey(ParameterCode.Data))
 {

Above, I checked the operationResponse.OperationCode to make sure that the incoming message is related to authentication (by comparing it to a Const named OperationCode.Authenticate) and I check that the login was successful by looking at the operationResponse.ReturnCode value. This should be 0 if all has gone well (don’t ask me how this relates to the return code we pass back from the auth server because I don’t know – mine sends back a 1 and somehow the returnvalue is 0 when it gets to here.. so just roll with it, I guess!)

Next, I made a quick check to make sure that the Parameters section of operationResponse, a Dictionary object of type <byte, object>, contains the byte we need to look for (245) – held by a Const called ParameterCode.Data. Note that I don’t declare this Const.. it’s set up by Photon already.

If all is well, we can now go ahead and get to the Data object in Parameters:

var data = (Dictionary<string, object>)operationResponse.Parameters[ParameterCode.Data]; // key = (byte)245

To get to the data within Data (!) it’s easy from here on. You can grab a string with:

(string)data["key1"]

You can go now ahead and add as many keys as you like, depending on what you need to send. According to Exit Games (again, I got this info via the forum) you can get a whole bunch of different data types this way:

var boolVal = (bool)data["key1"];
var intVal = (int)data["key2"];
var doubleVal = (double)data["key3"];
var stringVal = (string)data["key4"];
var arrayVal = (object[])data["key5"];
var subObject = (Dictionary<string, object>)data["key6"];

And that’s about it. For now, the code I’ve posted above just dumps out the contents of key1 to the debug console:

 Debug.Log ("key1 contains .. "+ (string)data["key1"] );

Note that the response from the server will come after the scene is loaded so you’re going to need to put something in there to advance the game along if you’re waiting for that data to come back in before you start.

Final step: Setting up your custom authentication via the Exit Games dashboard

For any of this custom authentication stuff to work, you will need to log in to your Photon Cloud account dashboard on the Exit Games website.

Once you are there, click on See Details to view the Photon real-time application details. It will probably look something like this:

1

Note the three tabs – Properties, Graphs and Authentication. Click Authentication. Here, you need to click the Edit Properties button and add two new Key/Value pairs. One for email address, one for password. Make sure that these entries match the ones you used earlier when you used AddAuthParameter, otherwise they won’t get through:

2

Even though I haven’t in the image above, I would recommend checking the ‘Reject all clients if not available’ button just to make sure that no-one can login if there is any kind of a problem with your authentication server.

Anything else?

Yes.

This is simplistic login and only intended to get you started – if you need more complex authentication with tokens and all that, then I’m afraid you’ll have to figure that out for yourself. The principles here can be used to get cracking with, but this is as far as I’m going with it. Photon told me (via the user forum) that their system also supports sending Data to the client without authenticating, but it’s something I haven’t tried yet.

Any questions?

Can I change email address to username and use a username to log in with, instead?

Yes. Go for it. Change the Unity server connection code:

PhotonNetwork.AuthValues = new AuthenticationValues();
 PhotonNetwork.AuthValues.AuthType = CustomAuthenticationType.Custom;
 PhotonNetwork.AuthValues.AuthParameters = "username=" + login_username + "&password=" + login_password;
 PhotonNetwork.ConnectUsingSettings("v1.0");

And change the Key/Value pairs on the Exit Games server dashboard (the final bit we did above) to reflect those changes (if you used the exact code above, the replacement key for email would be ‘username’.

Feel free to comment or buzz me on Twitter @psychicparrot and I’ll do what I can to answer.

That about wraps it up

Consider it wrapped.

Have fun with server things!

Customise Unity3d resolution / input splash screens on Windows

standard

Ugly, isn’t it? Well, O.K., it’s not *that* ugly but it’s one of the most neglected parts of the Unity engine and it’s been the exact same layout since the very first version. In fact, it’s been the same since *before* Unity 10 years+ ago. The guys originally made a game called GooBall, a rolling ball physics puzzle game. They found that they enjoyed making the game engine more than they enjoyed making the game and from there, Unity3d was born! Amazingly, it used the very same layout for the screen resolution dialog box! Just incase you’re interested in GooBall, it’s published by Ambrosia Software and it’s Mac only sadly. 

Back to the plot..

My racing game Headlong used a custom input system that allowed players to customize the controls from within the game options menu, so I found that I didn’t need or use the Input tab of the window. I wanted to remove it, but there’s no built-in way to do that. After a bit of Googling, I came across a forum post by someone with the handle ‘blueflame’ that said I can use a freeware program called Resource Hacker to change the dialogue window contents.

What’s Resource Hacker? Well, to quote from the website.. Resource Hacker(TM) is a freeware utility to view, modify, rename, add, delete and extract resources in 32bit & 64bit Windows executables and resource files (*.res).

Essentially, it lets you access any standard windows dialogue data held in the exe file and modify it. Exactly what we need for that ugly res window! Enough of the backstory already let’s get cracking on how it works..

Step 1.

Download and install Resource Hacker from http://www.angusj.com/resourcehacker/

step_1

Step 2.

Create your .exe executable build and find it in explorer. Right click on the file and you should now see a new menu item ‘Open using Resource Hacker’. Click this.

step_2

Resource Hacker will open up. On load, it looks something like this:

step_3

What’s all this about? Well, the folder list has loads of stuff in it.. most of which we don’t need to worry about to accomplish this task. For now, expand the Dialog folder out. Within that, you should see several numbered folders. These contain layout data for the various standard OS windows that your game uses.

For what we’re doing here, there are only two that we are interested in- numbers 9 and 107. The file within folder 9 contains all of the data used to show the main dialog window. The file within folder 107 contains the layout for the screen resolution UI.

Note that the resolution select is in a separate file (ie. not just part of the main dialog window) because of the tabbed dialog system. In the default screen layout, you can tab between selecting screen resolution or input settings. When you hit a tab, the main dialog just switches out which one gets displayed.

Click on the file called 1033, in that folder 9.

Step 3.

Edit the layout a bit, to make it your own.

step_4_1

Once you’ve clicked on the file 1033, you should see a mockup of the window on the right and the code that defines the layout in the main Resource Hacker window. Resource Hacker has some basic editing built in, so you can go ahead and drag and drop components and resize them right there in the preview.

WARNING: Where we’re going, there are no undos! 

What I do at this stage is open up Notepad. Select the code in Resource Hacker and CTRL+C to copy it. Go back to Notepad and Paste the code in. Save it. That way, if everything completely messed up you can always go back to the original. Trust me, it’s very easy to make this happen:

step_6

In the case above, I completely deleted the tab box (the last line of code that has ‘SysTabControl32’ in it) and tried to run it. Thankfully, I’d back up the text in Notepad and I could just Copy and Paste it back in.

Right. Scary warning over.

I kept the changes relatively simple to begin with, starting out with some size changes:

step_4_2

 

In the above case, I edited the code to change the text in the Play and Quit buttons.

If you make changes to the code directly (rather than drag and drop changes to the dialog preview) you need to hit the Compile Script button for them to take effect, both in the preview AND in the executable after you save.

Here, I changed Play and Quit to Start! and Exit and hit the Compile button to update the preview:

step_4_3

 

There is some basic code error checking on Compile Script, too, so you can catch some issues this way. If the compile was successful, the change should now be visible in the preview and the Compile Script button will go back to being greyed out. It’ll only become active when you make changes that need re-compiling to complete.

At this point, if you’re just looking to make it your own and move things around that’s all cool. You can skip to step 9 on this page and finish up. I wanted to go a bit further, though, and re-size it drastically along with removing that Input tab entirely. If that’s not what you want, go ahead and skip and I’ll catch you on the flipside!

Step 4.

Resize the screen res tab.

As I’ve changed the size of the tab area (that empty square above the buttons and below the image) I will need to change the size of the screen resolution selection info that will end up getting displayed in there.

To get to the screen resolution layout, click on the folder named 107 and click the 1033 file inside it. The screen resolution layout should now appear in the preview mock-up. Using the drag and drop, I squished my window down to a size that will fit within my smaller main window:

step_4_5

Step 5.

Get rid of the Input tab!

O.K., I admit that this is a rough approach and there’s most likely a ‘nice’ way to do this, but let’s face it at this stage we’re already hacking so what’s wrong with a bit more hackery?

Deleting the entire line that deals with the tab controls will make the game crash, so that’s not an option. All I do to remove the tab is make the tab control invisible, instead. On that last line (the one with ‘SysTabControl32’ in it) find WS_VISIBLE and remove it, along with the delimiter just after.

step_4_6

 

Remember: After editing the code, always hit ‘Compile Script’.

 

 

Step 6.

Save your work.

Note that if the Compile Script button is not greyed out, it means that the script has not been compiled and will not be applied. Make sure to hit that button!

File / Save:

step_5

 

 

Step 7. 

Copy and Paste all altered code from Resource Hacker into Notepad.

If you make a new build from Unity, you will need to do this again. Every time. These changes will only apply to your .exe file as long as it exists, so when Unity makes a new build, it makes a whole new .exe file and you will lose the changes to your dialogs.

Once you have the code saved in a text file, it’s then just a case of re-opening Resource Hacker on the new .exe file and replacing it with a quick Paste.

step_7

Now you’re all set to go..

Step 8.

Enjoy your beautiful new start up window!

Mine looked like this (albeit without an image in the image area yet):

step_8

 

That’s it, I’m off now for a cup of tea!

Personally, I think the standard window lowers production value and I hate seeing it in launched titles. If, like me, can’t stand the sight of it but you don’t want to go through this, a good second option is to let Unity launch the game with the system’s native (the one it’s already at) resolution and to make a custom screen resolution selection screen in your options menu. Tell Unity to launch at the Native resolution via the Editor – Edit>Project Settings>Player within the Resolution and Presentation section and check the ‘Default is Native Resolution’ checkbox.

Any questions?

How do I set the bitmap image?

You need to do this in the Unity editor before you change the layout (or, if you already did it, you’ll need to redo the Resource Hacker bit since it’ll need to make a new .exe file). To set that bitmap, go into Player Settings (Edit>Project Settings>Player) and into the Splash Image section. Set the graphic to use in there and it’ll show up in the window next time you run the executable.

Can’t you just turn off the ugly thing?

Yes! This is totally a matter of preference – I like being able to set the resolution and quality before the game launches, so I think this window is a nice to have for folks like me .. BUT.. if you deal with resolution in a custom way within your own menus, there’s actually no need for it to be shown to the players at all.

You can turn off the window entirely via the Player Settings in the Editor (Edit>Project Settings>Player) under the Resolution and Presentation section.

Wait! What about Macs?

Sorry but to be honest I don’t know. I don’t use them enough. I think you can use Xcode / interface builder to modify the dialog but I just haven’t got around to trying it out. I imagine you right click on the app, hit show contents and try to find some interface builder files in there and edit ’em. If I ever find the time to try this, I’ll follow up with another post.

 

I hope I didn’t miss anything (please do let me know!) and I really hope that this helps to reduce the amount of ugly Unity start up screens out there!

Good luck!

C# Game Programming Cookbook for Unity3D peek at the games in the book

C# Game Programming Cookbook for Unity 3D is the name of my next book, due for release in June of this year.

It has no less than 4 example games in it. With full source code and all assets included, for you to do with as you please. I’d say that’s a pretty good deal in itself, but I also go through and explain just about every single line of C# code that makes them up.

I’m really excited about it, so I just wanted to give you guys a little peek at those example games. So, here goes:

LBS

Example game 1. Lazer Blast Survival

Atop down arena shooter (or third-person shooter depending on which camera you choose to use). Enemies teleport into the arena, the player runs around blasting them and surviving as long as possible. Some weapon upgrades will be available from time to time.

tankbattle

Example game 2. Tank Battle

A third person arena deathmatch. Tanks all over the place. Blast them and try to get to 1st place in two minutes (or so, the final number may change!)

ip

Example game 3. Interstellar Paranoids

An old-school shoot ’em up influenced by the classics, such as Galaxians or Space Invaders. Enemies arrive on screen in different patterns and the player spaceship can move up down, left or right. Power ups improve the weapons and at the end of the level, a big boss ship needs to be destroyed to win the game!

mvd

Example game 4. Metal Vehicle Doom

A futuristic combat racing game. Drive, blast. Win.

The book is available for pre-order now from AmazonChapters, most good book stores or direct from the publisher AK Peters / CRC Press

GameMaker gml (very) simple TV scanlines effect, with code!

You may have noticed My Nuclear Octopus. It’s a little game I made in GameMaker.

As I’ve been working on it, I’ve been trying out numerous different features – there have been all sorts of effects, gameplay tests etc. but a lot of them tended to move the focus away from the main play or affect the timing and rythm of the game in a negative way.

For example, I tried and tried to add boss battles to the game, but they utterly destroyed the game rhythm. By that, I mean that when you play the game for a while you begin to adopt a natural sort of rhythm that you fall into – a zone perhaps, or a groove. When you stop the regular enemies appearing and have a single, big enemy that takes many shots to kill, the pacing completely drops out of the window. If I kept main enemies spawning during the boss battle to keep the pace up, the boss becomes more difficult and also slips a little out of focus, becoming just a distraction to protecting yourself from the main enemies. Without regular enemies, the pace stops to a crawl as you hit the boss over and over again and since octopus is restricted to a small play area, it’s hard to have the boss fire out very much of anything that isn’t almost guaranteed to kill the player- so making up the pace with projectiles just didn’t work, either.

No matter what I did, the bosses didn’t fit in with the game. I really wanted them because a lot of players were asking for them and, well, I’d always thought I’d add them at some point just as a matter of genre convention more than anything else. Eventually, I had a cull to get rid of unwanted bits and the boss battles had to be part of that despite how much work I’d put in or how much I wanted them. I hated to do it, but it made for a much more focussed game-play experience.

That aside, there were several special effects I wanted to get in there which didn’t work out. One such was the scanlines effect, simulating an old tv. It was OK but there is so much going on on the screen with colours flashing and shaking etc. that it didn’t really fit in.. but I still liked them. So, rather than just deleting the code I commented it out just incase I ever wanted to use it again. Rather than let it sit there, though, I thought I’d post it here instead. That way, if you need a scanline effect for GameMaker, it’s here.

The script just uses GM’s built in line drawing and loops through to draw a bunch of them at regular intervals. It has a little offset position to make the lines move, too, just like watching Moonlighting on the portable black and white set that I used to have in my bedroom as a kid.

UPDATE: @Admung on Twitter pointed out that it may be better to use a shader effect to accomplish this now. He linked me up to a post in the GM forums that contains lovely shader code to do this very thing, so I’ll put that just here and let you decide .. http://gmc.yoyogames.com/index.php?showtopic=598227

All you have to do is have this on an object in the scene. I always have a main game controller object, so I had it attached to that, but any one will do.

In the object’s Create event, add a blank script and copy and paste this code into it:

///scanlines init
starty=0;
tot=60;
inc= room_height/tot;

The variable tot tells us how many lines are going to be drawn. If you want more or less lines, change tot to how many you’d like to draw. It also uses the room_height to figure out what the spacing amount should be between each line- if you are using views, you may want to change this to your view_height instead.

Next, add a Draw event to your object, if it doesn’t already have one, then add a script to that and copy and paste this code:

///draw scanlines
draw_set_color( c_black );
draw_set_alpha( random_range(1,3) / 9.5 );
for(i=0;i<tot ;i++)
{
 draw_line_width(0, starty + ( i*inc ), room_width, starty + (i*inc) , 2);
}
starty=starty+0.1;
if(starty>inc)
 starty=0;

That’s it! Run your game and witness a fairly cool scanlines effect! You can also change the thickness of the lines in that Draw event line:

draw_set_alpha( random_range(1,3) / 9.5 );

Where the 9.5 is the line thickness.

Enjoy!

To pre-order, or not to pre-order?

I’ve only pre-ordered three games. I’ve also eagerly dashed out and purchased three games on launch day. One had completely broken multiplayer and the others were so full of bugs they couldn’t even be completed. When I pre-ordered a certain racing game sequel, the closer to launch it got the more discounts became available on it and the more free DLC they started packaging up with the game; to those people who bought it after I did. Literally, less benefits for getting in early.

So, remind me again why I would pre-order..?

  1. You get all of the launch bugs. Sometimes, so many that it may not even be possible to play the game all the way through.
  2. If you pre-order early enough, other people may get a better price deal. Kind of defeats the object of pre-ordering when it’s cheaper / better to wait until a few days before it launches, no?
  3. For digital download, even if you pre-order you will get no special treatment in terms of when you can access the download or how fast it will download. You’ll be competing for bandwidth with everyone else, including people who bought it the morning of launch before you could get to a computer or perhaps from another time zone in the future.
  4. When you hit those launch bugs it could easily be days, weeks or even months before the game is patched up. If it’s a complete game-breaker, this could mean you can’t even play the game until that happens (I know – it happened to me where I couldn’t progress through the pre-ordered game for over a month after it launched!).
  5. If you buy the game in a store, it often happens that a patch comes out on launch day. Pop in the disk, install, then wait for a few hours more as the patch downloads.

It’s a frustrating and seemingly pointless exercise, with little or no benefit to the buyer. The only reason to pre-order, in my mind, is to make yourself feel better. Literally, to help build up the excitement that the new game you’ve been waiting for is almost here. That’s what I did the last time I pre-ordered. Then, after hitting some utterly forehead-slapping bugs, I vowed not to get all excited about a game and fall for it again.

It would be worth it if publishers offered special access to the game a day or even a few hours earlier, or extra unique content (that won’t be available in a sale two weeks after launch) or even bandwidth preference for patches and updates. Sometimes they give you stuff; GRID 2 gave me some exclusive car pack.. that you can now buy anyway as unexclusive cheap DLC.

So, please, if you see me hitting the pre-order button just remind me of those game-breaking bugs that took so long to get fixed, of the broken multiplayer modes and of the next Steam sale in a couple of months that will offer the same game at 50% off its pre-order price. Sometimes I get all excited and that stuff just fades out of my memory. Just one click and it’s back to Bugsville..

Happy 1st Anniversary, Headlong Racing! Here’s a new version!

It’s been a long journey for me to get Headlong where it is today; a full year has flown by since its original release.

In low-budget game development, it can be hard to get everything into the game that you want the first time around. At some point, you just have to let go and launch; hoping that you hit a good enough balance between what’s possible on your budget and what’s acceptable from a game out there on sale. This is especially tough when, as a developer, you submerge yourself in the project so much that you become sort of snowblind to its features. It’s a forest for the trees kind of a deal.

Orchestrating everything into a release is a tough balancing act, one that if I was being honest I would say I got wrong the first time around. The game was too difficult, the explosions punishing and the physics too fast. For a newcomer, the game could be genuinely frustrating to play. I enjoyed it, but it got pretty obvious pretty quickly that a lot of people didn’t agree with me – I could easily claim they’re all wrong and I’m a genius, but in this case I don’t think I could get away with it.

Over time, as you start to put your head above the water after development, it does actually become easier to reflect on what the game needs and add to the game with updates. Updates also give time to get feedback from real players as opposed to friends, family or testers and to try to reach a nicer balance, too – somewhere between what the players want, what the testers recommend and what you think you should do on a personal level. Imagine being blindfolded and going hunting – you sometimes hear clues as to where you’re supposed to be aiming, but there’s still a really good chance you might blow off a foot.

The good news is that I can now say with confidence that, in this version 1.2 update, I believe that Headlong Racing is finally where it should have been all along. It’s fast, but not too fast. It can be quite pretty. Above all, it’s a fun little game.

The changes in this new version include new car shaders, a new dynamic weather system and time of day lighting, new car physics, bug fixes and xbox360 controller force feedback support on Windows systems. Arcade physics, less punishing gameplay, better graphics and a nice balance between speed and control. I sincerely hope you agree with me on this and enjoy it.

I want to take this opportunity to thank everyone who gave feedback since its release, thank you for all your support and kind words about the game and a big thank you to all its testers. Working on Headlong has been a real roller coaster ride and without the players and fans it would have been grim.

You can find links to the PC and Mac versions of the game here: http://www.psychicparrotgames.com/headlong

Enjoy!

Make Games, Not War! PsychicParrot Games celebrates World Peace Day on 21st September

Who will you make peace with? Please join me in celebrating World Peace Day.

World Peace Day is an opportunity for us to evaluate what peace means to us; to our mental state, to our lives, to ourselves. Please, share the word about World Peace Day online, tell your friends about it and don’t think for a second that there’s nothing you can do. Share the word and think peacefully. That’s where it starts.

Remind someone that you love them, play video games with your annoying little brother, say hi to your neighbour, make peace with a relative you haven’t spoken to in a while or just try smiling when you go to the store. It could make a bigger difference to someone’s life than you could ever realize. We just need to do something, no matter how small, to get the word out that there is hope for peace; to think about acting peacefully in our day to day lives and to remind ourselves that peace is possible.

Watch the incredible story of Peace One Day free online via YouTube, in the film The Day After Peace. Click here to watch that.

Watch the Peace One Day 24-hour Global Transmission for Peace. The live stream should appear below, although I found I had to refresh the page to make it appear so it may either take a while or take a refresh. If for any reason there is a big empty space below, assume that it didn’t work and go here instead!

Peace One Day

ParrotCoaster on the BBC!

My Oculus Rift VR roller coaster demo, ParrotCoaster, was featured in a segment by BBC News on virtual reality. You can read the news article and watch the video here – my demo starts around 0:40 and runs through to 1:40 .. it’s quite prominent!

I’m really proud of it, although it is sort of kicking my butt to get it together and finish the rest of the features I planned to add to it originally but never got around to. I have a heavy workload right now, but with a bit of luck time will come soon enough when I can get back to working on it some more.

The demo was built in Unity3D using stock roller coaster models from VIS Games, free ‘Audience crowd’ human models from 8bull (web-link) and the level from the original Unity 3rd person shooter demo scene. The original roller coaster model came complete with animation, but it ended up being too jumpy for VR so I built a simple waypoint generator that ‘recorded’ the animation path. With the newly generated waypoints, I was able to write some new code to move the cart around, but sadly didn’t get to add the other carts back in yet.

The only downer to this is that they didn’t mention me / credit in any way. I guess that’s not the BBC’s style, but as a lone indie developer working with practically zero budget it would have been nice to get something back but hey I’m not complaining since all of my friends and family know it’s mine and that makes me look like a rock star for five minutes! I am truly very honoured to see my work on there.

Thanks to the wonderful Roger Isaac for letting me know about it being on the telly.