feat: QTCC floofs alerts (#2886)
Some checks failed
Build Docker image / docker-arm64 (push) Waiting to run
Build / build (push) Has been cancelled
Build Docker image / docker-amd64 (push) Has been cancelled

Re #2842

Reviewed-on: #2886
Reviewed-by: Sainan <63328889+sainan@users.noreply.github.com>
Co-authored-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com>
Co-committed-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com>
This commit is contained in:
AMelonInsideLemon 2025-10-09 23:01:36 -07:00 committed by Sainan
parent d6ed22d1ff
commit ca589cb7cf
12 changed files with 130 additions and 3 deletions

View File

@ -45,6 +45,7 @@
"voidCorruption2025Week2": false,
"voidCorruption2025Week3": false,
"voidCorruption2025Week4": false,
"qtccAlerts": false,
"galleonOfGhouls": 0,
"ghoulEmergenceOverride": null,
"plagueStarOverride": null,

View File

@ -55,6 +55,7 @@ export interface IConfig {
voidCorruption2025Week2?: boolean;
voidCorruption2025Week3?: boolean;
voidCorruption2025Week4?: boolean;
qtccAlerts?: boolean;
galleonOfGhouls?: number;
ghoulEmergenceOverride?: boolean;
plagueStarOverride?: boolean;

View File

@ -151,7 +151,7 @@ const configAlerts: Record<string, IAlert> = {
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,119 @@ 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);
alert.MissionInfo.maxRotations = undefined;
}
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({

View File

@ -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 {

View File

@ -1189,6 +1189,10 @@
<label class="form-check-label" for="worldState.hallowedFlame" data-loc="worldState_hallowedFlame"></label>
<abbr data-loc-inc="worldState_hallowedNightmares|worldState_dogDays|worldState_anniversary"><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>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="worldState.qtccAlerts" />
<label class="form-check-label" for="worldState.qtccAlerts" data-loc="worldState_qtccAlerts"></label>
</div>
<div class="form-group mt-2 d-flex gap-2">
<div class="flex-fill">
<label class="form-label" for="worldState.hallowedNightmares" data-loc="worldState_hallowedNightmares"></label>

View File

@ -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|`,

View File

@ -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|`,

View File

@ -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|`,

View File

@ -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|`,

View File

@ -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|`,

View File

@ -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|`,

View File

@ -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|周`,