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

SpaceNinjaServer

A simple server for a small space ninja game

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

XFEstudio/SpaceNinjaServer

chore: split worldState stuff into types & service (#1548)

Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1548 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>

9f727789
Sainan <63328889+Sainan@users.noreply.github.com>
提交于

代码差异

4 个文件 +685 -690
Deleted src/helpers/worldStateHelper.ts +0 -84
@@ -1,84 +0,0 @@
1 export const sortieBosses = [
2 "SORTIE_BOSS_HYENA",
3 "SORTIE_BOSS_KELA",
4 "SORTIE_BOSS_VOR",
5 "SORTIE_BOSS_RUK",
6 "SORTIE_BOSS_HEK",
7 "SORTIE_BOSS_KRIL",
8 "SORTIE_BOSS_TYL",
9 "SORTIE_BOSS_JACKAL",
10 "SORTIE_BOSS_ALAD",
11 "SORTIE_BOSS_AMBULAS",
12 "SORTIE_BOSS_NEF",
13 "SORTIE_BOSS_RAPTOR",
14 "SORTIE_BOSS_PHORID",
15 "SORTIE_BOSS_LEPHANTIS",
16 "SORTIE_BOSS_INFALAD",
17 "SORTIE_BOSS_CORRUPTED_VOR"
18 ];
19
20 export const sortieBossToFaction: Record<string, string> = {
21 SORTIE_BOSS_HYENA: "FC_CORPUS",
22 SORTIE_BOSS_KELA: "FC_GRINEER",
23 SORTIE_BOSS_VOR: "FC_GRINEER",
24 SORTIE_BOSS_RUK: "FC_GRINEER",
25 SORTIE_BOSS_HEK: "FC_GRINEER",
26 SORTIE_BOSS_KRIL: "FC_GRINEER",
27 SORTIE_BOSS_TYL: "FC_GRINEER",
28 SORTIE_BOSS_JACKAL: "FC_CORPUS",
29 SORTIE_BOSS_ALAD: "FC_CORPUS",
30 SORTIE_BOSS_AMBULAS: "FC_CORPUS",
31 SORTIE_BOSS_NEF: "FC_CORPUS",
32 SORTIE_BOSS_RAPTOR: "FC_CORPUS",
33 SORTIE_BOSS_PHORID: "FC_INFESTATION",
34 SORTIE_BOSS_LEPHANTIS: "FC_INFESTATION",
35 SORTIE_BOSS_INFALAD: "FC_INFESTATION",
36 SORTIE_BOSS_CORRUPTED_VOR: "FC_CORRUPTED"
37 };
38
39 export const sortieFactionToSystemIndexes: Record<string, number[]> = {
40 FC_GRINEER: [0, 2, 3, 5, 6, 9, 11, 18],
41 FC_CORPUS: [1, 4, 7, 8, 12, 15],
42 FC_INFESTATION: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15],
43 FC_CORRUPTED: [14]
44 };
45
46 export const sortieFactionToFactionIndexes: Record<string, number[]> = {
47 FC_GRINEER: [0],
48 FC_CORPUS: [1],
49 FC_INFESTATION: [0, 1, 2],
50 FC_CORRUPTED: [3]
51 };
52
53 export const sortieBossNode: Record<string, string> = {
54 SORTIE_BOSS_HYENA: "SolNode127",
55 SORTIE_BOSS_KELA: "SolNode193",
56 SORTIE_BOSS_VOR: "SolNode108",
57 SORTIE_BOSS_RUK: "SolNode32",
58 SORTIE_BOSS_HEK: "SolNode24",
59 SORTIE_BOSS_KRIL: "SolNode99",
60 SORTIE_BOSS_TYL: "SolNode105",
61 SORTIE_BOSS_JACKAL: "SolNode104",
62 SORTIE_BOSS_ALAD: "SolNode53",
63 SORTIE_BOSS_AMBULAS: "SolNode51",
64 SORTIE_BOSS_NEF: "SettlementNode20",
65 SORTIE_BOSS_RAPTOR: "SolNode210",
66 SORTIE_BOSS_LEPHANTIS: "SolNode712",
67 SORTIE_BOSS_INFALAD: "SolNode705"
68 };
69
70 export const EPOCH = 1734307200 * 1000; // Monday, Dec 16, 2024 @ 00:00 UTC+0; should logically be winter in 1999 iteration 0
71
72 export const getSortieTime = (day: number): number => {
73 const dayStart = EPOCH + day * 86400000;
74 const date = new Date(dayStart);
75 date.setUTCHours(12);
76 const isDst = new Intl.DateTimeFormat("en-US", {
77 timeZone: "America/Toronto",
78 timeZoneName: "short"
79 })
80 .formatToParts(date)
81 .find(part => part.type === "timeZoneName")!
82 .value.includes("DT");
83 return dayStart + (isDst ? 16 : 17) * 3600000;
84 };
Added src/types/worldStateTypes.ts +122 -0
@@ -0,0 +1,122 @@
1 import { IMongoDate, IOid } from "./commonTypes";
2
3 export interface IWorldState {
4 Version: number; // for goals
5 BuildLabel: string;
6 Time: number;
7 Goals: IGoal[];
8 SyndicateMissions: ISyndicateMission[];
9 GlobalUpgrades: IGlobalUpgrade[];
10 Sorties: ISortie[];
11 LiteSorties: ILiteSortie[];
12 NodeOverrides: INodeOverride[];
13 EndlessXpChoices: IEndlessXpChoice[];
14 SeasonInfo: {
15 Activation: IMongoDate;
16 Expiry: IMongoDate;
17 AffiliationTag: string;
18 Season: number;
19 Phase: number;
20 Params: string;
21 ActiveChallenges: ISeasonChallenge[];
22 };
23 KnownCalendarSeasons: ICalendarSeason[];
24 Tmp?: string;
25 }
26
27 export interface IGoal {
28 _id: IOid;
29 Activation: IMongoDate;
30 Expiry: IMongoDate;
31 Count: number;
32 Goal: number;
33 Success: number;
34 Personal: boolean;
35 Desc: string;
36 ToolTip: string;
37 Icon: string;
38 Tag: string;
39 Node: string;
40 }
41
42 export interface ISyndicateMission {
43 _id: IOid;
44 Activation: IMongoDate;
45 Expiry: IMongoDate;
46 Tag: string;
47 Seed: number;
48 Nodes: string[];
49 }
50
51 export interface IGlobalUpgrade {
52 _id: IOid;
53 Activation: IMongoDate;
54 ExpiryDate: IMongoDate;
55 UpgradeType: string;
56 OperationType: string;
57 Value: number;
58 LocalizeTag: string;
59 LocalizeDescTag: string;
60 }
61
62 export interface INodeOverride {
63 _id: IOid;
64 Activation?: IMongoDate;
65 Expiry?: IMongoDate;
66 Node: string;
67 Hide?: boolean;
68 Seed?: number;
69 LevelOverride?: string;
70 Faction?: string;
71 CustomNpcEncounters?: string;
72 }
73
74 export interface ISortie {
75 _id: IOid;
76 Activation: IMongoDate;
77 Expiry: IMongoDate;
78 Reward: "/Lotus/Types/Game/MissionDecks/SortieRewards";
79 Seed: number;
80 Boss: string;
81 Variants: {
82 missionType: string;
83 modifierType: string;
84 node: string;
85 }[];
86 }
87
88 export interface ILiteSortie {
89 _id: IOid;
90 Activation: IMongoDate;
91 Expiry: IMongoDate;
92 Reward: "/Lotus/Types/Game/MissionDecks/ArchonSortieRewards";
93 Seed: number;
94 Boss: string; // "SORTIE_BOSS_AMAR" | "SORTIE_BOSS_NIRA" | "SORTIE_BOSS_BOREAL"
95 Missions: {
96 missionType: string;
97 node: string;
98 }[];
99 }
100
101 export interface IEndlessXpChoice {
102 Category: string;
103 Choices: string[];
104 }
105
106 export interface ISeasonChallenge {
107 _id: IOid;
108 Daily?: boolean;
109 Activation: IMongoDate;
110 Expiry: IMongoDate;
111 Challenge: string;
112 }
113
114 export interface ICalendarSeason {
115 Activation: IMongoDate;
116 Expiry: IMongoDate;
117 Season: string; // "CST_UNDEFINED" | "CST_WINTER" | "CST_SPRING" | "CST_SUMMER" | "CST_FALL"
118 Days: {
119 day: number;
120 }[];
121 YearIteration: number;
122 }