diff --git a/src/controllers/api/gildWeaponController.ts b/src/controllers/api/gildWeaponController.ts
index dea62765..b9133426 100644
--- a/src/controllers/api/gildWeaponController.ts
+++ b/src/controllers/api/gildWeaponController.ts
@@ -34,10 +34,9 @@ export const gildWeaponController: RequestHandler = async (req, res) => {
const weapon = inventory[data.Category][weaponIndex];
weapon.Features ??= 0;
weapon.Features |= EquipmentFeatures.GILDED;
- if (data.Recipe != "webui") {
- weapon.ItemName = data.ItemName;
- weapon.XP = 0;
- }
+ weapon.ItemName = data.ItemName;
+ weapon.XP = 0;
+
if (data.Category != "OperatorAmps" && data.PolarizeSlot && data.PolarizeValue) {
weapon.Polarity = [
{
@@ -52,22 +51,20 @@ export const gildWeaponController: RequestHandler = async (req, res) => {
const affiliationMods = [];
- if (data.Recipe != "webui") {
- const recipe = ExportRecipes[data.Recipe];
- inventoryChanges.MiscItems = recipe.secretIngredients!.map(ingredient => ({
- ItemType: ingredient.ItemType,
- ItemCount: ingredient.ItemCount * -1
- }));
- addMiscItems(inventory, inventoryChanges.MiscItems);
+ const recipe = ExportRecipes[data.Recipe];
+ inventoryChanges.MiscItems = recipe.secretIngredients!.map(ingredient => ({
+ ItemType: ingredient.ItemType,
+ ItemCount: ingredient.ItemCount * -1
+ }));
+ addMiscItems(inventory, inventoryChanges.MiscItems);
- if (recipe.syndicateStandingChange) {
- const affiliation = inventory.Affiliations.find(x => x.Tag == recipe.syndicateStandingChange!.tag)!;
- affiliation.Standing += recipe.syndicateStandingChange.value;
- affiliationMods.push({
- Tag: recipe.syndicateStandingChange.tag,
- Standing: recipe.syndicateStandingChange.value
- });
- }
+ if (recipe.syndicateStandingChange) {
+ const affiliation = inventory.Affiliations.find(x => x.Tag == recipe.syndicateStandingChange!.tag)!;
+ affiliation.Standing += recipe.syndicateStandingChange.value;
+ affiliationMods.push({
+ Tag: recipe.syndicateStandingChange.tag,
+ Standing: recipe.syndicateStandingChange.value
+ });
}
await inventory.save();
diff --git a/src/controllers/api/inventoryController.ts b/src/controllers/api/inventoryController.ts
index 5d107510..b832c41b 100644
--- a/src/controllers/api/inventoryController.ts
+++ b/src/controllers/api/inventoryController.ts
@@ -410,6 +410,7 @@ export const getInventoryResponse = async (
for (const equipment of inventoryResponse[key]) {
equipment.Features ??= 0;
equipment.Features |= EquipmentFeatures.ARCANE_SLOT;
+ equipment.Features |= EquipmentFeatures.SECOND_ARCANE_SLOT;
}
}
}
diff --git a/src/controllers/custom/equipmentFeaturesController.ts b/src/controllers/custom/equipmentFeaturesController.ts
new file mode 100644
index 00000000..68d0e60f
--- /dev/null
+++ b/src/controllers/custom/equipmentFeaturesController.ts
@@ -0,0 +1,34 @@
+import type { RequestHandler } from "express";
+import { getAccountIdForRequest } from "../../services/loginService.ts";
+import type { TEquipmentKey } from "../../types/inventoryTypes/inventoryTypes.ts";
+import { getInventory } from "../../services/inventoryService.ts";
+import { EquipmentFeatures } from "../../types/equipmentTypes.ts";
+import { sendWsBroadcastTo } from "../../services/wsService.ts";
+
+export const equipmentFeaturesController: RequestHandler = async (req, res) => {
+ const accountId = await getAccountIdForRequest(req);
+ const category = req.query.Category as TEquipmentKey;
+ const inventory = await getInventory(
+ accountId,
+ `${category} unlockDoubleCapacityPotatoesEverywhere unlockExilusEverywhere unlockArcanesEverywhere`
+ );
+ const bit = Number(req.query.bit) as EquipmentFeatures;
+ if (
+ (inventory.unlockDoubleCapacityPotatoesEverywhere && bit === EquipmentFeatures.DOUBLE_CAPACITY) ||
+ (inventory.unlockExilusEverywhere && bit === EquipmentFeatures.UTILITY_SLOT) ||
+ (inventory.unlockArcanesEverywhere &&
+ (bit === EquipmentFeatures.ARCANE_SLOT || bit === EquipmentFeatures.SECOND_ARCANE_SLOT))
+ ) {
+ res.status(400).end();
+ }
+ const item = inventory[category].id(req.query.ItemId as string);
+ if (item) {
+ item.Features ??= 0;
+ item.Features ^= bit;
+ await inventory.save();
+ sendWsBroadcastTo(accountId, { sync_inventory: true });
+ res.status(200).end();
+ } else {
+ res.status(400).end();
+ }
+};
diff --git a/src/routes/custom.ts b/src/routes/custom.ts
index 05747f5a..1a6fca1f 100644
--- a/src/routes/custom.ts
+++ b/src/routes/custom.ts
@@ -1,6 +1,7 @@
import express from "express";
import { tunablesController } from "../controllers/custom/tunablesController.ts";
+import { equipmentFeaturesController } from "../controllers/custom/equipmentFeaturesController.ts";
import { getItemListsController } from "../controllers/custom/getItemListsController.ts";
import { pushArchonCrystalUpgradeController } from "../controllers/custom/pushArchonCrystalUpgradeController.ts";
import { popArchonCrystalUpgradeController } from "../controllers/custom/popArchonCrystalUpgradeController.ts";
@@ -53,6 +54,7 @@ import { getConfigController, setConfigController } from "../controllers/custom/
const customRouter = express.Router();
customRouter.get("/tunables.json", tunablesController);
+customRouter.get("/equipmentFeatures", equipmentFeaturesController);
customRouter.get("/getItemLists", getItemListsController);
customRouter.get("/pushArchonCrystalUpgrade", pushArchonCrystalUpgradeController);
customRouter.get("/popArchonCrystalUpgrade", popArchonCrystalUpgradeController);
diff --git a/static/webui/index.html b/static/webui/index.html
index e9c3bcf3..75fa3d52 100644
--- a/static/webui/index.html
+++ b/static/webui/index.html
@@ -840,6 +840,10 @@
+
diff --git a/static/webui/script.js b/static/webui/script.js
index 200bc040..23233460 100644
--- a/static/webui/script.js
+++ b/static/webui/script.js
@@ -912,12 +912,7 @@ function updateInventory() {
td.appendChild(a);
}
- if (
- ["Suits", "LongGuns", "Pistols", "Melee", "SpaceGuns", "SpaceMelee"].includes(
- category
- ) ||
- modularWeapons.includes(item.ItemType)
- ) {
+ {
const a = document.createElement("a");
a.href =
"/webui/detailedView?productCategory=" + category + "&itemId=" + item.ItemId.$oid;
@@ -930,7 +925,7 @@ function updateInventory() {
a.href = "#";
a.onclick = function (event) {
event.preventDefault();
- gildEquipment(category, item.ItemId.$oid);
+ equipmentFeatures(category, item.ItemId.$oid, 8);
};
a.title = loc("code_gild");
a.innerHTML = `
`;
@@ -1560,6 +1555,46 @@ function updateInventory() {
$("#detailedView-title").text(itemName);
}
+ {
+ document.getElementById("equipmentFeatures-card").classList.remove("d-none");
+ const buttonsCard = document.getElementById("equipmentFeaturesButtons-card");
+ buttonsCard.innerHTML = "";
+ item.Features ??= 0;
+ const bits = [1];
+ if (["Suits", "LongGuns", "Pistols", "Melee"].includes(category)) bits.push(2);
+ if (modularWeapons.includes(item.ItemType)) bits.push(8);
+ if (["LongGuns", "Pistols", "Melee", "SpaceGuns", "OperatorAmps"].includes(category))
+ bits.push(32);
+ if (category == "SpaceGuns") bits.push(4, 64);
+ if (
+ ["LongGuns", "Pistols", "Melee", "SpaceGuns", "SpaceMelee"].includes(category) &&
+ item.UpgradeFingerprint
+ )
+ bits.push(1024);
+ for (const bit of bits.sort((a, b) => a - b)) {
+ const isRemove = item.Features & bit;
+ const button = document.createElement("button");
+ button.classList = isRemove ? "btn btn-danger" : "btn btn-primary";
+ button.href = "#";
+ const locale = isRemove ? `code_removeFeature_${bit}` : `code_addFeature_${bit}`;
+ button.setAttribute("data-loc", locale);
+ button.innerHTML = loc(locale);
+ button.onclick = function (event) {
+ event.preventDefault();
+ equipmentFeatures(category, oid, bit);
+ };
+ if (
+ (data.unlockDoubleCapacityPotatoesEverywhere && bit === 1) ||
+ (data.unlockExilusEverywhere && bit === 2) ||
+ (data.unlockArcanesEverywhere && (bit === 32 || bit === 64))
+ ) {
+ button.disabled = true;
+ }
+
+ buttonsCard.appendChild(button);
+ }
+ }
+
if (category == "Suits") {
document.getElementById("archonShards-card").classList.remove("d-none");
@@ -2864,15 +2899,11 @@ function disposeOfItems(category, type, count) {
});
}
-function gildEquipment(category, oid) {
+function equipmentFeatures(category, oid, bit) {
revalidateAuthz().then(() => {
- $.post({
- url: "/api/gildWeapon.php?" + window.authz + "&ItemId=" + oid + "&Category=" + category,
- contentType: "application/octet-stream",
- data: JSON.stringify({
- Recipe: "webui"
- })
- }).done(function () {
+ $.get(
+ "/custom/equipmentFeatures?" + window.authz + "&ItemId=" + oid + "&Category=" + category + "&bit=" + bit
+ ).done(function () {
updateInventory();
});
});
@@ -3478,6 +3509,8 @@ single.getRoute("#detailedView-route").on("beforeload", function () {
document.getElementById("modularParts-card").classList.add("d-none");
document.getElementById("modularParts-form").innerHTML = "";
document.getElementById("valenceBonus-card").classList.add("d-none");
+ document.getElementById("equipmentFeatures-card").classList.add("d-none");
+ document.getElementById("equipmentFeaturesButtons-card").innerHTML = "";
if (window.didInitialInventoryUpdate) {
updateInventory();
}
diff --git a/static/webui/translations/de.js b/static/webui/translations/de.js
index e47aa556..bd047fb9 100644
--- a/static/webui/translations/de.js
+++ b/static/webui/translations/de.js
@@ -81,6 +81,20 @@ dict = {
code_operatorFaceName: `Operator-Gesicht: |INDEX|`,
code_succChange: `Erfolgreich geändert.`,
code_requiredInvigorationUpgrade: `Du musst sowohl ein Offensiv- als auch ein Support-Upgrade auswählen.`,
+ code_addFeature_1: `[UNTRANSLATED] Install Orokin Reactor`,
+ code_addFeature_2: `[UNTRANSLATED] Unlock Exilus slot`,
+ code_addFeature_4: `[UNTRANSLATED] Install Gravimag`,
+ code_addFeature_8: `[UNTRANSLATED] Gild Weapon`,
+ code_addFeature_32: `[UNTRANSLATED] Unlock Arcane slot`,
+ code_addFeature_64: `[UNTRANSLATED] Unlock Second Arcane slot`,
+ code_addFeature_1024: `[UNTRANSLATED] Unlock Valence Override`,
+ code_removeFeature_1: `[UNTRANSLATED] Remove Orokin Reactor`,
+ code_removeFeature_2: `[UNTRANSLATED] Lock Exilus slot`,
+ code_removeFeature_4: `[UNTRANSLATED] Remove Gravimag`,
+ code_removeFeature_8: `[UNTRANSLATED] Ungild Weapon`,
+ code_removeFeature_32: `[UNTRANSLATED] Lock Arcane slot`,
+ code_removeFeature_64: `[UNTRANSLATED] Lock Second Arcane slot`,
+ code_removeFeature_1024: `[UNTRANSLATED] Lock Valence Override`,
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_passwordLabel: `Passwort`,
@@ -155,6 +169,7 @@ dict = {
detailedView_modularPartsLabel: `Modulare Teile ändern`,
detailedView_invigorationLabel: `Kräftigung`,
detailedView_loadoutLabel: `Loadouts`,
+ detailedView_equipmentFeaturesLabel: `[UNTRANSLATED] Equipment Features`,
invigorations_offensive_AbilityStrength: `+200% Fähigkeitsstärke`,
invigorations_offensive_AbilityRange: `+100% Fähigkeitsreichweite`,
diff --git a/static/webui/translations/en.js b/static/webui/translations/en.js
index c9398726..84be36e1 100644
--- a/static/webui/translations/en.js
+++ b/static/webui/translations/en.js
@@ -80,6 +80,20 @@ dict = {
code_operatorFaceName: `Operator Visage |INDEX|`,
code_succChange: `Successfully changed.`,
code_requiredInvigorationUpgrade: `You must select both an offensive & utility upgrade.`,
+ code_addFeature_1: `Install Orokin Reactor`,
+ code_addFeature_2: `Unlock Exilus slot`,
+ code_addFeature_4: `Install Gravimag`,
+ code_addFeature_8: `Gild Weapon`,
+ code_addFeature_32: `Unlock Arcane slot`,
+ code_addFeature_64: `Unlock Second Arcane slot`,
+ code_addFeature_1024: `Unlock Valence Override`,
+ code_removeFeature_1: `Remove Orokin Reactor`,
+ code_removeFeature_2: `Lock Exilus slot`,
+ code_removeFeature_4: `Remove Gravimag`,
+ code_removeFeature_8: `Ungild Weapon`,
+ code_removeFeature_32: `Lock Arcane slot`,
+ code_removeFeature_64: `Lock Second Arcane slot`,
+ code_removeFeature_1024: `Lock Valence Override`,
login_description: `Login using your OpenWF account credentials (same as in-game when connecting to this server).`,
login_emailLabel: `Email address`,
login_passwordLabel: `Password`,
@@ -154,6 +168,7 @@ dict = {
detailedView_modularPartsLabel: `Change Modular Parts`,
detailedView_invigorationLabel: `Invigoration`,
detailedView_loadoutLabel: `Loadouts`,
+ detailedView_equipmentFeaturesLabel: `Equipment Features`,
invigorations_offensive_AbilityStrength: `+200% Ability Strength`,
invigorations_offensive_AbilityRange: `+100% Ability Range`,
diff --git a/static/webui/translations/es.js b/static/webui/translations/es.js
index 93e576a0..fb1044ce 100644
--- a/static/webui/translations/es.js
+++ b/static/webui/translations/es.js
@@ -81,6 +81,20 @@ dict = {
code_operatorFaceName: `Rostro del operador |INDEX|`,
code_succChange: `Cambiado correctamente`,
code_requiredInvigorationUpgrade: `Debes seleccionar una mejora ofensiva y una mejora de utilidad.`,
+ code_addFeature_1: `[UNTRANSLATED] Install Orokin Reactor`,
+ code_addFeature_2: `[UNTRANSLATED] Unlock Exilus slot`,
+ code_addFeature_4: `[UNTRANSLATED] Install Gravimag`,
+ code_addFeature_8: `[UNTRANSLATED] Gild Weapon`,
+ code_addFeature_32: `[UNTRANSLATED] Unlock Arcane slot`,
+ code_addFeature_64: `[UNTRANSLATED] Unlock Second Arcane slot`,
+ code_addFeature_1024: `[UNTRANSLATED] Unlock Valence Override`,
+ code_removeFeature_1: `[UNTRANSLATED] Remove Orokin Reactor`,
+ code_removeFeature_2: `[UNTRANSLATED] Lock Exilus slot`,
+ code_removeFeature_4: `[UNTRANSLATED] Remove Gravimag`,
+ code_removeFeature_8: `[UNTRANSLATED] Ungild Weapon`,
+ code_removeFeature_32: `[UNTRANSLATED] Lock Arcane slot`,
+ code_removeFeature_64: `[UNTRANSLATED] Lock Second Arcane slot`,
+ code_removeFeature_1024: `[UNTRANSLATED] Lock Valence Override`,
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_passwordLabel: `Contraseña`,
@@ -155,6 +169,7 @@ dict = {
detailedView_modularPartsLabel: `Cambiar partes modulares`,
detailedView_invigorationLabel: `Fortalecimiento`,
detailedView_loadoutLabel: `Equipamientos`,
+ detailedView_equipmentFeaturesLabel: `[UNTRANSLATED] Equipment Features`,
invigorations_offensive_AbilityStrength: `+200% Fuerza de Habilidad`,
invigorations_offensive_AbilityRange: `+100% Alcance de Habilidad`,
diff --git a/static/webui/translations/fr.js b/static/webui/translations/fr.js
index 9bc24f9c..dc0c68e9 100644
--- a/static/webui/translations/fr.js
+++ b/static/webui/translations/fr.js
@@ -81,6 +81,20 @@ dict = {
code_operatorFaceName: `Visage de l'Opérateur |INDEX|`,
code_succChange: `Changement effectué.`,
code_requiredInvigorationUpgrade: `Invigoration offensive et défensive requises.`,
+ code_addFeature_1: `[UNTRANSLATED] Install Orokin Reactor`,
+ code_addFeature_2: `[UNTRANSLATED] Unlock Exilus slot`,
+ code_addFeature_4: `[UNTRANSLATED] Install Gravimag`,
+ code_addFeature_8: `[UNTRANSLATED] Gild Weapon`,
+ code_addFeature_32: `[UNTRANSLATED] Unlock Arcane slot`,
+ code_addFeature_64: `[UNTRANSLATED] Unlock Second Arcane slot`,
+ code_addFeature_1024: `[UNTRANSLATED] Unlock Valence Override`,
+ code_removeFeature_1: `[UNTRANSLATED] Remove Orokin Reactor`,
+ code_removeFeature_2: `[UNTRANSLATED] Lock Exilus slot`,
+ code_removeFeature_4: `[UNTRANSLATED] Remove Gravimag`,
+ code_removeFeature_8: `[UNTRANSLATED] Ungild Weapon`,
+ code_removeFeature_32: `[UNTRANSLATED] Lock Arcane slot`,
+ code_removeFeature_64: `[UNTRANSLATED] Lock Second Arcane slot`,
+ code_removeFeature_1024: `[UNTRANSLATED] Lock Valence Override`,
login_description: `Connexion avec les informations de connexion OpenWF.`,
login_emailLabel: `Email`,
login_passwordLabel: `Mot de passe`,
@@ -155,6 +169,7 @@ dict = {
detailedView_modularPartsLabel: `Changer l'équipement modulaire`,
detailedView_invigorationLabel: `Dynamisation`,
detailedView_loadoutLabel: `Équipements`,
+ detailedView_equipmentFeaturesLabel: `[UNTRANSLATED] Equipment Features`,
invigorations_offensive_AbilityStrength: `+200% de puissance de pouvoir`,
invigorations_offensive_AbilityRange: `+100% de portée de pouvoir`,
diff --git a/static/webui/translations/ru.js b/static/webui/translations/ru.js
index 4b3ad9a3..01e3d044 100644
--- a/static/webui/translations/ru.js
+++ b/static/webui/translations/ru.js
@@ -81,6 +81,20 @@ dict = {
code_operatorFaceName: `Внешность оператора: |INDEX|`,
code_succChange: `Успешно изменено.`,
code_requiredInvigorationUpgrade: `Вы должны выбрать как атакующее, так и вспомогательное улучшение.`,
+ code_addFeature_1: `Установить Реактор Орокин`,
+ code_addFeature_2: `Разблокировать Эксилус слот`,
+ code_addFeature_4: `Установить Гравимаг`,
+ code_addFeature_8: `Улучшить Оружие`,
+ code_addFeature_32: `Разблокировать слот Мистификатора`,
+ code_addFeature_64: `Разблокировать Второй слот Мистификатора`,
+ code_addFeature_1024: `Разблокировать Переопределение валентности`,
+ code_removeFeature_1: `Удалить Реактор Орокин`,
+ code_removeFeature_2: `Заблокировать Эксилус слот`,
+ code_removeFeature_4: `Удалить Гравимаг`,
+ code_removeFeature_8: `[UNTRANSLATED] Ungild Weapon`,
+ code_removeFeature_32: `Заблокировать слот Мистификатора`,
+ code_removeFeature_64: `Заблокировать Второй слот Мистификатора`,
+ code_removeFeature_1024: `Заблокировать Переопределение валентности`,
login_description: `Войдите, используя учетные данные OpenWF (те же, что и в игре при подключении к этому серверу).`,
login_emailLabel: `Адрес электронной почты`,
login_passwordLabel: `Пароль`,
@@ -155,6 +169,7 @@ dict = {
detailedView_modularPartsLabel: `Изменить модульные части`,
detailedView_invigorationLabel: `Воодушевление`,
detailedView_loadoutLabel: `Конфигурации`,
+ detailedView_equipmentFeaturesLabel: `Модификаторы снаряжения`,
invigorations_offensive_AbilityStrength: `+200% к силе способностей.`,
invigorations_offensive_AbilityRange: `+100% к зоне поражения способностей.`,
diff --git a/static/webui/translations/uk.js b/static/webui/translations/uk.js
index cdef5c70..231d52c7 100644
--- a/static/webui/translations/uk.js
+++ b/static/webui/translations/uk.js
@@ -81,6 +81,20 @@ dict = {
code_operatorFaceName: `Зовнішність оператора: |INDEX|`,
code_succChange: `Успішно змінено.`,
code_requiredInvigorationUpgrade: `Ви повинні вибрати як атакуюче, так і допоміжне вдосконалення.`,
+ code_addFeature_1: `[UNTRANSLATED] Install Orokin Reactor`,
+ code_addFeature_2: `[UNTRANSLATED] Unlock Exilus slot`,
+ code_addFeature_4: `[UNTRANSLATED] Install Gravimag`,
+ code_addFeature_8: `[UNTRANSLATED] Gild Weapon`,
+ code_addFeature_32: `[UNTRANSLATED] Unlock Arcane slot`,
+ code_addFeature_64: `[UNTRANSLATED] Unlock Second Arcane slot`,
+ code_addFeature_1024: `[UNTRANSLATED] Unlock Valence Override`,
+ code_removeFeature_1: `[UNTRANSLATED] Remove Orokin Reactor`,
+ code_removeFeature_2: `[UNTRANSLATED] Lock Exilus slot`,
+ code_removeFeature_4: `[UNTRANSLATED] Remove Gravimag`,
+ code_removeFeature_8: `[UNTRANSLATED] Ungild Weapon`,
+ code_removeFeature_32: `[UNTRANSLATED] Lock Arcane slot`,
+ code_removeFeature_64: `[UNTRANSLATED] Lock Second Arcane slot`,
+ code_removeFeature_1024: `[UNTRANSLATED] Lock Valence Override`,
login_description: `Увійдіть, використовуючи облікові дані OpenWF (ті ж, що й у грі при підключенні до цього серверу).`,
login_emailLabel: `Адреса електронної пошти`,
login_passwordLabel: `Пароль`,
@@ -155,6 +169,7 @@ dict = {
detailedView_modularPartsLabel: `Змінити модульні частини`,
detailedView_invigorationLabel: `Зміцнення`,
detailedView_loadoutLabel: `Конфігурації`,
+ detailedView_equipmentFeaturesLabel: `[UNTRANSLATED] Equipment Features`,
invigorations_offensive_AbilityStrength: `+200% до потужності здібностей.`,
invigorations_offensive_AbilityRange: `+100% до досяжності здібностей.`,
diff --git a/static/webui/translations/zh.js b/static/webui/translations/zh.js
index 58d8d467..1c506a4d 100644
--- a/static/webui/translations/zh.js
+++ b/static/webui/translations/zh.js
@@ -81,6 +81,20 @@ dict = {
code_operatorFaceName: `指挥官面部 |INDEX|`,
code_succChange: `更改成功`,
code_requiredInvigorationUpgrade: `[UNTRANSLATED] You must select both an offensive & utility upgrade.`,
+ code_addFeature_1: `[UNTRANSLATED] Install Orokin Reactor`,
+ code_addFeature_2: `[UNTRANSLATED] Unlock Exilus slot`,
+ code_addFeature_4: `[UNTRANSLATED] Install Gravimag`,
+ code_addFeature_8: `[UNTRANSLATED] Gild Weapon`,
+ code_addFeature_32: `[UNTRANSLATED] Unlock Arcane slot`,
+ code_addFeature_64: `[UNTRANSLATED] Unlock Second Arcane slot`,
+ code_addFeature_1024: `[UNTRANSLATED] Unlock Valence Override`,
+ code_removeFeature_1: `[UNTRANSLATED] Remove Orokin Reactor`,
+ code_removeFeature_2: `[UNTRANSLATED] Lock Exilus slot`,
+ code_removeFeature_4: `[UNTRANSLATED] Remove Gravimag`,
+ code_removeFeature_8: `[UNTRANSLATED] Ungild Weapon`,
+ code_removeFeature_32: `[UNTRANSLATED] Lock Arcane slot`,
+ code_removeFeature_64: `[UNTRANSLATED] Lock Second Arcane slot`,
+ code_removeFeature_1024: `[UNTRANSLATED] Lock Valence Override`,
login_description: `使用您的 OpenWF 账户凭证登录(与游戏内连接本服务器时使用的昵称相同)`,
login_emailLabel: `电子邮箱`,
login_passwordLabel: `密码`,
@@ -155,6 +169,7 @@ dict = {
detailedView_modularPartsLabel: `更换部件`,
detailedView_invigorationLabel: `活化`,
detailedView_loadoutLabel: `配置`,
+ detailedView_equipmentFeaturesLabel: `[UNTRANSLATED] Equipment Features`,
invigorations_offensive_AbilityStrength: `+200%技能强度`,
invigorations_offensive_AbilityRange: `+100%技能范围`,