From ac1928e02e75929cb65728f45bcfcb20989c7d34 Mon Sep 17 00:00:00 2001 From: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Date: Sat, 28 Jun 2025 23:46:41 +0200 Subject: [PATCH] feat(webui): Valence Bonus Closes #1181 --- .../custom/updateFingerprintController.ts | 41 ++++ src/routes/custom.ts | 2 + src/routes/webui.ts | 2 +- static/webui/index.html | 22 ++- static/webui/script.js | 185 ++++++++++++------ static/webui/translations/de.js | 21 +- static/webui/translations/en.js | 21 +- static/webui/translations/es.js | 21 +- static/webui/translations/fr.js | 21 +- static/webui/translations/ru.js | 21 +- static/webui/translations/zh.js | 21 +- 11 files changed, 299 insertions(+), 79 deletions(-) create mode 100644 src/controllers/custom/updateFingerprintController.ts diff --git a/src/controllers/custom/updateFingerprintController.ts b/src/controllers/custom/updateFingerprintController.ts new file mode 100644 index 00000000..84e70dd5 --- /dev/null +++ b/src/controllers/custom/updateFingerprintController.ts @@ -0,0 +1,41 @@ +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); + if (inventory) { + 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; + }[]; + }; +} diff --git a/src/routes/custom.ts b/src/routes/custom.ts index e10bc721..99536459 100644 --- a/src/routes/custom.ts +++ b/src/routes/custom.ts @@ -24,6 +24,7 @@ import { importController } from "@/src/controllers/custom/importController"; import { manageQuestsController } from "@/src/controllers/custom/manageQuestsController"; import { setEvolutionProgressController } from "@/src/controllers/custom/setEvolutionProgressController"; import { setBoosterController } from "@/src/controllers/custom/setBoosterController"; +import { updateFingerprintController } from "@/src/controllers/custom/updateFingerprintController"; import { getConfigController, setConfigController } from "@/src/controllers/custom/configController"; @@ -53,6 +54,7 @@ customRouter.post("/import", importController); customRouter.post("/manageQuests", manageQuestsController); customRouter.post("/setEvolutionProgress", setEvolutionProgressController); customRouter.post("/setBooster", setBoosterController); +customRouter.post("/updateFingerprint", updateFingerprintController); customRouter.post("/getConfig", getConfigController); customRouter.post("/setConfig", setConfigController); diff --git a/src/routes/webui.ts b/src/routes/webui.ts index 535d68b1..1e19c276 100644 --- a/src/routes/webui.ts +++ b/src/routes/webui.ts @@ -24,7 +24,7 @@ webuiRouter.use("/webui", (req, res, next) => { webuiRouter.get("/webui/inventory", (_req, res) => { 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")); }); webuiRouter.get("/webui/mods", (_req, res) => { diff --git a/static/webui/index.html b/static/webui/index.html index 425269b6..b68a75c9 100644 --- a/static/webui/index.html +++ b/static/webui/index.html @@ -455,15 +455,15 @@ -
+

-
-
+ +

diff --git a/static/webui/script.js b/static/webui/script.js index e6ba4989..d1c84085 100644 --- a/static/webui/script.js +++ b/static/webui/script.js @@ -230,6 +230,8 @@ function setLanguage(lang) { } } +const urlParams = new URLSearchParams(window.location.search); + const webUiModularWeapons = [ "/Lotus/Weapons/Sentients/OperatorAmplifiers/OperatorAmpWeapon", "/Lotus/Weapons/Ostron/Melee/LotusModularWeapon", @@ -272,6 +274,8 @@ function fetchItemList() { document.getElementById("changeSyndicate").innerHTML = ""; document.getElementById("changeSyndicate").appendChild(syndicateNone); + document.getElementById("valenceBonus-innateDamage").innerHTML = ""; + // prettier-ignore data.archonCrystalUpgrades = { "/Lotus/Upgrades/Invigorations/ArchonCrystalUpgrades/ArchonCrystalUpgradeEquilibrium": loc("upgrade_Equilibrium").split("|VAL|").join("20"), @@ -354,6 +358,16 @@ function fetchItemList() { }; 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 data.mods.push({ uniqueName: "/Lotus/Upgrades/Mods/Fusers/LegendaryModFuser", @@ -438,6 +452,13 @@ function fetchItemList() { option.value = name; 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") { uniqueLevelCaps = items; } else if (type == "Syndicates") { @@ -647,6 +668,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 = ``; + td.appendChild(a); + } if (item.XP < maxXP || anyExaltedMissingXP) { const a = document.createElement("a"); a.href = "#"; @@ -709,13 +736,6 @@ function updateInventory() { a.title = loc("code_unmature"); a.innerHTML = ``; } - - td.appendChild(a); - } - if (category == "Suits") { - const a = document.createElement("a"); - a.href = "/webui/powersuit/" + item.ItemId.$oid; - a.innerHTML = ``; td.appendChild(a); } { @@ -1114,53 +1134,72 @@ function updateInventory() { } }); - // Populate powersuit route - if (single.getCurrentPath().substr(0, 17) == "/webui/powersuit/") { - const oid = single.getCurrentPath().substr(17); - const item = data.Suits.find(x => x.ItemId.$oid == oid); + // Populate detailedView route + if (single.getCurrentPath().substr(0, 19) == "/webui/detailedView") { + const oid = urlParams.get("itemId"); + const category = urlParams.get("productCategory"); + const item = data[category].find(x => x.ItemId.$oid == oid); + if (item) { if (item.ItemName) { - $("#powersuit-route h3").text(item.ItemName); - $("#powersuit-route .text-body-secondary").text(itemMap[item.ItemType]?.name ?? item.ItemType); + $("#detailedView-route h3").text(item.ItemName); + $("#detailedView-route .text-body-secondary").text( + itemMap[item.ItemType]?.name ?? item.ItemType + ); } else { - $("#powersuit-route h3").text(itemMap[item.ItemType]?.name ?? item.ItemType); - $("#powersuit-route .text-body-secondary").text(""); + $("#detailedView-route h3").text(itemMap[item.ItemType]?.name ?? item.ItemType); + $("#detailedView-route .text-body-secondary").text(""); } - const uniqueUpgrades = {}; - (item.ArchonCrystalUpgrades ?? []).forEach(upgrade => { - if (upgrade && upgrade.UpgradeType) { - uniqueUpgrades[upgrade.UpgradeType] ??= 0; - uniqueUpgrades[upgrade.UpgradeType] += 1; - } - }); + if (category == "Suits") { + document.getElementById("archonShards-card").style.display = ""; - 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 = ``; - td.appendChild(a); + const uniqueUpgrades = {}; + (item.ArchonCrystalUpgrades ?? []).forEach(upgrade => { + if (upgrade && upgrade.UpgradeType) { + uniqueUpgrades[upgrade.UpgradeType] ??= 0; + uniqueUpgrades[upgrade.UpgradeType] += 1; } - 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 = ``; + 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").style.display = ""; + 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 { single.loadRoute("/webui/inventory"); } @@ -2090,10 +2129,12 @@ 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..."; + document.getElementById("archonShards-card").style.display = "none"; + document.getElementById("valenceBonus-card").style.display = "none"; if (window.didInitialInventoryUpdate) { updateInventory(); } @@ -2110,7 +2151,7 @@ function doPushArchonCrystalUpgrade() { "/custom/pushArchonCrystalUpgrade?" + window.authz + "&oid=" + - single.getCurrentPath().substr(17) + + urlParams.get("itemId") + "&type=" + uniqueName + "&count=" + @@ -2125,12 +2166,7 @@ function doPushArchonCrystalUpgrade() { function doPopArchonCrystalUpgrade(type) { revalidateAuthz().then(() => { $.get( - "/custom/popArchonCrystalUpgrade?" + - window.authz + - "&oid=" + - single.getCurrentPath().substr(17) + - "&type=" + - type + "/custom/popArchonCrystalUpgrade?" + window.authz + "&oid=" + urlParams.get("itemId") + "&type=" + type ).done(function () { updateInventory(); }); @@ -2641,3 +2677,42 @@ document.querySelectorAll(".tags-input").forEach(input => { }; 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 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(); + }); + }); +} diff --git a/static/webui/translations/de.js b/static/webui/translations/de.js index 6da6847d..a5a71291 100644 --- a/static/webui/translations/de.js +++ b/static/webui/translations/de.js @@ -2,7 +2,10 @@ dict = { general_inventoryUpdateNote: `Hinweis: Änderungen, die hier vorgenommen werden, werden erst im Spiel angewendet, sobald das Inventar synchronisiert wird. Die Sternenkarte zu besuchen, sollte der einfachste Weg sein, dies auszulösen.`, general_addButton: `Hinzufügen`, + general_setButton: `[UNTRANSLATED] Set`, + general_removeButton: `[UNTRANSLATED] Remove`, general_bulkActions: `Massenaktionen`, + code_loginFail: `[UNTRANSLATED] Login failed. Double-check the email and password.`, code_regFail: `[UNTRANSLATED] Registration failed. Account already exists?`, code_changeNameConfirm: `In welchen Namen möchtest du deinen Account umbenennen?`, @@ -112,9 +115,13 @@ dict = { currency_FusionPoints: `Endo`, currency_PrimeTokens: `Reines Aya`, currency_owned: `Du hast |COUNT|.`, - powersuit_archonShardsLabel: `Archon-Scherben-Slots`, - powersuit_archonShardsDescription: `Du kannst diese unbegrenzten Slots nutzen, um eine Vielzahl von Verbesserungen anzuwenden.`, - powersuit_archonShardsDescription2: `Hinweis: Jede Archon-Scherbe benötigt beim Laden etwas Zeit, um angewendet zu werden.`, + + detailedView_archonShardsLabel: `Archon-Scherben-Slots`, + 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 add or remove the Valence Bonus from your weapon.`, + mods_addRiven: `Riven hinzufügen`, mods_fingerprint: `Fingerabdruck`, mods_fingerprintHelp: `Benötigst du Hilfe mit dem Fingerabdruck?`, @@ -288,5 +295,13 @@ dict = { upgrade_SwiftExecute: `[UNTRANSLATED] Speed of Mercy Kills increased by 50%`, 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`, + prettier_sucks_ass: `` }; diff --git a/static/webui/translations/en.js b/static/webui/translations/en.js index 31631cde..84bf1b2a 100644 --- a/static/webui/translations/en.js +++ b/static/webui/translations/en.js @@ -1,7 +1,10 @@ dict = { general_inventoryUpdateNote: `Note: Changes made here will only be applied in-game when the game syncs the inventory. Visiting the navigation should be the easiest way to trigger that.`, general_addButton: `Add`, + general_setButton: `Set`, + general_removeButton: `Remove`, general_bulkActions: `Bulk Actions`, + code_loginFail: `Login failed. Double-check the email and password.`, code_regFail: `Registration failed. Account already exists?`, code_changeNameConfirm: `What would you like to change your account name to?`, @@ -111,9 +114,13 @@ dict = { currency_FusionPoints: `Endo`, currency_PrimeTokens: `Regal Aya`, 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.`, - powersuit_archonShardsDescription2: `Note that each archon shard takes some time to be applied when loading in.`, + + detailedView_archonShardsLabel: `Archon Shard Slots`, + 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 add or remove the Valence Bonus from your weapon.`, + mods_addRiven: `Add Riven`, mods_fingerprint: `Fingerprint`, mods_fingerprintHelp: `Need help with the fingerprint?`, @@ -287,5 +294,13 @@ dict = { upgrade_SwiftExecute: `Speed of Mercy Kills increased by 50%`, 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`, + prettier_sucks_ass: `` }; diff --git a/static/webui/translations/es.js b/static/webui/translations/es.js index 85a4e0ad..a85d396c 100644 --- a/static/webui/translations/es.js +++ b/static/webui/translations/es.js @@ -2,7 +2,10 @@ dict = { general_inventoryUpdateNote: `Nota: Los cambios realizados aquí se reflejarán en el juego cuando este sincronice el inventario. Usar la navegación debería ser la forma más sencilla de activar esto.`, general_addButton: `Agregar`, + general_setButton: `[UNTRANSLATED] Set`, + general_removeButton: `[UNTRANSLATED] Remove`, general_bulkActions: `Acciones masivas`, + 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_changeNameConfirm: `¿Qué nombre te gustaría ponerle a tu cuenta?`, @@ -112,9 +115,13 @@ dict = { currency_FusionPoints: `Endo`, currency_PrimeTokens: `Aya Real`, 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`, - powersuit_archonShardsDescription2: `Ten en cuenta que cada fragmento de archón tarda un poco en aplicarse al cargar`, + + detailedView_archonShardsLabel: `Ranuras de Fragmento de Archón`, + 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 add or remove the Valence Bonus from your weapon.`, + mods_addRiven: `Agregar Agrietado`, mods_fingerprint: `Huella digital`, mods_fingerprintHelp: `¿Necesitas ayuda con la huella digital?`, @@ -288,5 +295,13 @@ dict = { upgrade_SwiftExecute: `Velocidad de ejecuciones aumentada en un 50%`, 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`, + prettier_sucks_ass: `` }; diff --git a/static/webui/translations/fr.js b/static/webui/translations/fr.js index 000a9387..4a5e24fa 100644 --- a/static/webui/translations/fr.js +++ b/static/webui/translations/fr.js @@ -2,7 +2,10 @@ dict = { general_inventoryUpdateNote: `Note : Les changements effectués ici seront appliqués lors de la syncrhonisation. Visiter la navigation appliquera les changements apportés à l'inventaire.`, general_addButton: `Ajouter`, + general_setButton: `[UNTRANSLATED] Set`, + general_removeButton: `[UNTRANSLATED] Remove`, general_bulkActions: `Action groupée`, + code_loginFail: `Connexion échouée. Vérifiez le mot de passe.`, code_regFail: `Enregistrement impossible. Compte existant?`, code_changeNameConfirm: `Nouveau nom du compte :`, @@ -112,9 +115,13 @@ dict = { currency_FusionPoints: `Endo`, currency_PrimeTokens: `Aya Raffiné`, currency_owned: `|COUNT| possédés.`, - powersuit_archonShardsLabel: `Emplacements de fragments d'Archonte`, - powersuit_archonShardsDescription: `Slots illimités pour appliquer plusieurs améliorations`, - powersuit_archonShardsDescription2: `Un délai sera présent entre l'application des éclats et le chargement en jeu.`, + + detailedView_archonShardsLabel: `Emplacements de fragments d'Archonte`, + 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 add or remove the Valence Bonus from your weapon.`, + mods_addRiven: `Ajouter un riven`, mods_fingerprint: `Empreinte`, mods_fingerprintHelp: `Besoin d'aide pour l'empreinte ?`, @@ -288,5 +295,13 @@ dict = { upgrade_SwiftExecute: `Vitesse des miséricordes augmentée de 50%`, upgrade_OnHackInvis: `Invisible pendant 15 secondes après un piratage`, + 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: `` }; diff --git a/static/webui/translations/ru.js b/static/webui/translations/ru.js index ba727562..fb5b4327 100644 --- a/static/webui/translations/ru.js +++ b/static/webui/translations/ru.js @@ -2,7 +2,10 @@ dict = { general_inventoryUpdateNote: `Примечание: изменения, внесенные здесь, отобразятся в игре только после повторной загрузки вашего инвентаря. Посещение навигации — самый простой способ этого добиться.`, general_addButton: `Добавить`, + general_setButton: `Установить`, + general_removeButton: `Удалить`, general_bulkActions: `Массовые действия`, + code_loginFail: `[UNTRANSLATED] Login failed. Double-check the email and password.`, code_regFail: `[UNTRANSLATED] Registration failed. Account already exists?`, code_changeNameConfirm: `Какое имя вы хотите установить для своей учетной записи?`, @@ -112,9 +115,13 @@ dict = { currency_FusionPoints: `Эндо`, currency_PrimeTokens: `Королевские Айя`, currency_owned: `У тебя |COUNT|.`, - powersuit_archonShardsLabel: `Ячейки осколков архонта`, - powersuit_archonShardsDescription: `Вы можете использовать эти неограниченные ячейки для установки множества улучшений.`, - powersuit_archonShardsDescription2: `Обратите внимание: каждый фрагмент архонта применяется с задержкой при загрузке.`, + + detailedView_archonShardsLabel: `Ячейки осколков архонта`, + detailedView_archonShardsDescription: `Вы можете использовать эти неограниченные ячейки для установки множества улучшений.`, + detailedView_archonShardsDescription2: `Обратите внимание: каждый фрагмент архонта применяется с задержкой при загрузке.`, + detailedView_valenceBonusLabel: `Бонус Валентности`, + detailedView_valenceBonusDescription: `Вы можете добавить или убрать бонус валентности с вашего оружия.`, + mods_addRiven: `Добавить Мод Разлома`, mods_fingerprint: `Отпечаток`, mods_fingerprintHelp: `Нужна помощь с отпечатком?`, @@ -288,5 +295,13 @@ dict = { upgrade_SwiftExecute: `[UNTRANSLATED] Speed of Mercy Kills increased by 50%`, upgrade_OnHackInvis: `[UNTRANSLATED] Invisible for 15 seconds after hacking`, + damageType_Electricity: `Электричество`, + damageType_Fire: `Огонь`, + damageType_Freeze: `Холод`, + damageType_Impact: `Удар`, + damageType_Magnetic: `Магнит`, + damageType_Poison: `Токсин`, + damageType_Radiation: `Радиация`, + prettier_sucks_ass: `` }; diff --git a/static/webui/translations/zh.js b/static/webui/translations/zh.js index 9a37d110..37e8e02a 100644 --- a/static/webui/translations/zh.js +++ b/static/webui/translations/zh.js @@ -2,7 +2,10 @@ dict = { general_inventoryUpdateNote: `注意:此处所做的更改只有在游戏同步仓库后才会生效。您可以通过访问星图来触发仓库更新。`, general_addButton: `添加`, + general_setButton: `[UNTRANSLATED] Set`, + general_removeButton: `[UNTRANSLATED] Remove`, general_bulkActions: `批量操作`, + code_loginFail: `登录失败。请检查邮箱和密码。`, code_regFail: `注册失败。账号已存在。`, code_changeNameConfirm: `您想将账户名称更改为什么?`, @@ -112,9 +115,13 @@ dict = { currency_FusionPoints: `内融核心`, currency_PrimeTokens: `御品阿耶`, currency_owned: `当前拥有 |COUNT|。`, - powersuit_archonShardsLabel: `执刑官源力石槽位`, - powersuit_archonShardsDescription: `您可以使用这些无限插槽应用各种强化效果`, - powersuit_archonShardsDescription2: `请注意, 在加载时, 每个执政官源力石都需要一定的时间来生效。`, + + detailedView_archonShardsLabel: `执刑官源力石槽位`, + detailedView_archonShardsDescription: `您可以使用这些无限插槽应用各种强化效果`, + detailedView_archonShardsDescription2: `请注意, 在加载时, 每个执政官源力石都需要一定的时间来生效。`, + detailedView_valenceBonusLabel: `效价加成`, + detailedView_valenceBonusDescription: `[UNTRANSLATED] You can add or remove the Valence Bonus from your weapon.`, + mods_addRiven: `添加裂罅MOD`, mods_fingerprint: `印记`, mods_fingerprintHelp: `需要印记相关的帮助?`, @@ -288,5 +295,13 @@ dict = { upgrade_SwiftExecute: `怜悯之击速度提升50%`, upgrade_OnHackInvis: `入侵后隐身15秒`, + damageType_Electricity: `电击`, + damageType_Fire: `火焰`, + damageType_Freeze: `冰冻`, + damageType_Impact: `冲击`, + damageType_Magnetic: `磁力`, + damageType_Poison: `毒素`, + damageType_Radiation: `辐射`, + prettier_sucks_ass: `` };