WIP: feat: resource extractor drones
This commit is contained in:
parent
d7ec259e2d
commit
7ab5dde883
8
package-lock.json
generated
8
package-lock.json
generated
@ -12,7 +12,7 @@
|
||||
"copyfiles": "^2.4.1",
|
||||
"express": "^5",
|
||||
"mongoose": "^8.11.0",
|
||||
"warframe-public-export-plus": "^0.5.38",
|
||||
"warframe-public-export-plus": "^0.5.39",
|
||||
"warframe-riven-info": "^0.1.2",
|
||||
"winston": "^3.17.0",
|
||||
"winston-daily-rotate-file": "^5.0.0"
|
||||
@ -4083,9 +4083,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/warframe-public-export-plus": {
|
||||
"version": "0.5.38",
|
||||
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.38.tgz",
|
||||
"integrity": "sha512-yvc86eOmYPSnnU8LzLBhg/lR1AS1RHID24TqFHVcZuOzMYc934NL8Cv7rtllyefWAMyl7iA5x9tyXSuJWbi6CA=="
|
||||
"version": "0.5.39",
|
||||
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.39.tgz",
|
||||
"integrity": "sha512-sEGZedtW4I/M2ceoDs6MQ5eHD7sJgv1KRNLt8BWByXLuDa7qTR3Y9px5TGxqt/rBHKGUyPO1LUxu4bDGZi6yXw=="
|
||||
},
|
||||
"node_modules/warframe-riven-info": {
|
||||
"version": "0.1.2",
|
||||
|
@ -17,7 +17,7 @@
|
||||
"copyfiles": "^2.4.1",
|
||||
"express": "^5",
|
||||
"mongoose": "^8.11.0",
|
||||
"warframe-public-export-plus": "^0.5.38",
|
||||
"warframe-public-export-plus": "^0.5.39",
|
||||
"warframe-riven-info": "^0.1.2",
|
||||
"winston": "^3.17.0",
|
||||
"winston-daily-rotate-file": "^5.0.0"
|
||||
|
@ -1,7 +1,133 @@
|
||||
import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers";
|
||||
import { addMiscItems, getInventory } from "@/src/services/inventoryService";
|
||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
||||
import { getRandomElement, getRandomInt } from "@/src/services/rngService";
|
||||
import { IMongoDate, IOid } from "@/src/types/commonTypes";
|
||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
|
||||
import { RequestHandler } from "express";
|
||||
import { ExportDrones, ExportResources, ExportSystems } from "warframe-public-export-plus";
|
||||
|
||||
const dronesController: RequestHandler = (_req, res) => {
|
||||
res.json({});
|
||||
export const dronesController: RequestHandler = async (req, res) => {
|
||||
const accountId = await getAccountIdForRequest(req);
|
||||
const inventory = await getInventory(accountId);
|
||||
if ("GetActive" in req.query) {
|
||||
const activeDrones: IActiveDrone[] = [];
|
||||
for (const drone of inventory.Drones) {
|
||||
if (drone.DeployTime) {
|
||||
activeDrones.push({
|
||||
DeployTime: toMongoDate(drone.DeployTime),
|
||||
System: drone.System!,
|
||||
ItemId: toOid(drone._id),
|
||||
ItemType: drone.ItemType,
|
||||
CurrentHP: drone.CurrentHP,
|
||||
DamageTime: drone.DamageTime ? toMongoDate(drone.DamageTime) : undefined,
|
||||
PendingDamage: drone.PendingDamage,
|
||||
Resources: [
|
||||
{
|
||||
ItemType: drone.ResourceType!,
|
||||
BinTotal: drone.ResourceCount!,
|
||||
StartTime: toMongoDate(drone.DeployTime)
|
||||
}
|
||||
]
|
||||
});
|
||||
}
|
||||
}
|
||||
res.json({
|
||||
ActiveDrones: activeDrones
|
||||
});
|
||||
} else if ("droneId" in req.query && "systemIndex" in req.query) {
|
||||
const instantResourceDrones = true;
|
||||
const dronesAlwaysTakeDamage = true;
|
||||
const drone = inventory.Drones.id(req.query.droneId as string)!;
|
||||
const droneMeta = ExportDrones[drone.ItemType];
|
||||
drone.DeployTime = instantResourceDrones ? new Date(0) : new Date();
|
||||
if (drone.RepairStart) {
|
||||
const repairMinutes = (Date.now() - drone.RepairStart.getTime()) / 60_000;
|
||||
const hpPerMinute = droneMeta.repairRate / 60;
|
||||
drone.CurrentHP = Math.min(drone.CurrentHP + Math.round(repairMinutes * hpPerMinute), droneMeta.durability);
|
||||
drone.RepairStart = undefined;
|
||||
}
|
||||
drone.System = parseInt(req.query.systemIndex as string);
|
||||
const system = ExportSystems[drone.System - 1];
|
||||
if (dronesAlwaysTakeDamage || Math.random() < system.damageChance) {
|
||||
drone.DamageTime = instantResourceDrones
|
||||
? new Date()
|
||||
: new Date(Date.now() + getRandomInt(3, 4) * 3600_000);
|
||||
drone.PendingDamage = getRandomInt(system.droneDamage.minValue, system.droneDamage.maxValue);
|
||||
}
|
||||
const resource = getRandomElement(system.resources);
|
||||
drone.ResourceType = "/Lotus/" + resource.StoreItem.substring(18);
|
||||
const resourceMeta = ExportResources[drone.ResourceType];
|
||||
if (resourceMeta.pickupQuantity) {
|
||||
const pickupsToCollect = droneMeta.binCapacity * droneMeta.capacityMultipliers[resource.Rarity];
|
||||
drone.ResourceCount = 0;
|
||||
for (let i = 0; i != pickupsToCollect; ++i) {
|
||||
drone.ResourceCount += getRandomInt(
|
||||
resourceMeta.pickupQuantity.minValue,
|
||||
resourceMeta.pickupQuantity.maxValue
|
||||
);
|
||||
}
|
||||
} else {
|
||||
drone.ResourceCount = 1;
|
||||
}
|
||||
await inventory.save();
|
||||
res.json({});
|
||||
} else if ("collectDroneId" in req.query) {
|
||||
const drone = inventory.Drones.id(req.query.collectDroneId as string)!;
|
||||
|
||||
if (drone.DamageTime && new Date() >= drone.DamageTime) {
|
||||
drone.CurrentHP -= drone.PendingDamage!;
|
||||
drone.RepairStart = new Date();
|
||||
}
|
||||
|
||||
const inventoryChanges: IInventoryChanges = {};
|
||||
if (drone.CurrentHP <= 0) {
|
||||
inventory.RegularCredits += 100;
|
||||
inventoryChanges.RegularCredits = 100;
|
||||
inventory.Drones.pull({ _id: req.query.collectDroneId as string });
|
||||
// TODO: Response format?
|
||||
} else {
|
||||
const completionTime = drone.DeployTime!.getTime() + ExportDrones[drone.ItemType].fillRate * 3600_000;
|
||||
if (Date.now() >= completionTime) {
|
||||
const miscItemChanges = [
|
||||
{
|
||||
ItemType: drone.ResourceType!,
|
||||
ItemCount: drone.ResourceCount!
|
||||
}
|
||||
];
|
||||
addMiscItems(inventory, miscItemChanges);
|
||||
inventoryChanges.MiscItems = miscItemChanges;
|
||||
}
|
||||
|
||||
drone.DeployTime = undefined;
|
||||
drone.System = undefined;
|
||||
drone.DamageTime = undefined;
|
||||
drone.PendingDamage = undefined;
|
||||
drone.ResourceType = undefined;
|
||||
drone.ResourceCount = undefined;
|
||||
}
|
||||
|
||||
await inventory.save();
|
||||
res.json({
|
||||
// TODO: Let the client know the new HP of this drone... somehow
|
||||
InventoryChanges: inventoryChanges
|
||||
});
|
||||
} else {
|
||||
throw new Error(`drones.php query not handled`);
|
||||
}
|
||||
};
|
||||
|
||||
export { dronesController };
|
||||
interface IActiveDrone {
|
||||
DeployTime: IMongoDate;
|
||||
System: number;
|
||||
ItemId: IOid;
|
||||
ItemType: string;
|
||||
CurrentHP: number;
|
||||
DamageTime?: IMongoDate;
|
||||
PendingDamage?: number;
|
||||
Resources: {
|
||||
ItemType: string;
|
||||
BinTotal: number;
|
||||
StartTime: IMongoDate;
|
||||
}[];
|
||||
}
|
||||
|
@ -336,7 +336,14 @@ const droneSchema = new Schema<IDroneDatabase>(
|
||||
{
|
||||
ItemType: String,
|
||||
CurrentHP: Number,
|
||||
RepairStart: { type: Date, default: undefined }
|
||||
RepairStart: { type: Date, default: undefined },
|
||||
|
||||
DeployTime: { type: Date, default: undefined },
|
||||
System: Number,
|
||||
DamageTime: { type: Date, default: undefined },
|
||||
PendingDamage: Number,
|
||||
ResourceType: String,
|
||||
ResourceCount: Number
|
||||
},
|
||||
{ id: false }
|
||||
);
|
||||
@ -347,6 +354,16 @@ droneSchema.set("toJSON", {
|
||||
const db = obj as IDroneDatabase;
|
||||
|
||||
client.ItemId = toOid(db._id);
|
||||
if (db.RepairStart) {
|
||||
client.RepairStart = toMongoDate(db.RepairStart);
|
||||
}
|
||||
|
||||
delete db.DeployTime;
|
||||
delete db.System;
|
||||
delete db.DamageTime;
|
||||
delete db.PendingDamage;
|
||||
delete db.ResourceType;
|
||||
delete db.ResourceCount;
|
||||
|
||||
delete obj._id;
|
||||
delete obj.__v;
|
||||
|
@ -145,6 +145,7 @@ apiRouter.post("/claimCompletedRecipe.php", claimCompletedRecipeController);
|
||||
apiRouter.post("/clearDialogueHistory.php", clearDialogueHistoryController);
|
||||
apiRouter.post("/completeRandomModChallenge.php", completeRandomModChallengeController);
|
||||
apiRouter.post("/createGuild.php", createGuildController);
|
||||
apiRouter.post("/drones.php", dronesController);
|
||||
apiRouter.post("/endlessXp.php", endlessXpController);
|
||||
apiRouter.post("/evolveWeapon.php", evolveWeaponController);
|
||||
apiRouter.post("/findSessions.php", findSessionsController);
|
||||
|
@ -520,6 +520,13 @@ export interface IDroneDatabase {
|
||||
CurrentHP: number;
|
||||
_id: Types.ObjectId;
|
||||
RepairStart?: Date;
|
||||
|
||||
DeployTime?: Date;
|
||||
System?: number;
|
||||
DamageTime?: Date;
|
||||
PendingDamage?: number;
|
||||
ResourceType?: string;
|
||||
ResourceCount?: number;
|
||||
}
|
||||
|
||||
export interface ITypeXPItem {
|
||||
|
Loading…
x
Reference in New Issue
Block a user