diff --git a/src/controllers/api/nemesisController.ts b/src/controllers/api/nemesisController.ts index 71329285..59379547 100644 --- a/src/controllers/api/nemesisController.ts +++ b/src/controllers/api/nemesisController.ts @@ -18,7 +18,7 @@ import { import { getJSONfromString } from "../../helpers/stringHelpers.ts"; import type { TInventoryDatabaseDocument } from "../../models/inventoryModels/inventoryModel.ts"; import { Loadout } from "../../models/inventoryModels/loadoutModel.ts"; -import { addMods, freeUpSlot, getInventory } from "../../services/inventoryService.ts"; +import { addMods, freeUpSlot, getInventory, getAccountCheats } from "../../services/inventoryService.ts"; import { getAccountForRequest } from "../../services/loginService.ts"; import { SRng } from "../../services/rngService.ts"; import type { IMongoDate, IOid } from "../../types/commonTypes.ts"; @@ -39,6 +39,7 @@ import { Types } from "mongoose"; export const nemesisController: RequestHandler = async (req, res) => { const account = await getAccountForRequest(req); + const accountCheats = await getAccountCheats(account._id.toString()); if ((req.query.mode as string) == "f") { const body = getJSONfromString(String(req.body)); const inventory = await getInventory(account._id.toString(), body.Category + " WeaponBin"); @@ -55,7 +56,8 @@ export const nemesisController: RequestHandler = async (req, res) => { // Upgrade destination damage value const destDamage = 0.25 + (destFingerprint.buffs[0].Value / 0x3fffffff) * (0.6 - 0.25); const sourceDamage = 0.25 + (sourceFingerprint.buffs[0].Value / 0x3fffffff) * (0.6 - 0.25); - let newDamage = Math.max(destDamage, sourceDamage) * 1.1; + const WeaponFusionMultiplier = accountCheats.nemesisWeaponFusionMultiplier ?? 1; + let newDamage = Math.max(destDamage, sourceDamage) * 1.1 * WeaponFusionMultiplier; if (newDamage >= 0.5794998) { newDamage = 0.6; } @@ -82,14 +84,18 @@ export const nemesisController: RequestHandler = async (req, res) => { let guessResult = 0; if (inventory.Nemesis!.Faction == "FC_INFESTATION") { for (let i = 0; i != 3; ++i) { - if (body.guess[i] == passcode[0]) { + if (body.guess[i] == passcode[0] || accountCheats.nemesisAlwaysCorrect) { guessResult = 1 + i; break; } } } else { for (let i = 0; i != 3; ++i) { - if (body.guess[i] == passcode[i] || body.guess[i] == GUESS_WILDCARD) { + if ( + body.guess[i] == passcode[i] || + body.guess[i] == GUESS_WILDCARD || + accountCheats.nemesisAlwaysCorrect + ) { ++guessResult; } } @@ -100,6 +106,7 @@ export const nemesisController: RequestHandler = async (req, res) => { account._id.toString(), "Nemesis LoadOutPresets CurrentLoadOutIds DataKnives Upgrades RawUpgrades" ); + const body = getJSONfromString(String(req.body)); if (inventory.Nemesis!.Faction == "FC_INFESTATION") { const guess: number[] = [body.guess & 0xf, (body.guess >> 4) & 0xf, (body.guess >> 8) & 0xf]; @@ -111,22 +118,27 @@ export const nemesisController: RequestHandler = async (req, res) => { encodeNemesisGuess([ { symbol: guess[0], - result: result1 + result: accountCheats.nemesisAlwaysCorrect ? GUESS_CORRECT : result1 }, { symbol: guess[1], - result: result2 + result: accountCheats.nemesisAlwaysCorrect ? GUESS_CORRECT : result2 }, { symbol: guess[2], - result: result3 + result: accountCheats.nemesisAlwaysCorrect ? GUESS_CORRECT : result3 } ]) ); // Increase antivirus if correct antivirus mod is installed const response: IKnifeResponse = {}; - if (result1 == GUESS_CORRECT || result2 == GUESS_CORRECT || result3 == GUESS_CORRECT) { + if ( + result1 == GUESS_CORRECT || + result2 == GUESS_CORRECT || + result3 == GUESS_CORRECT || + accountCheats.nemesisAlwaysCorrect + ) { let antivirusGain = 5; const loadout = (await Loadout.findById(inventory.LoadOutPresets, "DATAKNIFE"))!; const dataknifeLoadout = loadout.DATAKNIFE.id( @@ -149,7 +161,8 @@ export const nemesisController: RequestHandler = async (req, res) => { break; } } - inventory.Nemesis!.HenchmenKilled += antivirusGain; + inventory.Nemesis!.HenchmenKilled += + antivirusGain * (accountCheats.nemesisHenchmenKillsMultiplierInfestation ?? 1); if (inventory.Nemesis!.HenchmenKilled >= 100) { inventory.Nemesis!.HenchmenKilled = 100; @@ -192,10 +205,15 @@ export const nemesisController: RequestHandler = async (req, res) => { ]) ); } + if (accountCheats.nemesisAlwaysCorrect) { + body.guess = GUESS_WILDCARD | (GUESS_WILDCARD << 4) | (GUESS_WILDCARD << 8); + } // Evaluate guess const correct = - body.guess == GUESS_WILDCARD || getNemesisPasscode(inventory.Nemesis!)[body.position] == body.guess; + body.guess == GUESS_WILDCARD || + getNemesisPasscode(inventory.Nemesis!)[body.position] == body.guess || + accountCheats.nemesisAlwaysCorrect; // Update entry const guess = decodeNemesisGuess( @@ -232,9 +250,13 @@ export const nemesisController: RequestHandler = async (req, res) => { } } else { // Guess was incorrect, increase rank + const nemesisExtraRank = Math.floor(Math.random() * ((inventory.nemesisGainExtraRank ?? 0) + 1)); response.RankIncrease = 1; const manifest = getNemesisManifest(inventory.Nemesis!.manifest); - inventory.Nemesis!.Rank = Math.min(inventory.Nemesis!.Rank + 1, manifest.systemIndexes.length - 1); + inventory.Nemesis!.Rank = Math.min( + inventory.Nemesis!.Rank + 1 + nemesisExtraRank, + manifest.systemIndexes.length - 1 + ); inventory.Nemesis!.InfNodes = getInfNodes(manifest, inventory.Nemesis!.Rank); } await inventory.save(); diff --git a/src/services/inventoryService.ts b/src/services/inventoryService.ts index c8e25c1b..742cf90b 100644 --- a/src/services/inventoryService.ts +++ b/src/services/inventoryService.ts @@ -26,7 +26,8 @@ import type { INemesisWeaponTargetFingerprint, INemesisPetTargetFingerprint, IDialogueDatabase, - IKubrowPetPrintClient + IKubrowPetPrintClient, + IAccountCheats } from "../types/inventoryTypes/inventoryTypes.ts"; import { InventorySlot, equipmentKeys } from "../types/inventoryTypes/inventoryTypes.ts"; import type { IGenericUpdate, IUpdateNodeIntrosResponse } from "../types/genericUpdate.ts"; @@ -266,6 +267,13 @@ export const getInventory = async ( return inventory; }; +export const getAccountCheats = async (accountOwnerId: string): Promise> => { + const cheatProperties = Object.keys({} as IAccountCheats) as Array; + const inventoryWithCheats = await getInventory(accountOwnerId, cheatProperties.join(" ")); + + return inventoryWithCheats; +}; + export const productCategoryToInventoryBin = (productCategory: string): InventorySlot | undefined => { switch (productCategory) { case "Suits": diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index 3f3b643c..fc7f753a 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -35,6 +35,7 @@ import { addStanding, applyClientEquipmentUpdates, combineInventoryChanges, + getAccountCheats, getDialogue, giveNemesisPetRecipe, giveNemesisWeaponRecipe, @@ -201,10 +202,33 @@ export const addMissionInventoryUpdates = async ( inventory.NemesisAbandonedRewards = inventoryUpdates.RewardInfo.NemesisAbandonedRewards; } if (inventoryUpdates.RewardInfo.NemesisHenchmenKills && inventory.Nemesis) { - inventory.Nemesis.HenchmenKilled += inventoryUpdates.RewardInfo.NemesisHenchmenKills; + let NemesisHenchmenKillsMultiplier = 1; + switch (inventory.Nemesis.Faction) { + case "FC_GRINEER": + NemesisHenchmenKillsMultiplier = inventory.nemesisHenchmenKillsMultiplierGrineer ?? 1; + break; + case "FC_CORPUS": + NemesisHenchmenKillsMultiplier = inventory.nemesisHenchmenKillsMultiplierCorpus ?? 1; + break; + case "FC_INFESTATION": + //antivirus progess is controlled in nemesisController + break; + } + inventory.Nemesis.HenchmenKilled += + inventoryUpdates.RewardInfo.NemesisHenchmenKills * NemesisHenchmenKillsMultiplier; } if (inventoryUpdates.RewardInfo.NemesisHintProgress && inventory.Nemesis) { - inventory.Nemesis.HintProgress += inventoryUpdates.RewardInfo.NemesisHintProgress; + let NemesisHintProgressMultiplier = 1; + switch (inventory.Nemesis.Faction) { + case "FC_GRINEER": + NemesisHintProgressMultiplier = inventory.nemesisHintProgressMultiplierGrineer ?? 1; + break; + case "FC_CORPUS": + NemesisHintProgressMultiplier = inventory.nemesisHintProgressMultiplierCorpus ?? 1; + break; + } + inventory.Nemesis.HintProgress += + inventoryUpdates.RewardInfo.NemesisHintProgress * NemesisHintProgressMultiplier; if (inventory.Nemesis.Faction != "FC_INFESTATION" && inventory.Nemesis.Hints.length != 3) { const progressNeeded = [35, 60, 100][inventory.Nemesis.Hints.length]; if (inventory.Nemesis.HintProgress >= progressNeeded) { @@ -891,10 +915,11 @@ export const addMissionInventoryUpdates = async ( att.push(rotBReward); if (value.killed) { + const tokenMultiplier = Math.max(1, inventory.nemesisExtraWeaponOnKill ?? 1); countedAtt = [ { ItemType: "/Lotus/Types/Items/MiscItems/CodaWeaponBucks", - ItemCount: getKillTokenRewardCount(inventory.Nemesis.fp) + ItemCount: getKillTokenRewardCount(inventory.Nemesis.fp) * tokenMultiplier } ]; addMiscItems(inventory, countedAtt); diff --git a/static/webui/index.html b/static/webui/index.html index b558edf7..c814456b 100644 --- a/static/webui/index.html +++ b/static/webui/index.html @@ -787,6 +787,68 @@ +
+ + +
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ + +
+ + +
+
+
+ + +
+ + +
+
diff --git a/static/webui/script.js b/static/webui/script.js index 331fa547..4d221407 100644 --- a/static/webui/script.js +++ b/static/webui/script.js @@ -1502,7 +1502,11 @@ function updateInventory() { }); for (const elm of accountCheats) { - elm.checked = !!data[elm.id]; + if (elm.type === "checkbox") { + elm.checked = !!data[elm.id]; + } else if (elm.type === "number" || elm.type === "text") { + elm.value = data[elm.id] !== undefined ? data[elm.id] : elm.getAttribute("data-default") || ""; + } } }); }); @@ -2337,15 +2341,16 @@ function doIntrinsicsUnlockAll() { }); } -document.querySelectorAll("#account-cheats input[type=checkbox]").forEach(elm => { +document.querySelectorAll("#account-cheats input[type=checkbox], #account-cheats input[type=number]").forEach(elm => { elm.onchange = function () { revalidateAuthz().then(() => { + const value = elm.type === "checkbox" ? elm.checked : elm.value; $.post({ url: "/custom/setAccountCheat?" + window.authz /*+ "&wsid=" + wsid*/, contentType: "application/json", data: JSON.stringify({ key: elm.id, - value: elm.checked + value: value }) }); });