feat: eidolon/venus/deimos bounty rotation
All checks were successful
Build / build (pull_request) Successful in 1m27s
Build / build (push) Successful in 1m21s

This commit is contained in:
Sainan 2025-04-11 00:35:08 +02:00
parent 9f727789ca
commit dbca7e555e
2 changed files with 115 additions and 2 deletions

View File

@ -9,6 +9,7 @@ import { config } from "@/src/services/configService";
import { CRng } from "@/src/services/rngService"; import { CRng } from "@/src/services/rngService";
import { eMissionType, ExportNightwave, ExportRegions } from "warframe-public-export-plus"; import { eMissionType, ExportNightwave, ExportRegions } from "warframe-public-export-plus";
import { ISeasonChallenge, IWorldState } from "../types/worldStateTypes"; import { ISeasonChallenge, IWorldState } from "../types/worldStateTypes";
import { logger } from "../utils/logger";
const sortieBosses = [ const sortieBosses = [
"SORTIE_BOSS_HYENA", "SORTIE_BOSS_HYENA",
@ -79,6 +80,75 @@ const sortieBossNode: Record<string, string> = {
SORTIE_BOSS_INFALAD: "SolNode705" SORTIE_BOSS_INFALAD: "SolNode705"
}; };
const jobSets: string[][] = [
[
"/Lotus/Types/Gameplay/Eidolon/Jobs/AssassinateBountyAss",
"/Lotus/Types/Gameplay/Eidolon/Jobs/AssassinateBountyCap",
"/Lotus/Types/Gameplay/Eidolon/Jobs/AttritionBountySab",
"/Lotus/Types/Gameplay/Eidolon/Jobs/AttritionBountyLib",
"/Lotus/Types/Gameplay/Eidolon/Jobs/AttritionBountyCap",
"/Lotus/Types/Gameplay/Eidolon/Jobs/AttritionBountyExt",
"/Lotus/Types/Gameplay/Eidolon/Jobs/ReclamationBountyCap",
"/Lotus/Types/Gameplay/Eidolon/Jobs/ReclamationBountyTheft",
"/Lotus/Types/Gameplay/Eidolon/Jobs/ReclamationBountyCache",
"/Lotus/Types/Gameplay/Eidolon/Jobs/CaptureBountyCapOne",
"/Lotus/Types/Gameplay/Eidolon/Jobs/CaptureBountyCapTwo",
"/Lotus/Types/Gameplay/Eidolon/Jobs/SabotageBountySab",
"/Lotus/Types/Gameplay/Eidolon/Jobs/RescueBountyResc"
],
[
"/Lotus/Types/Gameplay/Eidolon/Jobs/Narmer/AssassinateBountyAss",
"/Lotus/Types/Gameplay/Eidolon/Jobs/Narmer/AttritionBountyExt",
"/Lotus/Types/Gameplay/Eidolon/Jobs/Narmer/ReclamationBountyTheft",
"/Lotus/Types/Gameplay/Eidolon/Jobs/Narmer/AttritionBountyLib"
],
[
"/Lotus/Types/Gameplay/Venus/Jobs/VenusArtifactJobAmbush",
"/Lotus/Types/Gameplay/Venus/Jobs/VenusArtifactJobExcavation",
"/Lotus/Types/Gameplay/Venus/Jobs/VenusArtifactJobRecovery",
"/Lotus/Types/Gameplay/Venus/Jobs/VenusChaosJobAssassinate",
"/Lotus/Types/Gameplay/Venus/Jobs/VenusChaosJobExcavation",
"/Lotus/Types/Gameplay/Venus/Jobs/VenusCullJobAssassinate",
"/Lotus/Types/Gameplay/Venus/Jobs/VenusCullJobExterminate",
"/Lotus/Types/Gameplay/Venus/Jobs/VenusCullJobResource",
"/Lotus/Types/Gameplay/Venus/Jobs/VenusIntelJobRecovery",
"/Lotus/Types/Gameplay/Venus/Jobs/VenusIntelJobResource",
"/Lotus/Types/Gameplay/Venus/Jobs/VenusIntelJobSpy",
"/Lotus/Types/Gameplay/Venus/Jobs/VenusSpyJobSpy",
"/Lotus/Types/Gameplay/Venus/Jobs/VenusTheftJobAmbush",
"/Lotus/Types/Gameplay/Venus/Jobs/VenusTheftJobExcavation",
"/Lotus/Types/Gameplay/Venus/Jobs/VenusTheftJobResource",
"/Lotus/Types/Gameplay/Venus/Jobs/VenusHelpingJobCaches",
"/Lotus/Types/Gameplay/Venus/Jobs/VenusHelpingJobResource",
"/Lotus/Types/Gameplay/Venus/Jobs/VenusHelpingJobSpy",
"/Lotus/Types/Gameplay/Venus/Jobs/VenusPreservationJobDefense",
"/Lotus/Types/Gameplay/Venus/Jobs/VenusPreservationJobRecovery",
"/Lotus/Types/Gameplay/Venus/Jobs/VenusPreservationJobResource",
"/Lotus/Types/Gameplay/Venus/Jobs/VenusWetworkJobAssassinate",
"/Lotus/Types/Gameplay/Venus/Jobs/VenusWetworkJobSpy"
],
[
"/Lotus/Types/Gameplay/Venus/Jobs/Narmer/NarmerVenusCullJobAssassinate",
"/Lotus/Types/Gameplay/Venus/Jobs/Narmer/NarmerVenusCullJobExterminate",
"/Lotus/Types/Gameplay/Venus/Jobs/Narmer/NarmerVenusPreservationJobDefense",
"/Lotus/Types/Gameplay/Venus/Jobs/Narmer/NarmerVenusTheftJobExcavation"
],
[
"/Lotus/Types/Gameplay/InfestedMicroplanet/Jobs/DeimosAreaDefenseBounty",
"/Lotus/Types/Gameplay/InfestedMicroplanet/Jobs/DeimosAssassinateBounty",
"/Lotus/Types/Gameplay/InfestedMicroplanet/Jobs/DeimosCrpSurvivorBounty",
"/Lotus/Types/Gameplay/InfestedMicroplanet/Jobs/DeimosGrnSurvivorBounty",
"/Lotus/Types/Gameplay/InfestedMicroplanet/Jobs/DeimosKeyPiecesBounty",
"/Lotus/Types/Gameplay/InfestedMicroplanet/Jobs/DeimosExcavateBounty",
"/Lotus/Types/Gameplay/InfestedMicroplanet/Jobs/DeimosPurifyBounty"
],
[
"/Lotus/Types/Gameplay/InfestedMicroplanet/Jobs/DeimosEndlessAreaDefenseBounty",
"/Lotus/Types/Gameplay/InfestedMicroplanet/Jobs/DeimosEndlessExcavateBounty",
"/Lotus/Types/Gameplay/InfestedMicroplanet/Jobs/DeimosEndlessPurifyBounty"
]
];
const EPOCH = 1734307200 * 1000; // Monday, Dec 16, 2024 @ 00:00 UTC+0; should logically be winter in 1999 iteration 0 const EPOCH = 1734307200 * 1000; // Monday, Dec 16, 2024 @ 00:00 UTC+0; should logically be winter in 1999 iteration 0
const getSortieTime = (day: number): number => { const getSortieTime = (day: number): number => {
@ -249,6 +319,38 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
Seed: bountyCycle, Seed: bountyCycle,
Nodes: [] Nodes: []
}; };
for (const syndicateInfo of worldState.SyndicateMissions) {
if (syndicateInfo.Jobs && syndicateInfo.Seed != bountyCycle) {
syndicateInfo.Seed = bountyCycle;
const rng = new CRng(bountyCycle);
const table = String.fromCharCode(65 + ((bountyCycle - 1) % 3));
const vaultTable = String.fromCharCode(65 + ((bountyCycle - 2) % 3));
const endlessTable = String.fromCharCode(65 + ((bountyCycle - 3) % 3));
for (const jobInfo of syndicateInfo.Jobs) {
if (jobInfo.jobType) {
let found = false;
for (const jobSet of jobSets) {
if (jobSet.indexOf(jobInfo.jobType) != -1) {
jobInfo.jobType = rng.randomElement(jobSet);
// TODO: xpAmounts seems like it might need to differ depending on the job?
found = true;
break;
}
}
if (!found) {
logger.warn(`no job set found for type ${jobInfo.jobType}`);
}
}
if (jobInfo.endless) {
jobInfo.rewards = jobInfo.rewards.replace(/Table.Rewards/, `Table${endlessTable}Rewards`);
} else if (jobInfo.isVault) {
jobInfo.rewards = jobInfo.rewards.replace(/Table.Rewards/, `Table${vaultTable}Rewards`);
} else {
jobInfo.rewards = jobInfo.rewards.replace(/Table.Rewards/, `Table${table}Rewards`);
}
}
}
}
if (config.worldState?.creditBoost) { if (config.worldState?.creditBoost) {
worldState.GlobalUpgrades.push({ worldState.GlobalUpgrades.push({

View File

@ -5,7 +5,7 @@ export interface IWorldState {
BuildLabel: string; BuildLabel: string;
Time: number; Time: number;
Goals: IGoal[]; Goals: IGoal[];
SyndicateMissions: ISyndicateMission[]; SyndicateMissions: ISyndicateMissionInfo[];
GlobalUpgrades: IGlobalUpgrade[]; GlobalUpgrades: IGlobalUpgrade[];
Sorties: ISortie[]; Sorties: ISortie[];
LiteSorties: ILiteSortie[]; LiteSorties: ILiteSortie[];
@ -39,13 +39,24 @@ export interface IGoal {
Node: string; Node: string;
} }
export interface ISyndicateMission { export interface ISyndicateMissionInfo {
_id: IOid; _id: IOid;
Activation: IMongoDate; Activation: IMongoDate;
Expiry: IMongoDate; Expiry: IMongoDate;
Tag: string; Tag: string;
Seed: number; Seed: number;
Nodes: string[]; Nodes: string[];
Jobs?: {
jobType?: string;
rewards: string;
masteryReq: number;
minEnemyLevel: number;
maxEnemyLevel: number;
xpAmounts: number[];
endless?: boolean;
locationTag?: string;
isVault?: boolean;
}[];
} }
export interface IGlobalUpgrade { export interface IGlobalUpgrade {