From 85ceb328f3e2547e2af6c984c9256b1dd573858d Mon Sep 17 00:00:00 2001 From: Sainan Date: Sat, 28 Dec 2024 09:34:14 +0100 Subject: [PATCH] feat: dynamically cycle ESO, holdfast bounties, hex bounties, & circuit choices --- .../dynamic/worldStateController.ts | 114 ++++++++++++++++-- static/fixed_responses/worldState.json | 22 +--- 2 files changed, 106 insertions(+), 30 deletions(-) diff --git a/src/controllers/dynamic/worldStateController.ts b/src/controllers/dynamic/worldStateController.ts index 92351233..3a9140f1 100644 --- a/src/controllers/dynamic/worldStateController.ts +++ b/src/controllers/dynamic/worldStateController.ts @@ -1,16 +1,112 @@ import { RequestHandler } from "express"; -import worldState from "@/static/fixed_responses/worldState.json"; +import staticWorldState from "@/static/fixed_responses/worldState.json"; import buildConfig from "@/static/data/buildConfig.json"; +import { IMongoDate, IOid } from "@/src/types/commonTypes"; -const worldStateController: RequestHandler = (req, res) => { - const buildLabel: string = - typeof req.query.buildLabel == "string" ? req.query.buildLabel.split(" ").join("+") : buildConfig.buildLabel; - - res.json({ - ...worldState, - BuildLabel: buildLabel, +export const worldStateController: RequestHandler = (req, res) => { + const worldState: IWorldState = { + ...staticWorldState, + BuildLabel: + typeof req.query.buildLabel == "string" + ? req.query.buildLabel.split(" ").join("+") + : buildConfig.buildLabel, Time: Math.round(Date.now() / 1000) + }; + + const week = Math.trunc(new Date().getTime() / 604800000); + + // Elite Sanctuary Onslaught cycling every week + worldState.NodeOverrides.push({ + _id: { $oid: "5ad9f9bb6df82a56eabf3d44" }, + Node: "SolNode802", + Seed: week // unfaithful }); + + // Holdfast & Hex bounties cycling every 2.5 hours; unfaithful implementation + const bountyCycle = Math.trunc(new Date().getTime() / 9000000); + const bountyCycleStart = bountyCycle * 9000000; + const bountyCycleEnd = bountyCycleStart + 9000000; + worldState.SyndicateMissions.push({ + _id: { $oid: bountyCycleStart.toString(16) + "0000000000000029" }, + Activation: { $date: { $numberLong: bountyCycleStart.toString() } }, + Expiry: { $date: { $numberLong: bountyCycleEnd.toString() } }, + Tag: "ZarimanSyndicate", + Seed: bountyCycle, + Nodes: [] + }); + worldState.SyndicateMissions.push({ + _id: { $oid: bountyCycleStart.toString(16) + "0000000000000006" }, + Activation: { $date: { $numberLong: bountyCycleStart.toString(10) } }, + Expiry: { $date: { $numberLong: bountyCycleEnd.toString(10) } }, + Tag: "HexSyndicate", + Seed: bountyCycle, + Nodes: [] + }); + + // Circuit warframe choices cycling every week + worldState.EndlessXpChoices.push({ + Category: "EXC_NORMAL", + Choices: [ + ["Nidus", "Octavia", "Harrow"], + ["Gara", "Khora", "Revenant"], + ["Garuda", "Baruuk", "Hildryn"], + ["Excalibur", "Trinity", "Ember"], + ["Loki", "Mag", "Rhino"], + ["Ash", "Frost", "Nyx"], + ["Saryn", "Vauban", "Nova"], + ["Nekros", "Valkyr", "Oberon"], + ["Hydroid", "Mirage", "Limbo"], + ["Mesa", "Chroma", "Atlas"], + ["Ivara", "Inaros", "Titania"] + ][week % 12] + }); + worldState.EndlessXpChoices.push({ + Category: "EXC_HARD", + Choices: [ + ["Brunt", "Soma", "Vasto", "Solo", "Burston"], + ["Zylok", "Sibear", "Dread", "Despair", "Hate"], + ["Dera", "Sybaris", "Cestra", "Sicarus", "Okina"], + ["Braton", "Lato", "Skana", "Paris", "Kunai"], + ["Boar", "Gammacor", "Angstrum", "Gorgon", "Anku"], + ["Bo", "Latron", "Furis", "Furax", "Strun"], + ["Lex", "Magistar", "Boltor", "Bronco", "Dagger"], + ["Torid", "Toxocyst", "Ichor", "Miter", "Atomos"] + ][week % 8] + }); + + res.json(worldState); }; -export { worldStateController }; +interface IWorldState { + BuildLabel: string; + Time: number; + SyndicateMissions: ISyndicateMission[]; + NodeOverrides: INodeOverride[]; + EndlessXpChoices: IEndlessXpChoice[]; +} + +interface ISyndicateMission { + _id: IOid; + Activation: IMongoDate; + Expiry: IMongoDate; + Tag: string; + Seed: number; + Nodes: string[]; +} + +interface INodeOverride { + _id: IOid; + Activation?: IMongoDate; + Expiry?: IMongoDate; + Node: string; + Hide?: boolean; + Seed?: number; + LevelOverride?: string; + Faction?: string; + CustomNpcEncounters?: string; +} + +interface IEndlessXpChoice { + Category: string; + Choices: string[]; +} diff --git a/static/fixed_responses/worldState.json b/static/fixed_responses/worldState.json index 66b72c22..4f272b4e 100644 --- a/static/fixed_responses/worldState.json +++ b/static/fixed_responses/worldState.json @@ -479,22 +479,6 @@ "xpAmounts": [780, 780, 780, 780, 1540] } ] - }, - { - "_id": { "$oid": "663a71c80000000000000029" }, - "Activation": { "$date": { "$numberLong": "1715106248403" } }, - "Expiry": { "$date": { "$numberLong": "2000000000000" } }, - "Tag": "ZarimanSyndicate", - "Seed": 99562, - "Nodes": [] - }, - { - "_id": { "$oid": "676b8d340000000000000006" }, - "Activation": { "$date": { "$numberLong": "1735101748215" } }, - "Expiry": { "$date": { "$numberLong": "2000000000000" } }, - "Tag": "HexSyndicate", - "Seed": 33872, - "Nodes": [] } ], "ActiveMissions": [ @@ -690,7 +674,6 @@ { "_id": { "$oid": "549b18e9b029cef5991d6aec" }, "Node": "EuropaHUB", "Hide": true }, { "_id": { "$oid": "54a1737aeb658f6cbccf70ff" }, "Node": "ErisHUB", "Hide": true }, { "_id": { "$oid": "54a736ddec12f80bd6e9e326" }, "Node": "VenusHUB", "Hide": true }, - { "_id": { "$oid": "5ad9f9bb6df82a56eabf3d44" }, "Node": "SolNode802", "Seed": 9969639 }, { "_id": { "$oid": "5b8817c2bd4f253264d6aa91" }, "Node": "EarthHUB", @@ -1103,10 +1086,7 @@ "ConstructionProjects": [], "TwitchPromos": [], "ExperimentRecommended": [], - "EndlessXpChoices": [ - { "Category": "EXC_NORMAL", "Choices": ["Gara", "Khora", "Revenant"] }, - { "Category": "EXC_HARD", "Choices": ["Zylok", "Sibear", "Dread", "Despair", "Hate"] } - ], + "EndlessXpChoices": [], "ForceLogoutVersion": 0, "SeasonInfo": { "Activation": { "$date": { "$numberLong": "1715796000000" } },