Just before the end of Empire the lead Battle AI programmer left CA to return to his family up north. Unfortunately, thanks to Mr Wilberforce’s efforts 200 years ago we couldn’t stop him. It left us with a battle AI, which at that stage, struggled to beat good players in a fair fight, and was pretty much at the mercy of great players, even with a level of handicap (I call it cheating) that is all too obvious.
Since then we’ve had our most talented programmers pick up where he left off, but becoming the master of a chunk of code that took almost three years to write is not an instant thing. In the updates so far we’ve got rid of some of the worst behaviours that are close to the surface, and have started to tackle deeper issues like unstable decision loops that cause the AI to mill around rather than hold its line and fire. We’re also starting to add new behaviours, for example taking better advantage of hilly terrain. These improvements take the code further than we’ve been able before and will be there for Napoleon but we’re not sure yet whether we’ll be able to reverse them back in to Empire in a future update – the code has moved on. If we can we will.
Our overall aim with the improvements is first to get rid of any erratic behaviour, second to improve general performance to the point where the obvious handicaps can be removed, and then to add a greater variety of ‘smart’ behaviours. None of these have a fixed finish line – it’s a process of continual improvement, and each game will get AI better than the last one. Including Napoleon.
Progress is frustratingly slow but thankfully rewriting the Rome: Total War codebase has left us with a clean codebase that is easier to work on, and an architecture that has way more potential than Rome’s. The main difference is the shift to a goal oriented planning system rather than a static system that has no long term plans. This has yet to fully pay off. But it will. When it does I’ll talk about it again.
Battle AI is not rocket science – its way, way harder than that. It’s so difficult that very few strategy games attempt it. Most use simple scripts of canned behaviour that fire when you bump in to them, and very simple swarming behaviours. They’re limited, and are “gamey” rather than real world. What I mean by that is that the tactics you use to beat them are something that you have to learn for each game or sometimes each scenario/level, and bear no relation to reality. What we strive for is a game where real world tactics actually work. It’s not the easiest path to take, but it is the most rewarding.
If you’re a genius C++ programmer, you understand exactly how difficult this problem is, but still think it’s the most interesting code problem in the world, apply for a job. We’ll find space for you.