diff --git a/src/controllers/api/syndicateSacrificeController.ts b/src/controllers/api/syndicateSacrificeController.ts index 8b1a9c7a..8c097953 100644 --- a/src/controllers/api/syndicateSacrificeController.ts +++ b/src/controllers/api/syndicateSacrificeController.ts @@ -17,81 +17,99 @@ export const syndicateSacrificeController: RequestHandler = async (request, resp if (!syndicate) { syndicate = inventory.Affiliations[inventory.Affiliations.push({ Tag: data.AffiliationTag, Standing: 0 }) - 1]; } - - const level = data.SacrificeLevel - (syndicate.Title ?? 0); const res: ISyndicateSacrificeResponse = { AffiliationTag: data.AffiliationTag, InventoryChanges: {}, - Level: data.SacrificeLevel, - LevelIncrease: level <= 0 ? 1 : level, + Level: 0, // the new level after the sacrifice + LevelIncrease: 0, // the amount of levels gained from the sacrifice NewEpisodeReward: false }; - const manifest = ExportSyndicates[data.AffiliationTag]; - let sacrifice: ISyndicateSacrifice | undefined; - let reward: string | undefined; - if (data.SacrificeLevel == 0) { - sacrifice = manifest.initiationSacrifice; - reward = manifest.initiationReward; + const isNightwave = manifest.dailyChallenges !== undefined; + + const titles = manifest.titles; + const oldLevel = syndicate.Title ?? 0; + const currentStanding = syndicate.Standing ?? 0; + let newLevel = oldLevel; + + interface _HandleItem { + sacrifice?: ISyndicateSacrifice; + reward?: { + type: string; + count?: number; // default 1 + } + } + + 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 { - sacrifice = manifest.titles?.find(x => x.level == data.SacrificeLevel)?.sacrifice; - } - - if (sacrifice) { - res.InventoryChanges = { ...updateCurrency(inventory, sacrifice.credits, false) }; - - const miscItemChanges = sacrifice.items.map(x => ({ - ItemType: x.ItemType, - ItemCount: x.ItemCount * -1 - })); - addMiscItems(inventory, miscItemChanges); - res.InventoryChanges.MiscItems = miscItemChanges; - } - - syndicate.Title ??= 0; - syndicate.Title += 1; - - if (reward) { - combineInventoryChanges( - res.InventoryChanges, - (await handleStoreItemAcquisition(reward, inventory)).InventoryChanges - ); - } - - // Quacks like a nightwave syndicate? - if (manifest.dailyChallenges) { - const title = manifest.titles!.find(x => x.level == syndicate.Title); - 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; + 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; } - 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; - rewardInventoryChanges.MiscItems = [{ ItemType: nightwaveCredsItemType, ItemCount: 50 }]; - addMiscItems(inventory, rewardInventoryChanges.MiscItems); + 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 }; } - combineInventoryChanges(res.InventoryChanges, rewardInventoryChanges); + 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 { - if (syndicate.Title > 0 && manifest.favours.find(x => x.rankUpReward && x.requiredLevel == syndicate.Title)) { + manifest.favours.filter(x => x.rankUpReward && x.requiredLevel <= newLevel).forEach(x => { syndicate.FreeFavorsEarned ??= []; - if (!syndicate.FreeFavorsEarned.includes(syndicate.Title)) { - syndicate.FreeFavorsEarned.push(syndicate.Title); + if (!syndicate.FreeFavorsEarned.includes(x.requiredLevel)) { + syndicate.FreeFavorsEarned.push(x.requiredLevel); } - } + }) } - + syndicate.Title = newLevel; await inventory.save(); response.json(res);