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
2 changed files with 13 additions and 18 deletions
Showing only changes of commit 8d4abe863c - Show all commits

View File

@ -113,8 +113,8 @@ const sortieBossNode: Record<Exclude<TSortieBoss, "SORTIE_BOSS_CORRUPTED_VOR">,
SORTIE_BOSS_VOR: "SolNode108"
};
const voidCorruptionAlerts = [
{
const configAlerts: Record<string, IAlert> = {
voidCorruptionWeek1: {
_id: { $oid: "677d452e2f324ee7b90f8ccf" },
Activation: { $date: { $numberLong: "1736524800000" } },
Expiry: { $date: { $numberLong: "2000000000000" } },
@ -134,7 +134,7 @@ const voidCorruptionAlerts = [
maxEnemyLevel: 15
}
},
{
voidCorruptionWeek2: {
_id: { $oid: "677d45811daeae9de40e8c0f" },
Activation: { $date: { $numberLong: "1737129600000" } },
Expiry: { $date: { $numberLong: "2000000000000" } },
@ -154,7 +154,7 @@ const voidCorruptionAlerts = [
maxWaveNum: 6
Slayer55555 marked this conversation as resolved Outdated

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 } ```

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.

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,`
}
},
{
voidCorruptionWeek3: {
_id: { $oid: "677d45a494ad716c90006b9a" },
Activation: { $date: { $numberLong: "1737734400000" } },
Expiry: { $date: { $numberLong: "2000000000000" } },
@ -175,7 +175,7 @@ const voidCorruptionAlerts = [
maxEnemyLevel: 35
}
},
{
voidCorruptionWeek4: {
_id: { $oid: "677d4700682d173abb0e19fe" },
Activation: { $date: { $numberLong: "1738339200000" } },
Expiry: { $date: { $numberLong: "2000000000000" } },
@ -194,7 +194,7 @@ const voidCorruptionAlerts = [
maxEnemyLevel: 45
}
}
] satisfies readonly IAlert[];
};
const eidolonJobs: readonly string[] = [
"/Lotus/Types/Gameplay/Eidolon/Jobs/AssassinateBountyAss",
@ -1566,17 +1566,12 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
fullyStockBaro(vt);
}
const vcWeeks = [
["voidCorruptionWeek1", 0],
["voidCorruptionWeek2", 1],
["voidCorruptionWeek3", 2],
["voidCorruptionWeek4", 3]
] as const;
const selected = vcWeeks.filter(([flag]) => config.worldState?.[flag]).map(([, idx]) => voidCorruptionAlerts[idx]);
if (selected.length) {
worldState.Alerts = [...worldState.Alerts, ...selected];
if (config.worldState) {
Sainan marked this conversation as resolved Outdated

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.
for (const [key, alert] of Object.entries(configAlerts)) {
if (config.worldState[key as keyof typeof config.worldState]) {
worldState.Alerts.push(alert);
}
}
}
const isFebruary = date.getUTCMonth() == 1;

View File

@ -7,7 +7,7 @@ export interface IWorldState {
Time: number;
InGameMarket: IInGameMarket;
Goals: IGoal[];
Alerts: readonly IAlert[];
Alerts: IAlert[];
Sorties: ISortie[];
LiteSorties: ILiteSortie[];
SyndicateMissions: ISyndicateMissionInfo[];