The goal of this project was to write an AI (DLL) that could survive as long as possible in a world with houses, loot and enemies.
The world is random generated by a framework provided for us and we write a plugin (DLL) for it. We have certain methods we can call to from inside the dll but we know nothing of the world.
The houses are random placed, enemies getting stronger over time. You also lose energy over time and when your energy is 0 you lose health. When your health reaches 0, you die. Inside houses there are pickups going from pistol, medkit, food(energy) to garbage. The AI must also manage the inventory besides exploring and surviving.
For this AI I decided to write my own implementation of Utility AI. We have list of actions(Buckets) which are evaluated at the same time by conditions. These conditions generate a utilityscore based on mathematical curves(linear, quadratic, logaritmic, custom,..)and input parameters. The curves always return a normalized value between [0-1] to know how important an action is without having to guess is it 15% or 15/20. The highest scoring action will execute his action behaviour.
With this score I can also switch on/off bucktes. Every action also has a weight to enable priority over the actions.
By using these curves, weights and buckets I can easily switch my AI behaviour without having to rewrite half of my tree if I was using behaviour tree's. I can also make a more complex and tactical AI that isn't very predictable over time. Also the AI is easily managed and scaled.