feat: initial protovyre/evolving cosmetics
All checks were successful
Build / build (pull_request) Successful in 1m8s
All checks were successful
Build / build (pull_request) Successful in 1m8s
Basic handling of sending the challenge rewards to the inbox upon completion. Still missing handling for the Protovyre armor pieces which require killing sentients.
This commit is contained in:
parent
8f77c722cb
commit
bf4bfc4c69
@ -10,6 +10,7 @@ import { logger } from "@/src/utils/logger";
|
||||
export const updateChallengeProgressController: RequestHandler = async (req, res) => {
|
||||
const challenges = getJSONfromString<IUpdateChallengeProgressRequest>(String(req.body));
|
||||
const account = await getAccountForRequest(req);
|
||||
logger.debug(`challenge report:`, challenges);
|
||||
|
||||
const inventory = await getInventory(
|
||||
account._id.toString(),
|
||||
@ -17,7 +18,7 @@ export const updateChallengeProgressController: RequestHandler = async (req, res
|
||||
);
|
||||
let affiliationMods: IAffiliationMods[] = [];
|
||||
if (challenges.ChallengeProgress) {
|
||||
affiliationMods = addChallenges(
|
||||
affiliationMods = await addChallenges(
|
||||
account,
|
||||
inventory,
|
||||
challenges.ChallengeProgress,
|
||||
|
@ -1903,25 +1903,87 @@ export const addLoreFragmentScans = (inventory: TInventoryDatabaseDocument, arr:
|
||||
});
|
||||
};
|
||||
|
||||
export const addChallenges = (
|
||||
const challengeRewardsInboxMessages: Record<string, IMessageCreationTemplate> = {
|
||||
SentEvoEphemeraRankOne: {
|
||||
sub: "/Lotus/Language/Inbox/EvolvingEphemeraUnlockAName",
|
||||
sndr: "/Lotus/Language/Bosses/Ordis",
|
||||
msg: "/Lotus/Language/Inbox/EvolvingEphemeraUnlockADesc",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Ordis.png",
|
||||
att: ["/Lotus/Upgrades/Skins/Effects/NarmerEvolvingEphemeraB"]
|
||||
},
|
||||
SentEvoEphemeraRankTwo: {
|
||||
sub: "/Lotus/Language/Inbox/EvolvingEphemeraUnlockBName",
|
||||
sndr: "/Lotus/Language/Bosses/Ordis",
|
||||
msg: "/Lotus/Language/Inbox/EvolvingEphemeraUnlockBDesc",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Ordis.png",
|
||||
att: ["/Lotus/Upgrades/Skins/Effects/NarmerEvolvingEphemeraC"]
|
||||
},
|
||||
SentEvoSyandanaRankOne: {
|
||||
sub: "/Lotus/Language/Inbox/EvolvingSyandanaUnlockAName",
|
||||
sndr: "/Lotus/Language/Bosses/Ordis",
|
||||
msg: "/Lotus/Language/Inbox/EvolvingSyandanaUnlockADesc",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Ordis.png",
|
||||
att: ["/Lotus/Upgrades/Skins/Scarves/NarmerEvolvingSyandanaBCape"]
|
||||
},
|
||||
SentEvoSyandanaRankTwo: {
|
||||
sub: "/Lotus/Language/Inbox/EvolvingSyandanaUnlockBName",
|
||||
sndr: "/Lotus/Language/Bosses/Ordis",
|
||||
msg: "/Lotus/Language/Inbox/EvolvingSyandanaUnlockBDesc",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Ordis.png",
|
||||
att: ["/Lotus/Upgrades/Skins/Scarves/NarmerEvolvingSyandanaCCape"]
|
||||
},
|
||||
SentEvoSekharaRankOne: {
|
||||
sub: "/Lotus/Language/Inbox/EvolvingSekharaUnlockAName",
|
||||
sndr: "/Lotus/Language/Bosses/Ordis",
|
||||
msg: "/Lotus/Language/Inbox/EvolvingSekharaUnlockADesc",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Ordis.png",
|
||||
att: ["/Lotus/Upgrades/Skins/Clan/ZarimanEvolvingSekharaBadgeItemB"]
|
||||
},
|
||||
SentEvoSekharaRankTwo: {
|
||||
sub: "/Lotus/Language/Inbox/EvolvingSekharaUnlockBName",
|
||||
sndr: "/Lotus/Language/Bosses/Ordis",
|
||||
msg: "/Lotus/Language/Inbox/EvolvingSekharaUnlockBDesc",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Ordis.png",
|
||||
att: ["/Lotus/Upgrades/Skins/Clan/ZarimanEvolvingSekharaBadgeItemC"]
|
||||
}
|
||||
};
|
||||
|
||||
export const addChallenges = async (
|
||||
account: TAccountDocument,
|
||||
inventory: TInventoryDatabaseDocument,
|
||||
ChallengeProgress: IChallengeProgress[],
|
||||
SeasonChallengeCompletions: ISeasonChallenge[] | undefined
|
||||
): IAffiliationMods[] => {
|
||||
ChallengeProgress.forEach(({ Name, Progress }) => {
|
||||
const itemIndex = inventory.ChallengeProgress.findIndex(i => i.Name === Name);
|
||||
|
||||
if (itemIndex !== -1) {
|
||||
inventory.ChallengeProgress[itemIndex].Progress = Progress;
|
||||
): Promise<IAffiliationMods[]> => {
|
||||
for (const { Name, Progress, Completed } of ChallengeProgress) {
|
||||
let dbChallenge = inventory.ChallengeProgress.find(x => x.Name == Name);
|
||||
if (dbChallenge) {
|
||||
dbChallenge.Progress = Progress;
|
||||
} else {
|
||||
inventory.ChallengeProgress.push({ Name, Progress });
|
||||
dbChallenge = { Name, Progress };
|
||||
inventory.ChallengeProgress.push(dbChallenge);
|
||||
}
|
||||
|
||||
if (Name.startsWith("Calendar")) {
|
||||
addString(getCalendarProgress(inventory).SeasonProgress.ActivatedChallenges, Name);
|
||||
}
|
||||
});
|
||||
|
||||
if ((Completed?.length ?? 0) > (dbChallenge.Completed?.length ?? 0)) {
|
||||
dbChallenge.Completed ??= [];
|
||||
for (const completion of Completed!) {
|
||||
if (dbChallenge.Completed.indexOf(completion) == -1) {
|
||||
if (completion == "challengeRewards") {
|
||||
if (Name in challengeRewardsInboxMessages) {
|
||||
await createMessage(account._id, [challengeRewardsInboxMessages[Name]]);
|
||||
dbChallenge.Completed.push(completion);
|
||||
// Would love to somehow let the client know about inbox or inventory changes, but there doesn't seem to anything for updateChallengeProgress.
|
||||
continue;
|
||||
}
|
||||
}
|
||||
logger.warn(`ignoring unknown challenge completion`, { challenge: Name, completion });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const affiliationMods: IAffiliationMods[] = [];
|
||||
if (SeasonChallengeCompletions) {
|
||||
|
@ -292,7 +292,7 @@ export const addMissionInventoryUpdates = async (
|
||||
addRecipes(inventory, value);
|
||||
break;
|
||||
case "ChallengeProgress":
|
||||
addChallenges(account, inventory, value, inventoryUpdates.SeasonChallengeCompletions);
|
||||
await addChallenges(account, inventory, value, inventoryUpdates.SeasonChallengeCompletions);
|
||||
break;
|
||||
case "FusionTreasures":
|
||||
addFusionTreasures(inventory, value);
|
||||
|
Loading…
x
Reference in New Issue
Block a user