Mod fusion

This commit is contained in:
holmityd 2023-08-31 22:20:55 +04:00
parent 37e5e0defa
commit 6b8c412c74
7 changed files with 150 additions and 37 deletions

View File

@ -0,0 +1,23 @@
import { upgradeMod } from "@/src/services/inventoryService";
import { RequestHandler } from "express";
// eslint-disable-next-line @typescript-eslint/no-misused-promises
const artifactsController: RequestHandler = async (req, res) => {
const [data] = String(req.body).split("\n");
const id = req.query.accountId as string;
// TODO - salt check
try {
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
const parsedData = JSON.parse(data);
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
await upgradeMod(parsedData, id);
res.json({});
} catch (err) {
console.error("Error parsing JSON data:", err);
}
};
export { artifactsController };

View File

@ -83,6 +83,7 @@ const missionInventoryUpdateController: RequestHandler = async (req, res) => {
- [x] CreditsBonus - [x] CreditsBonus
- [x] MissionCredits - [x] MissionCredits
- [ ] InventoryChanges - [ ] InventoryChanges
- [ ] FusionPoints int
*/ */
export { missionInventoryUpdateController }; export { missionInventoryUpdateController };

View File

@ -1,7 +1,7 @@
import { Model, Schema, Types, model } from "mongoose"; import { Model, Schema, Types, model } from "mongoose";
import { FlavourItem, RawUpgrade, MiscItem, IInventoryDatabase, Booster } from "../types/inventoryTypes/inventoryTypes"; import { FlavourItem, RawUpgrade, MiscItem, IInventoryDatabase, Booster } from "../types/inventoryTypes/inventoryTypes";
import { Oid } from "../types/commonTypes"; import { Oid } from "../types/commonTypes";
import { ISuitDatabase, ISuitDocument } from "@/src/types/inventoryTypes/SuitTypes"; import { ISuitDatabase } from "@/src/types/inventoryTypes/SuitTypes";
import { IWeaponDatabase } from "@/src/types/inventoryTypes/weaponTypes"; import { IWeaponDatabase } from "@/src/types/inventoryTypes/weaponTypes";
const abilityOverrideSchema = new Schema({ const abilityOverrideSchema = new Schema({
@ -71,6 +71,24 @@ const BoosterSchema = new Schema({
ItemType: String ItemType: String
}); });
const RawUpgrades = new Schema({
ItemType: String,
UpgradeFingerprint: String,
PendingRerollFingerprint: String,
ItemCount: Number
});
RawUpgrades.set("toJSON", {
transform(_document, returnedObject) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
returnedObject.ItemId = { $oid: returnedObject._id.toString() } satisfies Oid;
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
returnedObject.LastAdded = { $oid: returnedObject.__v.toString() } satisfies Oid;
delete returnedObject._id;
delete returnedObject.__v;
}
});
WeaponSchema.set("toJSON", { WeaponSchema.set("toJSON", {
transform(_document, returnedObject) { transform(_document, returnedObject) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
@ -181,7 +199,7 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>({
MiscItems: [Schema.Types.Mixed], MiscItems: [Schema.Types.Mixed],
ChallengesFixVersion: Number, ChallengesFixVersion: Number,
ChallengeProgress: [Schema.Types.Mixed], ChallengeProgress: [Schema.Types.Mixed],
RawUpgrades: [Schema.Types.Mixed], RawUpgrades: [RawUpgrades],
ReceivedStartingGear: Boolean, ReceivedStartingGear: Boolean,
Suits: [suitSchema], Suits: [suitSchema],
LongGuns: [WeaponSchema], LongGuns: [WeaponSchema],
@ -344,7 +362,7 @@ type InventoryDocumentProps = {
Boosters: Types.DocumentArray<Booster>; Boosters: Types.DocumentArray<Booster>;
}; };
type InventoryModelType = Model<IInventoryDatabase, {}, InventoryDocumentProps>; type InventoryModelType = Model<IInventoryDatabase, object, InventoryDocumentProps>;
const Inventory = model<IInventoryDatabase, InventoryModelType>("Inventory", inventorySchema); const Inventory = model<IInventoryDatabase, InventoryModelType>("Inventory", inventorySchema);

View File

@ -29,6 +29,7 @@ import { updateSessionGetController, updateSessionPostController } from "@/src/c
import { viewController } from "@/src/controllers/api/viewController"; import { viewController } from "@/src/controllers/api/viewController";
import { joinSessionController } from "@/src/controllers/api/joinSessionController"; import { joinSessionController } from "@/src/controllers/api/joinSessionController";
import { saveLoadoutController } from "@/src/controllers/api/saveLoadout"; import { saveLoadoutController } from "@/src/controllers/api/saveLoadout";
import { artifactsController } from "../controllers/api/artifactsController";
import express from "express"; import express from "express";
@ -58,6 +59,7 @@ apiRouter.get("/deleteSession.php", deleteSessionController);
apiRouter.get("/logout.php", logoutController); apiRouter.get("/logout.php", logoutController);
// post // post
apiRouter.post("/artifacts.php", artifactsController);
apiRouter.post("/findSessions.php", findSessionsController); apiRouter.post("/findSessions.php", findSessionsController);
// eslint-disable-next-line @typescript-eslint/no-misused-promises // eslint-disable-next-line @typescript-eslint/no-misused-promises
apiRouter.post("/purchase.php", purchaseController); apiRouter.post("/purchase.php", purchaseController);

View File

@ -5,13 +5,14 @@ import { Types } from "mongoose";
import { ISuitResponse } from "@/src/types/inventoryTypes/SuitTypes"; import { ISuitResponse } from "@/src/types/inventoryTypes/SuitTypes";
import { SlotType } from "@/src/types/purchaseTypes"; import { SlotType } from "@/src/types/purchaseTypes";
import { IWeaponResponse } from "@/src/types/inventoryTypes/weaponTypes"; import { IWeaponResponse } from "@/src/types/inventoryTypes/weaponTypes";
import { ChallengeProgress, FlavourItem, IInventoryDatabaseDocument } from "@/src/types/inventoryTypes/inventoryTypes";
import { import {
MissionInventoryUpdate, ChallengeProgress,
MissionInventoryUpdateCard, FlavourItem,
MissionInventoryUpdateGear, IInventoryDatabaseDocument,
MissionInventoryUpdateItem MiscItem,
} from "../types/missionInventoryUpdateType"; RawUpgrade
} from "@/src/types/inventoryTypes/inventoryTypes";
import { MissionInventoryUpdate, MissionInventoryUpdateGear } from "../types/missionInventoryUpdateType";
const createInventory = async (accountOwnerId: Types.ObjectId) => { const createInventory = async (accountOwnerId: Types.ObjectId) => {
try { try {
@ -130,21 +131,33 @@ const addGearExpByCategory = (
}); });
}; };
const addItemsByCategory = ( const addMiscItems = (inventory: IInventoryDatabaseDocument, itemsArray: MiscItem[] | undefined) => {
inventory: IInventoryDatabaseDocument, const { MiscItems } = inventory;
itemsArray: (MissionInventoryUpdateItem | MissionInventoryUpdateCard)[] | undefined,
categoryName: "RawUpgrades" | "MiscItems"
) => {
const category = inventory[categoryName];
itemsArray?.forEach(({ ItemCount, ItemType }) => { itemsArray?.forEach(({ ItemCount, ItemType }) => {
const itemIndex = category.findIndex(i => i.ItemType === ItemType); const itemIndex = MiscItems.findIndex(i => i.ItemType === ItemType);
if (itemIndex !== -1) { if (itemIndex !== -1) {
category[itemIndex].ItemCount += ItemCount; MiscItems[itemIndex].ItemCount += ItemCount;
inventory.markModified(`${categoryName}.${itemIndex}.ItemCount`); inventory.markModified(`MiscItems.${itemIndex}.ItemCount`);
} else { } else {
category.push({ ItemCount, ItemType }); MiscItems.push({ ItemCount, ItemType });
}
});
};
const addMods = (inventory: IInventoryDatabaseDocument, itemsArray: RawUpgrade[] | undefined) => {
const { RawUpgrades } = inventory;
itemsArray?.forEach(({ ItemType, ItemCount, UpgradeFingerprint }) => {
const itemIndex = RawUpgrades.findIndex(
i => i.ItemType === ItemType && i.UpgradeFingerprint === UpgradeFingerprint
);
if (itemIndex !== -1) {
RawUpgrades[itemIndex].ItemCount += ItemCount;
inventory.markModified(`RawUpgrades.${itemIndex}.ItemCount`);
} else {
RawUpgrades.push({ ItemCount, ItemType });
} }
}); });
}; };
@ -171,7 +184,8 @@ export const missionInventoryUpdate = async (data: MissionInventoryUpdate, accou
const { RawUpgrades, MiscItems, RegularCredits, ChallengeProgress } = data; const { RawUpgrades, MiscItems, RegularCredits, ChallengeProgress } = data;
const inventory = await getInventory(accountId); const inventory = await getInventory(accountId);
// TODO - multipliers logic // TODO - multipliers logic for mission reward (looted comes multiplied)
// credits // credits
inventory.RegularCredits += RegularCredits || 0; inventory.RegularCredits += RegularCredits || 0;
@ -179,8 +193,8 @@ export const missionInventoryUpdate = async (data: MissionInventoryUpdate, accou
gearKeys.forEach((key: GearKeysType) => addGearExpByCategory(inventory, data[key], key)); gearKeys.forEach((key: GearKeysType) => addGearExpByCategory(inventory, data[key], key));
// other // other
addItemsByCategory(inventory, RawUpgrades, "RawUpgrades"); // TODO - check mods fusion level addMods(inventory, RawUpgrades);
addItemsByCategory(inventory, MiscItems, "MiscItems"); addMiscItems(inventory, MiscItems);
addChallenges(inventory, ChallengeProgress); addChallenges(inventory, ChallengeProgress);
const changedInventory = await inventory.save(); const changedInventory = await inventory.save();
@ -206,4 +220,62 @@ export const addBooster = async (ItemType: string, time: number, accountId: stri
await inventory.save(); await inventory.save();
}; };
export const upgradeMod = async (
{
Upgrade,
LevelDiff,
Cost,
FusionPointCost
}: { Upgrade: RawUpgrade; LevelDiff: number; Cost: number; FusionPointCost: number },
accountId: string
): Promise<void> => {
const inventory = await getInventory(accountId);
const { RawUpgrades } = inventory;
const { ItemCount, ItemType, UpgradeFingerprint } = Upgrade;
const itemIndex = RawUpgrades.findIndex(
i => i.ItemType === ItemType && i.UpgradeFingerprint === UpgradeFingerprint
);
const safeUpgradeFingerprint = UpgradeFingerprint || '{"lvl":0}';
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
const parsedUpgradeFingerprint = JSON.parse(safeUpgradeFingerprint);
parsedUpgradeFingerprint.lvl += LevelDiff;
if (!ItemCount) return;
RawUpgrades[itemIndex].ItemCount--;
if (RawUpgrades[itemIndex].ItemCount > 0) {
inventory.markModified(`RawUpgrades.${itemIndex}.ItemCount`);
} else {
RawUpgrades.splice(itemIndex, 1);
inventory.markModified(`RawUpgrades`);
}
addMods(inventory, [{ ItemType, ItemCount: 1, UpgradeFingerprint: JSON.stringify(parsedUpgradeFingerprint) }]);
inventory.RegularCredits -= Cost;
inventory.FusionPoints -= FusionPointCost;
await inventory.save();
// {
// "Upgrade": {
// ItemType: "/Lotus/Upgrades/Mods/Warframe/Beginner/AvatarShieldMaxModBeginner",
// ItemId: {
// $oid: ""
// },
// UpgradeFingerprint: '{"lvl":1}',
// PendingRerollFingerprint: "",
// ItemCount: 2,
// LastAdded: {
// $oid: "64f01ab0c4dfa3a8ef090043"
// }
// }
// "LevelDiff": 1,
// "Consumed": [],
// "Cost": 483,
// "FusionPointCost": 10
// }
};
export { createInventory, addPowerSuit }; export { createInventory, addPowerSuit };

View File

@ -377,11 +377,6 @@ export interface FlavourItem {
ItemType: string; ItemType: string;
} }
export interface RawUpgrade {
ItemCount: number;
ItemType: string;
}
export interface MiscItem { export interface MiscItem {
ItemCount: number; ItemCount: number;
ItemType: string; ItemType: string;
@ -928,9 +923,11 @@ export interface Progress {
} }
export interface RawUpgrade { export interface RawUpgrade {
ItemCount: number;
LastAdded?: Oid;
ItemType: string; ItemType: string;
ItemCount: number;
UpgradeFingerprint?: string;
PendingRerollFingerprint?: string;
LastAdded?: Oid;
} }
export interface Scoop { export interface Scoop {

View File

@ -1,14 +1,14 @@
interface MongooseId{ interface MongooseId {
$oid: string; $oid: string;
} }
interface ExpireDate{ interface ExpireDate {
$date: { $date: {
$numberLong: string; $numberLong: string;
} };
} }
export interface MissionInventoryUpdateGear{ export interface MissionInventoryUpdateGear {
ItemType: string; ItemType: string;
ItemName: string; ItemName: string;
ItemId: MongooseId; ItemId: MongooseId;
@ -32,25 +32,25 @@ export interface MissionInventoryUpdateGear{
ArchonCrystalUpgrades: any[]; ArchonCrystalUpgrades: any[];
} }
export interface MissionInventoryUpdateItem{ export interface MissionInventoryUpdateItem {
ItemCount: number; ItemCount: number;
ItemType: string; ItemType: string;
} }
export interface MissionInventoryUpdateCard extends MissionInventoryUpdateItem{ export interface MissionInventoryUpdateCard extends MissionInventoryUpdateItem {
ItemId: MongooseId; ItemId: MongooseId;
UpgradeFingerprint: string; UpgradeFingerprint: string;
PendingRerollFingerprint: string; PendingRerollFingerprint: string;
LastAdded: MongooseId; LastAdded: MongooseId;
} }
interface MissionInventoryUpdateChallange{ interface MissionInventoryUpdateChallange {
Name: string; Name: string;
Progress: number; Progress: number;
Completed: any[]; Completed: any[];
} }
export interface MissionInventoryUpdate{ export interface MissionInventoryUpdate {
rewardsMultiplier?: number; rewardsMultiplier?: number;
ActiveBoosters?: any[]; ActiveBoosters?: any[];
LongGuns?: MissionInventoryUpdateGear[]; LongGuns?: MissionInventoryUpdateGear[];