feat: Void Corruption 2025 (#2865)
All checks were successful
Build Docker image / docker-amd64 (push) Successful in 50s
Build Docker image / docker-arm64 (push) Successful in 1m26s
Build / build (push) Successful in 3m27s

Reviewed-on: #2865
Reviewed-by: Sainan <63328889+sainan@users.noreply.github.com>
Co-authored-by: Slayer55555 <slayer55555@noreply.localhost>
Co-committed-by: Slayer55555 <slayer55555@noreply.localhost>
This commit is contained in:
Slayer55555 2025-10-09 00:28:34 -07:00 committed by Sainan
parent fd2286c253
commit 2ca895a5f8
14 changed files with 175 additions and 2 deletions

View File

@ -41,6 +41,10 @@
"naberusNightsOverride": null, "naberusNightsOverride": null,
"proxyRebellion": false, "proxyRebellion": false,
"proxyRebellionRewardsOverride": 0, "proxyRebellionRewardsOverride": 0,
"voidCorruption2025Week1": false,
"voidCorruption2025Week2": false,
"voidCorruption2025Week3": false,
"voidCorruption2025Week4": false,
"galleonOfGhouls": 0, "galleonOfGhouls": 0,
"ghoulEmergenceOverride": null, "ghoulEmergenceOverride": null,
"plagueStarOverride": null, "plagueStarOverride": null,

View File

@ -51,6 +51,10 @@ export interface IConfig {
naberusNightsOverride?: boolean; naberusNightsOverride?: boolean;
proxyRebellion?: boolean; proxyRebellion?: boolean;
proxyRebellionRewardsOverride?: number; proxyRebellionRewardsOverride?: number;
voidCorruption2025Week1?: boolean;
voidCorruption2025Week2?: boolean;
voidCorruption2025Week3?: boolean;
voidCorruption2025Week4?: boolean;
galleonOfGhouls?: number; galleonOfGhouls?: number;
ghoulEmergenceOverride?: boolean; ghoulEmergenceOverride?: boolean;
plagueStarOverride?: boolean; plagueStarOverride?: boolean;

View File

@ -1151,6 +1151,27 @@ export const addMissionRewards = async (
let ConquestCompletedMissionsCount; let ConquestCompletedMissionsCount;
let missionCompletionCredits = 0; let missionCompletionCredits = 0;
if (rewardInfo.alertId) {
const alert = getWorldState().Alerts.find(x => x._id.$oid == rewardInfo.alertId);
if (!alert) {
logger.warn(`mission completed unknown alert`, { alertId: rewardInfo.alertId });
} else {
if (inventory.CompletedAlerts.includes(alert._id.$oid)) {
logger.debug(`alert ${alert._id.$oid} already completed, skipping alert reward`);
} else {
inventory.CompletedAlerts.push(alert._id.$oid);
if (alert.MissionInfo.missionReward) {
missionCompletionCredits += addFixedLevelRewards(
alert.MissionInfo.missionReward,
MissionRewards,
rewardInfo
);
}
}
}
}
//inventory change is what the client has not rewarded itself, also the client needs to know the credit changes for display //inventory change is what the client has not rewarded itself, also the client needs to know the credit changes for display
if (rewardInfo.goalId) { if (rewardInfo.goalId) {

View File

@ -19,6 +19,7 @@ import type {
ICalendarDay, ICalendarDay,
ICalendarEvent, ICalendarEvent,
ICalendarSeason, ICalendarSeason,
IAlert,
IGoal, IGoal,
IInvasion, IInvasion,
ILiteSortie, ILiteSortie,
@ -112,6 +113,89 @@ const sortieBossNode: Record<Exclude<TSortieBoss, "SORTIE_BOSS_CORRUPTED_VOR">,
SORTIE_BOSS_VOR: "SolNode108" SORTIE_BOSS_VOR: "SolNode108"
}; };
const configAlerts: Record<string, IAlert> = {
voidCorruption2025Week1: {
_id: { $oid: "677d452e2f324ee7b90f8ccf" },
Activation: { $date: { $numberLong: "1736524800000" } },
Expiry: { $date: { $numberLong: "2000000000000" } },
MissionInfo: {
location: "SolNode61",
missionType: "MT_SABOTAGE",
faction: "FC_CORPUS",
difficulty: 1,
missionReward: {
credits: 30000,
items: ["/Lotus/StoreItems/Upgrades/Mods/Pistol/DualStat/CorruptedFireRateDamagePistol"]
},
levelOverride: "/Lotus/Levels/Proc/Corpus/CorpusShipCoreSabotage",
enemySpec: "/Lotus/Types/Game/EnemySpecs/CorpusShipEnemySpecs/CorpusShipSquadA",
extraEnemySpec: "/Lotus/Types/Game/EnemySpecs/GamemodeExtraEnemySpecs/CorpusSabotageTiersA",
minEnemyLevel: 10,
maxEnemyLevel: 15
}
},
voidCorruption2025Week2: {
_id: { $oid: "677d45811daeae9de40e8c0f" },
Activation: { $date: { $numberLong: "1737129600000" } },
Expiry: { $date: { $numberLong: "2000000000000" } },
MissionInfo: {
location: "SettlementNode11",
missionType: "MT_DEFENSE",
faction: "FC_CORPUS",
difficulty: 1,
missionReward: {
credits: 30000,
items: ["/Lotus/StoreItems/Upgrades/Mods/Pistol/DualStat/CorruptedCritChanceFireRatePistol"]
},
levelOverride: "/Lotus/Levels/Proc/Corpus/CorpusShipDefense",
enemySpec: "/Lotus/Types/Game/EnemySpecs/CorpusShipEnemySpecs/CorpusShipSquadDefenseB",
minEnemyLevel: 20,
maxEnemyLevel: 25,
maxWaveNum: 6
}
},
voidCorruption2025Week3: {
_id: { $oid: "677d45a494ad716c90006b9a" },
Activation: { $date: { $numberLong: "1737734400000" } },
Expiry: { $date: { $numberLong: "2000000000000" } },
MissionInfo: {
location: "SolNode118",
missionType: "MT_ARTIFACT",
faction: "FC_CORPUS",
difficulty: 1,
missionReward: {
credits: 30000,
items: ["/Lotus/StoreItems/Upgrades/Mods/Pistol/DualStat/CorruptedCritDamagePistol"]
},
levelOverride: "/Lotus/Levels/Proc/Corpus/CorpusShipDisruption",
enemySpec: "/Lotus/Types/Game/EnemySpecs/CorpusShipEnemySpecs/CorpusShipSurvivalA",
extraEnemySpec: "/Lotus/Types/Game/EnemySpecs/SpecialMissionSpecs/DisruptionCorpusShip",
customAdvancedSpawners: ["/Lotus/Types/Enemies/AdvancedSpawners/ErrantSpecterInvasion"],
minEnemyLevel: 30,
maxEnemyLevel: 35
}
},
voidCorruption2025Week4: {
_id: { $oid: "677d4700682d173abb0e19fe" },
Activation: { $date: { $numberLong: "1738339200000" } },
Expiry: { $date: { $numberLong: "2000000000000" } },
MissionInfo: {
location: "SolNode4",
missionType: "MT_EXTERMINATION",
faction: "FC_CORPUS",
difficulty: 1,
missionReward: {
credits: 30000,
items: ["/Lotus/StoreItems/Upgrades/Mods/Pistol/DualStat/CorruptedDamageRecoilPistol"]
},
levelOverride: "/Lotus/Levels/Proc/Corpus/CorpusShipExterminate",
enemySpec: "/Lotus/Types/Game/EnemySpecs/CorpusShipEnemySpecs/CorpusShipExterminateMixed",
minEnemyLevel: 40,
maxEnemyLevel: 45
}
}
};
const eidolonJobs: readonly string[] = [ const eidolonJobs: readonly string[] = [
"/Lotus/Types/Gameplay/Eidolon/Jobs/AssassinateBountyAss", "/Lotus/Types/Gameplay/Eidolon/Jobs/AssassinateBountyAss",
"/Lotus/Types/Gameplay/Eidolon/Jobs/AssassinateBountyCap", "/Lotus/Types/Gameplay/Eidolon/Jobs/AssassinateBountyCap",
@ -1481,6 +1565,15 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
worldState.VoidTraders.push(vt); worldState.VoidTraders.push(vt);
fullyStockBaro(vt); fullyStockBaro(vt);
} }
if (config.worldState) {
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; const isFebruary = date.getUTCMonth() == 1;
if (config.worldState?.starDaysOverride ?? isFebruary) { if (config.worldState?.starDaysOverride ?? isFebruary) {
worldState.Goals.push({ worldState.Goals.push({

View File

@ -178,6 +178,7 @@ export interface IRewardInfo {
goalManifest?: string; goalManifest?: string;
invasionId?: string; invasionId?: string;
invasionAllyFaction?: "FC_GRINEER" | "FC_CORPUS"; invasionAllyFaction?: "FC_GRINEER" | "FC_CORPUS";
alertId?: string;
sortieId?: string; sortieId?: string;
sortieTag?: "Mission1" | "Mission2" | "Final"; sortieTag?: "Mission1" | "Mission2" | "Final";
sortiePrereqs?: string[]; sortiePrereqs?: string[];

View File

@ -1,4 +1,4 @@
import type { IMissionReward } from "warframe-public-export-plus"; import type { IMissionReward, TFaction } from "warframe-public-export-plus";
import type { IMongoDate, IOid } from "./commonTypes.ts"; import type { IMongoDate, IOid } from "./commonTypes.ts";
export interface IWorldState { export interface IWorldState {
@ -7,7 +7,7 @@ export interface IWorldState {
Time: number; Time: number;
InGameMarket: IInGameMarket; InGameMarket: IInGameMarket;
Goals: IGoal[]; Goals: IGoal[];
Alerts: []; Alerts: IAlert[];
Sorties: ISortie[]; Sorties: ISortie[];
LiteSorties: ILiteSortie[]; LiteSorties: ILiteSortie[];
SyndicateMissions: ISyndicateMissionInfo[]; SyndicateMissions: ISyndicateMissionInfo[];
@ -35,6 +35,28 @@ export interface IWorldState {
Tmp?: string; Tmp?: string;
} }
export interface IAlert {
_id: IOid;
Activation: IMongoDate;
Expiry: IMongoDate;
MissionInfo: IAlertMissionInfo;
}
export interface IAlertMissionInfo {
location: string;
missionType: string;
faction: TFaction;
difficulty: number;
missionReward?: IMissionReward;
levelOverride?: string;
enemySpec?: string;
extraEnemySpec?: string;
customAdvancedSpawners?: string[];
minEnemyLevel?: number;
maxEnemyLevel?: number;
maxWaveNum?: number;
}
export interface IGoal { export interface IGoal {
_id: IOid; _id: IOid;
Activation: IMongoDate; Activation: IMongoDate;

View File

@ -1232,6 +1232,27 @@
</select> </select>
</div> </div>
</div> </div>
<div class="mt-2">
<label class="form-label" data-loc="worldState_voidCorruption" data-loc-replace="2025"></label>
<div class="d-flex flex-wrap gap-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="worldState.voidCorruptionWeek1" />
<label class="form-check-label" for="worldState.voidCorruptionWeek1" data-loc="worldState_week" data-loc-replace="1"></label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="worldState.voidCorruptionWeek2" />
<label class="form-check-label" for="worldState.voidCorruptionWeek2" data-loc="worldState_week" data-loc-replace="2"></label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="worldState.voidCorruptionWeek3" />
<label class="form-check-label" for="worldState.voidCorruptionWeek3" data-loc="worldState_week" data-loc-replace="3"></label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="worldState.voidCorruptionWeek4" />
<label class="form-check-label" for="worldState.voidCorruptionWeek4" data-loc="worldState_week" data-loc-replace="4"></label>
</div>
</div>
</div>
<div class="form-group mt-2"> <div class="form-group mt-2">
<label class="form-label" for="worldState.galleonOfGhouls" data-loc="worldState_galleonOfGhouls"></label> <label class="form-label" for="worldState.galleonOfGhouls" data-loc="worldState_galleonOfGhouls"></label>
<abbr data-loc-inc="worldState_wolfHunt|worldState_anniversary|worldState_orphixVenom"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><path d="M320 576C461.4 576 576 461.4 576 320C576 178.6 461.4 64 320 64C178.6 64 64 178.6 64 320C64 461.4 178.6 576 320 576zM320 200C333.3 200 344 210.7 344 224L344 336C344 349.3 333.3 360 320 360C306.7 360 296 349.3 296 336L296 224C296 210.7 306.7 200 320 200zM293.3 416C292.7 406.1 297.6 396.7 306.1 391.5C314.6 386.4 325.3 386.4 333.8 391.5C342.3 396.7 347.2 406.1 346.6 416C347.2 425.9 342.3 435.3 333.8 440.5C325.3 445.6 314.6 445.6 306.1 440.5C297.6 435.3 292.7 425.9 293.3 416z"/></svg></abbr> <abbr data-loc-inc="worldState_wolfHunt|worldState_anniversary|worldState_orphixVenom"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><path d="M320 576C461.4 576 576 461.4 576 320C576 178.6 461.4 64 320 64C178.6 64 64 178.6 64 320C64 461.4 178.6 576 320 576zM320 200C333.3 200 344 210.7 344 224L344 336C344 349.3 333.3 360 320 360C306.7 360 296 349.3 296 336L296 224C296 210.7 306.7 200 320 200zM293.3 416C292.7 406.1 297.6 396.7 306.1 391.5C314.6 386.4 325.3 386.4 333.8 391.5C342.3 396.7 347.2 406.1 346.6 416C347.2 425.9 342.3 435.3 333.8 440.5C325.3 445.6 314.6 445.6 306.1 440.5C297.6 435.3 292.7 425.9 293.3 416z"/></svg></abbr>

View File

@ -279,6 +279,7 @@ dict = {
worldState_dogDays: `Hitzefrei`, worldState_dogDays: `Hitzefrei`,
worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`, worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`,
worldState_wolfHunt: `Wolfsjagd (2025)`, worldState_wolfHunt: `Wolfsjagd (2025)`,
worldState_voidCorruption: `[UNTRANSLATED] Void Corruption (|VAL|)`,
worldState_orphixVenom: `Orphix Gift`, worldState_orphixVenom: `Orphix Gift`,
worldState_longShadow: `Lange Schatten`, worldState_longShadow: `Lange Schatten`,
worldState_hallowedFlame: `Geweihte Flamme`, worldState_hallowedFlame: `Geweihte Flamme`,

View File

@ -278,6 +278,7 @@ dict = {
worldState_dogDays: `Dog Days`, worldState_dogDays: `Dog Days`,
worldState_dogDaysRewards: `Dog Days Rewards`, worldState_dogDaysRewards: `Dog Days Rewards`,
worldState_wolfHunt: `Wolf Hunt (2025)`, worldState_wolfHunt: `Wolf Hunt (2025)`,
worldState_voidCorruption: `Void Corruption (|VAL|)`,
worldState_orphixVenom: `Orphix Venom`, worldState_orphixVenom: `Orphix Venom`,
worldState_longShadow: `Long Shadow`, worldState_longShadow: `Long Shadow`,
worldState_hallowedFlame: `Hallowed Flame`, worldState_hallowedFlame: `Hallowed Flame`,

View File

@ -279,6 +279,7 @@ dict = {
worldState_dogDays: `Canícula`, worldState_dogDays: `Canícula`,
worldState_dogDaysRewards: `Recompensas de Canícula`, worldState_dogDaysRewards: `Recompensas de Canícula`,
worldState_wolfHunt: `Cacería del Lobo (2025)`, worldState_wolfHunt: `Cacería del Lobo (2025)`,
worldState_voidCorruption: `Corrupción del Vacío (|VAL|)`,
worldState_orphixVenom: `Veneno de Orphix`, worldState_orphixVenom: `Veneno de Orphix`,
worldState_longShadow: `Sombra Prolongada`, worldState_longShadow: `Sombra Prolongada`,
worldState_hallowedFlame: `Llama Sagrada`, worldState_hallowedFlame: `Llama Sagrada`,

View File

@ -279,6 +279,7 @@ dict = {
worldState_dogDays: `Bataille d'Eau`, worldState_dogDays: `Bataille d'Eau`,
worldState_dogDaysRewards: `Récompenses de la Bataille d'Eau`, worldState_dogDaysRewards: `Récompenses de la Bataille d'Eau`,
worldState_wolfHunt: `Chasse au Loup (2025)`, worldState_wolfHunt: `Chasse au Loup (2025)`,
worldState_voidCorruption: `[UNTRANSLATED] Void Corruption (|VAL|)`,
worldState_orphixVenom: `Venin Orphix`, worldState_orphixVenom: `Venin Orphix`,
worldState_longShadow: `La Propagation des Ombres`, worldState_longShadow: `La Propagation des Ombres`,
worldState_hallowedFlame: `Flamme Hantée`, worldState_hallowedFlame: `Flamme Hantée`,

View File

@ -279,6 +279,7 @@ dict = {
worldState_dogDays: `Знойные дни`, worldState_dogDays: `Знойные дни`,
worldState_dogDaysRewards: `Награды Знойных дней`, worldState_dogDaysRewards: `Награды Знойных дней`,
worldState_wolfHunt: `Волчья Охота (2025)`, worldState_wolfHunt: `Волчья Охота (2025)`,
worldState_voidCorruption: `[UNTRANSLATED] Void Corruption (|VAL|)`,
worldState_orphixVenom: `Яд Орфикса`, worldState_orphixVenom: `Яд Орфикса`,
worldState_longShadow: `Длинная Тень`, worldState_longShadow: `Длинная Тень`,
worldState_hallowedFlame: `Священное пламя`, worldState_hallowedFlame: `Священное пламя`,

View File

@ -279,6 +279,7 @@ dict = {
worldState_dogDays: `Спекотні дні`, worldState_dogDays: `Спекотні дні`,
worldState_dogDaysRewards: `Нагороди Спекотних днів`, worldState_dogDaysRewards: `Нагороди Спекотних днів`,
worldState_wolfHunt: `Полювання на Вовка (2025)`, worldState_wolfHunt: `Полювання на Вовка (2025)`,
worldState_voidCorruption: `[UNTRANSLATED] Void Corruption (|VAL|)`,
worldState_orphixVenom: `Орфіксова отрута`, worldState_orphixVenom: `Орфіксова отрута`,
worldState_longShadow: `Довга тінь`, worldState_longShadow: `Довга тінь`,
worldState_hallowedFlame: `Священне полум'я`, worldState_hallowedFlame: `Священне полум'я`,

View File

@ -279,6 +279,7 @@ dict = {
worldState_dogDays: `三伏天`, worldState_dogDays: `三伏天`,
worldState_dogDaysRewards: `三伏天奖励设置`, worldState_dogDaysRewards: `三伏天奖励设置`,
worldState_wolfHunt: `恶狼狩猎 (2025)`, worldState_wolfHunt: `恶狼狩猎 (2025)`,
worldState_voidCorruption: `[UNTRANSLATED] Void Corruption (|VAL|)`,
worldState_orphixVenom: `奥影之毒`, worldState_orphixVenom: `奥影之毒`,
worldState_longShadow: `暗夜长影`, worldState_longShadow: `暗夜长影`,
worldState_hallowedFlame: `万圣之焰`, worldState_hallowedFlame: `万圣之焰`,