feat: clan vault 2 - contributing to room/deco construction from vault

This commit is contained in:
Sainan 2025-03-06 17:37:51 +01:00
parent 9dd9478936
commit ff1083c835

View File

@ -1,3 +1,4 @@
import { TGuildDatabaseDocument } from "@/src/models/guildModel";
import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel"; import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
import { getDojoClient, getGuildForRequestEx, scaleRequiredCount } from "@/src/services/guildService"; import { getDojoClient, getGuildForRequestEx, scaleRequiredCount } from "@/src/services/guildService";
import { addMiscItems, getInventory, updateCurrency } from "@/src/services/inventoryService"; import { addMiscItems, getInventory, updateCurrency } from "@/src/services/inventoryService";
@ -12,12 +13,9 @@ interface IContributeToDojoComponentRequest {
ComponentId: string; ComponentId: string;
DecoId?: string; DecoId?: string;
DecoType?: string; DecoType?: string;
IngredientContributions: { IngredientContributions: IMiscItem[];
ItemType: string;
ItemCount: number;
}[];
RegularCredits: number; RegularCredits: number;
VaultIngredientContributions: []; VaultIngredientContributions: IMiscItem[];
VaultCredits: number; VaultCredits: number;
} }
@ -36,13 +34,13 @@ export const contributeToDojoComponentController: RequestHandler = async (req, r
throw new Error("attempt to contribute to a deco in an unfinished room?!"); throw new Error("attempt to contribute to a deco in an unfinished room?!");
} }
const meta = Object.values(ExportDojoRecipes.rooms).find(x => x.resultType == component.pf)!; const meta = Object.values(ExportDojoRecipes.rooms).find(x => x.resultType == component.pf)!;
processContribution(request, inventory, inventoryChanges, meta, component); processContribution(guild, request, inventory, inventoryChanges, meta, component);
} else { } else {
// Room is past "Collecting Materials" // Room is past "Collecting Materials"
if (request.DecoId) { if (request.DecoId) {
const deco = component.Decos!.find(x => x._id.equals(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)!; const meta = Object.values(ExportDojoRecipes.decos).find(x => x.resultType == deco.Type)!;
processContribution(request, inventory, inventoryChanges, meta, deco); processContribution(guild, request, inventory, inventoryChanges, meta, deco);
} }
} }
@ -55,6 +53,7 @@ export const contributeToDojoComponentController: RequestHandler = async (req, r
}; };
const processContribution = ( const processContribution = (
guild: TGuildDatabaseDocument,
request: IContributeToDojoComponentRequest, request: IContributeToDojoComponentRequest,
inventory: TInventoryDatabaseDocument, inventory: TInventoryDatabaseDocument,
inventoryChanges: IInventoryChanges, inventoryChanges: IInventoryChanges,
@ -62,37 +61,67 @@ const processContribution = (
component: IDojoContributable component: IDojoContributable
): void => { ): void => {
component.RegularCredits ??= 0; component.RegularCredits ??= 0;
if (component.RegularCredits + request.RegularCredits > scaleRequiredCount(meta.price)) { if (request.RegularCredits) {
request.RegularCredits = scaleRequiredCount(meta.price) - component.RegularCredits; component.RegularCredits += request.RegularCredits;
inventoryChanges.RegularCredits = -request.RegularCredits;
updateCurrency(inventory, request.RegularCredits, false);
}
if (request.VaultCredits) {
component.RegularCredits += request.VaultCredits;
guild.VaultRegularCredits! -= request.VaultCredits;
}
if (component.RegularCredits > scaleRequiredCount(meta.price)) {
guild.VaultRegularCredits ??= 0;
guild.VaultRegularCredits += component.RegularCredits - scaleRequiredCount(meta.price);
component.RegularCredits = scaleRequiredCount(meta.price);
} }
component.RegularCredits += request.RegularCredits;
inventoryChanges.RegularCredits = -request.RegularCredits;
updateCurrency(inventory, request.RegularCredits, false);
component.MiscItems ??= []; component.MiscItems ??= [];
const miscItemChanges: IMiscItem[] = []; if (request.VaultIngredientContributions.length) {
for (const ingredientContribution of request.IngredientContributions) { for (const ingredientContribution of request.VaultIngredientContributions) {
const componentMiscItem = component.MiscItems.find(x => x.ItemType == ingredientContribution.ItemType); const componentMiscItem = component.MiscItems.find(x => x.ItemType == ingredientContribution.ItemType);
if (componentMiscItem) { if (componentMiscItem) {
const ingredientMeta = meta.ingredients.find(x => x.ItemType == ingredientContribution.ItemType)!; const ingredientMeta = meta.ingredients.find(x => x.ItemType == ingredientContribution.ItemType)!;
if ( if (
componentMiscItem.ItemCount + ingredientContribution.ItemCount > componentMiscItem.ItemCount + ingredientContribution.ItemCount >
scaleRequiredCount(ingredientMeta.ItemCount) scaleRequiredCount(ingredientMeta.ItemCount)
) { ) {
ingredientContribution.ItemCount = ingredientContribution.ItemCount =
scaleRequiredCount(ingredientMeta.ItemCount) - componentMiscItem.ItemCount; scaleRequiredCount(ingredientMeta.ItemCount) - componentMiscItem.ItemCount;
}
componentMiscItem.ItemCount += ingredientContribution.ItemCount;
} else {
component.MiscItems.push(ingredientContribution);
} }
componentMiscItem.ItemCount += ingredientContribution.ItemCount; const vaultMiscItem = guild.VaultMiscItems!.find(x => x.ItemType == ingredientContribution.ItemType)!;
} else { vaultMiscItem.ItemCount -= ingredientContribution.ItemCount;
component.MiscItems.push(ingredientContribution);
} }
miscItemChanges.push({
ItemType: ingredientContribution.ItemType,
ItemCount: ingredientContribution.ItemCount * -1
});
} }
addMiscItems(inventory, miscItemChanges); if (request.IngredientContributions.length) {
inventoryChanges.MiscItems = miscItemChanges; const miscItemChanges: IMiscItem[] = [];
for (const ingredientContribution of request.IngredientContributions) {
const componentMiscItem = component.MiscItems.find(x => x.ItemType == ingredientContribution.ItemType);
if (componentMiscItem) {
const ingredientMeta = meta.ingredients.find(x => x.ItemType == ingredientContribution.ItemType)!;
if (
componentMiscItem.ItemCount + ingredientContribution.ItemCount >
scaleRequiredCount(ingredientMeta.ItemCount)
) {
ingredientContribution.ItemCount =
scaleRequiredCount(ingredientMeta.ItemCount) - componentMiscItem.ItemCount;
}
componentMiscItem.ItemCount += ingredientContribution.ItemCount;
} else {
component.MiscItems.push(ingredientContribution);
}
miscItemChanges.push({
ItemType: ingredientContribution.ItemType,
ItemCount: ingredientContribution.ItemCount * -1
});
}
addMiscItems(inventory, miscItemChanges);
inventoryChanges.MiscItems = miscItemChanges;
}
if (component.RegularCredits >= scaleRequiredCount(meta.price)) { if (component.RegularCredits >= scaleRequiredCount(meta.price)) {
let fullyFunded = true; let fullyFunded = true;