From 4d29fb634ae360e65971624988a503637d790a07 Mon Sep 17 00:00:00 2001 From: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Date: Mon, 11 Aug 2025 20:17:20 +0200 Subject: [PATCH 1/9] feat: dog days Re #1103 --- config-vanilla.json | 2 + src/controllers/api/inboxController.ts | 6 +- src/models/inboxModel.ts | 4 +- src/services/configService.ts | 2 + src/services/missionInventoryUpdateService.ts | 122 ++++++- src/services/worldStateService.ts | 297 +++++++++++++++++- src/types/worldStateTypes.ts | 43 +++ static/webui/index.html | 20 ++ static/webui/translations/de.js | 6 + static/webui/translations/en.js | 6 + static/webui/translations/es.js | 6 + static/webui/translations/fr.js | 6 + static/webui/translations/ru.js | 6 + static/webui/translations/uk.js | 6 + static/webui/translations/zh.js | 6 + 15 files changed, 518 insertions(+), 20 deletions(-) diff --git a/config-vanilla.json b/config-vanilla.json index a8834907..36e4b388 100644 --- a/config-vanilla.json +++ b/config-vanilla.json @@ -75,6 +75,8 @@ "ghoulEmergenceOverride": null, "plagueStarOverride": null, "starDaysOverride": null, + "waterFightOverride": null, + "waterFightRewardsOverride": null, "eidolonOverride": "", "vallisOverride": "", "duviriOverride": "", diff --git a/src/controllers/api/inboxController.ts b/src/controllers/api/inboxController.ts index 8e775c10..5f36c998 100644 --- a/src/controllers/api/inboxController.ts +++ b/src/controllers/api/inboxController.ts @@ -13,7 +13,8 @@ import { addItems, combineInventoryChanges, getEffectiveAvatarImageType, - getInventory + getInventory, + updateCurrency } from "@/src/services/inventoryService"; import { logger } from "@/src/utils/logger"; 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(); res.json({ InventoryChanges: inventoryChanges }); } else if (latestClientMessageId) { diff --git a/src/models/inboxModel.ts b/src/models/inboxModel.ts index 0ec39442..27a5f0a7 100644 --- a/src/models/inboxModel.ts +++ b/src/models/inboxModel.ts @@ -47,6 +47,7 @@ export interface IMessage { acceptAction?: string; declineAction?: string; hasAccountAction?: boolean; + RegularCredits?: number; } export interface Arg { @@ -139,7 +140,8 @@ const messageSchema = new Schema( contextInfo: String, acceptAction: String, declineAction: String, - hasAccountAction: Boolean + hasAccountAction: Boolean, + RegularCredits: Number }, { id: false } ); diff --git a/src/services/configService.ts b/src/services/configService.ts index 0ad8acc7..a5170518 100644 --- a/src/services/configService.ts +++ b/src/services/configService.ts @@ -87,6 +87,8 @@ export interface IConfig { ghoulEmergenceOverride?: boolean; plagueStarOverride?: boolean; starDaysOverride?: boolean; + waterFightOverride?: boolean; + waterFightRewardsOverride?: number; eidolonOverride?: string; vallisOverride?: string; duviriOverride?: string; diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index 6bd6ce58..3551281a 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -50,7 +50,7 @@ import { getEntriesUnsafe } from "@/src/utils/ts-utils"; import { handleStoreItemAcquisition } from "@/src/services/purchaseService"; import { IMissionCredits, IMissionReward } from "@/src/types/missionTypes"; 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 kuriaMessage75 from "@/static/fixed_responses/kuriaMessages/seventyFivePercent.json"; import kuriaMessage100 from "@/static/fixed_responses/kuriaMessages/oneHundredPercent.json"; @@ -624,37 +624,93 @@ export const addMissionInventoryUpdates = async ( if (goal && goal.Personal) { inventory.PersonalGoalProgress ??= []; const goalProgress = inventory.PersonalGoalProgress.find(x => x.goalId.equals(goal._id.$oid)); - if (goalProgress) { - goalProgress.Best = Math.max(goalProgress.Best, uploadProgress.Best); - goalProgress.Count += uploadProgress.Count; - } else { + if (!goalProgress) { inventory.PersonalGoalProgress.push({ Best: uploadProgress.Best, Count: uploadProgress.Count, Tag: goal.Tag, 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 ( + goal.InterimGoals[i] && + goal.InterimGoals[i] <= totalCount && + (!goalProgress || goalProgress.Count < goal.InterimGoals[i]) && + goal.InterimRewards[i] + ) { + reward = goal.InterimRewards[i]; + break; + } + } + } if ( - goal.Reward && - goal.Reward.items && - goal.MissionKeyName && - goal.MissionKeyName in goalMessagesByKey + !reward && + goal.Goal && + goal.Goal <= totalCount && + (!goalProgress || goalProgress.Count < goal.Goal) && + goal.Reward ) { - // Send reward via inbox - const info = goalMessagesByKey[goal.MissionKeyName]; - await createMessage(inventory.accountOwnerId, [ - { + 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 + const info = goalMessagesByKey[currentMissionKey]; + const message: IMessageCreationTemplate = { sndr: info.sndr, msg: info.msg, - att: goal.Reward.items.map(x => (isStoreItem(x) ? fromStoreItem(x) : x)), sub: info.sub, icon: info.icon, 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; + } } } break; @@ -1011,8 +1067,16 @@ export const addMissionRewards = async ( if (rewardInfo.goalId) { const goal = getWorldState().Goals.find(x => x._id.$oid == rewardInfo.goalId); - if (goal?.MissionKeyName) { - levelKeyName = goal.MissionKeyName; + if (goal) { + 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,29 @@ const goalMessagesByKey: Record { Sorties: [], LiteSorties: [], ActiveMissions: [], + FlashSales: [], GlobalUpgrades: [], Invasions: [], VoidTraders: [], @@ -1401,7 +1402,8 @@ export const getWorldState = (buildLabel?: string): IWorldState => { EndlessXpChoices: [], KnownCalendarSeasons: [], ...staticWorldState, - SyndicateMissions: [...staticWorldState.SyndicateMissions] + SyndicateMissions: [...staticWorldState.SyndicateMissions], + InGameMarket: staticWorldState.InGameMarket }; // Old versions seem to really get hung up on not being able to load these. @@ -1629,6 +1631,299 @@ export const getWorldState = (buildLabel?: string): IWorldState => { }); } + const firstAugustWeekday = new Date(Date.UTC(date.getUTCFullYear(), 7, 1)).getUTCDay(); + const firstAugustWednesdayOffset = (3 - firstAugustWeekday + 7) % 7; + const waterFightStart = 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 waterFightEnd = Date.UTC(date.getUTCFullYear(), 8, 1 + firstSeptemberWednesdayOffset, 15); + + const isWaterFightActive = timeMs >= waterFightStart && timeMs < waterFightEnd; + logger.debug(isWaterFightActive); + if (config.worldState?.waterFightOverride ?? isWaterFightActive) { + const activationTimeStamp = config.worldState?.waterFightOverride + ? "1699372800000" + : waterFightStart.toString(); + const expiryTimeStamp = config.worldState?.waterFightOverride ? "2000000000000" : waterFightEnd.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?.waterFightRewardsOverride ?? 3; + + worldState.Goals.push({ + _id: { + $oid: ((waterFightStart / 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", + ConcurrentMissionKeyNames: [ + "/Lotus/Types/Keys/TacAlertKeyWaterFightB", + "/Lotus/Types/Keys/TacAlertKeyWaterFightC", + "/Lotus/Types/Keys/TacAlertKeyWaterFightD" + ], + ConcurrentNodeReqs: [25, 50, 100], + ConcurrentNodes: ["EventNode24", "EventNode34", "EventNode35"], + 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 + }); + } + } + // Nightwave Challenges const nightwaveSyndicateTag = getNightwaveSyndicateTag(buildLabel); if (nightwaveSyndicateTag) { diff --git a/src/types/worldStateTypes.ts b/src/types/worldStateTypes.ts index a1b7feca..e04a1fdc 100644 --- a/src/types/worldStateTypes.ts +++ b/src/types/worldStateTypes.ts @@ -5,12 +5,14 @@ export interface IWorldState { Version: number; // for goals BuildLabel: string; Time: number; + InGameMarket: IInGameMarket; Goals: IGoal[]; Alerts: []; Sorties: ISortie[]; LiteSorties: ILiteSortie[]; SyndicateMissions: ISyndicateMissionInfo[]; ActiveMissions: IFissure[]; + FlashSales: IFlashSale[]; GlobalUpgrades: IGlobalUpgrade[]; Invasions: IInvasion[]; NodeOverrides: INodeOverride[]; @@ -39,6 +41,8 @@ export interface IGoal { Expiry: IMongoDate; Count?: number; Goal?: number; + InterimGoals?: number[]; + BonusGoal?: number; HealthPct?: number; Success?: number; Personal?: boolean; @@ -53,16 +57,24 @@ export interface IGoal { Tag: string; Node?: string; VictimNode?: string; + ConcurrentMissionKeyNames?: string[]; + ConcurrentNodeReqs?: number[]; + ConcurrentNodes?: string[]; RegionIdx?: number; Regions?: number[]; MissionKeyName?: string; Reward?: IMissionReward; + InterimRewards?: IMissionReward[]; + BonusReward?: IMissionReward; JobAffiliationTag?: string; Jobs?: ISyndicateJob[]; PreviousJobs?: ISyndicateJob[]; JobCurrentVersion?: IOid; JobPreviousVersion?: IOid; + + ScoreVar?: string; + NightLevel?: string; } export interface ISyndicateJob { @@ -321,6 +333,37 @@ export type TCircuitGameMode = | "Assassination" | "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 { cavabegin: string; PurchasePlatformLockEnabled: boolean; // Seems unused diff --git a/static/webui/index.html b/static/webui/index.html index 99193f78..c5d2b6ce 100644 --- a/static/webui/index.html +++ b/static/webui/index.html @@ -970,6 +970,26 @@ +
+
+ + +
+
+ + +
+
+ +
- - diff --git a/static/webui/translations/de.js b/static/webui/translations/de.js index d8759b10..9e7105ae 100644 --- a/static/webui/translations/de.js +++ b/static/webui/translations/de.js @@ -248,8 +248,8 @@ dict = { worldState_galleonOfGhouls: `Galeone der Ghule`, worldState_ghoulEmergence: `Ghul Ausrottung`, worldState_plagueStar: `Plagenstern`, - worldState_waterFight: `Hitzefrei`, - worldState_waterFightRewards: `[UNTRANSLATED] Dog Days Rewards`, + worldState_dogDays: `Hitzefrei`, + worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`, worldState_from_2025: `[UNTRANSLATED] from 2025`, worldState_from_2024: `[UNTRANSLATED] from 2024`, worldState_from_2023: `[UNTRANSLATED] from 2023`, diff --git a/static/webui/translations/en.js b/static/webui/translations/en.js index 48c0f7fc..6934ad8d 100644 --- a/static/webui/translations/en.js +++ b/static/webui/translations/en.js @@ -247,8 +247,8 @@ dict = { worldState_galleonOfGhouls: `Galleon of Ghouls`, worldState_ghoulEmergence: `Ghoul Purge`, worldState_plagueStar: `Plague Star`, - worldState_waterFight: `Dog Days`, - worldState_waterFightRewards: `Dog Days Rewards`, + worldState_dogDays: `Dog Days`, + worldState_dogDaysRewards: `Dog Days Rewards`, worldState_from_2025: `from 2025`, worldState_from_2024: `from 2024`, worldState_from_2023: `from 2023`, diff --git a/static/webui/translations/es.js b/static/webui/translations/es.js index 0317739d..3be6e795 100644 --- a/static/webui/translations/es.js +++ b/static/webui/translations/es.js @@ -248,8 +248,8 @@ dict = { worldState_galleonOfGhouls: `Galeón de Gules`, worldState_ghoulEmergence: `Purga de Gules`, worldState_plagueStar: `Estrella Infestada`, - worldState_waterFight: `Canícula`, - worldState_waterFightRewards: `[UNTRANSLATED] Dog Days Rewards`, + worldState_dogDays: `Canícula`, + worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`, worldState_from_2025: `[UNTRANSLATED] from 2025`, worldState_from_2024: `[UNTRANSLATED] from 2024`, worldState_from_2023: `[UNTRANSLATED] from 2023`, diff --git a/static/webui/translations/fr.js b/static/webui/translations/fr.js index ffd93487..94311a76 100644 --- a/static/webui/translations/fr.js +++ b/static/webui/translations/fr.js @@ -248,8 +248,8 @@ dict = { worldState_galleonOfGhouls: `Galion des Goules`, worldState_ghoulEmergence: `Purge des Goules`, worldState_plagueStar: `Fléau Céleste`, - worldState_waterFight: `Bataille d'Eau`, - worldState_waterFightRewards: `[UNTRANSLATED] Dog Days Rewards`, + worldState_dogDays: `Bataille d'Eau`, + worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`, worldState_from_2025: `[UNTRANSLATED] from 2025`, worldState_from_2024: `[UNTRANSLATED] from 2024`, worldState_from_2023: `[UNTRANSLATED] from 2023`, diff --git a/static/webui/translations/ru.js b/static/webui/translations/ru.js index d81dcea0..4636e7a7 100644 --- a/static/webui/translations/ru.js +++ b/static/webui/translations/ru.js @@ -248,8 +248,8 @@ dict = { worldState_galleonOfGhouls: `Галеон Гулей`, worldState_ghoulEmergence: `Избавление от гулей`, worldState_plagueStar: `Чумная звезда`, - worldState_waterFight: `Знойные дни`, - worldState_waterFightRewards: `Награды Знойных дней`, + worldState_dogDays: `Знойные дни`, + worldState_dogDaysRewards: `Награды Знойных дней`, worldState_from_2025: `из 2025`, worldState_from_2024: `из 2024`, worldState_from_2023: `из 2023`, diff --git a/static/webui/translations/uk.js b/static/webui/translations/uk.js index 7bed3ac9..fa1a02a5 100644 --- a/static/webui/translations/uk.js +++ b/static/webui/translations/uk.js @@ -248,8 +248,8 @@ dict = { worldState_galleonOfGhouls: `Гульський Галеон`, worldState_ghoulEmergence: `Зачищення від гулів`, worldState_plagueStar: `Морова зірка`, - worldState_waterFight: `Спекотні дні`, - worldState_waterFightRewards: `[UNTRANSLATED] Dog Days Rewards`, + worldState_dogDays: `Спекотні дні`, + worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`, worldState_from_2025: `[UNTRANSLATED] from 2025`, worldState_from_2024: `[UNTRANSLATED] from 2024`, worldState_from_2023: `[UNTRANSLATED] from 2023`, diff --git a/static/webui/translations/zh.js b/static/webui/translations/zh.js index 6fcf769f..a1fb77e4 100644 --- a/static/webui/translations/zh.js +++ b/static/webui/translations/zh.js @@ -248,8 +248,8 @@ dict = { worldState_galleonOfGhouls: `战术警报:尸鬼的帆船战舰`, worldState_ghoulEmergence: `尸鬼净化`, worldState_plagueStar: `瘟疫之星`, - worldState_waterFight: `三伏天`, - worldState_waterFightRewards: `[UNTRANSLATED] Dog Days Rewards`, + worldState_dogDays: `三伏天`, + worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`, worldState_from_2025: `[UNTRANSLATED] from 2025`, worldState_from_2024: `[UNTRANSLATED] from 2024`, worldState_from_2023: `[UNTRANSLATED] from 2023`, -- 2.47.2 From e1ce06de4d67b5651635ba8f7d221e53b5cab4d9 Mon Sep 17 00:00:00 2001 From: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Date: Mon, 11 Aug 2025 20:52:22 +0200 Subject: [PATCH 4/9] Update config-vanilla.json --- config-vanilla.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config-vanilla.json b/config-vanilla.json index 36e4b388..bc6a18bf 100644 --- a/config-vanilla.json +++ b/config-vanilla.json @@ -75,8 +75,8 @@ "ghoulEmergenceOverride": null, "plagueStarOverride": null, "starDaysOverride": null, - "waterFightOverride": null, - "waterFightRewardsOverride": null, + "dogDaysOverride": null, + "dogDaysRewardsOverride": null, "eidolonOverride": "", "vallisOverride": "", "duviriOverride": "", -- 2.47.2 From 6b3aa11ec1b583dbdde0e47f29efcb626230fe0e Mon Sep 17 00:00:00 2001 From: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Date: Tue, 12 Aug 2025 09:33:21 +0200 Subject: [PATCH 5/9] almost all tactical alerts after star cart 3.0 --- config-vanilla.json | 7 + src/services/configService.ts | 7 + src/services/missionInventoryUpdateService.ts | 114 ++++++ src/services/worldStateService.ts | 344 +++++++++++++++++- src/types/worldStateTypes.ts | 5 +- static/webui/index.html | 52 ++- static/webui/script.js | 8 + static/webui/translations/de.js | 13 + static/webui/translations/en.js | 13 + static/webui/translations/es.js | 13 + static/webui/translations/fr.js | 13 + static/webui/translations/ru.js | 13 + static/webui/translations/uk.js | 13 + static/webui/translations/zh.js | 13 + 14 files changed, 623 insertions(+), 5 deletions(-) diff --git a/config-vanilla.json b/config-vanilla.json index bc6a18bf..d285922c 100644 --- a/config-vanilla.json +++ b/config-vanilla.json @@ -71,6 +71,13 @@ "affinityBoost": false, "resourceBoost": false, "tennoLiveRelay": false, + "wolfHunt": false, + "longShadow": false, + "hallowedFlame": false, + "hallowedNightmares": false, + "hallowedNightmaresRewardsOverride": 0, + "proxyRebellion": false, + "proxyRebellionRewardsOverride": 0, "galleonOfGhouls": 0, "ghoulEmergenceOverride": null, "plagueStarOverride": null, diff --git a/src/services/configService.ts b/src/services/configService.ts index 63b999d9..0d800477 100644 --- a/src/services/configService.ts +++ b/src/services/configService.ts @@ -83,6 +83,13 @@ export interface IConfig { resourceBoost?: boolean; tennoLiveRelay?: boolean; baroTennoConRelay?: boolean; + wolfHunt?: boolean; + longShadow?: boolean; + hallowedFlame?: boolean; + hallowedNightmares?: boolean; + hallowedNightmaresRewardsOverride?: number; + proxyRebellion?: boolean; + proxyRebellionRewardsOverride?: number; galleonOfGhouls?: number; ghoulEmergenceOverride?: boolean; plagueStarOverride?: boolean; diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index 3551281a..907ddc70 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -2237,5 +2237,119 @@ const goalMessagesByKey: Record { Personal: true, Bounty: true, ClampNodeScores: true, - Node: "EventNode28", + Node: "EventNode28", // Incompateble with Wolf Hunt (2025) MissionKeyName: "/Lotus/Types/Keys/GalleonRobberyAlertB", Desc: "/Lotus/Language/Events/GalleonRobberyEventMissionTitle", Icon: "/Lotus/Interface/Icons/Player/GalleonRobberiesEvent.png", @@ -1806,14 +1806,14 @@ export const getWorldState = (buildLabel?: string): IWorldState => { Personal: true, Bounty: true, ClampNodeScores: true, - Node: "EventNode25", + Node: "EventNode25", // Incompateble 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"], + ConcurrentNodes: ["EventNode24", "EventNode34", "EventNode35"], // Incompateble with Hallowed Flame, Hallowed Nightmares MissionKeyName: "/Lotus/Types/Keys/TacAlertKeyWaterFightA", Faction: "FC_CORPUS", Desc: "/Lotus/Language/Alerts/TacAlertWaterFight", @@ -1921,6 +1921,344 @@ export const getWorldState = (buildLabel?: string): IWorldState => { } } + 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"], // Incompateble 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", // Incompateble with Hallowed Nightmares, Dog Days + ConcurrentMissionKeyNames: [ + "/Lotus/Types/Keys/LanternEndlessEventKeyB", + "/Lotus/Types/Keys/LanternEndlessEventKeyC" + ], + ConcurrentNodeReqs: [1, 2], + ConcurrentNodes: ["EventNode25", "EventNode34"], // Incompateble 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"], // Incompateble 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", // Incompateble 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 const nightwaveSyndicateTag = getNightwaveSyndicateTag(buildLabel); if (nightwaveSyndicateTag) { diff --git a/src/types/worldStateTypes.ts b/src/types/worldStateTypes.ts index e04a1fdc..b390f40d 100644 --- a/src/types/worldStateTypes.ts +++ b/src/types/worldStateTypes.ts @@ -46,7 +46,8 @@ export interface IGoal { HealthPct?: number; Success?: number; Personal?: boolean; - Bounty?: boolean; + Best?: boolean; + Bounty?: boolean; // Tactical Alert Faction?: string; ClampNodeScores?: boolean; Desc: string; @@ -55,6 +56,7 @@ export interface IGoal { InstructionalItem?: string; Icon: string; Tag: string; + PrereqGoalTags?: string[]; Node?: string; VictimNode?: string; ConcurrentMissionKeyNames?: string[]; @@ -74,6 +76,7 @@ export interface IGoal { JobPreviousVersion?: IOid; ScoreVar?: string; + ScoreMaxTag?: string; NightLevel?: string; } diff --git a/static/webui/index.html b/static/webui/index.html index fced28ea..cb79c719 100644 --- a/static/webui/index.html +++ b/static/webui/index.html @@ -937,8 +937,57 @@
+
+ + + +
+
+ + +
+
+ + + +
+
+
+ + + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ @@ -981,7 +1031,7 @@
- diff --git a/static/webui/script.js b/static/webui/script.js index 3715e906..0797f65d 100644 --- a/static/webui/script.js +++ b/static/webui/script.js @@ -202,6 +202,14 @@ function updateLocElements() { document.querySelectorAll("[data-loc-placeholder]").forEach(elm => { 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}`; + }); } function setActiveLanguage(lang) { diff --git a/static/webui/translations/de.js b/static/webui/translations/de.js index 9e7105ae..126d7dd2 100644 --- a/static/webui/translations/de.js +++ b/static/webui/translations/de.js @@ -250,10 +250,23 @@ dict = { 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_2025: `[UNTRANSLATED] from 2025`, worldState_from_2024: `[UNTRANSLATED] from 2024`, worldState_from_2023: `[UNTRANSLATED] from 2023`, worldState_pre_2023: `[UNTRANSLATED] pre 2023`, + worldState_from_2019: `[UNTRANSLATED] from 2019`, + worldState_from_2018: `[UNTRANSLATED] from 2018`, + worldState_from_2016: `[UNTRANSLATED] from 2016`, + worldState_from_2015: `[UNTRANSLATED] from 2015`, + worldState_note: `[UNTRANSLATED] Note`, + worldState_incompatibleWith: `[UNTRANSLATED] Incompatible with:`, enabled: `Aktiviert`, disabled: `Deaktiviert`, worldState_we1: `Wochenende 1`, diff --git a/static/webui/translations/en.js b/static/webui/translations/en.js index 6934ad8d..1c2f00ec 100644 --- a/static/webui/translations/en.js +++ b/static/webui/translations/en.js @@ -249,10 +249,23 @@ dict = { 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_2025: `from 2025`, worldState_from_2024: `from 2024`, worldState_from_2023: `from 2023`, worldState_pre_2023: `pre 2023`, + worldState_from_2019: `from 2019`, + worldState_from_2018: `from 2018`, + worldState_from_2016: `from 2016`, + worldState_from_2015: `from 2015`, + worldState_note: `Note`, + worldState_incompatibleWith: `Incompatible with:`, enabled: `Enabled`, disabled: `Disabled`, worldState_we1: `Weekend 1`, diff --git a/static/webui/translations/es.js b/static/webui/translations/es.js index 3be6e795..df8019c0 100644 --- a/static/webui/translations/es.js +++ b/static/webui/translations/es.js @@ -250,10 +250,23 @@ dict = { 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_2025: `[UNTRANSLATED] from 2025`, worldState_from_2024: `[UNTRANSLATED] from 2024`, worldState_from_2023: `[UNTRANSLATED] from 2023`, worldState_pre_2023: `[UNTRANSLATED] pre 2023`, + worldState_from_2019: `[UNTRANSLATED] from 2019`, + worldState_from_2018: `[UNTRANSLATED] from 2018`, + worldState_from_2016: `[UNTRANSLATED] from 2016`, + worldState_from_2015: `[UNTRANSLATED] from 2015`, + worldState_note: `[UNTRANSLATED] Note`, + worldState_incompatibleWith: `[UNTRANSLATED] Incompatible with:`, enabled: `Activado`, disabled: `Desactivado`, worldState_we1: `Semana 1`, diff --git a/static/webui/translations/fr.js b/static/webui/translations/fr.js index 94311a76..709887d6 100644 --- a/static/webui/translations/fr.js +++ b/static/webui/translations/fr.js @@ -250,10 +250,23 @@ dict = { 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_2025: `[UNTRANSLATED] from 2025`, worldState_from_2024: `[UNTRANSLATED] from 2024`, worldState_from_2023: `[UNTRANSLATED] from 2023`, worldState_pre_2023: `[UNTRANSLATED] pre 2023`, + worldState_from_2019: `[UNTRANSLATED] from 2019`, + worldState_from_2018: `[UNTRANSLATED] from 2018`, + worldState_from_2016: `[UNTRANSLATED] from 2016`, + worldState_from_2015: `[UNTRANSLATED] from 2015`, + worldState_note: `[UNTRANSLATED] Note`, + worldState_incompatibleWith: `[UNTRANSLATED] Incompatible with:`, enabled: `Activé`, disabled: `Désactivé`, worldState_we1: `Weekend 1`, diff --git a/static/webui/translations/ru.js b/static/webui/translations/ru.js index 4636e7a7..895c945b 100644 --- a/static/webui/translations/ru.js +++ b/static/webui/translations/ru.js @@ -250,10 +250,23 @@ dict = { worldState_plagueStar: `Чумная звезда`, worldState_dogDays: `Знойные дни`, worldState_dogDaysRewards: `Награды Знойных дней`, + worldState_wolfHunt: `Волчья Охота (2025)`, + worldState_longShadow: `Длинная Тень`, + worldState_hallowedFlame: `Священное пламя`, + worldState_hallowedNightmares: `Священные Кошмары`, + worldState_hallowedNightmaresRewards: `Награды Священных Кошмаров`, + worldState_proxyRebellion: `Восстание Роботов`, + worldState_proxyRebellionRewards: `Награды Восстания Роботов`, worldState_from_2025: `из 2025`, worldState_from_2024: `из 2024`, worldState_from_2023: `из 2023`, worldState_pre_2023: `до 2023`, + worldState_from_2019: `из 2019`, + worldState_from_2018: `из 2018`, + worldState_from_2016: `из 2016`, + worldState_from_2015: `из 2015`, + worldState_note: `Примичание`, + worldState_incompatibleWith: `Несовместимо с:`, enabled: `Включено`, disabled: `Отключено`, worldState_we1: `Выходные 1`, diff --git a/static/webui/translations/uk.js b/static/webui/translations/uk.js index fa1a02a5..9bf38e28 100644 --- a/static/webui/translations/uk.js +++ b/static/webui/translations/uk.js @@ -250,10 +250,23 @@ dict = { 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_2025: `[UNTRANSLATED] from 2025`, worldState_from_2024: `[UNTRANSLATED] from 2024`, worldState_from_2023: `[UNTRANSLATED] from 2023`, worldState_pre_2023: `[UNTRANSLATED] pre 2023`, + worldState_from_2019: `[UNTRANSLATED] from 2019`, + worldState_from_2018: `[UNTRANSLATED] from 2018`, + worldState_from_2016: `[UNTRANSLATED] from 2016`, + worldState_from_2015: `[UNTRANSLATED] from 2015`, + worldState_note: `[UNTRANSLATED] Note`, + worldState_incompatibleWith: `[UNTRANSLATED] Incompatible with:`, enabled: `Увімкнено`, disabled: `Вимкнено`, worldState_we1: `Вихідні 1`, diff --git a/static/webui/translations/zh.js b/static/webui/translations/zh.js index a1fb77e4..11bbe3aa 100644 --- a/static/webui/translations/zh.js +++ b/static/webui/translations/zh.js @@ -250,10 +250,23 @@ dict = { 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_2025: `[UNTRANSLATED] from 2025`, worldState_from_2024: `[UNTRANSLATED] from 2024`, worldState_from_2023: `[UNTRANSLATED] from 2023`, worldState_pre_2023: `[UNTRANSLATED] pre 2023`, + worldState_from_2019: `[UNTRANSLATED] from 2019`, + worldState_from_2018: `[UNTRANSLATED] from 2018`, + worldState_from_2016: `[UNTRANSLATED] from 2016`, + worldState_from_2015: `[UNTRANSLATED] from 2015`, + worldState_note: `[UNTRANSLATED] Note`, + worldState_incompatibleWith: `[UNTRANSLATED] Incompatible with:`, enabled: `启用`, disabled: `关闭/取消配置`, worldState_we1: `活动阶段:第一周`, -- 2.47.2 From 344e37db01baf10e52d1c74240bbfc9985f29630 Mon Sep 17 00:00:00 2001 From: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Date: Tue, 12 Aug 2025 18:41:15 +0200 Subject: [PATCH 6/9] data-loc-year --- src/services/worldStateService.ts | 25 ++++++++++++++++--------- static/webui/index.html | 20 ++++++++++---------- static/webui/script.js | 3 +++ static/webui/translations/de.js | 10 ++-------- static/webui/translations/en.js | 10 ++-------- static/webui/translations/es.js | 10 ++-------- static/webui/translations/fr.js | 10 ++-------- static/webui/translations/ru.js | 10 ++-------- static/webui/translations/uk.js | 10 ++-------- static/webui/translations/zh.js | 10 ++-------- 10 files changed, 43 insertions(+), 75 deletions(-) diff --git a/src/services/worldStateService.ts b/src/services/worldStateService.ts index e15b3f2d..9520fe54 100644 --- a/src/services/worldStateService.ts +++ b/src/services/worldStateService.ts @@ -1403,7 +1403,14 @@ export const getWorldState = (buildLabel?: string): IWorldState => { KnownCalendarSeasons: [], ...staticWorldState, SyndicateMissions: [...staticWorldState.SyndicateMissions], - InGameMarket: staticWorldState.InGameMarket + 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. @@ -1528,7 +1535,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => { Personal: true, Bounty: true, ClampNodeScores: true, - Node: "EventNode28", // Incompateble with Wolf Hunt (2025) + Node: "EventNode28", // Incompatible with Wolf Hunt (2025) MissionKeyName: "/Lotus/Types/Keys/GalleonRobberyAlertB", Desc: "/Lotus/Language/Events/GalleonRobberyEventMissionTitle", Icon: "/Lotus/Interface/Icons/Player/GalleonRobberiesEvent.png", @@ -1806,14 +1813,14 @@ export const getWorldState = (buildLabel?: string): IWorldState => { Personal: true, Bounty: true, ClampNodeScores: true, - Node: "EventNode25", // Incompateble with Hallowed Flame, Hallowed Nightmares + 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"], // Incompateble with Hallowed Flame, Hallowed Nightmares + ConcurrentNodes: ["EventNode24", "EventNode34", "EventNode35"], // Incompatible with Hallowed Flame, Hallowed Nightmares MissionKeyName: "/Lotus/Types/Keys/TacAlertKeyWaterFightA", Faction: "FC_CORPUS", Desc: "/Lotus/Language/Alerts/TacAlertWaterFight", @@ -1951,7 +1958,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => { "/Lotus/Types/Keys/WolfTacAlertReduxD" ], ConcurrentNodeReqs: [1, 2, 3], - ConcurrentNodes: ["EventNode28", "EventNode39", "EventNode40"], // Incompateble with Galleon Of Ghouls + ConcurrentNodes: ["EventNode28", "EventNode39", "EventNode40"], // Incompatible with Galleon Of Ghouls MissionKeyName: "/Lotus/Types/Keys/WolfTacAlertReduxA", Faction: "FC_GRINEER", Desc: "/Lotus/Language/Alerts/WolfAlert", @@ -1995,13 +2002,13 @@ export const getWorldState = (buildLabel?: string): IWorldState => { Personal: true, Bounty: true, ClampNodeScores: true, - Node: "EventNode24", // Incompateble with Hallowed Nightmares, Dog Days + Node: "EventNode24", // Incompatible with Hallowed Nightmares, Dog Days ConcurrentMissionKeyNames: [ "/Lotus/Types/Keys/LanternEndlessEventKeyB", "/Lotus/Types/Keys/LanternEndlessEventKeyC" ], ConcurrentNodeReqs: [1, 2], - ConcurrentNodes: ["EventNode25", "EventNode34"], // Incompateble with Hallowed Nightmares, Dog Days + ConcurrentNodes: ["EventNode25", "EventNode34"], // Incompatible with Hallowed Nightmares, Dog Days MissionKeyName: "/Lotus/Types/Keys/LanternEndlessEventKeyA", Faction: "FC_INFESTATION", Desc: "/Lotus/Language/Events/TacAlertHalloweenLantern", @@ -2106,7 +2113,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => { MissionKeyName: "/Lotus/Types/Keys/TacAlertKeyHalloween", ConcurrentMissionKeyNames: ["/Lotus/Types/Keys/TacAlertKeyHalloweenBonus"], ConcurrentNodeReqs: [1], - ConcurrentNodes: ["EventNode24"], // Incompateble with Hallowed Flame, Dog Days + ConcurrentNodes: ["EventNode24"], // Incompatible with Hallowed Flame, Dog Days InterimRewards: [rewards[year][0]], Reward: rewards[year][1] }); @@ -2128,7 +2135,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => { ToolTip: "/Lotus/Language/G1Quests/TacAlertHalloweenToolTip", Icon: "/Lotus/Interface/Icons/JackOLanternColour.png", ClampNodeScores: true, - Node: "EventNode25", // Incompateble with Hallowed Flame, Dog Days + Node: "EventNode25", // Incompatible with Hallowed Flame, Dog Days MissionKeyName: "/Lotus/Types/Keys/TacAlertKeyHalloweenTimeAttack", ScoreVar: "TimeAttackScore", ScoreMaxTag: "Halloween16", diff --git a/static/webui/index.html b/static/webui/index.html index cb79c719..6506950d 100644 --- a/static/webui/index.html +++ b/static/webui/index.html @@ -963,9 +963,9 @@
@@ -980,8 +980,8 @@
@@ -1031,12 +1031,12 @@
- - - - - + + + +
diff --git a/static/webui/script.js b/static/webui/script.js index 0797f65d..e0162266 100644 --- a/static/webui/script.js +++ b/static/webui/script.js @@ -210,6 +210,9 @@ function updateLocElements() { .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) { diff --git a/static/webui/translations/de.js b/static/webui/translations/de.js index 126d7dd2..014643f7 100644 --- a/static/webui/translations/de.js +++ b/static/webui/translations/de.js @@ -257,14 +257,8 @@ dict = { worldState_hallowedNightmaresRewards: `[UNTRANSLATED] Hallowed Nightmares Rewards`, worldState_proxyRebellion: `Proxy-Rebellion`, worldState_proxyRebellionRewards: `[UNTRANSLATED] Proxy Rebellion Rewards`, - worldState_from_2025: `[UNTRANSLATED] from 2025`, - worldState_from_2024: `[UNTRANSLATED] from 2024`, - worldState_from_2023: `[UNTRANSLATED] from 2023`, - worldState_pre_2023: `[UNTRANSLATED] pre 2023`, - worldState_from_2019: `[UNTRANSLATED] from 2019`, - worldState_from_2018: `[UNTRANSLATED] from 2018`, - worldState_from_2016: `[UNTRANSLATED] from 2016`, - worldState_from_2015: `[UNTRANSLATED] from 2015`, + worldState_from_year: `[UNTRANSLATED] from |YEAR|`, + worldState_pre_year: `[UNTRANSLATED] pre |YEAR|`, worldState_note: `[UNTRANSLATED] Note`, worldState_incompatibleWith: `[UNTRANSLATED] Incompatible with:`, enabled: `Aktiviert`, diff --git a/static/webui/translations/en.js b/static/webui/translations/en.js index 1c2f00ec..6a5d2086 100644 --- a/static/webui/translations/en.js +++ b/static/webui/translations/en.js @@ -256,14 +256,8 @@ dict = { worldState_hallowedNightmaresRewards: `Hallowed Nightmares Rewards`, worldState_proxyRebellion: `Proxy Rebellion`, worldState_proxyRebellionRewards: `Proxy Rebellion Rewards`, - worldState_from_2025: `from 2025`, - worldState_from_2024: `from 2024`, - worldState_from_2023: `from 2023`, - worldState_pre_2023: `pre 2023`, - worldState_from_2019: `from 2019`, - worldState_from_2018: `from 2018`, - worldState_from_2016: `from 2016`, - worldState_from_2015: `from 2015`, + worldState_from_year: `from |YEAR|`, + worldState_pre_year: `pre |YEAR|`, worldState_note: `Note`, worldState_incompatibleWith: `Incompatible with:`, enabled: `Enabled`, diff --git a/static/webui/translations/es.js b/static/webui/translations/es.js index df8019c0..09930a93 100644 --- a/static/webui/translations/es.js +++ b/static/webui/translations/es.js @@ -257,14 +257,8 @@ dict = { worldState_hallowedNightmaresRewards: `[UNTRANSLATED] Hallowed Nightmares Rewards`, worldState_proxyRebellion: `Rebelión Proxy`, worldState_proxyRebellionRewards: `[UNTRANSLATED] Proxy Rebellion Rewards`, - worldState_from_2025: `[UNTRANSLATED] from 2025`, - worldState_from_2024: `[UNTRANSLATED] from 2024`, - worldState_from_2023: `[UNTRANSLATED] from 2023`, - worldState_pre_2023: `[UNTRANSLATED] pre 2023`, - worldState_from_2019: `[UNTRANSLATED] from 2019`, - worldState_from_2018: `[UNTRANSLATED] from 2018`, - worldState_from_2016: `[UNTRANSLATED] from 2016`, - worldState_from_2015: `[UNTRANSLATED] from 2015`, + worldState_from_year: `[UNTRANSLATED] from |YEAR|`, + worldState_pre_year: `[UNTRANSLATED] pre |YEAR|`, worldState_note: `[UNTRANSLATED] Note`, worldState_incompatibleWith: `[UNTRANSLATED] Incompatible with:`, enabled: `Activado`, diff --git a/static/webui/translations/fr.js b/static/webui/translations/fr.js index 709887d6..ee020125 100644 --- a/static/webui/translations/fr.js +++ b/static/webui/translations/fr.js @@ -257,14 +257,8 @@ dict = { worldState_hallowedNightmaresRewards: `[UNTRANSLATED] Hallowed Nightmares Rewards`, worldState_proxyRebellion: `Rébellion Proxy`, worldState_proxyRebellionRewards: `[UNTRANSLATED] Proxy Rebellion Rewards`, - worldState_from_2025: `[UNTRANSLATED] from 2025`, - worldState_from_2024: `[UNTRANSLATED] from 2024`, - worldState_from_2023: `[UNTRANSLATED] from 2023`, - worldState_pre_2023: `[UNTRANSLATED] pre 2023`, - worldState_from_2019: `[UNTRANSLATED] from 2019`, - worldState_from_2018: `[UNTRANSLATED] from 2018`, - worldState_from_2016: `[UNTRANSLATED] from 2016`, - worldState_from_2015: `[UNTRANSLATED] from 2015`, + worldState_from_year: `[UNTRANSLATED] from |YEAR|`, + worldState_pre_year: `[UNTRANSLATED] pre |YEAR|`, worldState_note: `[UNTRANSLATED] Note`, worldState_incompatibleWith: `[UNTRANSLATED] Incompatible with:`, enabled: `Activé`, diff --git a/static/webui/translations/ru.js b/static/webui/translations/ru.js index 895c945b..de8d72b5 100644 --- a/static/webui/translations/ru.js +++ b/static/webui/translations/ru.js @@ -257,14 +257,8 @@ dict = { worldState_hallowedNightmaresRewards: `Награды Священных Кошмаров`, worldState_proxyRebellion: `Восстание Роботов`, worldState_proxyRebellionRewards: `Награды Восстания Роботов`, - worldState_from_2025: `из 2025`, - worldState_from_2024: `из 2024`, - worldState_from_2023: `из 2023`, - worldState_pre_2023: `до 2023`, - worldState_from_2019: `из 2019`, - worldState_from_2018: `из 2018`, - worldState_from_2016: `из 2016`, - worldState_from_2015: `из 2015`, + worldState_from_year: `из |YEAR|`, + worldState_pre_year: `до |YEAR|`, worldState_note: `Примичание`, worldState_incompatibleWith: `Несовместимо с:`, enabled: `Включено`, diff --git a/static/webui/translations/uk.js b/static/webui/translations/uk.js index 9bf38e28..9d38245a 100644 --- a/static/webui/translations/uk.js +++ b/static/webui/translations/uk.js @@ -257,14 +257,8 @@ dict = { worldState_hallowedNightmaresRewards: `[UNTRANSLATED] Hallowed Nightmares Rewards`, worldState_proxyRebellion: `Повстання роботів`, worldState_proxyRebellionRewards: `[UNTRANSLATED] Proxy Rebellion Rewards`, - worldState_from_2025: `[UNTRANSLATED] from 2025`, - worldState_from_2024: `[UNTRANSLATED] from 2024`, - worldState_from_2023: `[UNTRANSLATED] from 2023`, - worldState_pre_2023: `[UNTRANSLATED] pre 2023`, - worldState_from_2019: `[UNTRANSLATED] from 2019`, - worldState_from_2018: `[UNTRANSLATED] from 2018`, - worldState_from_2016: `[UNTRANSLATED] from 2016`, - worldState_from_2015: `[UNTRANSLATED] from 2015`, + worldState_from_year: `[UNTRANSLATED] from |YEAR|`, + worldState_pre_year: `[UNTRANSLATED] pre |YEAR|`, worldState_note: `[UNTRANSLATED] Note`, worldState_incompatibleWith: `[UNTRANSLATED] Incompatible with:`, enabled: `Увімкнено`, diff --git a/static/webui/translations/zh.js b/static/webui/translations/zh.js index 11bbe3aa..5ffb3ba6 100644 --- a/static/webui/translations/zh.js +++ b/static/webui/translations/zh.js @@ -257,14 +257,8 @@ dict = { worldState_hallowedNightmaresRewards: `[UNTRANSLATED] Hallowed Nightmares Rewards`, worldState_proxyRebellion: `机械叛乱`, worldState_proxyRebellionRewards: `[UNTRANSLATED] Proxy Rebellion Rewards`, - worldState_from_2025: `[UNTRANSLATED] from 2025`, - worldState_from_2024: `[UNTRANSLATED] from 2024`, - worldState_from_2023: `[UNTRANSLATED] from 2023`, - worldState_pre_2023: `[UNTRANSLATED] pre 2023`, - worldState_from_2019: `[UNTRANSLATED] from 2019`, - worldState_from_2018: `[UNTRANSLATED] from 2018`, - worldState_from_2016: `[UNTRANSLATED] from 2016`, - worldState_from_2015: `[UNTRANSLATED] from 2015`, + worldState_from_year: `[UNTRANSLATED] from |YEAR|`, + worldState_pre_year: `[UNTRANSLATED] pre |YEAR|`, worldState_note: `[UNTRANSLATED] Note`, worldState_incompatibleWith: `[UNTRANSLATED] Incompatible with:`, enabled: `启用`, -- 2.47.2 From 6235b875614d50670f808a09a27aebee7c901c34 Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Tue, 12 Aug 2025 19:48:46 +0200 Subject: [PATCH 7/9] fix doubled colons --- static/webui/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/webui/script.js b/static/webui/script.js index e0162266..4f995de8 100644 --- a/static/webui/script.js +++ b/static/webui/script.js @@ -208,7 +208,7 @@ function updateLocElements() { .split("|") .map(key => loc(key)) .join(", "); - elm.title = `${loc("worldState_incompatibleWith")}: ${incWith}`; + elm.title = `${loc("worldState_incompatibleWith")} ${incWith}`; }); document.querySelectorAll("[data-loc-year]").forEach(elm => { elm.innerHTML = elm.innerHTML.replace("|YEAR|", elm.getAttribute("data-loc-year")); -- 2.47.2 From 6688a97184af696f434aec1089000fdb71c8f226 Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Tue, 12 Aug 2025 19:53:08 +0200 Subject: [PATCH 8/9] use warning icon for incompatibility notes --- static/webui/index.html | 10 +++++----- static/webui/style.css | 6 +++++- static/webui/translations/de.js | 1 - static/webui/translations/en.js | 1 - static/webui/translations/es.js | 1 - static/webui/translations/fr.js | 1 - static/webui/translations/ru.js | 1 - static/webui/translations/uk.js | 1 - static/webui/translations/zh.js | 1 - 9 files changed, 10 insertions(+), 13 deletions(-) diff --git a/static/webui/index.html b/static/webui/index.html index 6506950d..e9a5e2a2 100644 --- a/static/webui/index.html +++ b/static/webui/index.html @@ -940,7 +940,7 @@
- +
@@ -949,12 +949,12 @@
- +
- + @@ -1022,7 +1022,7 @@
- +