feat: Void Corruption 2025 #2865

Merged
Sainan merged 39 commits from Slayer55555/SpaceNinjaServer:void-alerts into main 2025-10-09 00:28:35 -07:00
Contributor

It works™
But I'm unsure of the implementation of alerts, it's my first time doing actual changes to the database and doing stuff with typescript, so I'm putting WIP until someone checks it out.

Re #2842

It works™ But I'm unsure of the implementation of alerts, it's my first time doing actual changes to the database and doing stuff with typescript, so I'm putting WIP until someone checks it out. Re #2842
Slayer55555 added 17 commits 2025-10-06 12:40:45 -07:00
naberus
All checks were successful
Build / build (pull_request) Successful in 1m2s
304b0b347b
merge upstream
All checks were successful
Build / build (pull_request) Successful in 1m31s
9ca74bf6ee
spooky month
Some checks failed
Build / build (pull_request) Failing after 3m21s
db472d25cf
Spooky Month webui edition
Some checks failed
Build / build (pull_request) Failing after 1m30s
7b7e1d6beb
Update static/webui/index.html
Some checks failed
Build / build (pull_request) Failing after 59s
73bda1e5b3
Update src/services/worldStateService.ts
All checks were successful
Build / build (pull_request) Successful in 1m29s
3d4923dbca
fix vanilla config
All checks were successful
Build / build (pull_request) Successful in 3m31s
e0ad8a172d
fix naberus webui
All checks were successful
Build / build (pull_request) Successful in 1m30s
377e70f4c6
fix worldStateService
Some checks failed
Build / build (pull_request) Failing after 3m16s
6a8591a272
fix configServices
All checks were successful
Build / build (pull_request) Successful in 1m30s
b65f205715
merge upstream
All checks were successful
Build / build (pull_request) Successful in 1m6s
3f55544875
fix webui translations + reorder config
All checks were successful
Build / build (pull_request) Successful in 59s
e051ce2709
fix location of naberus nights in translations
All checks were successful
Build / build (pull_request) Successful in 1m3s
4d23d1a131
dumbass
Some checks failed
Build / build (pull_request) Failing after 1m28s
b4400b1946
Slayer55555 added 1 commit 2025-10-06 13:12:28 -07:00
Fix I think
All checks were successful
Build / build (pull_request) Successful in 1m36s
05722da681
AMelonInsideLemon reviewed 2025-10-06 15:10:19 -07:00
@ -315,3 +315,3 @@
FusionTreasures: IFusionTreasure[];
//WebFlags: IWebFlags;
CompletedAlerts: string[];
CompletedAlerts?: string[];

This field has been in all inventories for at least 20 months. Why are you making it optional?

This field has been in all inventories for at least 20 months. Why are you making it optional?
Author
Contributor

npm run verify fails if it's not optional

`npm run verify` fails if it's not optional

npm run verify doesn't fails because of that
npm run lint:ci fails because there is useless inventory.CompletedAlerts ??= [];

`npm run verify` doesn't fails because of that `npm run lint:ci` fails because there is useless `inventory.CompletedAlerts ??= [];`
Author
Contributor

Ohhh, I will try to fix it later, thanks.

Ohhh, I will try to fix it later, thanks.
Slayer55555 marked this conversation as resolved
AMelonInsideLemon reviewed 2025-10-06 15:14:34 -07:00
@ -115,0 +151,4 @@
enemySpec: "/Lotus/Types/Game/EnemySpecs/CorpusShipEnemySpecs/CorpusShipSquadDefenseB",
minEnemyLevel: 20,
maxEnemyLevel: 25,
maxWaveNum: 10

After 38.5 they changed needed waves to complete one defense rotation. And after that, they use multiples of 3.

  {
    "_id": {
      "$oid": "68dc2466e298b4f04206687a"
    },
    "Activation": {
      "$date": {
        "$numberLong": "1759327200000"
      }
    },
    "Expiry": {
      "$date": {
        "$numberLong": "1761933600000"
      }
    },
    "MissionInfo": {
      "location": "SolNode149",
      "missionType": "MT_DEFENSE",
      "faction": "FC_GRINEER",
      "difficulty": 1,
      "missionReward": {
        "credits": 10000,
        "items": [
          "/Lotus/StoreItems/Types/Items/ShipDecos/Plushies/Plushy2022QTCC"
        ]
      },
      "levelOverride": "/Lotus/Levels/Proc/Grineer/GrineerShipyardsDefense",
      "enemySpec": "/Lotus/Types/Game/EnemySpecs/GrineerShipyardsDefenseA",
      "minEnemyLevel": 20,
      "maxEnemyLevel": 30,
      "descText": "/Lotus/Language/Alerts/TennoUnitedAlert",
      "maxWaveNum": 3
    },
    "Tag": "LotusGift",
    "ForceUnlock": true
  },
  {
    "_id": {
      "$oid": "680baa81bd47824aa50c87bd"
    },
    "Activation": {
      "$date": {
        "$numberLong": "1745594978000"
      }
    },
    "Expiry": {
      "$date": {
        "$numberLong": "1745694000000"
      }
    },
    "MissionInfo": {
      "location": "SolNode130",
      "missionType": "MT_DEFENSE",
      "faction": "FC_GRINEER",
      "difficulty": 1,
      "missionReward": {
        "credits": 10000,
        "items": [
          "/Lotus/StoreItems/Types/Recipes/Components/FormaBlueprint"
        ]
      },
      "levelOverride": "/Lotus/Levels/Proc/Grineer/GrineerAsteroidDefense",
      "enemySpec": "/Lotus/Types/Game/EnemySpecs/GrineerDefenseA",
      "minEnemyLevel": 10,
      "maxEnemyLevel": 15,
      "descText": "/Lotus/Language/Alerts/LotusGiftDesc",
      "maxWaveNum": 6
    },
    "Tag": "LotusGift",
    "ForceUnlock": true
  }
After 38.5 they changed needed waves to complete one defense rotation. And after that, they use multiples of 3. ``` { "_id": { "$oid": "68dc2466e298b4f04206687a" }, "Activation": { "$date": { "$numberLong": "1759327200000" } }, "Expiry": { "$date": { "$numberLong": "1761933600000" } }, "MissionInfo": { "location": "SolNode149", "missionType": "MT_DEFENSE", "faction": "FC_GRINEER", "difficulty": 1, "missionReward": { "credits": 10000, "items": [ "/Lotus/StoreItems/Types/Items/ShipDecos/Plushies/Plushy2022QTCC" ] }, "levelOverride": "/Lotus/Levels/Proc/Grineer/GrineerShipyardsDefense", "enemySpec": "/Lotus/Types/Game/EnemySpecs/GrineerShipyardsDefenseA", "minEnemyLevel": 20, "maxEnemyLevel": 30, "descText": "/Lotus/Language/Alerts/TennoUnitedAlert", "maxWaveNum": 3 }, "Tag": "LotusGift", "ForceUnlock": true }, { "_id": { "$oid": "680baa81bd47824aa50c87bd" }, "Activation": { "$date": { "$numberLong": "1745594978000" } }, "Expiry": { "$date": { "$numberLong": "1745694000000" } }, "MissionInfo": { "location": "SolNode130", "missionType": "MT_DEFENSE", "faction": "FC_GRINEER", "difficulty": 1, "missionReward": { "credits": 10000, "items": [ "/Lotus/StoreItems/Types/Recipes/Components/FormaBlueprint" ] }, "levelOverride": "/Lotus/Levels/Proc/Grineer/GrineerAsteroidDefense", "enemySpec": "/Lotus/Types/Game/EnemySpecs/GrineerDefenseA", "minEnemyLevel": 10, "maxEnemyLevel": 15, "descText": "/Lotus/Language/Alerts/LotusGiftDesc", "maxWaveNum": 6 }, "Tag": "LotusGift", "ForceUnlock": true } ```
Author
Contributor

They did, but those are the original alerts, I can change it but it wouldn't be faithful tho.

They did, but those are the original alerts, I can change it but it wouldn't be faithful tho.
Author
Contributor

There are also some anniversary alerts here that have the same amount of waves.

There are also some anniversary alerts here that have the same amount of waves.

Yes, first week of 12 anniversary /Lotus/Types/Keys/TacAlertKeyAnniversary2019E (March 7 - March 14), but there's a problem: 38.5 was released on March 19. And then in one of the hotfixes, they specifically updated /Lotus/Types/Keys/TacAlertKeyAnniversary2017B (second week) “maxWaveNum”: 10, -> “maxWaveNum”: 6,

Yes, first week of 12 anniversary `/Lotus/Types/Keys/TacAlertKeyAnniversary2019E` (March 7 - March 14), but there's a problem: 38.5 was released on March 19. And then in one of the hotfixes, they specifically updated `/Lotus/Types/Keys/TacAlertKeyAnniversary2017B` (second week) `“maxWaveNum”: 10,` -> `“maxWaveNum”: 6,`
Slayer55555 marked this conversation as resolved
Slayer55555 added 1 commit 2025-10-06 17:42:41 -07:00
Update waves
All checks were successful
Build / build (pull_request) Successful in 1m0s
bb8d766971
Slayer55555 added 1 commit 2025-10-06 18:12:28 -07:00
Update src/services/missionInventoryUpdateService.ts
Some checks failed
Build / build (pull_request) Failing after 1m3s
0615656674
Slayer55555 added 1 commit 2025-10-06 18:12:49 -07:00
Update src/types/inventoryTypes/inventoryTypes.ts
All checks were successful
Build / build (pull_request) Successful in 1m4s
2fda5c7de5
Slayer55555 changed title from WIP: feat: Void Corruption 2025 to feat: Void Corruption 2025 2025-10-06 18:18:42 -07:00
Owner

Why is this implemented as an "all in one" option? Officially, these 4 alerts ran discretely over different weekends. The game itself also doesn't display more than 3 alerts.

Why is this implemented as an "all in one" option? Officially, these 4 alerts ran discretely over different weekends. The game itself also doesn't display more than 3 alerts.
Sainan reviewed 2025-10-06 23:21:02 -07:00
@ -1482,2 +1566,4 @@
fullyStockBaro(vt);
}
if (config.worldState?.voidCorruption) {
worldState.Alerts.push(...voidCorruptionAlerts.map(alert => structuredClone<IAlert>(alert)));
Owner

There's really no reason to use structuredClone here. You can update IWorldState to also specify readonly IAlert[] for what little value it has.

There's really no reason to use `structuredClone` here. You can update `IWorldState` to also specify `readonly IAlert[]` for what little value it has.
Sainan marked this conversation as resolved
Author
Contributor

Why is this implemented as an "all in one" option? Officially, these 4 alerts ran discretely over different weekends. The game itself also doesn't display more than 3 alerts.

Honestly? Because it would be tedious to enable them one by one as you complete them, and if you forgot to enable the next when you got to the orbiter you'd need to enter a relay or reload the missions in some way to be able to play the next one. Also the game did display all 4 alerts when I tested it. If you want I can make them separete, I just see it as inconvenient.

> Why is this implemented as an "all in one" option? Officially, these 4 alerts ran discretely over different weekends. The game itself also doesn't display more than 3 alerts. Honestly? Because it would be tedious to enable them one by one as you complete them, and if you forgot to enable the next when you got to the orbiter you'd need to enter a relay or reload the missions in some way to be able to play the next one. Also the game did display all 4 alerts when I tested it. If you want I can make them separete, I just see it as inconvenient.
Slayer55555 added 1 commit 2025-10-07 03:53:05 -07:00
Merge branch 'main' into void-alerts
All checks were successful
Build / build (pull_request) Successful in 1m18s
65999b37a8
Slayer55555 added 1 commit 2025-10-07 04:05:44 -07:00
Update src/types/worldStateTypes.ts
Some checks failed
Build / build (pull_request) Failing after 24s
88a765cda0
Slayer55555 added 1 commit 2025-10-07 04:06:37 -07:00
Update src/services/worldStateService.ts
Some checks failed
Build / build (pull_request) Failing after 27s
34d0ec5067
Owner

Great stuff. I do think especially considering the gifts of the lotus stuff, alerts would be better implemented as something where you just enter a mission node + rewards in the webui and then submit it, maybe with some presets there. Afaict, the levelOverride, enemySpec, etc. here are copied from the underlying node so just some export improvements could make this very redundant.

Great stuff. I do think especially considering the gifts of the lotus stuff, alerts would be better implemented as something where you just enter a mission node + rewards in the webui and then submit it, maybe with some presets there. Afaict, the `levelOverride`, `enemySpec`, etc. here are copied from the underlying node so just some export improvements could make this very redundant.
Slayer55555 added 1 commit 2025-10-07 04:09:21 -07:00
Update src/services/worldStateService.ts
All checks were successful
Build / build (pull_request) Successful in 4m21s
b3e003672e
Author
Contributor

Great stuff. I do think especially considering the gifts of the lotus stuff, alerts would be better implemented as something where you just enter a mission node + rewards in the webui and then submit it, maybe with some presets there. Afaict, the levelOverride, enemySpec, etc. here are copied from the underlying node so just some export improvements could make this very redundant.

I agree on the mission node and rewards stuff, but I think Void Corruption and the floof alerts are an exception, most if not all of the times gifts of the lotus are one of this list: (silver or gold potato, forma, umbra forma, exilus adapters, riven transmuters and riven ciphers), sometimes BPs sometimes built.

> Great stuff. I do think especially considering the gifts of the lotus stuff, alerts would be better implemented as something where you just enter a mission node + rewards in the webui and then submit it, maybe with some presets there. Afaict, the `levelOverride`, `enemySpec`, etc. here are copied from the underlying node so just some export improvements could make this very redundant. I agree on the mission node and rewards stuff, but I think Void Corruption and the floof alerts are an exception, most if not all of the times gifts of the lotus are one of this list: (silver or gold potato, forma, umbra forma, exilus adapters, riven transmuters and riven ciphers), sometimes BPs sometimes built.
Owner

Wow they're so different, they rewards mods or shipdecos instead of miscitems!

Wow they're so different, they rewards mods or shipdecos instead of miscitems!
Author
Contributor

Oh you mean create alerts to reward any item?
I like that idea, I thought you meant only the items that have been available in alerts. But I think at least for now this PR should work.

Oh you mean create alerts to reward any item? I like that idea, I thought you meant only the items that have been available in alerts. But I think at least for now this PR should work.
Owner

Anyway, for the sake of this PR, please do make it 4 separate toggles at least.

Anyway, for the sake of this PR, please do make it 4 separate toggles at least.
Slayer55555 added 1 commit 2025-10-07 06:13:15 -07:00
enabling by week
Some checks failed
Build / build (pull_request) Failing after 1m18s
0d394d4591
Owner

Do these dates look overlapping to you? https://www.warframe.com/news/void-corruption-alerts-2025

Do these dates look overlapping to you? <https://www.warframe.com/news/void-corruption-alerts-2025>
Slayer55555 added 1 commit 2025-10-07 06:18:42 -07:00
Update src/services/worldStateService.ts
Some checks failed
Build / build (pull_request) Failing after 1m32s
d9349137de
Slayer55555 added 1 commit 2025-10-07 06:25:25 -07:00
Update src/services/worldStateService.ts
All checks were successful
Build / build (pull_request) Successful in 1m19s
55adf8185e
Author
Contributor

Do these dates look overlapping to you? https://www.warframe.com/news/void-corruption-alerts-2025

what?

> Do these dates look overlapping to you? <https://www.warframe.com/news/void-corruption-alerts-2025> what?
Owner

Explain what your idea behind 0d394d4591 was because to me that does not look like 4 different toggles.

Explain what your idea behind 0d394d4591b2e5a45a3aa1f5089336cc136e940f was because to me that does not look like 4 different toggles.
Author
Contributor

Explain what your idea behind 0d394d4591 was because to me that does not look like 4 different toggles.

It's literally the same implementation as galleon of ghouls why should it be different?

> Explain what your idea behind 0d394d4591b2e5a45a3aa1f5089336cc136e940f was because to me that does not look like 4 different toggles. It's literally the same implementation as galleon of ghouls why should it be different?
Owner

I don't see galleon of ghouls using .slice anywhere, this is what makes your "week 4" option actually "week 1 + 2 + 3 + 4"

I don't see galleon of ghouls using `.slice` anywhere, this is what makes your "week 4" option actually "week 1 + 2 + 3 + 4"
Author
Contributor

fuck

fuck
Owner

Also, as you yourself said, it would be annoying to have to change the active alert after having completed one, so I don't see why you disagreed with the simpler and more flexible approach of 4 different toggles. Galleon of Ghouls does not have that luxury because the client doesn't take well to multiple goals having the same tag, but I don't think the same issue is present here.

Also, as you yourself said, it would be annoying to have to change the active alert after having completed one, so I don't see why you disagreed with the simpler and more flexible approach of 4 different toggles. Galleon of Ghouls does not have that luxury because the client doesn't take well to multiple goals having the same tag, but I don't think the same issue is present here.
Author
Contributor

Also, as you yourself said, it would be annoying to have to change the active alert after having completed one, so I don't see why you disagreed with the simpler and more flexible approach of 4 different toggles. Galleon of Ghouls does not have that luxury because the client doesn't take well to multiple goals having the same tag, but I don't think the same issue is present here.

Mainly because I tried and I can't make it look even decent, my skills in html are lacking at best, can you give me a hand?

> Also, as you yourself said, it would be annoying to have to change the active alert after having completed one, so I don't see why you disagreed with the simpler and more flexible approach of 4 different toggles. Galleon of Ghouls does not have that luxury because the client doesn't take well to multiple goals having the same tag, but I don't think the same issue is present here. Mainly because I tried and I can't make it look even decent, my skills in html are lacking at best, can you give me a hand?
Slayer55555 added 1 commit 2025-10-07 07:34:53 -07:00
remove slice
All checks were successful
Build / build (pull_request) Successful in 1m20s
5a8be1c483
Owner

You had a toggle before, you just had to copy that 3 times?

You had a toggle before, you just had to copy that 3 times?
Author
Contributor

You had a toggle before, you just had to copy that 3 times?

Wouldn't that make it too cluttered?

> You had a toggle before, you just had to copy that 3 times? Wouldn't that make it too cluttered?
Owner

It's already quite cluttered

It's already quite cluttered
Slayer55555 added 1 commit 2025-10-07 13:16:57 -07:00
toggles
Some checks failed
Build / build (pull_request) Failing after 1m29s
c9170b4086
Slayer55555 added 1 commit 2025-10-07 13:23:14 -07:00
lint:ci fix
Some checks failed
Build / build (pull_request) Failing after 1m0s
8957da5275
Slayer55555 added 1 commit 2025-10-07 13:25:33 -07:00
prettier
Some checks failed
Build / build (pull_request) Failing after 4m22s
9b1db045a8
Slayer55555 added 1 commit 2025-10-07 13:29:33 -07:00
remove unnecessary comma
All checks were successful
Build / build (pull_request) Successful in 3m40s
be1b2a40e3
Sainan added 3 commits 2025-10-07 23:37:50 -07:00
Sainan added 2 commits 2025-10-07 23:39:55 -07:00
diff reduction
All checks were successful
Build / build (pull_request) Successful in 1m38s
709f7e7277
Sainan added 1 commit 2025-10-07 23:40:49 -07:00
update es
All checks were successful
Build / build (pull_request) Successful in 1m4s
e0e7a24e44
Sainan approved these changes 2025-10-07 23:45:14 -07:00
Sainan merged commit 2ca895a5f8 into main 2025-10-09 00:28:35 -07:00
Sainan deleted branch void-alerts 2025-10-09 00:28:35 -07:00
Sign in to join this conversation.
No description provided.