Closed alpha starting this week.
The rest of development will be focused on three things:
- Content creation
- NPC/AI refactoring
- Polish & Testing
The second being the most critical one. I've been talking about this before (modular NPCs) but it also involves something I've been dodging a bit and that is "crimes against friendly NPCs"
I'd hope to include this, because it would add a lot of complexity to the game world, but I must also say, if it doesn't work out properly, I'd be ready to drop it in favor of a more polished end product.
So what's this NPC refactoring:
Essentially I would like to bring AI respectively my NPC class to a level of abstraction, where the game does no longer differentiate between enemies and friends on the basis of static code. This means there are no creatures in the game that are "coded" as hostile, but base their hostility on faction, reputation meters, player actions etc.
The architecture for that is basically there. Both friendly and hostile NPCs are all the same class and check their relation to one another once they enter their perception radius. What's currently missing is a more sophisticated implementation behind that architecture. Currently it's a relatively primitive mechanism that determines the hostility of an entity based on a comparison of factions. This comes with one major disadvantage though - as kind of a work around for turbulent combat situations, non-hostile characters cannot damage each other.
The players being part of a "good guys" faction cannot damage any NPCs, which limits possibilities compared to other games - let's say Arx or Ultima (in general, not just Underworld).
So what I'd need is an enhancement of the faction/hostility system and a separate "crime system" that can alter the variables in the earlier system. The goal is, to have a game where the player can theoretically go on a rampage and still finish it.
I'm currently in the process of planning this out in more detail. Basically I see three major crimes the player could commit:
- taking private property (from the open world or from a container)
- attacking someone
- trespassing
The implementation of an event that says "You have committed a crime" for these is pretty simple. In fact, the first and last can be implemented in about 10 minutes with the current player setup. The question is how the AI perception system should be triggered once that happens. Because on the one hand you require the change to propagate into the faction/hostility system, but then you also need to re-evaluate the players presence in the face of NPCs whose perception system the player already entered. That can (and should) trigger a cascade of re-evaluations that potentially turn a whole portion of NPCs against you. This is kinda tricky, because the consequences to the player actions become highly chaotic - which is, admittedly, part of the fun.
What's a bigger problem is the game design aspect: What happens if the player kills an "important" NPC? It basically requires you to design every part of the game around the fact, that the player might just go haywire. Luckily, I mostly refrained from hiding critical quest items in the dialogue system of the game (which can spawn items and alter entity states)
What I need however, is a persistent NPC inventory system that cooperates with NPC spawns (currently NPCs are all dynamically spawned into the world, so you can't hide their static inventory (static = basically everything I decide within the unreal editor) with those spawned character classes, but you have to move it into a separate, persistent data structure that can be accessed by the dynamically spawned instance of an NPC). Why do I need that? Imagine an NPC spawns, alters its inventory, then despawns. If it respawns, the old inventory state would be there again, that is, unless you save it separately.
Now the inventory system must also include the critical quest items, which are dropped once you kill an NPC or removed from the inventory when you take the item in a dialogue. In the case of killing the NPC, the loot/corpse must be persistent, i.e. it must never despawn or you'll lose quest items.
Also this kind of separate NPC inventory system (together with the crime system) opens up the possibility for pickpocketing. You'd open up the inventory with a certain player move and as long as it's open your character is sending out "You are committing a crime" events which can then again trigger this cascade of NPC/hostility re-evaluations. But let's forget that for the moment. That just makes things more complicated (also it's polling based, which I'm not too fond of).
The whole NPC refactoring also requires some additional changes with regards to combat animations, but since I'm eyeballing modular NPCs with a shared animation rig anyway that's not such a big problem (in fact, that's how I should have gone about it from the very beginning, but the blender/ue4 pipeline just wasn't at that point of maturity back in 2017/18).
Yadda, yadda, yadda, to cut my ramblings short: This is what I'm currently thinking about. Keeping this nice and clean and modular is a whole other challenge. Refactoring is the bane of any slowly growing system - unfortunately the old "keep it King's-Field-simple" formula starts disrupting, especially with regards to NPC AI, once Arx Fatalis and Ultima's features start breaking through more and more.
Which is basically where we stand. As I said, I'm still cautious about all of this and if this whole thing suddenly blows up the scope of the project in a way that is not manageable I'll drop it.
But for now: It's a bit of programming, it's a bit of animation work and it's a whole lot of "keeping encounters modular to avoid game/plot breaking design flaws". The good thing is: Even if the crime system doesn't end up in the game, those game design decisions still work on their own, those NPC animations still have their value (since they are done on a generic rig) and the NPC/hostility mechanism can easily be resetted to the current primitive mechanism. So that should be fine. It'd be lost time at worst - which I wanna avoid by now, but if it actually works out Monomyth enters a whole new level of complexity and I think that's worth the "risk".
So that's basically it from me for the moment.
See you in the alpha!