feat: clan tiers #1378
@ -94,10 +94,10 @@ const processContribution = (
 | 
				
			|||||||
        component.RegularCredits += request.VaultCredits;
 | 
					        component.RegularCredits += request.VaultCredits;
 | 
				
			||||||
        guild.VaultRegularCredits! -= 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 ??= 0;
 | 
				
			||||||
        guild.VaultRegularCredits += component.RegularCredits - scaleRequiredCount(meta.price);
 | 
					        guild.VaultRegularCredits += component.RegularCredits - scaleRequiredCount(guild.Tier, meta.price);
 | 
				
			||||||
        component.RegularCredits = scaleRequiredCount(meta.price);
 | 
					        component.RegularCredits = scaleRequiredCount(guild.Tier, meta.price);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    component.MiscItems ??= [];
 | 
					    component.MiscItems ??= [];
 | 
				
			||||||
@ -108,10 +108,10 @@ const processContribution = (
 | 
				
			|||||||
                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(guild.Tier, ingredientMeta.ItemCount)
 | 
				
			||||||
                ) {
 | 
					                ) {
 | 
				
			||||||
                    ingredientContribution.ItemCount =
 | 
					                    ingredientContribution.ItemCount =
 | 
				
			||||||
                        scaleRequiredCount(ingredientMeta.ItemCount) - componentMiscItem.ItemCount;
 | 
					                        scaleRequiredCount(guild.Tier, ingredientMeta.ItemCount) - componentMiscItem.ItemCount;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                componentMiscItem.ItemCount += ingredientContribution.ItemCount;
 | 
					                componentMiscItem.ItemCount += ingredientContribution.ItemCount;
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
@ -129,10 +129,10 @@ const processContribution = (
 | 
				
			|||||||
                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(guild.Tier, ingredientMeta.ItemCount)
 | 
				
			||||||
                ) {
 | 
					                ) {
 | 
				
			||||||
                    ingredientContribution.ItemCount =
 | 
					                    ingredientContribution.ItemCount =
 | 
				
			||||||
                        scaleRequiredCount(ingredientMeta.ItemCount) - componentMiscItem.ItemCount;
 | 
					                        scaleRequiredCount(guild.Tier, ingredientMeta.ItemCount) - componentMiscItem.ItemCount;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                componentMiscItem.ItemCount += ingredientContribution.ItemCount;
 | 
					                componentMiscItem.ItemCount += ingredientContribution.ItemCount;
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
@ -150,11 +150,14 @@ const processContribution = (
 | 
				
			|||||||
        inventoryChanges.MiscItems = miscItemChanges;
 | 
					        inventoryChanges.MiscItems = miscItemChanges;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (component.RegularCredits >= scaleRequiredCount(meta.price)) {
 | 
					    if (component.RegularCredits >= scaleRequiredCount(guild.Tier, meta.price)) {
 | 
				
			||||||
        let fullyFunded = true;
 | 
					        let fullyFunded = true;
 | 
				
			||||||
        for (const ingredient of meta.ingredients) {
 | 
					        for (const ingredient of meta.ingredients) {
 | 
				
			||||||
            const componentMiscItem = component.MiscItems.find(x => x.ItemType == ingredient.ItemType);
 | 
					            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;
 | 
					                fullyFunded = false;
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
				
			|||||||
@ -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 { getDojoClient, getGuildForRequestEx, hasAccessToDojo, scaleRequiredCount } from "@/src/services/guildService";
 | 
				
			||||||
import { getInventory, updateCurrency } from "@/src/services/inventoryService";
 | 
					import { getInventory, updateCurrency } from "@/src/services/inventoryService";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
				
			||||||
@ -36,10 +36,10 @@ export const dojoComponentRushController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
    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(deco, meta, platinumDonated);
 | 
					        processContribution(guild, deco, meta, platinumDonated);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        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(component, meta, platinumDonated);
 | 
					        processContribution(guild, component, meta, platinumDonated);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const entry = guild.RoomChanges?.find(x => x.componentId.equals(component._id));
 | 
					        const entry = guild.RoomChanges?.find(x => x.componentId.equals(component._id));
 | 
				
			||||||
        if (entry) {
 | 
					        if (entry) {
 | 
				
			||||||
@ -61,8 +61,13 @@ export const dojoComponentRushController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const processContribution = (component: IDojoContributable, meta: IDojoBuild, platinumDonated: number): void => {
 | 
					const processContribution = (
 | 
				
			||||||
    const fullPlatinumCost = scaleRequiredCount(meta.skipTimePrice);
 | 
					    guild: TGuildDatabaseDocument,
 | 
				
			||||||
 | 
					    component: IDojoContributable,
 | 
				
			||||||
 | 
					    meta: IDojoBuild,
 | 
				
			||||||
 | 
					    platinumDonated: number
 | 
				
			||||||
 | 
					): void => {
 | 
				
			||||||
 | 
					    const fullPlatinumCost = scaleRequiredCount(guild.Tier, meta.skipTimePrice);
 | 
				
			||||||
    const fullDurationSeconds = meta.time;
 | 
					    const fullDurationSeconds = meta.time;
 | 
				
			||||||
    const secondsPerPlatinum = fullDurationSeconds / fullPlatinumCost;
 | 
					    const secondsPerPlatinum = fullDurationSeconds / fullPlatinumCost;
 | 
				
			||||||
    component.CompletionTime = new Date(
 | 
					    component.CompletionTime = new Date(
 | 
				
			||||||
 | 
				
			|||||||
@ -66,10 +66,10 @@ export const guildTechController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
                guild.TechProjects[
 | 
					                guild.TechProjects[
 | 
				
			||||||
                    guild.TechProjects.push({
 | 
					                    guild.TechProjects.push({
 | 
				
			||||||
                        ItemType: data.RecipeType,
 | 
					                        ItemType: data.RecipeType,
 | 
				
			||||||
                        ReqCredits: config.noDojoResearchCosts ? 0 : scaleRequiredCount(recipe.price),
 | 
					                        ReqCredits: config.noDojoResearchCosts ? 0 : scaleRequiredCount(guild.Tier, recipe.price),
 | 
				
			||||||
                        ReqItems: recipe.ingredients.map(x => ({
 | 
					                        ReqItems: recipe.ingredients.map(x => ({
 | 
				
			||||||
                            ItemType: x.ItemType,
 | 
					                            ItemType: x.ItemType,
 | 
				
			||||||
                            ItemCount: config.noDojoResearchCosts ? 0 : scaleRequiredCount(x.ItemCount)
 | 
					                            ItemCount: config.noDojoResearchCosts ? 0 : scaleRequiredCount(guild.Tier, x.ItemCount)
 | 
				
			||||||
                        })),
 | 
					                        })),
 | 
				
			||||||
                        State: 0
 | 
					                        State: 0
 | 
				
			||||||
                    }) - 1
 | 
					                    }) - 1
 | 
				
			||||||
 | 
				
			|||||||
@ -199,9 +199,9 @@ export const getDojoClient = async (
 | 
				
			|||||||
    return dojo;
 | 
					    return dojo;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const scaleRequiredCount = (count: number): number => {
 | 
					const guildTierScalingFactors = [0.01, 0.03, 0.1, 0.3, 1];
 | 
				
			||||||
    // The recipes in the export are for Moon clans. For now we'll just assume we only have Ghost clans.
 | 
					export const scaleRequiredCount = (tier: number, count: number): number => {
 | 
				
			||||||
    return Math.max(1, Math.trunc(count / 100));
 | 
					    return Math.max(1, Math.trunc(count * guildTierScalingFactors[tier - 1]));
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const removeDojoRoom = (guild: TGuildDatabaseDocument, componentId: Types.ObjectId | string): void => {
 | 
					export const removeDojoRoom = (guild: TGuildDatabaseDocument, componentId: Types.ObjectId | string): void => {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user