feat(webui): edit suit invigorations #2478

Merged
Sainan merged 12 commits from nyaoouo/SpaceNinjaServer:ImplEditSuitInvigorationUpgradeController into main 2025-07-14 20:33:38 -07:00
10 changed files with 350 additions and 0 deletions

View File

@ -0,0 +1,34 @@
import { getAccountIdForRequest } from "@/src/services/loginService";
import { getInventory } from "@/src/services/inventoryService";
import { RequestHandler } from "express";
const DEFAULT_UPGRADE_EXPIRY_MS = 7 * 24 * 60 * 60 * 1000; // 7 days
export const editSuitInvigorationUpgradeController: RequestHandler = async (req, res) => {
const accountId = await getAccountIdForRequest(req);
const { oid, data } = req.body as {
oid: string;
data?: {
DefensiveUpgrade: string;
OffensiveUpgrade: string;
UpgradesExpiry?: number;
};
};
const inventory = await getInventory(accountId);
const suit = inventory.Suits.id(oid)!;
if (data) {
suit.DefensiveUpgrade = data.DefensiveUpgrade;
suit.OffensiveUpgrade = data.OffensiveUpgrade;
if (data.UpgradesExpiry) {
suit.UpgradesExpiry = new Date(data.UpgradesExpiry);
} else {
suit.UpgradesExpiry = new Date(Date.now() + DEFAULT_UPGRADE_EXPIRY_MS);
}
} else {
suit.DefensiveUpgrade = undefined;
suit.OffensiveUpgrade = undefined;
suit.UpgradesExpiry = undefined;
}
await inventory.save();
res.end();
};

View File

@ -26,6 +26,7 @@ import { setEvolutionProgressController } from "@/src/controllers/custom/setEvol
import { setBoosterController } from "@/src/controllers/custom/setBoosterController"; import { setBoosterController } from "@/src/controllers/custom/setBoosterController";
import { updateFingerprintController } from "@/src/controllers/custom/updateFingerprintController"; import { updateFingerprintController } from "@/src/controllers/custom/updateFingerprintController";
import { changeModularPartsController } from "@/src/controllers/custom/changeModularPartsController"; import { changeModularPartsController } from "@/src/controllers/custom/changeModularPartsController";
import { editSuitInvigorationUpgradeController } from "@/src/controllers/custom/editSuitInvigorationUpgradeController";
import { getConfigController, setConfigController } from "@/src/controllers/custom/configController"; import { getConfigController, setConfigController } from "@/src/controllers/custom/configController";
@ -57,6 +58,7 @@ customRouter.post("/setEvolutionProgress", setEvolutionProgressController);
customRouter.post("/setBooster", setBoosterController); customRouter.post("/setBooster", setBoosterController);
customRouter.post("/updateFingerprint", updateFingerprintController); customRouter.post("/updateFingerprint", updateFingerprintController);
customRouter.post("/changeModularParts", changeModularPartsController); customRouter.post("/changeModularParts", changeModularPartsController);
customRouter.post("/editSuitInvigorationUpgrade", editSuitInvigorationUpgradeController);
customRouter.post("/getConfig", getConfigController); customRouter.post("/getConfig", getConfigController);
customRouter.post("/setConfig", setConfigController); customRouter.post("/setConfig", setConfigController);

View File

@ -478,6 +478,56 @@
</table> </table>
</div> </div>
Sainan marked this conversation as resolved Outdated

Why is this inside of the archon crystals card and not its own card?

Why is this inside of the archon crystals card and not its own card?

Because I didn't realize that you used path route first and then only controlled visibility based on url params...

Because I didn't realize that you used path route first and then only controlled visibility based on url params...
</div> </div>
Sainan marked this conversation as resolved Outdated

The oid is already in the query string. Be consistent.

The oid is already in the query string. Be consistent.
<div id="edit-suit-invigorations-card" class="card mb-3 d-none">
<h5 class="card-header" data-loc="detailedView_editSuitInvigoration"></h5>
<div class="card-body">
Sainan marked this conversation as resolved
Review

All your strings should be added to the translation system. And let's not lowercase a title? 😒

All your strings should be added to the translation system. And let's not lowercase a title? 😒
Review

because i just use my mobile phone to edit it =_=...

because i just use my mobile phone to edit it =_=...
Review

Try coding on a PC. :)

Try coding on a PC. :)
<form onsubmit="submitSuitInvigorationUpgrade(event)">
<div class="mb-3">
Sainan marked this conversation as resolved
Review

There are a few more strings here...

There are a few more strings here...
Review

I don't know the exact translation of the attributes, so I'll just estimate it based on the key.

I don't know the exact translation of the attributes, so I'll just estimate it based on the key.
<label for="invigoration-offensive" class="form-label" data-loc="invigorations_offensiveLabel"></label>
<select class="form-select" id="dv-invigoration-offensive">
<option value="" data-loc="invigorations_noneOption"></option>
<option value="/Lotus/Upgrades/Invigorations/Offensive/OffensiveInvigorationPowerStrength" data-loc="invigorations_offensive_PowerStrength"></option>
<option value="/Lotus/Upgrades/Invigorations/Offensive/OffensiveInvigorationPowerRange" data-loc="invigorations_offensive_PowerRange"></option>
<option value="/Lotus/Upgrades/Invigorations/Offensive/OffensiveInvigorationPowerDuration" data-loc="invigorations_offensive_PowerDuration"></option>
<option value="/Lotus/Upgrades/Invigorations/Offensive/OffensiveInvigorationMeleeDamage" data-loc="invigorations_offensive_MeleeDamage"></option>
<option value="/Lotus/Upgrades/Invigorations/Offensive/OffensiveInvigorationPrimaryDamage" data-loc="invigorations_offensive_PrimaryDamage"></option>
<option value="/Lotus/Upgrades/Invigorations/Offensive/OffensiveInvigorationSecondaryDamage" data-loc="invigorations_offensive_SecondaryDamage"></option>
<option value="/Lotus/Upgrades/Invigorations/Offensive/OffensiveInvigorationPrimaryCritChance" data-loc="invigorations_offensive_PrimaryCritChance"></option>
<option value="/Lotus/Upgrades/Invigorations/Offensive/OffensiveInvigorationSecondaryCritChance" data-loc="invigorations_offensive_SecondaryCritChance"></option>
<option value="/Lotus/Upgrades/Invigorations/Offensive/OffensiveInvigorationMeleeCritChance" data-loc="invigorations_offensive_MeleeCritChance"></option>
</select>
</div>
<div class="mb-3">
<label for="invigoration-defensive" class="form-label" data-loc="invigorations_defensiveLabel"></label>
<select class="form-select" id="dv-invigoration-defensive">
<option value="" data-loc="invigorations_noneOption"></option>
<option value="/Lotus/Upgrades/Invigorations/Utility/UtilityInvigorationPowerEfficiency" data-loc="invigorations_utility_PowerEfficiency"></option>
<option value="/Lotus/Upgrades/Invigorations/Utility/UtilityInvigorationMovementSpeed" data-loc="invigorations_utility_MovementSpeed"></option>
<option value="/Lotus/Upgrades/Invigorations/Utility/UtilityInvigorationParkourSpeed" data-loc="invigorations_utility_ParkourSpeed"></option>
<option value="/Lotus/Upgrades/Invigorations/Utility/UtilityInvigorationHealth" data-loc="invigorations_utility_Health"></option>
<option value="/Lotus/Upgrades/Invigorations/Utility/UtilityInvigorationEnergy" data-loc="invigorations_utility_Energy"></option>
<option value="/Lotus/Upgrades/Invigorations/Utility/UtilityInvigorationStatusResistance" data-loc="invigorations_utility_StatusResistance"></option>
<option value="/Lotus/Upgrades/Invigorations/Utility/UtilityInvigorationReloadSpeed" data-loc="invigorations_utility_ReloadSpeed"></option>
<option value="/Lotus/Upgrades/Invigorations/Utility/UtilityInvigorationHealthRegen" data-loc="invigorations_utility_HealthRegen"></option>
<option value="/Lotus/Upgrades/Invigorations/Utility/UtilityInvigorationArmor" data-loc="invigorations_utility_Armor"></option>
<option value="/Lotus/Upgrades/Invigorations/Utility/UtilityInvigorationJumps" data-loc="invigorations_utility_Jumps"></option>
<option value="/Lotus/Upgrades/Invigorations/Utility/UtilityInvigorationEnergyRegen" data-loc="invigorations_utility_EnergyRegen"></option>
</select>
</div>
<div class="mb-3">
<label for="invigoration-expiry" class="form-label" data-loc="invigorations_expiryLabel"></label>
<input type="datetime-local" class="form-control" id="dv-invigoration-expiry" />
</div>
<div class="d-flex gap-2">
<button type="submit" class="btn btn-primary" data-loc="invigorations_applyButton"></button>
<button type="button" class="btn btn-danger" onclick="clearSuitInvigorationUpgrades()" data-loc="invigorations_clearButton"></button>
</div>
</form>
</div>
</div>
<div id="modularParts-card" class="card mb-3 d-none"> <div id="modularParts-card" class="card mb-3 d-none">
<h5 class="card-header" data-loc="detailedView_modularPartsLabel"></h5> <h5 class="card-header" data-loc="detailedView_modularPartsLabel"></h5>
<div class="card-body"> <div class="card-body">

View File

@ -1231,6 +1231,13 @@ function updateInventory() {
} }
document.getElementById("crystals-list").appendChild(tr); document.getElementById("crystals-list").appendChild(tr);
}); });
document.getElementById("edit-suit-invigorations-card").classList.remove("d-none");
nyaoouo marked this conversation as resolved Outdated

Unused?

Unused?
const { OffensiveUpgrade, DefensiveUpgrade, UpgradesExpiry } =
suitInvigorationUpgradeData(item);
document.getElementById("dv-invigoration-offensive").value = OffensiveUpgrade;
document.getElementById("dv-invigoration-defensive").value = DefensiveUpgrade;
document.getElementById("dv-invigoration-expiry").value = UpgradesExpiry;
} else if (["LongGuns", "Pistols", "Melee", "SpaceGuns", "SpaceMelee"].includes(category)) { } else if (["LongGuns", "Pistols", "Melee", "SpaceGuns", "SpaceMelee"].includes(category)) {
document.getElementById("valenceBonus-card").classList.remove("d-none"); document.getElementById("valenceBonus-card").classList.remove("d-none");
document.getElementById("valenceBonus-innateDamage").value = ""; document.getElementById("valenceBonus-innateDamage").value = "";
@ -2863,3 +2870,74 @@ function handleModularPartsChange(event) {
}); });
} }
} }
function suitInvigorationUpgradeData(suitData) {
let expiryDate = "";
if (suitData.UpgradesExpiry) {
if (suitData.UpgradesExpiry.$date) {
expiryDate = new Date(parseInt(suitData.UpgradesExpiry.$date.$numberLong));
} else if (typeof suitData.UpgradesExpiry === "number") {
expiryDate = new Date(suitData.UpgradesExpiry);
} else if (suitData.UpgradesExpiry instanceof Date) {
expiryDate = suitData.UpgradesExpiry;
}
if (expiryDate && !isNaN(expiryDate.getTime())) {
const year = expiryDate.getFullYear();
const month = String(expiryDate.getMonth() + 1).padStart(2, "0");
const day = String(expiryDate.getDate()).padStart(2, "0");
const hours = String(expiryDate.getHours()).padStart(2, "0");
const minutes = String(expiryDate.getMinutes()).padStart(2, "0");
expiryDate = `${year}-${month}-${day}T${hours}:${minutes}`;
} else {
expiryDate = "";
}
}
return {
oid: suitData.ItemId.$oid,
OffensiveUpgrade: suitData.OffensiveUpgrade || "",
DefensiveUpgrade: suitData.DefensiveUpgrade || "",
UpgradesExpiry: expiryDate
};
}
function submitSuitInvigorationUpgrade(event) {
event.preventDefault();
const oid = new URLSearchParams(window.location.search).get("itemId");
const offensiveUpgrade = document.getElementById("dv-invigoration-offensive").value;
const defensiveUpgrade = document.getElementById("dv-invigoration-defensive").value;
const expiry = document.getElementById("dv-invigoration-expiry").value;
if (!offensiveUpgrade || !defensiveUpgrade) {
alert(loc("code_requiredInvigorationUpgrade"));
Sainan marked this conversation as resolved Outdated

...and here.

...and here.
return;
}
const data = {
OffensiveUpgrade: offensiveUpgrade,
DefensiveUpgrade: defensiveUpgrade
};
if (expiry) {
data.UpgradesExpiry = new Date(expiry).getTime();
}
editSuitInvigorationUpgrade(oid, data);
}
Sainan marked this conversation as resolved Outdated

If you need godawful custom CSS, put it in the CSS file.

If you need godawful custom CSS, put it in the CSS file.
function clearSuitInvigorationUpgrades() {
editSuitInvigorationUpgrade(new URLSearchParams(window.location.search).get("itemId"), null);
}
async function editSuitInvigorationUpgrade(oid, data) {
/* data?: {
DefensiveUpgrade: string;
OffensiveUpgrade: string;
UpgradesExpiry?: number;
}*/
$.post({
url: "/custom/editSuitInvigorationUpgrade?" + window.authz,
contentType: "application/json",
data: JSON.stringify({ oid, data })
}).done(function () {
updateInventory();
});
}

View File

@ -62,6 +62,7 @@ dict = {
code_mature: `Für den Kampf auswachsen lassen`, code_mature: `Für den Kampf auswachsen lassen`,
code_unmature: `Genetisches Altern zurücksetzen`, code_unmature: `Genetisches Altern zurücksetzen`,
code_succChange: `Erfolgreich geändert.`, code_succChange: `Erfolgreich geändert.`,
code_requiredInvigorationUpgrade: `[UNTRANSLATED] You must select both an offensive and a defensive upgrade.`,
login_description: `Melde dich mit deinem OpenWF-Account an (denselben Angaben wie im Spiel, wenn du dich mit diesem Server verbindest).`, login_description: `Melde dich mit deinem OpenWF-Account an (denselben Angaben wie im Spiel, wenn du dich mit diesem Server verbindest).`,
login_emailLabel: `E-Mail-Adresse`, login_emailLabel: `E-Mail-Adresse`,
login_passwordLabel: `Passwort`, login_passwordLabel: `Passwort`,
@ -125,6 +126,36 @@ dict = {
detailedView_valenceBonusLabel: `Valenz-Bonus`, detailedView_valenceBonusLabel: `Valenz-Bonus`,
detailedView_valenceBonusDescription: `Du kannst den Valenz-Bonus deiner Waffe festlegen oder entfernen.`, detailedView_valenceBonusDescription: `Du kannst den Valenz-Bonus deiner Waffe festlegen oder entfernen.`,
detailedView_modularPartsLabel: `Modulare Teile ändern`, detailedView_modularPartsLabel: `Modulare Teile ändern`,
detailedView_editSuitInvigoration: `[UNTRANSLATED] Edit Suit Invigoration`,
invigorations_offensive_PowerStrength: `[UNTRANSLATED] Power Strength`,
invigorations_offensive_PowerRange: `[UNTRANSLATED] Power Range`,
invigorations_offensive_PowerDuration: `[UNTRANSLATED] Power Duration`,
invigorations_offensive_MeleeDamage: `[UNTRANSLATED] Melee Damage`,
invigorations_offensive_PrimaryDamage: `[UNTRANSLATED] Primary Damage`,
invigorations_offensive_SecondaryDamage: `[UNTRANSLATED] Secondary Damage`,
invigorations_offensive_PrimaryCritChance: `[UNTRANSLATED] Primary Critical Chance`,
invigorations_offensive_SecondaryCritChance: `[UNTRANSLATED] Secondary Critical Chance`,
invigorations_offensive_MeleeCritChance: `[UNTRANSLATED] Melee Critical Chance`,
invigorations_utility_PowerEfficiency: `[UNTRANSLATED] Power Efficiency`,
invigorations_utility_MovementSpeed: `[UNTRANSLATED] Movement Speed`,
invigorations_utility_ParkourSpeed: `[UNTRANSLATED] Parkour Speed`,
invigorations_utility_Health: `[UNTRANSLATED] Health`,
invigorations_utility_Energy: `[UNTRANSLATED] Energy`,
invigorations_utility_StatusResistance: `[UNTRANSLATED] Status Resistance`,
invigorations_utility_ReloadSpeed: `[UNTRANSLATED] Reload Speed`,
invigorations_utility_HealthRegen: `[UNTRANSLATED] Health Regen`,
invigorations_utility_Armor: `[UNTRANSLATED] Armor`,
invigorations_utility_Jumps: `[UNTRANSLATED] Jumps`,
invigorations_utility_EnergyRegen: `[UNTRANSLATED] Energy Regen`,
invigorations_offensiveLabel: `[UNTRANSLATED] Offensive Upgrade`,
invigorations_defensiveLabel: `[UNTRANSLATED] Defensive Upgrade`,
invigorations_expiryLabel: `[UNTRANSLATED] Upgrades Expiry (optional)`,
invigorations_applyButton: `[UNTRANSLATED] Apply Upgrades`,
invigorations_clearButton: `[UNTRANSLATED] Clear Upgrades`,
invigorations_noneOption: `[UNTRANSLATED] None`,
mods_addRiven: `Riven hinzufügen`, mods_addRiven: `Riven hinzufügen`,
mods_fingerprint: `Fingerabdruck`, mods_fingerprint: `Fingerabdruck`,

View File

@ -61,6 +61,7 @@ dict = {
code_mature: `Mature for combat`, code_mature: `Mature for combat`,
code_unmature: `Regress genetic aging`, code_unmature: `Regress genetic aging`,
code_succChange: `Successfully changed.`, code_succChange: `Successfully changed.`,
code_requiredInvigorationUpgrade: `You must select both an offensive and a defensive upgrade.`,
login_description: `Login using your OpenWF account credentials (same as in-game when connecting to this server).`, login_description: `Login using your OpenWF account credentials (same as in-game when connecting to this server).`,
login_emailLabel: `Email address`, login_emailLabel: `Email address`,
login_passwordLabel: `Password`, login_passwordLabel: `Password`,
@ -124,6 +125,36 @@ dict = {
detailedView_valenceBonusLabel: `Valence Bonus`, detailedView_valenceBonusLabel: `Valence Bonus`,
detailedView_valenceBonusDescription: `You can set or remove the Valence Bonus from your weapon.`, detailedView_valenceBonusDescription: `You can set or remove the Valence Bonus from your weapon.`,
detailedView_modularPartsLabel: `Change Modular Parts`, detailedView_modularPartsLabel: `Change Modular Parts`,
detailedView_editSuitInvigoration: `Edit Suit Invigoration`,
invigorations_offensive_PowerStrength: `Power Strength`,
invigorations_offensive_PowerRange: `Power Range`,
invigorations_offensive_PowerDuration: `Power Duration`,
invigorations_offensive_MeleeDamage: `Melee Damage`,
invigorations_offensive_PrimaryDamage: `Primary Damage`,
invigorations_offensive_SecondaryDamage: `Secondary Damage`,
invigorations_offensive_PrimaryCritChance: `Primary Critical Chance`,
invigorations_offensive_SecondaryCritChance: `Secondary Critical Chance`,
invigorations_offensive_MeleeCritChance: `Melee Critical Chance`,
invigorations_utility_PowerEfficiency: `Power Efficiency`,
invigorations_utility_MovementSpeed: `Movement Speed`,
invigorations_utility_ParkourSpeed: `Parkour Speed`,
invigorations_utility_Health: `Health`,
invigorations_utility_Energy: `Energy`,
invigorations_utility_StatusResistance: `Status Resistance`,
invigorations_utility_ReloadSpeed: `Reload Speed`,
invigorations_utility_HealthRegen: `Health Regen`,
invigorations_utility_Armor: `Armor`,
invigorations_utility_Jumps: `Jumps`,
invigorations_utility_EnergyRegen: `Energy Regen`,
invigorations_offensiveLabel: `Offensive Upgrade`,
invigorations_defensiveLabel: `Defensive Upgrade`,
invigorations_expiryLabel: `Upgrades Expiry (optional)`,
invigorations_applyButton: `Apply Upgrades`,
invigorations_clearButton: `Clear Upgrades`,
invigorations_noneOption: `None`,
mods_addRiven: `Add Riven`, mods_addRiven: `Add Riven`,
mods_fingerprint: `Fingerprint`, mods_fingerprint: `Fingerprint`,

View File

@ -62,6 +62,7 @@ dict = {
code_mature: `Listo para el combate`, code_mature: `Listo para el combate`,
code_unmature: `Regresar el envejecimiento genético`, code_unmature: `Regresar el envejecimiento genético`,
code_succChange: `Cambiado correctamente`, code_succChange: `Cambiado correctamente`,
code_requiredInvigorationUpgrade: `[UNTRANSLATED] You must select both an offensive and a defensive upgrade.`,
login_description: `Inicia sesión con las credenciales de tu cuenta OpenWF (las mismas que usas en el juego al conectarte a este servidor).`, login_description: `Inicia sesión con las credenciales de tu cuenta OpenWF (las mismas que usas en el juego al conectarte a este servidor).`,
login_emailLabel: `Dirección de correo electrónico`, login_emailLabel: `Dirección de correo electrónico`,
login_passwordLabel: `Contraseña`, login_passwordLabel: `Contraseña`,
@ -125,6 +126,36 @@ dict = {
detailedView_valenceBonusLabel: `Bônus de Valência`, detailedView_valenceBonusLabel: `Bônus de Valência`,
detailedView_valenceBonusDescription: `Puedes establecer o quitar el bono de valencia de tu arma.`, detailedView_valenceBonusDescription: `Puedes establecer o quitar el bono de valencia de tu arma.`,
detailedView_modularPartsLabel: `Cambiar partes modulares`, detailedView_modularPartsLabel: `Cambiar partes modulares`,
detailedView_editSuitInvigoration: `[UNTRANSLATED] Edit Suit Invigoration`,
invigorations_offensive_PowerStrength: `[UNTRANSLATED] Power Strength`,
invigorations_offensive_PowerRange: `[UNTRANSLATED] Power Range`,
invigorations_offensive_PowerDuration: `[UNTRANSLATED] Power Duration`,
invigorations_offensive_MeleeDamage: `[UNTRANSLATED] Melee Damage`,
invigorations_offensive_PrimaryDamage: `[UNTRANSLATED] Primary Damage`,
invigorations_offensive_SecondaryDamage: `[UNTRANSLATED] Secondary Damage`,
invigorations_offensive_PrimaryCritChance: `[UNTRANSLATED] Primary Critical Chance`,
invigorations_offensive_SecondaryCritChance: `[UNTRANSLATED] Secondary Critical Chance`,
invigorations_offensive_MeleeCritChance: `[UNTRANSLATED] Melee Critical Chance`,
invigorations_utility_PowerEfficiency: `[UNTRANSLATED] Power Efficiency`,
invigorations_utility_MovementSpeed: `[UNTRANSLATED] Movement Speed`,
invigorations_utility_ParkourSpeed: `[UNTRANSLATED] Parkour Speed`,
invigorations_utility_Health: `[UNTRANSLATED] Health`,
invigorations_utility_Energy: `[UNTRANSLATED] Energy`,
invigorations_utility_StatusResistance: `[UNTRANSLATED] Status Resistance`,
invigorations_utility_ReloadSpeed: `[UNTRANSLATED] Reload Speed`,
invigorations_utility_HealthRegen: `[UNTRANSLATED] Health Regen`,
invigorations_utility_Armor: `[UNTRANSLATED] Armor`,
invigorations_utility_Jumps: `[UNTRANSLATED] Jumps`,
invigorations_utility_EnergyRegen: `[UNTRANSLATED] Energy Regen`,
invigorations_offensiveLabel: `[UNTRANSLATED] Offensive Upgrade`,
invigorations_defensiveLabel: `[UNTRANSLATED] Defensive Upgrade`,
invigorations_expiryLabel: `[UNTRANSLATED] Upgrades Expiry (optional)`,
invigorations_applyButton: `[UNTRANSLATED] Apply Upgrades`,
invigorations_clearButton: `[UNTRANSLATED] Clear Upgrades`,
invigorations_noneOption: `[UNTRANSLATED] None`,
mods_addRiven: `Agregar Agrietado`, mods_addRiven: `Agregar Agrietado`,
mods_fingerprint: `Huella digital`, mods_fingerprint: `Huella digital`,

View File

@ -62,6 +62,7 @@ dict = {
code_mature: `Maturer pour le combat`, code_mature: `Maturer pour le combat`,
code_unmature: `Régrésser l'âge génétique`, code_unmature: `Régrésser l'âge génétique`,
code_succChange: `[UNTRANSLATED] Successfully changed.`, code_succChange: `[UNTRANSLATED] Successfully changed.`,
code_requiredInvigorationUpgrade: `[UNTRANSLATED] You must select both an offensive and a defensive upgrade.`,
login_description: `Connexion avec les informations de connexion OpenWF.`, login_description: `Connexion avec les informations de connexion OpenWF.`,
login_emailLabel: `Email`, login_emailLabel: `Email`,
login_passwordLabel: `Mot de passe`, login_passwordLabel: `Mot de passe`,
@ -125,6 +126,36 @@ dict = {
detailedView_valenceBonusLabel: `Bonus de Valence`, detailedView_valenceBonusLabel: `Bonus de Valence`,
detailedView_valenceBonusDescription: `[UNTRANSLATED] You can set or remove the Valence Bonus from your weapon.`, detailedView_valenceBonusDescription: `[UNTRANSLATED] You can set or remove the Valence Bonus from your weapon.`,
detailedView_modularPartsLabel: `[UNTRANSLATED] Change Modular Parts`, detailedView_modularPartsLabel: `[UNTRANSLATED] Change Modular Parts`,
detailedView_editSuitInvigoration: `[UNTRANSLATED] Edit Suit Invigoration`,
invigorations_offensive_PowerStrength: `[UNTRANSLATED] Power Strength`,
invigorations_offensive_PowerRange: `[UNTRANSLATED] Power Range`,
invigorations_offensive_PowerDuration: `[UNTRANSLATED] Power Duration`,
invigorations_offensive_MeleeDamage: `[UNTRANSLATED] Melee Damage`,
invigorations_offensive_PrimaryDamage: `[UNTRANSLATED] Primary Damage`,
invigorations_offensive_SecondaryDamage: `[UNTRANSLATED] Secondary Damage`,
invigorations_offensive_PrimaryCritChance: `[UNTRANSLATED] Primary Critical Chance`,
invigorations_offensive_SecondaryCritChance: `[UNTRANSLATED] Secondary Critical Chance`,
invigorations_offensive_MeleeCritChance: `[UNTRANSLATED] Melee Critical Chance`,
invigorations_utility_PowerEfficiency: `[UNTRANSLATED] Power Efficiency`,
invigorations_utility_MovementSpeed: `[UNTRANSLATED] Movement Speed`,
invigorations_utility_ParkourSpeed: `[UNTRANSLATED] Parkour Speed`,
invigorations_utility_Health: `[UNTRANSLATED] Health`,
invigorations_utility_Energy: `[UNTRANSLATED] Energy`,
invigorations_utility_StatusResistance: `[UNTRANSLATED] Status Resistance`,
invigorations_utility_ReloadSpeed: `[UNTRANSLATED] Reload Speed`,
invigorations_utility_HealthRegen: `[UNTRANSLATED] Health Regen`,
invigorations_utility_Armor: `[UNTRANSLATED] Armor`,
invigorations_utility_Jumps: `[UNTRANSLATED] Jumps`,
invigorations_utility_EnergyRegen: `[UNTRANSLATED] Energy Regen`,
invigorations_offensiveLabel: `[UNTRANSLATED] Offensive Upgrade`,
invigorations_defensiveLabel: `[UNTRANSLATED] Defensive Upgrade`,
invigorations_expiryLabel: `[UNTRANSLATED] Upgrades Expiry (optional)`,
invigorations_applyButton: `[UNTRANSLATED] Apply Upgrades`,
invigorations_clearButton: `[UNTRANSLATED] Clear Upgrades`,
invigorations_noneOption: `[UNTRANSLATED] None`,
mods_addRiven: `Ajouter un riven`, mods_addRiven: `Ajouter un riven`,
mods_fingerprint: `Empreinte`, mods_fingerprint: `Empreinte`,

View File

@ -62,6 +62,7 @@ dict = {
code_mature: `Подготовить к сражениям`, code_mature: `Подготовить к сражениям`,
code_unmature: `Регрессия генетического старения`, code_unmature: `Регрессия генетического старения`,
code_succChange: `Успешно изменено.`, code_succChange: `Успешно изменено.`,
code_requiredInvigorationUpgrade: `[UNTRANSLATED] You must select both an offensive and a defensive upgrade.`,
login_description: `Войдите, используя учетные данные OpenWF (те же, что и в игре при подключении к этому серверу).`, login_description: `Войдите, используя учетные данные OpenWF (те же, что и в игре при подключении к этому серверу).`,
login_emailLabel: `Адрес электронной почты`, login_emailLabel: `Адрес электронной почты`,
login_passwordLabel: `Пароль`, login_passwordLabel: `Пароль`,
@ -125,6 +126,36 @@ dict = {
detailedView_valenceBonusLabel: `Бонус Валентности`, detailedView_valenceBonusLabel: `Бонус Валентности`,
detailedView_valenceBonusDescription: `Вы можете установить или убрать бонус валентности с вашего оружия.`, detailedView_valenceBonusDescription: `Вы можете установить или убрать бонус валентности с вашего оружия.`,
detailedView_modularPartsLabel: `Изменить Модульные Части`, detailedView_modularPartsLabel: `Изменить Модульные Части`,
detailedView_editSuitInvigoration: `[UNTRANSLATED] Edit Suit Invigoration`,
invigorations_offensive_PowerStrength: `[UNTRANSLATED] Power Strength`,
invigorations_offensive_PowerRange: `[UNTRANSLATED] Power Range`,
invigorations_offensive_PowerDuration: `[UNTRANSLATED] Power Duration`,
invigorations_offensive_MeleeDamage: `[UNTRANSLATED] Melee Damage`,
invigorations_offensive_PrimaryDamage: `[UNTRANSLATED] Primary Damage`,
invigorations_offensive_SecondaryDamage: `[UNTRANSLATED] Secondary Damage`,
invigorations_offensive_PrimaryCritChance: `[UNTRANSLATED] Primary Critical Chance`,
invigorations_offensive_SecondaryCritChance: `[UNTRANSLATED] Secondary Critical Chance`,
invigorations_offensive_MeleeCritChance: `[UNTRANSLATED] Melee Critical Chance`,
invigorations_utility_PowerEfficiency: `[UNTRANSLATED] Power Efficiency`,
invigorations_utility_MovementSpeed: `[UNTRANSLATED] Movement Speed`,
invigorations_utility_ParkourSpeed: `[UNTRANSLATED] Parkour Speed`,
invigorations_utility_Health: `[UNTRANSLATED] Health`,
invigorations_utility_Energy: `[UNTRANSLATED] Energy`,
invigorations_utility_StatusResistance: `[UNTRANSLATED] Status Resistance`,
invigorations_utility_ReloadSpeed: `[UNTRANSLATED] Reload Speed`,
invigorations_utility_HealthRegen: `[UNTRANSLATED] Health Regen`,
invigorations_utility_Armor: `[UNTRANSLATED] Armor`,
invigorations_utility_Jumps: `[UNTRANSLATED] Jumps`,
invigorations_utility_EnergyRegen: `[UNTRANSLATED] Energy Regen`,
invigorations_offensiveLabel: `[UNTRANSLATED] Offensive Upgrade`,
invigorations_defensiveLabel: `[UNTRANSLATED] Defensive Upgrade`,
invigorations_expiryLabel: `[UNTRANSLATED] Upgrades Expiry (optional)`,
invigorations_applyButton: `[UNTRANSLATED] Apply Upgrades`,
invigorations_clearButton: `[UNTRANSLATED] Clear Upgrades`,
invigorations_noneOption: `[UNTRANSLATED] None`,
mods_addRiven: `Добавить Мод Разлома`, mods_addRiven: `Добавить Мод Разлома`,
mods_fingerprint: `Отпечаток`, mods_fingerprint: `Отпечаток`,

View File

@ -62,6 +62,7 @@ dict = {
code_mature: `成长并战备`, code_mature: `成长并战备`,
code_unmature: `逆转衰老基因`, code_unmature: `逆转衰老基因`,
code_succChange: `更改成功.`, code_succChange: `更改成功.`,
code_requiredInvigorationUpgrade: `[UNTRANSLATED] You must select both an offensive and a defensive upgrade.`,
login_description: `使用您的 OpenWF 账户凭证登录(与游戏内连接本服务器时使用的昵称相同).`, login_description: `使用您的 OpenWF 账户凭证登录(与游戏内连接本服务器时使用的昵称相同).`,
login_emailLabel: `电子邮箱`, login_emailLabel: `电子邮箱`,
login_passwordLabel: `密码`, login_passwordLabel: `密码`,
@ -125,6 +126,36 @@ dict = {
detailedView_valenceBonusLabel: `效价加成`, detailedView_valenceBonusLabel: `效价加成`,
detailedView_valenceBonusDescription: `您可以设置或移除武器上的效价加成.`, detailedView_valenceBonusDescription: `您可以设置或移除武器上的效价加成.`,
detailedView_modularPartsLabel: `更换部件`, detailedView_modularPartsLabel: `更换部件`,
detailedView_editSuitInvigoration: `[UNTRANSLATED] Edit Suit Invigoration`,
invigorations_offensive_PowerStrength: `[UNTRANSLATED] Power Strength`,
invigorations_offensive_PowerRange: `[UNTRANSLATED] Power Range`,
invigorations_offensive_PowerDuration: `[UNTRANSLATED] Power Duration`,
invigorations_offensive_MeleeDamage: `[UNTRANSLATED] Melee Damage`,
invigorations_offensive_PrimaryDamage: `[UNTRANSLATED] Primary Damage`,
invigorations_offensive_SecondaryDamage: `[UNTRANSLATED] Secondary Damage`,
invigorations_offensive_PrimaryCritChance: `[UNTRANSLATED] Primary Critical Chance`,
invigorations_offensive_SecondaryCritChance: `[UNTRANSLATED] Secondary Critical Chance`,
invigorations_offensive_MeleeCritChance: `[UNTRANSLATED] Melee Critical Chance`,
invigorations_utility_PowerEfficiency: `[UNTRANSLATED] Power Efficiency`,
invigorations_utility_MovementSpeed: `[UNTRANSLATED] Movement Speed`,
invigorations_utility_ParkourSpeed: `[UNTRANSLATED] Parkour Speed`,
invigorations_utility_Health: `[UNTRANSLATED] Health`,
invigorations_utility_Energy: `[UNTRANSLATED] Energy`,
invigorations_utility_StatusResistance: `[UNTRANSLATED] Status Resistance`,
invigorations_utility_ReloadSpeed: `[UNTRANSLATED] Reload Speed`,
invigorations_utility_HealthRegen: `[UNTRANSLATED] Health Regen`,
invigorations_utility_Armor: `[UNTRANSLATED] Armor`,
invigorations_utility_Jumps: `[UNTRANSLATED] Jumps`,
invigorations_utility_EnergyRegen: `[UNTRANSLATED] Energy Regen`,
invigorations_offensiveLabel: `[UNTRANSLATED] Offensive Upgrade`,
invigorations_defensiveLabel: `[UNTRANSLATED] Defensive Upgrade`,
invigorations_expiryLabel: `[UNTRANSLATED] Upgrades Expiry (optional)`,
invigorations_applyButton: `[UNTRANSLATED] Apply Upgrades`,
invigorations_clearButton: `[UNTRANSLATED] Clear Upgrades`,
invigorations_noneOption: `[UNTRANSLATED] None`,
mods_addRiven: `添加裂罅MOD`, mods_addRiven: `添加裂罅MOD`,
mods_fingerprint: `印记`, mods_fingerprint: `印记`,