diff --git a/src/controllers/api/contributeToDojoComponentController.ts b/src/controllers/api/contributeToDojoComponentController.ts index 05859ad4..3177d5b6 100644 --- a/src/controllers/api/contributeToDojoComponentController.ts +++ b/src/controllers/api/contributeToDojoComponentController.ts @@ -94,10 +94,10 @@ const processContribution = ( component.RegularCredits += request.VaultCredits; guild.VaultRegularCredits! -= request.VaultCredits; } - if (component.RegularCredits > scaleRequiredCount(meta.price)) { + if (component.RegularCredits > scaleRequiredCount(guild.Tier, meta.price)) { guild.VaultRegularCredits ??= 0; - guild.VaultRegularCredits += component.RegularCredits - scaleRequiredCount(meta.price); - component.RegularCredits = scaleRequiredCount(meta.price); + guild.VaultRegularCredits += component.RegularCredits - scaleRequiredCount(guild.Tier, meta.price); + component.RegularCredits = scaleRequiredCount(guild.Tier, meta.price); } component.MiscItems ??= []; @@ -108,10 +108,10 @@ const processContribution = ( const ingredientMeta = meta.ingredients.find(x => x.ItemType == ingredientContribution.ItemType)!; if ( componentMiscItem.ItemCount + ingredientContribution.ItemCount > - scaleRequiredCount(ingredientMeta.ItemCount) + scaleRequiredCount(guild.Tier, ingredientMeta.ItemCount) ) { ingredientContribution.ItemCount = - scaleRequiredCount(ingredientMeta.ItemCount) - componentMiscItem.ItemCount; + scaleRequiredCount(guild.Tier, ingredientMeta.ItemCount) - componentMiscItem.ItemCount; } componentMiscItem.ItemCount += ingredientContribution.ItemCount; } else { @@ -129,10 +129,10 @@ const processContribution = ( const ingredientMeta = meta.ingredients.find(x => x.ItemType == ingredientContribution.ItemType)!; if ( componentMiscItem.ItemCount + ingredientContribution.ItemCount > - scaleRequiredCount(ingredientMeta.ItemCount) + scaleRequiredCount(guild.Tier, ingredientMeta.ItemCount) ) { ingredientContribution.ItemCount = - scaleRequiredCount(ingredientMeta.ItemCount) - componentMiscItem.ItemCount; + scaleRequiredCount(guild.Tier, ingredientMeta.ItemCount) - componentMiscItem.ItemCount; } componentMiscItem.ItemCount += ingredientContribution.ItemCount; } else { @@ -150,11 +150,14 @@ const processContribution = ( inventoryChanges.MiscItems = miscItemChanges; } - if (component.RegularCredits >= scaleRequiredCount(meta.price)) { + if (component.RegularCredits >= scaleRequiredCount(guild.Tier, meta.price)) { let fullyFunded = true; for (const ingredient of meta.ingredients) { const componentMiscItem = component.MiscItems.find(x => x.ItemType == ingredient.ItemType); - if (!componentMiscItem || componentMiscItem.ItemCount < scaleRequiredCount(ingredient.ItemCount)) { + if ( + !componentMiscItem || + componentMiscItem.ItemCount < scaleRequiredCount(guild.Tier, ingredient.ItemCount) + ) { fullyFunded = false; break; } diff --git a/src/controllers/api/dojoComponentRushController.ts b/src/controllers/api/dojoComponentRushController.ts index 5f334356..33aec126 100644 --- a/src/controllers/api/dojoComponentRushController.ts +++ b/src/controllers/api/dojoComponentRushController.ts @@ -1,4 +1,4 @@ -import { GuildMember } from "@/src/models/guildModel"; +import { GuildMember, TGuildDatabaseDocument } from "@/src/models/guildModel"; import { getDojoClient, getGuildForRequestEx, hasAccessToDojo, scaleRequiredCount } from "@/src/services/guildService"; import { getInventory, updateCurrency } from "@/src/services/inventoryService"; import { getAccountIdForRequest } from "@/src/services/loginService"; @@ -36,10 +36,10 @@ export const dojoComponentRushController: RequestHandler = async (req, res) => { if (request.DecoId) { const deco = component.Decos!.find(x => x._id.equals(request.DecoId))!; const meta = Object.values(ExportDojoRecipes.decos).find(x => x.resultType == deco.Type)!; - processContribution(deco, meta, platinumDonated); + processContribution(guild, deco, meta, platinumDonated); } else { const meta = Object.values(ExportDojoRecipes.rooms).find(x => x.resultType == component.pf)!; - processContribution(component, meta, platinumDonated); + processContribution(guild, component, meta, platinumDonated); const entry = guild.RoomChanges?.find(x => x.componentId.equals(component._id)); if (entry) { @@ -61,8 +61,13 @@ export const dojoComponentRushController: RequestHandler = async (req, res) => { }); }; -const processContribution = (component: IDojoContributable, meta: IDojoBuild, platinumDonated: number): void => { - const fullPlatinumCost = scaleRequiredCount(meta.skipTimePrice); +const processContribution = ( + guild: TGuildDatabaseDocument, + component: IDojoContributable, + meta: IDojoBuild, + platinumDonated: number +): void => { + const fullPlatinumCost = scaleRequiredCount(guild.Tier, meta.skipTimePrice); const fullDurationSeconds = meta.time; const secondsPerPlatinum = fullDurationSeconds / fullPlatinumCost; component.CompletionTime = new Date( diff --git a/src/controllers/api/guildTechController.ts b/src/controllers/api/guildTechController.ts index 58c505b0..ce9ba8e0 100644 --- a/src/controllers/api/guildTechController.ts +++ b/src/controllers/api/guildTechController.ts @@ -66,10 +66,10 @@ export const guildTechController: RequestHandler = async (req, res) => { guild.TechProjects[ guild.TechProjects.push({ ItemType: data.RecipeType, - ReqCredits: config.noDojoResearchCosts ? 0 : scaleRequiredCount(recipe.price), + ReqCredits: config.noDojoResearchCosts ? 0 : scaleRequiredCount(guild.Tier, recipe.price), ReqItems: recipe.ingredients.map(x => ({ ItemType: x.ItemType, - ItemCount: config.noDojoResearchCosts ? 0 : scaleRequiredCount(x.ItemCount) + ItemCount: config.noDojoResearchCosts ? 0 : scaleRequiredCount(guild.Tier, x.ItemCount) })), State: 0 }) - 1 diff --git a/src/services/guildService.ts b/src/services/guildService.ts index cdaf52fd..8573722b 100644 --- a/src/services/guildService.ts +++ b/src/services/guildService.ts @@ -199,9 +199,9 @@ export const getDojoClient = async ( return dojo; }; -export const scaleRequiredCount = (count: number): number => { - // The recipes in the export are for Moon clans. For now we'll just assume we only have Ghost clans. - return Math.max(1, Math.trunc(count / 100)); +const guildTierScalingFactors = [0.01, 0.03, 0.1, 0.3, 1]; +export const scaleRequiredCount = (tier: number, count: number): number => { + return Math.max(1, Math.trunc(count * guildTierScalingFactors[tier - 1])); }; export const removeDojoRoom = (guild: TGuildDatabaseDocument, componentId: Types.ObjectId | string): void => {