forked from OpenWF/SpaceNinjaServer
		
	feat: tactical alerts (#2607)
Includes all `Tactical Alerts` since Star Chart 3.0 with exception: `Snowday Showdown` `Wolf Hunt (2019)` (couldn't find corresponded `EventNode` for that) `Void Corruption` (that's goes into `Alerts`) All `Warframe's Anniversary` Re #1103 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Reviewed-on: OpenWF/SpaceNinjaServer#2607 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:
		
							parent
							
								
									9cc0c76ef5
								
							
						
					
					
						commit
						fd2ec696a0
					
				@ -71,10 +71,19 @@
 | 
				
			|||||||
    "affinityBoost": false,
 | 
					    "affinityBoost": false,
 | 
				
			||||||
    "resourceBoost": false,
 | 
					    "resourceBoost": false,
 | 
				
			||||||
    "tennoLiveRelay": false,
 | 
					    "tennoLiveRelay": false,
 | 
				
			||||||
 | 
					    "wolfHunt": false,
 | 
				
			||||||
 | 
					    "longShadow": false,
 | 
				
			||||||
 | 
					    "hallowedFlame": false,
 | 
				
			||||||
 | 
					    "hallowedNightmares": false,
 | 
				
			||||||
 | 
					    "hallowedNightmaresRewardsOverride": 0,
 | 
				
			||||||
 | 
					    "proxyRebellion": false,
 | 
				
			||||||
 | 
					    "proxyRebellionRewardsOverride": 0,
 | 
				
			||||||
    "galleonOfGhouls": 0,
 | 
					    "galleonOfGhouls": 0,
 | 
				
			||||||
    "ghoulEmergenceOverride": null,
 | 
					    "ghoulEmergenceOverride": null,
 | 
				
			||||||
    "plagueStarOverride": null,
 | 
					    "plagueStarOverride": null,
 | 
				
			||||||
    "starDaysOverride": null,
 | 
					    "starDaysOverride": null,
 | 
				
			||||||
 | 
					    "dogDaysOverride": null,
 | 
				
			||||||
 | 
					    "dogDaysRewardsOverride": null,
 | 
				
			||||||
    "eidolonOverride": "",
 | 
					    "eidolonOverride": "",
 | 
				
			||||||
    "vallisOverride": "",
 | 
					    "vallisOverride": "",
 | 
				
			||||||
    "duviriOverride": "",
 | 
					    "duviriOverride": "",
 | 
				
			||||||
 | 
				
			|||||||
@ -13,7 +13,8 @@ import {
 | 
				
			|||||||
    addItems,
 | 
					    addItems,
 | 
				
			||||||
    combineInventoryChanges,
 | 
					    combineInventoryChanges,
 | 
				
			||||||
    getEffectiveAvatarImageType,
 | 
					    getEffectiveAvatarImageType,
 | 
				
			||||||
    getInventory
 | 
					    getInventory,
 | 
				
			||||||
 | 
					    updateCurrency
 | 
				
			||||||
} from "@/src/services/inventoryService";
 | 
					} from "@/src/services/inventoryService";
 | 
				
			||||||
import { logger } from "@/src/utils/logger";
 | 
					import { logger } from "@/src/utils/logger";
 | 
				
			||||||
import { ExportFlavour } from "warframe-public-export-plus";
 | 
					import { ExportFlavour } from "warframe-public-export-plus";
 | 
				
			||||||
@ -100,6 +101,9 @@ export const inboxController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        if (message.RegularCredits) {
 | 
				
			||||||
 | 
					            updateCurrency(inventory, -message.RegularCredits, false, inventoryChanges);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        await inventory.save();
 | 
					        await inventory.save();
 | 
				
			||||||
        res.json({ InventoryChanges: inventoryChanges });
 | 
					        res.json({ InventoryChanges: inventoryChanges });
 | 
				
			||||||
    } else if (latestClientMessageId) {
 | 
					    } else if (latestClientMessageId) {
 | 
				
			||||||
 | 
				
			|||||||
@ -47,6 +47,7 @@ export interface IMessage {
 | 
				
			|||||||
    acceptAction?: string;
 | 
					    acceptAction?: string;
 | 
				
			||||||
    declineAction?: string;
 | 
					    declineAction?: string;
 | 
				
			||||||
    hasAccountAction?: boolean;
 | 
					    hasAccountAction?: boolean;
 | 
				
			||||||
 | 
					    RegularCredits?: number;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface Arg {
 | 
					export interface Arg {
 | 
				
			||||||
@ -139,7 +140,8 @@ const messageSchema = new Schema<IMessageDatabase>(
 | 
				
			|||||||
        contextInfo: String,
 | 
					        contextInfo: String,
 | 
				
			||||||
        acceptAction: String,
 | 
					        acceptAction: String,
 | 
				
			||||||
        declineAction: String,
 | 
					        declineAction: String,
 | 
				
			||||||
        hasAccountAction: Boolean
 | 
					        hasAccountAction: Boolean,
 | 
				
			||||||
 | 
					        RegularCredits: Number
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    { id: false }
 | 
					    { id: false }
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
				
			|||||||
@ -83,10 +83,19 @@ export interface IConfig {
 | 
				
			|||||||
        resourceBoost?: boolean;
 | 
					        resourceBoost?: boolean;
 | 
				
			||||||
        tennoLiveRelay?: boolean;
 | 
					        tennoLiveRelay?: boolean;
 | 
				
			||||||
        baroTennoConRelay?: boolean;
 | 
					        baroTennoConRelay?: boolean;
 | 
				
			||||||
 | 
					        wolfHunt?: boolean;
 | 
				
			||||||
 | 
					        longShadow?: boolean;
 | 
				
			||||||
 | 
					        hallowedFlame?: boolean;
 | 
				
			||||||
 | 
					        hallowedNightmares?: boolean;
 | 
				
			||||||
 | 
					        hallowedNightmaresRewardsOverride?: number;
 | 
				
			||||||
 | 
					        proxyRebellion?: boolean;
 | 
				
			||||||
 | 
					        proxyRebellionRewardsOverride?: number;
 | 
				
			||||||
        galleonOfGhouls?: number;
 | 
					        galleonOfGhouls?: number;
 | 
				
			||||||
        ghoulEmergenceOverride?: boolean;
 | 
					        ghoulEmergenceOverride?: boolean;
 | 
				
			||||||
        plagueStarOverride?: boolean;
 | 
					        plagueStarOverride?: boolean;
 | 
				
			||||||
        starDaysOverride?: boolean;
 | 
					        starDaysOverride?: boolean;
 | 
				
			||||||
 | 
					        dogDaysOverride?: boolean;
 | 
				
			||||||
 | 
					        dogDaysRewardsOverride?: number;
 | 
				
			||||||
        eidolonOverride?: string;
 | 
					        eidolonOverride?: string;
 | 
				
			||||||
        vallisOverride?: string;
 | 
					        vallisOverride?: string;
 | 
				
			||||||
        duviriOverride?: string;
 | 
					        duviriOverride?: string;
 | 
				
			||||||
 | 
				
			|||||||
@ -50,7 +50,7 @@ import { getEntriesUnsafe } from "@/src/utils/ts-utils";
 | 
				
			|||||||
import { handleStoreItemAcquisition } from "@/src/services/purchaseService";
 | 
					import { handleStoreItemAcquisition } from "@/src/services/purchaseService";
 | 
				
			||||||
import { IMissionCredits, IMissionReward } from "@/src/types/missionTypes";
 | 
					import { IMissionCredits, IMissionReward } from "@/src/types/missionTypes";
 | 
				
			||||||
import { crackRelic } from "@/src/helpers/relicHelper";
 | 
					import { crackRelic } from "@/src/helpers/relicHelper";
 | 
				
			||||||
import { createMessage } from "@/src/services/inboxService";
 | 
					import { createMessage, IMessageCreationTemplate } from "@/src/services/inboxService";
 | 
				
			||||||
import kuriaMessage50 from "@/static/fixed_responses/kuriaMessages/fiftyPercent.json";
 | 
					import kuriaMessage50 from "@/static/fixed_responses/kuriaMessages/fiftyPercent.json";
 | 
				
			||||||
import kuriaMessage75 from "@/static/fixed_responses/kuriaMessages/seventyFivePercent.json";
 | 
					import kuriaMessage75 from "@/static/fixed_responses/kuriaMessages/seventyFivePercent.json";
 | 
				
			||||||
import kuriaMessage100 from "@/static/fixed_responses/kuriaMessages/oneHundredPercent.json";
 | 
					import kuriaMessage100 from "@/static/fixed_responses/kuriaMessages/oneHundredPercent.json";
 | 
				
			||||||
@ -624,36 +624,92 @@ export const addMissionInventoryUpdates = async (
 | 
				
			|||||||
                    if (goal && goal.Personal) {
 | 
					                    if (goal && goal.Personal) {
 | 
				
			||||||
                        inventory.PersonalGoalProgress ??= [];
 | 
					                        inventory.PersonalGoalProgress ??= [];
 | 
				
			||||||
                        const goalProgress = inventory.PersonalGoalProgress.find(x => x.goalId.equals(goal._id.$oid));
 | 
					                        const goalProgress = inventory.PersonalGoalProgress.find(x => x.goalId.equals(goal._id.$oid));
 | 
				
			||||||
                        if (goalProgress) {
 | 
					                        if (!goalProgress) {
 | 
				
			||||||
                            goalProgress.Best = Math.max(goalProgress.Best, uploadProgress.Best);
 | 
					 | 
				
			||||||
                            goalProgress.Count += uploadProgress.Count;
 | 
					 | 
				
			||||||
                        } else {
 | 
					 | 
				
			||||||
                            inventory.PersonalGoalProgress.push({
 | 
					                            inventory.PersonalGoalProgress.push({
 | 
				
			||||||
                                Best: uploadProgress.Best,
 | 
					                                Best: uploadProgress.Best,
 | 
				
			||||||
                                Count: uploadProgress.Count,
 | 
					                                Count: uploadProgress.Count,
 | 
				
			||||||
                                Tag: goal.Tag,
 | 
					                                Tag: goal.Tag,
 | 
				
			||||||
                                goalId: new Types.ObjectId(goal._id.$oid)
 | 
					                                goalId: new Types.ObjectId(goal._id.$oid)
 | 
				
			||||||
                            });
 | 
					                            });
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        const currentNode = inventoryUpdates.RewardInfo!.node;
 | 
				
			||||||
 | 
					                        let currentMissionKey;
 | 
				
			||||||
 | 
					                        if (currentNode == goal.Node) {
 | 
				
			||||||
 | 
					                            currentMissionKey = goal.MissionKeyName;
 | 
				
			||||||
 | 
					                        } else if (goal.ConcurrentNodes && goal.ConcurrentMissionKeyNames) {
 | 
				
			||||||
 | 
					                            for (let i = 0; i < goal.ConcurrentNodes.length; i++) {
 | 
				
			||||||
 | 
					                                if (currentNode == goal.ConcurrentNodes[i]) {
 | 
				
			||||||
 | 
					                                    currentMissionKey = goal.ConcurrentMissionKeyNames[i];
 | 
				
			||||||
 | 
					                                    break;
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        if (currentMissionKey && currentMissionKey in goalMessagesByKey) {
 | 
				
			||||||
 | 
					                            const totalCount = (goalProgress?.Count ?? 0) + uploadProgress.Count;
 | 
				
			||||||
 | 
					                            let reward;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            if (goal.InterimGoals && goal.InterimRewards) {
 | 
				
			||||||
 | 
					                                for (let i = 0; i < goal.InterimGoals.length; i++) {
 | 
				
			||||||
                                    if (
 | 
					                                    if (
 | 
				
			||||||
                                goal.Reward &&
 | 
					                                        goal.InterimGoals[i] &&
 | 
				
			||||||
                                goal.Reward.items &&
 | 
					                                        goal.InterimGoals[i] <= totalCount &&
 | 
				
			||||||
                                goal.MissionKeyName &&
 | 
					                                        (!goalProgress || goalProgress.Count < goal.InterimGoals[i]) &&
 | 
				
			||||||
                                goal.MissionKeyName in goalMessagesByKey
 | 
					                                        goal.InterimRewards[i]
 | 
				
			||||||
                                    ) {
 | 
					                                    ) {
 | 
				
			||||||
 | 
					                                        reward = goal.InterimRewards[i];
 | 
				
			||||||
 | 
					                                        break;
 | 
				
			||||||
 | 
					                                    }
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            if (
 | 
				
			||||||
 | 
					                                !reward &&
 | 
				
			||||||
 | 
					                                goal.Goal &&
 | 
				
			||||||
 | 
					                                goal.Goal <= totalCount &&
 | 
				
			||||||
 | 
					                                (!goalProgress || goalProgress.Count < goal.Goal) &&
 | 
				
			||||||
 | 
					                                goal.Reward
 | 
				
			||||||
 | 
					                            ) {
 | 
				
			||||||
 | 
					                                reward = goal.Reward;
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            if (
 | 
				
			||||||
 | 
					                                !reward &&
 | 
				
			||||||
 | 
					                                goal.BonusGoal &&
 | 
				
			||||||
 | 
					                                goal.BonusGoal <= totalCount &&
 | 
				
			||||||
 | 
					                                (!goalProgress || goalProgress.Count < goal.BonusGoal) &&
 | 
				
			||||||
 | 
					                                goal.BonusReward
 | 
				
			||||||
 | 
					                            ) {
 | 
				
			||||||
 | 
					                                reward = goal.BonusReward;
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            if (reward) {
 | 
				
			||||||
 | 
					                                if (currentMissionKey in goalMessagesByKey) {
 | 
				
			||||||
                                    // Send reward via inbox
 | 
					                                    // Send reward via inbox
 | 
				
			||||||
                                const info = goalMessagesByKey[goal.MissionKeyName];
 | 
					                                    const info = goalMessagesByKey[currentMissionKey];
 | 
				
			||||||
                                await createMessage(inventory.accountOwnerId, [
 | 
					                                    const message: IMessageCreationTemplate = {
 | 
				
			||||||
                                    {
 | 
					 | 
				
			||||||
                                        sndr: info.sndr,
 | 
					                                        sndr: info.sndr,
 | 
				
			||||||
                                        msg: info.msg,
 | 
					                                        msg: info.msg,
 | 
				
			||||||
                                        att: goal.Reward.items.map(x => (isStoreItem(x) ? fromStoreItem(x) : x)),
 | 
					 | 
				
			||||||
                                        sub: info.sub,
 | 
					                                        sub: info.sub,
 | 
				
			||||||
                                        icon: info.icon,
 | 
					                                        icon: info.icon,
 | 
				
			||||||
                                        highPriority: true
 | 
					                                        highPriority: true
 | 
				
			||||||
 | 
					                                    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                    if (reward.items) {
 | 
				
			||||||
 | 
					                                        message.att = reward.items.map(x => (isStoreItem(x) ? fromStoreItem(x) : x));
 | 
				
			||||||
                                    }
 | 
					                                    }
 | 
				
			||||||
                                ]);
 | 
					                                    if (reward.countedItems) {
 | 
				
			||||||
 | 
					                                        message.countedAtt = reward.countedItems;
 | 
				
			||||||
                                    }
 | 
					                                    }
 | 
				
			||||||
 | 
					                                    if (reward.credits) {
 | 
				
			||||||
 | 
					                                        message.RegularCredits = reward.credits;
 | 
				
			||||||
 | 
					                                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                    await createMessage(inventory.accountOwnerId, [message]);
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if (goalProgress) {
 | 
				
			||||||
 | 
					                            goalProgress.Best = Math.max(goalProgress.Best, uploadProgress.Best);
 | 
				
			||||||
 | 
					                            goalProgress.Count += uploadProgress.Count;
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@ -1011,8 +1067,16 @@ export const addMissionRewards = async (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if (rewardInfo.goalId) {
 | 
					    if (rewardInfo.goalId) {
 | 
				
			||||||
        const goal = getWorldState().Goals.find(x => x._id.$oid == rewardInfo.goalId);
 | 
					        const goal = getWorldState().Goals.find(x => x._id.$oid == rewardInfo.goalId);
 | 
				
			||||||
        if (goal?.MissionKeyName) {
 | 
					        if (goal) {
 | 
				
			||||||
            levelKeyName = goal.MissionKeyName;
 | 
					            if (rewardInfo.node == goal.Node && goal.MissionKeyName) levelKeyName = goal.MissionKeyName;
 | 
				
			||||||
 | 
					            if (goal.ConcurrentNodes && goal.ConcurrentMissionKeyNames) {
 | 
				
			||||||
 | 
					                for (let i = 0; i < goal.ConcurrentNodes.length && i < goal.ConcurrentMissionKeyNames.length; i++) {
 | 
				
			||||||
 | 
					                    if (rewardInfo.node == goal.ConcurrentNodes[i]) {
 | 
				
			||||||
 | 
					                        levelKeyName = goal.ConcurrentMissionKeyNames[i];
 | 
				
			||||||
 | 
					                        break;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -2149,5 +2213,143 @@ const goalMessagesByKey: Record<string, { sndr: string; msg: string; sub: string
 | 
				
			|||||||
        msg: "/Lotus/Language/Messages/GalleonRobbery2025RewardMsgC",
 | 
					        msg: "/Lotus/Language/Messages/GalleonRobbery2025RewardMsgC",
 | 
				
			||||||
        sub: "/Lotus/Language/Messages/GalleonRobbery2025MissionTitleC",
 | 
					        sub: "/Lotus/Language/Messages/GalleonRobbery2025MissionTitleC",
 | 
				
			||||||
        icon: "/Lotus/Interface/Icons/Npcs/VayHekPortrait.png"
 | 
					        icon: "/Lotus/Interface/Icons/Npcs/VayHekPortrait.png"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "/Lotus/Types/Keys/TacAlertKeyWaterFightA": {
 | 
				
			||||||
 | 
					        sndr: "/Lotus/Language/Bosses/BossKelaDeThaym",
 | 
				
			||||||
 | 
					        msg: "/Lotus/Language/Inbox/WaterFightRewardMsgA",
 | 
				
			||||||
 | 
					        sub: "/Lotus/Language/Inbox/WaterFightRewardSubjectA",
 | 
				
			||||||
 | 
					        icon: "/Lotus/Interface/Icons/Npcs/Grineer/KelaDeThaym.png"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "/Lotus/Types/Keys/TacAlertKeyWaterFightB": {
 | 
				
			||||||
 | 
					        sndr: "/Lotus/Language/Bosses/BossKelaDeThaym",
 | 
				
			||||||
 | 
					        msg: "/Lotus/Language/Inbox/WaterFightRewardMsgB",
 | 
				
			||||||
 | 
					        sub: "/Lotus/Language/Inbox/WaterFightRewardSubjectB",
 | 
				
			||||||
 | 
					        icon: "/Lotus/Interface/Icons/Npcs/Grineer/KelaDeThaym.png"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "/Lotus/Types/Keys/TacAlertKeyWaterFightC": {
 | 
				
			||||||
 | 
					        sndr: "/Lotus/Language/Bosses/BossKelaDeThaym",
 | 
				
			||||||
 | 
					        msg: "/Lotus/Language/Inbox/WaterFightRewardMsgC",
 | 
				
			||||||
 | 
					        sub: "/Lotus/Language/Inbox/WaterFightRewardSubjectC",
 | 
				
			||||||
 | 
					        icon: "/Lotus/Interface/Icons/Npcs/Grineer/KelaDeThaym.png"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "/Lotus/Types/Keys/TacAlertKeyWaterFightD": {
 | 
				
			||||||
 | 
					        sndr: "/Lotus/Language/Bosses/BossKelaDeThaym",
 | 
				
			||||||
 | 
					        msg: "/Lotus/Language/Inbox/WaterFightRewardMsgD",
 | 
				
			||||||
 | 
					        sub: "/Lotus/Language/Inbox/WaterFightRewardSubjectD",
 | 
				
			||||||
 | 
					        icon: "/Lotus/Interface/Icons/Npcs/Grineer/KelaDeThaym.png"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "/Lotus/Types/Keys/WolfTacAlertReduxA": {
 | 
				
			||||||
 | 
					        sndr: "/Lotus/Language/Bosses/NoraNight",
 | 
				
			||||||
 | 
					        msg: "/Lotus/Language/Inbox/WolfTacAlertBody",
 | 
				
			||||||
 | 
					        sub: "/Lotus/Language/Inbox/WolfTacAlertTitle",
 | 
				
			||||||
 | 
					        icon: "/Lotus/Interface/Icons/Npcs/Seasonal/NoraNight.png"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "/Lotus/Types/Keys/WolfTacAlertReduxB": {
 | 
				
			||||||
 | 
					        sndr: "/Lotus/Language/Bosses/NoraNight",
 | 
				
			||||||
 | 
					        msg: "/Lotus/Language/Inbox/WolfTacAlertBody",
 | 
				
			||||||
 | 
					        sub: "/Lotus/Language/Inbox/WolfTacAlertTitle",
 | 
				
			||||||
 | 
					        icon: "/Lotus/Interface/Icons/Npcs/Seasonal/NoraNight.png"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "/Lotus/Types/Keys/WolfTacAlertReduxD": {
 | 
				
			||||||
 | 
					        sndr: "/Lotus/Language/Bosses/NoraNight",
 | 
				
			||||||
 | 
					        msg: "/Lotus/Language/Inbox/WolfTacAlertBody",
 | 
				
			||||||
 | 
					        sub: "/Lotus/Language/Inbox/WolfTacAlertTitle",
 | 
				
			||||||
 | 
					        icon: "/Lotus/Interface/Icons/Npcs/Seasonal/NoraNight.png"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "/Lotus/Types/Keys/WolfTacAlertReduxC": {
 | 
				
			||||||
 | 
					        sndr: "/Lotus/Language/Bosses/NoraNight",
 | 
				
			||||||
 | 
					        msg: "/Lotus/Language/Inbox/WolfTacAlertBody",
 | 
				
			||||||
 | 
					        sub: "/Lotus/Language/Inbox/WolfTacAlertTitle",
 | 
				
			||||||
 | 
					        icon: "/Lotus/Interface/Icons/Npcs/Seasonal/NoraNight.png"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "/Lotus/Types/Keys/LanternEndlessEventKeyA": {
 | 
				
			||||||
 | 
					        sndr: "/Lotus/Language/Bosses/Lotus",
 | 
				
			||||||
 | 
					        msg: "/Lotus/Language/G1Quests/GenericEventRewardMsgDesc",
 | 
				
			||||||
 | 
					        sub: "/Lotus/Language/G1Quests/GenericTacAlertRewardMsgTitle",
 | 
				
			||||||
 | 
					        icon: "/Lotus/Interface/Icons/Npcs/LotusVamp_d.png"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "/Lotus/Types/Keys/LanternEndlessEventKeyB": {
 | 
				
			||||||
 | 
					        sndr: "/Lotus/Language/Bosses/Lotus",
 | 
				
			||||||
 | 
					        msg: "/Lotus/Language/G1Quests/GenericEventRewardMsgDesc",
 | 
				
			||||||
 | 
					        sub: "/Lotus/Language/G1Quests/GenericTacAlertRewardMsgTitle",
 | 
				
			||||||
 | 
					        icon: "/Lotus/Interface/Icons/Npcs/LotusVamp_d.png"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "/Lotus/Types/Keys/LanternEndlessEventKeyD": {
 | 
				
			||||||
 | 
					        sndr: "/Lotus/Language/Bosses/Lotus",
 | 
				
			||||||
 | 
					        msg: "/Lotus/Language/G1Quests/GenericEventRewardMsgDesc",
 | 
				
			||||||
 | 
					        sub: "/Lotus/Language/G1Quests/GenericTacAlertRewardMsgTitle",
 | 
				
			||||||
 | 
					        icon: "/Lotus/Interface/Icons/Npcs/LotusVamp_d.png"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "/Lotus/Types/Keys/LanternEndlessEventKeyC": {
 | 
				
			||||||
 | 
					        sndr: "/Lotus/Language/Bosses/Lotus",
 | 
				
			||||||
 | 
					        msg: "/Lotus/Language/G1Quests/GenericEventRewardMsgDesc",
 | 
				
			||||||
 | 
					        sub: "/Lotus/Language/G1Quests/GenericTacAlertRewardMsgTitle",
 | 
				
			||||||
 | 
					        icon: "/Lotus/Interface/Icons/Npcs/LotusVamp_d.png"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "/Lotus/Types/Keys/TacAlertKeyHalloween": {
 | 
				
			||||||
 | 
					        sndr: "/Lotus/Language/Bosses/Lotus",
 | 
				
			||||||
 | 
					        msg: "/Lotus/Language/G1Quests/TacAlertHalloweenRewardsBonusBody",
 | 
				
			||||||
 | 
					        sub: "/Lotus/Language/G1Quests/TacAlertHalloweenRewardsBonusTitle",
 | 
				
			||||||
 | 
					        icon: "/Lotus/Interface/Icons/Npcs/LotusVamp_d.png"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "/Lotus/Types/Keys/TacAlertKeyHalloweenBonus": {
 | 
				
			||||||
 | 
					        sndr: "/Lotus/Language/Bosses/Lotus",
 | 
				
			||||||
 | 
					        msg: "/Lotus/Language/G1Quests/TacAlertHalloweenRewardsBody",
 | 
				
			||||||
 | 
					        sub: "/Lotus/Language/G1Quests/TacAlertHalloweenRewardsTitle",
 | 
				
			||||||
 | 
					        icon: "/Lotus/Interface/Icons/Npcs/LotusVamp_d.png"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "/Lotus/Types/Keys/TacAlertKeyHalloweenTimeAttack": {
 | 
				
			||||||
 | 
					        sndr: "/Lotus/Language/Bosses/Lotus",
 | 
				
			||||||
 | 
					        msg: "/Lotus/Language/G1Quests/TacAlertHalloweenRewardsBody",
 | 
				
			||||||
 | 
					        sub: "/Lotus/Language/G1Quests/TacAlertHalloweenRewardsTitle",
 | 
				
			||||||
 | 
					        icon: "/Lotus/Interface/Icons/Npcs/LotusVamp_d.png"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "/Lotus/Types/Keys/TacAlertKeyProxyRebellionOne": {
 | 
				
			||||||
 | 
					        sndr: "/Lotus/Language/Bosses/Lotus",
 | 
				
			||||||
 | 
					        msg: "/Lotus/Language/G1Quests/RazorbackArmadaRewardBody",
 | 
				
			||||||
 | 
					        sub: "/Lotus/Language/G1Quests/GenericTacAlertSmallRewardMsgTitle",
 | 
				
			||||||
 | 
					        icon: "/Lotus/Interface/Icons/Npcs/Lotus_d.png"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "/Lotus/Types/Keys/TacAlertKeyProxyRebellionTwo": {
 | 
				
			||||||
 | 
					        sndr: "/Lotus/Language/Bosses/Lotus",
 | 
				
			||||||
 | 
					        msg: "/Lotus/Language/G1Quests/RazorbackArmadaRewardBody",
 | 
				
			||||||
 | 
					        sub: "/Lotus/Language/G1Quests/GenericTacAlertSmallRewardMsgTitle",
 | 
				
			||||||
 | 
					        icon: "/Lotus/Interface/Icons/Npcs/Lotus_d.png"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "/Lotus/Types/Keys/TacAlertKeyProxyRebellionThree": {
 | 
				
			||||||
 | 
					        sndr: "/Lotus/Language/Bosses/Lotus",
 | 
				
			||||||
 | 
					        msg: "/Lotus/Language/G1Quests/RazorbackArmadaRewardBody",
 | 
				
			||||||
 | 
					        sub: "/Lotus/Language/G1Quests/GenericTacAlertSmallRewardMsgTitle",
 | 
				
			||||||
 | 
					        icon: "/Lotus/Interface/Icons/Npcs/Lotus_d.png"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "/Lotus/Types/Keys/TacAlertKeyProxyRebellionFour": {
 | 
				
			||||||
 | 
					        sndr: "/Lotus/Language/Bosses/Lotus",
 | 
				
			||||||
 | 
					        msg: "/Lotus/Language/G1Quests/GenericTacAlertBadgeRewardMsgDesc",
 | 
				
			||||||
 | 
					        sub: "/Lotus/Language/G1Quests/GenericTacAlertBadgeRewardMsgTitle",
 | 
				
			||||||
 | 
					        icon: "/Lotus/Interface/Icons/Npcs/Lotus_d.png"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "/Lotus/Types/Keys/TacAlertKeyProjectNightwatchEasy": {
 | 
				
			||||||
 | 
					        sndr: "/Lotus/Language/Bosses/Lotus",
 | 
				
			||||||
 | 
					        msg: "/Lotus/Language/G1Quests/ProjectNightwatchRewardMsgA",
 | 
				
			||||||
 | 
					        sub: "/Lotus/Language/G1Quests/ProjectNightwatchTacAlertMissionOneTitle",
 | 
				
			||||||
 | 
					        icon: "/Lotus/Interface/Icons/Npcs/Lotus_d.png"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "/Lotus/Types/Keys/TacAlertKeyProjectNightwatch": {
 | 
				
			||||||
 | 
					        sndr: "/Lotus/Language/Bosses/Lotus",
 | 
				
			||||||
 | 
					        msg: "/Lotus/Language/G1Quests/ProjectNightwatchTacAlertMissionRewardBody",
 | 
				
			||||||
 | 
					        sub: "/Lotus/Language/G1Quests/ProjectNightwatchTacAlertMissionTwoTitle",
 | 
				
			||||||
 | 
					        icon: "/Lotus/Interface/Icons/Npcs/Lotus_d.png"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "/Lotus/Types/Keys/TacAlertKeyProjectNightwatchHard": {
 | 
				
			||||||
 | 
					        sndr: "/Lotus/Language/Bosses/Lotus",
 | 
				
			||||||
 | 
					        msg: "/Lotus/Language/G1Quests/ProjectNightwatchTacAlertMissionRewardBody",
 | 
				
			||||||
 | 
					        sub: "/Lotus/Language/G1Quests/ProjectNightwatchTacAlertMissionThreeTitle",
 | 
				
			||||||
 | 
					        icon: "/Lotus/Interface/Icons/Npcs/Lotus_d.png"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "/Lotus/Types/Keys/TacAlertKeyProjectNightwatchBonus": {
 | 
				
			||||||
 | 
					        sndr: "/Lotus/Language/Bosses/Lotus",
 | 
				
			||||||
 | 
					        msg: "/Lotus/Language/G1Quests/ProjectNightwatchTacAlertMissionRewardBody",
 | 
				
			||||||
 | 
					        sub: "/Lotus/Language/G1Quests/ProjectNightwatchTacAlertMissionFourTitle",
 | 
				
			||||||
 | 
					        icon: "/Lotus/Interface/Icons/Npcs/Lotus_d.png"
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
@ -1392,6 +1392,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
 | 
				
			|||||||
        Sorties: [],
 | 
					        Sorties: [],
 | 
				
			||||||
        LiteSorties: [],
 | 
					        LiteSorties: [],
 | 
				
			||||||
        ActiveMissions: [],
 | 
					        ActiveMissions: [],
 | 
				
			||||||
 | 
					        FlashSales: [],
 | 
				
			||||||
        GlobalUpgrades: [],
 | 
					        GlobalUpgrades: [],
 | 
				
			||||||
        Invasions: [],
 | 
					        Invasions: [],
 | 
				
			||||||
        VoidTraders: [],
 | 
					        VoidTraders: [],
 | 
				
			||||||
@ -1401,7 +1402,15 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
 | 
				
			|||||||
        EndlessXpChoices: [],
 | 
					        EndlessXpChoices: [],
 | 
				
			||||||
        KnownCalendarSeasons: [],
 | 
					        KnownCalendarSeasons: [],
 | 
				
			||||||
        ...staticWorldState,
 | 
					        ...staticWorldState,
 | 
				
			||||||
        SyndicateMissions: [...staticWorldState.SyndicateMissions]
 | 
					        SyndicateMissions: [...staticWorldState.SyndicateMissions],
 | 
				
			||||||
 | 
					        InGameMarket: {
 | 
				
			||||||
 | 
					            LandingPage: {
 | 
				
			||||||
 | 
					                Categories: staticWorldState.InGameMarket.LandingPage.Categories.map(c => ({
 | 
				
			||||||
 | 
					                    ...c,
 | 
				
			||||||
 | 
					                    Items: [...c.Items]
 | 
				
			||||||
 | 
					                }))
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Old versions seem to really get hung up on not being able to load these.
 | 
					    // Old versions seem to really get hung up on not being able to load these.
 | 
				
			||||||
@ -1526,7 +1535,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
 | 
				
			|||||||
            Personal: true,
 | 
					            Personal: true,
 | 
				
			||||||
            Bounty: true,
 | 
					            Bounty: true,
 | 
				
			||||||
            ClampNodeScores: true,
 | 
					            ClampNodeScores: true,
 | 
				
			||||||
            Node: "EventNode28",
 | 
					            Node: "EventNode28", // Incompatible with Wolf Hunt (2025)
 | 
				
			||||||
            MissionKeyName: "/Lotus/Types/Keys/GalleonRobberyAlertB",
 | 
					            MissionKeyName: "/Lotus/Types/Keys/GalleonRobberyAlertB",
 | 
				
			||||||
            Desc: "/Lotus/Language/Events/GalleonRobberyEventMissionTitle",
 | 
					            Desc: "/Lotus/Language/Events/GalleonRobberyEventMissionTitle",
 | 
				
			||||||
            Icon: "/Lotus/Interface/Icons/Player/GalleonRobberiesEvent.png",
 | 
					            Icon: "/Lotus/Interface/Icons/Player/GalleonRobberiesEvent.png",
 | 
				
			||||||
@ -1629,6 +1638,634 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
 | 
				
			|||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const firstAugustWeekday = new Date(Date.UTC(date.getUTCFullYear(), 7, 1)).getUTCDay();
 | 
				
			||||||
 | 
					    const firstAugustWednesdayOffset = (3 - firstAugustWeekday + 7) % 7;
 | 
				
			||||||
 | 
					    const dogDaysStart = Date.UTC(date.getUTCFullYear(), 7, 1 + firstAugustWednesdayOffset, 15);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const firstSeptemberWeekday = new Date(Date.UTC(date.getUTCFullYear(), 8, 1)).getUTCDay();
 | 
				
			||||||
 | 
					    const firstSeptemberWednesdayOffset = (3 - firstSeptemberWeekday + 7) % 7;
 | 
				
			||||||
 | 
					    const dogDaysEnd = Date.UTC(date.getUTCFullYear(), 8, 1 + firstSeptemberWednesdayOffset, 15);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const isDogDaysActive = timeMs >= dogDaysStart && timeMs < dogDaysEnd;
 | 
				
			||||||
 | 
					    if (config.worldState?.dogDaysOverride ?? isDogDaysActive) {
 | 
				
			||||||
 | 
					        const activationTimeStamp = config.worldState?.dogDaysOverride ? "1699372800000" : dogDaysStart.toString();
 | 
				
			||||||
 | 
					        const expiryTimeStamp = config.worldState?.dogDaysOverride ? "2000000000000" : dogDaysEnd.toString();
 | 
				
			||||||
 | 
					        const rewards = [
 | 
				
			||||||
 | 
					            [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    credits: 50000,
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Upgrades/Skins/Weapons/Redeemer/RedeemerRelayWaterSkin"]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    credits: 50000,
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Types/Items/MiscItems/PhotoboothTileHydroidRelay"]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    credits: 50000,
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Types/Items/ShipDecos/RelayHydroidBobbleHead"]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    items: [
 | 
				
			||||||
 | 
					                        "/Lotus/StoreItems/Types/Items/MiscItems/OrokinReactor",
 | 
				
			||||||
 | 
					                        "/Lotus/StoreItems/Upgrades/Skins/Clan/BountyHunterBadgeItem"
 | 
				
			||||||
 | 
					                    ]
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    credits: 50000,
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Upgrades/Skins/Sigils/DogDays2023ASigil"],
 | 
				
			||||||
 | 
					                    countedItems: [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            ItemType: "/Lotus/Types/Items/MiscItems/WaterFightBucks",
 | 
				
			||||||
 | 
					                            ItemCount: 25
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    credits: 50000,
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Types/Items/ShipDecos/Plushies/PlushyBeachKavat"],
 | 
				
			||||||
 | 
					                    countedItems: [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            ItemType: "/Lotus/Types/Items/MiscItems/WaterFightBucks",
 | 
				
			||||||
 | 
					                            ItemCount: 50
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    credits: 50000,
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Types/Items/ShipDecos/Plushies/PlushyRucksackKubrow"],
 | 
				
			||||||
 | 
					                    countedItems: [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            ItemType: "/Lotus/Types/Items/MiscItems/WaterFightBucks",
 | 
				
			||||||
 | 
					                            ItemCount: 75
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Types/Items/ShipDecos/LisetPropCleaningDroneBeachcomber"],
 | 
				
			||||||
 | 
					                    countedItems: [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            ItemType: "/Lotus/Types/Items/MiscItems/WaterFightBucks",
 | 
				
			||||||
 | 
					                            ItemCount: 100
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ]
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    credits: 50000,
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Types/StoreItems/AvatarImages/Seasonal/AvatarImageDogDays2024Glyph"],
 | 
				
			||||||
 | 
					                    countedItems: [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            ItemType: "/Lotus/Types/Items/MiscItems/WaterFightBucks",
 | 
				
			||||||
 | 
					                            ItemCount: 25
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    credits: 50000,
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Types/Items/ShipDecos/DogDays2024Poster"],
 | 
				
			||||||
 | 
					                    countedItems: [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            ItemType: "/Lotus/Types/Items/MiscItems/WaterFightBucks",
 | 
				
			||||||
 | 
					                            ItemCount: 50
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    credits: 50000,
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Upgrades/Skins/Clan/DogDaysKubrowBadgeItem"],
 | 
				
			||||||
 | 
					                    countedItems: [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            ItemType: "/Lotus/Types/Items/MiscItems/WaterFightBucks",
 | 
				
			||||||
 | 
					                            ItemCount: 75
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Types/Items/ShipDecos/DogDays2024LisetPropCleaningDroneBeachcomber"],
 | 
				
			||||||
 | 
					                    countedItems: [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            ItemType: "/Lotus/Types/Items/MiscItems/WaterFightBucks",
 | 
				
			||||||
 | 
					                            ItemCount: 100
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ]
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    credits: 50000,
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Types/StoreItems/AvatarImages/AvatarImageDogDaysHydroidGlyph"],
 | 
				
			||||||
 | 
					                    countedItems: [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            ItemType: "/Lotus/Types/Items/MiscItems/WaterFightBucks",
 | 
				
			||||||
 | 
					                            ItemCount: 25
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    credits: 50000,
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Types/StoreItems/AvatarImages/AvatarImageDogDaysLokiGlyph"],
 | 
				
			||||||
 | 
					                    countedItems: [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            ItemType: "/Lotus/Types/Items/MiscItems/WaterFightBucks",
 | 
				
			||||||
 | 
					                            ItemCount: 50
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    credits: 50000,
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Types/StoreItems/AvatarImages/AvatarImageDogDaysNovaGlyph"],
 | 
				
			||||||
 | 
					                    countedItems: [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            ItemType: "/Lotus/Types/Items/MiscItems/WaterFightBucks",
 | 
				
			||||||
 | 
					                            ItemCount: 75
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    credits: 50000,
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Types/StoreItems/AvatarImages/AvatarImageDogDaysValkyrGlyph"],
 | 
				
			||||||
 | 
					                    countedItems: [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            ItemType: "/Lotus/Types/Items/MiscItems/WaterFightBucks",
 | 
				
			||||||
 | 
					                            ItemCount: 100
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ]
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const year = config.worldState?.dogDaysRewardsOverride ?? 3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        worldState.Goals.push({
 | 
				
			||||||
 | 
					            _id: {
 | 
				
			||||||
 | 
					                $oid: ((dogDaysStart / 1000) & 0xffffffff).toString(16).padStart(8, "0") + "c57487c3768936df"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            Activation: { $date: { $numberLong: activationTimeStamp } },
 | 
				
			||||||
 | 
					            Expiry: { $date: { $numberLong: expiryTimeStamp } },
 | 
				
			||||||
 | 
					            Count: 0,
 | 
				
			||||||
 | 
					            Goal: 100,
 | 
				
			||||||
 | 
					            InterimGoals: [25, 50],
 | 
				
			||||||
 | 
					            BonusGoal: 200,
 | 
				
			||||||
 | 
					            Success: 0,
 | 
				
			||||||
 | 
					            Personal: true,
 | 
				
			||||||
 | 
					            Bounty: true,
 | 
				
			||||||
 | 
					            ClampNodeScores: true,
 | 
				
			||||||
 | 
					            Node: "EventNode25", // Incompatible with Hallowed Flame, Hallowed Nightmares
 | 
				
			||||||
 | 
					            ConcurrentMissionKeyNames: [
 | 
				
			||||||
 | 
					                "/Lotus/Types/Keys/TacAlertKeyWaterFightB",
 | 
				
			||||||
 | 
					                "/Lotus/Types/Keys/TacAlertKeyWaterFightC",
 | 
				
			||||||
 | 
					                "/Lotus/Types/Keys/TacAlertKeyWaterFightD"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            ConcurrentNodeReqs: [25, 50, 100],
 | 
				
			||||||
 | 
					            ConcurrentNodes: ["EventNode24", "EventNode34", "EventNode35"], // Incompatible with Hallowed Flame, Hallowed Nightmares
 | 
				
			||||||
 | 
					            MissionKeyName: "/Lotus/Types/Keys/TacAlertKeyWaterFightA",
 | 
				
			||||||
 | 
					            Faction: "FC_CORPUS",
 | 
				
			||||||
 | 
					            Desc: "/Lotus/Language/Alerts/TacAlertWaterFight",
 | 
				
			||||||
 | 
					            Icon: "/Lotus/Interface/Icons/StoreIcons/Emblems/SplashEventIcon.png",
 | 
				
			||||||
 | 
					            Tag: "WaterFight",
 | 
				
			||||||
 | 
					            InterimRewards: rewards[year].slice(0, 2),
 | 
				
			||||||
 | 
					            Reward: rewards[year][2],
 | 
				
			||||||
 | 
					            BonusReward: rewards[year][3],
 | 
				
			||||||
 | 
					            ScoreVar: "Team1Score",
 | 
				
			||||||
 | 
					            NightLevel: "/Lotus/Levels/GrineerBeach/GrineerBeachEventNight.level"
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const baseStoreItem = {
 | 
				
			||||||
 | 
					            ShowInMarket: true,
 | 
				
			||||||
 | 
					            HideFromMarket: false,
 | 
				
			||||||
 | 
					            SupporterPack: false,
 | 
				
			||||||
 | 
					            Discount: 0,
 | 
				
			||||||
 | 
					            BogoBuy: 0,
 | 
				
			||||||
 | 
					            BogoGet: 0,
 | 
				
			||||||
 | 
					            StartDate: { $date: { $numberLong: activationTimeStamp } },
 | 
				
			||||||
 | 
					            EndDate: { $date: { $numberLong: expiryTimeStamp } },
 | 
				
			||||||
 | 
					            ProductExpiryOverride: { $date: { $numberLong: expiryTimeStamp } }
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const storeItems = [
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                TypeName: "/Lotus/Types/StoreItems/Packages/WaterFightNoggleBundle",
 | 
				
			||||||
 | 
					                PremiumOverride: 240,
 | 
				
			||||||
 | 
					                RegularOverride: 0
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                TypeName: "/Lotus/Types/Items/ShipDecos/Events/WFBeastMasterBobbleHead",
 | 
				
			||||||
 | 
					                PremiumOverride: 35,
 | 
				
			||||||
 | 
					                RegularOverride: 0
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                TypeName: "/Lotus/Types/Items/ShipDecos/Events/WFChargerBobbleHead",
 | 
				
			||||||
 | 
					                PremiumOverride: 35,
 | 
				
			||||||
 | 
					                RegularOverride: 0
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                TypeName: "/Lotus/Types/Items/ShipDecos/Events/WFEngineerBobbleHead",
 | 
				
			||||||
 | 
					                PremiumOverride: 35,
 | 
				
			||||||
 | 
					                RegularOverride: 0
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                TypeName: "/Lotus/Types/Items/ShipDecos/Events/WFGruntBobbleHead",
 | 
				
			||||||
 | 
					                PremiumOverride: 35,
 | 
				
			||||||
 | 
					                RegularOverride: 0
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                TypeName: "/Lotus/Types/StoreItems/AvatarImages/ImagePopsicleGrineerPurple",
 | 
				
			||||||
 | 
					                PremiumOverride: 0,
 | 
				
			||||||
 | 
					                RegularOverride: 1
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                TypeName: "/Lotus/Types/Items/ShipDecos/Events/WFHealerBobbleHead",
 | 
				
			||||||
 | 
					                PremiumOverride: 35,
 | 
				
			||||||
 | 
					                RegularOverride: 0
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                TypeName: "/Lotus/Types/Items/ShipDecos/Events/WFHeavyBobbleHead",
 | 
				
			||||||
 | 
					                PremiumOverride: 35,
 | 
				
			||||||
 | 
					                RegularOverride: 0
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                TypeName: "/Lotus/Types/Items/ShipDecos/Events/WFHellionBobbleHead",
 | 
				
			||||||
 | 
					                PremiumOverride: 35,
 | 
				
			||||||
 | 
					                RegularOverride: 0
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                TypeName: "/Lotus/Types/Items/ShipDecos/Events/WFSniperBobbleHead",
 | 
				
			||||||
 | 
					                PremiumOverride: 35,
 | 
				
			||||||
 | 
					                RegularOverride: 0
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                TypeName: "/Lotus/Types/Items/ShipDecos/Events/WFTankBobbleHead",
 | 
				
			||||||
 | 
					                PremiumOverride: 35,
 | 
				
			||||||
 | 
					                RegularOverride: 0
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                TypeName: "/Lotus/Types/StoreItems/SuitCustomizations/ColourPickerRollers",
 | 
				
			||||||
 | 
					                PremiumOverride: 75,
 | 
				
			||||||
 | 
					                RegularOverride: 0
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        worldState.FlashSales.push(...storeItems.map(item => ({ ...baseStoreItem, ...item })));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const seasonalItems = storeItems.map(item => item.TypeName);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const seasonalCategory = worldState.InGameMarket.LandingPage.Categories.find(c => c.CategoryName == "SEASONAL");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (seasonalCategory) {
 | 
				
			||||||
 | 
					            seasonalCategory.Items ??= [];
 | 
				
			||||||
 | 
					            seasonalCategory.Items.push(...seasonalItems);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            worldState.InGameMarket.LandingPage.Categories.push({
 | 
				
			||||||
 | 
					                CategoryName: "SEASONAL",
 | 
				
			||||||
 | 
					                Name: "/Lotus/Language/Store/SeasonalCategoryTitle",
 | 
				
			||||||
 | 
					                Icon: "seasonal",
 | 
				
			||||||
 | 
					                AddToMenu: true,
 | 
				
			||||||
 | 
					                Items: seasonalItems
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (config.worldState?.wolfHunt) {
 | 
				
			||||||
 | 
					        worldState.Goals.push({
 | 
				
			||||||
 | 
					            _id: {
 | 
				
			||||||
 | 
					                $oid: "67ed7672798d6466172e3b9d"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            Activation: {
 | 
				
			||||||
 | 
					                $date: {
 | 
				
			||||||
 | 
					                    $numberLong: "1743616800000"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            Expiry: {
 | 
				
			||||||
 | 
					                $date: {
 | 
				
			||||||
 | 
					                    $numberLong: "2000000000000"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            Count: 0,
 | 
				
			||||||
 | 
					            Goal: 3,
 | 
				
			||||||
 | 
					            InterimGoals: [1, 2],
 | 
				
			||||||
 | 
					            BonusGoal: 4,
 | 
				
			||||||
 | 
					            Success: 0,
 | 
				
			||||||
 | 
					            Personal: true,
 | 
				
			||||||
 | 
					            Bounty: true,
 | 
				
			||||||
 | 
					            ClampNodeScores: true,
 | 
				
			||||||
 | 
					            Node: "EventNode29",
 | 
				
			||||||
 | 
					            ConcurrentMissionKeyNames: [
 | 
				
			||||||
 | 
					                "/Lotus/Types/Keys/WolfTacAlertReduxB",
 | 
				
			||||||
 | 
					                "/Lotus/Types/Keys/WolfTacAlertReduxC",
 | 
				
			||||||
 | 
					                "/Lotus/Types/Keys/WolfTacAlertReduxD"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            ConcurrentNodeReqs: [1, 2, 3],
 | 
				
			||||||
 | 
					            ConcurrentNodes: ["EventNode28", "EventNode39", "EventNode40"], // Incompatible with Galleon Of Ghouls
 | 
				
			||||||
 | 
					            MissionKeyName: "/Lotus/Types/Keys/WolfTacAlertReduxA",
 | 
				
			||||||
 | 
					            Faction: "FC_GRINEER",
 | 
				
			||||||
 | 
					            Desc: "/Lotus/Language/Alerts/WolfAlert",
 | 
				
			||||||
 | 
					            Icon: "/Lotus/Interface/Icons/Npcs/Seasonal/WolfStalker.png",
 | 
				
			||||||
 | 
					            Tag: "WolfHuntRedux",
 | 
				
			||||||
 | 
					            InterimRewards: [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    credits: 50000,
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Types/Recipes/Weapons/WeaponParts/ThrowingHammerHandle"]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    credits: 50000,
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Types/Recipes/Weapons/WeaponParts/ThrowingHammerHead"]
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            Reward: {
 | 
				
			||||||
 | 
					                credits: 50000,
 | 
				
			||||||
 | 
					                items: ["/Lotus/StoreItems/Types/Recipes/Weapons/WeaponParts/ThrowingHammerMotor"]
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            BonusReward: {
 | 
				
			||||||
 | 
					                credits: 50000,
 | 
				
			||||||
 | 
					                items: [
 | 
				
			||||||
 | 
					                    "/Lotus/StoreItems/Types/Recipes/Weapons/ThrowingHammerBlueprint",
 | 
				
			||||||
 | 
					                    "/Lotus/StoreItems/Types/Items/MiscItems/OrokinCatalyst",
 | 
				
			||||||
 | 
					                    "/Lotus/StoreItems/Upgrades/Skins/Clan/BountyHunterBadgeItem"
 | 
				
			||||||
 | 
					                ]
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (config.worldState?.hallowedFlame) {
 | 
				
			||||||
 | 
					        worldState.Goals.push(
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                _id: { $oid: "5db305403d34b5158873519a" },
 | 
				
			||||||
 | 
					                Activation: { $date: { $numberLong: "1699372800000" } },
 | 
				
			||||||
 | 
					                Expiry: { $date: { $numberLong: "2000000000000" } },
 | 
				
			||||||
 | 
					                Count: 0,
 | 
				
			||||||
 | 
					                Goal: 3,
 | 
				
			||||||
 | 
					                InterimGoals: [1, 2],
 | 
				
			||||||
 | 
					                Success: 0,
 | 
				
			||||||
 | 
					                Personal: true,
 | 
				
			||||||
 | 
					                Bounty: true,
 | 
				
			||||||
 | 
					                ClampNodeScores: true,
 | 
				
			||||||
 | 
					                Node: "EventNode24", // Incompatible with Hallowed Nightmares, Dog Days
 | 
				
			||||||
 | 
					                ConcurrentMissionKeyNames: [
 | 
				
			||||||
 | 
					                    "/Lotus/Types/Keys/LanternEndlessEventKeyB",
 | 
				
			||||||
 | 
					                    "/Lotus/Types/Keys/LanternEndlessEventKeyC"
 | 
				
			||||||
 | 
					                ],
 | 
				
			||||||
 | 
					                ConcurrentNodeReqs: [1, 2],
 | 
				
			||||||
 | 
					                ConcurrentNodes: ["EventNode25", "EventNode34"], // Incompatible with Hallowed Nightmares, Dog Days
 | 
				
			||||||
 | 
					                MissionKeyName: "/Lotus/Types/Keys/LanternEndlessEventKeyA",
 | 
				
			||||||
 | 
					                Faction: "FC_INFESTATION",
 | 
				
			||||||
 | 
					                Desc: "/Lotus/Language/Events/TacAlertHalloweenLantern",
 | 
				
			||||||
 | 
					                Icon: "/Lotus/Interface/Icons/JackOLanternColour.png",
 | 
				
			||||||
 | 
					                Tag: "Halloween19",
 | 
				
			||||||
 | 
					                InterimRewards: [
 | 
				
			||||||
 | 
					                    { items: ["/Lotus/StoreItems/Types/Items/MiscItems/OrokinCatalyst"] },
 | 
				
			||||||
 | 
					                    { items: ["/Lotus/StoreItems/Types/Items/MiscItems/Forma"] }
 | 
				
			||||||
 | 
					                ],
 | 
				
			||||||
 | 
					                Reward: {
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Types/Items/MiscItems/FormaAura"]
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                _id: { $oid: "5db3054a3d34b5158873519c" },
 | 
				
			||||||
 | 
					                Activation: { $date: { $numberLong: "1699372800000" } },
 | 
				
			||||||
 | 
					                Expiry: { $date: { $numberLong: "2000000000000" } },
 | 
				
			||||||
 | 
					                Count: 0,
 | 
				
			||||||
 | 
					                Goal: 900,
 | 
				
			||||||
 | 
					                Success: 0,
 | 
				
			||||||
 | 
					                Personal: true,
 | 
				
			||||||
 | 
					                Bounty: true,
 | 
				
			||||||
 | 
					                Best: true,
 | 
				
			||||||
 | 
					                ClampNodeScores: true,
 | 
				
			||||||
 | 
					                Node: "EventNode35",
 | 
				
			||||||
 | 
					                MissionKeyName: "/Lotus/Types/Keys/LanternEndlessEventKeyD",
 | 
				
			||||||
 | 
					                Faction: "FC_INFESTATION",
 | 
				
			||||||
 | 
					                Desc: "/Lotus/Language/Events/TacAlertHalloweenLanternEndless",
 | 
				
			||||||
 | 
					                Icon: "/Lotus/Interface/Icons/JackOLanternColour.png",
 | 
				
			||||||
 | 
					                Tag: "Halloween19Endless",
 | 
				
			||||||
 | 
					                PrereqGoalTags: ["Halloween19"],
 | 
				
			||||||
 | 
					                Reward: {
 | 
				
			||||||
 | 
					                    items: [
 | 
				
			||||||
 | 
					                        "/Lotus/StoreItems/Upgrades/Skins/Effects/BatsEphemera",
 | 
				
			||||||
 | 
					                        "/Lotus/StoreItems/Upgrades/Skins/Clan/BountyHunterBadgeItem"
 | 
				
			||||||
 | 
					                    ]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                ScoreVar: "EndlessMissionTimeElapsed",
 | 
				
			||||||
 | 
					                ScoreMaxTag: "Halloween19ScoreMax"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (config.worldState?.hallowedNightmares) {
 | 
				
			||||||
 | 
					        const rewards = [
 | 
				
			||||||
 | 
					            // 2018
 | 
				
			||||||
 | 
					            [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Upgrades/Skins/Sigils/DotD2016Sigil"]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Upgrades/Skins/Halloween/HalloweenDread"]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Types/Items/MiscItems/OrokinReactor"]
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            // 2016
 | 
				
			||||||
 | 
					            [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Upgrades/Skins/Sigils/OrokinCatalyst"]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Upgrades/Skins/Sigils/DotD2016Sigil"]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    items: [
 | 
				
			||||||
 | 
					                        "/Lotus/StoreItems/Types/Items/MiscItems/OrokinReactor",
 | 
				
			||||||
 | 
					                        "/Lotus/StoreItems/Upgrades/Skins/Clan/BountyHunterBadgeItem"
 | 
				
			||||||
 | 
					                    ]
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            // 2015
 | 
				
			||||||
 | 
					            [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Upgrades/Skins/Sigils/OrokinCatalyst"]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Upgrades/Skins/Clan/BountyHunterBadgeItem"]
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					        const year = config.worldState.hallowedNightmaresRewardsOverride ?? 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        worldState.Goals.push({
 | 
				
			||||||
 | 
					            _id: { $oid: "5bc9e8f7972d7d184c8398c9" },
 | 
				
			||||||
 | 
					            Activation: { $date: { $numberLong: "1539972000000" } },
 | 
				
			||||||
 | 
					            Expiry: { $date: { $numberLong: "2000000000000" } },
 | 
				
			||||||
 | 
					            Count: 0,
 | 
				
			||||||
 | 
					            InterimGoals: [1],
 | 
				
			||||||
 | 
					            Goal: 2,
 | 
				
			||||||
 | 
					            Success: 0,
 | 
				
			||||||
 | 
					            Personal: true,
 | 
				
			||||||
 | 
					            Bounty: true,
 | 
				
			||||||
 | 
					            Tag: "Halloween",
 | 
				
			||||||
 | 
					            Faction: "FC_INFESTATION",
 | 
				
			||||||
 | 
					            Desc: "/Lotus/Language/G1Quests/TacAlertHalloweenTitle",
 | 
				
			||||||
 | 
					            ToolTip: "/Lotus/Language/G1Quests/TacAlertHalloweenToolTip",
 | 
				
			||||||
 | 
					            Icon: "/Lotus/Interface/Icons/JackOLanternColour.png",
 | 
				
			||||||
 | 
					            ClampNodeScores: true,
 | 
				
			||||||
 | 
					            Node: "EventNode2",
 | 
				
			||||||
 | 
					            MissionKeyName: "/Lotus/Types/Keys/TacAlertKeyHalloween",
 | 
				
			||||||
 | 
					            ConcurrentMissionKeyNames: ["/Lotus/Types/Keys/TacAlertKeyHalloweenBonus"],
 | 
				
			||||||
 | 
					            ConcurrentNodeReqs: [1],
 | 
				
			||||||
 | 
					            ConcurrentNodes: ["EventNode24"], // Incompatible with Hallowed Flame, Dog Days
 | 
				
			||||||
 | 
					            InterimRewards: [rewards[year][0]],
 | 
				
			||||||
 | 
					            Reward: rewards[year][1]
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        if (year != 2) {
 | 
				
			||||||
 | 
					            worldState.Goals.push({
 | 
				
			||||||
 | 
					                _id: { $oid: "5bca18b1e12d9e14a0b6ad27" },
 | 
				
			||||||
 | 
					                Activation: { $date: { $numberLong: "1539972000000" } },
 | 
				
			||||||
 | 
					                Expiry: { $date: { $numberLong: "2000000000000" } },
 | 
				
			||||||
 | 
					                Count: 0,
 | 
				
			||||||
 | 
					                Goal: 666,
 | 
				
			||||||
 | 
					                Success: 0,
 | 
				
			||||||
 | 
					                Personal: true,
 | 
				
			||||||
 | 
					                Bounty: true,
 | 
				
			||||||
 | 
					                Best: true,
 | 
				
			||||||
 | 
					                Tag: "Halloween",
 | 
				
			||||||
 | 
					                PrereqGoalTags: ["Halloween"],
 | 
				
			||||||
 | 
					                Faction: "FC_INFESTATION",
 | 
				
			||||||
 | 
					                Desc: "Hallowed Nightmares - Time Attack",
 | 
				
			||||||
 | 
					                ToolTip: "/Lotus/Language/G1Quests/TacAlertHalloweenToolTip",
 | 
				
			||||||
 | 
					                Icon: "/Lotus/Interface/Icons/JackOLanternColour.png",
 | 
				
			||||||
 | 
					                ClampNodeScores: true,
 | 
				
			||||||
 | 
					                Node: "EventNode25", // Incompatible with Hallowed Flame, Dog Days
 | 
				
			||||||
 | 
					                MissionKeyName: "/Lotus/Types/Keys/TacAlertKeyHalloweenTimeAttack",
 | 
				
			||||||
 | 
					                ScoreVar: "TimeAttackScore",
 | 
				
			||||||
 | 
					                ScoreMaxTag: "Halloween16",
 | 
				
			||||||
 | 
					                Reward: rewards[year][2]
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (config.worldState?.proxyRebellion) {
 | 
				
			||||||
 | 
					        const rewards = [
 | 
				
			||||||
 | 
					            // 2019
 | 
				
			||||||
 | 
					            [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    credits: 50000,
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Types/Items/MiscItems/UtilityUnlocker"]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    credits: 50000,
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Upgrades/Mods/Randomized/RawPistolRandomMod"]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    credits: 50000,
 | 
				
			||||||
 | 
					                    items: ["/Lotus/Types/StoreItems/Packages/EventCatalystReactorBundle"]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    items: [
 | 
				
			||||||
 | 
					                        "/Lotus/StoreItems/Upgrades/Skins/Scarves/HornSkullScarf",
 | 
				
			||||||
 | 
					                        "/Lotus/StoreItems/Upgrades/Skins/Clan/BountyHunterBadgeItem"
 | 
				
			||||||
 | 
					                    ]
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            // 2018
 | 
				
			||||||
 | 
					            [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    credits: 50000,
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Upgrades/Mods/FusionBundles/NightwatchFusionBundle"]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    credits: 50000,
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Types/Items/MiscItems/UtilityUnlocker"]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    credits: 50000,
 | 
				
			||||||
 | 
					                    items: ["/Lotus/Types/StoreItems/Packages/EventCatalystReactorBundle"]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    items: [
 | 
				
			||||||
 | 
					                        "/Lotus/StoreItems/Upgrades/Skins/Sigils/EnergySigilA",
 | 
				
			||||||
 | 
					                        "/Lotus/StoreItems/Upgrades/Skins/Clan/BountyHunterBadgeItem"
 | 
				
			||||||
 | 
					                    ]
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					        const year = config.worldState.proxyRebellionRewardsOverride ?? 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        worldState.Goals.push({
 | 
				
			||||||
 | 
					            _id: { $oid: "5b5743ac972d7d3ed0517b0d" },
 | 
				
			||||||
 | 
					            Activation: { $date: { $numberLong: "1532714400000" } },
 | 
				
			||||||
 | 
					            Expiry: { $date: { $numberLong: "2000000000000" } },
 | 
				
			||||||
 | 
					            Count: 0,
 | 
				
			||||||
 | 
					            Goal: 3,
 | 
				
			||||||
 | 
					            InterimGoals: [1, 2],
 | 
				
			||||||
 | 
					            BonusGoal: 4,
 | 
				
			||||||
 | 
					            Success: 0,
 | 
				
			||||||
 | 
					            Personal: true,
 | 
				
			||||||
 | 
					            Bounty: true,
 | 
				
			||||||
 | 
					            ClampNodeScores: true,
 | 
				
			||||||
 | 
					            Node: "EventNode18",
 | 
				
			||||||
 | 
					            ConcurrentMissionKeyNames: [
 | 
				
			||||||
 | 
					                "/Lotus/Types/Keys/TacAlertKeyProxyRebellionTwo",
 | 
				
			||||||
 | 
					                "/Lotus/Types/Keys/TacAlertKeyProxyRebellionThree",
 | 
				
			||||||
 | 
					                "/Lotus/Types/Keys/TacAlertKeyProxyRebellionFour"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            ConcurrentNodeReqs: [1, 2, 3],
 | 
				
			||||||
 | 
					            ConcurrentNodes: ["EventNode7", "EventNode4", "EventNode17"],
 | 
				
			||||||
 | 
					            MissionKeyName: "/Lotus/Types/Keys/TacAlertKeyProxyRebellionOne",
 | 
				
			||||||
 | 
					            Faction: "FC_CORPUS",
 | 
				
			||||||
 | 
					            Desc: "/Lotus/Language/Alerts/TacAlertProxyRebellion",
 | 
				
			||||||
 | 
					            Icon: "/Lotus/Materials/Emblems/BountyBadge_e.png",
 | 
				
			||||||
 | 
					            Tag: "ProxyRebellion",
 | 
				
			||||||
 | 
					            InterimRewards: rewards[year].slice(0, 2),
 | 
				
			||||||
 | 
					            Reward: rewards[year][2],
 | 
				
			||||||
 | 
					            BonusReward: rewards[year][3]
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (config.worldState?.longShadow) {
 | 
				
			||||||
 | 
					        worldState.Goals.push({
 | 
				
			||||||
 | 
					            _id: { $oid: "5bc9e8f7272d5d184c8398c9" },
 | 
				
			||||||
 | 
					            Activation: { $date: { $numberLong: "1539972000000" } },
 | 
				
			||||||
 | 
					            Expiry: { $date: { $numberLong: "2000000000000" } },
 | 
				
			||||||
 | 
					            Count: 0,
 | 
				
			||||||
 | 
					            InterimGoals: [1, 2],
 | 
				
			||||||
 | 
					            Goal: 3,
 | 
				
			||||||
 | 
					            BonusGoal: 4,
 | 
				
			||||||
 | 
					            Success: 0,
 | 
				
			||||||
 | 
					            Personal: true,
 | 
				
			||||||
 | 
					            Bounty: true,
 | 
				
			||||||
 | 
					            Tag: "NightwatchTacAlert",
 | 
				
			||||||
 | 
					            Faction: "FC_GRINEER",
 | 
				
			||||||
 | 
					            Desc: "/Lotus/Language/G1Quests/ProjectNightwatchTacAlertTitle",
 | 
				
			||||||
 | 
					            Icon: "/Lotus/Materials/Emblems/BountyBadge_e.png",
 | 
				
			||||||
 | 
					            ClampNodeScores: true,
 | 
				
			||||||
 | 
					            Node: "EventNode9",
 | 
				
			||||||
 | 
					            MissionKeyName: "/Lotus/Types/Keys/TacAlertKeyProjectNightwatchEasy",
 | 
				
			||||||
 | 
					            ConcurrentMissionKeyNames: [
 | 
				
			||||||
 | 
					                "/Lotus/Types/Keys/TacAlertKeyProjectNightwatch",
 | 
				
			||||||
 | 
					                "/Lotus/Types/Keys/TacAlertKeyProjectNightwatchHard",
 | 
				
			||||||
 | 
					                "/Lotus/Types/Keys/TacAlertKeyProjectNightwatchBonus"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            ConcurrentNodeReqs: [1, 2, 3],
 | 
				
			||||||
 | 
					            ConcurrentNodes: ["SolNode136", "EventNode3", "EventNode0"],
 | 
				
			||||||
 | 
					            InterimRewards: [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    credits: 50000,
 | 
				
			||||||
 | 
					                    countedItems: [
 | 
				
			||||||
 | 
					                        { ItemType: "/Lotus/Upgrades/Mods/FusionBundles/RareFusionBundle", ItemCount: 10 } // Not sure about that
 | 
				
			||||||
 | 
					                    ]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    items: ["/Lotus/StoreItems/Types/Items/MiscItems/UtilityUnlocker"]
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            Reward: {
 | 
				
			||||||
 | 
					                items: ["/Lotus/Types/StoreItems/Packages/EventCatalystReactorBundle"]
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            BonusReward: { items: ["/Lotus/StoreItems/Upgrades/Skins/Clan/BountyHunterBadgeItem"] }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Nightwave Challenges
 | 
					    // Nightwave Challenges
 | 
				
			||||||
    const nightwaveSyndicateTag = getNightwaveSyndicateTag(buildLabel);
 | 
					    const nightwaveSyndicateTag = getNightwaveSyndicateTag(buildLabel);
 | 
				
			||||||
    if (nightwaveSyndicateTag) {
 | 
					    if (nightwaveSyndicateTag) {
 | 
				
			||||||
 | 
				
			|||||||
@ -5,12 +5,14 @@ export interface IWorldState {
 | 
				
			|||||||
    Version: number; // for goals
 | 
					    Version: number; // for goals
 | 
				
			||||||
    BuildLabel: string;
 | 
					    BuildLabel: string;
 | 
				
			||||||
    Time: number;
 | 
					    Time: number;
 | 
				
			||||||
 | 
					    InGameMarket: IInGameMarket;
 | 
				
			||||||
    Goals: IGoal[];
 | 
					    Goals: IGoal[];
 | 
				
			||||||
    Alerts: [];
 | 
					    Alerts: [];
 | 
				
			||||||
    Sorties: ISortie[];
 | 
					    Sorties: ISortie[];
 | 
				
			||||||
    LiteSorties: ILiteSortie[];
 | 
					    LiteSorties: ILiteSortie[];
 | 
				
			||||||
    SyndicateMissions: ISyndicateMissionInfo[];
 | 
					    SyndicateMissions: ISyndicateMissionInfo[];
 | 
				
			||||||
    ActiveMissions: IFissure[];
 | 
					    ActiveMissions: IFissure[];
 | 
				
			||||||
 | 
					    FlashSales: IFlashSale[];
 | 
				
			||||||
    GlobalUpgrades: IGlobalUpgrade[];
 | 
					    GlobalUpgrades: IGlobalUpgrade[];
 | 
				
			||||||
    Invasions: IInvasion[];
 | 
					    Invasions: IInvasion[];
 | 
				
			||||||
    NodeOverrides: INodeOverride[];
 | 
					    NodeOverrides: INodeOverride[];
 | 
				
			||||||
@ -39,10 +41,13 @@ export interface IGoal {
 | 
				
			|||||||
    Expiry: IMongoDate;
 | 
					    Expiry: IMongoDate;
 | 
				
			||||||
    Count?: number;
 | 
					    Count?: number;
 | 
				
			||||||
    Goal?: number;
 | 
					    Goal?: number;
 | 
				
			||||||
 | 
					    InterimGoals?: number[];
 | 
				
			||||||
 | 
					    BonusGoal?: number;
 | 
				
			||||||
    HealthPct?: number;
 | 
					    HealthPct?: number;
 | 
				
			||||||
    Success?: number;
 | 
					    Success?: number;
 | 
				
			||||||
    Personal?: boolean;
 | 
					    Personal?: boolean;
 | 
				
			||||||
    Bounty?: boolean;
 | 
					    Best?: boolean;
 | 
				
			||||||
 | 
					    Bounty?: boolean; // Tactical Alert
 | 
				
			||||||
    Faction?: string;
 | 
					    Faction?: string;
 | 
				
			||||||
    ClampNodeScores?: boolean;
 | 
					    ClampNodeScores?: boolean;
 | 
				
			||||||
    Desc: string;
 | 
					    Desc: string;
 | 
				
			||||||
@ -51,18 +56,28 @@ export interface IGoal {
 | 
				
			|||||||
    InstructionalItem?: string;
 | 
					    InstructionalItem?: string;
 | 
				
			||||||
    Icon: string;
 | 
					    Icon: string;
 | 
				
			||||||
    Tag: string;
 | 
					    Tag: string;
 | 
				
			||||||
 | 
					    PrereqGoalTags?: string[];
 | 
				
			||||||
    Node?: string;
 | 
					    Node?: string;
 | 
				
			||||||
    VictimNode?: string;
 | 
					    VictimNode?: string;
 | 
				
			||||||
 | 
					    ConcurrentMissionKeyNames?: string[];
 | 
				
			||||||
 | 
					    ConcurrentNodeReqs?: number[];
 | 
				
			||||||
 | 
					    ConcurrentNodes?: string[];
 | 
				
			||||||
    RegionIdx?: number;
 | 
					    RegionIdx?: number;
 | 
				
			||||||
    Regions?: number[];
 | 
					    Regions?: number[];
 | 
				
			||||||
    MissionKeyName?: string;
 | 
					    MissionKeyName?: string;
 | 
				
			||||||
    Reward?: IMissionReward;
 | 
					    Reward?: IMissionReward;
 | 
				
			||||||
 | 
					    InterimRewards?: IMissionReward[];
 | 
				
			||||||
 | 
					    BonusReward?: IMissionReward;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    JobAffiliationTag?: string;
 | 
					    JobAffiliationTag?: string;
 | 
				
			||||||
    Jobs?: ISyndicateJob[];
 | 
					    Jobs?: ISyndicateJob[];
 | 
				
			||||||
    PreviousJobs?: ISyndicateJob[];
 | 
					    PreviousJobs?: ISyndicateJob[];
 | 
				
			||||||
    JobCurrentVersion?: IOid;
 | 
					    JobCurrentVersion?: IOid;
 | 
				
			||||||
    JobPreviousVersion?: IOid;
 | 
					    JobPreviousVersion?: IOid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ScoreVar?: string;
 | 
				
			||||||
 | 
					    ScoreMaxTag?: string;
 | 
				
			||||||
 | 
					    NightLevel?: string;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface ISyndicateJob {
 | 
					export interface ISyndicateJob {
 | 
				
			||||||
@ -321,6 +336,37 @@ export type TCircuitGameMode =
 | 
				
			|||||||
    | "Assassination"
 | 
					    | "Assassination"
 | 
				
			||||||
    | "Alchemy";
 | 
					    | "Alchemy";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface IFlashSale {
 | 
				
			||||||
 | 
					    TypeName: string;
 | 
				
			||||||
 | 
					    ShowInMarket: boolean;
 | 
				
			||||||
 | 
					    HideFromMarket: boolean;
 | 
				
			||||||
 | 
					    SupporterPack: boolean;
 | 
				
			||||||
 | 
					    Discount: number;
 | 
				
			||||||
 | 
					    BogoBuy: number;
 | 
				
			||||||
 | 
					    BogoGet: number;
 | 
				
			||||||
 | 
					    PremiumOverride: number;
 | 
				
			||||||
 | 
					    RegularOverride: number;
 | 
				
			||||||
 | 
					    ProductExpiryOverride?: IMongoDate;
 | 
				
			||||||
 | 
					    StartDate: IMongoDate;
 | 
				
			||||||
 | 
					    EndDate: IMongoDate;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface IInGameMarket {
 | 
				
			||||||
 | 
					    LandingPage: ILandingPage;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface ILandingPage {
 | 
				
			||||||
 | 
					    Categories: IGameMarketCategory[];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface IGameMarketCategory {
 | 
				
			||||||
 | 
					    CategoryName: string;
 | 
				
			||||||
 | 
					    Name: string;
 | 
				
			||||||
 | 
					    Icon: string;
 | 
				
			||||||
 | 
					    AddToMenu?: boolean;
 | 
				
			||||||
 | 
					    Items?: string[];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface ITmp {
 | 
					export interface ITmp {
 | 
				
			||||||
    cavabegin: string;
 | 
					    cavabegin: string;
 | 
				
			||||||
    PurchasePlatformLockEnabled: boolean; // Seems unused
 | 
					    PurchasePlatformLockEnabled: boolean; // Seems unused
 | 
				
			||||||
 | 
				
			|||||||
@ -937,8 +937,57 @@
 | 
				
			|||||||
                                    <input class="form-check-input" type="checkbox" id="worldState.varziaFullyStocked" />
 | 
					                                    <input class="form-check-input" type="checkbox" id="worldState.varziaFullyStocked" />
 | 
				
			||||||
                                    <label class="form-check-label" for="worldState.varziaFullyStocked" data-loc="worldState_varziaFullyStocked"></label>
 | 
					                                    <label class="form-check-label" for="worldState.varziaFullyStocked" data-loc="worldState_varziaFullyStocked"></label>
 | 
				
			||||||
                                </div>
 | 
					                                </div>
 | 
				
			||||||
 | 
					                                <div class="form-check">
 | 
				
			||||||
 | 
					                                    <input class="form-check-input" type="checkbox" id="worldState.wolfHunt" />
 | 
				
			||||||
 | 
					                                    <label class="form-check-label" for="worldState.wolfHunt" data-loc="worldState_wolfHunt"></label>
 | 
				
			||||||
 | 
					                                    <abbr data-loc-inc="worldState_galleonOfGhouls"><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.longShadow" />
 | 
				
			||||||
 | 
					                                    <label class="form-check-label" for="worldState.longShadow" data-loc="worldState_longShadow"></label>
 | 
				
			||||||
 | 
					                                </div>
 | 
				
			||||||
 | 
					                                <div class="form-check">
 | 
				
			||||||
 | 
					                                    <input class="form-check-input" type="checkbox" id="worldState.hallowedFlame" />
 | 
				
			||||||
 | 
					                                    <label class="form-check-label" for="worldState.hallowedFlame" data-loc="worldState_hallowedFlame"></label>
 | 
				
			||||||
 | 
					                                    <abbr data-loc-inc="worldState_hallowedNightmares|worldState_dogDays"><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-group mt-2 d-flex gap-2">
 | 
				
			||||||
 | 
					                                    <div class="flex-fill">
 | 
				
			||||||
 | 
					                                        <label class="form-label" for="worldState.hallowedNightmares" data-loc="worldState_hallowedNightmares"></label>
 | 
				
			||||||
 | 
					                                        <abbr data-loc-inc="worldState_hallowedFlame|worldState_dogDays"><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>
 | 
				
			||||||
 | 
					                                        <select class="form-control" id="worldState.hallowedNightmares" data-default="false">
 | 
				
			||||||
 | 
					                                            <option value="true" data-loc="enabled"></option>
 | 
				
			||||||
 | 
					                                            <option value="false" data-loc="disabled"></option>
 | 
				
			||||||
 | 
					                                        </select>
 | 
				
			||||||
 | 
					                                    </div>
 | 
				
			||||||
 | 
					                                    <div class="flex-fill">
 | 
				
			||||||
 | 
					                                        <label class="form-label" for="worldState.hallowedNightmaresRewardsOverride" data-loc="worldState_hallowedNightmaresRewards"></label>
 | 
				
			||||||
 | 
					                                        <select class="form-control" id="worldState.hallowedNightmaresRewardsOverride" data-default="0">
 | 
				
			||||||
 | 
					                                                <option value="0" data-loc="worldState_from_year" data-loc-year="2018"></option>
 | 
				
			||||||
 | 
					                                                <option value="1" data-loc="worldState_from_year" data-loc-year="2016"></option>
 | 
				
			||||||
 | 
					                                                <option value="2" data-loc="worldState_from_year" data-loc-year="2015"></option>
 | 
				
			||||||
 | 
					                                        </select>
 | 
				
			||||||
 | 
					                                    </div>
 | 
				
			||||||
 | 
					                                </div>
 | 
				
			||||||
 | 
					                                <div class="form-group mt-2 d-flex gap-2">
 | 
				
			||||||
 | 
					                                    <div class="flex-fill">
 | 
				
			||||||
 | 
					                                        <label class="form-label" for="worldState.proxyRebellion" data-loc="worldState_proxyRebellion"></label>
 | 
				
			||||||
 | 
					                                        <select class="form-control" id="worldState.proxyRebellion" data-default="false">
 | 
				
			||||||
 | 
					                                            <option value="true" data-loc="enabled"></option>
 | 
				
			||||||
 | 
					                                            <option value="false" data-loc="disabled"></option>
 | 
				
			||||||
 | 
					                                        </select>
 | 
				
			||||||
 | 
					                                    </div>
 | 
				
			||||||
 | 
					                                    <div class="flex-fill">
 | 
				
			||||||
 | 
					                                        <label class="form-label" for="worldState.proxyRebellionRewardsOverride" data-loc="worldState_proxyRebellionRewards"></label>
 | 
				
			||||||
 | 
					                                        <select class="form-control" id="worldState.proxyRebellionRewardsOverride" data-default="0">
 | 
				
			||||||
 | 
					                                            <option value="0" data-loc="worldState_from_year" data-loc-year="2019"></option>
 | 
				
			||||||
 | 
					                                            <option value="1" data-loc="worldState_from_year" data-loc-year="2018"></option>
 | 
				
			||||||
 | 
					                                        </select>
 | 
				
			||||||
 | 
					                                    </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"><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>
 | 
				
			||||||
                                    <select class="form-control" id="worldState.galleonOfGhouls" data-default="0">
 | 
					                                    <select class="form-control" id="worldState.galleonOfGhouls" data-default="0">
 | 
				
			||||||
                                        <option value="0" data-loc="disabled"></option>
 | 
					                                        <option value="0" data-loc="disabled"></option>
 | 
				
			||||||
                                        <option value="1" data-loc="worldState_we1"></option>
 | 
					                                        <option value="1" data-loc="worldState_we1"></option>
 | 
				
			||||||
@ -970,6 +1019,27 @@
 | 
				
			|||||||
                                        <option value="false" data-loc="disabled"></option>
 | 
					                                        <option value="false" data-loc="disabled"></option>
 | 
				
			||||||
                                    </select>
 | 
					                                    </select>
 | 
				
			||||||
                                </div>
 | 
					                                </div>
 | 
				
			||||||
 | 
					                                <div class="form-group mt-2 d-flex gap-2">
 | 
				
			||||||
 | 
					                                    <div class="flex-fill">
 | 
				
			||||||
 | 
					                                        <label class="form-label" for="worldState.dogDaysOverride" data-loc="worldState_dogDays"></label>
 | 
				
			||||||
 | 
					                                        <abbr data-loc-inc="worldState_hallowedFlame|worldState_hallowedNightmares"><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>
 | 
				
			||||||
 | 
					                                        <select class="form-control" id="worldState.dogDaysOverride" data-default="null">
 | 
				
			||||||
 | 
					                                            <option value="null" data-loc="normal"></option>
 | 
				
			||||||
 | 
					                                            <option value="true" data-loc="enabled"></option>
 | 
				
			||||||
 | 
					                                            <option value="false" data-loc="disabled"></option>
 | 
				
			||||||
 | 
					                                        </select>
 | 
				
			||||||
 | 
					                                    </div>
 | 
				
			||||||
 | 
					                                    <div class="flex-fill">
 | 
				
			||||||
 | 
					                                        <label class="form-label" for="worldState.dogDaysRewardsOverride" data-loc="worldState_dogDaysRewards"></label>
 | 
				
			||||||
 | 
					                                        <select class="form-control" id="worldState.dogDaysRewardsOverride" data-default="null">
 | 
				
			||||||
 | 
					                                            <option value="null" data-loc="normal"></option>
 | 
				
			||||||
 | 
					                                            <option value="3" data-loc="worldState_from_year" data-loc-year="2025"></option>
 | 
				
			||||||
 | 
					                                            <option value="2" data-loc="worldState_from_year" data-loc-year="2024"></option>
 | 
				
			||||||
 | 
					                                            <option value="1" data-loc="worldState_from_year" data-loc-year="2023"></option>
 | 
				
			||||||
 | 
					                                            <option value="0" data-loc="worldState_pre_year" data-loc-year="2023"></option>
 | 
				
			||||||
 | 
					                                        </select>
 | 
				
			||||||
 | 
					                                    </div>
 | 
				
			||||||
 | 
					                                </div>
 | 
				
			||||||
                                <div class="form-group mt-2">
 | 
					                                <div class="form-group mt-2">
 | 
				
			||||||
                                    <label class="form-label" for="worldState.eidolonOverride" data-loc="worldState_eidolonOverride"></label>
 | 
					                                    <label class="form-label" for="worldState.eidolonOverride" data-loc="worldState_eidolonOverride"></label>
 | 
				
			||||||
                                    <select class="form-control" id="worldState.eidolonOverride" data-default="">
 | 
					                                    <select class="form-control" id="worldState.eidolonOverride" data-default="">
 | 
				
			||||||
 | 
				
			|||||||
@ -202,6 +202,17 @@ function updateLocElements() {
 | 
				
			|||||||
    document.querySelectorAll("[data-loc-placeholder]").forEach(elm => {
 | 
					    document.querySelectorAll("[data-loc-placeholder]").forEach(elm => {
 | 
				
			||||||
        elm.placeholder = loc(elm.getAttribute("data-loc-placeholder"));
 | 
					        elm.placeholder = loc(elm.getAttribute("data-loc-placeholder"));
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					    document.querySelectorAll("[data-loc-inc]").forEach(elm => {
 | 
				
			||||||
 | 
					        const incWith = elm
 | 
				
			||||||
 | 
					            .getAttribute("data-loc-inc")
 | 
				
			||||||
 | 
					            .split("|")
 | 
				
			||||||
 | 
					            .map(key => loc(key))
 | 
				
			||||||
 | 
					            .join(", ");
 | 
				
			||||||
 | 
					        elm.title = `${loc("worldState_incompatibleWith")} ${incWith}`;
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    document.querySelectorAll("[data-loc-year]").forEach(elm => {
 | 
				
			||||||
 | 
					        elm.innerHTML = elm.innerHTML.replace("|YEAR|", elm.getAttribute("data-loc-year"));
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function setActiveLanguage(lang) {
 | 
					function setActiveLanguage(lang) {
 | 
				
			||||||
 | 
				
			|||||||
@ -29,9 +29,12 @@ body:not(.logged-in) .user-dropdown {
 | 
				
			|||||||
    display: none;
 | 
					    display: none;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
td.text-end > a > svg {
 | 
					/* font awesome icons */
 | 
				
			||||||
 | 
					svg {
 | 
				
			||||||
    fill: currentColor;
 | 
					    fill: currentColor;
 | 
				
			||||||
    height: 1em;
 | 
					    height: 1em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					td.text-end > a > svg {
 | 
				
			||||||
    margin-left: 0.5em;
 | 
					    margin-left: 0.5em;
 | 
				
			||||||
    margin-bottom: 4px; /* to centre the icon */
 | 
					    margin-bottom: 4px; /* to centre the icon */
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -248,6 +248,18 @@ dict = {
 | 
				
			|||||||
    worldState_galleonOfGhouls: `Galeone der Ghule`,
 | 
					    worldState_galleonOfGhouls: `Galeone der Ghule`,
 | 
				
			||||||
    worldState_ghoulEmergence: `Ghul Ausrottung`,
 | 
					    worldState_ghoulEmergence: `Ghul Ausrottung`,
 | 
				
			||||||
    worldState_plagueStar: `Plagenstern`,
 | 
					    worldState_plagueStar: `Plagenstern`,
 | 
				
			||||||
 | 
					    worldState_dogDays: `Hitzefrei`,
 | 
				
			||||||
 | 
					    worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`,
 | 
				
			||||||
 | 
					    worldState_wolfHunt: `Wolfsjagd (2025)`,
 | 
				
			||||||
 | 
					    worldState_longShadow: `Lange Schatten`,
 | 
				
			||||||
 | 
					    worldState_hallowedFlame: `Geweihte Flamme`,
 | 
				
			||||||
 | 
					    worldState_hallowedNightmares: `Geweihte Albträume`,
 | 
				
			||||||
 | 
					    worldState_hallowedNightmaresRewards: `[UNTRANSLATED] Hallowed Nightmares Rewards`,
 | 
				
			||||||
 | 
					    worldState_proxyRebellion: `Proxy-Rebellion`,
 | 
				
			||||||
 | 
					    worldState_proxyRebellionRewards: `[UNTRANSLATED] Proxy Rebellion Rewards`,
 | 
				
			||||||
 | 
					    worldState_from_year: `[UNTRANSLATED] from |YEAR|`,
 | 
				
			||||||
 | 
					    worldState_pre_year: `[UNTRANSLATED] pre |YEAR|`,
 | 
				
			||||||
 | 
					    worldState_incompatibleWith: `[UNTRANSLATED] Incompatible with:`,
 | 
				
			||||||
    enabled: `Aktiviert`,
 | 
					    enabled: `Aktiviert`,
 | 
				
			||||||
    disabled: `Deaktiviert`,
 | 
					    disabled: `Deaktiviert`,
 | 
				
			||||||
    worldState_we1: `Wochenende 1`,
 | 
					    worldState_we1: `Wochenende 1`,
 | 
				
			||||||
 | 
				
			|||||||
@ -247,6 +247,18 @@ dict = {
 | 
				
			|||||||
    worldState_galleonOfGhouls: `Galleon of Ghouls`,
 | 
					    worldState_galleonOfGhouls: `Galleon of Ghouls`,
 | 
				
			||||||
    worldState_ghoulEmergence: `Ghoul Purge`,
 | 
					    worldState_ghoulEmergence: `Ghoul Purge`,
 | 
				
			||||||
    worldState_plagueStar: `Plague Star`,
 | 
					    worldState_plagueStar: `Plague Star`,
 | 
				
			||||||
 | 
					    worldState_dogDays: `Dog Days`,
 | 
				
			||||||
 | 
					    worldState_dogDaysRewards: `Dog Days Rewards`,
 | 
				
			||||||
 | 
					    worldState_wolfHunt: `Wolf Hunt (2025)`,
 | 
				
			||||||
 | 
					    worldState_longShadow: `Long Shadow`,
 | 
				
			||||||
 | 
					    worldState_hallowedFlame: `Hallowed Flame`,
 | 
				
			||||||
 | 
					    worldState_hallowedNightmares: `Hallowed Nightmares`,
 | 
				
			||||||
 | 
					    worldState_hallowedNightmaresRewards: `Hallowed Nightmares Rewards`,
 | 
				
			||||||
 | 
					    worldState_proxyRebellion: `Proxy Rebellion`,
 | 
				
			||||||
 | 
					    worldState_proxyRebellionRewards: `Proxy Rebellion Rewards`,
 | 
				
			||||||
 | 
					    worldState_from_year: `from |YEAR|`,
 | 
				
			||||||
 | 
					    worldState_pre_year: `pre |YEAR|`,
 | 
				
			||||||
 | 
					    worldState_incompatibleWith: `Incompatible with:`,
 | 
				
			||||||
    enabled: `Enabled`,
 | 
					    enabled: `Enabled`,
 | 
				
			||||||
    disabled: `Disabled`,
 | 
					    disabled: `Disabled`,
 | 
				
			||||||
    worldState_we1: `Weekend 1`,
 | 
					    worldState_we1: `Weekend 1`,
 | 
				
			||||||
 | 
				
			|||||||
@ -248,6 +248,18 @@ dict = {
 | 
				
			|||||||
    worldState_galleonOfGhouls: `Galeón de Gules`,
 | 
					    worldState_galleonOfGhouls: `Galeón de Gules`,
 | 
				
			||||||
    worldState_ghoulEmergence: `Purga de Gules`,
 | 
					    worldState_ghoulEmergence: `Purga de Gules`,
 | 
				
			||||||
    worldState_plagueStar: `Estrella Infestada`,
 | 
					    worldState_plagueStar: `Estrella Infestada`,
 | 
				
			||||||
 | 
					    worldState_dogDays: `Canícula`,
 | 
				
			||||||
 | 
					    worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`,
 | 
				
			||||||
 | 
					    worldState_wolfHunt: `Cacería del Lobo (2025)`,
 | 
				
			||||||
 | 
					    worldState_longShadow: `Sombra Prolongada`,
 | 
				
			||||||
 | 
					    worldState_hallowedFlame: `Llama Sagrada`,
 | 
				
			||||||
 | 
					    worldState_hallowedNightmares: `Pesadillas sagradas`,
 | 
				
			||||||
 | 
					    worldState_hallowedNightmaresRewards: `[UNTRANSLATED] Hallowed Nightmares Rewards`,
 | 
				
			||||||
 | 
					    worldState_proxyRebellion: `Rebelión Proxy`,
 | 
				
			||||||
 | 
					    worldState_proxyRebellionRewards: `[UNTRANSLATED] Proxy Rebellion Rewards`,
 | 
				
			||||||
 | 
					    worldState_from_year: `[UNTRANSLATED] from |YEAR|`,
 | 
				
			||||||
 | 
					    worldState_pre_year: `[UNTRANSLATED] pre |YEAR|`,
 | 
				
			||||||
 | 
					    worldState_incompatibleWith: `[UNTRANSLATED] Incompatible with:`,
 | 
				
			||||||
    enabled: `Activado`,
 | 
					    enabled: `Activado`,
 | 
				
			||||||
    disabled: `Desactivado`,
 | 
					    disabled: `Desactivado`,
 | 
				
			||||||
    worldState_we1: `Semana 1`,
 | 
					    worldState_we1: `Semana 1`,
 | 
				
			||||||
 | 
				
			|||||||
@ -248,6 +248,18 @@ dict = {
 | 
				
			|||||||
    worldState_galleonOfGhouls: `Galion des Goules`,
 | 
					    worldState_galleonOfGhouls: `Galion des Goules`,
 | 
				
			||||||
    worldState_ghoulEmergence: `Purge des Goules`,
 | 
					    worldState_ghoulEmergence: `Purge des Goules`,
 | 
				
			||||||
    worldState_plagueStar: `Fléau Céleste`,
 | 
					    worldState_plagueStar: `Fléau Céleste`,
 | 
				
			||||||
 | 
					    worldState_dogDays: `Bataille d'Eau`,
 | 
				
			||||||
 | 
					    worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`,
 | 
				
			||||||
 | 
					    worldState_wolfHunt: `Chasse au Loup (2025)`,
 | 
				
			||||||
 | 
					    worldState_longShadow: `La Propagation des Ombres`,
 | 
				
			||||||
 | 
					    worldState_hallowedFlame: `Flamme Hantée`,
 | 
				
			||||||
 | 
					    worldState_hallowedNightmares: `Cauchemars Hantés`,
 | 
				
			||||||
 | 
					    worldState_hallowedNightmaresRewards: `[UNTRANSLATED] Hallowed Nightmares Rewards`,
 | 
				
			||||||
 | 
					    worldState_proxyRebellion: `Rébellion Proxy`,
 | 
				
			||||||
 | 
					    worldState_proxyRebellionRewards: `[UNTRANSLATED] Proxy Rebellion Rewards`,
 | 
				
			||||||
 | 
					    worldState_from_year: `[UNTRANSLATED] from |YEAR|`,
 | 
				
			||||||
 | 
					    worldState_pre_year: `[UNTRANSLATED] pre |YEAR|`,
 | 
				
			||||||
 | 
					    worldState_incompatibleWith: `[UNTRANSLATED] Incompatible with:`,
 | 
				
			||||||
    enabled: `Activé`,
 | 
					    enabled: `Activé`,
 | 
				
			||||||
    disabled: `Désactivé`,
 | 
					    disabled: `Désactivé`,
 | 
				
			||||||
    worldState_we1: `Weekend 1`,
 | 
					    worldState_we1: `Weekend 1`,
 | 
				
			||||||
 | 
				
			|||||||
@ -248,6 +248,18 @@ dict = {
 | 
				
			|||||||
    worldState_galleonOfGhouls: `Галеон Гулей`,
 | 
					    worldState_galleonOfGhouls: `Галеон Гулей`,
 | 
				
			||||||
    worldState_ghoulEmergence: `Избавление от гулей`,
 | 
					    worldState_ghoulEmergence: `Избавление от гулей`,
 | 
				
			||||||
    worldState_plagueStar: `Чумная звезда`,
 | 
					    worldState_plagueStar: `Чумная звезда`,
 | 
				
			||||||
 | 
					    worldState_dogDays: `Знойные дни`,
 | 
				
			||||||
 | 
					    worldState_dogDaysRewards: `Награды Знойных дней`,
 | 
				
			||||||
 | 
					    worldState_wolfHunt: `Волчья Охота (2025)`,
 | 
				
			||||||
 | 
					    worldState_longShadow: `Длинная Тень`,
 | 
				
			||||||
 | 
					    worldState_hallowedFlame: `Священное пламя`,
 | 
				
			||||||
 | 
					    worldState_hallowedNightmares: `Священные Кошмары`,
 | 
				
			||||||
 | 
					    worldState_hallowedNightmaresRewards: `Награды Священных Кошмаров`,
 | 
				
			||||||
 | 
					    worldState_proxyRebellion: `Восстание Роботов`,
 | 
				
			||||||
 | 
					    worldState_proxyRebellionRewards: `Награды Восстания Роботов`,
 | 
				
			||||||
 | 
					    worldState_from_year: `из |YEAR|`,
 | 
				
			||||||
 | 
					    worldState_pre_year: `до |YEAR|`,
 | 
				
			||||||
 | 
					    worldState_incompatibleWith: `Несовместимо с:`,
 | 
				
			||||||
    enabled: `Включено`,
 | 
					    enabled: `Включено`,
 | 
				
			||||||
    disabled: `Отключено`,
 | 
					    disabled: `Отключено`,
 | 
				
			||||||
    worldState_we1: `Выходные 1`,
 | 
					    worldState_we1: `Выходные 1`,
 | 
				
			||||||
 | 
				
			|||||||
@ -248,6 +248,18 @@ dict = {
 | 
				
			|||||||
    worldState_galleonOfGhouls: `Гульський Галеон`,
 | 
					    worldState_galleonOfGhouls: `Гульський Галеон`,
 | 
				
			||||||
    worldState_ghoulEmergence: `Зачищення від гулів`,
 | 
					    worldState_ghoulEmergence: `Зачищення від гулів`,
 | 
				
			||||||
    worldState_plagueStar: `Морова зірка`,
 | 
					    worldState_plagueStar: `Морова зірка`,
 | 
				
			||||||
 | 
					    worldState_dogDays: `Спекотні дні`,
 | 
				
			||||||
 | 
					    worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`,
 | 
				
			||||||
 | 
					    worldState_wolfHunt: `Полювання на Вовка (2025)`,
 | 
				
			||||||
 | 
					    worldState_longShadow: `Довга тінь`,
 | 
				
			||||||
 | 
					    worldState_hallowedFlame: `Священне полум'я`,
 | 
				
			||||||
 | 
					    worldState_hallowedNightmares: `Священні жахіття`,
 | 
				
			||||||
 | 
					    worldState_hallowedNightmaresRewards: `[UNTRANSLATED] Hallowed Nightmares Rewards`,
 | 
				
			||||||
 | 
					    worldState_proxyRebellion: `Повстання роботів`,
 | 
				
			||||||
 | 
					    worldState_proxyRebellionRewards: `[UNTRANSLATED] Proxy Rebellion Rewards`,
 | 
				
			||||||
 | 
					    worldState_from_year: `[UNTRANSLATED] from |YEAR|`,
 | 
				
			||||||
 | 
					    worldState_pre_year: `[UNTRANSLATED] pre |YEAR|`,
 | 
				
			||||||
 | 
					    worldState_incompatibleWith: `[UNTRANSLATED] Incompatible with:`,
 | 
				
			||||||
    enabled: `Увімкнено`,
 | 
					    enabled: `Увімкнено`,
 | 
				
			||||||
    disabled: `Вимкнено`,
 | 
					    disabled: `Вимкнено`,
 | 
				
			||||||
    worldState_we1: `Вихідні 1`,
 | 
					    worldState_we1: `Вихідні 1`,
 | 
				
			||||||
 | 
				
			|||||||
@ -248,6 +248,18 @@ dict = {
 | 
				
			|||||||
    worldState_galleonOfGhouls: `战术警报:尸鬼的帆船战舰`,
 | 
					    worldState_galleonOfGhouls: `战术警报:尸鬼的帆船战舰`,
 | 
				
			||||||
    worldState_ghoulEmergence: `尸鬼净化`,
 | 
					    worldState_ghoulEmergence: `尸鬼净化`,
 | 
				
			||||||
    worldState_plagueStar: `瘟疫之星`,
 | 
					    worldState_plagueStar: `瘟疫之星`,
 | 
				
			||||||
 | 
					    worldState_dogDays: `三伏天`,
 | 
				
			||||||
 | 
					    worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`,
 | 
				
			||||||
 | 
					    worldState_wolfHunt: `恶狼狩猎 (2025)`,
 | 
				
			||||||
 | 
					    worldState_longShadow: `暗夜长影`,
 | 
				
			||||||
 | 
					    worldState_hallowedFlame: `万圣之焰`,
 | 
				
			||||||
 | 
					    worldState_hallowedNightmares: `万圣噩梦`,
 | 
				
			||||||
 | 
					    worldState_hallowedNightmaresRewards: `[UNTRANSLATED] Hallowed Nightmares Rewards`,
 | 
				
			||||||
 | 
					    worldState_proxyRebellion: `机械叛乱`,
 | 
				
			||||||
 | 
					    worldState_proxyRebellionRewards: `[UNTRANSLATED] Proxy Rebellion Rewards`,
 | 
				
			||||||
 | 
					    worldState_from_year: `[UNTRANSLATED] from |YEAR|`,
 | 
				
			||||||
 | 
					    worldState_pre_year: `[UNTRANSLATED] pre |YEAR|`,
 | 
				
			||||||
 | 
					    worldState_incompatibleWith: `[UNTRANSLATED] Incompatible with:`,
 | 
				
			||||||
    enabled: `启用`,
 | 
					    enabled: `启用`,
 | 
				
			||||||
    disabled: `关闭/取消配置`,
 | 
					    disabled: `关闭/取消配置`,
 | 
				
			||||||
    worldState_we1: `活动阶段:第一周`,
 | 
					    worldState_we1: `活动阶段:第一周`,
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user