diff --git a/config-vanilla.json b/config-vanilla.json index fef4a021..3bff2e76 100644 --- a/config-vanilla.json +++ b/config-vanilla.json @@ -45,6 +45,7 @@ "voidCorruption2025Week2": false, "voidCorruption2025Week3": false, "voidCorruption2025Week4": false, + "qtccAlerts": false, "galleonOfGhouls": 0, "ghoulEmergenceOverride": null, "plagueStarOverride": null, diff --git a/src/services/configService.ts b/src/services/configService.ts index 0eface6b..7d4f072b 100644 --- a/src/services/configService.ts +++ b/src/services/configService.ts @@ -55,6 +55,7 @@ export interface IConfig { voidCorruption2025Week2?: boolean; voidCorruption2025Week3?: boolean; voidCorruption2025Week4?: boolean; + qtccAlerts?: boolean; galleonOfGhouls?: number; ghoulEmergenceOverride?: boolean; plagueStarOverride?: boolean; diff --git a/src/services/worldStateService.ts b/src/services/worldStateService.ts index fb8fb029..fe7baa02 100644 --- a/src/services/worldStateService.ts +++ b/src/services/worldStateService.ts @@ -151,7 +151,7 @@ const configAlerts: Record = { enemySpec: "/Lotus/Types/Game/EnemySpecs/CorpusShipEnemySpecs/CorpusShipSquadDefenseB", minEnemyLevel: 20, maxEnemyLevel: 25, - maxWaveNum: 6 + maxRotations: 2 } }, voidCorruption2025Week3: { @@ -1476,6 +1476,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => { const weekStart = EPOCH + week * 604800000; const weekEnd = weekStart + 604800000; const date = new Date(timeMs); + const defenseWavesPerRotation = buildLabel && version_compare(buildLabel, "2025.03.18.16.07") < 0 ? 5 : 3; const worldState: IWorldState = { BuildLabel: typeof buildLabel == "string" ? buildLabel.split(" ").join("+") : buildConfig.buildLabel, @@ -1569,11 +1570,117 @@ export const getWorldState = (buildLabel?: string): IWorldState => { if (config.worldState) { for (const [key, alert] of Object.entries(configAlerts)) { if (config.worldState[key as keyof typeof config.worldState]) { + if (alert.MissionInfo.missionType == "MT_DEFENSE") + alert.MissionInfo.maxWaveNum = defenseWavesPerRotation * (alert.MissionInfo.maxRotations ?? 1); worldState.Alerts.push(alert); } } } + if (config.worldState?.qtccAlerts) { + worldState.Alerts.push( + { + _id: { + $oid: "68dc23c42e9d3acfa708ff3b" + }, + Activation: { + $date: { + $numberLong: "1759327200000" + } + }, + Expiry: { + $date: { + $numberLong: "2000000000000" + } + }, + MissionInfo: { + location: "SolNode123", + missionType: "MT_SURVIVAL", + faction: "FC_CORPUS", + difficulty: 1, + missionReward: { + credits: 10000, + items: ["/Lotus/StoreItems/Types/Items/ShipDecos/Plushies/Plushy2021QTCC"] + }, + levelOverride: "/Lotus/Levels/Proc/Corpus/CorpusShipSurvivalRaid", + enemySpec: "/Lotus/Types/Game/EnemySpecs/CorpusShipEnemySpecs/CorpusShipSurvivalA", + minEnemyLevel: 20, + maxEnemyLevel: 30, + descText: "/Lotus/Language/Alerts/TennoUnitedAlert", + maxWaveNum: 5 + }, + Tag: "LotusGift", + ForceUnlock: true + }, + { + _id: { + $oid: "68dc2466e298b4f04206687a" + }, + Activation: { + $date: { + $numberLong: "1759327200000" + } + }, + Expiry: { + $date: { + $numberLong: "2000000000000" + } + }, + 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: defenseWavesPerRotation * 1 + }, + Tag: "LotusGift", + ForceUnlock: true + }, + { + _id: { + $oid: "68dc26865e7cb56b820b4252" + }, + Activation: { + $date: { + $numberLong: "1759327200000" + } + }, + Expiry: { + $date: { + $numberLong: "2000000000000" + } + }, + MissionInfo: { + location: "SolNode39", + missionType: "MT_EXCAVATE", + faction: "FC_GRINEER", + difficulty: 1, + missionReward: { + credits: 10000, + items: ["/Lotus/StoreItems/Types/Items/ShipDecos/Plushies/PlushyVirminkQTCC"] + }, + levelOverride: "/Lotus/Levels/Proc/Grineer/GrineerForestExcavation", + enemySpec: "/Lotus/Types/Game/EnemySpecs/ForestGrineerExcavationA", + minEnemyLevel: 20, + maxEnemyLevel: 30, + descText: "/Lotus/Language/Alerts/TennoUnitedAlert", + maxWaveNum: 5 + }, + Tag: "LotusGift", + ForceUnlock: true + } + ); + } + const isFebruary = date.getUTCMonth() == 1; if (config.worldState?.starDaysOverride ?? isFebruary) { worldState.Goals.push({ diff --git a/src/types/worldStateTypes.ts b/src/types/worldStateTypes.ts index 723e8875..7aa6f5a9 100644 --- a/src/types/worldStateTypes.ts +++ b/src/types/worldStateTypes.ts @@ -1,4 +1,4 @@ -import type { IMissionReward, TFaction } from "warframe-public-export-plus"; +import type { IMissionReward, TFaction, TMissionType } from "warframe-public-export-plus"; import type { IMongoDate, IOid } from "./commonTypes.ts"; export interface IWorldState { @@ -40,11 +40,13 @@ export interface IAlert { Activation: IMongoDate; Expiry: IMongoDate; MissionInfo: IAlertMissionInfo; + Tag?: string; + ForceUnlock?: true; } export interface IAlertMissionInfo { location: string; - missionType: string; + missionType: TMissionType; faction: TFaction; difficulty: number; missionReward?: IMissionReward; @@ -55,6 +57,9 @@ export interface IAlertMissionInfo { minEnemyLevel?: number; maxEnemyLevel?: number; maxWaveNum?: number; + descText?: string; + + maxRotations?: number; // SNS specific field } export interface IGoal { diff --git a/static/webui/index.html b/static/webui/index.html index 247b38dc..2e0dd64d 100644 --- a/static/webui/index.html +++ b/static/webui/index.html @@ -1189,6 +1189,10 @@ +
+ + +
diff --git a/static/webui/translations/de.js b/static/webui/translations/de.js index 540de36f..d16dc937 100644 --- a/static/webui/translations/de.js +++ b/static/webui/translations/de.js @@ -294,6 +294,7 @@ dict = { worldState_eightClawProgressOverride: `[UNTRANSLATED] Eight Claw Progress`, worldState_thermiaFractures: `Thermische Risse`, worldState_thermiaFracturesProgressOverride: `[UNTRANSLATED] Thermia Fractures Progress`, + worldState_qtccAlerts: `[UNTRANSLATED] Quest to Conquer Cancer Alerts`, worldState_from_year: `[UNTRANSLATED] from |VAL|`, worldState_pre_year: `[UNTRANSLATED] pre |VAL|`, worldState_week: `[UNTRANSLATED] Week |VAL|`, diff --git a/static/webui/translations/en.js b/static/webui/translations/en.js index 33ae5fa7..8d43a83d 100644 --- a/static/webui/translations/en.js +++ b/static/webui/translations/en.js @@ -293,6 +293,7 @@ dict = { worldState_eightClawProgressOverride: `Eight Claw Progress`, worldState_thermiaFractures: `Thermia Fractures`, worldState_thermiaFracturesProgressOverride: `Thermia Fractures Progress`, + worldState_qtccAlerts: `Quest to Conquer Cancer Alerts`, worldState_from_year: `from |VAL|`, worldState_pre_year: `pre |VAL|`, worldState_week: `Week |VAL|`, diff --git a/static/webui/translations/es.js b/static/webui/translations/es.js index 267e66c3..05f841e2 100644 --- a/static/webui/translations/es.js +++ b/static/webui/translations/es.js @@ -294,6 +294,7 @@ dict = { worldState_eightClawProgressOverride: `Progreso de Octava Garra`, worldState_thermiaFractures: `Fracturas Thermia`, worldState_thermiaFracturesProgressOverride: `Progreso de Fracturas Thermia`, + worldState_qtccAlerts: `[UNTRANSLATED] Quest to Conquer Cancer Alerts`, worldState_from_year: `de |VAL|`, worldState_pre_year: `antes de |VAL|`, worldState_week: `Semana |VAL|`, diff --git a/static/webui/translations/fr.js b/static/webui/translations/fr.js index 3e7e2434..8a158a8e 100644 --- a/static/webui/translations/fr.js +++ b/static/webui/translations/fr.js @@ -294,6 +294,7 @@ dict = { worldState_eightClawProgressOverride: `Progrès de la Huitième Griffe`, worldState_thermiaFractures: `Crevasses Thermia`, worldState_thermiaFracturesProgressOverride: `Progrès des Fractures Thermia`, + worldState_qtccAlerts: `[UNTRANSLATED] Quest to Conquer Cancer Alerts`, worldState_from_year: `de |VAL|`, worldState_pre_year: `pre-|VAL|`, worldState_week: `Semaine |VAL|`, diff --git a/static/webui/translations/ru.js b/static/webui/translations/ru.js index c4ab0386..bf153abb 100644 --- a/static/webui/translations/ru.js +++ b/static/webui/translations/ru.js @@ -294,6 +294,7 @@ dict = { worldState_eightClawProgressOverride: `Прогресс Восьми когтей`, worldState_thermiaFractures: `Разломы Термии`, worldState_thermiaFracturesProgressOverride: `Прогресс Разломов Термии`, + worldState_qtccAlerts: `Тревоги Quest to Conquer Cancer`, worldState_from_year: `из |VAL|`, worldState_pre_year: `до |VAL|`, worldState_week: `Неделя |VAL|`, diff --git a/static/webui/translations/uk.js b/static/webui/translations/uk.js index ffb3d11a..e534352c 100644 --- a/static/webui/translations/uk.js +++ b/static/webui/translations/uk.js @@ -294,6 +294,7 @@ dict = { worldState_eightClawProgressOverride: `Прогрес Восьми кігтів`, worldState_thermiaFractures: `Розломи термії`, worldState_thermiaFracturesProgressOverride: `Прогрес Розломів термії`, + worldState_qtccAlerts: `[UNTRANSLATED] Quest to Conquer Cancer Alerts`, worldState_from_year: `з |VAL|`, worldState_pre_year: `до |VAL|`, worldState_week: `Тиждень |VAL|`, diff --git a/static/webui/translations/zh.js b/static/webui/translations/zh.js index 0230716e..7d287430 100644 --- a/static/webui/translations/zh.js +++ b/static/webui/translations/zh.js @@ -294,6 +294,7 @@ dict = { worldState_eightClawProgressOverride: `大帝金币收集进度(%)`, worldState_thermiaFractures: `热美亚裂缝`, worldState_thermiaFracturesProgressOverride: `[UNTRANSLATED] Thermia Fractures Progress`, + worldState_qtccAlerts: `[UNTRANSLATED] Quest to Conquer Cancer Alerts`, worldState_from_year: `|VAL|`, worldState_pre_year: `|VAL|之前`, worldState_week: `第|VAL|周`,