From c7de3b4069069cc0c30c65a7b23970807f7d44db Mon Sep 17 00:00:00 2001 From: ny <64143453+nyaoouo@users.noreply.github.com> Date: Thu, 12 Jun 2025 16:53:50 +0800 Subject: [PATCH] fix initialize syndicateSacrifice issue --- .../api/syndicateSacrificeController.ts | 157 ++++++++++-------- 1 file changed, 88 insertions(+), 69 deletions(-) diff --git a/src/controllers/api/syndicateSacrificeController.ts b/src/controllers/api/syndicateSacrificeController.ts index 021608b3..ac362e39 100644 --- a/src/controllers/api/syndicateSacrificeController.ts +++ b/src/controllers/api/syndicateSacrificeController.ts @@ -3,7 +3,7 @@ import { RequestHandler } from "express"; import { getAccountIdForRequest } from "@/src/services/loginService"; import { ExportSyndicates, ISyndicateSacrifice } from "warframe-public-export-plus"; import { handleStoreItemAcquisition } from "@/src/services/purchaseService"; -import { addMiscItem, combineInventoryChanges, getInventory, updateCurrency } from "@/src/services/inventoryService"; +import { addMiscItems, combineInventoryChanges, getInventory, updateCurrency } from "@/src/services/inventoryService"; import { IInventoryChanges } from "@/src/types/purchaseTypes"; import { toStoreItem } from "@/src/services/itemDataService"; import { logger } from "@/src/utils/logger"; @@ -17,84 +17,103 @@ export const syndicateSacrificeController: RequestHandler = async (request, resp if (!syndicate) { syndicate = inventory.Affiliations[inventory.Affiliations.push({ Tag: data.AffiliationTag, Standing: 0 }) - 1]; } - - const oldLevel = syndicate.Title ?? 0; - const levelIncrease = data.SacrificeLevel - oldLevel; - if (levelIncrease < 1) { - throw new Error(`syndicate sacrifice needs an increase of at least 1`); - } - if (levelIncrease > 1 && !data.AllowMultiple) { - throw new Error(`desired syndicate level is an increase of ${levelIncrease}, max. allowed increase is 1`); - } - const res: ISyndicateSacrificeResponse = { AffiliationTag: data.AffiliationTag, InventoryChanges: {}, - Level: data.SacrificeLevel, - LevelIncrease: levelIncrease, + Level: 0, // the new level after the sacrifice + LevelIncrease: 0, // the amount of levels gained from the sacrifice NewEpisodeReward: false }; - - // Process sacrifices and rewards for every level we're reaching const manifest = ExportSyndicates[data.AffiliationTag]; - for (let level = oldLevel + 1; level <= data.SacrificeLevel; ++level) { - let sacrifice: ISyndicateSacrifice | undefined; - if (level == 0) { - sacrifice = manifest.initiationSacrifice; - if (manifest.initiationReward) { - combineInventoryChanges( - res.InventoryChanges, - (await handleStoreItemAcquisition(manifest.initiationReward, inventory)).InventoryChanges - ); - } - syndicate.Initiated = true; - } else { - sacrifice = manifest.titles?.find(x => x.level == level)?.sacrifice; - } + const isNightwave = manifest.dailyChallenges !== undefined; - if (sacrifice) { - updateCurrency(inventory, sacrifice.credits, false, res.InventoryChanges); + const titles = manifest.titles; + const oldLevel = syndicate.Title ?? 0; + const currentStanding = syndicate.Standing ?? 0; + let newLevel = oldLevel; - for (const item of sacrifice.items) { - addMiscItem(inventory, item.ItemType, item.ItemCount * -1, res.InventoryChanges); - } - } - - // Quacks like a nightwave syndicate? - if (manifest.dailyChallenges) { - const title = manifest.titles!.find(x => x.level == level); - if (title) { - res.NewEpisodeReward = true; - let rewardType: string; - let rewardCount: number; - if (title.storeItemReward) { - rewardType = title.storeItemReward; - rewardCount = 1; - } else { - rewardType = toStoreItem(title.reward!.ItemType); - rewardCount = title.reward!.ItemCount; - } - const rewardInventoryChanges = (await handleStoreItemAcquisition(rewardType, inventory, rewardCount)) - .InventoryChanges; - if (Object.keys(rewardInventoryChanges).length == 0) { - logger.debug(`nightwave rank up reward did not seem to get added, giving 50 creds instead`); - const nightwaveCredsItemType = manifest.titles![0].reward!.ItemType; - addMiscItem(inventory, nightwaveCredsItemType, 50, rewardInventoryChanges); - } - combineInventoryChanges(res.InventoryChanges, rewardInventoryChanges); - } - } else { - if (level > 0 && manifest.favours.find(x => x.rankUpReward && x.requiredLevel == level)) { - syndicate.FreeFavorsEarned ??= []; - if (!syndicate.FreeFavorsEarned.includes(level)) { - syndicate.FreeFavorsEarned.push(level); - } - } - } + interface _HandleItem { + sacrifice?: ISyndicateSacrifice; + reward?: { + type: string; + count?: number; // default 1 + }; } - // Commit - syndicate.Title = data.SacrificeLevel; + const needProcess: _HandleItem[] = []; + + if (!syndicate.Initiated) { + needProcess.push({ + sacrifice: manifest.initiationSacrifice, + reward: manifest.initiationReward ? { type: manifest.initiationReward } : undefined + }); + syndicate.Initiated = true; + } + + if (titles == undefined) { + // ummm then just trust what the client says? + newLevel = res.Level = data.SacrificeLevel; + res.LevelIncrease = data.SacrificeLevel - oldLevel; + } else { + titles + .filter(x => x.level > oldLevel && x.minStanding <= currentStanding) + .forEach(x => { + if (x.level > newLevel) newLevel = x.level; + const item: _HandleItem = {}; + if (x.sacrifice) { + item.sacrifice = x.sacrifice; + } + if (x.storeItemReward) { + item.reward = { type: x.storeItemReward, count: 1 }; + } else if (x.reward) { + item.reward = { type: toStoreItem(x.reward.ItemType), count: x.reward.ItemCount }; + } + if (item.sacrifice || item.reward) { + needProcess.push(item); + } + }); + res.Level = newLevel; + res.LevelIncrease = newLevel - oldLevel; + } + + for (const item of needProcess) { + if (item.sacrifice) { + const changes = updateCurrency(inventory, item.sacrifice.credits, false); + const miscItemChanges = item.sacrifice.items.map(x => ({ + ItemType: x.ItemType, + ItemCount: x.ItemCount * -1 + })); + addMiscItems(inventory, miscItemChanges); + if (res.InventoryChanges.MiscItems === undefined) { + res.InventoryChanges.MiscItems = []; + } + res.InventoryChanges.MiscItems.push(...miscItemChanges); + combineInventoryChanges(res.InventoryChanges, changes); + } + if (item.reward) { + const rewardChanges = await handleStoreItemAcquisition(item.reward.type, inventory, item.reward.count ?? 1); + if (isNightwave && Object.keys(rewardChanges.InventoryChanges).length == 0) { + logger.debug(`syndicate sacrifice reward did not seem to get added, giving 50 creds instead`); + const syndicateCredsItemType = manifest.titles![0].reward!.ItemType; + rewardChanges.InventoryChanges.MiscItems = [{ ItemType: syndicateCredsItemType, ItemCount: 50 }]; + addMiscItems(inventory, rewardChanges.InventoryChanges.MiscItems); + } + combineInventoryChanges(res.InventoryChanges, rewardChanges.InventoryChanges); + } + } + if (isNightwave) { + res.NewEpisodeReward = needProcess.length > 0; + } else { + manifest.favours + .filter(x => x.rankUpReward && x.requiredLevel <= newLevel) + .forEach(x => { + syndicate.FreeFavorsEarned ??= []; + if (!syndicate.FreeFavorsEarned.includes(x.requiredLevel)) { + syndicate.FreeFavorsEarned.push(x.requiredLevel); + } + }); + } + syndicate.Title = newLevel; await inventory.save(); response.json(res);