feat: QTCC floofs alerts

Re #2842
This commit is contained in:
AMelonInsideLemon 2025-10-09 20:38:30 +02:00
parent 610a432e46
commit 9ca07984b2
12 changed files with 128 additions and 3 deletions

View File

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

View File

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

View File

@ -151,7 +151,7 @@ const configAlerts: Record<string, IAlert> = {
enemySpec: "/Lotus/Types/Game/EnemySpecs/CorpusShipEnemySpecs/CorpusShipSquadDefenseB", enemySpec: "/Lotus/Types/Game/EnemySpecs/CorpusShipEnemySpecs/CorpusShipSquadDefenseB",
minEnemyLevel: 20, minEnemyLevel: 20,
maxEnemyLevel: 25, maxEnemyLevel: 25,
maxWaveNum: 6 maxRotations: 2
} }
}, },
voidCorruption2025Week3: { voidCorruption2025Week3: {
@ -1476,6 +1476,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
const weekStart = EPOCH + week * 604800000; const weekStart = EPOCH + week * 604800000;
const weekEnd = weekStart + 604800000; const weekEnd = weekStart + 604800000;
const date = new Date(timeMs); const date = new Date(timeMs);
const defenseWavesPerRotation = buildLabel && version_compare(buildLabel, "2025.03.18.16.07") < 0 ? 5 : 3;
const worldState: IWorldState = { const worldState: IWorldState = {
BuildLabel: typeof buildLabel == "string" ? buildLabel.split(" ").join("+") : buildConfig.buildLabel, BuildLabel: typeof buildLabel == "string" ? buildLabel.split(" ").join("+") : buildConfig.buildLabel,
@ -1569,11 +1570,117 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
if (config.worldState) { if (config.worldState) {
for (const [key, alert] of Object.entries(configAlerts)) { for (const [key, alert] of Object.entries(configAlerts)) {
if (config.worldState[key as keyof typeof config.worldState]) { 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); 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; const isFebruary = date.getUTCMonth() == 1;
if (config.worldState?.starDaysOverride ?? isFebruary) { if (config.worldState?.starDaysOverride ?? isFebruary) {
worldState.Goals.push({ 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"; import type { IMongoDate, IOid } from "./commonTypes.ts";
export interface IWorldState { export interface IWorldState {
@ -40,11 +40,13 @@ export interface IAlert {
Activation: IMongoDate; Activation: IMongoDate;
Expiry: IMongoDate; Expiry: IMongoDate;
MissionInfo: IAlertMissionInfo; MissionInfo: IAlertMissionInfo;
Tag?: string;
ForceUnlock?: true;
} }
export interface IAlertMissionInfo { export interface IAlertMissionInfo {
location: string; location: string;
missionType: string; missionType: TMissionType;
faction: TFaction; faction: TFaction;
difficulty: number; difficulty: number;
missionReward?: IMissionReward; missionReward?: IMissionReward;
@ -55,6 +57,9 @@ export interface IAlertMissionInfo {
minEnemyLevel?: number; minEnemyLevel?: number;
maxEnemyLevel?: number; maxEnemyLevel?: number;
maxWaveNum?: number; maxWaveNum?: number;
descText?: string;
maxRotations?: number; // SNS specific field
} }
export interface IGoal { export interface IGoal {

View File

@ -1189,6 +1189,10 @@
<label class="form-check-label" for="worldState.hallowedFlame" data-loc="worldState_hallowedFlame"></label> <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> <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>
<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="form-group mt-2 d-flex gap-2">
<div class="flex-fill"> <div class="flex-fill">
<label class="form-label" for="worldState.hallowedNightmares" data-loc="worldState_hallowedNightmares"></label> <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_eightClawProgressOverride: `[UNTRANSLATED] Eight Claw Progress`,
worldState_thermiaFractures: `Thermische Risse`, worldState_thermiaFractures: `Thermische Risse`,
worldState_thermiaFracturesProgressOverride: `[UNTRANSLATED] Thermia Fractures Progress`, worldState_thermiaFracturesProgressOverride: `[UNTRANSLATED] Thermia Fractures Progress`,
worldState_qtccAlerts: `[UNTRANSLATED] Quest to Conquer Cancer Alerts`,
worldState_from_year: `[UNTRANSLATED] from |VAL|`, worldState_from_year: `[UNTRANSLATED] from |VAL|`,
worldState_pre_year: `[UNTRANSLATED] pre |VAL|`, worldState_pre_year: `[UNTRANSLATED] pre |VAL|`,
worldState_week: `[UNTRANSLATED] Week |VAL|`, worldState_week: `[UNTRANSLATED] Week |VAL|`,

View File

@ -293,6 +293,7 @@ dict = {
worldState_eightClawProgressOverride: `Eight Claw Progress`, worldState_eightClawProgressOverride: `Eight Claw Progress`,
worldState_thermiaFractures: `Thermia Fractures`, worldState_thermiaFractures: `Thermia Fractures`,
worldState_thermiaFracturesProgressOverride: `Thermia Fractures Progress`, worldState_thermiaFracturesProgressOverride: `Thermia Fractures Progress`,
worldState_qtccAlerts: `Quest to Conquer Cancer Alerts`,
worldState_from_year: `from |VAL|`, worldState_from_year: `from |VAL|`,
worldState_pre_year: `pre |VAL|`, worldState_pre_year: `pre |VAL|`,
worldState_week: `Week |VAL|`, worldState_week: `Week |VAL|`,

View File

@ -294,6 +294,7 @@ dict = {
worldState_eightClawProgressOverride: `Progreso de Octava Garra`, worldState_eightClawProgressOverride: `Progreso de Octava Garra`,
worldState_thermiaFractures: `Fracturas Thermia`, worldState_thermiaFractures: `Fracturas Thermia`,
worldState_thermiaFracturesProgressOverride: `Progreso de Fracturas Thermia`, worldState_thermiaFracturesProgressOverride: `Progreso de Fracturas Thermia`,
worldState_qtccAlerts: `[UNTRANSLATED] Quest to Conquer Cancer Alerts`,
worldState_from_year: `de |VAL|`, worldState_from_year: `de |VAL|`,
worldState_pre_year: `antes de |VAL|`, worldState_pre_year: `antes de |VAL|`,
worldState_week: `Semana |VAL|`, worldState_week: `Semana |VAL|`,

View File

@ -294,6 +294,7 @@ dict = {
worldState_eightClawProgressOverride: `Progrès de la Huitième Griffe`, worldState_eightClawProgressOverride: `Progrès de la Huitième Griffe`,
worldState_thermiaFractures: `Crevasses Thermia`, worldState_thermiaFractures: `Crevasses Thermia`,
worldState_thermiaFracturesProgressOverride: `Progrès des Fractures Thermia`, worldState_thermiaFracturesProgressOverride: `Progrès des Fractures Thermia`,
worldState_qtccAlerts: `[UNTRANSLATED] Quest to Conquer Cancer Alerts`,
worldState_from_year: `de |VAL|`, worldState_from_year: `de |VAL|`,
worldState_pre_year: `pre-|VAL|`, worldState_pre_year: `pre-|VAL|`,
worldState_week: `Semaine |VAL|`, worldState_week: `Semaine |VAL|`,

View File

@ -294,6 +294,7 @@ dict = {
worldState_eightClawProgressOverride: `Прогресс Восьми когтей`, worldState_eightClawProgressOverride: `Прогресс Восьми когтей`,
worldState_thermiaFractures: `Разломы Термии`, worldState_thermiaFractures: `Разломы Термии`,
worldState_thermiaFracturesProgressOverride: `Прогресс Разломов Термии`, worldState_thermiaFracturesProgressOverride: `Прогресс Разломов Термии`,
worldState_qtccAlerts: `Тревоги Quest to Conquer Cancer`,
worldState_from_year: `из |VAL|`, worldState_from_year: `из |VAL|`,
worldState_pre_year: `до |VAL|`, worldState_pre_year: `до |VAL|`,
worldState_week: `Неделя |VAL|`, worldState_week: `Неделя |VAL|`,

View File

@ -294,6 +294,7 @@ dict = {
worldState_eightClawProgressOverride: `Прогрес Восьми кігтів`, worldState_eightClawProgressOverride: `Прогрес Восьми кігтів`,
worldState_thermiaFractures: `Розломи термії`, worldState_thermiaFractures: `Розломи термії`,
worldState_thermiaFracturesProgressOverride: `Прогрес Розломів термії`, worldState_thermiaFracturesProgressOverride: `Прогрес Розломів термії`,
worldState_qtccAlerts: `[UNTRANSLATED] Quest to Conquer Cancer Alerts`,
worldState_from_year: `з |VAL|`, worldState_from_year: `з |VAL|`,
worldState_pre_year: `до |VAL|`, worldState_pre_year: `до |VAL|`,
worldState_week: `Тиждень |VAL|`, worldState_week: `Тиждень |VAL|`,

View File

@ -294,6 +294,7 @@ dict = {
worldState_eightClawProgressOverride: `大帝金币收集进度(%)`, worldState_eightClawProgressOverride: `大帝金币收集进度(%)`,
worldState_thermiaFractures: `热美亚裂缝`, worldState_thermiaFractures: `热美亚裂缝`,
worldState_thermiaFracturesProgressOverride: `[UNTRANSLATED] Thermia Fractures Progress`, worldState_thermiaFracturesProgressOverride: `[UNTRANSLATED] Thermia Fractures Progress`,
worldState_qtccAlerts: `[UNTRANSLATED] Quest to Conquer Cancer Alerts`,
worldState_from_year: `|VAL|`, worldState_from_year: `|VAL|`,
worldState_pre_year: `|VAL|之前`, worldState_pre_year: `|VAL|之前`,
worldState_week: `第|VAL|周`, worldState_week: `第|VAL|周`,