[Update] Dark Souls 2: Seamless Co-op - More QoL changes and enemy synchronisation optimisation
Hi everyone
Development of the mod continues. In this post I'll be discussing a QoL feature for the mod, as well as some changes I've made to the core co-op elements of the mod.
Controller deadzone
Dark Souls II is notorious for it's controller dead-zone layout which can make controls feel unresponsive and lead to some clumsy mis-inputs where you'll want to attack an enemy and end up over or under swinging.
Looking into this, I managed to find out where the dead-zones were handled in the main app input function, however as I am completely inexperienced with such things I have - with permission - implemented the pre-existing deadzone fix into DS2 Seamless co-op. This will make the controls with the joysticks feel more akin to the other dark souls games.
Removal of the axial dead-zone converting to a 36% radial dead-zone is a toggle players will be able to adjust the ini file.
Enemy synchronisation
Further to my previous posts on this topic, I've made progress refining this very important mechanic.
Enemy synchronisation in vanilla co-op is imperfect, and this is mostly to do with:
Infrequency of enemy AI updates
Enemy generation on-the-fly, as opposed to fixed enemy spawning
Problematic issues with enemy network data parsing
There is a fixed limit of 255 enemies per-map in Dark Souls II, and I have not increased this in seamless co-op. This means that any mod that breaks this cap (that would crash the game anyway without other mods) will not work online.
As mentioned in the post about this previously. In the other souls games enemy synchronisation is handled by a 'WorldChrSync' class which can be accessed any time, for any map, and is fairly easy to understand.
In Dark Souls II on the other hand, there is one "NetEnemyManager" class which is fixed to the map that you start multiplayer in. That means that if you were to start your session in Majula, the enemies would work find t here, but then completely de-sync when you moved to a different map, sat at a bonfire, or if one playher reloaded an area.
Seamless remedies this by:
Dynamically creating new instances of NetEnemyManager per-map
Triggering a refresh of enemy AI player allocation when sitting at a bonfire, reloading an area, or when another player joins
I have done several play-throughs of Dark Souls II at this point with friends, and I'm pleased to say that it seems to be working very well. There is occasional de-sync of enemy position - which is especially noticeable with one boss in particular for some reason - but I'm very happy with how it's working.
Improvements to spectator mode
Spectate mode will now correctly display the health/stamina of the player who you are spectating. You will also receive boss souls as normal if you are dead when the boss is defeated.
What I'm working on right now:
I thought it might help to tell people what I'm working on right now
Creating a system where items are not instanced correctly
At the moment a guest player can pick up an item in the host world and it will regenerate when they re-spawn.
This is unfortunately very annoying to do because, unlike the other souls games, ItemLot pickups are not associated with event flags. They are directly attached to the object that they spawn from themselves, meaning I have to access unloaded object data during a session
Creating a system where some area-specific flags are not saved correctly to the guest world
Right now, if you are a guest and you kill a boss in the hosts' world. When you go back to your own world the boss will still be there, but in a dead state (meaning the fog wall won't be there, and the boss will be technically dead but just standing there idle.
Fixing 'The Abyss'
The Abyss is a purely single-player only area in the game accessed via a covenant. It's currently semi-functional, however the boss of this area can only be accessed by the host
Fixing bonfire warps
Currently, if one player sits at a bonfire whilst another player is just starting the warp animation, it will softlock the player warping. Meaning they have to restart. I know what causes it I just need to get around to fixing it.
Fixing the 'duplicate player' bug
Occasionally, a rare race condition can happen if you warp at the same time as the host, causing the host to spawn twice. This will inevitably crash the next time you hit a load screen. I know what causes it I just need to get around to fixing it.
Thank you for your patience, and a huge thank you to all of my supporters <3
To everyone asking for early builds in direct messages - I cannot help you the mod is not ready yet. I will let people know when it is ready for testing. Thank you.