Constraints
A strong design choice was to have a lot of NPCs (non-player character) running around. I wanted chaos and interaction. 100+ NPCs on maps is the norm in RS. A lot of NPCs are updated almost each turn. Roguelikes are fast paced games and it is not acceptable to wait 1 second between turns because the 100 fancy AIs use A*, reinforcement learning and whatnot. I also wanted zombies to behave like zombies, and citizens to behave like citizens.
To sum up:
- Fast processing.
- Recognizable and typical behaviors.
In other game projects I tried to used fancy stuff like Genetic Algorithms, Neural Networks, Planning etc..
Problem is they don't really work or are overkill and you have little control on the decision process. I read a bunch of game AI papers. Most of the time AI researchers are using complex techniques to evolve or design simple pacman-level AIs. So much effort for -excuse me- so ridiculous results.
I had much better results with very simple rule-based AIs and it is faster too. Interesting AI doesn't necessary need complex AI. Note I did say interesting not good. It's a game, you want interesting and amusing NPCs, not competitive NPCs.
Lesson learned. KISS : Keep It Simple Stupid.
Basic algorithm
Straightforward rule-based stuff, not even a FSM and not even an AI engine.
- Sense the environement with Sensors.
- Scan a list of rules (trigger -> Behavior) until a behavior propose a valid action.
- Execute the proposed Action.
- the use of the Sensors : they interpret the environement into useful percepts.
- the relative complexity of the Behaviors : they might check for additional conditions or call other Behaviors.
- the ordering of the rules : do this (eg: flee the zombie) instead of that (eg: try to get the item next to the zombie) and the NPC will appear to be clever.
Example AI : CivilianAI (actual code screenshots)
AI used by the hopeless citizens roaming the streets.
They try to survive just like you and they currently have 16 rules to do so.
From the most important one:
...To the least important one:
Some rules are more complex, using percepts computed by the sensor and apply filter on them to get only revelant data.
For instance:
BehaviorGrabItem is more complex too, it checks additional stuff on item, in particular if the NPC really want this item:
Conclusion
So as you can see it's not rocket science. Behaviors and rules aren't even objects, there is no rule engine etc...
But it gets the job done quickly both for me and the player. Those AIs are going to die anyway, and probably out of the player sight, so do you really need fancy stuff? I think not.
Would I do the same for my next game? Yes sir! The only change I would consider is encapsulating behaviors and rules into objects, and better algorithms (A* pathfinding...) if I can allocate more CPU time.
End of post.
No comments:
Post a Comment