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

feat: eidolon/venus/deimos bounty rotation (#1554)

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

2ca79ef8
Sainan <63328889+Sainan@users.noreply.github.com>
提交于

代码差异

1 个文件 +104 -0
Modified src/services/worldStateService.ts +104 -0
@@ -9,6 +9,7 @@ import { config } from "@/src/services/configService";
9 9 import { CRng } from "@/src/services/rngService";
10 10 import { eMissionType, ExportNightwave, ExportRegions } from "warframe-public-export-plus";
11 11 import { ISeasonChallenge, IWorldState } from "../types/worldStateTypes";
12 import { logger } from "../utils/logger";
12 13
13 14 const sortieBosses = [
14 15 "SORTIE_BOSS_HYENA",
@@ -79,6 +80,75 @@ const sortieBossNode: Record<string, string> = {
79 80 SORTIE_BOSS_INFALAD: "SolNode705"
80 81 };
81 82
83 const jobSets: string[][] = [
84 [
85 "/Lotus/Types/Gameplay/Eidolon/Jobs/AssassinateBountyAss",
86 "/Lotus/Types/Gameplay/Eidolon/Jobs/AssassinateBountyCap",
87 "/Lotus/Types/Gameplay/Eidolon/Jobs/AttritionBountySab",
88 "/Lotus/Types/Gameplay/Eidolon/Jobs/AttritionBountyLib",
89 "/Lotus/Types/Gameplay/Eidolon/Jobs/AttritionBountyCap",
90 "/Lotus/Types/Gameplay/Eidolon/Jobs/AttritionBountyExt",
91 "/Lotus/Types/Gameplay/Eidolon/Jobs/ReclamationBountyCap",
92 "/Lotus/Types/Gameplay/Eidolon/Jobs/ReclamationBountyTheft",
93 "/Lotus/Types/Gameplay/Eidolon/Jobs/ReclamationBountyCache",
94 "/Lotus/Types/Gameplay/Eidolon/Jobs/CaptureBountyCapOne",
95 "/Lotus/Types/Gameplay/Eidolon/Jobs/CaptureBountyCapTwo",
96 "/Lotus/Types/Gameplay/Eidolon/Jobs/SabotageBountySab",
97 "/Lotus/Types/Gameplay/Eidolon/Jobs/RescueBountyResc"
98 ],
99 [
100 "/Lotus/Types/Gameplay/Eidolon/Jobs/Narmer/AssassinateBountyAss",
101 "/Lotus/Types/Gameplay/Eidolon/Jobs/Narmer/AttritionBountyExt",
102 "/Lotus/Types/Gameplay/Eidolon/Jobs/Narmer/ReclamationBountyTheft",
103 "/Lotus/Types/Gameplay/Eidolon/Jobs/Narmer/AttritionBountyLib"
104 ],
105 [
106 "/Lotus/Types/Gameplay/Venus/Jobs/VenusArtifactJobAmbush",
107 "/Lotus/Types/Gameplay/Venus/Jobs/VenusArtifactJobExcavation",
108 "/Lotus/Types/Gameplay/Venus/Jobs/VenusArtifactJobRecovery",
109 "/Lotus/Types/Gameplay/Venus/Jobs/VenusChaosJobAssassinate",
110 "/Lotus/Types/Gameplay/Venus/Jobs/VenusChaosJobExcavation",
111 "/Lotus/Types/Gameplay/Venus/Jobs/VenusCullJobAssassinate",
112 "/Lotus/Types/Gameplay/Venus/Jobs/VenusCullJobExterminate",
113 "/Lotus/Types/Gameplay/Venus/Jobs/VenusCullJobResource",
114 "/Lotus/Types/Gameplay/Venus/Jobs/VenusIntelJobRecovery",
115 "/Lotus/Types/Gameplay/Venus/Jobs/VenusIntelJobResource",
116 "/Lotus/Types/Gameplay/Venus/Jobs/VenusIntelJobSpy",
117 "/Lotus/Types/Gameplay/Venus/Jobs/VenusSpyJobSpy",
118 "/Lotus/Types/Gameplay/Venus/Jobs/VenusTheftJobAmbush",
119 "/Lotus/Types/Gameplay/Venus/Jobs/VenusTheftJobExcavation",
120 "/Lotus/Types/Gameplay/Venus/Jobs/VenusTheftJobResource",
121 "/Lotus/Types/Gameplay/Venus/Jobs/VenusHelpingJobCaches",
122 "/Lotus/Types/Gameplay/Venus/Jobs/VenusHelpingJobResource",
123 "/Lotus/Types/Gameplay/Venus/Jobs/VenusHelpingJobSpy",
124 "/Lotus/Types/Gameplay/Venus/Jobs/VenusPreservationJobDefense",
125 "/Lotus/Types/Gameplay/Venus/Jobs/VenusPreservationJobRecovery",
126 "/Lotus/Types/Gameplay/Venus/Jobs/VenusPreservationJobResource",
127 "/Lotus/Types/Gameplay/Venus/Jobs/VenusWetworkJobAssassinate",
128 "/Lotus/Types/Gameplay/Venus/Jobs/VenusWetworkJobSpy"
129 ],
130 [
131 "/Lotus/Types/Gameplay/Venus/Jobs/Narmer/NarmerVenusCullJobAssassinate",
132 "/Lotus/Types/Gameplay/Venus/Jobs/Narmer/NarmerVenusCullJobExterminate",
133 "/Lotus/Types/Gameplay/Venus/Jobs/Narmer/NarmerVenusPreservationJobDefense",
134 "/Lotus/Types/Gameplay/Venus/Jobs/Narmer/NarmerVenusTheftJobExcavation"
135 ],
136 [
137 "/Lotus/Types/Gameplay/InfestedMicroplanet/Jobs/DeimosAreaDefenseBounty",
138 "/Lotus/Types/Gameplay/InfestedMicroplanet/Jobs/DeimosAssassinateBounty",
139 "/Lotus/Types/Gameplay/InfestedMicroplanet/Jobs/DeimosCrpSurvivorBounty",
140 "/Lotus/Types/Gameplay/InfestedMicroplanet/Jobs/DeimosGrnSurvivorBounty",
141 "/Lotus/Types/Gameplay/InfestedMicroplanet/Jobs/DeimosKeyPiecesBounty",
142 "/Lotus/Types/Gameplay/InfestedMicroplanet/Jobs/DeimosExcavateBounty",
143 "/Lotus/Types/Gameplay/InfestedMicroplanet/Jobs/DeimosPurifyBounty"
144 ],
145 [
146 "/Lotus/Types/Gameplay/InfestedMicroplanet/Jobs/DeimosEndlessAreaDefenseBounty",
147 "/Lotus/Types/Gameplay/InfestedMicroplanet/Jobs/DeimosEndlessExcavateBounty",
148 "/Lotus/Types/Gameplay/InfestedMicroplanet/Jobs/DeimosEndlessPurifyBounty"
149 ]
150 ];
151
82 152 const EPOCH = 1734307200 * 1000; // Monday, Dec 16, 2024 @ 00:00 UTC+0; should logically be winter in 1999 iteration 0
83 153
84 154 const getSortieTime = (day: number): number => {
@@ -249,6 +319,40 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
249 319 Seed: bountyCycle,
250 320 Nodes: []
251 321 };
322 for (const syndicateInfo of worldState.SyndicateMissions) {
323 if (syndicateInfo.Jobs && syndicateInfo.Seed != bountyCycle) {
324 syndicateInfo.Seed = bountyCycle;
325 logger.debug(`refreshing jobs for ${syndicateInfo.Tag}`);
326 const rng = new CRng(bountyCycle);
327 const table = String.fromCharCode(65 + (bountyCycle % 3));
328 const vaultTable = String.fromCharCode(65 + ((bountyCycle + 1) % 3));
329 const deimosDTable = String.fromCharCode(65 + (bountyCycle % 2));
330 //console.log({ bountyCycleStart, bountyCycleEnd, table, vaultTable, deimosDTable });
331 for (const jobInfo of syndicateInfo.Jobs) {
332 if (jobInfo.jobType) {
333 let found = false;
334 for (const jobSet of jobSets) {
335 if (jobSet.indexOf(jobInfo.jobType) != -1) {
336 jobInfo.jobType = rng.randomElement(jobSet);
337 // TODO: xpAmounts seems like it might need to differ depending on the job?
338 found = true;
339 break;
340 }
341 }
342 if (!found) {
343 logger.warn(`no job set found for type ${jobInfo.jobType}`);
344 }
345 }
346 if (jobInfo.endless || jobInfo.isVault) {
347 jobInfo.rewards = jobInfo.rewards.replace(/Table.Rewards/, `Table${vaultTable}Rewards`);
348 } else if (jobInfo.rewards.startsWith("/Lotus/Types/Game/MissionDecks/DeimosMissionRewards/TierD")) {
349 jobInfo.rewards = jobInfo.rewards.replace(/Table.Rewards/, `Table${deimosDTable}Rewards`);
350 } else if (!jobInfo.rewards.startsWith("/Lotus/Types/Game/MissionDecks/DeimosMissionRewards/TierE")) {
351 jobInfo.rewards = jobInfo.rewards.replace(/Table.Rewards/, `Table${table}Rewards`);
352 }
353 }
354 }
355 }
252 356
253 357 if (config.worldState?.creditBoost) {
254 358 worldState.GlobalUpgrades.push({