Compare commits

..

1 Commits

Author SHA1 Message Date
8491bc076d fix: always multiply acquired gear quantity by purchaseQuantity
All checks were successful
Build / build (push) Successful in 1m34s
2025-04-29 21:27:48 +02:00
12 changed files with 170 additions and 184 deletions

View File

@ -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({

View File

@ -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 =

View File

@ -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!;

View File

@ -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) });
} }
}; };

View File

@ -1802,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 {
@ -1948,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, [
{ {

View File

@ -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()),

View File

@ -380,7 +380,6 @@ 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;
@ -931,7 +930,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
}); });
} }

View File

@ -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
} }

View File

@ -6,7 +6,7 @@ export interface IRngResult {
probability: number; probability: number;
} }
export const getRandomElement = <T>(arr: T[]): T | undefined => { export const getRandomElement = <T>(arr: T[]): T => {
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 | undefined { randomElement<T>(arr: T[]): T {
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 | undefined { randomElement<T>(arr: T[]): T {
return arr[this.randomInt(0, arr.length - 1)]; return arr[this.randomInt(0, arr.length - 1)];
} }

View File

@ -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) & 0xffffffffn); item.LocTagRandSeed = (BigInt(highDword) << 32n) | BigInt(item.LocTagRandSeed);
} }
} }
processed.ItemManifest.push(item); processed.ItemManifest.push(item);

View File

@ -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",

View File

@ -375,7 +375,6 @@ 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 => {
@ -488,27 +487,25 @@ function updateInventory() {
a.href = "#"; a.href = "#";
a.onclick = function (event) { a.onclick = function (event) {
event.preventDefault(); event.preventDefault();
revalidateAuthz(() => { if (item.XP < maxXP) {
if (item.XP < maxXP) { addGearExp(category, item.ItemId.$oid, maxXP - item.XP);
addGearExp(category, item.ItemId.$oid, maxXP - item.XP); }
} if ("exalted" in itemMap[item.ItemType]) {
if ("exalted" in itemMap[item.ItemType]) { for (const exaltedType of itemMap[item.ItemType].exalted) {
for (const exaltedType of itemMap[item.ItemType].exalted) { const exaltedItem = data.SpecialItems.find(x => x.ItemType == exaltedType);
const exaltedItem = data.SpecialItems.find(x => x.ItemType == exaltedType); if (exaltedItem) {
if (exaltedItem) { const exaltedCap =
const exaltedCap = itemMap[exaltedType]?.type == "weapons" ? 800_000 : 1_600_000;
itemMap[exaltedType]?.type == "weapons" ? 800_000 : 1_600_000; if (exaltedItem.XP < exaltedCap) {
if (exaltedItem.XP < exaltedCap) { addGearExp(
addGearExp( "SpecialItems",
"SpecialItems", exaltedItem.ItemId.$oid,
exaltedItem.ItemId.$oid, exaltedCap - exaltedItem.XP
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>`;
@ -1232,22 +1229,76 @@ function addMissingEvolutionProgress() {
} }
function maxRankAllEvolutions() { function maxRankAllEvolutions() {
revalidateAuthz(() => { const req = $.get("/api/inventory.php?" + window.authz + "&xpBasedLevelCapDisabled=1");
const req = $.get("/api/inventory.php?" + window.authz + "&xpBasedLevelCapDisabled=1");
req.done(data => {
const requests = [];
data.EvolutionProgress.forEach(item => { req.done(data => {
if (item.Rank < 5) { const requests = [];
requests.push({
ItemType: item.ItemType, data.EvolutionProgress.forEach(item => {
Rank: 5 if (item.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(requests).length > 0) { if (Object.keys(batchData).length > 0) {
return setEvolutionProgress(requests); return sendBatchGearExp(batchData);
} }
toast(loc("code_noEquipmentToRankUp")); toast(loc("code_noEquipmentToRankUp"));
@ -1255,64 +1306,6 @@ function maxRankAllEvolutions() {
}); });
} }
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] = [
@ -1321,14 +1314,16 @@ function addGearExp(category, oid, xp) {
XP: xp XP: xp
} }
]; ];
$.post({ revalidateAuthz(() => {
url: "/custom/addXp?" + window.authz, $.post({
contentType: "application/json", url: "/custom/addXp?" + window.authz,
data: JSON.stringify(data) contentType: "application/json",
}).done(function () { data: JSON.stringify(data)
if (category != "SpecialItems") { }).done(function () {
updateInventory(); if (category != "SpecialItems") {
} updateInventory();
}
});
}); });
} }
@ -1603,34 +1598,32 @@ 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() {
revalidateAuthz(() => { fetch("/custom/config?" + window.authz)
fetch("/custom/config?" + window.authz) .then(response => response.json())
.then(response => response.json()) .then(json => {
.then(json => { for (const i of uiConfigs) {
for (const i of uiConfigs) { var x = document.getElementById(i);
var x = document.getElementById(i); if (x != null) {
if (x != null) { if (x.type == "checkbox") {
if (x.type == "checkbox") { if (x.checked === true) {
if (x.checked === true) { json[i] = true;
json[i] = true; } else {
} else { json[i] = false;
json[i] = false;
}
} else if (x.type == "number") {
json[i] = parseInt(x.value);
} }
} else if (x.type == "number") {
json[i] = parseInt(x.value);
} }
} }
$.post({ }
url: "/custom/config?" + window.authz, $.post({
contentType: "text/plain", url: "/custom/config?" + window.authz,
data: JSON.stringify(json, null, 2) contentType: "text/plain",
}).then(() => { data: JSON.stringify(json, null, 2)
// A few cheats affect the inventory response which in turn may change what values we need to show }).then(() => {
updateInventory(); // A few cheats affect the inventory response which in turn may change what values we need to show
}); updateInventory();
}); });
}); });
} }
// Cheats route // Cheats route
@ -1883,39 +1876,33 @@ function doChangeSupportedSyndicate() {
} }
function doAddCurrency(currency) { function doAddCurrency(currency) {
revalidateAuthz(() => { $.post({
$.post({ url: "/custom/addCurrency?" + window.authz,
url: "/custom/addCurrency?" + window.authz, contentType: "application/json",
contentType: "application/json", data: JSON.stringify({
data: JSON.stringify({ currency,
currency, delta: document.getElementById(currency + "-delta").valueAsNumber
delta: document.getElementById(currency + "-delta").valueAsNumber })
}) }).then(function () {
}).then(function () { updateInventory();
updateInventory();
});
}); });
} }
function doQuestUpdate(operation, itemType) { function doQuestUpdate(operation, itemType) {
revalidateAuthz(() => { $.post({
$.post({ url: "/custom/manageQuests?" + window.authz + "&operation=" + operation + "&itemType=" + itemType,
url: "/custom/manageQuests?" + window.authz + "&operation=" + operation + "&itemType=" + itemType, contentType: "application/json"
contentType: "application/json" }).then(function () {
}).then(function () { updateInventory();
updateInventory();
});
}); });
} }
function doBulkQuestUpdate(operation) { function doBulkQuestUpdate(operation) {
revalidateAuthz(() => { $.post({
$.post({ url: "/custom/manageQuests?" + window.authz + "&operation=" + operation,
url: "/custom/manageQuests?" + window.authz + "&operation=" + operation, contentType: "application/json"
contentType: "application/json" }).then(function () {
}).then(function () { updateInventory();
updateInventory();
});
}); });
} }