feat(webui): Valence Bonus
Some checks failed
Build / build (pull_request) Failing after 1m3s

Closes #1181
This commit is contained in:
AMelonInsideLemon 2025-06-28 23:46:41 +02:00 committed by Sainan
parent 69f9d5ebc5
commit 88173285ff
11 changed files with 299 additions and 79 deletions

View File

@ -0,0 +1,39 @@
import { getInventory } from "@/src/services/inventoryService";
import { WeaponTypeInternal } from "@/src/services/itemDataService";
import { getAccountIdForRequest } from "@/src/services/loginService";
import { RequestHandler } from "express";
export const updateFingerprintController: RequestHandler = async (req, res) => {
const accountId = await getAccountIdForRequest(req);
const request = req.body as IUpdateFingerPrintRequest;
const inventory = await getInventory(accountId, request.category);
const item = inventory[request.category].id(request.oid);
if (item) {
if (request.action == "set" && request.upgradeFingerprint.buffs[0].Tag) {
const newUpgradeFingerprint = request.upgradeFingerprint;
if (!newUpgradeFingerprint.compact) newUpgradeFingerprint.compact = item.ItemType;
item.UpgradeType = request.upgradeType;
item.UpgradeFingerprint = JSON.stringify(newUpgradeFingerprint);
} else if (request.action == "remove") {
item.UpgradeFingerprint = undefined;
item.UpgradeType = undefined;
}
await inventory.save();
}
res.end();
};
interface IUpdateFingerPrintRequest {
category: WeaponTypeInternal;
oid: string;
action: "set" | "remove";
upgradeType: string;
upgradeFingerprint: {
compact?: string;
buffs: {
Tag: string;
Value: number;
}[];
};
}

View File

@ -24,6 +24,7 @@ import { importController } from "@/src/controllers/custom/importController";
import { manageQuestsController } from "@/src/controllers/custom/manageQuestsController"; import { manageQuestsController } from "@/src/controllers/custom/manageQuestsController";
import { setEvolutionProgressController } from "@/src/controllers/custom/setEvolutionProgressController"; import { setEvolutionProgressController } from "@/src/controllers/custom/setEvolutionProgressController";
import { setBoosterController } from "@/src/controllers/custom/setBoosterController"; import { setBoosterController } from "@/src/controllers/custom/setBoosterController";
import { updateFingerprintController } from "@/src/controllers/custom/updateFingerprintController";
import { getConfigController, setConfigController } from "@/src/controllers/custom/configController"; import { getConfigController, setConfigController } from "@/src/controllers/custom/configController";
@ -53,6 +54,7 @@ customRouter.post("/import", importController);
customRouter.post("/manageQuests", manageQuestsController); customRouter.post("/manageQuests", manageQuestsController);
customRouter.post("/setEvolutionProgress", setEvolutionProgressController); customRouter.post("/setEvolutionProgress", setEvolutionProgressController);
customRouter.post("/setBooster", setBoosterController); customRouter.post("/setBooster", setBoosterController);
customRouter.post("/updateFingerprint", updateFingerprintController);
customRouter.post("/getConfig", getConfigController); customRouter.post("/getConfig", getConfigController);
customRouter.post("/setConfig", setConfigController); customRouter.post("/setConfig", setConfigController);

View File

@ -24,7 +24,7 @@ webuiRouter.use("/webui", (req, res, next) => {
webuiRouter.get("/webui/inventory", (_req, res) => { webuiRouter.get("/webui/inventory", (_req, res) => {
res.sendFile(path.join(baseDir, "static/webui/index.html")); res.sendFile(path.join(baseDir, "static/webui/index.html"));
}); });
webuiRouter.get(/webui\/powersuit\/(.+)/, (_req, res) => { webuiRouter.get("/webui/detailedView", (_req, res) => {
res.sendFile(path.join(baseDir, "static/webui/index.html")); res.sendFile(path.join(baseDir, "static/webui/index.html"));
}); });
webuiRouter.get("/webui/mods", (_req, res) => { webuiRouter.get("/webui/mods", (_req, res) => {

View File

@ -456,15 +456,15 @@
</div> </div>
</div> </div>
</div> </div>
<div id="powersuit-route" data-route="~ /webui/powersuit/(.+)" data-title="Inventory | OpenWF WebUI"> <div id="detailedView-route" data-route="/webui/detailedView" data-title="Inventory | OpenWF WebUI">
<h3 class="mb-0"></h3> <h3 class="mb-0"></h3>
<p class="text-body-secondary"></p> <p class="text-body-secondary"></p>
<div class="card"> <div id="archonShards-card" class="card mb-3 d-none">
<h5 class="card-header" data-loc="powersuit_archonShardsLabel"></h5> <h5 class="card-header" data-loc="detailedView_archonShardsLabel"></h5>
<div class="card-body"> <div class="card-body">
<p> <p>
<span data-loc="powersuit_archonShardsDescription"></span> <span data-loc="detailedView_archonShardsDescription"></span>
<span data-loc="powersuit_archonShardsDescription2"></span> <span data-loc="detailedView_archonShardsDescription2"></span>
</p> </p>
<form class="input-group mb-3" onsubmit="doPushArchonCrystalUpgrade();return false;"> <form class="input-group mb-3" onsubmit="doPushArchonCrystalUpgrade();return false;">
<input type="number" id="archon-crystal-add-count" min="1" max="10000" value="1" class="form-control" style="max-width:100px" /> <input type="number" id="archon-crystal-add-count" min="1" max="10000" value="1" class="form-control" style="max-width:100px" />
@ -477,6 +477,18 @@
</table> </table>
</div> </div>
</div> </div>
<div id="valenceBonus-card" class="card mb-3 d-none">
<h5 class="card-header" data-loc="detailedView_valenceBonusLabel"></h5>
<div class="card-body">
<p data-loc="detailedView_valenceBonusDescription"></p>
<form class="input-group mb-3" onsubmit="handleValenceBonusChange(event)">
<select class="form-control" id="valenceBonus-innateDamage"></select>
<input type="number" id="valenceBonus-procent" min="25" max="60" step="0.1" class="form-control" style="max-width:100px" />
<button class="btn btn-primary" type="submit" value="set" data-loc="general_setButton"></button>
<button class="btn btn-danger" type="submit" value="remove" data-loc="general_removeButton"></button>
</form>
</div>
</div>
</div> </div>
<div data-route="/webui/mods" data-title="Mods | OpenWF WebUI"> <div data-route="/webui/mods" data-title="Mods | OpenWF WebUI">
<p class="mb-3" data-loc="general_inventoryUpdateNote"></p> <p class="mb-3" data-loc="general_inventoryUpdateNote"></p>

View File

@ -284,6 +284,8 @@ function fetchItemList() {
document.getElementById("changeSyndicate").innerHTML = ""; document.getElementById("changeSyndicate").innerHTML = "";
document.getElementById("changeSyndicate").appendChild(syndicateNone); document.getElementById("changeSyndicate").appendChild(syndicateNone);
document.getElementById("valenceBonus-innateDamage").innerHTML = "";
// prettier-ignore // prettier-ignore
data.archonCrystalUpgrades = { data.archonCrystalUpgrades = {
"/Lotus/Upgrades/Invigorations/ArchonCrystalUpgrades/ArchonCrystalUpgradeEquilibrium": loc("upgrade_Equilibrium").split("|VAL|").join("20"), "/Lotus/Upgrades/Invigorations/ArchonCrystalUpgrades/ArchonCrystalUpgradeEquilibrium": loc("upgrade_Equilibrium").split("|VAL|").join("20"),
@ -366,6 +368,16 @@ function fetchItemList() {
}; };
window.archonCrystalUpgrades = data.archonCrystalUpgrades; window.archonCrystalUpgrades = data.archonCrystalUpgrades;
data.innateDamages = {
InnateElectricityDamage: loc("damageType_Electricity"),
InnateFreezeDamage: loc("damageType_Freeze"),
InnateHeatDamage: loc("damageType_Fire"),
InnateImpactDamage: loc("damageType_Impact"),
InnateMagDamage: loc("damageType_Magnetic"),
InnateRadDamage: loc("damageType_Radiation"),
InnateToxinDamage: loc("damageType_Poison")
};
// Add mods mising in data sources // Add mods mising in data sources
data.mods.push({ data.mods.push({
uniqueName: "/Lotus/Upgrades/Mods/Fusers/LegendaryModFuser", uniqueName: "/Lotus/Upgrades/Mods/Fusers/LegendaryModFuser",
@ -450,6 +462,13 @@ function fetchItemList() {
option.value = name; option.value = name;
document.getElementById("datalist-" + type).appendChild(option); document.getElementById("datalist-" + type).appendChild(option);
}); });
} else if (type == "innateDamages") {
Object.entries(items).forEach(([uniqueName, name]) => {
const option = document.createElement("option");
option.value = uniqueName;
option.textContent = name;
document.getElementById("valenceBonus-innateDamage").appendChild(option);
});
} else if (type == "uniqueLevelCaps") { } else if (type == "uniqueLevelCaps") {
uniqueLevelCaps = items; uniqueLevelCaps = items;
} else if (type == "Syndicates") { } else if (type == "Syndicates") {
@ -659,6 +678,12 @@ function updateInventory() {
} }
} }
if (["Suits", "LongGuns", "Pistols", "Melee", "SpaceGuns", "SpaceMelee"].includes(category)) {
const a = document.createElement("a");
a.href = "/webui/detailedView?productCategory=" + category + "&itemId=" + item.ItemId.$oid;
a.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M278.5 215.6L23 471c-9.4 9.4-9.4 24.6 0 33.9s24.6 9.4 33.9 0l57-57h68c49.7 0 97.9-14.4 139-41c11.1-7.2 5.5-23-7.8-23c-5.1 0-9.2-4.1-9.2-9.2c0-4.1 2.7-7.6 6.5-8.8l81-24.3c2.5-.8 4.8-2.1 6.7-4l22.4-22.4c10.1-10.1 2.9-27.3-11.3-27.3l-32.2 0c-5.1 0-9.2-4.1-9.2-9.2c0-4.1 2.7-7.6 6.5-8.8l112-33.6c4-1.2 7.4-3.9 9.3-7.7C506.4 207.6 512 184.1 512 160c0-41-16.3-80.3-45.3-109.3l-5.5-5.5C432.3 16.3 393 0 352 0s-80.3 16.3-109.3 45.3L139 149C91 197 64 262.1 64 330v55.3L253.6 195.8c6.2-6.2 16.4-6.2 22.6 0c5.4 5.4 6.1 13.6 2.2 19.8z"/></svg>`;
td.appendChild(a);
}
if (item.XP < maxXP || anyExaltedMissingXP) { if (item.XP < maxXP || anyExaltedMissingXP) {
const a = document.createElement("a"); const a = document.createElement("a");
a.href = "#"; a.href = "#";
@ -721,13 +746,6 @@ function updateInventory() {
a.title = loc("code_unmature"); a.title = loc("code_unmature");
a.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path d="M256 64A64 64 0 1 0 128 64a64 64 0 1 0 128 0zM152.9 169.3c-23.7-8.4-44.5-24.3-58.8-45.8L74.6 94.2C64.8 79.5 45 75.6 30.2 85.4s-18.7 29.7-8.9 44.4L40.9 159c18.1 27.1 42.8 48.4 71.1 62.4L112 480c0 17.7 14.3 32 32 32s32-14.3 32-32l0-96 32 0 0 96c0 17.7 14.3 32 32 32s32-14.3 32-32l0-258.4c29.1-14.2 54.4-36.2 72.7-64.2l18.2-27.9c9.6-14.8 5.4-34.6-9.4-44.3s-34.6-5.5-44.3 9.4L291 122.4c-21.8 33.4-58.9 53.6-98.8 53.6c-12.6 0-24.9-2-36.6-5.8c-.9-.3-1.8-.7-2.7-.9z"/></svg>`; a.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path d="M256 64A64 64 0 1 0 128 64a64 64 0 1 0 128 0zM152.9 169.3c-23.7-8.4-44.5-24.3-58.8-45.8L74.6 94.2C64.8 79.5 45 75.6 30.2 85.4s-18.7 29.7-8.9 44.4L40.9 159c18.1 27.1 42.8 48.4 71.1 62.4L112 480c0 17.7 14.3 32 32 32s32-14.3 32-32l0-96 32 0 0 96c0 17.7 14.3 32 32 32s32-14.3 32-32l0-258.4c29.1-14.2 54.4-36.2 72.7-64.2l18.2-27.9c9.6-14.8 5.4-34.6-9.4-44.3s-34.6-5.5-44.3 9.4L291 122.4c-21.8 33.4-58.9 53.6-98.8 53.6c-12.6 0-24.9-2-36.6-5.8c-.9-.3-1.8-.7-2.7-.9z"/></svg>`;
} }
td.appendChild(a);
}
if (category == "Suits") {
const a = document.createElement("a");
a.href = "/webui/powersuit/" + item.ItemId.$oid;
a.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M278.5 215.6L23 471c-9.4 9.4-9.4 24.6 0 33.9s24.6 9.4 33.9 0l57-57h68c49.7 0 97.9-14.4 139-41c11.1-7.2 5.5-23-7.8-23c-5.1 0-9.2-4.1-9.2-9.2c0-4.1 2.7-7.6 6.5-8.8l81-24.3c2.5-.8 4.8-2.1 6.7-4l22.4-22.4c10.1-10.1 2.9-27.3-11.3-27.3l-32.2 0c-5.1 0-9.2-4.1-9.2-9.2c0-4.1 2.7-7.6 6.5-8.8l112-33.6c4-1.2 7.4-3.9 9.3-7.7C506.4 207.6 512 184.1 512 160c0-41-16.3-80.3-45.3-109.3l-5.5-5.5C432.3 16.3 393 0 352 0s-80.3 16.3-109.3 45.3L139 149C91 197 64 262.1 64 330v55.3L253.6 195.8c6.2-6.2 16.4-6.2 22.6 0c5.4 5.4 6.1 13.6 2.2 19.8z"/></svg>`;
td.appendChild(a); td.appendChild(a);
} }
{ {
@ -1126,53 +1144,73 @@ function updateInventory() {
} }
}); });
// Populate powersuit route // Populate detailedView route
if (single.getCurrentPath().substr(0, 17) == "/webui/powersuit/") { if (single.getCurrentPath().substr(0, 19) == "/webui/detailedView") {
const oid = single.getCurrentPath().substr(17); const urlParams = new URLSearchParams(window.location.search);
const item = data.Suits.find(x => x.ItemId.$oid == oid); const oid = urlParams.get("itemId");
const category = urlParams.get("productCategory");
const item = data[category].find(x => x.ItemId.$oid == oid);
if (item) { if (item) {
if (item.ItemName) { if (item.ItemName) {
$("#powersuit-route h3").text(item.ItemName); $("#detailedView-route h3").text(item.ItemName);
$("#powersuit-route .text-body-secondary").text(itemMap[item.ItemType]?.name ?? item.ItemType); $("#detailedView-route .text-body-secondary").text(
itemMap[item.ItemType]?.name ?? item.ItemType
);
} else { } else {
$("#powersuit-route h3").text(itemMap[item.ItemType]?.name ?? item.ItemType); $("#detailedView-route h3").text(itemMap[item.ItemType]?.name ?? item.ItemType);
$("#powersuit-route .text-body-secondary").text(""); $("#detailedView-route .text-body-secondary").text("");
} }
const uniqueUpgrades = {}; if (category == "Suits") {
(item.ArchonCrystalUpgrades ?? []).forEach(upgrade => { document.getElementById("archonShards-card").classList.remove("d-none");
if (upgrade && upgrade.UpgradeType) {
uniqueUpgrades[upgrade.UpgradeType] ??= 0;
uniqueUpgrades[upgrade.UpgradeType] += 1;
}
});
document.getElementById("crystals-list").innerHTML = ""; const uniqueUpgrades = {};
Object.entries(uniqueUpgrades).forEach(([upgradeType, count]) => { (item.ArchonCrystalUpgrades ?? []).forEach(upgrade => {
const tr = document.createElement("tr"); if (upgrade && upgrade.UpgradeType) {
{ uniqueUpgrades[upgrade.UpgradeType] ??= 0;
const td = document.createElement("td"); uniqueUpgrades[upgrade.UpgradeType] += 1;
td.textContent = count + "x " + (archonCrystalUpgrades[upgradeType] ?? upgradeType);
tr.appendChild(td);
}
{
const td = document.createElement("td");
td.classList = "text-end text-nowrap";
{
const a = document.createElement("a");
a.href = "#";
a.onclick = function (event) {
event.preventDefault();
doPopArchonCrystalUpgrade(upgradeType);
};
a.title = loc("code_remove");
a.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M135.2 17.7L128 32H32C14.3 32 0 46.3 0 64S14.3 96 32 96H416c17.7 0 32-14.3 32-32s-14.3-32-32-32H320l-7.2-14.3C307.4 6.8 296.3 0 284.2 0H163.8c-12.1 0-23.2 6.8-28.6 17.7zM416 128H32L53.2 467c1.6 25.3 22.6 45 47.9 45H346.9c25.3 0 46.3-19.7 47.9-45L416 128z"/></svg>`;
td.appendChild(a);
} }
tr.appendChild(td); });
document.getElementById("crystals-list").innerHTML = "";
Object.entries(uniqueUpgrades).forEach(([upgradeType, count]) => {
const tr = document.createElement("tr");
{
const td = document.createElement("td");
td.textContent = count + "x " + (archonCrystalUpgrades[upgradeType] ?? upgradeType);
tr.appendChild(td);
}
{
const td = document.createElement("td");
td.classList = "text-end text-nowrap";
{
const a = document.createElement("a");
a.href = "#";
a.onclick = function (event) {
event.preventDefault();
doPopArchonCrystalUpgrade(upgradeType);
};
a.title = loc("code_remove");
a.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M135.2 17.7L128 32H32C14.3 32 0 46.3 0 64S14.3 96 32 96H416c17.7 0 32-14.3 32-32s-14.3-32-32-32H320l-7.2-14.3C307.4 6.8 296.3 0 284.2 0H163.8c-12.1 0-23.2 6.8-28.6 17.7zM416 128H32L53.2 467c1.6 25.3 22.6 45 47.9 45H346.9c25.3 0 46.3-19.7 47.9-45L416 128z"/></svg>`;
td.appendChild(a);
}
tr.appendChild(td);
}
document.getElementById("crystals-list").appendChild(tr);
});
} else if (["LongGuns", "Pistols", "Melee", "SpaceGuns", "SpaceMelee"].includes(category)) {
document.getElementById("valenceBonus-card").classList.remove("d-none");
document.getElementById("valenceBonus-innateDamage").value = "";
document.getElementById("valenceBonus-procent").value = 25;
if (item.UpgradeFingerprint) {
const buff = JSON.parse(item.UpgradeFingerprint).buffs[0];
const buffValue = fromUpdradeFingerPrintVaule(buff.Value, 0.25);
document.getElementById("valenceBonus-innateDamage").value = buff.Tag ?? "";
document.getElementById("valenceBonus-procent").value = Math.round(buffValue * 1000) / 10;
} }
document.getElementById("crystals-list").appendChild(tr); }
});
} else { } else {
single.loadRoute("/webui/inventory"); single.loadRoute("/webui/inventory");
} }
@ -2110,16 +2148,19 @@ function doAddMissingMaxRankMods() {
}); });
} }
// Powersuit Route // DetailedView Route
single.getRoute("#powersuit-route").on("beforeload", function () { single.getRoute("#detailedView-route").on("beforeload", function () {
this.element.querySelector("h3").textContent = "Loading..."; this.element.querySelector("h3").textContent = "Loading...";
document.getElementById("archonShards-card").classList.add("d-none");
document.getElementById("valenceBonus-card").classList.add("d-none");
if (window.didInitialInventoryUpdate) { if (window.didInitialInventoryUpdate) {
updateInventory(); updateInventory();
} }
}); });
function doPushArchonCrystalUpgrade() { function doPushArchonCrystalUpgrade() {
const urlParams = new URLSearchParams(window.location.search);
const uniqueName = getKey(document.querySelector("[list='datalist-archonCrystalUpgrades']")); const uniqueName = getKey(document.querySelector("[list='datalist-archonCrystalUpgrades']"));
if (!uniqueName) { if (!uniqueName) {
$("[list='datalist-archonCrystalUpgrades']").addClass("is-invalid").focus(); $("[list='datalist-archonCrystalUpgrades']").addClass("is-invalid").focus();
@ -2130,7 +2171,7 @@ function doPushArchonCrystalUpgrade() {
"/custom/pushArchonCrystalUpgrade?" + "/custom/pushArchonCrystalUpgrade?" +
window.authz + window.authz +
"&oid=" + "&oid=" +
single.getCurrentPath().substr(17) + urlParams.get("itemId") +
"&type=" + "&type=" +
uniqueName + uniqueName +
"&count=" + "&count=" +
@ -2143,14 +2184,10 @@ function doPushArchonCrystalUpgrade() {
} }
function doPopArchonCrystalUpgrade(type) { function doPopArchonCrystalUpgrade(type) {
const urlParams = new URLSearchParams(window.location.search);
revalidateAuthz().then(() => { revalidateAuthz().then(() => {
$.get( $.get(
"/custom/popArchonCrystalUpgrade?" + "/custom/popArchonCrystalUpgrade?" + window.authz + "&oid=" + urlParams.get("itemId") + "&type=" + type
window.authz +
"&oid=" +
single.getCurrentPath().substr(17) +
"&type=" +
type
).done(function () { ).done(function () {
updateInventory(); updateInventory();
}); });
@ -2661,3 +2698,43 @@ document.querySelectorAll(".tags-input").forEach(input => {
}; };
input.oninput(); input.oninput();
}); });
function fromUpdradeFingerPrintVaule(raw, min) {
const range = 0.6 - min;
return min + (raw * range) / 0x3fffffff;
}
function toUpdradeFingerPrintVaule(value, min) {
const range = 0.6 - min;
return Math.trunc(((value - min) * 0x3fffffff) / range);
}
function handleValenceBonusChange(event) {
event.preventDefault();
const urlParams = new URLSearchParams(window.location.search);
const action = event.submitter.value;
const Tag = document.getElementById("valenceBonus-innateDamage").value;
const Value = toUpdradeFingerPrintVaule(document.getElementById("valenceBonus-procent").value / 100, 0.25);
revalidateAuthz().then(() => {
$.post({
url: "/custom/updateFingerprint?" + window.authz,
contentType: "application/json",
data: JSON.stringify({
category: urlParams.get("productCategory"),
oid: urlParams.get("itemId"),
action,
upgradeType: "/Lotus/Weapons/Grineer/KuvaLich/Upgrades/InnateDamageRandomMod",
upgradeFingerprint: {
buffs: [
{
Tag,
Value
}
]
}
})
}).done(function () {
updateInventory();
});
});
}

View File

@ -2,7 +2,10 @@
dict = { dict = {
general_inventoryUpdateNote: `[UNTRANSLATED] Note: To see changes in-game, you need to resync your inventory, e.g. using the bootstrapper's /sync command, visiting a dojo/relay, or relogging.`, general_inventoryUpdateNote: `[UNTRANSLATED] Note: To see changes in-game, you need to resync your inventory, e.g. using the bootstrapper's /sync command, visiting a dojo/relay, or relogging.`,
general_addButton: `Hinzufügen`, general_addButton: `Hinzufügen`,
general_setButton: `[UNTRANSLATED] Set`,
general_removeButton: `[UNTRANSLATED] Remove`,
general_bulkActions: `Massenaktionen`, general_bulkActions: `Massenaktionen`,
code_loginFail: `[UNTRANSLATED] Login failed. Double-check the email and password.`, code_loginFail: `[UNTRANSLATED] Login failed. Double-check the email and password.`,
code_regFail: `[UNTRANSLATED] Registration failed. Account already exists?`, code_regFail: `[UNTRANSLATED] Registration failed. Account already exists?`,
code_changeNameConfirm: `In welchen Namen möchtest du deinen Account umbenennen?`, code_changeNameConfirm: `In welchen Namen möchtest du deinen Account umbenennen?`,
@ -112,9 +115,13 @@ dict = {
currency_FusionPoints: `Endo`, currency_FusionPoints: `Endo`,
currency_PrimeTokens: `Reines Aya`, currency_PrimeTokens: `Reines Aya`,
currency_owned: `Du hast |COUNT|.`, currency_owned: `Du hast |COUNT|.`,
powersuit_archonShardsLabel: `Archon-Scherben-Slots`,
powersuit_archonShardsDescription: `Du kannst diese unbegrenzten Slots nutzen, um eine Vielzahl von Verbesserungen anzuwenden.`, detailedView_archonShardsLabel: `Archon-Scherben-Slots`,
powersuit_archonShardsDescription2: `Hinweis: Jede Archon-Scherbe benötigt beim Laden etwas Zeit, um angewendet zu werden.`, detailedView_archonShardsDescription: `Du kannst diese unbegrenzten Slots nutzen, um eine Vielzahl von Verbesserungen anzuwenden.`,
detailedView_archonShardsDescription2: `Hinweis: Jede Archon-Scherbe benötigt beim Laden etwas Zeit, um angewendet zu werden.`,
detailedView_valenceBonusLabel: `Valenz-Bonus`,
detailedView_valenceBonusDescription: `[UNTRANSLATED] You can set or remove the Valence Bonus from your weapon.`,
mods_addRiven: `Riven hinzufügen`, mods_addRiven: `Riven hinzufügen`,
mods_fingerprint: `Fingerabdruck`, mods_fingerprint: `Fingerabdruck`,
mods_fingerprintHelp: `Benötigst du Hilfe mit dem Fingerabdruck?`, mods_fingerprintHelp: `Benötigst du Hilfe mit dem Fingerabdruck?`,
@ -291,6 +298,14 @@ dict = {
upgrade_SwiftExecute: `[UNTRANSLATED] Speed of Mercy Kills increased by 50%`, upgrade_SwiftExecute: `[UNTRANSLATED] Speed of Mercy Kills increased by 50%`,
upgrade_OnHackInvis: `[UNTRANSLATED] Invisible for 15 seconds after hacking`, upgrade_OnHackInvis: `[UNTRANSLATED] Invisible for 15 seconds after hacking`,
damageType_Electricity: `Elektrizität`,
damageType_Fire: `Hitze`,
damageType_Freeze: `Kälte`,
damageType_Impact: `Einschlag`,
damageType_Magnetic: `Magnetismus`,
damageType_Poison: `Gift`,
damageType_Radiation: `Strahlung`,
theme_dark: `[UNTRANSLATED] Dark Theme`, theme_dark: `[UNTRANSLATED] Dark Theme`,
theme_light: `[UNTRANSLATED] Light Theme`, theme_light: `[UNTRANSLATED] Light Theme`,

View File

@ -1,7 +1,10 @@
dict = { dict = {
general_inventoryUpdateNote: `Note: To see changes in-game, you need to resync your inventory, e.g. using the bootstrapper's /sync command, visiting a dojo/relay, or relogging.`, general_inventoryUpdateNote: `Note: To see changes in-game, you need to resync your inventory, e.g. using the bootstrapper's /sync command, visiting a dojo/relay, or relogging.`,
general_addButton: `Add`, general_addButton: `Add`,
general_setButton: `Set`,
general_removeButton: `Remove`,
general_bulkActions: `Bulk Actions`, general_bulkActions: `Bulk Actions`,
code_loginFail: `Login failed. Double-check the email and password.`, code_loginFail: `Login failed. Double-check the email and password.`,
code_regFail: `Registration failed. Account already exists?`, code_regFail: `Registration failed. Account already exists?`,
code_changeNameConfirm: `What would you like to change your account name to?`, code_changeNameConfirm: `What would you like to change your account name to?`,
@ -111,9 +114,13 @@ dict = {
currency_FusionPoints: `Endo`, currency_FusionPoints: `Endo`,
currency_PrimeTokens: `Regal Aya`, currency_PrimeTokens: `Regal Aya`,
currency_owned: `You have |COUNT|.`, currency_owned: `You have |COUNT|.`,
powersuit_archonShardsLabel: `Archon Shard Slots`,
powersuit_archonShardsDescription: `You can use these unlimited slots to apply a wide range of upgrades.`, detailedView_archonShardsLabel: `Archon Shard Slots`,
powersuit_archonShardsDescription2: `Note that each archon shard takes some time to be applied when loading in.`, detailedView_archonShardsDescription: `You can use these unlimited slots to apply a wide range of upgrades.`,
detailedView_archonShardsDescription2: `Note that each archon shard takes some time to be applied when loading in.`,
detailedView_valenceBonusLabel: `Valence Bonus`,
detailedView_valenceBonusDescription: `You can set or remove the Valence Bonus from your weapon.`,
mods_addRiven: `Add Riven`, mods_addRiven: `Add Riven`,
mods_fingerprint: `Fingerprint`, mods_fingerprint: `Fingerprint`,
mods_fingerprintHelp: `Need help with the fingerprint?`, mods_fingerprintHelp: `Need help with the fingerprint?`,
@ -290,6 +297,14 @@ dict = {
upgrade_SwiftExecute: `Speed of Mercy Kills increased by 50%`, upgrade_SwiftExecute: `Speed of Mercy Kills increased by 50%`,
upgrade_OnHackInvis: `Invisible for 15 seconds after hacking`, upgrade_OnHackInvis: `Invisible for 15 seconds after hacking`,
damageType_Electricity: `Electricity`,
damageType_Fire: `Heat`,
damageType_Freeze: `Cold`,
damageType_Impact: `Impact`,
damageType_Magnetic: `Magnetic`,
damageType_Poison: `Toxin`,
damageType_Radiation: `Radiation`,
theme_dark: `Dark Theme`, theme_dark: `Dark Theme`,
theme_light: `Light Theme`, theme_light: `Light Theme`,

View File

@ -2,7 +2,10 @@
dict = { dict = {
general_inventoryUpdateNote: `Para ver los cambios en el juego, necesitas volver a sincronizar tu inventario, por ejemplo, usando el comando /sync del bootstrapper, visitando un dojo o repetidor, o volviendo a iniciar sesión.`, general_inventoryUpdateNote: `Para ver los cambios en el juego, necesitas volver a sincronizar tu inventario, por ejemplo, usando el comando /sync del bootstrapper, visitando un dojo o repetidor, o volviendo a iniciar sesión.`,
general_addButton: `Agregar`, general_addButton: `Agregar`,
general_setButton: `[UNTRANSLATED] Set`,
general_removeButton: `[UNTRANSLATED] Remove`,
general_bulkActions: `Acciones masivas`, general_bulkActions: `Acciones masivas`,
code_loginFail: `Error al iniciar sesión. Verifica el correo electrónico y la contraseña.`, code_loginFail: `Error al iniciar sesión. Verifica el correo electrónico y la contraseña.`,
code_regFail: `Error al registrar la cuenta. ¿Ya existe una cuenta con este correo?`, code_regFail: `Error al registrar la cuenta. ¿Ya existe una cuenta con este correo?`,
code_changeNameConfirm: `¿Qué nombre te gustaría ponerle a tu cuenta?`, code_changeNameConfirm: `¿Qué nombre te gustaría ponerle a tu cuenta?`,
@ -112,9 +115,13 @@ dict = {
currency_FusionPoints: `Endo`, currency_FusionPoints: `Endo`,
currency_PrimeTokens: `Aya Real`, currency_PrimeTokens: `Aya Real`,
currency_owned: `Tienes |COUNT|.`, currency_owned: `Tienes |COUNT|.`,
powersuit_archonShardsLabel: `Ranuras de Fragmento de Archón`,
powersuit_archonShardsDescription: `Puedes usar estas ranuras ilimitadas para aplicar una amplia variedad de mejoras`, detailedView_archonShardsLabel: `Ranuras de Fragmento de Archón`,
powersuit_archonShardsDescription2: `Ten en cuenta que cada fragmento de archón tarda un poco en aplicarse al cargar`, detailedView_archonShardsDescription: `Puedes usar estas ranuras ilimitadas para aplicar una amplia variedad de mejoras`,
detailedView_archonShardsDescription2: `Ten en cuenta que cada fragmento de archón tarda un poco en aplicarse al cargar`,
detailedView_valenceBonusLabel: `Bônus de Valência`,
detailedView_valenceBonusDescription: `[UNTRANSLATED] You can set or remove the Valence Bonus from your weapon.`,
mods_addRiven: `Agregar Agrietado`, mods_addRiven: `Agregar Agrietado`,
mods_fingerprint: `Huella digital`, mods_fingerprint: `Huella digital`,
mods_fingerprintHelp: `¿Necesitas ayuda con la huella digital?`, mods_fingerprintHelp: `¿Necesitas ayuda con la huella digital?`,
@ -291,6 +298,14 @@ dict = {
upgrade_SwiftExecute: `Velocidad de ejecuciones aumentada en un 50%`, upgrade_SwiftExecute: `Velocidad de ejecuciones aumentada en un 50%`,
upgrade_OnHackInvis: `Invisible durante 15 segundos después de hackear`, upgrade_OnHackInvis: `Invisible durante 15 segundos después de hackear`,
damageType_Electricity: `Eletricidade`,
damageType_Fire: `Ígneo`,
damageType_Freeze: `Glacial`,
damageType_Impact: `Colisivo`,
damageType_Magnetic: `Magnético`,
damageType_Poison: `Tóxico`,
damageType_Radiation: `Radioativo`,
theme_dark: `[UNTRANSLATED] Dark Theme`, theme_dark: `[UNTRANSLATED] Dark Theme`,
theme_light: `[UNTRANSLATED] Light Theme`, theme_light: `[UNTRANSLATED] Light Theme`,

View File

@ -2,7 +2,10 @@
dict = { dict = {
general_inventoryUpdateNote: `[UNTRANSLATED] Note: To see changes in-game, you need to resync your inventory, e.g. using the bootstrapper's /sync command, visiting a dojo/relay, or relogging.`, general_inventoryUpdateNote: `[UNTRANSLATED] Note: To see changes in-game, you need to resync your inventory, e.g. using the bootstrapper's /sync command, visiting a dojo/relay, or relogging.`,
general_addButton: `Ajouter`, general_addButton: `Ajouter`,
general_setButton: `[UNTRANSLATED] Set`,
general_removeButton: `[UNTRANSLATED] Remove`,
general_bulkActions: `Action groupée`, general_bulkActions: `Action groupée`,
code_loginFail: `Connexion échouée. Vérifiez le mot de passe.`, code_loginFail: `Connexion échouée. Vérifiez le mot de passe.`,
code_regFail: `Enregistrement impossible. Compte existant?`, code_regFail: `Enregistrement impossible. Compte existant?`,
code_changeNameConfirm: `Nouveau nom du compte :`, code_changeNameConfirm: `Nouveau nom du compte :`,
@ -112,9 +115,13 @@ dict = {
currency_FusionPoints: `Endo`, currency_FusionPoints: `Endo`,
currency_PrimeTokens: `Aya Raffiné`, currency_PrimeTokens: `Aya Raffiné`,
currency_owned: `|COUNT| possédés.`, currency_owned: `|COUNT| possédés.`,
powersuit_archonShardsLabel: `Emplacements de fragments d'Archonte`,
powersuit_archonShardsDescription: `Slots illimités pour appliquer plusieurs améliorations`, detailedView_archonShardsLabel: `Emplacements de fragments d'Archonte`,
powersuit_archonShardsDescription2: `Un délai sera présent entre l'application des éclats et le chargement en jeu.`, detailedView_archonShardsDescription: `Slots illimités pour appliquer plusieurs améliorations`,
detailedView_archonShardsDescription2: `Un délai sera présent entre l'application des éclats et le chargement en jeu.`,
detailedView_valenceBonusLabel: `Bonus de Valence`,
detailedView_valenceBonusDescription: `[UNTRANSLATED] You can set or remove the Valence Bonus from your weapon.`,
mods_addRiven: `Ajouter un riven`, mods_addRiven: `Ajouter un riven`,
mods_fingerprint: `Empreinte`, mods_fingerprint: `Empreinte`,
mods_fingerprintHelp: `Besoin d'aide pour l'empreinte ?`, mods_fingerprintHelp: `Besoin d'aide pour l'empreinte ?`,
@ -294,5 +301,13 @@ dict = {
theme_dark: `[UNTRANSLATED] Dark Theme`, theme_dark: `[UNTRANSLATED] Dark Theme`,
theme_light: `[UNTRANSLATED] Light Theme`, theme_light: `[UNTRANSLATED] Light Theme`,
damageType_Electricity: `Électrique`,
damageType_Fire: `Feu`,
damageType_Freeze: `Glace`,
damageType_Impact: `Impact`,
damageType_Magnetic: `Magnétique`,
damageType_Poison: `Poison`,
damageType_Radiation: `Radiations`,
prettier_sucks_ass: `` prettier_sucks_ass: ``
}; };

View File

@ -2,7 +2,10 @@
dict = { dict = {
general_inventoryUpdateNote: `[UNTRANSLATED] Note: To see changes in-game, you need to resync your inventory, e.g. using the bootstrapper's /sync command, visiting a dojo/relay, or relogging.`, general_inventoryUpdateNote: `[UNTRANSLATED] Note: To see changes in-game, you need to resync your inventory, e.g. using the bootstrapper's /sync command, visiting a dojo/relay, or relogging.`,
general_addButton: `Добавить`, general_addButton: `Добавить`,
general_setButton: `Установить`,
general_removeButton: `Удалить`,
general_bulkActions: `Массовые действия`, general_bulkActions: `Массовые действия`,
code_loginFail: `[UNTRANSLATED] Login failed. Double-check the email and password.`, code_loginFail: `[UNTRANSLATED] Login failed. Double-check the email and password.`,
code_regFail: `[UNTRANSLATED] Registration failed. Account already exists?`, code_regFail: `[UNTRANSLATED] Registration failed. Account already exists?`,
code_changeNameConfirm: `Какое имя вы хотите установить для своей учетной записи?`, code_changeNameConfirm: `Какое имя вы хотите установить для своей учетной записи?`,
@ -112,9 +115,13 @@ dict = {
currency_FusionPoints: `Эндо`, currency_FusionPoints: `Эндо`,
currency_PrimeTokens: `Королевские Айя`, currency_PrimeTokens: `Королевские Айя`,
currency_owned: `У тебя |COUNT|.`, currency_owned: `У тебя |COUNT|.`,
powersuit_archonShardsLabel: `Ячейки осколков архонта`,
powersuit_archonShardsDescription: `Вы можете использовать эти неограниченные ячейки для установки множества улучшений.`, detailedView_archonShardsLabel: `Ячейки осколков архонта`,
powersuit_archonShardsDescription2: `Обратите внимание: каждый фрагмент архонта применяется с задержкой при загрузке.`, detailedView_archonShardsDescription: `Вы можете использовать эти неограниченные ячейки для установки множества улучшений.`,
detailedView_archonShardsDescription2: `Обратите внимание: каждый фрагмент архонта применяется с задержкой при загрузке.`,
detailedView_valenceBonusLabel: `Бонус Валентности`,
detailedView_valenceBonusDescription: `Вы можете установить или убрать бонус валентности с вашего оружия.`,
mods_addRiven: `Добавить Мод Разлома`, mods_addRiven: `Добавить Мод Разлома`,
mods_fingerprint: `Отпечаток`, mods_fingerprint: `Отпечаток`,
mods_fingerprintHelp: `Нужна помощь с отпечатком?`, mods_fingerprintHelp: `Нужна помощь с отпечатком?`,
@ -291,6 +298,14 @@ dict = {
upgrade_SwiftExecute: `[UNTRANSLATED] Speed of Mercy Kills increased by 50%`, upgrade_SwiftExecute: `[UNTRANSLATED] Speed of Mercy Kills increased by 50%`,
upgrade_OnHackInvis: `[UNTRANSLATED] Invisible for 15 seconds after hacking`, upgrade_OnHackInvis: `[UNTRANSLATED] Invisible for 15 seconds after hacking`,
damageType_Electricity: `Электричество`,
damageType_Fire: `Огонь`,
damageType_Freeze: `Холод`,
damageType_Impact: `Удар`,
damageType_Magnetic: `Магнит`,
damageType_Poison: `Токсин`,
damageType_Radiation: `Радиация`,
theme_dark: `[UNTRANSLATED] Dark Theme`, theme_dark: `[UNTRANSLATED] Dark Theme`,
theme_light: `[UNTRANSLATED] Light Theme`, theme_light: `[UNTRANSLATED] Light Theme`,

View File

@ -2,7 +2,10 @@
dict = { dict = {
general_inventoryUpdateNote: `注意:要在游戏中查看更改,您需要重新同步库存,例如使用引导程序的 /sync 命令、访问道场 / 中继站或重新登录`, general_inventoryUpdateNote: `注意:要在游戏中查看更改,您需要重新同步库存,例如使用引导程序的 /sync 命令、访问道场 / 中继站或重新登录`,
general_addButton: `添加`, general_addButton: `添加`,
general_setButton: `[UNTRANSLATED] Set`,
general_removeButton: `[UNTRANSLATED] Remove`,
general_bulkActions: `批量操作`, general_bulkActions: `批量操作`,
code_loginFail: `登录失败。请检查邮箱和密码。`, code_loginFail: `登录失败。请检查邮箱和密码。`,
code_regFail: `注册失败。账号已存在。`, code_regFail: `注册失败。账号已存在。`,
code_changeNameConfirm: `您想将账户名称更改为什么?`, code_changeNameConfirm: `您想将账户名称更改为什么?`,
@ -112,9 +115,13 @@ dict = {
currency_FusionPoints: `内融核心`, currency_FusionPoints: `内融核心`,
currency_PrimeTokens: `御品阿耶`, currency_PrimeTokens: `御品阿耶`,
currency_owned: `当前拥有 |COUNT|。`, currency_owned: `当前拥有 |COUNT|。`,
powersuit_archonShardsLabel: `执刑官源力石槽位`,
powersuit_archonShardsDescription: `您可以使用这些无限插槽应用各种强化效果`, detailedView_archonShardsLabel: `执刑官源力石槽位`,
powersuit_archonShardsDescription2: `请注意, 在加载时, 每个执政官源力石都需要一定的时间来生效。`, detailedView_archonShardsDescription: `您可以使用这些无限插槽应用各种强化效果`,
detailedView_archonShardsDescription2: `请注意, 在加载时, 每个执政官源力石都需要一定的时间来生效。`,
detailedView_valenceBonusLabel: `效价加成`,
detailedView_valenceBonusDescription: `[UNTRANSLATED] You can set or remove the Valence Bonus from your weapon.`,
mods_addRiven: `添加裂罅MOD`, mods_addRiven: `添加裂罅MOD`,
mods_fingerprint: `印记`, mods_fingerprint: `印记`,
mods_fingerprintHelp: `需要印记相关的帮助?`, mods_fingerprintHelp: `需要印记相关的帮助?`,
@ -291,6 +298,14 @@ dict = {
upgrade_SwiftExecute: `怜悯之击速度提升50%`, upgrade_SwiftExecute: `怜悯之击速度提升50%`,
upgrade_OnHackInvis: `入侵后隐身15秒`, upgrade_OnHackInvis: `入侵后隐身15秒`,
damageType_Electricity: `电击`,
damageType_Fire: `火焰`,
damageType_Freeze: `冰冻`,
damageType_Impact: `冲击`,
damageType_Magnetic: `磁力`,
damageType_Poison: `毒素`,
damageType_Radiation: `辐射`,
theme_dark: `[UNTRANSLATED] Dark Theme`, theme_dark: `[UNTRANSLATED] Dark Theme`,
theme_light: `[UNTRANSLATED] Light Theme`, theme_light: `[UNTRANSLATED] Light Theme`,