[Update] Dark Souls 2: Seamless Co-op - Individual player states & event areas

Next Post
[Update] Dark Souls 2: Seamless Co-op - Individual player states & event areas
1 / 4
DESCRIPTION

Hi everyone

Between the recent heatwaves in Europe and my AIO CPU cooler exploding over the weekend I haven't made as much progress on the mod as I would have liked, however development of the mod continues.

Individual progression

A cornerstone of the seamless co-op mods is that progression achieved whilst in the world of other player's carries over to your world.

Right now, in the current version of the mod, the following carries over when completed online (as a non-host)

Bosses remain dead

Unique enemies, and enemy death counter increments persist

Areas remain unlocked

Character progress (e.g. leveling up, weapon upgrades, etc)

What does NOT carry over right now:

Some shortcuts remain locked

Some fog walls remain (though these have no collision)

Items picked up in other worlds regenerate

I've already figured out how to resolve these issues, and it's mainly to do with MapObjStates which I have synchronised correctly but I need to manually save the new object states to the player's save file without also saving previously achieved object states (i.e. doors opened and progress made before you joined the host).

Gestures

In Dark Souls II, some gestures are given via talk dialogue-triggered events. Whilst some are achievable by both players, others are only obtainable by the player talking to the NPC. I have added networking to ensure all players receive a gesture item (if un-obtained) when another player gets it.

Technically speaking, the gestures are items that are invisible to the player when you open your inventory. Instead, they only exist as a signal that you've unlocked it.

Event areas

In previous posts, I've mentioned the challenges of working with event flags in Dark Souls II. In other games, event flags are a critical component of the game and govern everything from what items you've picked up, to which doors you've opened or bosses you've killed.

Previous seamless co-op mods have been easy to adapt to a state where the guest players can inherit progress made in the host world, however this is much more complicated in this game.

In addition to what I've called "core" event flags - ones that do relate to progression - every map has it's own set of map-specific event flags. These usually govern enemy states or behaviors.

For example, petrified statue enemies in Dark Souls II have their statue initialisation state determined by a map-specific event flag.

In the image above, you can see a segment of the EventFlagBuffer for "local" (i.e. your own save file) and "remote" (i.e. the host event state).

The issue is, guest players only have 3 slots for the area event flag buffer, whereas the host has 42. Increasing the size of this requires inline array widening which is extremely time consuming - Imagine having a "create your own adventure" book, but you insert new pages in the middle of the book, so now you have to go through the entire book changing the page references to reflect the changes that you've made.

What I've done instead is rather involved and would probably require hours of explanation in itself. But simply put I've made separate references to the event flag areas that are shared by both the game and the mod - When the game tries to load from the "remote_area_event_flag_buffer", it will instead return a pointer to memory created by the mod meaning.

Event clattery item drop

As a small feature I looked into out of interest - the crow nest that exists in Things Betwixt where you can trade certain items would previously cause some issues in seamless co-op.

This was because the item exchange feature would only work for the host, and even if a remote player stood on the nest the host could perform item exchange even without being in the area.

It literally only took me 30 minutes or so since it's such a small structure but I was able to figure out:

1) Why only the host could do item exchange

This is because there's a check before the RNG for the item exchange runs that calls the IsPlayerGuest function. This function is referenced thousands of times in various different conditions but here it seems FromSoftware explicitly forbids guest players from using this feature. It is now working for all players.

2) Why only one player needed to interact with the nest

The nature of seamless co-op is that most event flags triggers are communicated between all players (as opposed to only the host). Event flag ID 102020001 signals to the game that the player is standing on top of the nest where item exchange happens, therefore the "is_clattery_active" byte is set which means specific items will be exchanged for others. Disabling this flag from being networked between players avoids this issue.

As always - thank you for your patience and a huge thank you to all of my supporters <3

Just a reminder to look after yourself and keep hydrated in the heat!

Take care,

Yui

Yui PATREON 22 favs
VIEWS1
FILES4 files
POSTEDJul 1, 2026
ARCHIVEDJul 1, 2026