Merge pull request #2 from holmityd/mission-reward

chore: Mission reward - take 3
This commit is contained in:
Nicat 2023-09-03 19:13:36 +04:00 committed by GitHub
commit 9cad1c73be
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 95 additions and 42 deletions

View File

@ -12,6 +12,7 @@ import resourceNames from "@/static/json/resource-names.json";
import gearNames from "@/static/json/gear-names.json"; import gearNames from "@/static/json/gear-names.json";
import arcaneNames from "@/static/json/arcane-names.json"; import arcaneNames from "@/static/json/arcane-names.json";
import craftNames from "@/static/json/craft-names.json"; import craftNames from "@/static/json/craft-names.json";
import { RawUpgrade } from "@/src/types/inventoryTypes/inventoryTypes";
/* /*
**** INPUT **** **** INPUT ****
@ -63,25 +64,43 @@ const missionInventoryUpdateController: RequestHandler = async (req, res) => {
try { try {
const parsedData = JSON.parse(data) as MissionInventoryUpdate; const parsedData = JSON.parse(data) as MissionInventoryUpdate;
if (typeof parsedData !== "object" || parsedData === null) throw new Error("Invalid data format"); if (typeof parsedData !== "object" || parsedData === null) throw new Error("Invalid data format");
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const { InventoryChanges, MissionRewards } = getRewards(parsedData.RewardInfo);
const missionCredits = parsedData.RegularCredits || 0; const missionCredits = parsedData.RegularCredits || 0;
const creditsBonus = 0; const creditsBonus = InventoryChanges.RegularCredits || 1000;
const totalCredits = missionCredits + creditsBonus; const totalCredits = missionCredits + creditsBonus;
const MissionCredits = [missionCredits, missionCredits]; // collected credits const MissionCredits = [missionCredits, missionCredits];
const CreditsBonus = [creditsBonus, creditsBonus]; // mission reward const CreditsBonus = [creditsBonus, creditsBonus];
const TotalCredits = [totalCredits, totalCredits]; const TotalCredits = [totalCredits, totalCredits];
const FusionPoints =
parsedData.FusionPoints || InventoryChanges.FusionPoints
? (parsedData.FusionPoints || 0) + (InventoryChanges.FusionPoints || 0)
: undefined;
console.log(getRewards(parsedData.RewardInfo)); // combine reward and loot
parsedData.RegularCredits = totalCredits;
if (FusionPoints) parsedData.FusionPoints = FusionPoints;
if (InventoryChanges.RawUpgrades && !parsedData.RawUpgrades) parsedData.RawUpgrades = [];
InventoryChanges.RawUpgrades?.forEach(i => parsedData.RawUpgrades!.push(i));
if (InventoryChanges.MiscItems && !parsedData.MiscItems) parsedData.RawUpgrades = [];
InventoryChanges.MiscItems?.forEach(i => parsedData.MiscItems!.push(i));
const Inventory = await missionInventoryUpdate(parsedData, id);
InventoryChanges.RawUpgrades?.forEach(
(i: RawUpgrade) => (i.LastAdded = Inventory.RawUpgrades.find(j => j.ItemType === i.ItemType)?.LastAdded)
);
// eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars
const InventoryJson = JSON.stringify(await missionInventoryUpdate(parsedData, id)); const InventoryJson = JSON.stringify(Inventory);
res.json({ res.json({
// InventoryJson, // this part will reset game data and missions will be locked // InventoryJson, // this part will reset game data and missions will be locked
TotalCredits, TotalCredits,
CreditsBonus, CreditsBonus,
MissionCredits MissionCredits,
MissionRewards,
InventoryChanges,
...(FusionPoints !== undefined && { FusionPoints })
}); });
} catch (err) { } catch (err) {
console.error("Error parsing JSON data:", err); console.error("Error parsing JSON data:", err);
@ -91,26 +110,44 @@ const missionInventoryUpdateController: RequestHandler = async (req, res) => {
/* /*
**** OUTPUT **** **** OUTPUT ****
- [x] InventoryJson - [x] InventoryJson
- [ ] MissionRewards - [x] MissionRewards
- [x] TotalCredits - [x] TotalCredits
- [x] CreditsBonus - [x] CreditsBonus
- [x] MissionCredits - [x] MissionCredits
- [ ] InventoryChanges - [x] InventoryChanges
- [ ] FusionPoints int - [x] FusionPoints
*/ */
interface StringDictionary { interface StringDictionary {
[key: string]: string; [key: string]: string;
} }
const getRewards = (rewardInfo: MissionInventoryUpdateRewardInfo | undefined) => { const getRewards = (
if (!rewardInfo) return; rewardInfo: MissionInventoryUpdateRewardInfo | undefined
): { InventoryChanges: MissionInventoryUpdate; MissionRewards: MissionRewardResponse[] } => {
if (!rewardInfo) return { InventoryChanges: {}, MissionRewards: [] };
// TODO - add Rotation logic
// no data for rotation, need reverse engineer rewardSeed, otherwise ingame displayed rotation loot will be different than added to db
// "RewardInfo": {
// "node": "SolNode39",
// "rewardTier": 1,
// "nightmareMode": false,
// "useVaultManifest": false,
// "EnemyCachesFound": 0,
// "toxinOk": true,
// "lostTargetWave": 0,
// "defenseTargetCount": 1,
// "EOM_AFK": 0,
// "rewardQualifications": "11",
// "PurgatoryRewardQualifications": "",
// "rewardSeed": -5604904486637266000
// },
const missionName = (missionNames as StringDictionary)[rewardInfo.node]; const missionName = (missionNames as StringDictionary)[rewardInfo.node];
const rewards = missionsDropTable.find(i => i.mission === missionName)?.rewards; const rewards = missionsDropTable.find(i => i.mission === missionName)?.rewards;
if (!rewards) return []; if (!rewards) return { InventoryChanges: {}, MissionRewards: [] };
// TODO - add Rotation logic
// Separate guaranteed and chance drops // Separate guaranteed and chance drops
const guaranteedDrops: Reward[] = []; const guaranteedDrops: Reward[] = [];
@ -123,6 +160,8 @@ const getRewards = (rewardInfo: MissionInventoryUpdateRewardInfo | undefined) =>
const randomDrop = getRandomRewardByChance(chanceDrops); const randomDrop = getRandomRewardByChance(chanceDrops);
if (randomDrop) guaranteedDrops.push(randomDrop); if (randomDrop) guaranteedDrops.push(randomDrop);
console.log("Mission rewards:", guaranteedDrops);
return formatRewardsToInventoryType(guaranteedDrops); return formatRewardsToInventoryType(guaranteedDrops);
}; };
@ -148,8 +187,20 @@ const getRandomRewardByChance = (data: Reward[] | undefined): Reward | undefined
return; return;
}; };
const formatRewardsToInventoryType = (rewards: Reward[]) => { interface MissionRewardResponse {
return rewards.map(i => { StoreItem?: string;
TypeName: string;
UpgradeLevel: number;
ItemCount: number;
TweetText: string;
ProductCategory: string;
}
const formatRewardsToInventoryType = (
rewards: Reward[]
): { InventoryChanges: MissionInventoryUpdate; MissionRewards: MissionRewardResponse[] } => {
const InventoryChanges: MissionInventoryUpdate = {};
const MissionRewards: MissionRewardResponse[] = [];
rewards.forEach(i => {
const mod = (modNames as StringDictionary)[i.name]; const mod = (modNames as StringDictionary)[i.name];
const skin = (skinNames as StringDictionary)[i.name]; const skin = (skinNames as StringDictionary)[i.name];
const gear = (gearNames as StringDictionary)[i.name]; const gear = (gearNames as StringDictionary)[i.name];
@ -164,32 +215,39 @@ const formatRewardsToInventoryType = (rewards: Reward[]) => {
(relicNames as StringDictionary)[i.name.replace("Relic", "Exceptional")] || (relicNames as StringDictionary)[i.name.replace("Relic", "Exceptional")] ||
(relicNames as StringDictionary)[i.name.replace("Relic (Radiant)", "Radiant")]; (relicNames as StringDictionary)[i.name.replace("Relic (Radiant)", "Radiant")];
let ItemType: string = mod;
const ItemCount = 1;
if (mod) { if (mod) {
ItemType = mod; if (!InventoryChanges.RawUpgrades) InventoryChanges.RawUpgrades = [];
InventoryChanges.RawUpgrades.push({ ItemType: mod, ItemCount: 1 });
MissionRewards.push({
StoreItem: mod.replace("/Lotus/", "/Lotus/StoreItems/"),
TypeName: mod,
UpgradeLevel: 0,
ItemCount: 1,
TweetText: `${i.name} (Mod)`,
ProductCategory: "Upgrades"
});
} else if (skin) { } else if (skin) {
ItemType = skin; /* skin */
} else if (gear) { } else if (gear) {
ItemType = gear; /* gear */
} else if (arcane) { } else if (arcane) {
ItemType = arcane; /* arcane */
} else if (craft) { } else if (craft) {
ItemType = craft; /* craft */
} else if (misc) { } else if (misc || resource) {
ItemType = misc; if (!InventoryChanges.MiscItems) InventoryChanges.MiscItems = [];
} else if (resource) { const ItemType = misc || resource;
ItemType = resource; const ItemCount = parseInt(i.name) || 1;
InventoryChanges.MiscItems.push({ ItemType, ItemCount });
} else if (relic) { } else if (relic) {
ItemType = relic; /* relic */
} else if (i.name.includes(" Endo")) { } else if (i.name.includes(" Endo")) {
/* endo */ InventoryChanges.FusionPoints = parseInt(i.name);
} else if (i.name.includes(" Credits Cache") || i.name.includes("Return: ")) { } else if (i.name.includes(" Credits Cache") || i.name.includes("Return: ")) {
/* credits */ InventoryChanges.RegularCredits = parseInt(i.name.replace(/ Credits Cache|Return: |,/g, ""));
} }
return { ItemType, ItemCount };
}); });
return { InventoryChanges, MissionRewards };
}; };
export { missionInventoryUpdateController }; export { missionInventoryUpdateController };

View File

@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
interface MongooseId { interface MongooseId {
$oid: string; $oid: string;
} }
@ -37,13 +38,6 @@ export interface MissionInventoryUpdateItem {
ItemType: string; ItemType: string;
} }
export interface MissionInventoryUpdateCard extends MissionInventoryUpdateItem {
ItemId: MongooseId;
UpgradeFingerprint: string;
PendingRerollFingerprint: string;
LastAdded: MongooseId;
}
interface MissionInventoryUpdateChallange { interface MissionInventoryUpdateChallange {
Name: string; Name: string;
Progress: number; Progress: number;
@ -72,9 +66,10 @@ export interface MissionInventoryUpdate {
Pistols?: MissionInventoryUpdateGear[]; Pistols?: MissionInventoryUpdateGear[];
Suits?: MissionInventoryUpdateGear[]; Suits?: MissionInventoryUpdateGear[];
Melee?: MissionInventoryUpdateGear[]; Melee?: MissionInventoryUpdateGear[];
RawUpgrades?: MissionInventoryUpdateCard[]; RawUpgrades?: MissionInventoryUpdateItem[];
MiscItems?: MissionInventoryUpdateItem[]; MiscItems?: MissionInventoryUpdateItem[];
RegularCredits?: number; RegularCredits?: number;
ChallengeProgress?: MissionInventoryUpdateChallange[]; ChallengeProgress?: MissionInventoryUpdateChallange[];
RewardInfo?: MissionInventoryUpdateRewardInfo; RewardInfo?: MissionInventoryUpdateRewardInfo;
} FusionPoints?: number;
}