返回提交历史
Modified
src/controllers/dynamic/worldStateController.ts
+2
-606
Deleted
src/helpers/worldStateHelper.ts
+0
-84
Added
src/services/worldStateService.ts
+561
-0
Added
src/types/worldStateTypes.ts
+122
-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
代码差异
4 个文件
+685
-690
@@ -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
};
@@ -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
}