Just to explain the recent media silence - I've been focussing all my efforts on making my way to LA to start work for Naughty Dog. I am currently rethinking what content I am going to create in the future and how to deliver it. If you're looking for my latest, the best place is probably my Youtube channel.
Almost done!
Work in progress
Over the Christmas holidays I implemented the base of a cover system including the AI. It's pretty raw right now and there's a lot that needs ironing out, but it's getting there. The AI selects cover based on their current weapon and the players last known location. Cover can also be invalidated in a number of ways by the player. The next steps will involve augmenting the group logic for the enemies with tactical retreats and advances to create some real flow and movement to the encounters.
Porting the project to UE4
My god UE4 is fantastic. The level of thought that's gone into the system is phenomenal.
After having played around with it for a short while and done some prototyping for our current project, I've decided to switch my side project over from Unity.
One of the main reasons for this, apart from how easy it is to use, is that we now have an animator on board! Very exciting, and UE4 has far superior animation systems.
I'll start posting videos of the game very soon - I've re-worked the core system to support some pretty cool stuff in our little dynamic, procedural world which I'm looking forward to unveiling!
Playing with curves
Ok so I think this is pretty cool. I also think this is one of THE ways you should create core mechanics.
Simply - I'm creating a jump in a game, but this is so important to get right. A good jump is a little bit of positive feedback every time you hit the button. It can be addictive and genuinely fun. A bad jump makes you feel like you're fighting against the controls. In fact most people don't notice when a jump is good or bad, they just like one game and not the other and they don't know why. This stuff is important.
So this is how I'm doing it -
I'm using this easing function generator to create and tune the appropriate curve and then converting the function into C# and plugging it into my code. This is the initial result using a standard curve, it's not right yet but it already feels like it's on the way.
Next I need to gut that site's (very kindly freely available) code and create a solution that will give me more control over the curve and allow live editing
A Case For Violence
Ok so first I want to start by saying that I am thoroughly bored with violent games. This all came from trying to think about something that could truly replace it. But why is violence so popular in games?
So here's a couple of theories.
1. Violence is easy to program. It's far easier to program some bullets and health than it is to program complex interactions. Artificial intelligence too is much simpler when all it has to do is run around and shoot at the player. Kind of a dull point though this one, and there are always ways around technical problems.
2. Violence provides players with something to master. You see my first thought when thinking about replacing violence was something like an adventure game in which you try and find, say, a long lost sibling. You could build an entire game around this and there could be a myriad of challenges along the way involving meeting and talking to new characters mainly - but the mastery would be missing. That one core skill you practice again and again and are ultimately tested on. You could build a game without it, but something would definitely be lost.
So let's just replace it with something - for the sake of argument let's change the story. You're a tennis pro searching the land to become the ultimate player. You travel in search of new challengers. But the problem with this is that it doesn't provide the bite sized challenges that violent games do - you'd be limited to less, more meaningful encounters because a game of tennis takes a significant amount of time.
Violence is actually very well suited to a medium in which progression is so key. Bite-sized encounters hone your skill ready for the ultimate test at the end. Also from a more abstract design point of view, violence works nicely to clear the path of the blocking challenger once you've bested them, allowing you to continue on.
There is a lot that you get for free with a violent game mechanic - it fits games very well. In fact even in the real world you'd be hard pressed to find something that allows small meaningful rounds of challenge better than fighting does. I'll keep thinking though..
...perhaps a game about a wondering debater in a world full of the opinionated...
Perhaps not...
Ultimately I think the answer is to simply come up with some activity and an excuse for why everyone challenges you at it, like Pokemon. Surely though there must be a more elegant solution...
New Theme! AARGH!
My new theme seems to have deleted all of the line-breaks from my previous posts leaving them as one enormous paragraph. I'll fix it soon.
Unfinished
I wrote this before he died. I was going to re-phrase this, but I think I’ll just leave it as it is. It’s unfinished, and there’s a bit of a mess towards the end, but perhaps that’s rather apt.
—————————————————-
Iain M Banks is dying. This actually hit me in a more profound way than I thought it would. I’m not the kind of person who gets upset about the deaths of people I don’t know. I was surprised by my own reaction to the news, but then I started to realise that he has been one of, if not the biggest source of creative inspiration in my life since I was a child.
I was always drawing robots when I was little, and making things out of pieces of cut up cardboard. I’d watched StarTrek before, and Star Wars, and I knew I liked these things in some way but I never considered them as part of a genre. When I first started to read his science fiction books I was amazed at the seriousness of them, the sexiness. They are written like adult novels, there are no ray-guns or spandex-clad barbarellas. I began to think about these things more and more. I watched Ghost in the Shell, I looked at the concept artwork for Metal Gear Solid. There is a style here that I want to be part of, I want to contribute to. Good stories told about incredible things, or just stories told in interesting worlds. Often this is a genre that allows a great deal of philosophical reflection as it can be so rich in metaphors. Science fiction releases you of so many restrictions imposed upon you by other genres, especially in Games, which I now make for a living.
So much of my imagination is plagiarised from the ideas in his books. Actually so much of so many things are plagiarised from his books. The ‘halo’ from Halo for example…
When I was younger, before I went to film school, one of my often daydreamed ambitions was to make one of his books into a film. There are so few good sci-fi films. I always imagined the letter I would write to try and convince him to let me do this, and to justify why I would do the material justice like no-one else could.
As I’ve got older I’ve grown my own worlds inside my head, and I no longer want to simply tell the stories of others in a different form. But still, these worlds wouldn’t exist without his writing and I still wanted to ask him for his permission to include some homage in my work. It’s an odd, very selfish feeling to realise that I will never achieve this; one of my earliest ambitions.
If you read one thing from his volume of sci-fi work, read the short story ‘The State of the Art’ from the book of the same name.
I read it once on a family holiday in Turkey, and then again lying next to my friend in central park in NYC, with him too hungover to move. It’s about our world as seen through the eyes of others, but there are no UFO’s or aliens in the traditional sense. You follow a woman as she walks around European cities, contemplating humanity.
rewrite -
traditional science fiction ideas with genuine people and a more realistic view of the future that satirically criticises current western culture. moulding the spiralling, inky-abstract grasps for something more lucid that began to form in my head when I was young.
his ideas -
Stories that begin and end at opposite times and meet in the middle.
ships within ships, endlessly and intricately tattooing each other, recursing into… something
—————————————————-
I never knew him, but it makes me sad.
Working on our game this weekend. Despite the fact that we’ve been doing this on and off for close to a year now, I reckon we must each have only put maybe 6-8 hours of work into this thing, work’s just been that hectic! Also integrated the AngryAnt behave library into the project for the AI which is a lot of fun. The plan is to make the game just a lovely thing to interact with before we make any kind of winning conditions.
Finally getting round to it
For the last couple of months I’ve been working for the ex-Blackrock guys over in Brighton at their new studio Gobo games and have been enjoying learning lots of new stuff there (along with a lot of homemade food made in their big open plan kitchen). All good stuff, but the personal projects have fallen by the wayside a little.
Anyway I’ve finally got around to playing around with the Unity API and have been finding it a total joy to use. Everything is so easy! So I’ve decided to make just one game that is pure gameplay to get to know the package. It’s going to be a little multiplayer tower defence game - specifically so me and a friend of mine have something to play at the same time with just one iPad. It will be the last project I do with absolutely no artistic value whatsoever, but it’s still quite fun.
So far I’ve coded a hybrid navigation mesh / spacial partitioning system for the AI to use and to optimise collision detection. After making the first generic AI framework it’s a real joy to be building this from the ground up without having to keep working out how to achieve the next step. It’s also really nice to have the requirements of the whole thing in mind so you can just do exactly what needs to be done and no more.
Generalisation
People are very good at making assumptions about objects they have never encountered before and instantly knowing how to use them.
The illusion of this can be achieved with AI by having the objects themselves specify how they can be used, and what they can be used for. Agents can then search their immediate surroundings for objects that fit a certain criteria and use them accordingly. This is a useful tool if you want to be able to easily add things to the world that the AI will instantly be able to understand.
In a more open-world game, objects could be used to fulfil basic needs, creating a more lifelike, generic NPC. Then, these same objects could also be used as weapons, however useless they may be - each one describing how much damage done when thrown, or when used as a melee weapon.
The purpose of all this would be to create a game where anything could be picked up and used, or used for defence in a pinch. I believe a system where a few simple actions exist that can be used on anything would help decrease a feeling of limitation in a game, and increase the ability to experiment and explore. This type of system is also a natural match for the polymorphic nature of many object-oriented programming languages.
It’s also a step in the direction of more interesting, generic open-world AI that may or may not fight you depending on the circumstances and would create nice situations where attacking a random passer-by may see them grab a nearby common object for defence.
Additionally too many open world games see mindless characters wonder about when it would be relatively simple to give them just a few basic desires and sleep patterns. It would be refreshing to have a game city that gets busy at lunchtime, quiet at night and so on. These two things combined could make a world come alive in a way that has not been achieved particularly well to date.
As far as the demo goes this won’t be incredibly visible as everything is a weapon and all the agents are in a permanent combat state. However it will result in a more modular weapon description, in which each weapon describes the appropriate movement when being used; for example charging with a short-range weapon or hanging back with a long range one. This would also exist in common objects when they get created. Hopefully once the multiplayer demo is completed, work can start on a game with AI that does more than try to shoot you.
Imminent and future development
The demo needs a bit of spring cleaning as it stands, but I just wanted to get it out there. Delta time is calculated but needs applying to all update methods, large and small. The Level and Brain classes are also very big and need splitting up. There are also a number of ‘TODO’ statements dotted around that need attending - small improvements in code elegance.
The demo is now being turned into a game which has been fully designed. The following changes will be made to allow this:
'Brain' will be split into a 'higher brain' class which will be able to accept one of any number of decision making modules, and a 'lower brain' class which will handle pathfinding and also call into sight, hearing and other sense routines, compile all the data and feed it into 'higher brain'.
'Level' will be overhauled to allow instantiation with a 'level description' function - allowing the generation of different maps.
The path table will also be stripped out and the real-time search will be re-implemented to allow for dynamic maps.
Agents will no longer exist as a lengthy chain of inheritance, but rather contain a number of classes allowing for agents that can include or exclude certain components.
All objects and entities able to be targeted will be derived from a super-type of GameObject; ‘TargetableGameObject’ - this just makes a lot of the code much simpler to implement and work with.
Levels will be generated from a hybrid Navigation Mesh / Spacial Partitioning system, and locations tracked automatically by GameObjects allowing for more complexity in behaviour and much more efficient calculations.
Finally all of it will be wrapped up in a nice, neat little menu system.
http://www.youtube.com/watch?v=crietSSXn1M
A better video. It has been mentioned that the colour of the text displaying the main agent’s thoughts can be a little misleading. The colours actually refer to the spinning markers, and not the the enemy agents. This has been remedied in the latest build which is available on the downloads page. (VS2010 and DirectX10 required)
http://www.youtube.com/watch?v=gkNuMZcMIJU
A short capture from the latest version of the demo. The video encoding has made it appear slightly choppy, but the actual demo is not like this.
Demo V3.0
The demo’s now been converted to DirectX10 using C++. Source code and videos will be posted shortly.
Simple Game Framework
I put together this simple framework a few weeks ago as a first step in converting my demo from C#/XNA to C++ using Direct3D. It’s fairly simple but works in much the same way the XNA wrapper does - Global Load, Initialise and Unload methods run once, the Draw method runs as often as it can and the Update method runs sixty times a second, passing through a delta time value that is used to compensate for variations in loop-cycle times. The entire Demo should be ported shortly, currently various maths algorithms are having to be converted due to the differences in the handedness of the two framework’s respective coordinate systems, and it has also been necessary to write a custom collision class for bounding volumes and rays.
http://www.youtube.com/watch?v=QW5kIqyjbbs
Short capture from the last XNA version. Direct3D / C++ version should be up shortly.
Phew!
So, after starting to fix a minor bug I got sidetracked and recoded a large portion of the AI, (Although they still look like little cubes…) They now maintain a list of everything they can see as well as keeping a few choice things in memory. You can then choose to take any information from these lists in order to have the agents make a decision on what to do. At the moment they choose their target based on a simple hierarchy of object type and distance. Adding new behaviours is now incredibly easy, for example, the agents do not currently react to being shot at, but all that would need to be done is to turn their head briefly in the direction of fire which would cause them to see the enemy and automatically factor it in to their decision making. Easy!
Before I get sidetracked making these improvements however I’m going to port the demo to C++ using DirectX10. The C#/XNA version is available on the download page. It may still be in need of some refactoring.
If for any reason you want to mess around with their behaviour, the best way is to modify or rewrite the TargetChooser() method in the Agent class, (all this does is set ChosenTarget - which holds an index of the target, and also sets TargetType to AGENT or OBJECT_OR_MEMORY - which is necessary to differentiate between agents and objects with the same index.)
Updates Soon...
The AI is now in a finished state. It’s HFSM based AI with a little bit of learning thrown in. It was an interesting journey, the biggest conclusion being that unless you have enough animations and general ‘things-for-them-to-do’, they can appear relatively unintelligent even if they are actually doing some quite clever things.
In the case of this AI, they learn to prefer different areas of the map based on their success rate with different weapons. They also have unique personalities, some being braver than others. The problem is that, being little cubes and not living for very long, this behaviour isn’t really very noticeable.
Another thing to take away from all this is that without a game to tailor their behaviour to, you can pretty much keep adding and adding to their intelligence in infinite little ways. In the end, you need a goal to work towards, otherwise, where do you stop?
I’ll post up the final results in the next few days, but in the weeks coming I’m going to strip out their behaviour from the framework and start fresh with a different system.