diff --git a/config.json.example b/config.json.example index 66276fb3..1ff6013e 100644 --- a/config.json.example +++ b/config.json.example @@ -81,6 +81,12 @@ "darvoStockMultiplier": 1, "varziaOverride": "", "varziaFullyStocked": false + "TennoCon": false, + "Fomorian": false, + "BellyoftheBeast": false, + "RecurringGhoul": false, + "HeatFissures": false, + "BaroTennoCon": false }, "dev": { "keepVendorsExpired": false diff --git a/src/services/configService.ts b/src/services/configService.ts index 3fd0483e..0e39203a 100644 --- a/src/services/configService.ts +++ b/src/services/configService.ts @@ -92,6 +92,11 @@ export interface IConfig { darvoStockMultiplier?: number; varziaOverride?: string; varziaFullyStocked?: boolean; + TennoCon?: boolean; + Fomorian?: boolean; + BellyoftheBeast?: boolean; + RecurringGhoul?: boolean; + HeatFissures?:boolean; }; dev?: { keepVendorsExpired?: boolean; diff --git a/src/services/worldStateService.ts b/src/services/worldStateService.ts index 7f5268c9..e2f03de1 100644 --- a/src/services/worldStateService.ts +++ b/src/services/worldStateService.ts @@ -1383,6 +1383,218 @@ export const getWorldState = (buildLabel?: string): IWorldState => { Node: "SolarisUnitedHub1" }); } + if (config.worldState?.TennoCon) { + worldState.Goals.push({ + _id: { $oid: "687bf9400000000000000000" }, + Activation: { $date: { $numberLong: "1752955200000" } }, + Expiry: { $date: { $numberLong: "2000000000000" } }, + Count: 0, + Goal: 0, + Success: 0, + Personal: true, + Desc: "/Lotus/Language/Locations/RelayStationTennoConB", + ToolTip: "/Lotus/Language/Locations/RelayStationTennoConDescB", + Icon: "/Lotus/Interface/Icons/Categories/IconTennoLive.png", + Tag: "TennoConRelayB", + Node: "TennoConBHUB6" + }); + } + if (config.worldState?.Fomorian) { + worldState.Goals.push({ + _id: { $oid: "67c8924faf8bb9628dc1c18d" }, + Fomorian: true, + Activation: { $date: { $numberLong: "1741284514166" } }, + Expiry: { $date: { $numberLong: "2000000000000" } }, + Count: 0, + Goal: 1000000, + HealthPct: 0.980806, + VictimNode: "PlutoHUB", + Personal: true, + Best: true, + ScoreVar: "FomorianEventScore", + ScoreMaxTag: "FomorianEventScore", + ScoreTagBlocksGuildTierChanges: false, + Success: 0, + Node: "EventNode8", + Faction: "FC_GRINEER", + Desc: "/Lotus/Language/G1Quests/FomorianRevengeBattleName", + Icon: "/Lotus/Materials/Emblems/SlingStone2_e.png", + RegionDrops: ["/Lotus/Types/Items/MiscItems/OmegaIsotopePickup"], + ArchwingDrops: [], + ScoreLocTag: "/Lotus/Language/Menu/FomorianScoreHint", + Tag: "", + MissionInfo: { + missionType: "MT_SABOTAGE", + faction: "FC_GRINEER", + location: "EventNode8", + levelOverride: "/Lotus/Levels/Proc/Space/SpaceGrineerFomorianAssaultProcLevel", + enemySpec: "/Lotus/Types/Game/EnemySpecs/FomorianAttackSpec", + minEnemyLevel: 20, + maxEnemyLevel: 30, + difficulty: 1, + archwingRequired: true, + requiredItems: ["/Lotus/StoreItems/Types/Restoratives/Consumable/FomorianNegator"], + consumeRequiredItems: false, + missionReward: { randomizedItems: "fomorianRewardManifest" }, + vipAgent: "", + leadersAlwaysAllowed: true, + goalTag: "", + levelAuras: [], + icon: "/Lotus/Interface/Icons/Events/Fomorian.png" + }, + ContinuousHubEvent: { + Transmissions: ["/Lotus/Sounds/Dialog/HubAnnouncements/HekPropoganda"], + Activation: { $date: { $numberLong: "1741284514166" } }, + Expiry: { $date: { $numberLong: "2000000000000" } }, + RepeatInterval: 1800 + }, + Reward: { + credits: 200000, + items: ["/Lotus/StoreItems/Types/Items/MiscItems/OrokinCatalyst"] + } + }); + } + if (config.worldState?.BellyoftheBeast) { + worldState.Goals.push({ + _id: { $oid: "67a5035c2a198564d62e165e" }, + Activation: { $date: { $numberLong: "1738868400000" } }, + Community: true, + ClanGoal: [72, 216, 648, 1944, 5832], + Count: 0, + Desc: "/Lotus/Language/JadeShadows/JadeShadowsEventName", + Expiry: { $date: { $numberLong: "2000000000000" } }, + Faction: "FC_MITW", + Goal: 100, + HealthPct: 1, + Icon: "/Lotus/Interface/Icons/WorldStatePanel/JadeShadowsEventBadge.png", + ScoreLocTag: "/Lotus/Language/JadeShadows/JadeShadowsEventScore", + Tag: "JadeShadowsEvent", + ToolTip: "/Lotus/Language/JadeShadows/JadeShadowsShortEventDesc", + MissionKeyName: "/Lotus/Types/Keys/JadeShadowsEventMission", + Node: "SolNode723", + Personal: true, + ItemType: "/Lotus/Types/Gameplay/JadeShadows/Resources/AscensionEventResourceItem" + }); + } + if (config.worldState?.RecurringGhoul) { + worldState.Goals.push({ + _id: { $oid: "687ebbe6d1d17841c9c59f38" }, + Activation: { $date: { $numberLong: "1753204900185" } }, + Expiry: { $date: { $numberLong: "1755019300185" } }, + HealthPct: 0.001108, + VictimNode: "SolNode228", + Regions: [2], + Success: 0, + Desc: "/Lotus/Language/GameModes/RecurringGhoulAlert", + ToolTip: "/Lotus/Language/GameModes/RecurringGhoulAlertDesc", + Icon: "/Lotus/Interface/Icons/Categories/IconGhouls256.png", + Tag: "GhoulEmergence", + JobAffiliationTag: "CetusSyndicate", + JobCurrentVersion: { $oid: "688341880000000000000009" }, + Jobs: [ + { + jobType: "/Lotus/Types/Gameplay/Eidolon/Jobs/Events/GhoulAlertBountyAss", + rewards: "/Lotus/Types/Game/MissionDecks/EidolonJobMissionRewards/GhoulBountyTableARewards", + masteryReq: 1, + minEnemyLevel: 15, + maxEnemyLevel: 25, + xpAmounts: [260, 260, 260, 380] + }, + { + jobType: "/Lotus/Types/Gameplay/Eidolon/Jobs/Events/GhoulAlertBountyHunt", + rewards: "/Lotus/Types/Game/MissionDecks/EidolonJobMissionRewards/GhoulBountyTableBRewards", + masteryReq: 3, + minEnemyLevel: 40, + maxEnemyLevel: 50, + xpAmounts: [450, 450, 450, 670] + } + ], + JobPreviousVersion: { $oid: "68831e610000000000000009" }, + PreviousJobs: [ + { + jobType: "/Lotus/Types/Gameplay/Eidolon/Jobs/Events/GhoulAlertBountyRes", + rewards: "/Lotus/Types/Game/MissionDecks/EidolonJobMissionRewards/GhoulBountyTableARewards", + masteryReq: 1, + minEnemyLevel: 15, + maxEnemyLevel: 25, + xpAmounts: [270, 270, 270, 400] + }, + { + jobType: "/Lotus/Types/Gameplay/Eidolon/Jobs/Events/GhoulAlertBountyHunt", + rewards: "/Lotus/Types/Game/MissionDecks/EidolonJobMissionRewards/GhoulBountyTableBRewards", + masteryReq: 3, + minEnemyLevel: 40, + maxEnemyLevel: 50, + xpAmounts: [480, 480, 480, 710] + } + ], + Count: 0, + Goal: 0, + Personal: true + }); + } + if (config.worldState?.HeatFissures) { + worldState.Goals.push({ + _id: { $oid: "5c7cb0d00000000000000000" }, + Activation: { $date: { $numberLong: "1737392400000" } }, + Expiry: { $date: { $numberLong: "2000000000000" } }, + Node: "SolNode129", + ScoreVar: "FissuresClosed", + ScoreLocTag: "/Lotus/Language/G1Quests/HeatFissuresEventScore", + Count: 2, + HealthPct: 0.02, + Regions: [1], + Desc: "/Lotus/Language/G1Quests/HeatFissuresEventName", + ToolTip: "/Lotus/Language/G1Quests/HeatFissuresEventDesc", + OptionalInMission: true, + Tag: "HeatFissure", + UpgradeIds: [{ $oid: "678be06a422c69eb0ac1c18c" }, { $oid: "678be06a422c69eb0ac1c18d" }], + Personal: true, + Community: true, + Goal: 100, + Reward: { + credits: 0, + xp: 0, + items: ["/Lotus/StoreItems/Weapons/Corpus/LongGuns/CrpBFG/Vandal/VandalCrpBFG"], + countedItems: [] + }, + InterimGoals: [5, 25, 50, 75], + InterimRewards: [ + { + credits: 0, + xp: 0, + items: ["/Lotus/StoreItems/Upgrades/Skins/Clan/OrbBadgeItem"], + countedItems: [] + }, + { + credits: 0, + xp: 0, + items: [ + "/Lotus/StoreItems/Upgrades/Mods/DualSource/Shotgun/ShotgunMedicMod", + "/Lotus/StoreItems/Upgrades/Mods/DualSource/Rifle/SerratedRushMod" + ], + countedItems: [] + }, + { + credits: 0, + xp: 0, + items: [ + "/Lotus/StoreItems/Upgrades/Mods/DualSource/Pistol/MultishotDodgeMod", + "/Lotus/StoreItems/Upgrades/Mods/DualSource/Melee/CritDamageChargeSpeedMod" + ], + countedItems: [] + }, + { + credits: 0, + xp: 0, + items: ["/Lotus/StoreItems/Upgrades/Skins/Sigils/OrbSigil"], + countedItems: [] + } + ], + Success: 0, + Icon: "" + }); + } // The client gets kinda confused when multiple goals have the same tag, so considering these mutually exclusive. if (config.worldState?.galleonOfGhouls == 1) { worldState.Goals.push({ @@ -1637,6 +1849,57 @@ export const getWorldState = (buildLabel?: string): IWorldState => { vt.Manifest.push(item); } } + if (config.worldState?.BaroTennoCon) { + const vt: IVoidTrader = { + _id: { $oid: ((baroStart / 1000) & 0xffffffff).toString(16).padStart(8, "0") + "493c96d6067610bc" }, + Activation: { $date: { $numberLong: baroActualStart.toString() } }, + Expiry: { $date: { $numberLong: baroEnd.toString() } }, + Character: "Baro'Ki Teel", + Node: "TennoConHUB2", + Manifest: [] + }; + worldState.VoidTraders.push(vt); + for (const armorSet of baro.armorSets) { + if (Array.isArray(armorSet[0])) { + for (const set of armorSet as IVoidTraderOffer[][]) { + for (const item of set) { + vt.Manifest.push(item); + } + } + } else { + for (const item of armorSet as IVoidTraderOffer[]) { + vt.Manifest.push(item); + } + } + } + for (const item of baro.rest) { + vt.Manifest.push(item); + } + worldState.Goals.push({ + _id: { + $oid: "687bb2f00000000000000000" + }, + Activation: { + $date: { + $numberLong: baroActualStart.toString() + } + }, + Expiry: { + $date: { + $numberLong: baroEnd.toString() + } + }, + Count: 0, + Goal: 0, + Success: 0, + Personal: true, + Desc: "/Lotus/Language/Locations/RelayStationTennoCon", + ToolTip: "/Lotus/Language/Locations/RelayStationTennoConDesc", + Icon: "/Lotus/Interface/Icons/Categories/IconTennoConSigil.png", + Tag: "TennoConRelay", + Node: "TennoConHUB2" + }); + } } // Varzia diff --git a/src/types/worldStateTypes.ts b/src/types/worldStateTypes.ts index e52e613f..b6d3957e 100644 --- a/src/types/worldStateTypes.ts +++ b/src/types/worldStateTypes.ts @@ -39,7 +39,7 @@ export interface IGoal { Expiry: IMongoDate; Count: number; Goal: number; - Success: number; + Success?: number; Personal: boolean; Bounty?: boolean; ClampNodeScores?: boolean; @@ -47,9 +47,85 @@ export interface IGoal { ToolTip?: string; Icon: string; Tag: string; - Node: string; + Node?: string; MissionKeyName?: string; Reward?: IMissionReward; + ScoreVar?: string; + ScoreLocTag?: string; + HealthPct?: number; + Regions?: number[]; + OptionalInMission?: boolean; + UpgradeIds?: { $oid: string }[]; + Community?: boolean; + InterimGoals?: number[]; + InterimRewards?: { + credits: number; + xp: number; + items: string[]; + countedItems: never[]; + }[]; + Fomorian?: boolean; + VictimNode?: string; + Best?: boolean; + ScoreMaxTag?: string; + ScoreTagBlocksGuildTierChanges?: boolean; + Faction?: string; + RegionDrops?: string[]; + ArchwingDrops?: never[]; + MissionInfo?: { + missionType: string; + faction: string; + location: string; + levelOverride: string; + enemySpec: string; + minEnemyLevel: number; + maxEnemyLevel: number; + difficulty: number; + archwingRequired: boolean; + icon: string; + requiredItems: string[]; + consumeRequiredItems: boolean; + missionReward: { randomizedItems: string }; + vipAgent: string; + leadersAlwaysAllowed: boolean; + goalTag: string; + levelAuras: never[]; + }; + ContinuousHubEvent?: { + Transmissions: string[]; + Activation: { + $date: { + $numberLong: string; + }; + }; + Expiry: { + $date: { + $numberLong: string; + }; + }; + RepeatInterval: number; + }; + ClanGoal?: number[]; + ItemType?: string; + JobAffiliationTag?: string; + JobCurrentVersion?: { $oid: string }; + Jobs?: { + jobType: string; + rewards: string; + masteryReq: number; + minEnemyLevel: number; + maxEnemyLevel: number; + xpAmounts: number[]; + }[]; + JobPreviousVersion?: { $oid: string }; + PreviousJobs?: { + jobType: string; + rewards: string; + masteryReq: number; + minEnemyLevel: number; + maxEnemyLevel: number; + xpAmounts: number[]; + }[]; } export interface ISyndicateMissionInfo { diff --git a/static/fixed_responses/worldState/baro.json b/static/fixed_responses/worldState/baro.json index 2e0ae69e..cab52f8a 100644 --- a/static/fixed_responses/worldState/baro.json +++ b/static/fixed_responses/worldState/baro.json @@ -401,7 +401,43 @@ { "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/BaroKiTeerDecorationC", "PrimePrice": 100, "RegularPrice": 100000 }, { "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/PedistalPrime", "PrimePrice": 0, "RegularPrice": 1000000 }, { "ItemType": "/Lotus/StoreItems/Types/Items/Emotes/BaroEmote", "PrimePrice": 0, "RegularPrice": 1000000 }, - { "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/EventSniperReloadDamageMod", "PrimePrice": 2995, "RegularPrice": 1000000 } + { "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/EventSniperReloadDamageMod", "PrimePrice": 2995, "RegularPrice": 1000000 }, + { "ItemType": "/Lotus/StoreItems/Types/StoreItems/AvatarImages/AvatarImageAvaClemCommunityGlyph", "PrimePrice": 20, "RegularPrice": 33333 }, + { "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/TennoconConcert2025Display", "PrimePrice": 90, "RegularPrice": 125000 }, + { "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/SummerGameFestPoster", "PrimePrice": 90, "RegularPrice": 125000 }, + { "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/SummerGameFestPoster", "PrimePrice": 90, "RegularPrice": 125000 }, + { "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/RathuumEventPoster", "PrimePrice": 90, "RegularPrice": 125000 }, + { "ItemType": "/Lotus/StoreItems/Types/StoreItems/AvatarImages/Factions/GlyphFactionCorpus", "PrimePrice": 70, "RegularPrice": 55000 }, + { "ItemType": "/Lotus/StoreItems/Types/StoreItems/AvatarImages/Factions/GlyphFactionEntrati", "PrimePrice": 99, "RegularPrice": 1900 }, + { "ItemType": "/Lotus/StoreItems/Types/StoreItems/AvatarImages/Factions/GlyphFactionScaldra", "PrimePrice": 93, "RegularPrice": 1906 }, + { "ItemType": "/Lotus/StoreItems/Types/StoreItems/AvatarImages/Factions/GlyphFactionTechrot", "PrimePrice": 98, "RegularPrice": 1901 }, + { "ItemType": "/Lotus/StoreItems/Types/StoreItems/AvatarImages/Warframes/VorunaActionGlyph", "PrimePrice": 75, "RegularPrice": 60000 }, + { "ItemType": "/Lotus/StoreItems/Types/StoreItems/AvatarImages/AvatarImageVoidAngelBaro", "PrimePrice": 80, "RegularPrice": 50000 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Sigils/1999DrippySigil", "PrimePrice": 50, "RegularPrice": 45000 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Weapons/Rapier/CrpRapierSkin", "PrimePrice": 375, "RegularPrice": 400000 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Events/OgrisOldSchool", "PrimePrice": 350, "RegularPrice": 325000 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Skins/Sigils/PrismaLotusFlamesSigil", "PrimePrice": 55, "RegularPrice": 60000 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/EventSniperReloadDamageMod", "PrimePrice": 2995, "RegularPrice": 1000000 }, + { "ItemType": "/Lotus/StoreItems/Types/StoreItems/AvatarImages/AvatarImageAvaClemCommunityGlyph", "PrimePrice": 20, "RegularPrice": 33333 }, + { "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/TennoconConcert2025Display", "PrimePrice": 90, "RegularPrice": 125000 }, + { "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/SummerGameFestPoster", "PrimePrice": 90, "RegularPrice": 125000 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Melee/Expert/WeaponMeleeFactionDamageMurmursExpert", "PrimePrice": 375, "RegularPrice": 130000 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Pistol/Expert/WeaponRecoilReductionModExpert", "PrimePrice": 300, "RegularPrice": 220000 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/Expert/WeaponRecoilReductionModExpert", "PrimePrice": 300, "RegularPrice": 220000 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Shotgun/Expert/WeaponRecoilReductionModExpert", "PrimePrice": 300, "RegularPrice": 220000 }, + { "ItemType": "/Lotus/StoreItems/Types/Items/SongItems/TenthAnniversaryLoginSongItem", "PrimePrice": 145, "RegularPrice": 165000 }, + { "ItemType": "/Lotus/StoreItems/Types/Items/SongItems/AbyssofDagathSongItem", "PrimePrice": 150, "RegularPrice": 155000 }, + { "ItemType": "/Lotus/StoreItems/Types/Items/SongItems/ZarimanLoginSongItem", "PrimePrice": 160, "RegularPrice": 180000 }, + { "ItemType": "/Lotus/StoreItems/Types/Items/SongItems/DanteUnboundLoginSongItem", "PrimePrice": 150, "RegularPrice": 150000 }, + { "ItemType": "/Lotus/StoreItems/Types/Items/SongItems/EmpyreanSongItem", "PrimePrice": 160, "RegularPrice": 155000 }, + { "ItemType": "/Lotus/StoreItems/Types/Items/SongItems/DeimosLoginSongItem", "PrimePrice": 155, "RegularPrice": 160000 }, + { "ItemType": "/Lotus/StoreItems/Types/Items/SongItems/JadeShadowsLoginSongItem", "PrimePrice": 150, "RegularPrice": 170000 }, + { "ItemType": "/Lotus/StoreItems/Types/Items/SongItems/WhispersInTheWallLoginSongItem", "PrimePrice": 165, "RegularPrice": 170000 }, + { "ItemType": "/Lotus/StoreItems/Types/Items/SongItems/CorpusRailjackLoginSongItem", "PrimePrice": 150, "RegularPrice": 165000 }, + { "ItemType": "/Lotus/StoreItems/Types/Items/SongItems/LotusEatersSongItem", "PrimePrice": 165, "RegularPrice": 150000 }, + { "ItemType": "/Lotus/StoreItems/Types/Items/SongItems/KuvaLichLoginSongItem", "PrimePrice": 140, "RegularPrice": 170000 }, + { "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/Plushies/PlushyBaro", "PrimePrice": 100, "RegularPrice": 125000 }, + { "ItemType": "/Lotus/StoreItems/Types/Items/ShipDecos/Plushies/PlushyInaros", "PrimePrice": 120, "RegularPrice": 90000 } ], "allIfAny": [ [ diff --git a/static/webui/index.html b/static/webui/index.html index ba2c4b93..63d01392 100644 --- a/static/webui/index.html +++ b/static/webui/index.html @@ -922,6 +922,30 @@ +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
diff --git a/static/webui/translations/zh.js b/static/webui/translations/zh.js index bb000f25..7d2b0a68 100644 --- a/static/webui/translations/zh.js +++ b/static/webui/translations/zh.js @@ -239,7 +239,13 @@ dict = { worldState_affinityBoost: `经验加成`, worldState_resourceBoost: `资源加成`, worldState_starDays: `活动:星日`, + worldState_TennoCon: `TennoCon中继站`, + worldState_Fomorian: `破坏巨人战舰`, + worldState_BellyoftheBeast: `行动代号: 兽之腹`, worldState_galleonOfGhouls: `战术警报:尸鬼的帆船战舰`, + worldState_RecurringGhoul: `尸鬼净化`, + worldState_HeatFissures: `热美亚裂缝`, + worldState_BaroTennoCon: `虚空商人中继站`, disabled: `关闭/取消配置`, worldState_we1: `活动阶段:第一周`, worldState_we2: `活动阶段:第二周`,