WIP: Nemesis cheats #2729

Closed
AlexisinGit wants to merge 11 commits from AlexisinGit:NemesisCheats into main
14 changed files with 264 additions and 18 deletions

View File

@ -30,7 +30,8 @@ import type {
IUpgradeClient,
IWeaponSkinClient,
TEquipmentKey,
TNemesisFaction
TNemesisFaction,
IAccountCheats
} from "../../types/inventoryTypes/inventoryTypes.ts";
import { InventorySlot, LoadoutIndex } from "../../types/inventoryTypes/inventoryTypes.ts";
import { logger } from "../../utils/logger.ts";
@ -39,6 +40,9 @@ import { Types } from "mongoose";
export const nemesisController: RequestHandler = async (req, res) => {
const account = await getAccountForRequest(req);

Don't do this. The inventory is available, you can use far smarter projections.

Don't do this. The `inventory` is available, you can use far smarter projections.
const cheatProperties = Object.keys({} as IAccountCheats) as Array<keyof IAccountCheats>;
const accountCheats = await getInventory(account._id.toString(), cheatProperties.join(" "));
if ((req.query.mode as string) == "f") {
const body = getJSONfromString<IValenceFusionRequest>(String(req.body));
const inventory = await getInventory(account._id.toString(), body.Category + " WeaponBin");
@ -55,7 +59,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 +87,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,10 +109,16 @@ export const nemesisController: RequestHandler = async (req, res) => {
account._id.toString(),
"Nemesis LoadOutPresets CurrentLoadOutIds DataKnives Upgrades RawUpgrades"
);
const body = getJSONfromString<INemesisRequiemRequest>(String(req.body));
if (inventory.Nemesis!.Faction == "FC_INFESTATION") {
const guess: number[] = [body.guess & 0xf, (body.guess >> 4) & 0xf, (body.guess >> 8) & 0xf];
const passcode = getNemesisPasscode(inventory.Nemesis!)[0];
if (accountCheats.nemesisAlwaysCorrect) {
guess[0] = guess[1] = guess[2] = passcode;
}

This is clearly too late to do this, just change guess directly.

This is clearly too late to do this, just change `guess` directly.
const result1 = passcode == guess[0] ? GUESS_CORRECT : GUESS_INCORRECT;
const result2 = passcode == guess[1] ? GUESS_CORRECT : GUESS_INCORRECT;
const result3 = passcode == guess[2] ? GUESS_CORRECT : GUESS_INCORRECT;
@ -126,7 +141,12 @@ export const nemesisController: RequestHandler = async (req, res) => {
// 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 +169,8 @@ export const nemesisController: RequestHandler = async (req, res) => {
break;
}
}
inventory.Nemesis!.HenchmenKilled += antivirusGain;
inventory.Nemesis!.HenchmenKilled +=
antivirusGain * (accountCheats.nemesisAntivirusGainMultiplier ?? 1);
if (inventory.Nemesis!.HenchmenKilled >= 100) {
inventory.Nemesis!.HenchmenKilled = 100;
@ -161,8 +182,10 @@ export const nemesisController: RequestHandler = async (req, res) => {
}
];
inventory.Nemesis!.Weakened = true;
const upgrade = getKnifeUpgrade(inventory, dataknifeUpgrades, antivirusMods[passcode]);
consumeModCharge(response, inventory, upgrade, dataknifeUpgrades);
if (!accountCheats.nemesisAlwaysCorrect) {
const upgrade = getKnifeUpgrade(inventory, dataknifeUpgrades, antivirusMods[passcode]);
consumeModCharge(response, inventory, upgrade, dataknifeUpgrades);
}
}
}
@ -192,10 +215,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(
@ -226,15 +254,22 @@ export const nemesisController: RequestHandler = async (req, res) => {
const dataknifeUpgrades = inventory.DataKnives[0].Configs[dataknifeConfigIndex].Upgrades!;
for (let i = 3; i != 6; ++i) {
//logger.debug(`subtracting a charge from ${dataknifeUpgrades[i]}`);
if (accountCheats.nemesisAlwaysCorrect) {
break;

So confused by this. Who would want a disadvantage? Why is it randomised?

So confused by this. Who would want a disadvantage? Why is it randomised?

Just to simulate a speed up stabbing process, somewhere between vanilla and always correct.

Honestly just my personal interest. I can remove this...

Just to simulate a speed up stabbing process, somewhere between vanilla and always correct. Honestly just my personal interest. I can remove this...
}
const upgrade = parseUpgrade(inventory, dataknifeUpgrades[i]);
consumeModCharge(response, inventory, upgrade, dataknifeUpgrades);
}
}
} 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();

View File

@ -14,5 +14,5 @@ export const setAccountCheatController: RequestHandler = async (req, res) => {
interface ISetAccountCheatRequest {
key: keyof IAccountCheats;
value: boolean;
value: boolean | number;

Absolutely not. boolean | number.

Absolutely not. `boolean | number`.
}

View File

@ -1462,6 +1462,15 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
flawlessRelicsAlwaysGiveSilverReward: Boolean,
radiantRelicsAlwaysGiveGoldReward: Boolean,
disableDailyTribute: Boolean,
nemesisAlwaysCorrect: Boolean,
nemesisHenchmenKillsMultiplierGrineer: Number,
nemesisHenchmenKillsMultiplierCorpus: Number,
nemesisAntivirusGainMultiplier: Number,
nemesisHintProgressMultiplierGrineer: Number,
nemesisHintProgressMultiplierCorpus: Number,
nemesisWeaponFusionMultiplier: Number,
nemesisGainExtraRank: Number,
nemesisExtraWeaponOnKill: Number,
SubscribedToEmails: { type: Number, default: 0 },
SubscribedToEmailsPersonalized: { type: Number, default: 0 },

View File

@ -201,10 +201,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) {
@ -851,6 +874,22 @@ export const addMissionInventoryUpdates = async (
const weaponType = manifest.weapons[inventory.Nemesis.WeaponIdx];
giveNemesisWeaponRecipe(inventory, weaponType, value.nemesisName, value.weaponLoc, profile);
att.push(weaponType);
if (inventory.nemesisExtraWeaponOnKill && inventory.nemesisExtraWeaponOnKill > 1) {
const weaponManifest = manifest.weapons;
for (let i = 0; i < inventory.nemesisExtraWeaponOnKill; i++) {
const randomIndex = Math.floor(Math.random() * weaponManifest.length);
const randomWeapon = weaponManifest[randomIndex];
giveNemesisWeaponRecipe(
inventory,
randomWeapon,
value.nemesisName,
value.weaponLoc,
profile
);
att.push(randomWeapon);
}
}
}
//if (value.petLoc) {
if (profile.petHead) {
@ -891,10 +930,11 @@ export const addMissionInventoryUpdates = async (
att.push(rotBReward);
if (value.killed) {
const tokenMultiplier = Math.max(1, inventory.nemesisExtraWeaponOnKill ?? 1);
countedAtt = [

Very confusing interaction of this cheat to be dual-purposed as a token multiplier.

Very confusing interaction of this cheat to be dual-purposed as a token multiplier.

for G / C 1 stab = 1 weapon.

for I 1 stab = at least 10 token = 1 weapon.

I think to combine is better and more intuitive. People would just want more token if they have this cheat enabled anyway.

for G / C 1 stab = 1 weapon. for I 1 stab = at least 10 token = 1 weapon. I think to combine is better and more intuitive. People would just want more token if they have this cheat enabled anyway.
{
ItemType: "/Lotus/Types/Items/MiscItems/CodaWeaponBucks",
ItemCount: getKillTokenRewardCount(inventory.Nemesis.fp)
ItemCount: getKillTokenRewardCount(inventory.Nemesis.fp) * tokenMultiplier
}
];
addMiscItems(inventory, countedAtt);
@ -1422,7 +1462,9 @@ export const addMissionRewards = async (
if (inventory.Nemesis.Faction == "FC_INFESTATION") {
inventory.Nemesis.MissionCount += 1;
inventory.Nemesis.HenchmenKilled = Math.min(inventory.Nemesis.HenchmenKilled + 5, 95); // 5 progress per mission until 95
let antivirusGain = 5;
antivirusGain *= inventory.nemesisAntivirusGainMultiplier ?? 1;
inventory.Nemesis.HenchmenKilled = Math.min(inventory.Nemesis.HenchmenKilled + antivirusGain, 95); // 5 progress per mission until 95
inventoryChanges.Nemesis.MissionCount ??= 0;
inventoryChanges.Nemesis.MissionCount += 1;

View File

@ -55,6 +55,15 @@ export interface IAccountCheats {
flawlessRelicsAlwaysGiveSilverReward?: boolean;
radiantRelicsAlwaysGiveGoldReward?: boolean;
disableDailyTribute?: boolean;
nemesisAlwaysCorrect?: boolean;
nemesisHenchmenKillsMultiplierGrineer?: number;
nemesisHenchmenKillsMultiplierCorpus?: number;
nemesisAntivirusGainMultiplier?: number;
nemesisHintProgressMultiplierGrineer?: number;
nemesisHintProgressMultiplierCorpus?: number;
nemesisWeaponFusionMultiplier?: number;
nemesisGainExtraRank?: number;
nemesisExtraWeaponOnKill?: number;
}
export interface IInventoryDatabase

View File

@ -787,6 +787,68 @@
<input class="form-check-input" type="checkbox" id="finishInvasionsInOneMission" />
<label class="form-check-label" for="finishInvasionsInOneMission" data-loc="cheats_finishInvasionsInOneMission"></label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="nemesisAlwaysCorrect" />
<label class="form-check-label" for="nemesisAlwaysCorrect" data-loc="cheats_nemesisAlwaysCorrect"></label>
</div>
<form class="form-group mt-2">
<label class="form-label" for="nemesisHenchmenKillsMultiplierGrineer" data-loc="cheats_nemesisHenchmenKillsMultiplierGrineer"></label>
<div class="input-group">
<input class="form-control" id="nemesisHenchmenKillsMultiplierGrineer" type="number" min="-1" max="65535" data-default="1" />
<button class="btn btn-secondary" type="button" data-loc="cheats_save"></button>
</div>
</form>
<form class="form-group mt-2">
<label class="form-label" for="nemesisHenchmenKillsMultiplierCorpus" data-loc="cheats_nemesisHenchmenKillsMultiplierCorpus"></label>
<div class="input-group">
<input class="form-control" id="nemesisHenchmenKillsMultiplierCorpus" type="number" min="-1" max="65535" data-default="1" />
<button class="btn btn-secondary" type="button" data-loc="cheats_save"></button>
</div>
</form>
<form class="form-group mt-2">
<label class="form-label" for="nemesisAntivirusGainMultiplier" data-loc="cheats_nemesisAntivirusGainMultiplier"></label>
<div class="input-group">
<input class="form-control" id="nemesisAntivirusGainMultiplier" type="number" min="-1" max="65535" data-default="1" />
<button class="btn btn-secondary" type="button" data-loc="cheats_save"></button>
</div>
</form>
<form class="form-group mt-2">
<label class="form-label" for="nemesisHintProgressMultiplierGrineer" data-loc="cheats_nemesisHintProgressMultiplierGrineer"></label>
<div class="input-group">
<input class="form-control" id="nemesisHintProgressMultiplierGrineer" type="number" min="-1" max="65535" data-default="1" />
<button class="btn btn-secondary" type="button" data-loc="cheats_save"></button>
</div>
</form>
<form class="form-group mt-2">
<label class="form-label" for="nemesisHintProgressMultiplierCorpus" data-loc="cheats_nemesisHintProgressMultiplierCorpus"></label>
<div class="input-group">
<input class="form-control" id="nemesisHintProgressMultiplierCorpus" type="number" min="-1" max="65535" data-default="1" />
<button class="btn btn-secondary" type="button" data-loc="cheats_save"></button>
</div>
</form>
<form class="form-group mt-2">
<label class="form-label" for="nemesisWeaponFusionMultiplier" data-loc="cheats_nemesisWeaponFusionMultiplier"></label>
<div class="input-group">
<input class="form-control" id="nemesisWeaponFusionMultiplier" type="number" min="-1" max="65535" data-default="1" />
<button class="btn btn-secondary" type="button" data-loc="cheats_save"></button>
</div>
</form>
<form class="form-group mt-2">
<label class="form-label" for="nemesisGainExtraRank" data-loc="cheats_nemesisGainExtraRank"></label>
<abbr data-loc-info="cheats_nemesisGainExtraRank_information"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><path d="M320 576C461.4 576 576 461.4 576 320C576 178.6 461.4 64 320 64C178.6 64 64 178.6 64 320C64 461.4 178.6 576 320 576zM320 200C333.3 200 344 210.7 344 224L344 336C344 349.3 333.3 360 320 360C306.7 360 296 349.3 296 336L296 224C296 210.7 306.7 200 320 200zM293.3 416C292.7 406.1 297.6 396.7 306.1 391.5C314.6 386.4 325.3 386.4 333.8 391.5C342.3 396.7 347.2 406.1 346.6 416C347.2 425.9 342.3 435.3 333.8 440.5C325.3 445.6 314.6 445.6 306.1 440.5C297.6 435.3 292.7 425.9 293.3 416z"/></svg></abbr>
<div class="input-group">
<input class="form-control" id="nemesisGainExtraRank" type="number" min="0" max="65535" data-default="0" />
<button class="btn btn-secondary" type="button" data-loc="cheats_save"></button>
</div>
</form>
<form class="form-group mt-2">
<label class="form-label" for="nemesisExtraWeaponOnKill" data-loc="cheats_nemesisExtraWeaponOnKill"></label>
<abbr data-loc-info="cheats_nemesisExtraWeaponOnKill_information"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><path d="M320 576C461.4 576 576 461.4 576 320C576 178.6 461.4 64 320 64C178.6 64 64 178.6 64 320C64 461.4 178.6 576 320 576zM320 200C333.3 200 344 210.7 344 224L344 336C344 349.3 333.3 360 320 360C306.7 360 296 349.3 296 336L296 224C296 210.7 306.7 200 320 200zM293.3 416C292.7 406.1 297.6 396.7 306.1 391.5C314.6 386.4 325.3 386.4 333.8 391.5C342.3 396.7 347.2 406.1 346.6 416C347.2 425.9 342.3 435.3 333.8 440.5C325.3 445.6 314.6 445.6 306.1 440.5C297.6 435.3 292.7 425.9 293.3 416z"/></svg></abbr>
<div class="input-group">
<input class="form-control" id="nemesisExtraWeaponOnKill" type="number" min="0" max="65535" data-default="0" />
<button class="btn btn-secondary" type="button" data-loc="cheats_save"></button>
</div>
</form>
<div class="mt-2 mb-2 d-flex flex-wrap gap-2">
<button class="btn btn-primary" onclick="debounce(doUnlockAllMissions);" data-loc="cheats_unlockAllMissions"></button>
<button class="btn btn-primary" onclick="debounce(markAllAsRead);" data-loc="cheats_markAllAsRead"></button>

View File

@ -220,6 +220,13 @@ function updateLocElements() {
.join(", ");
elm.title = `${loc("worldState_incompatibleWith")} ${incWith}`;
});
document.querySelectorAll("[data-loc-info]").forEach(elm => {
const incWith = elm
.getAttribute("data-loc-info")
.split("|")
.map(key => loc(key));
elm.title = `${incWith}`;
});
document.querySelectorAll("[data-loc-replace]").forEach(elm => {
elm.innerHTML = elm.innerHTML.replace("|VAL|", elm.getAttribute("data-loc-replace"));
});
@ -1495,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") || "";
}
}
});
});
@ -2330,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
})
});
});

View File

@ -240,6 +240,17 @@ dict = {
cheats_changeButton: `Ändern`,
cheats_markAllAsRead: `Posteingang als gelesen markieren`,
cheats_finishInvasionsInOneMission: `[UNTRANSLATED] Finish Invasions in One Mission`,
cheats_nemesisAlwaysCorrect: `[UNTRANSLATED] Any Requiem / Antivirus Guess Is Correct`,
cheats_nemesisHenchmenKillsMultiplierGrineer: `[UNTRANSLATED] Rage Progress Multiplier (Grineer)`,
cheats_nemesisHenchmenKillsMultiplierCorpus: `[UNTRANSLATED] Rage Progress Multiplier (Corpus)`,
cheats_nemesisAntivirusGainMultiplier: `[UNTRANSLATED] Antivirus Progress Multiplier (Techrot)`,
cheats_nemesisHintProgressMultiplierGrineer: `[UNTRANSLATED] Hint Progress Multiplier (Grineer)`,
cheats_nemesisHintProgressMultiplierCorpus: `[UNTRANSLATED] Hint Progress Multiplier (Corpus)`,
cheats_nemesisWeaponFusionMultiplier: `[UNTRANSLATED] Valence Fusion Multiplier (Adversary Weapons)`,
cheats_nemesisGainExtraRank: `[UNTRANSLATED] Extra Adversary Level`,
cheats_nemesisGainExtraRank_information: `[UNTRANSLATED] An incorrect guess may give your adversary extra level, up to the value you put in this setting. 0 to disable.`,
cheats_nemesisExtraWeaponOnKill: `[UNTRANSLATED] Extra Adversary Weapon On Vanquish`,
cheats_nemesisExtraWeaponOnKill_information: `[UNTRANSLATED] Random adversary weapons with identical elemental bonus stat will be sent to your foundry. This works as a multiplier for Live Heartcell. 0 to disable.`,
worldState: `Weltstatus`,
worldState_creditBoost: `Event Booster: Credit`,

View File

@ -239,6 +239,17 @@ dict = {
cheats_changeButton: `Change`,
cheats_markAllAsRead: `Mark Inbox As Read`,
cheats_finishInvasionsInOneMission: `Finish Invasions in One Mission`,
cheats_nemesisAlwaysCorrect: `Any Requiem / Antivirus Guess Is Correct`,
cheats_nemesisHenchmenKillsMultiplierGrineer: `Rage Progress Multiplier (Grineer)`,
cheats_nemesisHenchmenKillsMultiplierCorpus: `Rage Progress Multiplier (Corpus)`,
cheats_nemesisAntivirusGainMultiplier: `Antivirus Progress Multiplier (Techrot)`,
cheats_nemesisHintProgressMultiplierGrineer: `Hint Progress Multiplier (Grineer)`,
cheats_nemesisHintProgressMultiplierCorpus: `Hint Progress Multiplier (Corpus)`,
cheats_nemesisWeaponFusionMultiplier: `Valence Fusion Multiplier (Adversary Weapons)`,
cheats_nemesisGainExtraRank: `Extra Adversary Level`,
cheats_nemesisGainExtraRank_information: `An incorrect guess may give your adversary extra level, up to the value you put in this setting. 0 to disable.`,
cheats_nemesisExtraWeaponOnKill: `Extra Adversary Weapon On Vanquish`,
cheats_nemesisExtraWeaponOnKill_information: `Random adversary weapons with identical elemental bonus stat will be sent to your foundry. This works as a multiplier for Live Heartcell. 0 to disable.`,
worldState: `World State`,
worldState_creditBoost: `Credit Boost`,

View File

@ -240,6 +240,17 @@ dict = {
cheats_changeButton: `Cambiar`,
cheats_markAllAsRead: `Marcar bandeja de entrada como leída`,
cheats_finishInvasionsInOneMission: `[UNTRANSLATED] Finish Invasions in One Mission`,
cheats_nemesisAlwaysCorrect: `[UNTRANSLATED] Any Requiem / Antivirus Guess Is Correct`,
cheats_nemesisHenchmenKillsMultiplierGrineer: `[UNTRANSLATED] Rage Progress Multiplier (Grineer)`,
cheats_nemesisHenchmenKillsMultiplierCorpus: `[UNTRANSLATED] Rage Progress Multiplier (Corpus)`,
cheats_nemesisAntivirusGainMultiplier: `[UNTRANSLATED] Antivirus Progress Multiplier (Techrot)`,
cheats_nemesisHintProgressMultiplierGrineer: `[UNTRANSLATED] Hint Progress Multiplier (Grineer)`,
cheats_nemesisHintProgressMultiplierCorpus: `[UNTRANSLATED] Hint Progress Multiplier (Corpus)`,
cheats_nemesisWeaponFusionMultiplier: `[UNTRANSLATED] Valence Fusion Multiplier (Adversary Weapons)`,
cheats_nemesisGainExtraRank: `[UNTRANSLATED] Extra Adversary Level`,
cheats_nemesisGainExtraRank_information: `[UNTRANSLATED] An incorrect guess may give your adversary extra level, up to the value you put in this setting. 0 to disable.`,
cheats_nemesisExtraWeaponOnKill: `[UNTRANSLATED] Extra Adversary Weapon On Vanquish`,
cheats_nemesisExtraWeaponOnKill_information: `[UNTRANSLATED] Random adversary weapons with identical elemental bonus stat will be sent to your foundry. This works as a multiplier for Live Heartcell. 0 to disable.`,
worldState: `Estado del mundo`,
worldState_creditBoost: `Potenciador de Créditos`,

View File

@ -240,6 +240,17 @@ dict = {
cheats_changeButton: `Changer`,
cheats_markAllAsRead: `Marquer la boîte de réception comme lue`,
cheats_finishInvasionsInOneMission: `[UNTRANSLATED] Finish Invasions in One Mission`,
cheats_nemesisAlwaysCorrect: `[UNTRANSLATED] Any Requiem / Antivirus Guess Is Correct`,
cheats_nemesisHenchmenKillsMultiplierGrineer: `[UNTRANSLATED] Rage Progress Multiplier (Grineer)`,
cheats_nemesisHenchmenKillsMultiplierCorpus: `[UNTRANSLATED] Rage Progress Multiplier (Corpus)`,
cheats_nemesisAntivirusGainMultiplier: `[UNTRANSLATED] Antivirus Progress Multiplier (Techrot)`,
cheats_nemesisHintProgressMultiplierGrineer: `[UNTRANSLATED] Hint Progress Multiplier (Grineer)`,
cheats_nemesisHintProgressMultiplierCorpus: `[UNTRANSLATED] Hint Progress Multiplier (Corpus)`,
cheats_nemesisWeaponFusionMultiplier: `[UNTRANSLATED] Valence Fusion Multiplier (Adversary Weapons)`,
cheats_nemesisGainExtraRank: `[UNTRANSLATED] Extra Adversary Level`,
cheats_nemesisGainExtraRank_information: `[UNTRANSLATED] An incorrect guess may give your adversary extra level, up to the value you put in this setting. 0 to disable.`,
cheats_nemesisExtraWeaponOnKill: `[UNTRANSLATED] Extra Adversary Weapon On Vanquish`,
cheats_nemesisExtraWeaponOnKill_information: `[UNTRANSLATED] Random adversary weapons with identical elemental bonus stat will be sent to your foundry. This works as a multiplier for Live Heartcell. 0 to disable.`,
worldState: `Carte Solaire`,
worldState_creditBoost: `Booster de Crédit`,

View File

@ -240,6 +240,17 @@ dict = {
cheats_changeButton: `Изменить`,
cheats_markAllAsRead: `Пометить все входящие как прочитанные`,
cheats_finishInvasionsInOneMission: `[UNTRANSLATED] Finish Invasions in One Mission`,
cheats_nemesisAlwaysCorrect: `[UNTRANSLATED] Any Requiem / Antivirus Guess Is Correct`,
cheats_nemesisHenchmenKillsMultiplierGrineer: `[UNTRANSLATED] Rage Progress Multiplier (Grineer)`,
cheats_nemesisHenchmenKillsMultiplierCorpus: `[UNTRANSLATED] Rage Progress Multiplier (Corpus)`,
cheats_nemesisAntivirusGainMultiplier: `[UNTRANSLATED] Antivirus Progress Multiplier (Techrot)`,
cheats_nemesisHintProgressMultiplierGrineer: `[UNTRANSLATED] Hint Progress Multiplier (Grineer)`,
cheats_nemesisHintProgressMultiplierCorpus: `[UNTRANSLATED] Hint Progress Multiplier (Corpus)`,
cheats_nemesisWeaponFusionMultiplier: `[UNTRANSLATED] Valence Fusion Multiplier (Adversary Weapons)`,
cheats_nemesisGainExtraRank: `[UNTRANSLATED] Extra Adversary Level`,
cheats_nemesisGainExtraRank_information: `[UNTRANSLATED] An incorrect guess may give your adversary extra level, up to the value you put in this setting. 0 to disable.`,
cheats_nemesisExtraWeaponOnKill: `[UNTRANSLATED] Extra Adversary Weapon On Vanquish`,
cheats_nemesisExtraWeaponOnKill_information: `[UNTRANSLATED] Random adversary weapons with identical elemental bonus stat will be sent to your foundry. This works as a multiplier for Live Heartcell. 0 to disable.`,
worldState: `Состояние мира`,
worldState_creditBoost: `Глобальный бустер Кредитов`,

View File

@ -240,6 +240,17 @@ dict = {
cheats_changeButton: `Змінити`,
cheats_markAllAsRead: `Помітити всі вхідні як прочитані`,
cheats_finishInvasionsInOneMission: `[UNTRANSLATED] Finish Invasions in One Mission`,
cheats_nemesisAlwaysCorrect: `[UNTRANSLATED] Any Requiem / Antivirus Guess Is Correct`,
cheats_nemesisHenchmenKillsMultiplierGrineer: `[UNTRANSLATED] Rage Progress Multiplier (Grineer)`,
cheats_nemesisHenchmenKillsMultiplierCorpus: `[UNTRANSLATED] Rage Progress Multiplier (Corpus)`,
cheats_nemesisAntivirusGainMultiplier: `[UNTRANSLATED] Antivirus Progress Multiplier (Techrot)`,
cheats_nemesisHintProgressMultiplierGrineer: `[UNTRANSLATED] Hint Progress Multiplier (Grineer)`,
cheats_nemesisHintProgressMultiplierCorpus: `[UNTRANSLATED] Hint Progress Multiplier (Corpus)`,
cheats_nemesisWeaponFusionMultiplier: `[UNTRANSLATED] Valence Fusion Multiplier (Adversary Weapons)`,
cheats_nemesisGainExtraRank: `[UNTRANSLATED] Extra Adversary Level`,
cheats_nemesisGainExtraRank_information: `[UNTRANSLATED] An incorrect guess may give your adversary extra level, up to the value you put in this setting. 0 to disable.`,
cheats_nemesisExtraWeaponOnKill: `[UNTRANSLATED] Extra Adversary Weapon On Vanquish`,
cheats_nemesisExtraWeaponOnKill_information: `[UNTRANSLATED] Random adversary weapons with identical elemental bonus stat will be sent to your foundry. This works as a multiplier for Live Heartcell. 0 to disable.`,
worldState: `Стан світу`,
worldState_creditBoost: `Глобальне посилення Кредитів`,

View File

@ -240,6 +240,17 @@ dict = {
cheats_changeButton: `更改`,
cheats_markAllAsRead: `收件箱全部标记为已读`,
cheats_finishInvasionsInOneMission: `一场任务完成整场入侵`,
cheats_nemesisAlwaysCorrect: `玄骸密码总是正确`,
cheats_nemesisHenchmenKillsMultiplierGrineer: `怒气倍率(Grineer)`,
cheats_nemesisHenchmenKillsMultiplierCorpus: `怒气倍率(Corpus)`,
cheats_nemesisAntivirusGainMultiplier: `杀毒进度(科腐者)`,
cheats_nemesisHintProgressMultiplierGrineer: `密码解密进度(Grineer)`,
cheats_nemesisHintProgressMultiplierCorpus: `密码解密进度(Corpus)`,
cheats_nemesisWeaponFusionMultiplier: `效价融合倍率(玄骸武器)`,
cheats_nemesisGainExtraRank: `额外玄骸等级`,
cheats_nemesisGainExtraRank_information: `猜错密码时玄骸可能会获得额外的等级, 最多为设置里的数. 设置为0禁用`,
cheats_nemesisExtraWeaponOnKill: `额外玄骸武器`,
cheats_nemesisExtraWeaponOnKill_information: `击杀玄骸额外奖励随机的武器, 元素加成与原武器相同, 一同发放到铸造厂. 击杀科腐者会奖励额外倍数的代币. 设置为0禁用`,
worldState: `世界状态配置`,
worldState_creditBoost: `现金加成`,