Compare commits
5 Commits
8491bc076d
...
ea595173fb
Author | SHA1 | Date | |
---|---|---|---|
ea595173fb | |||
9468768947 | |||
0af7f41201 | |||
de1e2a25f2 | |||
1cf7b41d3f |
@ -17,7 +17,7 @@ export const activateRandomModController: RequestHandler = async (req, res) => {
|
|||||||
ItemCount: -1
|
ItemCount: -1
|
||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
const rivenType = getRandomElement(rivenRawToRealWeighted[request.ItemType]);
|
const rivenType = getRandomElement(rivenRawToRealWeighted[request.ItemType])!;
|
||||||
const fingerprint = createVeiledRivenFingerprint(ExportUpgrades[rivenType]);
|
const fingerprint = createVeiledRivenFingerprint(ExportUpgrades[rivenType]);
|
||||||
const upgradeIndex =
|
const upgradeIndex =
|
||||||
inventory.Upgrades.push({
|
inventory.Upgrades.push({
|
||||||
|
@ -28,7 +28,7 @@ export const artifactTransmutationController: RequestHandler = async (req, res)
|
|||||||
});
|
});
|
||||||
|
|
||||||
const rawRivenType = getRandomRawRivenType();
|
const rawRivenType = getRandomRawRivenType();
|
||||||
const rivenType = getRandomElement(rivenRawToRealWeighted[rawRivenType]);
|
const rivenType = getRandomElement(rivenRawToRealWeighted[rawRivenType])!;
|
||||||
const fingerprint = createVeiledRivenFingerprint(ExportUpgrades[rivenType]);
|
const fingerprint = createVeiledRivenFingerprint(ExportUpgrades[rivenType]);
|
||||||
|
|
||||||
const upgradeIndex =
|
const upgradeIndex =
|
||||||
|
@ -11,7 +11,7 @@ import {
|
|||||||
import { getAccountForRequest, getAccountFromSuffixedName, getSuffixedName } from "@/src/services/loginService";
|
import { getAccountForRequest, getAccountFromSuffixedName, getSuffixedName } from "@/src/services/loginService";
|
||||||
import { addItems, combineInventoryChanges, getInventory } from "@/src/services/inventoryService";
|
import { addItems, combineInventoryChanges, getInventory } from "@/src/services/inventoryService";
|
||||||
import { logger } from "@/src/utils/logger";
|
import { logger } from "@/src/utils/logger";
|
||||||
import { ExportFlavour, ExportGear } from "warframe-public-export-plus";
|
import { ExportFlavour } from "warframe-public-export-plus";
|
||||||
import { handleStoreItemAcquisition } from "@/src/services/purchaseService";
|
import { handleStoreItemAcquisition } from "@/src/services/purchaseService";
|
||||||
import { fromStoreItem, isStoreItem } from "@/src/services/itemDataService";
|
import { fromStoreItem, isStoreItem } from "@/src/services/itemDataService";
|
||||||
|
|
||||||
@ -50,7 +50,7 @@ export const inboxController: RequestHandler = async (req, res) => {
|
|||||||
inventory,
|
inventory,
|
||||||
attachmentItems.map(attItem => ({
|
attachmentItems.map(attItem => ({
|
||||||
ItemType: isStoreItem(attItem) ? fromStoreItem(attItem) : attItem,
|
ItemType: isStoreItem(attItem) ? fromStoreItem(attItem) : attItem,
|
||||||
ItemCount: attItem in ExportGear ? (ExportGear[attItem].purchaseQuantity ?? 1) : 1
|
ItemCount: 1
|
||||||
})),
|
})),
|
||||||
inventoryChanges
|
inventoryChanges
|
||||||
);
|
);
|
||||||
|
@ -141,7 +141,7 @@ const getModularWeaponSale = (
|
|||||||
getItemType: (parts: string[]) => string
|
getItemType: (parts: string[]) => string
|
||||||
): IModularWeaponSaleInfo => {
|
): IModularWeaponSaleInfo => {
|
||||||
const rng = new CRng(day);
|
const rng = new CRng(day);
|
||||||
const parts = partTypes.map(partType => rng.randomElement(partTypeToParts[partType]));
|
const parts = partTypes.map(partType => rng.randomElement(partTypeToParts[partType])!);
|
||||||
let partsCost = 0;
|
let partsCost = 0;
|
||||||
for (const part of parts) {
|
for (const part of parts) {
|
||||||
partsCost += ExportWeapons[part].premiumPrice!;
|
partsCost += ExportWeapons[part].premiumPrice!;
|
||||||
|
@ -31,7 +31,7 @@ export interface IFingerprintStat {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const createVeiledRivenFingerprint = (meta: IUpgrade): IVeiledRivenFingerprint => {
|
export const createVeiledRivenFingerprint = (meta: IUpgrade): IVeiledRivenFingerprint => {
|
||||||
const challenge = getRandomElement(meta.availableChallenges!);
|
const challenge = getRandomElement(meta.availableChallenges!)!;
|
||||||
const fingerprintChallenge: IRivenChallenge = {
|
const fingerprintChallenge: IRivenChallenge = {
|
||||||
Type: challenge.fullName,
|
Type: challenge.fullName,
|
||||||
Progress: 0,
|
Progress: 0,
|
||||||
@ -54,11 +54,11 @@ export const createVeiledRivenFingerprint = (meta: IUpgrade): IVeiledRivenFinger
|
|||||||
|
|
||||||
export const createUnveiledRivenFingerprint = (meta: IUpgrade): IUnveiledRivenFingerprint => {
|
export const createUnveiledRivenFingerprint = (meta: IUpgrade): IUnveiledRivenFingerprint => {
|
||||||
const fingerprint: IUnveiledRivenFingerprint = {
|
const fingerprint: IUnveiledRivenFingerprint = {
|
||||||
compat: getRandomElement(meta.compatibleItems!),
|
compat: getRandomElement(meta.compatibleItems!)!,
|
||||||
lim: 0,
|
lim: 0,
|
||||||
lvl: 0,
|
lvl: 0,
|
||||||
lvlReq: getRandomInt(8, 16),
|
lvlReq: getRandomInt(8, 16),
|
||||||
pol: getRandomElement(["AP_ATTACK", "AP_DEFENSE", "AP_TACTIC"]),
|
pol: getRandomElement(["AP_ATTACK", "AP_DEFENSE", "AP_TACTIC"])!,
|
||||||
buffs: [],
|
buffs: [],
|
||||||
curses: []
|
curses: []
|
||||||
};
|
};
|
||||||
@ -81,7 +81,7 @@ export const randomiseRivenStats = (meta: IUpgrade, fingerprint: IUnveiledRivenF
|
|||||||
if (Math.random() < 0.5) {
|
if (Math.random() < 0.5) {
|
||||||
const entry = getRandomElement(
|
const entry = getRandomElement(
|
||||||
meta.upgradeEntries!.filter(x => x.canBeCurse && !fingerprint.buffs.find(y => y.Tag == x.tag))
|
meta.upgradeEntries!.filter(x => x.canBeCurse && !fingerprint.buffs.find(y => y.Tag == x.tag))
|
||||||
);
|
)!;
|
||||||
fingerprint.curses.push({ Tag: entry.tag, Value: Math.trunc(Math.random() * 0x40000000) });
|
fingerprint.curses.push({ Tag: entry.tag, Value: Math.trunc(Math.random() * 0x40000000) });
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -486,6 +486,10 @@ export const addItem = async (
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
if (typeName in ExportGear) {
|
if (typeName in ExportGear) {
|
||||||
|
// Multipling by purchase quantity for gear because:
|
||||||
|
// - The Saya's Vigil scanner message has it as a non-counted attachment.
|
||||||
|
// - Blueprints for Ancient Protector Specter, Shield Osprey Specter, etc. have num=1 despite giving their purchaseQuantity.
|
||||||
|
quantity *= ExportGear[typeName].purchaseQuantity ?? 1;
|
||||||
const consumablesChanges = [
|
const consumablesChanges = [
|
||||||
{
|
{
|
||||||
ItemType: typeName,
|
ItemType: typeName,
|
||||||
@ -1798,7 +1802,7 @@ export const addKeyChainItems = async (
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const createLibraryDailyTask = (): ILibraryDailyTaskInfo => {
|
export const createLibraryDailyTask = (): ILibraryDailyTaskInfo => {
|
||||||
const enemyTypes = getRandomElement(libraryDailyTasks);
|
const enemyTypes = getRandomElement(libraryDailyTasks)!;
|
||||||
const enemyAvatar = ExportEnemies.avatars[enemyTypes[0]];
|
const enemyAvatar = ExportEnemies.avatars[enemyTypes[0]];
|
||||||
const scansRequired = getRandomInt(2, 4);
|
const scansRequired = getRandomInt(2, 4);
|
||||||
return {
|
return {
|
||||||
@ -1944,22 +1948,22 @@ export const giveNemesisPetRecipe = (inventory: TInventoryDatabaseDocument, neme
|
|||||||
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartHeadA",
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartHeadA",
|
||||||
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartHeadB",
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartHeadB",
|
||||||
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartHeadC"
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartHeadC"
|
||||||
]);
|
])!;
|
||||||
const body = getRandomElement([
|
const body = getRandomElement([
|
||||||
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartBodyA",
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartBodyA",
|
||||||
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartBodyB",
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartBodyB",
|
||||||
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartBodyC"
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartBodyC"
|
||||||
]);
|
])!;
|
||||||
const legs = getRandomElement([
|
const legs = getRandomElement([
|
||||||
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartLegsA",
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartLegsA",
|
||||||
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartLegsB",
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartLegsB",
|
||||||
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartLegsC"
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartLegsC"
|
||||||
]);
|
])!;
|
||||||
const tail = getRandomElement([
|
const tail = getRandomElement([
|
||||||
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartTailA",
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartTailA",
|
||||||
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartTailB",
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartTailB",
|
||||||
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartTailC"
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartTailC"
|
||||||
]);
|
])!;
|
||||||
const recipeType = Object.entries(ExportRecipes).find(arr => arr[1].resultType == head)![0];
|
const recipeType = Object.entries(ExportRecipes).find(arr => arr[1].resultType == head)![0];
|
||||||
addRecipes(inventory, [
|
addRecipes(inventory, [
|
||||||
{
|
{
|
||||||
|
@ -102,7 +102,7 @@ const getRandomLoginReward = (rng: CRng, day: number, inventory: TInventoryDatab
|
|||||||
// This account has all applicable warframes and weapons already mastered (filthy cheater), need a different reward.
|
// This account has all applicable warframes and weapons already mastered (filthy cheater), need a different reward.
|
||||||
return getRandomLoginReward(rng, day, inventory);
|
return getRandomLoginReward(rng, day, inventory);
|
||||||
}
|
}
|
||||||
reward.StoreItemType = toStoreItem(rng.randomElement(eligibleRecipes));
|
reward.StoreItemType = toStoreItem(rng.randomElement(eligibleRecipes)!);
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
//_id: toOid(new Types.ObjectId()),
|
//_id: toOid(new Types.ObjectId()),
|
||||||
|
@ -380,6 +380,7 @@ export const addMissionInventoryUpdates = async (
|
|||||||
: 10)
|
: 10)
|
||||||
) {
|
) {
|
||||||
progress.Completed = true;
|
progress.Completed = true;
|
||||||
|
inventory.LibraryPersonalTarget = undefined;
|
||||||
}
|
}
|
||||||
logger.debug(`synthesis of ${scan.EnemyType} added to personal target progress`);
|
logger.debug(`synthesis of ${scan.EnemyType} added to personal target progress`);
|
||||||
synthesisIgnored = false;
|
synthesisIgnored = false;
|
||||||
@ -930,7 +931,7 @@ export const addMissionRewards = async (
|
|||||||
|
|
||||||
if (rewardInfo.useVaultManifest) {
|
if (rewardInfo.useVaultManifest) {
|
||||||
MissionRewards.push({
|
MissionRewards.push({
|
||||||
StoreItem: getRandomElement(corruptedMods),
|
StoreItem: getRandomElement(corruptedMods)!,
|
||||||
ItemCount: 1
|
ItemCount: 1
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -47,12 +47,12 @@ export const createGarden = (): IGardeningDatabase => {
|
|||||||
Name: "Garden0",
|
Name: "Garden0",
|
||||||
Plants: [
|
Plants: [
|
||||||
{
|
{
|
||||||
PlantType: getRandomElement(plantTypes),
|
PlantType: getRandomElement(plantTypes)!,
|
||||||
EndTime: endTime,
|
EndTime: endTime,
|
||||||
PlotIndex: 0
|
PlotIndex: 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
PlantType: getRandomElement(plantTypes),
|
PlantType: getRandomElement(plantTypes)!,
|
||||||
EndTime: endTime,
|
EndTime: endTime,
|
||||||
PlotIndex: 1
|
PlotIndex: 1
|
||||||
}
|
}
|
||||||
@ -62,12 +62,12 @@ export const createGarden = (): IGardeningDatabase => {
|
|||||||
Name: "Garden1",
|
Name: "Garden1",
|
||||||
Plants: [
|
Plants: [
|
||||||
{
|
{
|
||||||
PlantType: getRandomElement(plantTypes),
|
PlantType: getRandomElement(plantTypes)!,
|
||||||
EndTime: endTime,
|
EndTime: endTime,
|
||||||
PlotIndex: 0
|
PlotIndex: 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
PlantType: getRandomElement(plantTypes),
|
PlantType: getRandomElement(plantTypes)!,
|
||||||
EndTime: endTime,
|
EndTime: endTime,
|
||||||
PlotIndex: 1
|
PlotIndex: 1
|
||||||
}
|
}
|
||||||
@ -77,12 +77,12 @@ export const createGarden = (): IGardeningDatabase => {
|
|||||||
Name: "Garden2",
|
Name: "Garden2",
|
||||||
Plants: [
|
Plants: [
|
||||||
{
|
{
|
||||||
PlantType: getRandomElement(plantTypes),
|
PlantType: getRandomElement(plantTypes)!,
|
||||||
EndTime: endTime,
|
EndTime: endTime,
|
||||||
PlotIndex: 0
|
PlotIndex: 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
PlantType: getRandomElement(plantTypes),
|
PlantType: getRandomElement(plantTypes)!,
|
||||||
EndTime: endTime,
|
EndTime: endTime,
|
||||||
PlotIndex: 1
|
PlotIndex: 1
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@ export interface IRngResult {
|
|||||||
probability: number;
|
probability: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getRandomElement = <T>(arr: T[]): T => {
|
export const getRandomElement = <T>(arr: T[]): T | undefined => {
|
||||||
return arr[Math.floor(Math.random() * arr.length)];
|
return arr[Math.floor(Math.random() * arr.length)];
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -113,7 +113,7 @@ export class CRng {
|
|||||||
return min;
|
return min;
|
||||||
}
|
}
|
||||||
|
|
||||||
randomElement<T>(arr: T[]): T {
|
randomElement<T>(arr: T[]): T | undefined {
|
||||||
return arr[Math.floor(this.random() * arr.length)];
|
return arr[Math.floor(this.random() * arr.length)];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -145,7 +145,7 @@ export class SRng {
|
|||||||
return min;
|
return min;
|
||||||
}
|
}
|
||||||
|
|
||||||
randomElement<T>(arr: T[]): T {
|
randomElement<T>(arr: T[]): T | undefined {
|
||||||
return arr[this.randomInt(0, arr.length - 1)];
|
return arr[this.randomInt(0, arr.length - 1)];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,7 +212,7 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
|
|||||||
while (processed.ItemManifest.length + offersToAdd.length < numItemsTarget) {
|
while (processed.ItemManifest.length + offersToAdd.length < numItemsTarget) {
|
||||||
// TODO: Consider per-bin item limits
|
// TODO: Consider per-bin item limits
|
||||||
// TODO: Consider item probability weightings
|
// TODO: Consider item probability weightings
|
||||||
offersToAdd.push(rng.randomElement(manifest.items));
|
offersToAdd.push(rng.randomElement(manifest.items)!);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let binThisCycle;
|
let binThisCycle;
|
||||||
@ -256,7 +256,7 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
|
|||||||
for (let i = 0; i != rawItem.numRandomItemPrices; ++i) {
|
for (let i = 0; i != rawItem.numRandomItemPrices; ++i) {
|
||||||
let itemPrice: { type: string; count: IRange };
|
let itemPrice: { type: string; count: IRange };
|
||||||
do {
|
do {
|
||||||
itemPrice = rng.randomElement(manifest.randomItemPricesPerBin![rawItem.bin]);
|
itemPrice = rng.randomElement(manifest.randomItemPricesPerBin![rawItem.bin])!;
|
||||||
} while (item.ItemPrices.find(x => x.ItemType == itemPrice.type));
|
} while (item.ItemPrices.find(x => x.ItemType == itemPrice.type));
|
||||||
item.ItemPrices.push({
|
item.ItemPrices.push({
|
||||||
ItemType: itemPrice.type,
|
ItemType: itemPrice.type,
|
||||||
@ -286,7 +286,7 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
|
|||||||
item.LocTagRandSeed = (rng.randomInt(0, 0xffff) << 16) | rng.randomInt(0, 0xffff);
|
item.LocTagRandSeed = (rng.randomInt(0, 0xffff) << 16) | rng.randomInt(0, 0xffff);
|
||||||
if (vendorInfo.RandomSeedType == "VRST_WEAPON") {
|
if (vendorInfo.RandomSeedType == "VRST_WEAPON") {
|
||||||
const highDword = (rng.randomInt(0, 0xffff) << 16) | rng.randomInt(0, 0xffff);
|
const highDword = (rng.randomInt(0, 0xffff) << 16) | rng.randomInt(0, 0xffff);
|
||||||
item.LocTagRandSeed = (BigInt(highDword) << 32n) | BigInt(item.LocTagRandSeed);
|
item.LocTagRandSeed = (BigInt(highDword) << 32n) | (BigInt(item.LocTagRandSeed) & 0xffffffffn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
processed.ItemManifest.push(item);
|
processed.ItemManifest.push(item);
|
||||||
|
@ -225,7 +225,7 @@ const pushSortieIfRelevant = (worldState: IWorldState, day: number): void => {
|
|||||||
const seed = new CRng(day).randomInt(0, 0xffff);
|
const seed = new CRng(day).randomInt(0, 0xffff);
|
||||||
const rng = new CRng(seed);
|
const rng = new CRng(seed);
|
||||||
|
|
||||||
const boss = rng.randomElement(sortieBosses);
|
const boss = rng.randomElement(sortieBosses)!;
|
||||||
|
|
||||||
const modifiers = [
|
const modifiers = [
|
||||||
"SORTIE_MODIFIER_LOW_ENERGY",
|
"SORTIE_MODIFIER_LOW_ENERGY",
|
||||||
@ -302,7 +302,7 @@ const pushSortieIfRelevant = (worldState: IWorldState, day: number): void => {
|
|||||||
|
|
||||||
missionIndex = ExportRegions[node].missionIndex;
|
missionIndex = ExportRegions[node].missionIndex;
|
||||||
if (missionIndex != 28) {
|
if (missionIndex != 28) {
|
||||||
missionIndex = rng.randomElement(availableMissionIndexes);
|
missionIndex = rng.randomElement(availableMissionIndexes)!;
|
||||||
}
|
}
|
||||||
} while (
|
} while (
|
||||||
specialMissionTypes.indexOf(missionIndex) != -1 &&
|
specialMissionTypes.indexOf(missionIndex) != -1 &&
|
||||||
@ -312,7 +312,7 @@ const pushSortieIfRelevant = (worldState: IWorldState, day: number): void => {
|
|||||||
|
|
||||||
if (i == 2 && rng.randomInt(0, 2) == 2) {
|
if (i == 2 && rng.randomInt(0, 2) == 2) {
|
||||||
const filteredModifiers = modifiers.filter(mod => mod !== "SORTIE_MODIFIER_MELEE_ONLY");
|
const filteredModifiers = modifiers.filter(mod => mod !== "SORTIE_MODIFIER_MELEE_ONLY");
|
||||||
const modifierType = rng.randomElement(filteredModifiers);
|
const modifierType = rng.randomElement(filteredModifiers)!;
|
||||||
|
|
||||||
if (boss == "SORTIE_BOSS_PHORID") {
|
if (boss == "SORTIE_BOSS_PHORID") {
|
||||||
selectedNodes.push({
|
selectedNodes.push({
|
||||||
@ -346,7 +346,7 @@ const pushSortieIfRelevant = (worldState: IWorldState, day: number): void => {
|
|||||||
? modifiers.filter(mod => mod != "SORTIE_MODIFIER_HAZARD_RADIATION")
|
? modifiers.filter(mod => mod != "SORTIE_MODIFIER_HAZARD_RADIATION")
|
||||||
: modifiers;
|
: modifiers;
|
||||||
|
|
||||||
const modifierType = rng.randomElement(filteredModifiers);
|
const modifierType = rng.randomElement(filteredModifiers)!;
|
||||||
|
|
||||||
selectedNodes.push({
|
selectedNodes.push({
|
||||||
missionType,
|
missionType,
|
||||||
@ -389,7 +389,7 @@ const getSeasonDailyChallenge = (day: number): ISeasonChallenge => {
|
|||||||
Daily: true,
|
Daily: true,
|
||||||
Activation: { $date: { $numberLong: dayStart.toString() } },
|
Activation: { $date: { $numberLong: dayStart.toString() } },
|
||||||
Expiry: { $date: { $numberLong: dayEnd.toString() } },
|
Expiry: { $date: { $numberLong: dayEnd.toString() } },
|
||||||
Challenge: rng.randomElement(dailyChallenges)
|
Challenge: rng.randomElement(dailyChallenges)!
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -408,7 +408,7 @@ const getSeasonWeeklyChallenge = (week: number, id: number): ISeasonChallenge =>
|
|||||||
_id: { $oid: "67e1bb2d9d00cb47" + challengeId.toString().padStart(8, "0") },
|
_id: { $oid: "67e1bb2d9d00cb47" + challengeId.toString().padStart(8, "0") },
|
||||||
Activation: { $date: { $numberLong: weekStart.toString() } },
|
Activation: { $date: { $numberLong: weekStart.toString() } },
|
||||||
Expiry: { $date: { $numberLong: weekEnd.toString() } },
|
Expiry: { $date: { $numberLong: weekEnd.toString() } },
|
||||||
Challenge: rng.randomElement(weeklyChallenges)
|
Challenge: rng.randomElement(weeklyChallenges)!
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -425,7 +425,7 @@ const getSeasonWeeklyHardChallenge = (week: number, id: number): ISeasonChalleng
|
|||||||
_id: { $oid: "67e1bb2d9d00cb47" + challengeId.toString().padStart(8, "0") },
|
_id: { $oid: "67e1bb2d9d00cb47" + challengeId.toString().padStart(8, "0") },
|
||||||
Activation: { $date: { $numberLong: weekStart.toString() } },
|
Activation: { $date: { $numberLong: weekStart.toString() } },
|
||||||
Expiry: { $date: { $numberLong: weekEnd.toString() } },
|
Expiry: { $date: { $numberLong: weekEnd.toString() } },
|
||||||
Challenge: rng.randomElement(weeklyHardChallenges)
|
Challenge: rng.randomElement(weeklyHardChallenges)!
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1196,7 +1196,7 @@ export const getLiteSortie = (week: number): ILiteSortie => {
|
|||||||
"MT_EXTERMINATION",
|
"MT_EXTERMINATION",
|
||||||
"MT_SABOTAGE",
|
"MT_SABOTAGE",
|
||||||
"MT_RESCUE"
|
"MT_RESCUE"
|
||||||
]),
|
])!,
|
||||||
node: firstNode
|
node: firstNode
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -1206,8 +1206,8 @@ export const getLiteSortie = (week: number): ILiteSortie => {
|
|||||||
"MT_ARTIFACT",
|
"MT_ARTIFACT",
|
||||||
"MT_EXCAVATE",
|
"MT_EXCAVATE",
|
||||||
"MT_SURVIVAL"
|
"MT_SURVIVAL"
|
||||||
]),
|
])!,
|
||||||
node: rng.randomElement(nodes)
|
node: rng.randomElement(nodes)!
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
missionType: "MT_ASSASSINATION",
|
missionType: "MT_ASSASSINATION",
|
||||||
|
@ -375,6 +375,7 @@ function fetchItemList() {
|
|||||||
}
|
}
|
||||||
fetchItemList();
|
fetchItemList();
|
||||||
|
|
||||||
|
// Assumes that caller revalidates authz
|
||||||
function updateInventory() {
|
function updateInventory() {
|
||||||
const req = $.get("/api/inventory.php?" + window.authz + "&xpBasedLevelCapDisabled=1");
|
const req = $.get("/api/inventory.php?" + window.authz + "&xpBasedLevelCapDisabled=1");
|
||||||
req.done(data => {
|
req.done(data => {
|
||||||
@ -487,25 +488,27 @@ function updateInventory() {
|
|||||||
a.href = "#";
|
a.href = "#";
|
||||||
a.onclick = function (event) {
|
a.onclick = function (event) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
if (item.XP < maxXP) {
|
revalidateAuthz(() => {
|
||||||
addGearExp(category, item.ItemId.$oid, maxXP - item.XP);
|
if (item.XP < maxXP) {
|
||||||
}
|
addGearExp(category, item.ItemId.$oid, maxXP - item.XP);
|
||||||
if ("exalted" in itemMap[item.ItemType]) {
|
}
|
||||||
for (const exaltedType of itemMap[item.ItemType].exalted) {
|
if ("exalted" in itemMap[item.ItemType]) {
|
||||||
const exaltedItem = data.SpecialItems.find(x => x.ItemType == exaltedType);
|
for (const exaltedType of itemMap[item.ItemType].exalted) {
|
||||||
if (exaltedItem) {
|
const exaltedItem = data.SpecialItems.find(x => x.ItemType == exaltedType);
|
||||||
const exaltedCap =
|
if (exaltedItem) {
|
||||||
itemMap[exaltedType]?.type == "weapons" ? 800_000 : 1_600_000;
|
const exaltedCap =
|
||||||
if (exaltedItem.XP < exaltedCap) {
|
itemMap[exaltedType]?.type == "weapons" ? 800_000 : 1_600_000;
|
||||||
addGearExp(
|
if (exaltedItem.XP < exaltedCap) {
|
||||||
"SpecialItems",
|
addGearExp(
|
||||||
exaltedItem.ItemId.$oid,
|
"SpecialItems",
|
||||||
exaltedCap - exaltedItem.XP
|
exaltedItem.ItemId.$oid,
|
||||||
);
|
exaltedCap - exaltedItem.XP
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
};
|
};
|
||||||
a.title = loc("code_maxRank");
|
a.title = loc("code_maxRank");
|
||||||
a.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M214.6 41.4c-12.5-12.5-32.8-12.5-45.3 0l-160 160c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L160 141.2V448c0 17.7 14.3 32 32 32s32-14.3 32-32V141.2L329.4 246.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3l-160-160z"/></svg>`;
|
a.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M214.6 41.4c-12.5-12.5-32.8-12.5-45.3 0l-160 160c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L160 141.2V448c0 17.7 14.3 32 32 32s32-14.3 32-32V141.2L329.4 246.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3l-160-160z"/></svg>`;
|
||||||
@ -1229,76 +1232,22 @@ function addMissingEvolutionProgress() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function maxRankAllEvolutions() {
|
function maxRankAllEvolutions() {
|
||||||
const req = $.get("/api/inventory.php?" + window.authz + "&xpBasedLevelCapDisabled=1");
|
revalidateAuthz(() => {
|
||||||
|
const req = $.get("/api/inventory.php?" + window.authz + "&xpBasedLevelCapDisabled=1");
|
||||||
|
req.done(data => {
|
||||||
|
const requests = [];
|
||||||
|
|
||||||
req.done(data => {
|
data.EvolutionProgress.forEach(item => {
|
||||||
const requests = [];
|
if (item.Rank < 5) {
|
||||||
|
requests.push({
|
||||||
data.EvolutionProgress.forEach(item => {
|
ItemType: item.ItemType,
|
||||||
if (item.Rank < 5) {
|
Rank: 5
|
||||||
requests.push({
|
});
|
||||||
ItemType: item.ItemType,
|
}
|
||||||
Rank: 5
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (Object.keys(requests).length > 0) {
|
|
||||||
return setEvolutionProgress(requests);
|
|
||||||
}
|
|
||||||
|
|
||||||
toast(loc("code_noEquipmentToRankUp"));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function maxRankAllEquipment(categories) {
|
|
||||||
const req = $.get("/api/inventory.php?" + window.authz + "&xpBasedLevelCapDisabled=1");
|
|
||||||
|
|
||||||
req.done(data => {
|
|
||||||
window.itemListPromise.then(itemMap => {
|
|
||||||
const batchData = {};
|
|
||||||
|
|
||||||
categories.forEach(category => {
|
|
||||||
data[category].forEach(item => {
|
|
||||||
const maxXP =
|
|
||||||
category === "Suits" ||
|
|
||||||
category === "SpaceSuits" ||
|
|
||||||
category === "Sentinels" ||
|
|
||||||
category === "Hoverboards"
|
|
||||||
? 1_600_000
|
|
||||||
: 800_000;
|
|
||||||
|
|
||||||
if (item.XP < maxXP) {
|
|
||||||
if (!batchData[category]) {
|
|
||||||
batchData[category] = [];
|
|
||||||
}
|
|
||||||
batchData[category].push({
|
|
||||||
ItemId: { $oid: item.ItemId.$oid },
|
|
||||||
XP: maxXP
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (category === "Suits") {
|
|
||||||
if ("exalted" in itemMap[item.ItemType]) {
|
|
||||||
for (const exaltedType of itemMap[item.ItemType].exalted) {
|
|
||||||
const exaltedItem = data["SpecialItems"].find(x => x.ItemType == exaltedType);
|
|
||||||
if (exaltedItem) {
|
|
||||||
const exaltedCap = itemMap[exaltedType]?.type == "weapons" ? 800_000 : 1_600_000;
|
|
||||||
if (exaltedItem.XP < exaltedCap) {
|
|
||||||
batchData["SpecialItems"] ??= [];
|
|
||||||
batchData["SpecialItems"].push({
|
|
||||||
ItemId: { $oid: exaltedItem.ItemId.$oid },
|
|
||||||
XP: exaltedCap
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if (Object.keys(batchData).length > 0) {
|
if (Object.keys(requests).length > 0) {
|
||||||
return sendBatchGearExp(batchData);
|
return setEvolutionProgress(requests);
|
||||||
}
|
}
|
||||||
|
|
||||||
toast(loc("code_noEquipmentToRankUp"));
|
toast(loc("code_noEquipmentToRankUp"));
|
||||||
@ -1306,6 +1255,64 @@ function maxRankAllEquipment(categories) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function maxRankAllEquipment(categories) {
|
||||||
|
revalidateAuthz(() => {
|
||||||
|
const req = $.get("/api/inventory.php?" + window.authz + "&xpBasedLevelCapDisabled=1");
|
||||||
|
req.done(data => {
|
||||||
|
window.itemListPromise.then(itemMap => {
|
||||||
|
const batchData = {};
|
||||||
|
|
||||||
|
categories.forEach(category => {
|
||||||
|
data[category].forEach(item => {
|
||||||
|
const maxXP =
|
||||||
|
category === "Suits" ||
|
||||||
|
category === "SpaceSuits" ||
|
||||||
|
category === "Sentinels" ||
|
||||||
|
category === "Hoverboards"
|
||||||
|
? 1_600_000
|
||||||
|
: 800_000;
|
||||||
|
|
||||||
|
if (item.XP < maxXP) {
|
||||||
|
if (!batchData[category]) {
|
||||||
|
batchData[category] = [];
|
||||||
|
}
|
||||||
|
batchData[category].push({
|
||||||
|
ItemId: { $oid: item.ItemId.$oid },
|
||||||
|
XP: maxXP
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (category === "Suits") {
|
||||||
|
if ("exalted" in itemMap[item.ItemType]) {
|
||||||
|
for (const exaltedType of itemMap[item.ItemType].exalted) {
|
||||||
|
const exaltedItem = data["SpecialItems"].find(x => x.ItemType == exaltedType);
|
||||||
|
if (exaltedItem) {
|
||||||
|
const exaltedCap =
|
||||||
|
itemMap[exaltedType]?.type == "weapons" ? 800_000 : 1_600_000;
|
||||||
|
if (exaltedItem.XP < exaltedCap) {
|
||||||
|
batchData["SpecialItems"] ??= [];
|
||||||
|
batchData["SpecialItems"].push({
|
||||||
|
ItemId: { $oid: exaltedItem.ItemId.$oid },
|
||||||
|
XP: exaltedCap
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
if (Object.keys(batchData).length > 0) {
|
||||||
|
return sendBatchGearExp(batchData);
|
||||||
|
}
|
||||||
|
|
||||||
|
toast(loc("code_noEquipmentToRankUp"));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assumes that caller revalidates authz
|
||||||
function addGearExp(category, oid, xp) {
|
function addGearExp(category, oid, xp) {
|
||||||
const data = {};
|
const data = {};
|
||||||
data[category] = [
|
data[category] = [
|
||||||
@ -1314,16 +1321,14 @@ function addGearExp(category, oid, xp) {
|
|||||||
XP: xp
|
XP: xp
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
revalidateAuthz(() => {
|
$.post({
|
||||||
$.post({
|
url: "/custom/addXp?" + window.authz,
|
||||||
url: "/custom/addXp?" + window.authz,
|
contentType: "application/json",
|
||||||
contentType: "application/json",
|
data: JSON.stringify(data)
|
||||||
data: JSON.stringify(data)
|
}).done(function () {
|
||||||
}).done(function () {
|
if (category != "SpecialItems") {
|
||||||
if (category != "SpecialItems") {
|
updateInventory();
|
||||||
updateInventory();
|
}
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1598,32 +1603,34 @@ function doAcquireMod() {
|
|||||||
const uiConfigs = [...$("#server-settings input[id]")].map(x => x.id);
|
const uiConfigs = [...$("#server-settings input[id]")].map(x => x.id);
|
||||||
|
|
||||||
function doChangeSettings() {
|
function doChangeSettings() {
|
||||||
fetch("/custom/config?" + window.authz)
|
revalidateAuthz(() => {
|
||||||
.then(response => response.json())
|
fetch("/custom/config?" + window.authz)
|
||||||
.then(json => {
|
.then(response => response.json())
|
||||||
for (const i of uiConfigs) {
|
.then(json => {
|
||||||
var x = document.getElementById(i);
|
for (const i of uiConfigs) {
|
||||||
if (x != null) {
|
var x = document.getElementById(i);
|
||||||
if (x.type == "checkbox") {
|
if (x != null) {
|
||||||
if (x.checked === true) {
|
if (x.type == "checkbox") {
|
||||||
json[i] = true;
|
if (x.checked === true) {
|
||||||
} else {
|
json[i] = true;
|
||||||
json[i] = false;
|
} else {
|
||||||
|
json[i] = false;
|
||||||
|
}
|
||||||
|
} else if (x.type == "number") {
|
||||||
|
json[i] = parseInt(x.value);
|
||||||
}
|
}
|
||||||
} else if (x.type == "number") {
|
|
||||||
json[i] = parseInt(x.value);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
$.post({
|
||||||
$.post({
|
url: "/custom/config?" + window.authz,
|
||||||
url: "/custom/config?" + window.authz,
|
contentType: "text/plain",
|
||||||
contentType: "text/plain",
|
data: JSON.stringify(json, null, 2)
|
||||||
data: JSON.stringify(json, null, 2)
|
}).then(() => {
|
||||||
}).then(() => {
|
// A few cheats affect the inventory response which in turn may change what values we need to show
|
||||||
// A few cheats affect the inventory response which in turn may change what values we need to show
|
updateInventory();
|
||||||
updateInventory();
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cheats route
|
// Cheats route
|
||||||
@ -1876,33 +1883,39 @@ function doChangeSupportedSyndicate() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function doAddCurrency(currency) {
|
function doAddCurrency(currency) {
|
||||||
$.post({
|
revalidateAuthz(() => {
|
||||||
url: "/custom/addCurrency?" + window.authz,
|
$.post({
|
||||||
contentType: "application/json",
|
url: "/custom/addCurrency?" + window.authz,
|
||||||
data: JSON.stringify({
|
contentType: "application/json",
|
||||||
currency,
|
data: JSON.stringify({
|
||||||
delta: document.getElementById(currency + "-delta").valueAsNumber
|
currency,
|
||||||
})
|
delta: document.getElementById(currency + "-delta").valueAsNumber
|
||||||
}).then(function () {
|
})
|
||||||
updateInventory();
|
}).then(function () {
|
||||||
|
updateInventory();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function doQuestUpdate(operation, itemType) {
|
function doQuestUpdate(operation, itemType) {
|
||||||
$.post({
|
revalidateAuthz(() => {
|
||||||
url: "/custom/manageQuests?" + window.authz + "&operation=" + operation + "&itemType=" + itemType,
|
$.post({
|
||||||
contentType: "application/json"
|
url: "/custom/manageQuests?" + window.authz + "&operation=" + operation + "&itemType=" + itemType,
|
||||||
}).then(function () {
|
contentType: "application/json"
|
||||||
updateInventory();
|
}).then(function () {
|
||||||
|
updateInventory();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function doBulkQuestUpdate(operation) {
|
function doBulkQuestUpdate(operation) {
|
||||||
$.post({
|
revalidateAuthz(() => {
|
||||||
url: "/custom/manageQuests?" + window.authz + "&operation=" + operation,
|
$.post({
|
||||||
contentType: "application/json"
|
url: "/custom/manageQuests?" + window.authz + "&operation=" + operation,
|
||||||
}).then(function () {
|
contentType: "application/json"
|
||||||
updateInventory();
|
}).then(function () {
|
||||||
|
updateInventory();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user