XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFESpaceNinjaServer

A simple server for a small space ninja game

公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/XFESpaceNinjaServer

chore: move static world state data into controller (#4143)

Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/4143 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>

e313a97b
AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com>
提交于

代码差异

4 个文件 +287 -360
Modified src/controllers/dynamic/worldStateController.ts +1 -1
@@ -28,7 +28,7 @@ export const worldStateController: RequestHandler = async (req, res) => {
28 28 populateFissures(worldState)
29 29 ]);
30 30
31 if (req.query.l && worldState.Events) {
31 if (req.query.l) {
32 32 for (const event of worldState.Events) {
33 33 const msg = event.Messages.find(x => x.LanguageCode == req.query.l)?.Message ?? event.Msg;
34 34 if (msg) {
Modified src/services/worldStateService.ts +183 -20
@@ -1,4 +1,3 @@
1 import staticWorldState from "../../static/fixed_responses/worldState/worldState.json" with { type: "json" };
2 1 import baro from "../../static/fixed_responses/worldState/baro.json" with { type: "json" };
3 2 import varzia from "../constants/varzia.ts";
4 3 import fissureMissions from "../../static/fixed_responses/worldState/fissureMissions.json" with { type: "json" };
@@ -573,9 +572,9 @@ const pushSyndicateMissions = (
573 572 const dayStart = getSortieTime(day);
574 573 const dayEnd = getSortieTime(day + 1);
575 574 worldState.SyndicateMissions.push({
576 _id: { $oid: ((dayStart / 1000) & 0xffffffff).toString(16).padStart(8, "0") + idSuffix },
577 Activation: { $date: { $numberLong: dayStart.toString() } },
578 Expiry: { $date: { $numberLong: dayEnd.toString() } },
575 _id: toOid2(((dayStart / 1000) & 0xffffffff).toString(16).padStart(8, "0") + idSuffix, worldState.BuildLabel),
576 Activation: toMongoDate2(dayStart, worldState.BuildLabel),
577 Expiry: toMongoDate2(dayEnd, worldState.BuildLabel),
579 578 Tag: syndicateTag,
580 579 Seed: seed,
581 580 Nodes: nodes
@@ -1874,9 +1873,11 @@ export const getWorldState = (buildLabel: string = BL_LATEST): IWorldState => {
1874 1873 const defenseWavesPerRotation = version_compare(buildLabel, gameToBuildVersion["38.5.0"]) < 0 ? 5 : 3;
1875 1874
1876 1875 const worldState: IWorldState = {
1876 Version: 10,
1877 1877 BuildLabel: buildLabel,
1878 1878 Time: timeSecs,
1879 1879 Goals: [],
1880 Events: [],
1880 1881 Alerts: [],
1881 1882 Sorties: [],
1882 1883 LiteSorties: [],
@@ -1888,25 +1889,178 @@ export const getWorldState = (buildLabel: string = BL_LATEST): IWorldState => {
1888 1889 PrimeVaultTraders: [],
1889 1890 VoidStorms: [],
1890 1891 DailyDeals: [],
1891 //LibraryInfo: {},
1892 1892 //EndlessXpChoices: [],
1893 1893 //EndlessXpSchedule: [],
1894 1894 KnownCalendarSeasons: [],
1895 1895 PVPChallengeInstances: [],
1896 1896 FeaturedGuilds: [],
1897 1897 NodeOverrides: [],
1898 ...staticWorldState,
1899 SyndicateMissions: [...staticWorldState.SyndicateMissions],
1898 LibraryInfo: { LastCompletedTargetType: "/Lotus/Types/Game/Library/Targets/Research7Target" },
1899 PrimeVaultAvailabilities: [false, false, false, false, false],
1900 PrimeTokenAvailability: true,
1901 PrimeAccessAvailability: { State: "PRIME1" },
1902 PersistentEnemies: [],
1903 PVPAlternativeModes: [],
1904 PVPActiveTournaments: [],
1905 ConstructionProjects: [],
1906 ProjectPct: [0, 0, 0],
1907 TwitchPromos: [],
1908 ForceLogoutVersion: 0,
1909 ExperimentRecommended: [],
1910 SyndicateMissions: [],
1900 1911 InGameMarket: {
1901 1912 LandingPage: {
1902 Categories: staticWorldState.InGameMarket.LandingPage.Categories.map(c => ({
1903 ...c,
1904 Items: [...c.Items]
1905 }))
1913 Categories: [
1914 {
1915 CategoryName: "NEW_PLAYER",
1916 Name: "/Lotus/Language/Store/NewPlayerCategoryTitle",
1917 Icon: "newplayer",
1918 AddToMenu: true,
1919 Items: [
1920 "/Lotus/Types/StoreItems/Packages/2024Bundles/WeaponStarterPack",
1921 "/Lotus/StoreItems/Powersuits/MonkeyKing/MonkeyKing",
1922 "/Lotus/StoreItems/Weapons/Tenno/Melee/SwordsAndBoards/MeleeContestWinnerOne/TennoSwordShield",
1923 "/Lotus/StoreItems/Upgrades/Skins/Effects/WerewolfEphemera",
1924 "/Lotus/StoreItems/Types/StoreItems/SlotItems/TwoWeaponSlotItem",
1925 "/Lotus/StoreItems/Powersuits/Wisp/Wisp",
1926 "/Lotus/StoreItems/Weapons/Tenno/Shotgun/Shotgun",
1927 "/Lotus/StoreItems/Powersuits/Rhino/Rhino",
1928 "/Lotus/StoreItems/Weapons/Corpus/Pistols/CrpAirPistol/CrpAirPistolArray",
1929 "/Lotus/Types/StoreItems/Boosters/AffinityBooster3DayStoreItem"
1930 ]
1931 },
1932 {
1933 CategoryName: "NEW",
1934 Name: "/Lotus/Language/Menu/Store_New",
1935 Icon: "new",
1936 Items: []
1937 },
1938 {
1939 CategoryName: "POPULAR",
1940 Name: "/Lotus/Language/Menu/StorePopular",
1941 Icon: "popular",
1942 AddToMenu: true,
1943 Items: [
1944 "/Lotus/Types/StoreItems/Packages/2025Bundles/TC2025DigitalPack",
1945 "/Lotus/Types/StoreItems/Packages/2025Bundles/EncoreCompSupPack",
1946 "/Lotus/Types/StoreItems/Packages/2025Bundles/EncoreGeminiSupPack",
1947 "/Lotus/Types/StoreItems/Packages/WarframeBundles/TempleItemsBundle",
1948 "/Lotus/Types/StoreItems/Packages/FormaPack",
1949 "/Lotus/StoreItems/Upgrades/Skins/Saryn/WF1999SarynSkin",
1950 "/Lotus/StoreItems/Weapons/Tenno/Melee/Swords/DaxDuviriKatana/DaxDuviriKatanaWeapon",
1951 "/Lotus/StoreItems/Upgrades/Skins/Jade/WF1999NyxSkin",
1952 "/Lotus/StoreItems/Types/StoreItems/SuitCustomizations/NinjaColourPickerItem",
1953 "/Lotus/StoreItems/Upgrades/Skins/Mag/WF1999MagSkin",
1954 "/Lotus/StoreItems/Upgrades/Skins/Frost/WF1999FrostSkin",
1955 "/Lotus/StoreItems/Weapons/Tenno/Melee/Swords/DaxDuviriTwoHandedKatana/DaxDuviriTwoHandedKatanaWeapon",
1956 "/Lotus/StoreItems/Upgrades/Skins/Harlequin/MirageDeluxeSkin",
1957 "/Lotus/StoreItems/Weapons/Tenno/Melee/Hammer/DaxDuviriHammer/DaxDuviriHammerWeapon"
1958 ]
1959 },
1960 {
1961 CategoryName: "SEASONAL",
1962 Name: "/Lotus/Language/Store/SeasonalCategoryTitle",
1963 Icon: "seasonal",
1964 AddToMenu: true,
1965 Items: []
1966 },
1967 {
1968 CategoryName: "COMMUNITY",
1969 Name: "/Lotus/Language/Store/CommunityCategoryTitle",
1970 Icon: "community",
1971 AddToMenu: true,
1972 Items: []
1973 },
1974 {
1975 CategoryName: "HEIRLOOM",
1976 Name: "/Lotus/Language/Store/HeirloomCategoryTitle",
1977 Icon: "heirloom",
1978 AddToMenu: true,
1979 Items: [
1980 "/Lotus/StoreItems/Upgrades/Skins/Berserker/ValkyrHeirloomSkin",
1981 "/Lotus/StoreItems/Upgrades/Skins/Crowns/HeirloomValkyrCrown",
1982 "/Lotus/StoreItems/Types/StoreItems/SuitCustomizations/ColourPickerValkyrHeirloom",
1983 "/Lotus/StoreItems/Types/Items/ShipDecos/TarotCardValkyrHeirloom",
1984 "/Lotus/StoreItems/Types/StoreItems/AvatarImages/HeirloomValkyrGlyph",
1985 "/Lotus/StoreItems/Upgrades/Skins/Sigils/HeirloomValkyrSigil",
1986 "/Lotus/Types/StoreItems/Packages/HeirloomPackRhino",
1987 "/Lotus/StoreItems/Upgrades/Skins/Rhino/RhinoHeirloomSkin",
1988 "/Lotus/StoreItems/Upgrades/Skins/Crowns/HeirloomRhinoCrown",
1989 "/Lotus/StoreItems/Types/StoreItems/SuitCustomizations/ColourPickerRhinoHeirloom",
1990 "/Lotus/StoreItems/Types/Items/ShipDecos/TarotCardRhinoHeirloom",
1991 "/Lotus/StoreItems/Types/StoreItems/AvatarImages/HeirloomRhinoGlyph",
1992 "/Lotus/StoreItems/Upgrades/Skins/Sigils/HeirloomRhinoSigil",
1993 "/Lotus/Types/StoreItems/Packages/HeirloomPackEmber",
1994 "/Lotus/StoreItems/Upgrades/Skins/Ember/EmberHeirloomSkin",
1995 "/Lotus/StoreItems/Upgrades/Skins/Crowns/HeirloomEmberCrown",
1996 "/Lotus/StoreItems/Types/StoreItems/SuitCustomizations/ColourPickerEmberHeirloom",
1997 "/Lotus/StoreItems/Types/Items/ShipDecos/TarotCardEmberHeirloom",
1998 "/Lotus/StoreItems/Types/StoreItems/AvatarImages/HeirloomEmberGlyph",
1999 "/Lotus/StoreItems/Upgrades/Skins/Sigils/HeirloomEmberSigil"
2000 ]
2001 },
2002 {
2003 CategoryName: "TENNOGEN",
2004 Name: "/Lotus/Language/Menu/Store_Tennogen",
2005 Icon: "tennogen",
2006 AddToMenu: true,
2007 Items: [
2008 "/Lotus/StoreItems/Upgrades/Skins/Armor/SWEndocitosShoulderArmor/SWEndocitosShoulderArmorA",
2009 "/Lotus/StoreItems/Upgrades/Skins/Scarves/SWLunariusSyandana",
2010 "/Lotus/StoreItems/Upgrades/Skins/Scarves/SWRauSyandana",
2011 "/Lotus/StoreItems/Upgrades/Skins/Hoplite/SWStyanaxHuzarrSkin",
2012 "/Lotus/StoreItems/Upgrades/Skins/Werewolf/VorunaDemionnaSkin"
2013 ]
2014 },
2015 {
2016 CategoryName: "SALE",
2017 Name: "/Lotus/Language/Menu/Store_Sale",
2018 Icon: "sale",
2019 AddToMenu: true,
2020 Items: []
2021 },
2022 {
2023 CategoryName: "WISH_LIST",
2024 Name: "/Lotus/Language/Menu/Store_Wishlist",
2025 Icon: "wishlist",
2026 Items: []
2027 },
2028 {
2029 CategoryName: "QUICK_BUY",
2030 Name: "/Lotus/Language/Store/TopSeller_Title",
2031 Icon: "quickbuy",
2032 Items: [
2033 "/Lotus/Types/StoreItems/Packages/FormaPack",
2034 "/Lotus/StoreItems/Types/Items/MiscItems/OrokinCatalyst",
2035 "/Lotus/StoreItems/Types/Items/MiscItems/WeaponUtilityUnlocker"
2036 ]
2037 }
2038 ]
1906 2039 }
1907 2040 }
1908 2041 };
1909 2042
2043 worldState.Events.push({
2044 Msg: "Join the OpenWF Discord!",
2045 Messages: [
2046 { LanguageCode: "fr", Message: "Rejoignez le Discord OpenWF!" },
2047 { LanguageCode: "it", Message: "Unisciti al Discord di OpenWF!" },
2048 { LanguageCode: "de", Message: "Trete dem OpenWF Discord bei!" },
2049 { LanguageCode: "es", Message: "Únete al Discord de OpenWF!" },
2050 { LanguageCode: "pt", Message: "Junte-se ao Discord do OpenWF!" },
2051 { LanguageCode: "ru", Message: "Присоединяйтесь к OpenWF Discord!" },
2052 { LanguageCode: "pl", Message: "Dołącz do Discord OpenWF!" },
2053 { LanguageCode: "uk", Message: "Приєднуйтесь до OpenWF Discord!" },
2054 { LanguageCode: "tr", Message: "OpenWF Discord'a katıl!" },
2055 { LanguageCode: "ja", Message: "OpenWFのDiscordに参加しよう!" },
2056 { LanguageCode: "zh", Message: "加入OpenWF Discord!" },
2057 { LanguageCode: "ko", Message: "OpenWF Discord에 가입하세요!" },
2058 { LanguageCode: "tc", Message: "加入OpenWF Discord!" }
2059 ],
2060 Prop: "https://discord.gg/PNNZ3asUuY",
2061 Icon: "/Lotus/Interface/Icons/DiscordIconNoBacker.png"
2062 });
2063
1910 2064 if (config.worldState?.tennoLiveRelay) {
1911 2065 worldState.Goals.push({
1912 2066 _id: toOid2("687bf9400000000000000000", buildLabel),
@@ -3894,25 +4048,34 @@ export const getWorldState = (buildLabel: string = BL_LATEST): IWorldState => {
3894 4048 const bountyCycleStart = Math.trunc((bountyEpoch + bountyCycle * eidolonCycleDuration) * 1000);
3895 4049 bountyCycleEnd = Math.trunc(bountyCycleStart + eidolonCycleDuration * 1000);
3896 4050 worldState.SyndicateMissions.push({
3897 _id: { $oid: ((bountyCycleStart / 1000) & 0xffffffff).toString(16).padStart(8, "0") + "0000000000000029" },
3898 Activation: { $date: { $numberLong: bountyCycleStart.toString() } },
3899 Expiry: { $date: { $numberLong: bountyCycleEnd.toString() } },
4051 _id: toOid2(
4052 ((bountyCycleStart / 1000) & 0xffffffff).toString(16).padStart(8, "0") + "0000000000000029",
4053 buildLabel
4054 ),
4055 Activation: toMongoDate2(bountyCycleStart, buildLabel),
4056 Expiry: toMongoDate2(bountyCycleEnd, buildLabel),
3900 4057 Tag: "ZarimanSyndicate",
3901 4058 Seed: bountyCycle,
3902 4059 Nodes: []
3903 4060 });
3904 4061 worldState.SyndicateMissions.push({
3905 _id: { $oid: ((bountyCycleStart / 1000) & 0xffffffff).toString(16).padStart(8, "0") + "0000000000000004" },
3906 Activation: { $date: { $numberLong: bountyCycleStart.toString() } },
3907 Expiry: { $date: { $numberLong: bountyCycleEnd.toString() } },
4062 _id: toOid2(
4063 ((bountyCycleStart / 1000) & 0xffffffff).toString(16).padStart(8, "0") + "0000000000000004",
4064 buildLabel
4065 ),
4066 Activation: toMongoDate2(bountyCycleStart, buildLabel),
4067 Expiry: toMongoDate2(bountyCycleEnd, buildLabel),
3908 4068 Tag: "EntratiLabSyndicate",
3909 4069 Seed: bountyCycle,
3910 4070 Nodes: []
3911 4071 });
3912 4072 worldState.SyndicateMissions.push({
3913 _id: { $oid: ((bountyCycleStart / 1000) & 0xffffffff).toString(16).padStart(8, "0") + "0000000000000006" },
3914 Activation: { $date: { $numberLong: bountyCycleStart.toString(10) } },
3915 Expiry: { $date: { $numberLong: bountyCycleEnd.toString(10) } },
4073 _id: toOid2(
4074 ((bountyCycleStart / 1000) & 0xffffffff).toString(16).padStart(8, "0") + "0000000000000006",
4075 buildLabel
4076 ),
4077 Activation: toMongoDate2(bountyCycleStart, buildLabel),
4078 Expiry: toMongoDate2(bountyCycleEnd, buildLabel),
3916 4079 Tag: "HexSyndicate",
3917 4080 Seed: bountyCycle,
3918 4081 Nodes: []
Modified src/types/worldStateTypes.ts +103 -6
@@ -8,7 +8,7 @@ export interface IWorldState {
8 8 MobileVersion?: string; // if present, the companion app may show a warning about being out of date
9 9 BuildLabel: string;
10 10 Time: number;
11 Events?: IEvent[];
11 Events: IEvent[];
12 12 Goals: IGoal[];
13 13 Alerts: IAlert[];
14 14 Sorties: ISortie[];
@@ -50,6 +50,17 @@ export interface IWorldState {
50 50 KnownCalendarSeasons: ICalendarSeason[];
51 51 Conquests?: IConquest[];
52 52 Descents?: IDescent[];
53 PrimeVaultAvailabilities: boolean[]; // different in older versions
54 PrimeAccessAvailability: { State: string };
55 PrimeTokenAvailability: boolean;
56 PersistentEnemies: IPersistentEnemy[];
57 PVPAlternativeModes: IPVPAltMode[];
58 PVPActiveTournaments: IPVPTournament[];
59 ConstructionProjects: IConstructionProject[];
60 TwitchPromos: { startDate: IMongoDateWithLegacySupport; endDate: IMongoDateWithLegacySupport; type: string }[];
61 ProjectPct: [number, number, number];
62 ForceLogoutVersion: number;
63 ExperimentRecommended: never[]; // idk proper type
53 64 Tmp?: string;
54 65 }
55 66
@@ -75,8 +86,8 @@ interface IEvent {
75 86
76 87 export interface IAlert {
77 88 _id: IOidWithLegacySupport;
78 Activation: IMongoDate;
79 Expiry: IMongoDate;
89 Activation: IMongoDateWithLegacySupport;
90 Expiry: IMongoDateWithLegacySupport;
80 91 MissionInfo: IAlertMissionInfo;
81 92 Tag?: string;
82 93 Icon?: string;
@@ -196,9 +207,9 @@ export interface ISyndicateJob {
196 207 }
197 208
198 209 export interface ISyndicateMissionInfo {
199 _id: IOid;
200 Activation: IMongoDate;
201 Expiry: IMongoDate;
210 _id: IOidWithLegacySupport;
211 Activation: IMongoDateWithLegacySupport;
212 Expiry: IMongoDateWithLegacySupport;
202 213 Tag: string;
203 214 Seed: number;
204 215 Nodes: string[];
@@ -593,3 +604,89 @@ interface IConquestOverride {
593 604 c?: [string, string][];
594 605 fv?: string[];
595 606 }
607
608 interface IPersistentEnemy {
609 _id: IOidWithLegacySupport;
610 StartTime: IMongoDateWithLegacySupport;
611 AgentType: string;
612 LocTag: string;
613 Icon: string;
614 Rank: number;
615 HealthPercent: number;
616 FleeDamage: number;
617 UseTicketing: boolean;
618 Region: number;
619 Discovered: boolean;
620 LastDiscoveredLocation: string; // SolNode
621 LastDiscoveredTime: IMongoDateWithLegacySupport;
622
623 // I'm not sure about that - it's not in the ws archives, but the game does parse those fields
624 EnhancementIndex?: number;
625 LeaderWeaponType?: string;
626 MinionAgentTypes?: string[];
627 MinionWeaponTypes?: string[];
628 }
629
630 interface IPVPAltMode {
631 TargetMode: string;
632
633 TitleLoc: string;
634 DescriptionLoc: string;
635
636 DisableEnergyPickups: boolean;
637 DisableEnergySurge: boolean;
638 DisableAmmoPickups: boolean;
639 DisableWeaponSwitching: boolean;
640 DisableWeaponHud: boolean;
641 ForceChangeLoadoutOnDeath: boolean;
642
643 MatchTimeOverride: number;
644 EnergyCapOverride: number;
645 MaxPlayersOverride: number;
646 MinPlayersPerTeamOverride: number;
647 MaxTeamCountDifferenceOverride: number;
648
649 WeaponOverrides: IPVPAltModeWeaponOverride[];
650 MeleeWeaponOverride: IPVPAltModeMeleeOverride;
651 }
652
653 interface IPVPAltModeWeaponOverride {
654 Override: boolean;
655 UseFirstAsDefault: boolean;
656 Resources: string[];
657 OriginalVersions: string[];
658 }
659
660 interface IPVPAltModeMeleeOverride extends IPVPAltModeWeaponOverride {
661 IsModularMeleeWeapon: boolean;
662 BalancesPool: string[];
663 HandlesPool: string[];
664 TipsPool: string[];
665 }
666
667 interface IPVPTournament {
668 TargetMode: string;
669 StartDate: IMongoDateWithLegacySupport;
670 EndDate: IMongoDateWithLegacySupport;
671 Week: number;
672 Season: number;
673 }
674
675 interface IConstructionProject {
676 Tag: string;
677 Node: string;
678 Activation: IMongoDateWithLegacySupport;
679 EarlyAccess: IMongoDateWithLegacySupport;
680 PublicAccess: IMongoDateWithLegacySupport;
681 Completed: boolean;
682 Phases: IConstructionPhase[];
683 }
684
685 interface IConstructionPhase {
686 GoalId: IOidWithLegacySupport;
687 Option0: number; // ???
688 Option1: number; // ???
689 RequiredCount: number;
690 RequiredCountGuild: [{ Tier: string }, { Tier: string }, { Tier: string }]; // ???
691 ClanResearchRecipe: string;
692 }
Deleted static/fixed_responses/worldState/worldState.json +0 -333
@@ -1,333 +0,0 @@
1 {
2 "Version": 10,
3 "Events": [
4 {
5 "Msg": "Join the OpenWF Discord!",
6 "Messages": [
7 { "LanguageCode": "fr", "Message": "Rejoignez le Discord OpenWF!" },
8 { "LanguageCode": "it", "Message": "Unisciti al Discord di OpenWF!" },
9 { "LanguageCode": "de", "Message": "Trete dem OpenWF Discord bei!" },
10 { "LanguageCode": "es", "Message": "Únete al Discord de OpenWF!" },
11 { "LanguageCode": "pt", "Message": "Junte-se ao Discord do OpenWF!" },
12 { "LanguageCode": "ru", "Message": "Присоединяйтесь к OpenWF Discord!" },
13 { "LanguageCode": "pl", "Message": "Dołącz do Discord OpenWF!" },
14 { "LanguageCode": "uk", "Message": "Приєднуйтесь до OpenWF Discord!" },
15 { "LanguageCode": "tr", "Message": "OpenWF Discord'a katıl!" },
16 { "LanguageCode": "ja", "Message": "OpenWFのDiscordに参加しよう!" },
17 { "LanguageCode": "zh", "Message": "加入OpenWF Discord!" },
18 { "LanguageCode": "ko", "Message": "OpenWF Discord에 가입하세요!" },
19 { "LanguageCode": "tc", "Message": "加入OpenWF Discord!" }
20 ],
21 "Prop": "https://discord.gg/PNNZ3asUuY",
22 "Icon": "/Lotus/Interface/Icons/DiscordIconNoBacker.png"
23 }
24 ],
25 "InGameMarket": {
26 "LandingPage": {
27 "Categories": [
28 {
29 "CategoryName": "NEW_PLAYER",
30 "Name": "/Lotus/Language/Store/NewPlayerCategoryTitle",
31 "Icon": "newplayer",
32 "AddToMenu": true,
33 "Items": [
34 "/Lotus/Types/StoreItems/Packages/2024Bundles/WeaponStarterPack",
35 "/Lotus/StoreItems/Powersuits/MonkeyKing/MonkeyKing",
36 "/Lotus/StoreItems/Weapons/Tenno/Melee/SwordsAndBoards/MeleeContestWinnerOne/TennoSwordShield",
37 "/Lotus/StoreItems/Upgrades/Skins/Effects/WerewolfEphemera",
38 "/Lotus/StoreItems/Types/StoreItems/SlotItems/TwoWeaponSlotItem",
39 "/Lotus/StoreItems/Powersuits/Wisp/Wisp",
40 "/Lotus/StoreItems/Weapons/Tenno/Shotgun/Shotgun",
41 "/Lotus/StoreItems/Powersuits/Rhino/Rhino",
42 "/Lotus/StoreItems/Weapons/Corpus/Pistols/CrpAirPistol/CrpAirPistolArray",
43 "/Lotus/Types/StoreItems/Boosters/AffinityBooster3DayStoreItem"
44 ]
45 },
46 {
47 "CategoryName": "NEW",
48 "Name": "/Lotus/Language/Menu/Store_New",
49 "Icon": "new",
50 "Items": []
51 },
52 {
53 "CategoryName": "POPULAR",
54 "Name": "/Lotus/Language/Menu/StorePopular",
55 "Icon": "popular",
56 "AddToMenu": true,
57 "Items": [
58 "/Lotus/Types/StoreItems/Packages/2025Bundles/TC2025DigitalPack",
59 "/Lotus/Types/StoreItems/Packages/2025Bundles/EncoreCompSupPack",
60 "/Lotus/Types/StoreItems/Packages/2025Bundles/EncoreGeminiSupPack",
61 "/Lotus/Types/StoreItems/Packages/WarframeBundles/TempleItemsBundle",
62 "/Lotus/Types/StoreItems/Packages/FormaPack",
63 "/Lotus/StoreItems/Upgrades/Skins/Saryn/WF1999SarynSkin",
64 "/Lotus/StoreItems/Weapons/Tenno/Melee/Swords/DaxDuviriKatana/DaxDuviriKatanaWeapon",
65 "/Lotus/StoreItems/Upgrades/Skins/Jade/WF1999NyxSkin",
66 "/Lotus/StoreItems/Types/StoreItems/SuitCustomizations/NinjaColourPickerItem",
67 "/Lotus/StoreItems/Upgrades/Skins/Mag/WF1999MagSkin",
68 "/Lotus/StoreItems/Upgrades/Skins/Frost/WF1999FrostSkin",
69 "/Lotus/StoreItems/Weapons/Tenno/Melee/Swords/DaxDuviriTwoHandedKatana/DaxDuviriTwoHandedKatanaWeapon",
70 "/Lotus/StoreItems/Upgrades/Skins/Harlequin/MirageDeluxeSkin",
71 "/Lotus/StoreItems/Weapons/Tenno/Melee/Hammer/DaxDuviriHammer/DaxDuviriHammerWeapon"
72 ]
73 },
74 {
75 "CategoryName": "SEASONAL",
76 "Name": "/Lotus/Language/Store/SeasonalCategoryTitle",
77 "Icon": "seasonal",
78 "AddToMenu": true,
79 "Items": []
80 },
81 {
82 "CategoryName": "COMMUNITY",
83 "Name": "/Lotus/Language/Store/CommunityCategoryTitle",
84 "Icon": "community",
85 "AddToMenu": true,
86 "Items": []
87 },
88 {
89 "CategoryName": "HEIRLOOM",
90 "Name": "/Lotus/Language/Store/HeirloomCategoryTitle",
91 "Icon": "heirloom",
92 "AddToMenu": true,
93 "Items": [
94 "/Lotus/StoreItems/Upgrades/Skins/Berserker/ValkyrHeirloomSkin",
95 "/Lotus/StoreItems/Upgrades/Skins/Crowns/HeirloomValkyrCrown",
96 "/Lotus/StoreItems/Types/StoreItems/SuitCustomizations/ColourPickerValkyrHeirloom",
97 "/Lotus/StoreItems/Types/Items/ShipDecos/TarotCardValkyrHeirloom",
98 "/Lotus/StoreItems/Types/StoreItems/AvatarImages/HeirloomValkyrGlyph",
99 "/Lotus/StoreItems/Upgrades/Skins/Sigils/HeirloomValkyrSigil",
100 "/Lotus/Types/StoreItems/Packages/HeirloomPackRhino",
101 "/Lotus/StoreItems/Upgrades/Skins/Rhino/RhinoHeirloomSkin",
102 "/Lotus/StoreItems/Upgrades/Skins/Crowns/HeirloomRhinoCrown",
103 "/Lotus/StoreItems/Types/StoreItems/SuitCustomizations/ColourPickerRhinoHeirloom",
104 "/Lotus/StoreItems/Types/Items/ShipDecos/TarotCardRhinoHeirloom",
105 "/Lotus/StoreItems/Types/StoreItems/AvatarImages/HeirloomRhinoGlyph",
106 "/Lotus/StoreItems/Upgrades/Skins/Sigils/HeirloomRhinoSigil",
107 "/Lotus/Types/StoreItems/Packages/HeirloomPackEmber",
108 "/Lotus/StoreItems/Upgrades/Skins/Ember/EmberHeirloomSkin",
109 "/Lotus/StoreItems/Upgrades/Skins/Crowns/HeirloomEmberCrown",
110 "/Lotus/StoreItems/Types/StoreItems/SuitCustomizations/ColourPickerEmberHeirloom",
111 "/Lotus/StoreItems/Types/Items/ShipDecos/TarotCardEmberHeirloom",
112 "/Lotus/StoreItems/Types/StoreItems/AvatarImages/HeirloomEmberGlyph",
113 "/Lotus/StoreItems/Upgrades/Skins/Sigils/HeirloomEmberSigil"
114 ]
115 },
116 {
117 "CategoryName": "TENNOGEN",
118 "Name": "/Lotus/Language/Menu/Store_Tennogen",
119 "Icon": "tennogen",
120 "AddToMenu": true,
121 "Items": [
122 "/Lotus/StoreItems/Upgrades/Skins/Armor/SWEndocitosShoulderArmor/SWEndocitosShoulderArmorA",
123 "/Lotus/StoreItems/Upgrades/Skins/Scarves/SWLunariusSyandana",
124 "/Lotus/StoreItems/Upgrades/Skins/Scarves/SWRauSyandana",
125 "/Lotus/StoreItems/Upgrades/Skins/Hoplite/SWStyanaxHuzarrSkin",
126 "/Lotus/StoreItems/Upgrades/Skins/Werewolf/VorunaDemionnaSkin"
127 ]
128 },
129 {
130 "CategoryName": "SALE",
131 "Name": "/Lotus/Language/Menu/Store_Sale",
132 "Icon": "sale",
133 "AddToMenu": true,
134 "Items": []
135 },
136 {
137 "CategoryName": "WISH_LIST",
138 "Name": "/Lotus/Language/Menu/Store_Wishlist",
139 "Icon": "wishlist",
140 "Items": []
141 },
142 {
143 "CategoryName": "QUICK_BUY",
144 "Name": "/Lotus/Language/Store/TopSeller_Title",
145 "Icon": "quickbuy",
146 "Items": ["/Lotus/Types/StoreItems/Packages/FormaPack", "/Lotus/StoreItems/Types/Items/MiscItems/OrokinCatalyst", "/Lotus/StoreItems/Types/Items/MiscItems/WeaponUtilityUnlocker"]
147 }
148 ]
149 }
150 },
151 "SyndicateMissions": [
152 {
153 "_id": { "$oid": "663a4fc5ba6f84724fa4804c" },
154 "Activation": { "$date": { "$numberLong": "1715097541439" } },
155 "Expiry": { "$date": { "$numberLong": "2000000000000" } },
156 "Tag": "EventSyndicate",
157 "Seed": 47385,
158 "Nodes": []
159 },
160 {
161 "_id": { "$oid": "663a4fc5ba6f84724fa4804b" },
162 "Activation": { "$date": { "$numberLong": "1715097541439" } },
163 "Expiry": { "$date": { "$numberLong": "2000000000000" } },
164 "Tag": "NecraloidSyndicate",
165 "Seed": 73038,
166 "Nodes": []
167 },
168 {
169 "_id": { "$oid": "663a4fc5ba6f84724fa4804d" },
170 "Activation": { "$date": { "$numberLong": "1715097541439" } },
171 "Expiry": { "$date": { "$numberLong": "2000000000000" } },
172 "Tag": "KahlSyndicate",
173 "Seed": 50102,
174 "Nodes": []
175 },
176 {
177 "_id": { "$oid": "663a4fc5ba6f84724fa4804f" },
178 "Activation": { "$date": { "$numberLong": "1715097541439" } },
179 "Expiry": { "$date": { "$numberLong": "2000000000000" } },
180 "Tag": "QuillsSyndicate",
181 "Seed": 77721,
182 "Nodes": []
183 },
184 {
185 "_id": { "$oid": "663a4fc5ba6f84724fa48052" },
186 "Activation": { "$date": { "$numberLong": "1715097541439" } },
187 "Expiry": { "$date": { "$numberLong": "2000000000000" } },
188 "Tag": "RadioLegion3Syndicate",
189 "Seed": 95995,
190 "Nodes": []
191 },
192 {
193 "_id": { "$oid": "663a4fc5ba6f84724fa48051" },
194 "Activation": { "$date": { "$numberLong": "1715097541439" } },
195 "Expiry": { "$date": { "$numberLong": "2000000000000" } },
196 "Tag": "RadioLegion2Syndicate",
197 "Seed": 32091,
198 "Nodes": []
199 },
200 {
201 "_id": { "$oid": "663a4fc5ba6f84724fa48053" },
202 "Activation": { "$date": { "$numberLong": "1715097541439" } },
203 "Expiry": { "$date": { "$numberLong": "2000000000000" } },
204 "Tag": "RadioLegionIntermission10Syndicate",
205 "Seed": 74072,
206 "Nodes": []
207 },
208 {
209 "_id": { "$oid": "663a4fc5ba6f84724fa48060" },
210 "Activation": { "$date": { "$numberLong": "1715097541439" } },
211 "Expiry": { "$date": { "$numberLong": "2000000000000" } },
212 "Tag": "RadioLegionIntermission11Syndicate",
213 "Seed": 353,
214 "Nodes": []
215 },
216 {
217 "_id": { "$oid": "663a4fc5ba6f84724fa48060" },
218 "Activation": { "$date": { "$numberLong": "1715097541439" } },
219 "Expiry": { "$date": { "$numberLong": "2000000000000" } },
220 "Tag": "RadioLegionIntermission12Syndicate",
221 "Seed": 353,
222 "Nodes": []
223 },
224 {
225 "_id": { "$oid": "663a4fc5ba6f84724fa48057" },
226 "Activation": { "$date": { "$numberLong": "1715097541439" } },
227 "Expiry": { "$date": { "$numberLong": "2000000000000" } },
228 "Tag": "RadioLegionIntermission5Syndicate",
229 "Seed": 95997,
230 "Nodes": []
231 },
232 {
233 "_id": { "$oid": "663a4fc5ba6f84724fa48055" },
234 "Activation": { "$date": { "$numberLong": "1715097541439" } },
235 "Expiry": { "$date": { "$numberLong": "2000000000000" } },
236 "Tag": "RadioLegionIntermission3Syndicate",
237 "Seed": 71506,
238 "Nodes": []
239 },
240 {
241 "_id": { "$oid": "663a4fc5ba6f84724fa48056" },
242 "Activation": { "$date": { "$numberLong": "1715097541439" } },
243 "Expiry": { "$date": { "$numberLong": "2000000000000" } },
244 "Tag": "RadioLegionIntermission4Syndicate",
245 "Seed": 97653,
246 "Nodes": []
247 },
248 {
249 "_id": { "$oid": "663a4fc5ba6f84724fa48054" },
250 "Activation": { "$date": { "$numberLong": "1715097541439" } },
251 "Expiry": { "$date": { "$numberLong": "2000000000000" } },
252 "Tag": "RadioLegionIntermission2Syndicate",
253 "Seed": 64160,
254 "Nodes": []
255 },
256 {
257 "_id": { "$oid": "663a4fc5ba6f84724fa48058" },
258 "Activation": { "$date": { "$numberLong": "1715097541439" } },
259 "Expiry": { "$date": { "$numberLong": "2000000000000" } },
260 "Tag": "RadioLegionIntermission6Syndicate",
261 "Seed": 94007,
262 "Nodes": []
263 },
264 {
265 "_id": { "$oid": "663a4fc5ba6f84724fa4805c" },
266 "Activation": { "$date": { "$numberLong": "1715097541439" } },
267 "Expiry": { "$date": { "$numberLong": "2000000000000" } },
268 "Tag": "RadioLegionIntermissionSyndicate",
269 "Seed": 69122,
270 "Nodes": []
271 },
272 {
273 "_id": { "$oid": "663a4fc5ba6f84724fa4805a" },
274 "Activation": { "$date": { "$numberLong": "1715097541439" } },
275 "Expiry": { "$date": { "$numberLong": "2000000000000" } },
276 "Tag": "RadioLegionIntermission8Syndicate",
277 "Seed": 69270,
278 "Nodes": []
279 },
280 {
281 "_id": { "$oid": "663a4fc5ba6f84724fa4805b" },
282 "Activation": { "$date": { "$numberLong": "1715097541439" } },
283 "Expiry": { "$date": { "$numberLong": "2000000000000" } },
284 "Tag": "RadioLegionIntermission9Syndicate",
285 "Seed": 5166,
286 "Nodes": []
287 },
288 {
289 "_id": { "$oid": "663a4fc5ba6f84724fa48059" },
290 "Activation": { "$date": { "$numberLong": "1715097541439" } },
291 "Expiry": { "$date": { "$numberLong": "2000000000000" } },
292 "Tag": "RadioLegionIntermission7Syndicate",
293 "Seed": 82114,
294 "Nodes": []
295 },
296 {
297 "_id": { "$oid": "663a4fc5ba6f84724fa4805d" },
298 "Activation": { "$date": { "$numberLong": "1715097541439" } },
299 "Expiry": { "$date": { "$numberLong": "2000000000000" } },
300 "Tag": "RadioLegionSyndicate",
301 "Seed": 25645,
302 "Nodes": []
303 },
304 {
305 "_id": { "$oid": "663a4fc5ba6f84724fa4805f" },
306 "Activation": { "$date": { "$numberLong": "1715097541439" } },
307 "Expiry": { "$date": { "$numberLong": "2000000000000" } },
308 "Tag": "VentKidsSyndicate",
309 "Seed": 67257,
310 "Nodes": []
311 },
312 {
313 "_id": { "$oid": "663a4fc5ba6f84724fa48060" },
314 "Activation": { "$date": { "$numberLong": "1715097541439" } },
315 "Expiry": { "$date": { "$numberLong": "2000000000000" } },
316 "Tag": "VoxSyndicate",
317 "Seed": 77972,
318 "Nodes": []
319 }
320 ],
321 "PrimeAccessAvailability": { "State": "PRIME1" },
322 "PrimeVaultAvailabilities": [false, false, false, false, false],
323 "PrimeTokenAvailability": true,
324 "LibraryInfo": { "LastCompletedTargetType": "/Lotus/Types/Game/Library/Targets/Research7Target" },
325 "PersistentEnemies": [],
326 "PVPAlternativeModes": [],
327 "PVPActiveTournaments": [],
328 "ProjectPct": [47.16325544797147, 70.88794362074432, 0],
329 "ConstructionProjects": [],
330 "TwitchPromos": [],
331 "ExperimentRecommended": [],
332 "ForceLogoutVersion": 0
333 }