I've been working on a multiplayer (MMO-ish) game. Currently at the point where most of the core stuff is in place and now I'm implementing the A.I. Recently there have been some great links posted on HN regarding Game A.I, and I'm very grateful for it! Implementing A.I has been a ton of fun and not as overwhelming as I thought it'd be. I think my game will be dependent on "smart" A.I behavior so I'm really trying to get this part down.
The language i'm using - Elixir - also has some very interesting features that make it easy to integrate async a.i planning + a.i to a.i group communication. Ahh, I find it so exciting. The main simulation loop is never blocked. Meanwhile the A.I planner just chugs along as a separate process, spawning and despawning new agents in the world, creating and merging control groups, and setting new goals.
Nice use case about Elixir! You should definitely write about it, I'm getting sick of the "We used Elixir/Phoenix/LiveView" articles out there. MMOs are one field where Erlang/Elixir can shine a lot due to their concurrency model, their fault tolerance, and especially no-downtime upgrades thanks to hot code reloading (very attractive to upgrade the server without disconnecting people).
I've been meaning to write a StarCraft 1 AI bot and put in the 24/7 SSCAIT tournament on Twitch but... never enough time. Elixir seems like the perfect fit, though it's unclear whether it can handle the computations when things get hectic.
GOAP has worked very well for us for an open-world game with tons of NPCs taking part in non-linear interweaving quest lines. Planning performance is an ever growing issue however…
Yeah, F.E.A.R. left a lasting impression on me. NPCs charted a path around the level to sneak up behind me and kill me while I was in a protracted firefight with the rest of their buddies.
I now have a strong need to go and replay F.E.A.R and see how well it holds up! I remember back in the day comparing it favorably to Half Life 2, which still holds up well.
if you do, be sure to check PCGamingWiki to see what you should do to make it run as well as possible on modern machines—I ran into issues both with F.E.A.R. and Condemned: Criminal Origins, another title from the same developer https://www.pcgamingwiki.com/wiki/F.E.A.R.#Essential_improve...
Conventional game AI is usually search algorithms for movement (like A*) + finite state machines for behavior. No network calls to LLMs, no machine learning, etc. At the fringes, throw in the odd markov chain for procedural text generation.
Basically AI post 2019 usually means LLM, and they're making the distinction that this is not that.
Not the person you're asking, but I think it's clear from context that they meant "no artificial neural networks" and other forms of AI that are trained from data. From the Github repo:
It provides:
Finite State Machines
Behavior Tree
Utility AI
Goal Oriented Action Planning
I would like to say thank you for posting this, I am currently building a similar toolkit in Lua and will most likely restart and just port your code instead :)
related question to @Jemaclus above - why is C++ the popular language for gamedev? not C# or some other higher level language. is it only for when you're working on console games or does it also matter on desktop games?
The number of emojis in that readme is ridiculous. It non-sarcastically makes me doubt the quality of the project. (although having the repo URL point to a LinkedIn page is probably worse)
Context: Spent most of my C-ish experience on Objective-C
What is the advantage of header-only?
My mental model was headers ~= implementation as far as compiler is concerned, thus limiting the size of headers is a way to indicate API surface area and document.
It's all C++ template classes, which must be fully defined at their declaration site (so the header). When using the template, the compiler will generate the code needed by "instantiating the template" (for lack of a better word).
The other advantage is that it requires no build system to include in your project.
The language i'm using - Elixir - also has some very interesting features that make it easy to integrate async a.i planning + a.i to a.i group communication. Ahh, I find it so exciting. The main simulation loop is never blocked. Meanwhile the A.I planner just chugs along as a separate process, spawning and despawning new agents in the world, creating and merging control groups, and setting new goals.
FYI, GOAP was what made F.E.A.R such a cool game: https://www.youtube.com/watch?v=PaOLBOuyswI
https://archive.org/details/GDC2006Orkin
Thanks for this. I loved the ai in that game. Very few games are as good without cheating even today.
Basically AI post 2019 usually means LLM, and they're making the distinction that this is not that.
Here's my potentially dumb question: what's the benefit of header-only libraries versus regular C/C++ code?
On top of that, the "Installation" instructions are just "copy the file in your project", no CMake, no Meson, not any kind of build system.
It is extremely clean and concise.
Feel free to open issues or discussions on the repository if you have any difficulty.
Unreal Engine uses C++. You have boost, SDL, Ogre3D, Irrlicht, EnTT, ImGui, etc... aka: C++ has a good ecosystem for gamedev.
The "Zero Cost Abstraction" philosophy of C++ makes it easier to squeeze out the performance you want.
Unity (and recently Godot 4) uses C# but they are still relatively young in the field. We were making games long before those :)
I would not say it's "THE" popular language, but it does have an history.
This should cover all you need to make an NPC a bit smarter (but it is still "scripted").
LLMs are not what you would use to make a bot in Civilization, or Age of Empires.
What is the advantage of header-only?
My mental model was headers ~= implementation as far as compiler is concerned, thus limiting the size of headers is a way to indicate API surface area and document.
It's all C++ template classes, which must be fully defined at their declaration site (so the header). When using the template, the compiler will generate the code needed by "instantiating the template" (for lack of a better word).
The other advantage is that it requires no build system to include in your project.
Deleted Comment