feat: clan vault 2 - contributing to room/deco construction from vault
This commit is contained in:
parent
9dd9478936
commit
ff1083c835
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user