Skip to content

Conversation

@jacob-keller
Copy link

@jacob-keller jacob-keller commented Jun 6, 2025

Add some basic support for detecting and splitting encounters by CE, based on the 0x21 network log line. The IDs for this are manually determined, but we now pull the encounter names from xivapi, and generate appropriate mappings.

This works ok in my tests, and so far doesn't appear to break any other encounter logic. However, it likely needs more testing and fine tuning.

I also now added logic to pull the CE info from xivapi, with a new generator script. I did pull a bit more data than we currently use (since the current code doesn't use anything but the english names). I don't yet pull the Chinese or Korean data like how zone_ids.ts does yet.

There's probably some further cleanup we can do around encounter support, but I wanted to try and get the very basic splitting functionality done.

  • util: add support for sheets with subrow_id to xivapi
  • util: log eslint errors when failing in writeFile
  • util: generate CE info from xivapi
  • encounter_tools: detect and report CEs as separate encounters

Signed-off-by: Jacob Keller jacob.keller@gmail.com

@cactbotbot
Copy link
Collaborator

cactbotbot commented Jun 6, 2025

@jacob-keller Thanks for your contribution! 🌵🚀

@github-actions github-actions bot added resources /resources util /util labels Jun 6, 2025
@jacob-keller
Copy link
Author

@valarnin do you think something like this could be merged? I tried to figure out a way to make the encounter listing work without breaking existing support.

@jacob-keller
Copy link
Author

I guess my question is whether this approach is good, or if we need to do some other refactoring on the encounter logic as a whole to properly support CEs.

@jacob-keller
Copy link
Author

I have some more thoughts on this, and I will try to clean it up before making it a non-draft

@valarnin
Copy link
Collaborator

I'll hold off on reviewing actual code changes in detail until you switch to non-draft.


As far as I've been able to determine, the mapping of DirectorUpdate param to CE ID is done in the game's lua, which means that unfortunately we can't pull that automatically. What we can do is pull DynamicEventSet -> DynamicEvent mappings from XIVAPI and expose those as a data file, and at least have automatic translations and such for the data.

DynamicEventSet's data in the base CSV is e.g. 3.5,37, where 3 is for OC, 5 is the 5th CE in OC, and 37 is the row ID in DynamicEvent corresponding to Calamity Bound.

Unfortunately, XIVAPI has a bug with this data sheet where the Unkown0 field is invalid. Once the XIVAPI bug is fixed, I envision something like:

// normal typedef for XIVAPI exported data

const data: DynamicEventSetType = {
  '3.5': {
    // ... other fields
    'Name': {
      'en': 'Calamity Bound',
      // other langs
    },
  },
} as const;

export default data;

export type CEMap<CEList> = {
  [directorCEID: string]: keyof CEList;
};

// `<foo>CEs` auto-generated based on XIVAPI sheet
// `<foo>CEs` keys auto mapped by stripping non-alphanumeric characters
// and lowercasing first character maybe?
// `<foo>CEMap` is a manual mapping in the util script, like in `zone_overrides.ts`

export const bozjaCEs = {
  // entries from `data` starting with `1.`
} as const;

export const bozjaCEMap: CEMap<typeof bozjaCEs> = {};

export const zadnorCEs = {
  // entries from `data` starting with `2.`
} as const;

export const zadnorCEMap: CEMap<typeof zadnorCEs> = {};

export const southHornCEs = {
  // entries from `data` starting with `3.`
  'calamityBound': data['3.5'],
} as const;

export const southHornCEMap: CEMap<typeof southHornCEs> = {
  '32F': 'calamityBound',
};

Other solutions are fine too, the ultimate goal is to source the name of the CE and its base "zone" from XIVAPI somehow.

@jacob-keller
Copy link
Author

Unfortunately, XIVAPI has a bug with this data sheet where the Unkown0 field is invalid. Once the XIVAPI bug is fixed, I envision something like:

Any idea if XIVAPI stuff is open source and I could look at what it takes to fix this?

@valarnin
Copy link
Collaborator

Any idea if XIVAPI stuff is open source and I could look at what it takes to fix this?

It's fixed as of a minute ago or so. https://v2.xivapi.com/api/sheet/DynamicEventSet/3:1

For future reference, the XIVAPI discord is at https://discord.gg/MFFVHWC

@jacob-keller
Copy link
Author

I'll take a stab at implementing something hopefully in the next couple of days

@jacob-keller jacob-keller force-pushed the jk-encounter-tools-ce-support branch from 6d9744d to e38d07b Compare June 13, 2025 07:09
@jacob-keller jacob-keller changed the title encounter_tools: attempt to support CEs without breaking others encounter_tools: add basic support for CEs Jun 13, 2025
@jacob-keller jacob-keller marked this pull request as ready for review June 13, 2025 07:12
@github-actions github-actions bot added the needs-review Awaiting review label Jun 13, 2025
Copy link
Collaborator

@valarnin valarnin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll do a more proper review later or tomorrow, just wanted to address this first.

@valarnin valarnin changed the title encounter_tools: add basic support for CEs util: add basic support for CEs to encounter_tools Jun 13, 2025
@jacob-keller jacob-keller force-pushed the jk-encounter-tools-ce-support branch from e38d07b to e573741 Compare June 13, 2025 22:33
@jacob-keller
Copy link
Author

I have some additional followup work to extend the make_timeline.sh with support for inserting appropriate headers for the CE start, as well as a new --timeline_offset commandline argument to allow adjusting the initial timelinePosition value to make it easier to create CE timelines in the way that we have them laid out in the exploration zone timeline files. I'm planning to submit those after this merges.

@Legends0
Copy link
Collaborator

I think it worked for what I provided in #736 ?

@jacob-keller
Copy link
Author

Updated to include the director ID for forked tower reported by Legends0.

@github-actions github-actions bot added the raidboss /ui/raidboss module label Sep 6, 2025
@github-actions github-actions bot removed the needs-review Awaiting review label Sep 6, 2025
@jacob-keller
Copy link
Author

Does this need any changes to be acceptable?

@Legends0
Copy link
Collaborator

Legends0 commented Sep 24, 2025

Some additional notes... there are more action control lines within forked tower: blood:
33B => Demon Tablet
33F => demon tablet defeated
33C => trash before dead stars cleared (I think one side can still be clearing trash when this happens?) (It's when both sides activate the button, regardless of trash state)
340 => Dead Stars defeated
33D => Bridges cleared
341 => Marble Dragon cleared
33E => Magitaur room unlocked

There might another for after Magitaur, probably 342. EDIT: There was nothing. I also labelled this in my forked tower pr.

@jacob-keller
Copy link
Author

I ended up only including the entry portions instead of the director IDs for defeating stuff. Not sure how useful those would be.

I found them useful for debug as markers in console logging for what part of the encounters I was on when checking for actor log errors with some of the triggers, but the log messages themselves should have also had the trigger name in them. Since the encounters in Forked Tower have seals the director ids would mostly be for completeness.

I can add them, but we'd need to either add a separate synthetic entry or add something to the CeInfoType that doesn't exist for the other CEs if I understand it right?

Signed-off-by: Jacob Keller <jacob.keller@gmail.com>
@jacob-keller
Copy link
Author

I ended up only including the entry portions instead of the director IDs for defeating stuff. Not sure how useful those would be.

I found them useful for debug as markers in console logging for what part of the encounters I was on when checking for actor log errors with some of the triggers, but the log messages themselves should have also had the trigger name in them. Since the encounters in Forked Tower have seals the director ids would mostly be for completeness.

I can add them, but we'd need to either add a separate synthetic entry or add something to the CeInfoType that doesn't exist for the other CEs if I understand it right?

In particular, outside of the tower, CEs end with a 80000014 entry with the director ID set to 00, but inside the tower, they instead end with the special unique IDs? I'm not sure how best to handle adding these. I don't think they warrant their own entries in the synthetic CE list.

@jacob-keller
Copy link
Author

@xiashtra is there anyone who can review this to merge? Its been waiting quite some time, and I believe I have fixed most of the remaining issues, with only the issue of the "success" IDs being missing, but I'm not sure how useful those would be.

@Legends0
Copy link
Collaborator

Legends0 commented Dec 9, 2025

I think there might be some duplication when viewing a forked tower log:
image

The -1s lines cannot be queried and result in fight not found.

The CEs outside work:
image

EDIT: Duplication probably isn't the right word to describe it. It just looks wrong and I am unsure if that is the intended output for a forked tower log since the encounters don't produce a timeline and if they did, the binding lock one would be useful for manually creating a timeline.

@jacob-keller
Copy link
Author

I think you're right. For CEs we use the "000000" id to reset the encounter. Does that happen in Forked Tower? Maybe we do actually need to use the ending ID to check when the CE ends.

@Legends0
Copy link
Collaborator

Legends0 commented Dec 9, 2025

I think you're right. For CEs we use the "000000" id to reset the encounter. Does that happen in Forked Tower? Maybe we do actually need to use the ending ID to check when the CE ends.

I don't see a 000000 id in the Forked Tower. The ending ID seems like an alternative to use, but I am unsure how missing the ending ID (such as through a disconnect/reconnect) or exiting the instance would impact the parse.

@jacob-keller
Copy link
Author

Ok. I wonder if those extra ones are because of the cases where we get two unseals for the passage ways?

@jacob-keller
Copy link
Author

I also noticed it says "The pronged passage" instead of "Pronged Passages".

@jacob-keller
Copy link
Author

Ok, it looks like what happens is that the encounters within forked tower use traditional unseal lines rather than CE data. This means that we're essentially starting the CE and immediately ending it when the unseal line happens.

@jacob-keller
Copy link
Author

@Legends0 I'm not sure what the best solution is. I can try adding the end IDs, but I don't think that will help, because the seal lines are also triggering encounters. That might mean we should just leave out the forked tower CE lines, or mark them as not generating encounters somehow?

@jacob-keller
Copy link
Author

We also seem to completely lose the central passages encounter, possibly because it doesn't keep you incombat the entire time? We could instead mark the seal lines within forked tower as invalid somehow and rely solely on the CE director IDs instead?

@jacob-keller
Copy link
Author

I make a script to find all of the director ID updates and seal/unseal lines for my two runs on Sunday:

33|2025-12-07T17:14:42.0140000-08:00|8004002D|80000014|33B|00|00|00|638d8d96bb869ee1
41|2025-12-07T17:16:53.2830000-08:00|8004002D|7DC|02|1450|0F|433c6fb95a8a3ede
00|2025-12-07T17:17:08.3630000-08:00|0839||The Palaeography Room is sealed off!|c5137a7d0041eb11
41|2025-12-07T17:22:15.2410000-08:00|8004002D|7DE|02|1450|00|701b7464aea7f8f8
33|2025-12-07T17:22:15.2440000-08:00|8004002D|80000014|33F|00|00|00|14fe61d2772dcef0
00|2025-12-07T17:22:15.2670000-08:00|0839||The Palaeography Room is no longer sealed!|886cc1ae3e2a12fe
33|2025-12-07T17:29:44.1460000-08:00|8004002D|80000014|33C|00|00|00|8ed49c698f11a9ff
41|2025-12-07T17:34:23.5290000-08:00|8004002D|7DC|02|1451|0F|ad433fbe007e91fd
00|2025-12-07T17:34:38.6410000-08:00|0839||The Astronomy Room is sealed off!|f41a755531807fda
41|2025-12-07T17:41:16.9290000-08:00|8004002D|7DE|02|1451|00|61d9fc9fa96dd941
33|2025-12-07T17:41:16.9290000-08:00|8004002D|80000014|340|00|00|00|f966fe6b01031522
00|2025-12-07T17:41:16.9720000-08:00|0839||The Astronomy Room is no longer sealed!|8cfef7c3cfd7d2d1
41|2025-12-07T17:47:53.8890000-08:00|8004002D|7DC|02|1454|0F|48f7f730758a6292
00|2025-12-07T17:48:08.9420000-08:00|0839||The pronged passage is sealed off!|e7851b729361b0c5
41|2025-12-07T17:52:36.2330000-08:00|8004002D|7DE|02|1454|00|b4067c0f2f012c1c
33|2025-12-07T17:52:36.2330000-08:00|8004002D|80000014|33D|00|00|00|1c867b02b71f569b
00|2025-12-07T17:52:36.3080000-08:00|0839||The pronged passage is no longer sealed!|27d7a1d07c358bf2
41|2025-12-07T17:55:53.8480000-08:00|8004002D|7DC|02|1452|0F|c6dedcf91379eda9
00|2025-12-07T17:56:08.8720000-08:00|0839||The Glaciology Forum is sealed off!|4ada6a06d8725f4e
41|2025-12-07T18:02:28.2970000-08:00|8004002D|7DE|02|1452|00|fcaf266475bd1863
00|2025-12-07T18:02:28.3600000-08:00|0839||The Glaciology Forum is no longer sealed!|454f1a9b139025d7
41|2025-12-07T18:13:08.1610000-08:00|8004002D|7DC|02|1452|0F|4152abee839fa4d0
00|2025-12-07T18:13:23.2130000-08:00|0839||The Glaciology Forum is sealed off!|57aa4dea1f00ecfa
41|2025-12-07T18:19:34.2100000-08:00|8004002D|7DE|02|1452|00|7fe0e953fdfb37df
33|2025-12-07T18:19:34.2100000-08:00|8004002D|80000014|341|00|00|00|8ad52763606f0ad1
00|2025-12-07T18:19:34.2580000-08:00|0839||The Glaciology Forum is no longer sealed!|cf8fd2b9575a20d4
33|2025-12-07T18:40:14.6340000-08:00|8004002D|80000014|33E|00|00|00|87fd0b4a0afe6964
41|2025-12-07T18:42:53.8290000-08:00|8004002D|7DC|02|1453|0F|4ab38a0bb2509313
00|2025-12-07T18:43:08.9090000-08:00|0839||The Haematology Room is sealed off!|1f9648a9ffd5b812
41|2025-12-07T18:46:58.2650000-08:00|8004002D|7DE|02|1453|00|90a591e4096cac00
00|2025-12-07T18:46:58.3190000-08:00|0839||The Haematology Room is no longer sealed!|2afcbda818b46bf2
33|2025-12-07T18:47:17.1040000-08:00|8004002D|80000014|00|00|00|00|78f889111eff29e0
33|2025-12-07T18:56:41.0330000-08:00|8004002D|80000014|32E|00|00|00|ad393cf5451d39fa
33|2025-12-07T19:00:50.9330000-08:00|8004002D|80000014|00|00|00|00|b682ed27c463b585
33|2025-12-07T19:22:38.0200000-08:00|8004002D|80000014|33B|00|00|00|b19508fade22f7c4
41|2025-12-07T19:25:39.4520000-08:00|8004002D|7DC|02|1450|0F|e0035894661a9617
00|2025-12-07T19:25:54.5390000-08:00|0839||The Palaeography Room is sealed off!|9eb3c40fe8aecab5
41|2025-12-07T19:30:17.6840000-08:00|8004002D|7DE|02|1450|00|4d28c27f34518d82
33|2025-12-07T19:30:17.6840000-08:00|8004002D|80000014|33F|00|00|00|2fdb0a56d4f2f52e
00|2025-12-07T19:30:17.7140000-08:00|0839||The Palaeography Room is no longer sealed!|9fdfd401a4ed61c7
33|2025-12-07T19:34:35.5980000-08:00|8004002D|80000014|33C|00|00|00|6d1014238800e300
41|2025-12-07T19:38:19.0700000-08:00|8004002D|7DC|02|1451|0F|79d39b9749420bce
00|2025-12-07T19:38:34.1330000-08:00|0839||The Astronomy Room is sealed off!|3a728e09bee7b64e
41|2025-12-07T19:44:35.2070000-08:00|8004002D|7DE|02|1451|00|99b184ef23ad5273
33|2025-12-07T19:44:35.2070000-08:00|8004002D|80000014|340|00|00|00|6c834a281facf151
00|2025-12-07T19:44:35.2370000-08:00|0839||The Astronomy Room is no longer sealed!|90b9edf245756e2c
41|2025-12-07T19:47:34.0170000-08:00|8004002D|7DC|02|1454|0F|3ea8d93e1864e754
00|2025-12-07T19:47:49.1550000-08:00|0839||The pronged passage is sealed off!|ea72fcbddbbc0be7
41|2025-12-07T19:51:34.9950000-08:00|8004002D|7DE|02|1454|00|d6a0a1b0e463c090
33|2025-12-07T19:51:34.9950000-08:00|8004002D|80000014|33D|00|00|00|3727e8b80741fb84
00|2025-12-07T19:51:35.0210000-08:00|0839||The pronged passage is no longer sealed!|159b2975a8765404
41|2025-12-07T19:55:04.2590000-08:00|8004002D|7DC|02|1452|0F|505af21c6a1f73b9
00|2025-12-07T19:55:19.3380000-08:00|0839||The Glaciology Forum is sealed off!|fb96604ce0a84597
41|2025-12-07T20:00:59.0550000-08:00|8004002D|7DE|02|1452|00|65a51f16f2da94e1
33|2025-12-07T20:00:59.0550000-08:00|8004002D|80000014|341|00|00|00|6d8a857a51495eb8
00|2025-12-07T20:00:59.0930000-08:00|0839||The Glaciology Forum is no longer sealed!|eecb15f6b2391cd7
33|2025-12-07T20:10:29.3700000-08:00|8004002D|80000014|33E|00|00|00|ef56ee288fbc5f66
41|2025-12-07T20:20:04.1180000-08:00|8004002D|7DC|02|1453|0F|d8f0f94e3828f7e1
00|2025-12-07T20:20:19.1780000-08:00|0839||The Haematology Room is sealed off!|a9c01a26bc61fa0e
41|2025-12-07T20:27:08.8570000-08:00|8004002D|7DE|02|1453|00|0c6a823bdc35b440
00|2025-12-07T20:27:08.8730000-08:00|0839||The Haematology Room is no longer sealed!|692c341fc1791354
41|2025-12-07T20:27:20.2720000-08:00|8004002D|7DC|02|1453|0F|ebf8d6bff183ddf0
00|2025-12-07T20:27:35.3120000-08:00|0839||The Haematology Room is sealed off!|e06ab38ffc25c2e4
00|2025-12-07T20:27:35.3370000-08:00|0839||The Haematology Room is no longer sealed!|89f0233fa7c71967
41|2025-12-07T20:27:35.3010000-08:00|8004002D|7DE|02|1453|00|5394e307b990c12d

From the look of it, se wee the 33B seal at 17:14:42 and 2 minutes later we see the net seal message at 17:16:53, followed in 15 seconds by the game log seal message at 17:17:08 then we see the director Update for the CE being done, the net unseal and the unseal log message:

41|2025-12-07T17:22:15.2410000-08:00|8004002D|7DE|02|1450|00|701b7464aea7f8f8
33|2025-12-07T17:22:15.2440000-08:00|8004002D|80000014|33F|00|00|00|14fe61d2772dcef0
00|2025-12-07T17:22:15.2670000-08:00|0839||The Palaeography Room is no longer sealed!|886cc1ae3e2a12fe

Then we see the 33F central passages director update. This is immediately followed by the unseal message from the palaeography room no longer being sealed:

33|2025-12-07T17:22:15.2440000-08:00|8004002D|80000014|33F|00|00|00|14fe61d2772dcef0
00|2025-12-07T17:22:15.2670000-08:00|0839||The Palaeography Room is no longer sealed!|886cc1ae3e2a12fe

This is why the central passages gets skipped. There's no seal or unseal for that "encounter". After this, we get the director id update for dead stars along with its room seal unseal:

# dead stars start
33|2025-12-07T17:29:44.1460000-08:00|8004002D|80000014|33C|00|00|00|8ed49c698f11a9ff
41|2025-12-07T17:34:23.5290000-08:00|8004002D|7DC|02|1451|0F|ad433fbe007e91fd
00|2025-12-07T17:34:38.6410000-08:00|0839||The Astronomy Room is sealed off!|f41a755531807fda
# dead stars end
41|2025-12-07T17:41:16.9290000-08:00|8004002D|7DE|02|1451|00|61d9fc9fa96dd941
33|2025-12-07T17:41:16.9290000-08:00|8004002D|80000014|340|00|00|00|f966fe6b01031522
00|2025-12-07T17:41:16.9720000-08:00|0839||The Astronomy Room is no longer sealed!|8cfef7c3cfd7d2d1

I'm really not certain how this should be handled. As it stands, I marked 33C as the "dead stars" ID, and 33F as the "central gallery" ID, but those are really the IDs for when the previous boss dies, (when demon tablet dies or when central gallery walls come down). Those do not make sense as "starting" encounters. Same for Marble Dragon which is 33D for clearing bridges, and 33E is likely the room unlock not the actual start of Magitaur.

Since these do not line up with the actual encounters. The only one that might work properly for making a timeline is the binding lock with the end of Marble Dragon up to when Magitaur unlocks.

Even trying to use the CE IDs to handle the central passages and lockwards is rough because the unseal gamelog message comes after the director update for the last boss being defeated...

@Legends0
Copy link
Collaborator

Legends0 commented Dec 9, 2025

We also seem to completely lose the central passages encounter, possibly because it doesn't keep you incombat the entire time? We could instead mark the seal lines within forked tower as invalid somehow and rely solely on the CE director IDs instead?

Keeping the 4 seal based encounters and ignoring the CE director IDs is simpler. It might be better to do a separate PR/feature request for handling the Central passages and binding locks since those seem to need to check for a future CE ID to know when to stop. I never checked if BA had something similar. It's good the CE IDs are documented, but for those that already have a seal it is creating an issue if we treat all CE IDs the same.

Outside of a Lockwards type encounter, the trash pulls leash and follow a short loop of abilities. There also looks to be some sort of counter for the lockwards that gets logged as actor controls, probably the countdown to activation/lock. In the raidemulator it also parses the trash encounters as part of the first pull of the boss, so triggers can be emulated against a timeline.

@jacob-keller
Copy link
Author

We also seem to completely lose the central passages encounter, possibly because it doesn't keep you incombat the entire time? We could instead mark the seal lines within forked tower as invalid somehow and rely solely on the CE director IDs instead?

Keeping the 4 seal based encounters and ignoring the CE director IDs is simpler. It might be better to do a separate PR/feature request for handling the Central passages and binding locks since those seem to need to check for a future CE ID to know when to stop. I never checked if BA had something similar. It's good the CE IDs are documented, but for those that already have a seal it is creating an issue if we treat all CE IDs the same.

Outside of a Lockwards type encounter, the trash pulls leash and follow a short loop of abilities. There also looks to be some sort of counter for the lockwards that gets logged as actor controls, probably the countdown to activation/lock. In the raidemulator it also parses the trash encounters as part of the first pull of the boss, so triggers can be emulated against a timeline.

The main issue is figuring out a clean way to avoid ending the encounter due to an unseal from the previous encounter consistently happening after the "start"...

@jacob-keller
Copy link
Author

I'm going to remove them for now with a comment in overrides documenting the IDs.

@Legends0
Copy link
Collaborator

Legends0 commented Dec 9, 2025

I also noticed it says "The pronged passage" instead of "Pronged Passages".

I think "Pronged Passages" was a typo. Misunderstood with colloquial use to describe the encounter as Bridges. It is one passage, and the pronged description means it splits like a fork, although it looks more like two prongs until the geomancer buttons are pressed to connect their ends.

Trying to include the CE IDs for the DirectorUpdate lines within the
forked tower is problematic. Each area gets its own DirectorUpdate upon
completion, but the main encounters already have seal/unseal lines to
track the encounter. Trying to treat these as CEs results in a bunch of
0-length encounters, and this results in confusion when checking
timelines with the log tools.

Theoretically we could try to use the IDs for tracking the central
passages and the lockwards. Unfortunately, this is problematic because
the DirectorUpdate happens *before* the unseal messages from the game.

For now, just remove these synthetic IDs and leave a comment detailing
the IDs for the future. If someone wants to try and fix the logtools to
better track this somehow they will have the information to help with
this.

Signed-off-by: Jacob Keller <jacob.keller@gmail.com>
@jacob-keller
Copy link
Author

I removed the CEs, though I didn't strip out the synthetic CE support in case we need it in the future. I updated the synthetic CEs to comment the forked tower DirectorUpdate IDs.

@xiashtra
Copy link
Collaborator

@Legends0 @jacob-keller this was approved quite a while ago but never merged, is there an outstanding issue waiting to be resolved?

@Legends0
Copy link
Collaborator

I'll do a more proper review later or tomorrow, just wanted to address this first.

Im good with a merge, just didn't know if @valarnin had resolved his concern.

@jacob-keller
Copy link
Author

Not that I'm aware of. There's probably some follow up work like making the raid emulator work better, but I'd much rather do that as follow up.

I don't have merge privileges, so I can't merge myself

@valarnin
Copy link
Collaborator

My original concern was resolved but the conversation wasn't marked as resolved.

@xiashtra
Copy link
Collaborator

Sounds like everyone is good for this, I'm going to merge it then.

@xiashtra xiashtra merged commit df45b52 into OverlayPlugin:main Dec 30, 2025
9 checks passed
github-actions bot pushed a commit that referenced this pull request Dec 30, 2025
)

Add some basic support for detecting and splitting encounters by CE,
based on the 0x21 network log line. The IDs for this are manually
determined, but we now pull the encounter names from xivapi, and
generate appropriate mappings.

This works ok in my tests, and so far doesn't appear to break any other
encounter logic. However, it likely needs more testing and fine tuning.

I also now added logic to pull the CE info from xivapi, with a new
generator script. I did pull a bit more data than we currently use
(since the current code doesn't use anything but the english names). I
don't yet pull the Chinese or Korean data like how zone_ids.ts does yet.

There's probably some further cleanup we can do around encounter
support, but I wanted to try and get the very basic splitting
functionality done.

- util: add support for sheets with subrow_id to xivapi
- util: log eslint errors when failing in writeFile
- util: generate CE info from xivapi
- encounter_tools: detect and report CEs as separate encounters

Signed-off-by: Jacob Keller <jacob.keller@gmail.com>

---------

Signed-off-by: Jacob Keller <jacob.keller@gmail.com> df45b52
github-actions bot pushed a commit to ShadyWhite/cactbot that referenced this pull request Dec 31, 2025
…verlayPlugin#729)

Add some basic support for detecting and splitting encounters by CE,
based on the 0x21 network log line. The IDs for this are manually
determined, but we now pull the encounter names from xivapi, and
generate appropriate mappings.

This works ok in my tests, and so far doesn't appear to break any other
encounter logic. However, it likely needs more testing and fine tuning.

I also now added logic to pull the CE info from xivapi, with a new
generator script. I did pull a bit more data than we currently use
(since the current code doesn't use anything but the english names). I
don't yet pull the Chinese or Korean data like how zone_ids.ts does yet.

There's probably some further cleanup we can do around encounter
support, but I wanted to try and get the very basic splitting
functionality done.

- util: add support for sheets with subrow_id to xivapi
- util: log eslint errors when failing in writeFile
- util: generate CE info from xivapi
- encounter_tools: detect and report CEs as separate encounters

Signed-off-by: Jacob Keller <jacob.keller@gmail.com>

---------

Signed-off-by: Jacob Keller <jacob.keller@gmail.com> df45b52
@jacob-keller jacob-keller deleted the jk-encounter-tools-ce-support branch January 4, 2026 09:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants