scale guild resource costs based on tier
This commit is contained in:
parent
1bdc5126b3
commit
1f9c1900a3
@ -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
|
||||||
|
@ -198,9 +198,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