forked from OpenWF/SpaceNinjaServer
Compare commits
1 Commits
M-translat
...
void-surpl
Author | SHA1 | Date | |
---|---|---|---|
2c8edb7b4f |
18
.eslintrc
18
.eslintrc
@ -11,17 +11,17 @@
|
|||||||
"node": true
|
"node": true
|
||||||
},
|
},
|
||||||
"rules": {
|
"rules": {
|
||||||
"@typescript-eslint/explicit-function-return-type": "error",
|
"@typescript-eslint/explicit-function-return-type": "warn",
|
||||||
"@typescript-eslint/restrict-template-expressions": "error",
|
"@typescript-eslint/restrict-template-expressions": "warn",
|
||||||
"@typescript-eslint/restrict-plus-operands": "error",
|
"@typescript-eslint/restrict-plus-operands": "warn",
|
||||||
"@typescript-eslint/no-unsafe-member-access": "error",
|
"@typescript-eslint/no-unsafe-member-access": "warn",
|
||||||
"@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_", "caughtErrors": "none" }],
|
"@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_", "caughtErrors": "none" }],
|
||||||
"@typescript-eslint/no-unsafe-argument": "error",
|
"@typescript-eslint/no-unsafe-argument": "error",
|
||||||
"@typescript-eslint/no-unsafe-call": "error",
|
"@typescript-eslint/no-unsafe-call": "warn",
|
||||||
"@typescript-eslint/no-unsafe-assignment": "error",
|
"@typescript-eslint/no-unsafe-assignment": "warn",
|
||||||
"@typescript-eslint/no-explicit-any": "error",
|
"@typescript-eslint/no-explicit-any": "warn",
|
||||||
"no-loss-of-precision": "error",
|
"no-loss-of-precision": "warn",
|
||||||
"@typescript-eslint/no-unnecessary-condition": "error",
|
"@typescript-eslint/no-unnecessary-condition": "warn",
|
||||||
"@typescript-eslint/no-base-to-string": "off",
|
"@typescript-eslint/no-base-to-string": "off",
|
||||||
"no-case-declarations": "error",
|
"no-case-declarations": "error",
|
||||||
"prettier/prettier": "error",
|
"prettier/prettier": "error",
|
||||||
|
3
.vscode/launch.json
vendored
3
.vscode/launch.json
vendored
@ -8,7 +8,8 @@
|
|||||||
"type": "node",
|
"type": "node",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"name": "Debug and Watch",
|
"name": "Debug and Watch",
|
||||||
"args": ["${workspaceFolder}/scripts/dev.js"],
|
"runtimeArgs": ["-r", "tsconfig-paths/register", "-r", "ts-node/register", "--watch-path", "src"],
|
||||||
|
"args": ["${workspaceFolder}/src/index.ts"],
|
||||||
"console": "integratedTerminal"
|
"console": "integratedTerminal"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -35,4 +35,4 @@ SpaceNinjaServer requires a `config.json`. To set it up, you can copy the [confi
|
|||||||
- `RadioLegionIntermissionSyndicate` for Intermission I
|
- `RadioLegionIntermissionSyndicate` for Intermission I
|
||||||
- `RadioLegionSyndicate` for The Wolf of Saturn Six
|
- `RadioLegionSyndicate` for The Wolf of Saturn Six
|
||||||
- `allTheFissures` can be set to `normal` or `hard` to enable all fissures either in normal or steel path, respectively.
|
- `allTheFissures` can be set to `normal` or `hard` to enable all fissures either in normal or steel path, respectively.
|
||||||
- `worldState.circuitGameModes` can be set to an array of game modes which will override the otherwise-random pattern in The Circuit. Valid element values are `Survival`, `VoidFlood`, `Excavation`, `Defense`, `Exterminate`, `Assassination`, and `Alchemy`.
|
- `worldState.circuitGameModes` can be provided with an array of valid game modes (`Survival`, `VoidFlood`, `Excavation`, `Defense`, `Exterminate`, `Assassination`, `Alchemy`)
|
||||||
|
@ -58,9 +58,7 @@
|
|||||||
"fastClanAscension": false,
|
"fastClanAscension": false,
|
||||||
"missionsCanGiveAllRelics": false,
|
"missionsCanGiveAllRelics": false,
|
||||||
"unlockAllSimarisResearchEntries": false,
|
"unlockAllSimarisResearchEntries": false,
|
||||||
"disableDailyTribute": false,
|
|
||||||
"spoofMasteryRank": -1,
|
"spoofMasteryRank": -1,
|
||||||
"relicRewardItemCountMultiplier": 1,
|
|
||||||
"nightwaveStandingMultiplier": 1,
|
"nightwaveStandingMultiplier": 1,
|
||||||
"unfaithfulBugFixes": {
|
"unfaithfulBugFixes": {
|
||||||
"ignore1999LastRegionPlayed": false,
|
"ignore1999LastRegionPlayed": false,
|
||||||
@ -77,8 +75,7 @@
|
|||||||
"duviriOverride": "",
|
"duviriOverride": "",
|
||||||
"nightwaveOverride": "",
|
"nightwaveOverride": "",
|
||||||
"allTheFissures": "",
|
"allTheFissures": "",
|
||||||
"circuitGameModes": null,
|
"circuitGameModes": null
|
||||||
"darvoStockMultiplier": 1
|
|
||||||
},
|
},
|
||||||
"dev": {
|
"dev": {
|
||||||
"keepVendorsExpired": false
|
"keepVendorsExpired": false
|
||||||
|
8
package-lock.json
generated
8
package-lock.json
generated
@ -23,7 +23,7 @@
|
|||||||
"ncp": "^2.0.0",
|
"ncp": "^2.0.0",
|
||||||
"typescript": "^5.5",
|
"typescript": "^5.5",
|
||||||
"undici": "^7.10.0",
|
"undici": "^7.10.0",
|
||||||
"warframe-public-export-plus": "^0.5.76",
|
"warframe-public-export-plus": "^0.5.73",
|
||||||
"warframe-riven-info": "^0.1.2",
|
"warframe-riven-info": "^0.1.2",
|
||||||
"winston": "^3.17.0",
|
"winston": "^3.17.0",
|
||||||
"winston-daily-rotate-file": "^5.0.0",
|
"winston-daily-rotate-file": "^5.0.0",
|
||||||
@ -3386,9 +3386,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/warframe-public-export-plus": {
|
"node_modules/warframe-public-export-plus": {
|
||||||
"version": "0.5.76",
|
"version": "0.5.73",
|
||||||
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.76.tgz",
|
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.73.tgz",
|
||||||
"integrity": "sha512-0gX3NTWaxFyzUmqBSUHhPY8pMRX92iXQFqoBuMQlMG1+6uC6JMKtwP5t8cuXR3pvV2vkaCi/cDWjP1JUChkZ9g=="
|
"integrity": "sha512-v5lmaq/rNICg7WIZcosyfz92RpmrNyfW6+/Pbi9Iu8HbZH74PfaQKT6suAyC9xQn6xp8/cG3NLinqlLZovbKpw=="
|
||||||
},
|
},
|
||||||
"node_modules/warframe-riven-info": {
|
"node_modules/warframe-riven-info": {
|
||||||
"version": "0.1.2",
|
"version": "0.1.2",
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
"ncp": "^2.0.0",
|
"ncp": "^2.0.0",
|
||||||
"typescript": "^5.5",
|
"typescript": "^5.5",
|
||||||
"undici": "^7.10.0",
|
"undici": "^7.10.0",
|
||||||
"warframe-public-export-plus": "^0.5.76",
|
"warframe-public-export-plus": "^0.5.73",
|
||||||
"warframe-riven-info": "^0.1.2",
|
"warframe-riven-info": "^0.1.2",
|
||||||
"winston": "^3.17.0",
|
"winston": "^3.17.0",
|
||||||
"winston-daily-rotate-file": "^5.0.0",
|
"winston-daily-rotate-file": "^5.0.0",
|
||||||
|
@ -31,7 +31,7 @@ fs.readdirSync("../static/webui/translations").forEach(file => {
|
|||||||
const strings = extractStrings(line);
|
const strings = extractStrings(line);
|
||||||
if (Object.keys(strings).length > 0) {
|
if (Object.keys(strings).length > 0) {
|
||||||
Object.entries(strings).forEach(([key, value]) => {
|
Object.entries(strings).forEach(([key, value]) => {
|
||||||
if (targetStrings.hasOwnProperty(key) && !targetStrings[key].startsWith("[UNTRANSLATED] ")) {
|
if (targetStrings.hasOwnProperty(key)) {
|
||||||
fs.writeSync(fileHandle, ` ${key}: \`${targetStrings[key]}\`,\n`);
|
fs.writeSync(fileHandle, ` ${key}: \`${targetStrings[key]}\`,\n`);
|
||||||
} else {
|
} else {
|
||||||
fs.writeSync(fileHandle, ` ${key}: \`[UNTRANSLATED] ${value}\`,\n`);
|
fs.writeSync(fileHandle, ` ${key}: \`[UNTRANSLATED] ${value}\`,\n`);
|
||||||
|
@ -13,8 +13,7 @@ import {
|
|||||||
addItem,
|
addItem,
|
||||||
addRecipes,
|
addRecipes,
|
||||||
occupySlot,
|
occupySlot,
|
||||||
combineInventoryChanges,
|
combineInventoryChanges
|
||||||
addKubrowPetPrint
|
|
||||||
} from "@/src/services/inventoryService";
|
} from "@/src/services/inventoryService";
|
||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
|
import { IInventoryChanges } from "@/src/types/purchaseTypes";
|
||||||
import { IEquipmentClient } from "@/src/types/inventoryTypes/commonInventoryTypes";
|
import { IEquipmentClient } from "@/src/types/inventoryTypes/commonInventoryTypes";
|
||||||
@ -120,9 +119,6 @@ export const claimCompletedRecipeController: RequestHandler = async (req, res) =
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
pet.Details!.Status = canSetActive ? Status.StatusAvailable : Status.StatusStasis;
|
pet.Details!.Status = canSetActive ? Status.StatusAvailable : Status.StatusStasis;
|
||||||
} else if (recipe.secretIngredientAction == "SIA_DISTILL_PRINT") {
|
|
||||||
const pet = inventory.KubrowPets.id(pendingRecipe.KubrowPet!)!;
|
|
||||||
addKubrowPetPrint(inventory, pet, InventoryChanges);
|
|
||||||
} else if (recipe.secretIngredientAction != "SIA_UNBRAND") {
|
} else if (recipe.secretIngredientAction != "SIA_UNBRAND") {
|
||||||
InventoryChanges = {
|
InventoryChanges = {
|
||||||
...InventoryChanges,
|
...InventoryChanges,
|
||||||
|
@ -4,15 +4,9 @@ import { getAccountIdForRequest } from "@/src/services/loginService";
|
|||||||
import { getInventory } from "@/src/services/inventoryService";
|
import { getInventory } from "@/src/services/inventoryService";
|
||||||
|
|
||||||
export const creditsController: RequestHandler = async (req, res) => {
|
export const creditsController: RequestHandler = async (req, res) => {
|
||||||
const inventory = (
|
const accountId = await getAccountIdForRequest(req);
|
||||||
await Promise.all([
|
|
||||||
getAccountIdForRequest(req),
|
const inventory = await getInventory(accountId, "RegularCredits TradesRemaining PremiumCreditsFree PremiumCredits");
|
||||||
getInventory(
|
|
||||||
req.query.accountId as string,
|
|
||||||
"RegularCredits TradesRemaining PremiumCreditsFree PremiumCredits"
|
|
||||||
)
|
|
||||||
])
|
|
||||||
)[1];
|
|
||||||
|
|
||||||
const response = {
|
const response = {
|
||||||
RegularCredits: inventory.RegularCredits,
|
RegularCredits: inventory.RegularCredits,
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
import { DailyDeal } from "@/src/models/worldStateModel";
|
|
||||||
import { RequestHandler } from "express";
|
import { RequestHandler } from "express";
|
||||||
|
|
||||||
export const getDailyDealStockLevelsController: RequestHandler = async (req, res) => {
|
export const getDailyDealStockLevelsController: RequestHandler = (req, res) => {
|
||||||
const dailyDeal = (await DailyDeal.findOne({ StoreItem: req.query.productName }, "AmountSold"))!;
|
|
||||||
res.json({
|
res.json({
|
||||||
StoreItem: req.query.productName,
|
StoreItem: req.query.productName,
|
||||||
AmountSold: dailyDeal.AmountSold
|
AmountSold: 0
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
@ -9,26 +9,15 @@ import {
|
|||||||
updateCurrency
|
updateCurrency
|
||||||
} from "@/src/services/inventoryService";
|
} from "@/src/services/inventoryService";
|
||||||
import { getAccountForRequest, getSuffixedName } from "@/src/services/loginService";
|
import { getAccountForRequest, getSuffixedName } from "@/src/services/loginService";
|
||||||
import { handleDailyDealPurchase, handleStoreItemAcquisition } from "@/src/services/purchaseService";
|
import { handleStoreItemAcquisition } from "@/src/services/purchaseService";
|
||||||
import { IOid } from "@/src/types/commonTypes";
|
import { IOid } from "@/src/types/commonTypes";
|
||||||
import { IPurchaseParams, IPurchaseResponse, PurchaseSource } from "@/src/types/purchaseTypes";
|
import { IInventoryChanges, IPurchaseParams, PurchaseSource } from "@/src/types/purchaseTypes";
|
||||||
import { RequestHandler } from "express";
|
import { RequestHandler } from "express";
|
||||||
import { ExportBundles, ExportFlavour } from "warframe-public-export-plus";
|
import { ExportBundles, ExportFlavour } from "warframe-public-export-plus";
|
||||||
|
|
||||||
const checkPurchaseParams = (params: IPurchaseParams): boolean => {
|
|
||||||
switch (params.Source) {
|
|
||||||
case PurchaseSource.Market:
|
|
||||||
return params.UsePremium;
|
|
||||||
|
|
||||||
case PurchaseSource.DailyDeal:
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const giftingController: RequestHandler = async (req, res) => {
|
export const giftingController: RequestHandler = async (req, res) => {
|
||||||
const data = getJSONfromString<IGiftingRequest>(String(req.body));
|
const data = getJSONfromString<IGiftingRequest>(String(req.body));
|
||||||
if (!checkPurchaseParams(data.PurchaseParams)) {
|
if (data.PurchaseParams.Source != PurchaseSource.Market || !data.PurchaseParams.UsePremium) {
|
||||||
throw new Error(`unexpected purchase params in gifting request: ${String(req.body)}`);
|
throw new Error(`unexpected purchase params in gifting request: ${String(req.body)}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,19 +58,16 @@ export const giftingController: RequestHandler = async (req, res) => {
|
|||||||
}
|
}
|
||||||
senderInventory.GiftsRemaining -= 1;
|
senderInventory.GiftsRemaining -= 1;
|
||||||
|
|
||||||
const response: IPurchaseResponse = {
|
const inventoryChanges: IInventoryChanges = updateCurrency(
|
||||||
InventoryChanges: {}
|
senderInventory,
|
||||||
};
|
data.PurchaseParams.ExpectedPrice,
|
||||||
if (data.PurchaseParams.Source == PurchaseSource.DailyDeal) {
|
true
|
||||||
await handleDailyDealPurchase(senderInventory, data.PurchaseParams, response);
|
);
|
||||||
} else {
|
|
||||||
updateCurrency(senderInventory, data.PurchaseParams.ExpectedPrice, true, response.InventoryChanges);
|
|
||||||
}
|
|
||||||
if (data.PurchaseParams.StoreItem in ExportBundles) {
|
if (data.PurchaseParams.StoreItem in ExportBundles) {
|
||||||
const bundle = ExportBundles[data.PurchaseParams.StoreItem];
|
const bundle = ExportBundles[data.PurchaseParams.StoreItem];
|
||||||
if (bundle.giftingBonus) {
|
if (bundle.giftingBonus) {
|
||||||
combineInventoryChanges(
|
combineInventoryChanges(
|
||||||
response.InventoryChanges,
|
inventoryChanges,
|
||||||
(await handleStoreItemAcquisition(bundle.giftingBonus, senderInventory)).InventoryChanges
|
(await handleStoreItemAcquisition(bundle.giftingBonus, senderInventory)).InventoryChanges
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -113,7 +99,9 @@ export const giftingController: RequestHandler = async (req, res) => {
|
|||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
|
|
||||||
res.json(response);
|
res.json({
|
||||||
|
InventoryChanges: inventoryChanges
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
interface IGiftingRequest {
|
interface IGiftingRequest {
|
||||||
|
@ -5,7 +5,6 @@ import {
|
|||||||
getGuildVault,
|
getGuildVault,
|
||||||
hasAccessToDojo,
|
hasAccessToDojo,
|
||||||
hasGuildPermission,
|
hasGuildPermission,
|
||||||
processCompletedGuildTechProject,
|
|
||||||
processFundedGuildTechProject,
|
processFundedGuildTechProject,
|
||||||
processGuildTechProjectContributionsUpdate,
|
processGuildTechProjectContributionsUpdate,
|
||||||
removePigmentsFromGuildMembers,
|
removePigmentsFromGuildMembers,
|
||||||
@ -52,12 +51,8 @@ export const guildTechController: RequestHandler = async (req, res) => {
|
|||||||
};
|
};
|
||||||
if (project.CompletionDate) {
|
if (project.CompletionDate) {
|
||||||
techProject.CompletionDate = toMongoDate(project.CompletionDate);
|
techProject.CompletionDate = toMongoDate(project.CompletionDate);
|
||||||
if (
|
if (Date.now() >= project.CompletionDate.getTime()) {
|
||||||
Date.now() >= project.CompletionDate.getTime() &&
|
needSave ||= setGuildTechLogState(guild, project.ItemType, 4, project.CompletionDate);
|
||||||
setGuildTechLogState(guild, project.ItemType, 4, project.CompletionDate)
|
|
||||||
) {
|
|
||||||
processCompletedGuildTechProject(guild, project.ItemType);
|
|
||||||
needSave = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
techProjects.push(techProject);
|
techProjects.push(techProject);
|
||||||
|
@ -9,13 +9,11 @@ import { IPolarity, ArtifactPolarity, EquipmentFeatures } from "@/src/types/inve
|
|||||||
import { ExportCustoms, ExportFlavour, ExportResources, ExportVirtuals } from "warframe-public-export-plus";
|
import { ExportCustoms, ExportFlavour, ExportResources, ExportVirtuals } from "warframe-public-export-plus";
|
||||||
import { applyCheatsToInfestedFoundry, handleSubsumeCompletion } from "@/src/services/infestedFoundryService";
|
import { applyCheatsToInfestedFoundry, handleSubsumeCompletion } from "@/src/services/infestedFoundryService";
|
||||||
import {
|
import {
|
||||||
addEmailItem,
|
|
||||||
addMiscItems,
|
addMiscItems,
|
||||||
allDailyAffiliationKeys,
|
allDailyAffiliationKeys,
|
||||||
cleanupInventory,
|
cleanupInventory,
|
||||||
createLibraryDailyTask,
|
createLibraryDailyTask,
|
||||||
generateRewardSeed,
|
generateRewardSeed
|
||||||
getCalendarProgress
|
|
||||||
} from "@/src/services/inventoryService";
|
} from "@/src/services/inventoryService";
|
||||||
import { logger } from "@/src/utils/logger";
|
import { logger } from "@/src/utils/logger";
|
||||||
import { addString, catBreadHash } from "@/src/helpers/stringHelpers";
|
import { addString, catBreadHash } from "@/src/helpers/stringHelpers";
|
||||||
@ -26,8 +24,6 @@ import { IPersonalRoomsClient } from "@/src/types/personalRoomsTypes";
|
|||||||
import { Ship } from "@/src/models/shipModel";
|
import { Ship } from "@/src/models/shipModel";
|
||||||
import { toLegacyOid, toOid, version_compare } from "@/src/helpers/inventoryHelpers";
|
import { toLegacyOid, toOid, version_compare } from "@/src/helpers/inventoryHelpers";
|
||||||
import { Inbox } from "@/src/models/inboxModel";
|
import { Inbox } from "@/src/models/inboxModel";
|
||||||
import { unixTimesInMs } from "@/src/constants/timeConstants";
|
|
||||||
import { DailyDeal } from "@/src/models/worldStateModel";
|
|
||||||
|
|
||||||
export const inventoryController: RequestHandler = async (request, response) => {
|
export const inventoryController: RequestHandler = async (request, response) => {
|
||||||
const account = await getAccountForRequest(request);
|
const account = await getAccountForRequest(request);
|
||||||
@ -41,8 +37,6 @@ export const inventoryController: RequestHandler = async (request, response) =>
|
|||||||
|
|
||||||
// Handle daily reset
|
// Handle daily reset
|
||||||
if (!inventory.NextRefill || Date.now() >= inventory.NextRefill.getTime()) {
|
if (!inventory.NextRefill || Date.now() >= inventory.NextRefill.getTime()) {
|
||||||
const today = Math.trunc(Date.now() / 86400000);
|
|
||||||
|
|
||||||
for (const key of allDailyAffiliationKeys) {
|
for (const key of allDailyAffiliationKeys) {
|
||||||
inventory[key] = 16000 + inventory.PlayerLevel * 500;
|
inventory[key] = 16000 + inventory.PlayerLevel * 500;
|
||||||
}
|
}
|
||||||
@ -53,12 +47,12 @@ export const inventoryController: RequestHandler = async (request, response) =>
|
|||||||
inventory.LibraryAvailableDailyTaskInfo = createLibraryDailyTask();
|
inventory.LibraryAvailableDailyTaskInfo = createLibraryDailyTask();
|
||||||
|
|
||||||
if (inventory.NextRefill) {
|
if (inventory.NextRefill) {
|
||||||
const lastLoginDay = Math.trunc(inventory.NextRefill.getTime() / 86400000) - 1;
|
|
||||||
const daysPassed = today - lastLoginDay;
|
|
||||||
|
|
||||||
if (config.noArgonCrystalDecay) {
|
if (config.noArgonCrystalDecay) {
|
||||||
inventory.FoundToday = undefined;
|
inventory.FoundToday = undefined;
|
||||||
} else {
|
} else {
|
||||||
|
const lastLoginDay = Math.trunc(inventory.NextRefill.getTime() / 86400000) - 1;
|
||||||
|
const today = Math.trunc(Date.now() / 86400000);
|
||||||
|
const daysPassed = today - lastLoginDay;
|
||||||
for (let i = 0; i != daysPassed; ++i) {
|
for (let i = 0; i != daysPassed; ++i) {
|
||||||
const numArgonCrystals =
|
const numArgonCrystals =
|
||||||
inventory.MiscItems.find(x => x.ItemType == "/Lotus/Types/Items/MiscItems/ArgonCrystal")
|
inventory.MiscItems.find(x => x.ItemType == "/Lotus/Types/Items/MiscItems/ArgonCrystal")
|
||||||
@ -90,84 +84,11 @@ export const inventoryController: RequestHandler = async (request, response) =>
|
|||||||
inventory.FoundToday = undefined;
|
inventory.FoundToday = undefined;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inventory.UsedDailyDeals.length != 0) {
|
|
||||||
if (daysPassed == 1) {
|
|
||||||
const todayAt0Utc = today * 86400000;
|
|
||||||
const darvoIndex = Math.trunc((todayAt0Utc - 25200000) / (26 * unixTimesInMs.hour));
|
|
||||||
const darvoStart = darvoIndex * (26 * unixTimesInMs.hour) + 25200000;
|
|
||||||
const darvoOid =
|
|
||||||
((darvoStart / 1000) & 0xffffffff).toString(16).padStart(8, "0") + "adc51a72f7324d95";
|
|
||||||
const deal = await DailyDeal.findById(darvoOid);
|
|
||||||
if (deal) {
|
|
||||||
inventory.UsedDailyDeals = inventory.UsedDailyDeals.filter(x => x == deal.StoreItem); // keep only the deal that came into this new day with us
|
|
||||||
} else {
|
|
||||||
inventory.UsedDailyDeals = [];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
inventory.UsedDailyDeals = [];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inventory.CalendarProgress) {
|
|
||||||
const previousYearIteration = inventory.CalendarProgress.Iteration;
|
|
||||||
getCalendarProgress(inventory); // handle year rollover; the client expects to receive an inventory with an up-to-date CalendarProgress
|
|
||||||
|
|
||||||
// also handle sending of kiss cinematic at year rollover
|
|
||||||
if (
|
|
||||||
inventory.CalendarProgress.Iteration != previousYearIteration &&
|
|
||||||
inventory.DialogueHistory &&
|
|
||||||
inventory.DialogueHistory.Dialogues
|
|
||||||
) {
|
|
||||||
let kalymos = false;
|
|
||||||
for (const { dialogueName, kissEmail } of [
|
|
||||||
{
|
|
||||||
dialogueName: "/Lotus/Types/Gameplay/1999Wf/Dialogue/ArthurDialogue_rom.dialogue",
|
|
||||||
kissEmail: "/Lotus/Types/Items/EmailItems/ArthurKissEmailItem"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
dialogueName: "/Lotus/Types/Gameplay/1999Wf/Dialogue/EleanorDialogue_rom.dialogue",
|
|
||||||
kissEmail: "/Lotus/Types/Items/EmailItems/EleanorKissEmailItem"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
dialogueName: "/Lotus/Types/Gameplay/1999Wf/Dialogue/LettieDialogue_rom.dialogue",
|
|
||||||
kissEmail: "/Lotus/Types/Items/EmailItems/LettieKissEmailItem"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
dialogueName: "/Lotus/Types/Gameplay/1999Wf/Dialogue/JabirDialogue_rom.dialogue",
|
|
||||||
kissEmail: "/Lotus/Types/Items/EmailItems/AmirKissEmailItem"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
dialogueName: "/Lotus/Types/Gameplay/1999Wf/Dialogue/AoiDialogue_rom.dialogue",
|
|
||||||
kissEmail: "/Lotus/Types/Items/EmailItems/AoiKissEmailItem"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
dialogueName: "/Lotus/Types/Gameplay/1999Wf/Dialogue/QuincyDialogue_rom.dialogue",
|
|
||||||
kissEmail: "/Lotus/Types/Items/EmailItems/QuincyKissEmailItem"
|
|
||||||
}
|
|
||||||
]) {
|
|
||||||
const dialogue = inventory.DialogueHistory.Dialogues.find(x => x.DialogueName == dialogueName);
|
|
||||||
if (dialogue) {
|
|
||||||
if (dialogue.Rank == 7) {
|
|
||||||
await addEmailItem(inventory, kissEmail);
|
|
||||||
kalymos = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (dialogue.Rank == 6) {
|
|
||||||
kalymos = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (kalymos) {
|
|
||||||
await addEmailItem(inventory, "/Lotus/Types/Items/EmailItems/KalymosKissEmailItem");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cleanupInventory(inventory);
|
cleanupInventory(inventory);
|
||||||
|
|
||||||
inventory.NextRefill = new Date((today + 1) * 86400000); // tomorrow at 0 UTC
|
inventory.NextRefill = new Date((Math.trunc(Date.now() / 86400000) + 1) * 86400000);
|
||||||
//await inventory.save();
|
//await inventory.save();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -370,6 +291,9 @@ export const getInventoryResponse = async (
|
|||||||
applyCheatsToInfestedFoundry(inventoryResponse.InfestedFoundry);
|
applyCheatsToInfestedFoundry(inventoryResponse.InfestedFoundry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Omitting this field so opening the navigation resyncs the inventory which is more desirable for typical usage.
|
||||||
|
inventoryResponse.LastInventorySync = undefined;
|
||||||
|
|
||||||
// Set 2FA enabled so trading post can be used
|
// Set 2FA enabled so trading post can be used
|
||||||
inventoryResponse.HWIDProtectEnabled = true;
|
inventoryResponse.HWIDProtectEnabled = true;
|
||||||
|
|
||||||
|
@ -8,8 +8,6 @@ import {
|
|||||||
setAccountGotLoginRewardToday
|
setAccountGotLoginRewardToday
|
||||||
} from "@/src/services/loginRewardService";
|
} from "@/src/services/loginRewardService";
|
||||||
import { getInventory } from "@/src/services/inventoryService";
|
import { getInventory } from "@/src/services/inventoryService";
|
||||||
import { config } from "@/src/services/configService";
|
|
||||||
import { sendWsBroadcastTo } from "@/src/services/webService";
|
|
||||||
|
|
||||||
export const loginRewardsController: RequestHandler = async (req, res) => {
|
export const loginRewardsController: RequestHandler = async (req, res) => {
|
||||||
const account = await getAccountForRequest(req);
|
const account = await getAccountForRequest(req);
|
||||||
@ -17,7 +15,7 @@ export const loginRewardsController: RequestHandler = async (req, res) => {
|
|||||||
const isMilestoneDay = account.LoginDays == 5 || account.LoginDays % 50 == 0;
|
const isMilestoneDay = account.LoginDays == 5 || account.LoginDays % 50 == 0;
|
||||||
const nextMilestoneDay = account.LoginDays < 5 ? 5 : (Math.trunc(account.LoginDays / 50) + 1) * 50;
|
const nextMilestoneDay = account.LoginDays < 5 ? 5 : (Math.trunc(account.LoginDays / 50) + 1) * 50;
|
||||||
|
|
||||||
if (today == account.LastLoginRewardDate || config.disableDailyTribute) {
|
if (today == account.LastLoginRewardDate) {
|
||||||
res.json({
|
res.json({
|
||||||
DailyTributeInfo: {
|
DailyTributeInfo: {
|
||||||
IsMilestoneDay: isMilestoneDay,
|
IsMilestoneDay: isMilestoneDay,
|
||||||
@ -48,10 +46,10 @@ export const loginRewardsController: RequestHandler = async (req, res) => {
|
|||||||
response.DailyTributeInfo.HasChosenReward = true;
|
response.DailyTributeInfo.HasChosenReward = true;
|
||||||
response.DailyTributeInfo.ChosenReward = randomRewards[0];
|
response.DailyTributeInfo.ChosenReward = randomRewards[0];
|
||||||
response.DailyTributeInfo.NewInventory = await claimLoginReward(inventory, randomRewards[0]);
|
response.DailyTributeInfo.NewInventory = await claimLoginReward(inventory, randomRewards[0]);
|
||||||
setAccountGotLoginRewardToday(account);
|
await inventory.save();
|
||||||
await Promise.all([inventory.save(), account.save()]);
|
|
||||||
|
|
||||||
sendWsBroadcastTo(account._id.toString(), { update_inventory: true });
|
setAccountGotLoginRewardToday(account);
|
||||||
|
await account.save();
|
||||||
}
|
}
|
||||||
res.json(response);
|
res.json(response);
|
||||||
};
|
};
|
||||||
|
@ -6,7 +6,6 @@ import {
|
|||||||
} from "@/src/services/loginRewardService";
|
} from "@/src/services/loginRewardService";
|
||||||
import { getAccountForRequest } from "@/src/services/loginService";
|
import { getAccountForRequest } from "@/src/services/loginService";
|
||||||
import { handleStoreItemAcquisition } from "@/src/services/purchaseService";
|
import { handleStoreItemAcquisition } from "@/src/services/purchaseService";
|
||||||
import { sendWsBroadcastTo } from "@/src/services/webService";
|
|
||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
|
import { IInventoryChanges } from "@/src/types/purchaseTypes";
|
||||||
import { logger } from "@/src/utils/logger";
|
import { logger } from "@/src/utils/logger";
|
||||||
import { RequestHandler } from "express";
|
import { RequestHandler } from "express";
|
||||||
@ -35,10 +34,11 @@ export const loginRewardsSelectionController: RequestHandler = async (req, res)
|
|||||||
chosenReward = randomRewards.find(x => x.StoreItemType == body.ChosenReward)!;
|
chosenReward = randomRewards.find(x => x.StoreItemType == body.ChosenReward)!;
|
||||||
inventoryChanges = await claimLoginReward(inventory, chosenReward);
|
inventoryChanges = await claimLoginReward(inventory, chosenReward);
|
||||||
}
|
}
|
||||||
setAccountGotLoginRewardToday(account);
|
await inventory.save();
|
||||||
await Promise.all([inventory.save(), account.save()]);
|
|
||||||
|
setAccountGotLoginRewardToday(account);
|
||||||
|
await account.save();
|
||||||
|
|
||||||
sendWsBroadcastTo(account._id.toString(), { update_inventory: true });
|
|
||||||
res.json({
|
res.json({
|
||||||
DailyTributeInfo: {
|
DailyTributeInfo: {
|
||||||
NewInventory: inventoryChanges,
|
NewInventory: inventoryChanges,
|
||||||
|
@ -57,12 +57,8 @@ export const placeDecoInComponentController: RequestHandler = async (req, res) =
|
|||||||
component.DecoCapacity -= meta.capacityCost;
|
component.DecoCapacity -= meta.capacityCost;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const entry = Object.entries(ExportResources).find(arr => arr[1].deco == deco.Type);
|
const [itemType, meta] = Object.entries(ExportResources).find(arr => arr[1].deco == deco.Type)!;
|
||||||
if (!entry) {
|
if (!itemType || meta.dojoCapacityCost === undefined) {
|
||||||
throw new Error(`unknown deco type: ${deco.Type}`);
|
|
||||||
}
|
|
||||||
const [itemType, meta] = entry;
|
|
||||||
if (meta.dojoCapacityCost === undefined) {
|
|
||||||
throw new Error(`unknown deco type: ${deco.Type}`);
|
throw new Error(`unknown deco type: ${deco.Type}`);
|
||||||
}
|
}
|
||||||
component.DecoCapacity -= meta.dojoCapacityCost;
|
component.DecoCapacity -= meta.dojoCapacityCost;
|
||||||
@ -79,13 +75,7 @@ export const placeDecoInComponentController: RequestHandler = async (req, res) =
|
|||||||
if (meta) {
|
if (meta) {
|
||||||
processDojoBuildMaterialsGathered(guild, meta);
|
processDojoBuildMaterialsGathered(guild, meta);
|
||||||
}
|
}
|
||||||
} else if (
|
} else if (guild.AutoContributeFromVault && guild.VaultRegularCredits && guild.VaultMiscItems) {
|
||||||
deco.Type.startsWith("/Lotus/Objects/Tenno/Dojo/NpcPlaceables/") ||
|
|
||||||
(guild.AutoContributeFromVault && guild.VaultRegularCredits && guild.VaultMiscItems)
|
|
||||||
) {
|
|
||||||
if (!guild.VaultRegularCredits || !guild.VaultMiscItems) {
|
|
||||||
throw new Error(`dojo visitor placed without anything in vault?!`);
|
|
||||||
}
|
|
||||||
if (guild.VaultRegularCredits >= scaleRequiredCount(guild.Tier, meta.price)) {
|
if (guild.VaultRegularCredits >= scaleRequiredCount(guild.Tier, meta.price)) {
|
||||||
let enoughMiscItems = true;
|
let enoughMiscItems = true;
|
||||||
for (const ingredient of meta.ingredients) {
|
for (const ingredient of meta.ingredients) {
|
||||||
|
@ -19,7 +19,6 @@ import { sendWsBroadcastTo } from "@/src/services/webService";
|
|||||||
|
|
||||||
export const sellController: RequestHandler = async (req, res) => {
|
export const sellController: RequestHandler = async (req, res) => {
|
||||||
const payload = JSON.parse(String(req.body)) as ISellRequest;
|
const payload = JSON.parse(String(req.body)) as ISellRequest;
|
||||||
//console.log(JSON.stringify(payload, null, 2));
|
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
const requiredFields = new Set<keyof TInventoryDatabaseDocument>();
|
const requiredFields = new Set<keyof TInventoryDatabaseDocument>();
|
||||||
if (payload.SellCurrency == "SC_RegularCredits") {
|
if (payload.SellCurrency == "SC_RegularCredits") {
|
||||||
@ -59,9 +58,6 @@ export const sellController: RequestHandler = async (req, res) => {
|
|||||||
if (payload.Items.Hoverboards) {
|
if (payload.Items.Hoverboards) {
|
||||||
requiredFields.add(InventorySlot.SPACESUITS);
|
requiredFields.add(InventorySlot.SPACESUITS);
|
||||||
}
|
}
|
||||||
if (payload.Items.CrewMembers) {
|
|
||||||
requiredFields.add(InventorySlot.CREWMEMBERS);
|
|
||||||
}
|
|
||||||
if (payload.Items.CrewShipWeapons || payload.Items.CrewShipWeaponSkins) {
|
if (payload.Items.CrewShipWeapons || payload.Items.CrewShipWeaponSkins) {
|
||||||
requiredFields.add(InventorySlot.RJ_COMPONENT_AND_ARMAMENTS);
|
requiredFields.add(InventorySlot.RJ_COMPONENT_AND_ARMAMENTS);
|
||||||
requiredFields.add("CrewShipRawSalvage");
|
requiredFields.add("CrewShipRawSalvage");
|
||||||
@ -185,17 +181,6 @@ export const sellController: RequestHandler = async (req, res) => {
|
|||||||
inventory.Drones.pull({ _id: sellItem.String });
|
inventory.Drones.pull({ _id: sellItem.String });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (payload.Items.KubrowPetPrints) {
|
|
||||||
payload.Items.KubrowPetPrints.forEach(sellItem => {
|
|
||||||
inventory.KubrowPetPrints.pull({ _id: sellItem.String });
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (payload.Items.CrewMembers) {
|
|
||||||
payload.Items.CrewMembers.forEach(sellItem => {
|
|
||||||
inventory.CrewMembers.pull({ _id: sellItem.String });
|
|
||||||
freeUpSlot(inventory, InventorySlot.CREWMEMBERS);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (payload.Items.CrewShipWeapons) {
|
if (payload.Items.CrewShipWeapons) {
|
||||||
payload.Items.CrewShipWeapons.forEach(sellItem => {
|
payload.Items.CrewShipWeapons.forEach(sellItem => {
|
||||||
if (sellItem.String[0] == "/") {
|
if (sellItem.String[0] == "/") {
|
||||||
@ -318,8 +303,6 @@ interface ISellRequest {
|
|||||||
OperatorAmps?: ISellItem[];
|
OperatorAmps?: ISellItem[];
|
||||||
Hoverboards?: ISellItem[];
|
Hoverboards?: ISellItem[];
|
||||||
Drones?: ISellItem[];
|
Drones?: ISellItem[];
|
||||||
KubrowPetPrints?: ISellItem[];
|
|
||||||
CrewMembers?: ISellItem[];
|
|
||||||
CrewShipWeapons?: ISellItem[];
|
CrewShipWeapons?: ISellItem[];
|
||||||
CrewShipWeaponSkins?: ISellItem[];
|
CrewShipWeaponSkins?: ISellItem[];
|
||||||
};
|
};
|
||||||
|
@ -45,9 +45,9 @@ export const startRecipeController: RequestHandler = async (req, res) => {
|
|||||||
for (let i = 0; i != recipe.ingredients.length; ++i) {
|
for (let i = 0; i != recipe.ingredients.length; ++i) {
|
||||||
if (startRecipeRequest.Ids[i] && startRecipeRequest.Ids[i][0] != "/") {
|
if (startRecipeRequest.Ids[i] && startRecipeRequest.Ids[i][0] != "/") {
|
||||||
if (recipe.ingredients[i].ItemType == "/Lotus/Types/Game/KubrowPet/Eggs/KubrowPetEggItem") {
|
if (recipe.ingredients[i].ItemType == "/Lotus/Types/Game/KubrowPet/Eggs/KubrowPetEggItem") {
|
||||||
const index = inventory.KubrowPetEggs.findIndex(x => x._id.equals(startRecipeRequest.Ids[i]));
|
const index = inventory.KubrowPetEggs!.findIndex(x => x._id.equals(startRecipeRequest.Ids[i]));
|
||||||
if (index != -1) {
|
if (index != -1) {
|
||||||
inventory.KubrowPetEggs.splice(index, 1);
|
inventory.KubrowPetEggs!.splice(index, 1);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const category = ExportWeapons[recipe.ingredients[i].ItemType].productCategory;
|
const category = ExportWeapons[recipe.ingredients[i].ItemType].productCategory;
|
||||||
@ -72,10 +72,6 @@ export const startRecipeController: RequestHandler = async (req, res) => {
|
|||||||
if (recipe.secretIngredientAction == "SIA_CREATE_KUBROW") {
|
if (recipe.secretIngredientAction == "SIA_CREATE_KUBROW") {
|
||||||
inventoryChanges = addKubrowPet(inventory, getRandomElement(recipe.secretIngredients!)!.ItemType);
|
inventoryChanges = addKubrowPet(inventory, getRandomElement(recipe.secretIngredients!)!.ItemType);
|
||||||
pr.KubrowPet = new Types.ObjectId(fromOid(inventoryChanges.KubrowPets![0].ItemId));
|
pr.KubrowPet = new Types.ObjectId(fromOid(inventoryChanges.KubrowPets![0].ItemId));
|
||||||
} else if (recipe.secretIngredientAction == "SIA_DISTILL_PRINT") {
|
|
||||||
pr.KubrowPet = new Types.ObjectId(startRecipeRequest.Ids[recipe.ingredients.length]);
|
|
||||||
const pet = inventory.KubrowPets.id(pr.KubrowPet)!;
|
|
||||||
pet.Details!.PrintsRemaining -= 1;
|
|
||||||
} else if (recipe.secretIngredientAction == "SIA_SPECTRE_LOADOUT_COPY") {
|
} else if (recipe.secretIngredientAction == "SIA_SPECTRE_LOADOUT_COPY") {
|
||||||
const spectreLoadout: ISpectreLoadout = {
|
const spectreLoadout: ISpectreLoadout = {
|
||||||
ItemType: recipe.resultType,
|
ItemType: recipe.resultType,
|
||||||
|
@ -13,7 +13,6 @@ import { getRecipeByResult } from "@/src/services/itemDataService";
|
|||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
|
import { IInventoryChanges } from "@/src/types/purchaseTypes";
|
||||||
import { addInfestedFoundryXP, applyCheatsToInfestedFoundry } from "@/src/services/infestedFoundryService";
|
import { addInfestedFoundryXP, applyCheatsToInfestedFoundry } from "@/src/services/infestedFoundryService";
|
||||||
import { config } from "@/src/services/configService";
|
import { config } from "@/src/services/configService";
|
||||||
import { sendWsBroadcastTo } from "@/src/services/webService";
|
|
||||||
|
|
||||||
export const upgradesController: RequestHandler = async (req, res) => {
|
export const upgradesController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
@ -121,7 +120,6 @@ export const upgradesController: RequestHandler = async (req, res) => {
|
|||||||
setSlotPolarity(item, operation.PolarizeSlot, operation.PolarizeValue);
|
setSlotPolarity(item, operation.PolarizeSlot, operation.PolarizeValue);
|
||||||
item.Polarized ??= 0;
|
item.Polarized ??= 0;
|
||||||
item.Polarized += 1;
|
item.Polarized += 1;
|
||||||
sendWsBroadcastTo(accountId, { update_inventory: true }); // webui may need to to re-add "max rank" button
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "/Lotus/Types/Items/MiscItems/ModSlotUnlocker": {
|
case "/Lotus/Types/Items/MiscItems/ModSlotUnlocker": {
|
||||||
|
@ -7,7 +7,7 @@ export const addItemsController: RequestHandler = async (req, res) => {
|
|||||||
const requests = req.body as IAddItemRequest[];
|
const requests = req.body as IAddItemRequest[];
|
||||||
const inventory = await getInventory(accountId);
|
const inventory = await getInventory(accountId);
|
||||||
for (const request of requests) {
|
for (const request of requests) {
|
||||||
await addItem(inventory, request.ItemType, request.ItemCount, true, undefined, request.Fingerprint, true);
|
await addItem(inventory, request.ItemType, request.ItemCount, true, undefined, undefined, true);
|
||||||
}
|
}
|
||||||
await inventory.save();
|
await inventory.save();
|
||||||
res.end();
|
res.end();
|
||||||
@ -16,5 +16,4 @@ export const addItemsController: RequestHandler = async (req, res) => {
|
|||||||
interface IAddItemRequest {
|
interface IAddItemRequest {
|
||||||
ItemType: string;
|
ItemType: string;
|
||||||
ItemCount: number;
|
ItemCount: number;
|
||||||
Fingerprint?: string;
|
|
||||||
}
|
}
|
||||||
|
@ -55,7 +55,6 @@ interface ItemLists {
|
|||||||
EvolutionProgress: ListedItem[];
|
EvolutionProgress: ListedItem[];
|
||||||
mods: ListedItem[];
|
mods: ListedItem[];
|
||||||
Boosters: ListedItem[];
|
Boosters: ListedItem[];
|
||||||
//circuitGameModes: ListedItem[];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const relicQualitySuffixes: Record<TRelicQuality, string> = {
|
const relicQualitySuffixes: Record<TRelicQuality, string> = {
|
||||||
@ -65,10 +64,6 @@ const relicQualitySuffixes: Record<TRelicQuality, string> = {
|
|||||||
VPQ_PLATINUM: " [Exceptional]"
|
VPQ_PLATINUM: " [Exceptional]"
|
||||||
};
|
};
|
||||||
|
|
||||||
/*const toTitleCase = (str: string): string => {
|
|
||||||
return str.replace(/[^\s-]+/g, word => word.charAt(0).toUpperCase() + word.substr(1).toLowerCase());
|
|
||||||
};*/
|
|
||||||
|
|
||||||
const getItemListsController: RequestHandler = (req, response) => {
|
const getItemListsController: RequestHandler = (req, response) => {
|
||||||
const lang = getDict(typeof req.query.lang == "string" ? req.query.lang : "en");
|
const lang = getDict(typeof req.query.lang == "string" ? req.query.lang : "en");
|
||||||
const res: ItemLists = {
|
const res: ItemLists = {
|
||||||
@ -92,36 +87,6 @@ const getItemListsController: RequestHandler = (req, response) => {
|
|||||||
EvolutionProgress: [],
|
EvolutionProgress: [],
|
||||||
mods: [],
|
mods: [],
|
||||||
Boosters: []
|
Boosters: []
|
||||||
/*circuitGameModes: [
|
|
||||||
{
|
|
||||||
uniqueName: "Survival",
|
|
||||||
name: toTitleCase(getString("/Lotus/Language/Missions/MissionName_Survival", lang))
|
|
||||||
},
|
|
||||||
{
|
|
||||||
uniqueName: "VoidFlood",
|
|
||||||
name: toTitleCase(getString("/Lotus/Language/Missions/MissionName_Corruption", lang))
|
|
||||||
},
|
|
||||||
{
|
|
||||||
uniqueName: "Excavation",
|
|
||||||
name: toTitleCase(getString("/Lotus/Language/Missions/MissionName_Excavation", lang))
|
|
||||||
},
|
|
||||||
{
|
|
||||||
uniqueName: "Defense",
|
|
||||||
name: toTitleCase(getString("/Lotus/Language/Missions/MissionName_Defense", lang))
|
|
||||||
},
|
|
||||||
{
|
|
||||||
uniqueName: "Exterminate",
|
|
||||||
name: toTitleCase(getString("/Lotus/Language/Missions/MissionName_Exterminate", lang))
|
|
||||||
},
|
|
||||||
{
|
|
||||||
uniqueName: "Assassination",
|
|
||||||
name: toTitleCase(getString("/Lotus/Language/Missions/MissionName_Assassination", lang))
|
|
||||||
},
|
|
||||||
{
|
|
||||||
uniqueName: "Alchemy",
|
|
||||||
name: toTitleCase(getString("/Lotus/Language/Missions/MissionName_Alchemy", lang))
|
|
||||||
}
|
|
||||||
]*/
|
|
||||||
};
|
};
|
||||||
for (const [uniqueName, item] of Object.entries(ExportWarframes)) {
|
for (const [uniqueName, item] of Object.entries(ExportWarframes)) {
|
||||||
res[item.productCategory].push({
|
res[item.productCategory].push({
|
||||||
|
@ -1,39 +0,0 @@
|
|||||||
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;
|
|
||||||
}[];
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,19 +1,15 @@
|
|||||||
import { RequestHandler } from "express";
|
import { RequestHandler } from "express";
|
||||||
import { getWorldState, populateDailyDeal, populateFissures } from "@/src/services/worldStateService";
|
import { getWorldState, populateFissures } from "@/src/services/worldStateService";
|
||||||
import { version_compare } from "@/src/helpers/inventoryHelpers";
|
import { version_compare } from "@/src/helpers/inventoryHelpers";
|
||||||
|
|
||||||
export const worldStateController: RequestHandler = async (req, res) => {
|
export const worldStateController: RequestHandler = async (req, res) => {
|
||||||
const buildLabel = req.query.buildLabel as string | undefined;
|
const buildLabel = req.query.buildLabel as string | undefined;
|
||||||
const worldState = getWorldState(buildLabel);
|
const worldState = getWorldState(buildLabel);
|
||||||
|
|
||||||
const populatePromises = [populateDailyDeal(worldState)];
|
|
||||||
|
|
||||||
// Omitting void fissures for versions prior to Dante Unbound to avoid script errors.
|
// Omitting void fissures for versions prior to Dante Unbound to avoid script errors.
|
||||||
if (!buildLabel || version_compare(buildLabel, "2024.03.24.20.00") >= 0) {
|
if (!buildLabel || version_compare(buildLabel, "2024.03.24.20.00") >= 0) {
|
||||||
populatePromises.push(populateFissures(worldState));
|
await populateFissures(worldState);
|
||||||
}
|
}
|
||||||
|
|
||||||
await Promise.all(populatePromises);
|
|
||||||
|
|
||||||
res.json(worldState);
|
res.json(worldState);
|
||||||
};
|
};
|
||||||
|
@ -6,7 +6,6 @@ import { logger } from "@/src/utils/logger";
|
|||||||
import { addMiscItems, combineInventoryChanges } from "@/src/services/inventoryService";
|
import { addMiscItems, combineInventoryChanges } from "@/src/services/inventoryService";
|
||||||
import { handleStoreItemAcquisition } from "@/src/services/purchaseService";
|
import { handleStoreItemAcquisition } from "@/src/services/purchaseService";
|
||||||
import { IInventoryChanges } from "../types/purchaseTypes";
|
import { IInventoryChanges } from "../types/purchaseTypes";
|
||||||
import { config } from "../services/configService";
|
|
||||||
|
|
||||||
export const crackRelic = async (
|
export const crackRelic = async (
|
||||||
inventory: TInventoryDatabaseDocument,
|
inventory: TInventoryDatabaseDocument,
|
||||||
@ -14,14 +13,7 @@ export const crackRelic = async (
|
|||||||
inventoryChanges: IInventoryChanges = {}
|
inventoryChanges: IInventoryChanges = {}
|
||||||
): Promise<IRngResult> => {
|
): Promise<IRngResult> => {
|
||||||
const relic = ExportRelics[participant.VoidProjection];
|
const relic = ExportRelics[participant.VoidProjection];
|
||||||
let weights = refinementToWeights[relic.quality];
|
const weights = refinementToWeights[relic.quality];
|
||||||
if (relic.quality == "VPQ_SILVER" && config.exceptionalRelicsAlwaysGiveBronzeReward) {
|
|
||||||
weights = { COMMON: 1, UNCOMMON: 0, RARE: 0, LEGENDARY: 0 };
|
|
||||||
} else if (relic.quality == "VPQ_GOLD" && config.flawlessRelicsAlwaysGiveSilverReward) {
|
|
||||||
weights = { COMMON: 0, UNCOMMON: 1, RARE: 0, LEGENDARY: 0 };
|
|
||||||
} else if (relic.quality == "VPQ_PLATINUM" && config.radiantRelicsAlwaysGiveGoldReward) {
|
|
||||||
weights = { COMMON: 0, UNCOMMON: 0, RARE: 1, LEGENDARY: 0 };
|
|
||||||
}
|
|
||||||
logger.debug(`opening a relic of quality ${relic.quality}; rarity weights are`, weights);
|
logger.debug(`opening a relic of quality ${relic.quality}; rarity weights are`, weights);
|
||||||
const reward = getRandomWeightedReward(
|
const reward = getRandomWeightedReward(
|
||||||
ExportRewards[relic.rewardManifest][0] as { type: string; itemCount: number; rarity: TRarity }[], // rarity is nullable in PE+ typings, but always present for relics
|
ExportRewards[relic.rewardManifest][0] as { type: string; itemCount: number; rarity: TRarity }[], // rarity is nullable in PE+ typings, but always present for relics
|
||||||
@ -43,13 +35,7 @@ export const crackRelic = async (
|
|||||||
// Give reward
|
// Give reward
|
||||||
combineInventoryChanges(
|
combineInventoryChanges(
|
||||||
inventoryChanges,
|
inventoryChanges,
|
||||||
(
|
(await handleStoreItemAcquisition(reward.type, inventory, reward.itemCount)).InventoryChanges
|
||||||
await handleStoreItemAcquisition(
|
|
||||||
reward.type,
|
|
||||||
inventory,
|
|
||||||
reward.itemCount * (config.relicRewardItemCountMultiplier ?? 1)
|
|
||||||
)
|
|
||||||
).InventoryChanges
|
|
||||||
);
|
);
|
||||||
|
|
||||||
return reward;
|
return reward;
|
||||||
|
@ -28,13 +28,12 @@ import { updateWorldStateCollections } from "./services/worldStateService";
|
|||||||
JSON.stringify = JSONStringify;
|
JSON.stringify = JSONStringify;
|
||||||
|
|
||||||
validateConfig();
|
validateConfig();
|
||||||
|
syncConfigWithDatabase();
|
||||||
|
|
||||||
mongoose
|
mongoose
|
||||||
.connect(config.mongodbUrl)
|
.connect(config.mongodbUrl)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
logger.info("Connected to MongoDB");
|
logger.info("Connected to MongoDB");
|
||||||
syncConfigWithDatabase();
|
|
||||||
|
|
||||||
startWebServer();
|
startWebServer();
|
||||||
|
|
||||||
void updateWorldStateCollections();
|
void updateWorldStateCollections();
|
||||||
|
@ -23,9 +23,7 @@ export interface IMessageDatabase extends IMessage {
|
|||||||
export interface IMessage {
|
export interface IMessage {
|
||||||
sndr: string;
|
sndr: string;
|
||||||
msg: string;
|
msg: string;
|
||||||
cinematic?: string;
|
|
||||||
sub: string;
|
sub: string;
|
||||||
customData?: string;
|
|
||||||
icon?: string;
|
icon?: string;
|
||||||
highPriority?: boolean;
|
highPriority?: boolean;
|
||||||
lowPrioNewPlayers?: boolean;
|
lowPrioNewPlayers?: boolean;
|
||||||
@ -104,9 +102,7 @@ const messageSchema = new Schema<IMessageDatabase>(
|
|||||||
ownerId: Schema.Types.ObjectId,
|
ownerId: Schema.Types.ObjectId,
|
||||||
sndr: String,
|
sndr: String,
|
||||||
msg: String,
|
msg: String,
|
||||||
cinematic: String,
|
|
||||||
sub: String,
|
sub: String,
|
||||||
customData: String,
|
|
||||||
icon: String,
|
icon: String,
|
||||||
highPriority: Boolean,
|
highPriority: Boolean,
|
||||||
lowPrioNewPlayers: Boolean,
|
lowPrioNewPlayers: Boolean,
|
||||||
|
@ -99,9 +99,7 @@ import {
|
|||||||
ILotusCustomization,
|
ILotusCustomization,
|
||||||
IEndlessXpReward,
|
IEndlessXpReward,
|
||||||
IPersonalGoalProgressDatabase,
|
IPersonalGoalProgressDatabase,
|
||||||
IPersonalGoalProgressClient,
|
IPersonalGoalProgressClient
|
||||||
IKubrowPetPrintClient,
|
|
||||||
IKubrowPetPrintDatabase
|
|
||||||
} from "../../types/inventoryTypes/inventoryTypes";
|
} from "../../types/inventoryTypes/inventoryTypes";
|
||||||
import { IOid } from "../../types/commonTypes";
|
import { IOid } from "../../types/commonTypes";
|
||||||
import {
|
import {
|
||||||
@ -1010,27 +1008,6 @@ const traitsSchema = new Schema<ITraits>(
|
|||||||
{ _id: false }
|
{ _id: false }
|
||||||
);
|
);
|
||||||
|
|
||||||
const kubrowPetPrintSchema = new Schema<IKubrowPetPrintDatabase>({
|
|
||||||
ItemType: String,
|
|
||||||
Name: String,
|
|
||||||
IsMale: Boolean,
|
|
||||||
Size: Number,
|
|
||||||
DominantTraits: traitsSchema,
|
|
||||||
RecessiveTraits: traitsSchema
|
|
||||||
});
|
|
||||||
kubrowPetPrintSchema.set("toJSON", {
|
|
||||||
virtuals: true,
|
|
||||||
transform(_doc, obj) {
|
|
||||||
const db = obj as IKubrowPetPrintDatabase;
|
|
||||||
const client = obj as IKubrowPetPrintClient;
|
|
||||||
|
|
||||||
client.ItemId = toOid(db._id);
|
|
||||||
|
|
||||||
delete obj._id;
|
|
||||||
delete obj.__v;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const detailsSchema = new Schema<IKubrowPetDetailsDatabase>(
|
const detailsSchema = new Schema<IKubrowPetDetailsDatabase>(
|
||||||
{
|
{
|
||||||
Name: String,
|
Name: String,
|
||||||
@ -1534,7 +1511,7 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
|
|||||||
|
|
||||||
KubrowPetEggs: [kubrowPetEggSchema],
|
KubrowPetEggs: [kubrowPetEggSchema],
|
||||||
//Prints Cat(3 Prints)\Kubrow(2 Prints) Pets
|
//Prints Cat(3 Prints)\Kubrow(2 Prints) Pets
|
||||||
KubrowPetPrints: [kubrowPetPrintSchema],
|
//KubrowPetPrints: [Schema.Types.Mixed],
|
||||||
|
|
||||||
//Item for EquippedGear example:Scaner,LoadoutTechSummon etc
|
//Item for EquippedGear example:Scaner,LoadoutTechSummon etc
|
||||||
Consumables: [typeCountSchema],
|
Consumables: [typeCountSchema],
|
||||||
@ -1648,9 +1625,6 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
|
|||||||
PendingSpectreLoadouts: { type: [spectreLoadoutsSchema], default: undefined },
|
PendingSpectreLoadouts: { type: [spectreLoadoutsSchema], default: undefined },
|
||||||
SpectreLoadouts: { type: [spectreLoadoutsSchema], default: undefined },
|
SpectreLoadouts: { type: [spectreLoadoutsSchema], default: undefined },
|
||||||
|
|
||||||
//Darvo Deal
|
|
||||||
UsedDailyDeals: [String],
|
|
||||||
|
|
||||||
//New Quest Email
|
//New Quest Email
|
||||||
EmailItems: [typeCountSchema],
|
EmailItems: [typeCountSchema],
|
||||||
|
|
||||||
@ -1767,6 +1741,7 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
|
|||||||
//ChallengeInstanceStates: [Schema.Types.Mixed],
|
//ChallengeInstanceStates: [Schema.Types.Mixed],
|
||||||
RecentVendorPurchases: { type: [recentVendorPurchaseSchema], default: undefined },
|
RecentVendorPurchases: { type: [recentVendorPurchaseSchema], default: undefined },
|
||||||
//Robotics: [Schema.Types.Mixed],
|
//Robotics: [Schema.Types.Mixed],
|
||||||
|
//UsedDailyDeals: [Schema.Types.Mixed],
|
||||||
CollectibleSeries: { type: [collectibleEntrySchema], default: undefined },
|
CollectibleSeries: { type: [collectibleEntrySchema], default: undefined },
|
||||||
HasResetAccount: { type: Boolean, default: false },
|
HasResetAccount: { type: Boolean, default: false },
|
||||||
|
|
||||||
@ -1877,7 +1852,6 @@ export type InventoryDocumentProps = {
|
|||||||
CrewShipSalvagedWeaponSkins: Types.DocumentArray<IUpgradeDatabase>;
|
CrewShipSalvagedWeaponSkins: Types.DocumentArray<IUpgradeDatabase>;
|
||||||
PersonalTechProjects: Types.DocumentArray<IPersonalTechProjectDatabase>;
|
PersonalTechProjects: Types.DocumentArray<IPersonalTechProjectDatabase>;
|
||||||
CrewMembers: Types.DocumentArray<ICrewMemberDatabase>;
|
CrewMembers: Types.DocumentArray<ICrewMemberDatabase>;
|
||||||
KubrowPetPrints: Types.DocumentArray<IKubrowPetPrintDatabase>;
|
|
||||||
} & { [K in TEquipmentKey]: Types.DocumentArray<IEquipmentDatabase> };
|
} & { [K in TEquipmentKey]: Types.DocumentArray<IEquipmentDatabase> };
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { IDailyDealDatabase, IFissureDatabase } from "@/src/types/worldStateTypes";
|
import { IFissureDatabase } from "@/src/types/worldStateTypes";
|
||||||
import { model, Schema } from "mongoose";
|
import { model, Schema } from "mongoose";
|
||||||
|
|
||||||
const fissureSchema = new Schema<IFissureDatabase>({
|
const fissureSchema = new Schema<IFissureDatabase>({
|
||||||
@ -12,19 +12,3 @@ const fissureSchema = new Schema<IFissureDatabase>({
|
|||||||
fissureSchema.index({ Expiry: 1 }, { expireAfterSeconds: 0 }); // With this, MongoDB will automatically delete expired entries.
|
fissureSchema.index({ Expiry: 1 }, { expireAfterSeconds: 0 }); // With this, MongoDB will automatically delete expired entries.
|
||||||
|
|
||||||
export const Fissure = model<IFissureDatabase>("Fissure", fissureSchema);
|
export const Fissure = model<IFissureDatabase>("Fissure", fissureSchema);
|
||||||
|
|
||||||
const dailyDealSchema = new Schema<IDailyDealDatabase>({
|
|
||||||
StoreItem: { type: String, required: true },
|
|
||||||
Activation: { type: Date, required: true },
|
|
||||||
Expiry: { type: Date, required: true },
|
|
||||||
Discount: { type: Number, required: true },
|
|
||||||
OriginalPrice: { type: Number, required: true },
|
|
||||||
SalePrice: { type: Number, required: true },
|
|
||||||
AmountTotal: { type: Number, required: true },
|
|
||||||
AmountSold: { type: Number, required: true }
|
|
||||||
});
|
|
||||||
|
|
||||||
dailyDealSchema.index({ StoreItem: 1 }, { unique: true });
|
|
||||||
dailyDealSchema.index({ Expiry: 1 }, { expireAfterSeconds: 86400 });
|
|
||||||
|
|
||||||
export const DailyDeal = model<IDailyDealDatabase>("DailyDeal", dailyDealSchema);
|
|
||||||
|
@ -24,7 +24,6 @@ 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";
|
||||||
|
|
||||||
@ -54,7 +53,6 @@ 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);
|
||||||
|
@ -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/detailedView", (_req, res) => {
|
webuiRouter.get(/webui\/powersuit\/(.+)/, (_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) => {
|
||||||
|
@ -64,13 +64,8 @@ export interface IConfig {
|
|||||||
noDojoResearchTime?: boolean;
|
noDojoResearchTime?: boolean;
|
||||||
fastClanAscension?: boolean;
|
fastClanAscension?: boolean;
|
||||||
missionsCanGiveAllRelics?: boolean;
|
missionsCanGiveAllRelics?: boolean;
|
||||||
exceptionalRelicsAlwaysGiveBronzeReward?: boolean;
|
|
||||||
flawlessRelicsAlwaysGiveSilverReward?: boolean;
|
|
||||||
radiantRelicsAlwaysGiveGoldReward?: boolean;
|
|
||||||
unlockAllSimarisResearchEntries?: boolean;
|
unlockAllSimarisResearchEntries?: boolean;
|
||||||
disableDailyTribute?: boolean;
|
|
||||||
spoofMasteryRank?: number;
|
spoofMasteryRank?: number;
|
||||||
relicRewardItemCountMultiplier?: number;
|
|
||||||
nightwaveStandingMultiplier?: number;
|
nightwaveStandingMultiplier?: number;
|
||||||
unfaithfulBugFixes?: {
|
unfaithfulBugFixes?: {
|
||||||
ignore1999LastRegionPlayed?: boolean;
|
ignore1999LastRegionPlayed?: boolean;
|
||||||
@ -88,7 +83,6 @@ export interface IConfig {
|
|||||||
nightwaveOverride?: string;
|
nightwaveOverride?: string;
|
||||||
allTheFissures?: string;
|
allTheFissures?: string;
|
||||||
circuitGameModes?: string[];
|
circuitGameModes?: string[];
|
||||||
darvoStockMultiplier?: number;
|
|
||||||
};
|
};
|
||||||
dev?: {
|
dev?: {
|
||||||
keepVendorsExpired?: boolean;
|
keepVendorsExpired?: boolean;
|
||||||
@ -107,13 +101,11 @@ export const config: IConfig = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const loadConfig = (): void => {
|
export const loadConfig = (): void => {
|
||||||
const newConfig = JSON.parse(fs.readFileSync(configPath, "utf-8")) as IConfig;
|
|
||||||
|
|
||||||
// Set all values to undefined now so if the new config.json omits some fields that were previously present, it's correct in-memory.
|
// Set all values to undefined now so if the new config.json omits some fields that were previously present, it's correct in-memory.
|
||||||
for (const key of Object.keys(config)) {
|
for (const key of Object.keys(config)) {
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access
|
||||||
(config as any)[key] = undefined;
|
(config as any)[key] = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
Object.assign(config, newConfig);
|
Object.assign(config, JSON.parse(fs.readFileSync(configPath, "utf-8")));
|
||||||
};
|
};
|
||||||
|
@ -14,8 +14,8 @@ chokidar.watch(configPath).on("change", () => {
|
|||||||
try {
|
try {
|
||||||
loadConfig();
|
loadConfig();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
logger.error("Config changes were not applied: " + (e as Error).message);
|
logger.error("FATAL ERROR: Config failed to be reloaded: " + (e as Error).message);
|
||||||
return;
|
process.exit(1);
|
||||||
}
|
}
|
||||||
validateConfig();
|
validateConfig();
|
||||||
syncConfigWithDatabase();
|
syncConfigWithDatabase();
|
||||||
|
@ -550,19 +550,6 @@ export const processFundedGuildTechProject = (
|
|||||||
guild.XP += recipe.guildXpValue;
|
guild.XP += recipe.guildXpValue;
|
||||||
}
|
}
|
||||||
setGuildTechLogState(guild, techProject.ItemType, config.noDojoResearchTime ? 4 : 3, techProject.CompletionDate);
|
setGuildTechLogState(guild, techProject.ItemType, config.noDojoResearchTime ? 4 : 3, techProject.CompletionDate);
|
||||||
if (config.noDojoResearchTime) {
|
|
||||||
processCompletedGuildTechProject(guild, techProject.ItemType);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const processCompletedGuildTechProject = (guild: TGuildDatabaseDocument, type: string): void => {
|
|
||||||
if (type.startsWith("/Lotus/Levels/ClanDojo/ComponentPropRecipes/NpcPlaceables/")) {
|
|
||||||
guild.VaultDecoRecipes ??= [];
|
|
||||||
guild.VaultDecoRecipes.push({
|
|
||||||
ItemType: type,
|
|
||||||
ItemCount: 1
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export const setGuildTechLogState = (
|
export const setGuildTechLogState = (
|
||||||
|
@ -29,8 +29,7 @@ import {
|
|||||||
ICalendarProgress,
|
ICalendarProgress,
|
||||||
INemesisWeaponTargetFingerprint,
|
INemesisWeaponTargetFingerprint,
|
||||||
INemesisPetTargetFingerprint,
|
INemesisPetTargetFingerprint,
|
||||||
IDialogueDatabase,
|
IDialogueDatabase
|
||||||
IKubrowPetPrintClient
|
|
||||||
} from "@/src/types/inventoryTypes/inventoryTypes";
|
} from "@/src/types/inventoryTypes/inventoryTypes";
|
||||||
import { IGenericUpdate, IUpdateNodeIntrosResponse } from "../types/genericUpdate";
|
import { IGenericUpdate, IUpdateNodeIntrosResponse } from "../types/genericUpdate";
|
||||||
import { IKeyChainRequest, IMissionInventoryUpdateRequest } from "../types/requestTypes";
|
import { IKeyChainRequest, IMissionInventoryUpdateRequest } from "../types/requestTypes";
|
||||||
@ -83,7 +82,7 @@ import { addQuestKey, completeQuest } from "@/src/services/questService";
|
|||||||
import { handleBundleAcqusition } from "./purchaseService";
|
import { handleBundleAcqusition } from "./purchaseService";
|
||||||
import libraryDailyTasks from "@/static/fixed_responses/libraryDailyTasks.json";
|
import libraryDailyTasks from "@/static/fixed_responses/libraryDailyTasks.json";
|
||||||
import { getRandomElement, getRandomInt, getRandomWeightedReward, SRng } from "./rngService";
|
import { getRandomElement, getRandomInt, getRandomWeightedReward, SRng } from "./rngService";
|
||||||
import { createMessage, IMessageCreationTemplate } from "./inboxService";
|
import { createMessage } from "./inboxService";
|
||||||
import { getMaxStanding, getMinStanding } from "@/src/helpers/syndicateStandingHelper";
|
import { getMaxStanding, getMinStanding } from "@/src/helpers/syndicateStandingHelper";
|
||||||
import { getNightwaveSyndicateTag, getWorldState } from "./worldStateService";
|
import { getNightwaveSyndicateTag, getWorldState } from "./worldStateService";
|
||||||
import { ICalendarSeason } from "@/src/types/worldStateTypes";
|
import { ICalendarSeason } from "@/src/types/worldStateTypes";
|
||||||
@ -426,6 +425,7 @@ export const addItem = async (
|
|||||||
ItemType: "/Lotus/Types/Game/KubrowPet/Eggs/KubrowEgg",
|
ItemType: "/Lotus/Types/Game/KubrowPet/Eggs/KubrowEgg",
|
||||||
_id: new Types.ObjectId()
|
_id: new Types.ObjectId()
|
||||||
};
|
};
|
||||||
|
inventory.KubrowPetEggs ??= [];
|
||||||
inventory.KubrowPetEggs.push(egg);
|
inventory.KubrowPetEggs.push(egg);
|
||||||
changes.push({
|
changes.push({
|
||||||
ItemType: egg.ItemType,
|
ItemType: egg.ItemType,
|
||||||
@ -483,16 +483,6 @@ export const addItem = async (
|
|||||||
return addCustomization(inventory, typeName);
|
return addCustomization(inventory, typeName);
|
||||||
}
|
}
|
||||||
if (typeName in ExportUpgrades || typeName in ExportArcanes) {
|
if (typeName in ExportUpgrades || typeName in ExportArcanes) {
|
||||||
if (targetFingerprint) {
|
|
||||||
if (quantity != 1) {
|
|
||||||
logger.warn(`adding 1 of ${typeName} ${targetFingerprint} even tho quantity ${quantity} was requested`);
|
|
||||||
}
|
|
||||||
inventory.Upgrades.push({
|
|
||||||
ItemType: typeName,
|
|
||||||
UpgradeFingerprint: targetFingerprint
|
|
||||||
});
|
|
||||||
return {}; // there's not exactly a common "InventoryChanges" format for these
|
|
||||||
}
|
|
||||||
const changes = [
|
const changes = [
|
||||||
{
|
{
|
||||||
ItemType: typeName,
|
ItemType: typeName,
|
||||||
@ -806,11 +796,7 @@ export const addItem = async (
|
|||||||
typeName.substr(1).split("/")[3] == "CatbrowPet" ||
|
typeName.substr(1).split("/")[3] == "CatbrowPet" ||
|
||||||
typeName.substr(1).split("/")[3] == "KubrowPet"
|
typeName.substr(1).split("/")[3] == "KubrowPet"
|
||||||
) {
|
) {
|
||||||
if (
|
if (typeName != "/Lotus/Types/Game/KubrowPet/Eggs/KubrowPetEggItem") {
|
||||||
typeName != "/Lotus/Types/Game/KubrowPet/Eggs/KubrowPetEggItem" &&
|
|
||||||
typeName != "/Lotus/Types/Game/KubrowPet/BlankTraitPrint" &&
|
|
||||||
typeName != "/Lotus/Types/Game/KubrowPet/ImprintedTraitPrint"
|
|
||||||
) {
|
|
||||||
return addKubrowPet(inventory, typeName, undefined, premiumPurchase);
|
return addKubrowPet(inventory, typeName, undefined, premiumPurchase);
|
||||||
}
|
}
|
||||||
} else if (typeName.startsWith("/Lotus/Types/Game/CrewShip/CrewMember/")) {
|
} else if (typeName.startsWith("/Lotus/Types/Game/CrewShip/CrewMember/")) {
|
||||||
@ -1074,13 +1060,8 @@ export const addKubrowPet = (
|
|||||||
const configs: IItemConfig[] = applyDefaultUpgrades(inventory, kubrowPet?.defaultUpgrades);
|
const configs: IItemConfig[] = applyDefaultUpgrades(inventory, kubrowPet?.defaultUpgrades);
|
||||||
|
|
||||||
if (!details) {
|
if (!details) {
|
||||||
const isCatbrow = [
|
|
||||||
"/Lotus/Types/Game/CatbrowPet/CheshireCatbrowPetPowerSuit",
|
|
||||||
"/Lotus/Types/Game/CatbrowPet/MirrorCatbrowPetPowerSuit",
|
|
||||||
"/Lotus/Types/Game/CatbrowPet/VampireCatbrowPetPowerSuit"
|
|
||||||
].includes(kubrowPetName);
|
|
||||||
|
|
||||||
let traits: ITraits;
|
let traits: ITraits;
|
||||||
|
|
||||||
if (kubrowPetName == "/Lotus/Types/Game/CatbrowPet/VampireCatbrowPetPowerSuit") {
|
if (kubrowPetName == "/Lotus/Types/Game/CatbrowPet/VampireCatbrowPetPowerSuit") {
|
||||||
traits = {
|
traits = {
|
||||||
BaseColor: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorBaseVampire",
|
BaseColor: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorBaseVampire",
|
||||||
@ -1095,7 +1076,12 @@ export const addKubrowPet = (
|
|||||||
Tail: "/Lotus/Types/Game/CatbrowPet/Tails/CatbrowTailVampire"
|
Tail: "/Lotus/Types/Game/CatbrowPet/Tails/CatbrowTailVampire"
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
|
const isCatbrow = [
|
||||||
|
"/Lotus/Types/Game/CatbrowPet/MirrorCatbrowPetPowerSuit",
|
||||||
|
"/Lotus/Types/Game/CatbrowPet/CheshireCatbrowPetPowerSuit"
|
||||||
|
].includes(kubrowPetName);
|
||||||
const traitsPool = isCatbrow ? catbrowDetails : kubrowDetails;
|
const traitsPool = isCatbrow ? catbrowDetails : kubrowDetails;
|
||||||
|
|
||||||
traits = {
|
traits = {
|
||||||
BaseColor: getRandomWeightedReward(traitsPool.Colors, kubrowWeights)!.type,
|
BaseColor: getRandomWeightedReward(traitsPool.Colors, kubrowWeights)!.type,
|
||||||
SecondaryColor: getRandomWeightedReward(traitsPool.Colors, kubrowWeights)!.type,
|
SecondaryColor: getRandomWeightedReward(traitsPool.Colors, kubrowWeights)!.type,
|
||||||
@ -1114,7 +1100,7 @@ export const addKubrowPet = (
|
|||||||
Name: "",
|
Name: "",
|
||||||
IsPuppy: !premiumPurchase,
|
IsPuppy: !premiumPurchase,
|
||||||
HasCollar: true,
|
HasCollar: true,
|
||||||
PrintsRemaining: isCatbrow ? 3 : 2,
|
PrintsRemaining: 3,
|
||||||
Status: premiumPurchase ? Status.StatusStasis : Status.StatusIncubating,
|
Status: premiumPurchase ? Status.StatusStasis : Status.StatusIncubating,
|
||||||
HatchDate: premiumPurchase ? new Date() : new Date(Date.now() + 10 * unixTimesInMs.hour), // On live, this seems to be somewhat randomised so that the pet hatches 9~11 hours after start.
|
HatchDate: premiumPurchase ? new Date() : new Date(Date.now() + 10 * unixTimesInMs.hour), // On live, this seems to be somewhat randomised so that the pet hatches 9~11 hours after start.
|
||||||
IsMale: !!getRandomInt(0, 1),
|
IsMale: !!getRandomInt(0, 1),
|
||||||
@ -1138,26 +1124,6 @@ export const addKubrowPet = (
|
|||||||
return inventoryChanges;
|
return inventoryChanges;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const addKubrowPetPrint = (
|
|
||||||
inventory: TInventoryDatabaseDocument,
|
|
||||||
pet: IEquipmentDatabase,
|
|
||||||
inventoryChanges: IInventoryChanges
|
|
||||||
): void => {
|
|
||||||
inventoryChanges.KubrowPetPrints ??= [];
|
|
||||||
inventoryChanges.KubrowPetPrints.push(
|
|
||||||
inventory.KubrowPetPrints[
|
|
||||||
inventory.KubrowPetPrints.push({
|
|
||||||
ItemType: "/Lotus/Types/Game/KubrowPet/ImprintedTraitPrint",
|
|
||||||
Name: pet.Details!.Name,
|
|
||||||
IsMale: pet.Details!.IsMale,
|
|
||||||
Size: pet.Details!.Size,
|
|
||||||
DominantTraits: pet.Details!.DominantTraits,
|
|
||||||
RecessiveTraits: pet.Details!.RecessiveTraits
|
|
||||||
}) - 1
|
|
||||||
].toJSON<IKubrowPetPrintClient>()
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const updateSlots = (
|
export const updateSlots = (
|
||||||
inventory: TInventoryDatabaseDocument,
|
inventory: TInventoryDatabaseDocument,
|
||||||
slotName: SlotNames,
|
slotName: SlotNames,
|
||||||
@ -1573,22 +1539,7 @@ export const addEmailItem = async (
|
|||||||
const meta = ExportEmailItems[typeName];
|
const meta = ExportEmailItems[typeName];
|
||||||
const emailItem = inventory.EmailItems.find(x => x.ItemType == typeName);
|
const emailItem = inventory.EmailItems.find(x => x.ItemType == typeName);
|
||||||
if (!emailItem || !meta.sendOnlyOnce) {
|
if (!emailItem || !meta.sendOnlyOnce) {
|
||||||
const msg: IMessageCreationTemplate = convertInboxMessage(meta.message);
|
await createMessage(inventory.accountOwnerId, [convertInboxMessage(meta.message)]);
|
||||||
if (msg.cinematic == "/Lotus/Levels/1999/PlayerHomeBalconyCinematics.level") {
|
|
||||||
msg.customData = JSON.stringify({
|
|
||||||
Tag: msg.customData + "KissCin",
|
|
||||||
CinLoadout: {
|
|
||||||
Skins: inventory.AdultOperatorLoadOuts[0].Skins,
|
|
||||||
Upgrades: inventory.AdultOperatorLoadOuts[0].Upgrades,
|
|
||||||
attcol: inventory.AdultOperatorLoadOuts[0].attcol,
|
|
||||||
cloth: inventory.AdultOperatorLoadOuts[0].cloth,
|
|
||||||
eyecol: inventory.AdultOperatorLoadOuts[0].eyecol,
|
|
||||||
pricol: inventory.AdultOperatorLoadOuts[0].pricol,
|
|
||||||
syancol: inventory.AdultOperatorLoadOuts[0].syancol
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
await createMessage(inventory.accountOwnerId, [msg]);
|
|
||||||
|
|
||||||
if (emailItem) {
|
if (emailItem) {
|
||||||
emailItem.ItemCount += 1;
|
emailItem.ItemCount += 1;
|
||||||
|
@ -45,39 +45,6 @@ export type WeaponTypeInternal =
|
|||||||
| "SpecialItems";
|
| "SpecialItems";
|
||||||
|
|
||||||
export const getRecipe = (uniqueName: string): IRecipe | undefined => {
|
export const getRecipe = (uniqueName: string): IRecipe | undefined => {
|
||||||
// Handle crafting of archwing summon for versions prior to 39.0.0 as this blueprint was removed then.
|
|
||||||
if (uniqueName == "/Lotus/Types/Recipes/EidolonRecipes/OpenArchwingSummonBlueprint") {
|
|
||||||
return {
|
|
||||||
resultType: "/Lotus/Types/Restoratives/OpenArchwingSummon",
|
|
||||||
buildPrice: 7500,
|
|
||||||
buildTime: 1800,
|
|
||||||
skipBuildTimePrice: 10,
|
|
||||||
consumeOnUse: false,
|
|
||||||
num: 1,
|
|
||||||
codexSecret: false,
|
|
||||||
alwaysAvailable: true,
|
|
||||||
ingredients: [
|
|
||||||
{
|
|
||||||
ItemType: "/Lotus/Types/Gameplay/Eidolon/Resources/IraditeItem",
|
|
||||||
ItemCount: 50
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ItemType: "/Lotus/Types/Gameplay/Eidolon/Resources/GrokdrulItem",
|
|
||||||
ItemCount: 50
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ItemType: "/Lotus/Types/Items/Fish/Eidolon/FishParts/EidolonFishOilItem",
|
|
||||||
ItemCount: 30
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ItemType: "/Lotus/Types/Items/MiscItems/Circuits",
|
|
||||||
ItemCount: 600
|
|
||||||
}
|
|
||||||
],
|
|
||||||
excludeFromMarket: true
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return ExportRecipes[uniqueName];
|
return ExportRecipes[uniqueName];
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -251,9 +218,7 @@ export const convertInboxMessage = (message: IInboxMessage): IMessage => {
|
|||||||
return {
|
return {
|
||||||
sndr: message.sender,
|
sndr: message.sender,
|
||||||
msg: message.body,
|
msg: message.body,
|
||||||
cinematic: message.cinematic,
|
|
||||||
sub: message.title,
|
sub: message.title,
|
||||||
customData: message.customData,
|
|
||||||
att: message.attachments.length > 0 ? message.attachments : undefined,
|
att: message.attachments.length > 0 ? message.attachments : undefined,
|
||||||
countedAtt: message.countedAttachments.length > 0 ? message.countedAttachments : undefined,
|
countedAtt: message.countedAttachments.length > 0 ? message.countedAttachments : undefined,
|
||||||
icon: message.icon ?? "",
|
icon: message.icon ?? "",
|
||||||
|
@ -525,6 +525,7 @@ export const addMissionInventoryUpdates = async (
|
|||||||
}
|
}
|
||||||
case "KubrowPetEggs": {
|
case "KubrowPetEggs": {
|
||||||
for (const egg of value) {
|
for (const egg of value) {
|
||||||
|
inventory.KubrowPetEggs ??= [];
|
||||||
inventory.KubrowPetEggs.push({
|
inventory.KubrowPetEggs.push({
|
||||||
ItemType: egg.ItemType,
|
ItemType: egg.ItemType,
|
||||||
_id: new Types.ObjectId()
|
_id: new Types.ObjectId()
|
||||||
|
@ -16,8 +16,7 @@ import {
|
|||||||
IPurchaseResponse,
|
IPurchaseResponse,
|
||||||
SlotPurchase,
|
SlotPurchase,
|
||||||
IInventoryChanges,
|
IInventoryChanges,
|
||||||
PurchaseSource,
|
PurchaseSource
|
||||||
IPurchaseParams
|
|
||||||
} from "@/src/types/purchaseTypes";
|
} from "@/src/types/purchaseTypes";
|
||||||
import { logger } from "@/src/utils/logger";
|
import { logger } from "@/src/utils/logger";
|
||||||
import { getWorldState } from "./worldStateService";
|
import { getWorldState } from "./worldStateService";
|
||||||
@ -36,7 +35,6 @@ import {
|
|||||||
import { config } from "./configService";
|
import { config } from "./configService";
|
||||||
import { TInventoryDatabaseDocument } from "../models/inventoryModels/inventoryModel";
|
import { TInventoryDatabaseDocument } from "../models/inventoryModels/inventoryModel";
|
||||||
import { fromStoreItem, toStoreItem } from "./itemDataService";
|
import { fromStoreItem, toStoreItem } from "./itemDataService";
|
||||||
import { DailyDeal } from "../models/worldStateModel";
|
|
||||||
import { fromMongoDate, toMongoDate } from "../helpers/inventoryHelpers";
|
import { fromMongoDate, toMongoDate } from "../helpers/inventoryHelpers";
|
||||||
|
|
||||||
export const getStoreItemCategory = (storeItem: string): string => {
|
export const getStoreItemCategory = (storeItem: string): string => {
|
||||||
@ -273,12 +271,6 @@ export const handlePurchase = async (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PurchaseSource.DailyDeal:
|
|
||||||
if (purchaseRequest.PurchaseParams.ExpectedPrice) {
|
|
||||||
throw new Error(`daily deal purchase should not have an expected price`);
|
|
||||||
}
|
|
||||||
await handleDailyDealPurchase(inventory, purchaseRequest.PurchaseParams, purchaseResponse);
|
|
||||||
break;
|
|
||||||
case PurchaseSource.Vendor:
|
case PurchaseSource.Vendor:
|
||||||
if (purchaseRequest.PurchaseParams.SourceId! in ExportVendors) {
|
if (purchaseRequest.PurchaseParams.SourceId! in ExportVendors) {
|
||||||
const vendor = ExportVendors[purchaseRequest.PurchaseParams.SourceId!];
|
const vendor = ExportVendors[purchaseRequest.PurchaseParams.SourceId!];
|
||||||
@ -367,25 +359,6 @@ const handleItemPrices = (
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export const handleDailyDealPurchase = async (
|
|
||||||
inventory: TInventoryDatabaseDocument,
|
|
||||||
purchaseParams: IPurchaseParams,
|
|
||||||
purchaseResponse: IPurchaseResponse
|
|
||||||
): Promise<void> => {
|
|
||||||
const dailyDeal = (await DailyDeal.findOne({ StoreItem: purchaseParams.StoreItem }))!;
|
|
||||||
dailyDeal.AmountSold += 1;
|
|
||||||
await dailyDeal.save();
|
|
||||||
|
|
||||||
if (!config.dontSubtractPurchasePlatinumCost) {
|
|
||||||
updateCurrency(inventory, dailyDeal.SalePrice, true, purchaseResponse.InventoryChanges);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!config.noVendorPurchaseLimits) {
|
|
||||||
inventory.UsedDailyDeals.push(purchaseParams.StoreItem);
|
|
||||||
purchaseResponse.DailyDealUsed = purchaseParams.StoreItem;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const handleBundleAcqusition = async (
|
export const handleBundleAcqusition = async (
|
||||||
storeItemName: string,
|
storeItemName: string,
|
||||||
inventory: TInventoryDatabaseDocument,
|
inventory: TInventoryDatabaseDocument,
|
||||||
|
@ -167,13 +167,8 @@ export const handleInventoryItemConfigChange = async (
|
|||||||
inventory.LotusCustomization = equipmentChanges.LotusCustomization;
|
inventory.LotusCustomization = equipmentChanges.LotusCustomization;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "ValidNewLoadoutId": {
|
|
||||||
logger.debug(`ignoring ValidNewLoadoutId (${equipmentChanges.ValidNewLoadoutId})`);
|
|
||||||
// seems always equal to the id of loadout config NORMAL[0], likely has no purpose and we're free to ignore it
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default: {
|
default: {
|
||||||
if (equipmentKeys.includes(equipmentName as TEquipmentKey)) {
|
if (equipmentKeys.includes(equipmentName as TEquipmentKey) && equipmentName != "ValidNewLoadoutId") {
|
||||||
logger.debug(`general Item config saved of type ${equipmentName}`, {
|
logger.debug(`general Item config saved of type ${equipmentName}`, {
|
||||||
config: equipment
|
config: equipment
|
||||||
});
|
});
|
||||||
@ -221,7 +216,7 @@ export const handleInventoryItemConfigChange = async (
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
logger.error(`loadout category not implemented, changes will be lost: ${equipmentName}`, {
|
logger.warn(`loadout category not implemented, changes may be lost: ${equipmentName}`, {
|
||||||
config: equipment
|
config: equipment
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -4,8 +4,7 @@ import {
|
|||||||
ISetShipCustomizationsRequest,
|
ISetShipCustomizationsRequest,
|
||||||
IShipDecorationsRequest,
|
IShipDecorationsRequest,
|
||||||
IShipDecorationsResponse,
|
IShipDecorationsResponse,
|
||||||
ISetPlacedDecoInfoRequest,
|
ISetPlacedDecoInfoRequest
|
||||||
TBootLocation
|
|
||||||
} from "@/src/types/shipTypes";
|
} from "@/src/types/shipTypes";
|
||||||
import { logger } from "@/src/utils/logger";
|
import { logger } from "@/src/utils/logger";
|
||||||
import { Types } from "mongoose";
|
import { Types } from "mongoose";
|
||||||
@ -15,7 +14,6 @@ import { Guild } from "../models/guildModel";
|
|||||||
import { hasGuildPermission } from "./guildService";
|
import { hasGuildPermission } from "./guildService";
|
||||||
import { GuildPermission } from "../types/guildTypes";
|
import { GuildPermission } from "../types/guildTypes";
|
||||||
import { ExportResources } from "warframe-public-export-plus";
|
import { ExportResources } from "warframe-public-export-plus";
|
||||||
import { RoomsType, TPersonalRoomsDatabaseDocument } from "../types/personalRoomsTypes";
|
|
||||||
|
|
||||||
export const setShipCustomizations = async (
|
export const setShipCustomizations = async (
|
||||||
accountId: string,
|
accountId: string,
|
||||||
@ -64,12 +62,8 @@ export const handleSetShipDecorations = async (
|
|||||||
throw new Error(`unknown room: ${placedDecoration.Room}`);
|
throw new Error(`unknown room: ${placedDecoration.Room}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
const entry = Object.entries(ExportResources).find(arr => arr[1].deco == placedDecoration.Type);
|
const [itemType, meta] = Object.entries(ExportResources).find(arr => arr[1].deco == placedDecoration.Type)!;
|
||||||
if (!entry) {
|
if (!itemType || meta.capacityCost === undefined) {
|
||||||
throw new Error(`unknown deco type: ${placedDecoration.Type}`);
|
|
||||||
}
|
|
||||||
const [itemType, meta] = entry;
|
|
||||||
if (meta.capacityCost === undefined) {
|
|
||||||
throw new Error(`unknown deco type: ${placedDecoration.Type}`);
|
throw new Error(`unknown deco type: ${placedDecoration.Type}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -189,19 +183,6 @@ export const handleSetShipDecorations = async (
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
const getRoomsForBootLocation = (
|
|
||||||
personalRooms: TPersonalRoomsDatabaseDocument,
|
|
||||||
bootLocation: TBootLocation | undefined
|
|
||||||
): RoomsType[] => {
|
|
||||||
if (bootLocation == "SHOP") {
|
|
||||||
return personalRooms.TailorShop.Rooms;
|
|
||||||
}
|
|
||||||
if (bootLocation == "APARTMENT") {
|
|
||||||
return personalRooms.Apartment.Rooms;
|
|
||||||
}
|
|
||||||
return personalRooms.Ship.Rooms;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const handleSetPlacedDecoInfo = async (accountId: string, req: ISetPlacedDecoInfoRequest): Promise<void> => {
|
export const handleSetPlacedDecoInfo = async (accountId: string, req: ISetPlacedDecoInfoRequest): Promise<void> => {
|
||||||
if (req.GuildId && req.ComponentId) {
|
if (req.GuildId && req.ComponentId) {
|
||||||
const guild = (await Guild.findById(req.GuildId))!;
|
const guild = (await Guild.findById(req.GuildId))!;
|
||||||
@ -216,14 +197,14 @@ export const handleSetPlacedDecoInfo = async (accountId: string, req: ISetPlaced
|
|||||||
|
|
||||||
const personalRooms = await getPersonalRooms(accountId);
|
const personalRooms = await getPersonalRooms(accountId);
|
||||||
|
|
||||||
const room = getRoomsForBootLocation(personalRooms, req.BootLocation).find(room => room.Name === req.Room);
|
const room = personalRooms.Ship.Rooms.find(room => room.Name === req.Room);
|
||||||
if (!room) {
|
if (!room) {
|
||||||
throw new Error(`unknown room: ${req.Room}`);
|
throw new Error("room not found");
|
||||||
}
|
}
|
||||||
|
|
||||||
const placedDeco = room.PlacedDecos.id(req.DecoId);
|
const placedDeco = room.PlacedDecos.id(req.DecoId);
|
||||||
if (!placedDeco) {
|
if (!placedDeco) {
|
||||||
throw new Error(`unknown deco id: ${req.DecoId}`);
|
throw new Error("deco not found");
|
||||||
}
|
}
|
||||||
|
|
||||||
placedDeco.PictureFrameInfo = req.PictureFrameInfo;
|
placedDeco.PictureFrameInfo = req.PictureFrameInfo;
|
||||||
|
@ -4,7 +4,6 @@ import fissureMissions from "@/static/fixed_responses/worldState/fissureMissions
|
|||||||
import sortieTilesets from "@/static/fixed_responses/worldState/sortieTilesets.json";
|
import sortieTilesets from "@/static/fixed_responses/worldState/sortieTilesets.json";
|
||||||
import sortieTilesetMissions from "@/static/fixed_responses/worldState/sortieTilesetMissions.json";
|
import sortieTilesetMissions from "@/static/fixed_responses/worldState/sortieTilesetMissions.json";
|
||||||
import syndicateMissions from "@/static/fixed_responses/worldState/syndicateMissions.json";
|
import syndicateMissions from "@/static/fixed_responses/worldState/syndicateMissions.json";
|
||||||
import darvoDeals from "@/static/fixed_responses/worldState/darvoDeals.json";
|
|
||||||
import { buildConfig } from "@/src/services/buildConfigService";
|
import { buildConfig } from "@/src/services/buildConfigService";
|
||||||
import { unixTimesInMs } from "@/src/constants/timeConstants";
|
import { unixTimesInMs } from "@/src/constants/timeConstants";
|
||||||
import { config } from "@/src/services/configService";
|
import { config } from "@/src/services/configService";
|
||||||
@ -28,7 +27,7 @@ import {
|
|||||||
} from "../types/worldStateTypes";
|
} from "../types/worldStateTypes";
|
||||||
import { toMongoDate, toOid, version_compare } from "../helpers/inventoryHelpers";
|
import { toMongoDate, toOid, version_compare } from "../helpers/inventoryHelpers";
|
||||||
import { logger } from "../utils/logger";
|
import { logger } from "../utils/logger";
|
||||||
import { DailyDeal, Fissure } from "../models/worldStateModel";
|
import { Fissure } from "../models/worldStateModel";
|
||||||
|
|
||||||
const sortieBosses = [
|
const sortieBosses = [
|
||||||
"SORTIE_BOSS_HYENA",
|
"SORTIE_BOSS_HYENA",
|
||||||
@ -1123,7 +1122,6 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
|||||||
GlobalUpgrades: [],
|
GlobalUpgrades: [],
|
||||||
VoidTraders: [],
|
VoidTraders: [],
|
||||||
VoidStorms: [],
|
VoidStorms: [],
|
||||||
DailyDeals: [],
|
|
||||||
EndlessXpChoices: [],
|
EndlessXpChoices: [],
|
||||||
KnownCalendarSeasons: [],
|
KnownCalendarSeasons: [],
|
||||||
...staticWorldState,
|
...staticWorldState,
|
||||||
@ -1563,24 +1561,6 @@ export const populateFissures = async (worldState: IWorldState): Promise<void> =
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export const populateDailyDeal = async (worldState: IWorldState): Promise<void> => {
|
|
||||||
const dailyDeals = await DailyDeal.find({});
|
|
||||||
for (const dailyDeal of dailyDeals) {
|
|
||||||
if (dailyDeal.Expiry.getTime() > Date.now()) {
|
|
||||||
worldState.DailyDeals.push({
|
|
||||||
StoreItem: dailyDeal.StoreItem,
|
|
||||||
Activation: toMongoDate(dailyDeal.Activation),
|
|
||||||
Expiry: toMongoDate(dailyDeal.Expiry),
|
|
||||||
Discount: dailyDeal.Discount,
|
|
||||||
OriginalPrice: dailyDeal.OriginalPrice,
|
|
||||||
SalePrice: dailyDeal.SalePrice,
|
|
||||||
AmountTotal: Math.round(dailyDeal.AmountTotal * (config.worldState?.darvoStockMultiplier ?? 1)),
|
|
||||||
AmountSold: dailyDeal.AmountSold
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const idToBountyCycle = (id: string): number => {
|
export const idToBountyCycle = (id: string): number => {
|
||||||
return Math.trunc((parseInt(id.substring(0, 8), 16) * 1000) / 9000_000);
|
return Math.trunc((parseInt(id.substring(0, 8), 16) * 1000) / 9000_000);
|
||||||
};
|
};
|
||||||
@ -1709,7 +1689,7 @@ const nightwaveTagToSeason: Record<string, number> = {
|
|||||||
RadioLegionSyndicate: 0 // The Wolf of Saturn Six
|
RadioLegionSyndicate: 0 // The Wolf of Saturn Six
|
||||||
};
|
};
|
||||||
|
|
||||||
const updateFissures = async (): Promise<void> => {
|
export const updateWorldStateCollections = async (): Promise<void> => {
|
||||||
const fissures = await Fissure.find();
|
const fissures = await Fissure.find();
|
||||||
|
|
||||||
const activeNodes = new Set<string>();
|
const activeNodes = new Set<string>();
|
||||||
@ -1762,38 +1742,3 @@ const updateFissures = async (): Promise<void> => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const updateDailyDeal = async (): Promise<void> => {
|
|
||||||
let darvoIndex = Math.trunc((Date.now() - 25200000) / (26 * unixTimesInMs.hour));
|
|
||||||
let darvoEnd;
|
|
||||||
do {
|
|
||||||
const darvoStart = darvoIndex * (26 * unixTimesInMs.hour) + 25200000;
|
|
||||||
darvoEnd = darvoStart + 26 * unixTimesInMs.hour;
|
|
||||||
const darvoOid = ((darvoStart / 1000) & 0xffffffff).toString(16).padStart(8, "0") + "adc51a72f7324d95";
|
|
||||||
if (!(await DailyDeal.findById(darvoOid))) {
|
|
||||||
const seed = new SRng(darvoIndex).randomInt(0, 100_000);
|
|
||||||
const rng = new SRng(seed);
|
|
||||||
let deal;
|
|
||||||
do {
|
|
||||||
deal = rng.randomReward(darvoDeals)!; // Using an actual sampling collected over roughly a year because I can't extrapolate an algorithm from it with enough certainty.
|
|
||||||
//const [storeItem, meta] = rng.randomElement(Object.entries(darvoDeals))!;
|
|
||||||
//const discount = Math.min(rng.randomInt(1, 9) * 10, (meta as { MaxDiscount?: number }).MaxDiscount ?? 1);
|
|
||||||
} while (await DailyDeal.exists({ StoreItem: deal.StoreItem }));
|
|
||||||
await DailyDeal.insertOne({
|
|
||||||
_id: darvoOid,
|
|
||||||
StoreItem: deal.StoreItem,
|
|
||||||
Activation: new Date(darvoStart),
|
|
||||||
Expiry: new Date(darvoEnd),
|
|
||||||
Discount: deal.Discount,
|
|
||||||
OriginalPrice: deal.OriginalPrice,
|
|
||||||
SalePrice: deal.SalePrice, //Math.trunc(deal.OriginalPrice * (1 - discount))
|
|
||||||
AmountTotal: deal.AmountTotal,
|
|
||||||
AmountSold: 0
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} while (darvoEnd < Date.now() + 6 * unixTimesInMs.minute && ++darvoIndex);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const updateWorldStateCollections = async (): Promise<void> => {
|
|
||||||
await Promise.all([updateFissures(), updateDailyDeal()]);
|
|
||||||
};
|
|
||||||
|
@ -40,7 +40,6 @@ export interface IInventoryDatabase
|
|||||||
| "InfestedFoundry"
|
| "InfestedFoundry"
|
||||||
| "DialogueHistory"
|
| "DialogueHistory"
|
||||||
| "KubrowPetEggs"
|
| "KubrowPetEggs"
|
||||||
| "KubrowPetPrints"
|
|
||||||
| "PendingCoupon"
|
| "PendingCoupon"
|
||||||
| "Drones"
|
| "Drones"
|
||||||
| "RecentVendorPurchases"
|
| "RecentVendorPurchases"
|
||||||
@ -80,8 +79,7 @@ export interface IInventoryDatabase
|
|||||||
KahlLoadOuts: IOperatorConfigDatabase[];
|
KahlLoadOuts: IOperatorConfigDatabase[];
|
||||||
InfestedFoundry?: IInfestedFoundryDatabase;
|
InfestedFoundry?: IInfestedFoundryDatabase;
|
||||||
DialogueHistory?: IDialogueHistoryDatabase;
|
DialogueHistory?: IDialogueHistoryDatabase;
|
||||||
KubrowPetEggs: IKubrowPetEggDatabase[];
|
KubrowPetEggs?: IKubrowPetEggDatabase[];
|
||||||
KubrowPetPrints: IKubrowPetPrintDatabase[];
|
|
||||||
PendingCoupon?: IPendingCouponDatabase;
|
PendingCoupon?: IPendingCouponDatabase;
|
||||||
Drones: IDroneDatabase[];
|
Drones: IDroneDatabase[];
|
||||||
RecentVendorPurchases?: IRecentVendorPurchaseDatabase[];
|
RecentVendorPurchases?: IRecentVendorPurchaseDatabase[];
|
||||||
@ -289,7 +287,6 @@ export interface IInventoryClient extends IDailyAffiliations, InventoryClientEqu
|
|||||||
ArchwingEnabled?: boolean;
|
ArchwingEnabled?: boolean;
|
||||||
PendingSpectreLoadouts?: ISpectreLoadout[];
|
PendingSpectreLoadouts?: ISpectreLoadout[];
|
||||||
SpectreLoadouts?: ISpectreLoadout[];
|
SpectreLoadouts?: ISpectreLoadout[];
|
||||||
UsedDailyDeals: string[];
|
|
||||||
EmailItems: ITypeCount[];
|
EmailItems: ITypeCount[];
|
||||||
CompletedSyndicates: string[];
|
CompletedSyndicates: string[];
|
||||||
FocusXP?: IFocusXP;
|
FocusXP?: IFocusXP;
|
||||||
@ -309,7 +306,7 @@ export interface IInventoryClient extends IDailyAffiliations, InventoryClientEqu
|
|||||||
FocusUpgrades: IFocusUpgrade[];
|
FocusUpgrades: IFocusUpgrade[];
|
||||||
HasContributedToDojo?: boolean;
|
HasContributedToDojo?: boolean;
|
||||||
HWIDProtectEnabled?: boolean;
|
HWIDProtectEnabled?: boolean;
|
||||||
KubrowPetPrints: IKubrowPetPrintClient[];
|
//KubrowPetPrints: IKubrowPetPrint[];
|
||||||
AlignmentReplay?: IAlignment;
|
AlignmentReplay?: IAlignment;
|
||||||
PersonalGoalProgress?: IPersonalGoalProgressClient[];
|
PersonalGoalProgress?: IPersonalGoalProgressClient[];
|
||||||
ThemeStyle: string;
|
ThemeStyle: string;
|
||||||
@ -354,6 +351,7 @@ export interface IInventoryClient extends IDailyAffiliations, InventoryClientEqu
|
|||||||
//LeagueTickets: any[];
|
//LeagueTickets: any[];
|
||||||
//Quests: any[];
|
//Quests: any[];
|
||||||
//Robotics: any[];
|
//Robotics: any[];
|
||||||
|
//UsedDailyDeals: any[];
|
||||||
LibraryPersonalTarget?: string;
|
LibraryPersonalTarget?: string;
|
||||||
LibraryPersonalProgress: ILibraryPersonalProgress[];
|
LibraryPersonalProgress: ILibraryPersonalProgress[];
|
||||||
CollectibleSeries?: ICollectibleEntry[];
|
CollectibleSeries?: ICollectibleEntry[];
|
||||||
@ -725,8 +723,8 @@ export interface IKubrowPetEggDatabase {
|
|||||||
_id: Types.ObjectId;
|
_id: Types.ObjectId;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IKubrowPetPrintClient {
|
export interface IKubrowPetPrint {
|
||||||
ItemType: "/Lotus/Types/Game/KubrowPet/ImprintedTraitPrint";
|
ItemType: KubrowPetPrintItemType;
|
||||||
Name: string;
|
Name: string;
|
||||||
IsMale: boolean;
|
IsMale: boolean;
|
||||||
Size: number; // seems to be 0.7 to 1.0
|
Size: number; // seems to be 0.7 to 1.0
|
||||||
@ -736,10 +734,6 @@ export interface IKubrowPetPrintClient {
|
|||||||
InheritedModularParts?: any[];
|
InheritedModularParts?: any[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IKubrowPetPrintDatabase extends Omit<IKubrowPetPrintClient, "ItemId" | "InheritedModularParts"> {
|
|
||||||
_id: Types.ObjectId;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ITraits {
|
export interface ITraits {
|
||||||
BaseColor: string;
|
BaseColor: string;
|
||||||
SecondaryColor: string;
|
SecondaryColor: string;
|
||||||
@ -753,11 +747,15 @@ export interface ITraits {
|
|||||||
Tail?: string;
|
Tail?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export enum KubrowPetPrintItemType {
|
||||||
|
LotusTypesGameKubrowPetImprintedTraitPrint = "/Lotus/Types/Game/KubrowPet/ImprintedTraitPrint"
|
||||||
|
}
|
||||||
|
|
||||||
export interface IKubrowPetDetailsDatabase {
|
export interface IKubrowPetDetailsDatabase {
|
||||||
Name?: string;
|
Name?: string;
|
||||||
IsPuppy?: boolean;
|
IsPuppy?: boolean;
|
||||||
HasCollar: boolean;
|
HasCollar: boolean;
|
||||||
PrintsRemaining: number;
|
PrintsRemaining?: number;
|
||||||
Status: Status;
|
Status: Status;
|
||||||
HatchDate?: Date;
|
HatchDate?: Date;
|
||||||
DominantTraits: ITraits;
|
DominantTraits: ITraits;
|
||||||
|
@ -7,8 +7,7 @@ import {
|
|||||||
ITypeCount,
|
ITypeCount,
|
||||||
IRecentVendorPurchaseClient,
|
IRecentVendorPurchaseClient,
|
||||||
TEquipmentKey,
|
TEquipmentKey,
|
||||||
ICrewMemberClient,
|
ICrewMemberClient
|
||||||
IKubrowPetPrintClient
|
|
||||||
} from "./inventoryTypes/inventoryTypes";
|
} from "./inventoryTypes/inventoryTypes";
|
||||||
|
|
||||||
export enum PurchaseSource {
|
export enum PurchaseSource {
|
||||||
@ -79,7 +78,6 @@ export type IInventoryChanges = {
|
|||||||
NewVendorPurchase?: IRecentVendorPurchaseClient; // >= 38.5.0
|
NewVendorPurchase?: IRecentVendorPurchaseClient; // >= 38.5.0
|
||||||
RecentVendorPurchases?: IRecentVendorPurchaseClient; // < 38.5.0
|
RecentVendorPurchases?: IRecentVendorPurchaseClient; // < 38.5.0
|
||||||
CrewMembers?: ICrewMemberClient[];
|
CrewMembers?: ICrewMemberClient[];
|
||||||
KubrowPetPrints?: IKubrowPetPrintClient[];
|
|
||||||
} & Record<
|
} & Record<
|
||||||
Exclude<
|
Exclude<
|
||||||
string,
|
string,
|
||||||
@ -107,7 +105,6 @@ export interface IPurchaseResponse {
|
|||||||
Standing?: IAffiliationMods[];
|
Standing?: IAffiliationMods[];
|
||||||
FreeFavorsUsed?: IAffiliationMods[];
|
FreeFavorsUsed?: IAffiliationMods[];
|
||||||
BoosterPackItems?: string;
|
BoosterPackItems?: string;
|
||||||
DailyDealUsed?: string;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export type IBinChanges = {
|
export type IBinChanges = {
|
||||||
|
@ -154,7 +154,7 @@ export interface ISetPlacedDecoInfoRequest {
|
|||||||
DecoId: string;
|
DecoId: string;
|
||||||
Room: string;
|
Room: string;
|
||||||
PictureFrameInfo: IPictureFrameInfo;
|
PictureFrameInfo: IPictureFrameInfo;
|
||||||
BootLocation?: TBootLocation;
|
BootLocation?: string;
|
||||||
ComponentId?: string;
|
ComponentId?: string;
|
||||||
GuildId?: string;
|
GuildId?: string;
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,6 @@ export interface IWorldState {
|
|||||||
NodeOverrides: INodeOverride[];
|
NodeOverrides: INodeOverride[];
|
||||||
VoidTraders: IVoidTrader[];
|
VoidTraders: IVoidTrader[];
|
||||||
VoidStorms: IVoidStorm[];
|
VoidStorms: IVoidStorm[];
|
||||||
DailyDeals: IDailyDeal[];
|
|
||||||
PVPChallengeInstances: IPVPChallengeInstance[];
|
PVPChallengeInstances: IPVPChallengeInstance[];
|
||||||
EndlessXpChoices: IEndlessXpChoice[];
|
EndlessXpChoices: IEndlessXpChoice[];
|
||||||
SeasonInfo?: {
|
SeasonInfo?: {
|
||||||
@ -171,28 +170,6 @@ export interface IVoidStorm {
|
|||||||
ActiveMissionTier: string;
|
ActiveMissionTier: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IDailyDeal {
|
|
||||||
StoreItem: string;
|
|
||||||
Activation: IMongoDate;
|
|
||||||
Expiry: IMongoDate;
|
|
||||||
Discount: number;
|
|
||||||
OriginalPrice: number;
|
|
||||||
SalePrice: number;
|
|
||||||
AmountTotal: number;
|
|
||||||
AmountSold: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface IDailyDealDatabase {
|
|
||||||
StoreItem: string;
|
|
||||||
Activation: Date;
|
|
||||||
Expiry: Date;
|
|
||||||
Discount: number;
|
|
||||||
OriginalPrice: number;
|
|
||||||
SalePrice: number;
|
|
||||||
AmountTotal: number;
|
|
||||||
AmountSold: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface IPVPChallengeInstance {
|
export interface IPVPChallengeInstance {
|
||||||
_id: IOid;
|
_id: IOid;
|
||||||
challengeTypeRefID: string;
|
challengeTypeRefID: string;
|
||||||
|
@ -92,13 +92,5 @@
|
|||||||
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/ThumperTrophySilverRecipe",
|
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/ThumperTrophySilverRecipe",
|
||||||
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/CorpusPlaceables/GasTurbineConeRecipe",
|
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/CorpusPlaceables/GasTurbineConeRecipe",
|
||||||
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/NaturalPlaceables/CoralChunkARecipe",
|
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/NaturalPlaceables/CoralChunkARecipe",
|
||||||
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/TennoPlaceables/TnoBeaconEmitterRecipe",
|
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/TennoPlaceables/TnoBeaconEmitterRecipe"
|
||||||
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/NpcPlaceables/OstronFemaleSitting",
|
|
||||||
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/NpcPlaceables/OstronFemaleStanding",
|
|
||||||
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/NpcPlaceables/OstronMaleStanding",
|
|
||||||
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/NpcPlaceables/OstronMaleStandingTwo",
|
|
||||||
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/NpcPlaceables/SolarisForeman",
|
|
||||||
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/NpcPlaceables/SolarisHazard",
|
|
||||||
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/NpcPlaceables/SolarisStrikerOne",
|
|
||||||
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/NpcPlaceables/SolarisStrikerThree"
|
|
||||||
]
|
]
|
||||||
|
@ -1,158 +0,0 @@
|
|||||||
[
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Powersuits/Archwing/DemolitionJetPack/DemolitionJetPack", "Discount": 60, "OriginalPrice": 275, "SalePrice": 110, "AmountTotal": 300, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Powersuits/Bard/Bard", "Discount": 30, "OriginalPrice": 225, "SalePrice": 157, "AmountTotal": 100, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Powersuits/Ember/Ember", "Discount": 30, "OriginalPrice": 225, "SalePrice": 157, "AmountTotal": 100, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Powersuits/Ember/Ember", "Discount": 60, "OriginalPrice": 225, "SalePrice": 90, "AmountTotal": 100, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Powersuits/Magician/Magician", "Discount": 20, "OriginalPrice": 200, "SalePrice": 160, "AmountTotal": 200, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Powersuits/Magician/Magician", "Discount": 30, "OriginalPrice": 200, "SalePrice": 140, "AmountTotal": 200, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Powersuits/Magician/Magician", "Discount": 40, "OriginalPrice": 200, "SalePrice": 120, "AmountTotal": 200, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Powersuits/Magician/Magician", "Discount": 50, "OriginalPrice": 200, "SalePrice": 100, "AmountTotal": 200, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Powersuits/Sandman/Sandman", "Discount": 20, "OriginalPrice": 225, "SalePrice": 180, "AmountTotal": 100, "probability": 4 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Powersuits/Sandman/Sandman", "Discount": 30, "OriginalPrice": 225, "SalePrice": 157, "AmountTotal": 100, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Powersuits/Trapper/Trapper", "Discount": 40, "OriginalPrice": 300, "SalePrice": 180, "AmountTotal": 150, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Powersuits/Trapper/Trapper", "Discount": 50, "OriginalPrice": 300, "SalePrice": 150, "AmountTotal": 100, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Types/Game/CatbrowPet/CatbrowGeneticSignature", "Discount": 20, "OriginalPrice": 5, "SalePrice": 4, "AmountTotal": 500, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Types/Game/CatbrowPet/CatbrowGeneticSignature", "Discount": 30, "OriginalPrice": 5, "SalePrice": 3, "AmountTotal": 415, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Types/Game/KubrowPet/Eggs/KubrowEgg", "Discount": 50, "OriginalPrice": 10, "SalePrice": 5, "AmountTotal": 100, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Types/Game/KubrowPet/Eggs/KubrowEgg", "Discount": 60, "OriginalPrice": 10, "SalePrice": 4, "AmountTotal": 100, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/Forma", "Discount": 30, "OriginalPrice": 20, "SalePrice": 14, "AmountTotal": 150, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/Forma", "Discount": 45, "OriginalPrice": 20, "SalePrice": 11, "AmountTotal": 150, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/OrokinReactor", "Discount": 40, "OriginalPrice": 20, "SalePrice": 12, "AmountTotal": 100, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Types/Items/Research/BioComponent", "Discount": 10, "OriginalPrice": 10, "SalePrice": 9, "AmountTotal": 200, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Types/Items/Research/BioComponent", "Discount": 20, "OriginalPrice": 10, "SalePrice": 8, "AmountTotal": 165, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Types/Items/Research/BioComponent", "Discount": 30, "OriginalPrice": 10, "SalePrice": 7, "AmountTotal": 135, "probability": 5 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Types/Items/Research/BioComponent", "Discount": 40, "OriginalPrice": 10, "SalePrice": 6, "AmountTotal": 100, "probability": 5 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Types/Items/Research/ChemComponent", "Discount": 10, "OriginalPrice": 10, "SalePrice": 9, "AmountTotal": 200, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Types/Items/Research/ChemComponent", "Discount": 20, "OriginalPrice": 10, "SalePrice": 8, "AmountTotal": 165, "probability": 5 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Types/Items/Research/ChemComponent", "Discount": 30, "OriginalPrice": 10, "SalePrice": 7, "AmountTotal": 135, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Types/Items/Research/EnergyComponent", "Discount": 10, "OriginalPrice": 10, "SalePrice": 9, "AmountTotal": 200, "probability": 5 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Types/Items/Research/EnergyComponent", "Discount": 20, "OriginalPrice": 10, "SalePrice": 8, "AmountTotal": 165, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Types/Items/Research/EnergyComponent", "Discount": 30, "OriginalPrice": 10, "SalePrice": 7, "AmountTotal": 135, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Types/Items/Research/EnergyComponent", "Discount": 40, "OriginalPrice": 10, "SalePrice": 6, "AmountTotal": 100, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Upgrades/Focus/AttackLensGreater", "Discount": 10, "OriginalPrice": 40, "SalePrice": 36, "AmountTotal": 150, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Upgrades/Focus/AttackLensGreater", "Discount": 20, "OriginalPrice": 40, "SalePrice": 32, "AmountTotal": 125, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Upgrades/Focus/AttackLensGreater", "Discount": 40, "OriginalPrice": 40, "SalePrice": 24, "AmountTotal": 75, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Upgrades/Focus/DefenseLensGreater", "Discount": 10, "OriginalPrice": 40, "SalePrice": 36, "AmountTotal": 150, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Upgrades/Focus/DefenseLensGreater", "Discount": 40, "OriginalPrice": 40, "SalePrice": 24, "AmountTotal": 75, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Upgrades/Focus/DefenseLensGreater", "Discount": 50, "OriginalPrice": 40, "SalePrice": 20, "AmountTotal": 50, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Upgrades/Focus/PowerLensGreater", "Discount": 50, "OriginalPrice": 40, "SalePrice": 20, "AmountTotal": 50, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Upgrades/Focus/TacticLensGreater", "Discount": 10, "OriginalPrice": 40, "SalePrice": 36, "AmountTotal": 150, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Upgrades/Focus/TacticLensGreater", "Discount": 20, "OriginalPrice": 40, "SalePrice": 32, "AmountTotal": 125, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Upgrades/Focus/TacticLensGreater", "Discount": 30, "OriginalPrice": 40, "SalePrice": 28, "AmountTotal": 100, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Upgrades/Focus/TacticLensGreater", "Discount": 40, "OriginalPrice": 40, "SalePrice": 24, "AmountTotal": 75, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Upgrades/Focus/TacticLensGreater", "Discount": 50, "OriginalPrice": 40, "SalePrice": 20, "AmountTotal": 50, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Upgrades/Focus/WardLensGreater", "Discount": 40, "OriginalPrice": 40, "SalePrice": 24, "AmountTotal": 75, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Bow/Longbow/CrpBow", "Discount": 20, "OriginalPrice": 235, "SalePrice": 188, "AmountTotal": 300, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Bow/Longbow/CrpBow", "Discount": 30, "OriginalPrice": 235, "SalePrice": 164, "AmountTotal": 250, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Bow/Longbow/CrpBow", "Discount": 50, "OriginalPrice": 235, "SalePrice": 117, "AmountTotal": 150, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Bow/Longbow/CrpBow", "Discount": 60, "OriginalPrice": 235, "SalePrice": 94, "AmountTotal": 100, "probability": 5 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Melee/KickAndPunch/KickPunchWeapon", "Discount": 20, "OriginalPrice": 125, "SalePrice": 100, "AmountTotal": 100, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Melee/KickAndPunch/KickPunchWeapon", "Discount": 30, "OriginalPrice": 125, "SalePrice": 87, "AmountTotal": 90, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Melee/KickAndPunch/KickPunchWeapon", "Discount": 60, "OriginalPrice": 125, "SalePrice": 50, "AmountTotal": 65, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Pistols/CorpusMinigun/CorpusMinigun", "Discount": 30, "OriginalPrice": 175, "SalePrice": 122, "AmountTotal": 100, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Pistols/CorpusMinigun/CorpusMinigun", "Discount": 40, "OriginalPrice": 175, "SalePrice": 105, "AmountTotal": 90, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Pistols/CorpusMinigun/CorpusMinigun", "Discount": 50, "OriginalPrice": 175, "SalePrice": 87, "AmountTotal": 80, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Pistols/CorpusMinigun/CorpusMinigun", "Discount": 60, "OriginalPrice": 175, "SalePrice": 70, "AmountTotal": 70, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Pistols/CorpusMinigun/CorpusMinigun", "Discount": 70, "OriginalPrice": 175, "SalePrice": 52, "AmountTotal": 60, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Grineer/GrineerPistol/GrineerLightPistol", "Discount": 10, "OriginalPrice": 75, "SalePrice": 67, "AmountTotal": 100, "probability": 6 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Grineer/GrineerPistol/GrineerLightPistol", "Discount": 20, "OriginalPrice": 75, "SalePrice": 60, "AmountTotal": 100, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Grineer/GrineerPistol/GrineerLightPistol", "Discount": 30, "OriginalPrice": 75, "SalePrice": 52, "AmountTotal": 100, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Grineer/LongGuns/BurstRifle/GrnBurstRifle", "Discount": 30, "OriginalPrice": 225, "SalePrice": 157, "AmountTotal": 500, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Grineer/LongGuns/BurstRifle/GrnBurstRifle", "Discount": 40, "OriginalPrice": 225, "SalePrice": 135, "AmountTotal": 500, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Grineer/LongGuns/BurstRifle/GrnBurstRifle", "Discount": 60, "OriginalPrice": 225, "SalePrice": 90, "AmountTotal": 500, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Grineer/LongGuns/GrnSpark/GrnSparkRifle", "Discount": 20, "OriginalPrice": 150, "SalePrice": 120, "AmountTotal": 300, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Grineer/LongGuns/GrnSpark/GrnSparkRifle", "Discount": 30, "OriginalPrice": 150, "SalePrice": 105, "AmountTotal": 250, "probability": 4 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Grineer/LongGuns/GrnSpark/GrnSparkRifle", "Discount": 50, "OriginalPrice": 150, "SalePrice": 75, "AmountTotal": 150, "probability": 4 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Grineer/Melee/GrineerMachetteAndCleaver/DualCleaverWeapon", "Discount": 30, "OriginalPrice": 225, "SalePrice": 157, "AmountTotal": 200, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Grineer/Melee/GrineerMachetteAndCleaver/DualCleaverWeapon", "Discount": 40, "OriginalPrice": 225, "SalePrice": 135, "AmountTotal": 175, "probability": 4 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Grineer/Melee/GrineerMachetteAndCleaver/DualCleaverWeapon", "Discount": 50, "OriginalPrice": 225, "SalePrice": 112, "AmountTotal": 150, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Grineer/Melee/GrineerMachetteAndCleaver/DualCleaverWeapon", "Discount": 60, "OriginalPrice": 225, "SalePrice": 90, "AmountTotal": 125, "probability": 5 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Grineer/Melee/GrineerMachetteAndCleaver/DualCleaverWeapon", "Discount": 70, "OriginalPrice": 225, "SalePrice": 67, "AmountTotal": 100, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Infested/Melee/Swords/Mire/MireSword", "Discount": 10, "OriginalPrice": 150, "SalePrice": 135, "AmountTotal": 300, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Infested/Melee/Swords/Mire/MireSword", "Discount": 20, "OriginalPrice": 150, "SalePrice": 120, "AmountTotal": 270, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Infested/Melee/Swords/Mire/MireSword", "Discount": 30, "OriginalPrice": 150, "SalePrice": 105, "AmountTotal": 240, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Infested/Melee/Swords/Mire/MireSword", "Discount": 40, "OriginalPrice": 150, "SalePrice": 90, "AmountTotal": 205, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Infested/Melee/Swords/Mire/MireSword", "Discount": 60, "OriginalPrice": 150, "SalePrice": 60, "AmountTotal": 145, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Infested/Melee/Swords/Mire/MireSword", "Discount": 80, "OriginalPrice": 150, "SalePrice": 30, "AmountTotal": 80, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Akimbo/AkimboShotGun", "Discount": 20, "OriginalPrice": 225, "SalePrice": 180, "AmountTotal": 200, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Akimbo/AkimboShotGun", "Discount": 40, "OriginalPrice": 225, "SalePrice": 135, "AmountTotal": 165, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Akimbo/AkimboShotGun", "Discount": 50, "OriginalPrice": 225, "SalePrice": 112, "AmountTotal": 150, "probability": 5 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Dagger/Dagger", "Discount": 30, "OriginalPrice": 75, "SalePrice": 52, "AmountTotal": 350, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Dagger/Dagger", "Discount": 40, "OriginalPrice": 75, "SalePrice": 45, "AmountTotal": 300, "probability": 7 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Dagger/Dagger", "Discount": 50, "OriginalPrice": 75, "SalePrice": 37, "AmountTotal": 250, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Dagger/Dagger", "Discount": 60, "OriginalPrice": 75, "SalePrice": 30, "AmountTotal": 200, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/DualShortSword/DualHeatSwords", "Discount": 30, "OriginalPrice": 175, "SalePrice": 122, "AmountTotal": 200, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/DualShortSword/DualHeatSwords", "Discount": 70, "OriginalPrice": 175, "SalePrice": 52, "AmountTotal": 200, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Fist/Fist", "Discount": 10, "OriginalPrice": 125, "SalePrice": 112, "AmountTotal": 500, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Fist/Fist", "Discount": 20, "OriginalPrice": 125, "SalePrice": 100, "AmountTotal": 250, "probability": 6 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Gauntlet/Gauntlet", "Discount": 20, "OriginalPrice": 125, "SalePrice": 100, "AmountTotal": 100, "probability": 5 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Gauntlet/Gauntlet", "Discount": 30, "OriginalPrice": 125, "SalePrice": 87, "AmountTotal": 125, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Gauntlet/Gauntlet", "Discount": 40, "OriginalPrice": 125, "SalePrice": 75, "AmountTotal": 150, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Glaives/Boomerang/BoomerangWeapon", "Discount": 30, "OriginalPrice": 150, "SalePrice": 105, "AmountTotal": 300, "probability": 4 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Glaives/Boomerang/BoomerangWeapon", "Discount": 40, "OriginalPrice": 150, "SalePrice": 90, "AmountTotal": 250, "probability": 4 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Glaives/Boomerang/BoomerangWeapon", "Discount": 50, "OriginalPrice": 150, "SalePrice": 75, "AmountTotal": 200, "probability": 5 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Hammer/IceHammer/IceHammer", "Discount": 20, "OriginalPrice": 165, "SalePrice": 132, "AmountTotal": 300, "probability": 4 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Hammer/IceHammer/IceHammer", "Discount": 30, "OriginalPrice": 165, "SalePrice": 115, "AmountTotal": 250, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Hammer/IceHammer/IceHammer", "Discount": 40, "OriginalPrice": 165, "SalePrice": 99, "AmountTotal": 200, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Hammer/IceHammer/IceHammer", "Discount": 50, "OriginalPrice": 165, "SalePrice": 82, "AmountTotal": 150, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Hammer/IceHammer/IceHammer", "Discount": 60, "OriginalPrice": 165, "SalePrice": 66, "AmountTotal": 100, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/LongSword/LongSword", "Discount": 50, "OriginalPrice": 150, "SalePrice": 75, "AmountTotal": 300, "probability": 4 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/LongSword/LongSword", "Discount": 60, "OriginalPrice": 150, "SalePrice": 60, "AmountTotal": 265, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/LongSword/LongSword", "Discount": 70, "OriginalPrice": 150, "SalePrice": 45, "AmountTotal": 225, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/LongSword/LongSword", "Discount": 90, "OriginalPrice": 150, "SalePrice": 15, "AmountTotal": 150, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Scythe/EtherScytheWeapon", "Discount": 40, "OriginalPrice": 230, "SalePrice": 138, "AmountTotal": 250, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Scythe/EtherScytheWeapon", "Discount": 60, "OriginalPrice": 230, "SalePrice": 92, "AmountTotal": 150, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Swords/GreatSword/TennoGreatSword", "Discount": 20, "OriginalPrice": 175, "SalePrice": 140, "AmountTotal": 100, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Swords/GreatSword/TennoGreatSword", "Discount": 30, "OriginalPrice": 175, "SalePrice": 122, "AmountTotal": 100, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Swords/GreatSword/TennoGreatSword", "Discount": 40, "OriginalPrice": 175, "SalePrice": 105, "AmountTotal": 100, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Swords/GreatSword/TennoGreatSword", "Discount": 90, "OriginalPrice": 175, "SalePrice": 17, "AmountTotal": 100, "probability": 1 },
|
|
||||||
{
|
|
||||||
"StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/SwordsAndBoards/MeleeContestWinnerOne/TennoSwordShield",
|
|
||||||
"Discount": 30,
|
|
||||||
"OriginalPrice": 150,
|
|
||||||
"SalePrice": 105,
|
|
||||||
"AmountTotal": 100,
|
|
||||||
"probability": 1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/SwordsAndBoards/MeleeContestWinnerOne/TennoSwordShield",
|
|
||||||
"Discount": 70,
|
|
||||||
"OriginalPrice": 150,
|
|
||||||
"SalePrice": 45,
|
|
||||||
"AmountTotal": 100,
|
|
||||||
"probability": 1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/SwordsAndBoards/MeleeContestWinnerOne/TennoSwordShield",
|
|
||||||
"Discount": 90,
|
|
||||||
"OriginalPrice": 150,
|
|
||||||
"SalePrice": 15,
|
|
||||||
"AmountTotal": 100,
|
|
||||||
"probability": 1
|
|
||||||
},
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistol/CrossBow", "Discount": 30, "OriginalPrice": 175, "SalePrice": 122, "AmountTotal": 300, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistol/CrossBow", "Discount": 40, "OriginalPrice": 175, "SalePrice": 105, "AmountTotal": 250, "probability": 6 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistol/CrossBow", "Discount": 50, "OriginalPrice": 175, "SalePrice": 87, "AmountTotal": 200, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistol/CrossBow", "Discount": 60, "OriginalPrice": 175, "SalePrice": 70, "AmountTotal": 150, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistol/HandShotGun", "Discount": 20, "OriginalPrice": 190, "SalePrice": 152, "AmountTotal": 300, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistol/HandShotGun", "Discount": 30, "OriginalPrice": 190, "SalePrice": 133, "AmountTotal": 200, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistol/HandShotGun", "Discount": 40, "OriginalPrice": 190, "SalePrice": 114, "AmountTotal": 100, "probability": 5 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistol/RevolverPistol", "Discount": 20, "OriginalPrice": 190, "SalePrice": 152, "AmountTotal": 200, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistol/RevolverPistol", "Discount": 30, "OriginalPrice": 190, "SalePrice": 133, "AmountTotal": 150, "probability": 4 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistol/RevolverPistol", "Discount": 40, "OriginalPrice": 190, "SalePrice": 114, "AmountTotal": 100, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistol/RevolverPistol", "Discount": 50, "OriginalPrice": 190, "SalePrice": 95, "AmountTotal": 50, "probability": 4 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistols/TnBardPistol/TnBardPistolGun", "Discount": 20, "OriginalPrice": 190, "SalePrice": 152, "AmountTotal": 300, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistols/TnBardPistol/TnBardPistolGun", "Discount": 30, "OriginalPrice": 190, "SalePrice": 133, "AmountTotal": 250, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistols/TnBardPistol/TnBardPistolGun", "Discount": 40, "OriginalPrice": 190, "SalePrice": 114, "AmountTotal": 200, "probability": 2 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistols/TnBardPistol/TnBardPistolGun", "Discount": 50, "OriginalPrice": 190, "SalePrice": 95, "AmountTotal": 150, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistols/TnBardPistol/TnBardPistolGun", "Discount": 60, "OriginalPrice": 190, "SalePrice": 76, "AmountTotal": 100, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Rifle/TennoSniperRifle", "Discount": 10, "OriginalPrice": 250, "SalePrice": 225, "AmountTotal": 100, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Rifle/TennoSniperRifle", "Discount": 30, "OriginalPrice": 250, "SalePrice": 175, "AmountTotal": 100, "probability": 3 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Rifle/TennoSniperRifle", "Discount": 50, "OriginalPrice": 250, "SalePrice": 125, "AmountTotal": 100, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Shotgun/QuadShotgun", "Discount": 50, "OriginalPrice": 225, "SalePrice": 112, "AmountTotal": 100, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Shotgun/QuadShotgun", "Discount": 70, "OriginalPrice": 225, "SalePrice": 67, "AmountTotal": 100, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/ThrowingWeapons/Kunai", "Discount": 10, "OriginalPrice": 175, "SalePrice": 157, "AmountTotal": 100, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/ThrowingWeapons/Kunai", "Discount": 20, "OriginalPrice": 175, "SalePrice": 140, "AmountTotal": 100, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/ThrowingWeapons/Kunai", "Discount": 30, "OriginalPrice": 175, "SalePrice": 122, "AmountTotal": 100, "probability": 1 },
|
|
||||||
{ "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/ThrowingWeapons/Kunai", "Discount": 40, "OriginalPrice": 175, "SalePrice": 105, "AmountTotal": 100, "probability": 2 }
|
|
||||||
]
|
|
@ -510,6 +510,18 @@
|
|||||||
"PrimeAccessAvailability": { "State": "PRIME1" },
|
"PrimeAccessAvailability": { "State": "PRIME1" },
|
||||||
"PrimeVaultAvailabilities": [false, false, false, false, false],
|
"PrimeVaultAvailabilities": [false, false, false, false, false],
|
||||||
"PrimeTokenAvailability": true,
|
"PrimeTokenAvailability": true,
|
||||||
|
"DailyDeals": [
|
||||||
|
{
|
||||||
|
"StoreItem": "/Lotus/StoreItems/Upgrades/Focus/PowerLensGreater",
|
||||||
|
"Activation": { "$date": { "$numberLong": "1715058000000" } },
|
||||||
|
"Expiry": { "$date": { "$numberLong": "2000000000000" } },
|
||||||
|
"Discount": 50,
|
||||||
|
"OriginalPrice": 40,
|
||||||
|
"SalePrice": 20,
|
||||||
|
"AmountTotal": 50,
|
||||||
|
"AmountSold": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
"LibraryInfo": { "LastCompletedTargetType": "/Lotus/Types/Game/Library/Targets/Research7Target" },
|
"LibraryInfo": { "LastCompletedTargetType": "/Lotus/Types/Game/Library/Targets/Research7Target" },
|
||||||
"PVPChallengeInstances": [
|
"PVPChallengeInstances": [
|
||||||
{
|
{
|
||||||
|
@ -13,38 +13,37 @@
|
|||||||
<span class="navbar-toggler-icon"></span>
|
<span class="navbar-toggler-icon"></span>
|
||||||
</button>
|
</button>
|
||||||
<a class="navbar-brand">OpenWF WebUI</a>
|
<a class="navbar-brand">OpenWF WebUI</a>
|
||||||
<div class="ms-auto nav-item dropdown">
|
<ul class="navbar-nav ms-auto mb-0">
|
||||||
<button id="active-lang-name" class="nav-link dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false"></button>
|
<li class="nav-item dropdown">
|
||||||
<ul class="dropdown-menu dropdown-menu-end">
|
<button id="active-lang-name" class="nav-link dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false"></button>
|
||||||
<li><a class="dropdown-item active" href="#" data-lang="en" onclick="event.preventDefault();setLanguage('en');">English</a></li>
|
<ul class="dropdown-menu dropdown-menu-end">
|
||||||
<li><a class="dropdown-item" href="#" data-lang="de" onclick="event.preventDefault();setLanguage('de');">Deutsch</a></li>
|
<li><a class="dropdown-item active" href="#" data-lang="en" onclick="event.preventDefault();setLanguage('en');">English</a></li>
|
||||||
<li><a class="dropdown-item" href="#" data-lang="es" onclick="event.preventDefault();setLanguage('es');">Español</a></li>
|
<li><a class="dropdown-item" href="#" data-lang="de" onclick="event.preventDefault();setLanguage('de');">Deutsch</a></li>
|
||||||
<li><a class="dropdown-item" href="#" data-lang="fr" onclick="event.preventDefault();setLanguage('fr');">Français</a></li>
|
<li><a class="dropdown-item" href="#" data-lang="es" onclick="event.preventDefault();setLanguage('es');">Español</a></li>
|
||||||
<li><a class="dropdown-item" href="#" data-lang="it" onclick="event.preventDefault();setLanguage('it');">Italiano</a></li>
|
<li><a class="dropdown-item" href="#" data-lang="fr" onclick="event.preventDefault();setLanguage('fr');">Français</a></li>
|
||||||
<li><a class="dropdown-item" href="#" data-lang="ja" onclick="event.preventDefault();setLanguage('ja');">日本語</a></li>
|
<li><a class="dropdown-item" href="#" data-lang="it" onclick="event.preventDefault();setLanguage('it');">Italiano</a></li>
|
||||||
<li><a class="dropdown-item" href="#" data-lang="ko" onclick="event.preventDefault();setLanguage('ko');">한국어</a></li>
|
<li><a class="dropdown-item" href="#" data-lang="ja" onclick="event.preventDefault();setLanguage('ja');">日本語</a></li>
|
||||||
<li><a class="dropdown-item" href="#" data-lang="pl" onclick="event.preventDefault();setLanguage('pl');">Polski</a></li>
|
<li><a class="dropdown-item" href="#" data-lang="ko" onclick="event.preventDefault();setLanguage('ko');">한국어</a></li>
|
||||||
<li><a class="dropdown-item" href="#" data-lang="pt" onclick="event.preventDefault();setLanguage('pt');">Português</a></li>
|
<li><a class="dropdown-item" href="#" data-lang="pl" onclick="event.preventDefault();setLanguage('pl');">Polski</a></li>
|
||||||
<li><a class="dropdown-item" href="#" data-lang="ru" onclick="event.preventDefault();setLanguage('ru');">Русский</a></li>
|
<li><a class="dropdown-item" href="#" data-lang="pt" onclick="event.preventDefault();setLanguage('pt');">Português</a></li>
|
||||||
<li><a class="dropdown-item" href="#" data-lang="tr" onclick="event.preventDefault();setLanguage('tr');">Türkçe</a></li>
|
<li><a class="dropdown-item" href="#" data-lang="ru" onclick="event.preventDefault();setLanguage('ru');">Русский</a></li>
|
||||||
<li><a class="dropdown-item" href="#" data-lang="uk" onclick="event.preventDefault();setLanguage('uk');">Українська</a></li>
|
<li><a class="dropdown-item" href="#" data-lang="tr" onclick="event.preventDefault();setLanguage('tr');">Türkçe</a></li>
|
||||||
<li><a class="dropdown-item" href="#" data-lang="zh" onclick="event.preventDefault();setLanguage('zh');">简体中文</a></li>
|
<li><a class="dropdown-item" href="#" data-lang="uk" onclick="event.preventDefault();setLanguage('uk');">Українська</a></li>
|
||||||
<li><a class="dropdown-item" href="#" data-lang="tc" onclick="event.preventDefault();setLanguage('tc');">繁體中文</a></li>
|
<li><a class="dropdown-item" href="#" data-lang="zh" onclick="event.preventDefault();setLanguage('zh');">简体中文</a></li>
|
||||||
<li><a class="dropdown-item" href="#" data-lang="th" onclick="event.preventDefault();setLanguage('th');">แบบไทย</a></li>
|
<li><a class="dropdown-item" href="#" data-lang="tc" onclick="event.preventDefault();setLanguage('tc');">繁體中文</a></li>
|
||||||
<li><hr class="dropdown-divider"></li>
|
<li><a class="dropdown-item" href="#" data-lang="th" onclick="event.preventDefault();setLanguage('th');">แบบไทย</a></li>
|
||||||
<li><a class="dropdown-item active" href="#" data-loc="theme_dark" data-theme="dark" onclick="event.preventDefault();setTheme('dark');"></a></li>
|
</ul>
|
||||||
<li><a class="dropdown-item" href="#" data-loc="theme_light" data-theme="light" onclick="event.preventDefault();setTheme('light');"></a></li>
|
</li>
|
||||||
</ul>
|
<li class="nav-item dropdown user-dropdown">
|
||||||
</div>
|
<button class="nav-link dropdown-toggle displayname" data-bs-toggle="dropdown" aria-expanded="false"></button>
|
||||||
<div class="nav-item dropdown user-dropdown">
|
<ul class="dropdown-menu dropdown-menu-end">
|
||||||
<button class="nav-link dropdown-toggle displayname" data-bs-toggle="dropdown" aria-expanded="false"></button>
|
<li><a class="dropdown-item" href="/webui/" onclick="doLogout();" data-loc="navbar_logout"></a></li>
|
||||||
<ul class="dropdown-menu dropdown-menu-end">
|
<li><hr class="dropdown-divider"></li>
|
||||||
<li><a class="dropdown-item" href="/webui/" onclick="doLogout();" data-loc="navbar_logout"></a></li>
|
<li><a class="dropdown-item" href="#" onclick="event.preventDefault();renameAccount();" data-loc="navbar_renameAccount"></a></li>
|
||||||
<li><hr class="dropdown-divider"></li>
|
<li><a class="dropdown-item" href="#" onclick="event.preventDefault();deleteAccount();" data-loc="navbar_deleteAccount"></a></li>
|
||||||
<li><a class="dropdown-item" href="#" onclick="event.preventDefault();renameAccount();" data-loc="navbar_renameAccount"></a></li>
|
</ul>
|
||||||
<li><a class="dropdown-item" href="#" onclick="event.preventDefault();deleteAccount();" data-loc="navbar_deleteAccount"></a></li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
<div class="container pt-3 pb-3" id="main-view">
|
<div class="container pt-3 pb-3" id="main-view">
|
||||||
@ -75,7 +74,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="main-content" class="w-100">
|
<div class="w-100">
|
||||||
<div data-route="/webui/" data-title="Login | OpenWF WebUI">
|
<div data-route="/webui/" data-title="Login | OpenWF WebUI">
|
||||||
<p data-loc="login_description"></p>
|
<p data-loc="login_description"></p>
|
||||||
<form onsubmit="doLogin();return false;">
|
<form onsubmit="doLogin();return false;">
|
||||||
@ -456,15 +455,15 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="detailedView-route" data-route="/webui/detailedView" data-title="Inventory | OpenWF WebUI">
|
<div id="powersuit-route" data-route="~ /webui/powersuit/(.+)" 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 id="archonShards-card" class="card mb-3 d-none">
|
<div class="card">
|
||||||
<h5 class="card-header" data-loc="detailedView_archonShardsLabel"></h5>
|
<h5 class="card-header" data-loc="powersuit_archonShardsLabel"></h5>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<p>
|
<p>
|
||||||
<span data-loc="detailedView_archonShardsDescription"></span>
|
<span data-loc="powersuit_archonShardsDescription"></span>
|
||||||
<span data-loc="detailedView_archonShardsDescription2"></span>
|
<span data-loc="powersuit_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,18 +476,6 @@
|
|||||||
</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>
|
||||||
@ -527,7 +514,6 @@
|
|||||||
<form class="input-group mb-3" onsubmit="doAcquireMod();return false;">
|
<form class="input-group mb-3" onsubmit="doAcquireMod();return false;">
|
||||||
<input class="form-control" id="mod-count" type="number" value="1"/>
|
<input class="form-control" id="mod-count" type="number" value="1"/>
|
||||||
<input class="form-control w-50" id="mod-to-acquire" list="datalist-mods" />
|
<input class="form-control w-50" id="mod-to-acquire" list="datalist-mods" />
|
||||||
<button class="btn btn-success" onclick="window.maxed=true" type="submit" data-loc="mods_addMax"></button>
|
|
||||||
<button class="btn btn-primary" type="submit" data-loc="general_addButton"></button>
|
<button class="btn btn-primary" type="submit" data-loc="general_addButton"></button>
|
||||||
</form>
|
</form>
|
||||||
<table class="table table-hover w-100">
|
<table class="table table-hover w-100">
|
||||||
@ -547,7 +533,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div data-route="/webui/quests" data-title="Quests | OpenWF WebUI">
|
<div data-route="/webui/quests" data-title="Quests | OpenWF WebUI">
|
||||||
<p class="mb-3" data-loc="general_inventoryUpdateNote"></p>
|
|
||||||
<div class="row g-3">
|
<div class="row g-3">
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<div class="card">
|
<div class="card">
|
||||||
@ -779,44 +764,21 @@
|
|||||||
<input class="form-check-input" type="checkbox" id="missionsCanGiveAllRelics" />
|
<input class="form-check-input" type="checkbox" id="missionsCanGiveAllRelics" />
|
||||||
<label class="form-check-label" for="missionsCanGiveAllRelics" data-loc="cheats_missionsCanGiveAllRelics"></label>
|
<label class="form-check-label" for="missionsCanGiveAllRelics" data-loc="cheats_missionsCanGiveAllRelics"></label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check">
|
|
||||||
<input class="form-check-input" type="checkbox" id="exceptionalRelicsAlwaysGiveBronzeReward" />
|
|
||||||
<label class="form-check-label" for="exceptionalRelicsAlwaysGiveBronzeReward" data-loc="cheats_exceptionalRelicsAlwaysGiveBronzeReward"></label>
|
|
||||||
</div>
|
|
||||||
<div class="form-check">
|
|
||||||
<input class="form-check-input" type="checkbox" id="flawlessRelicsAlwaysGiveSilverReward" />
|
|
||||||
<label class="form-check-label" for="flawlessRelicsAlwaysGiveSilverReward" data-loc="cheats_flawlessRelicsAlwaysGiveSilverReward"></label>
|
|
||||||
</div>
|
|
||||||
<div class="form-check">
|
|
||||||
<input class="form-check-input" type="checkbox" id="radiantRelicsAlwaysGiveGoldReward" />
|
|
||||||
<label class="form-check-label" for="radiantRelicsAlwaysGiveGoldReward" data-loc="cheats_radiantRelicsAlwaysGiveGoldReward"></label>
|
|
||||||
</div>
|
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input class="form-check-input" type="checkbox" id="unlockAllSimarisResearchEntries" />
|
<input class="form-check-input" type="checkbox" id="unlockAllSimarisResearchEntries" />
|
||||||
<label class="form-check-label" for="unlockAllSimarisResearchEntries" data-loc="cheats_unlockAllSimarisResearchEntries"></label>
|
<label class="form-check-label" for="unlockAllSimarisResearchEntries" data-loc="cheats_unlockAllSimarisResearchEntries"></label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check">
|
<form class="form-group mt-2" onsubmit="doSaveConfig('spoofMasteryRank'); return false;">
|
||||||
<input class="form-check-input" type="checkbox" id="disableDailyTribute" />
|
|
||||||
<label class="form-check-label" for="disableDailyTribute" data-loc="cheats_disableDailyTribute"></label>
|
|
||||||
</div>
|
|
||||||
<form class="form-group mt-2" onsubmit="doSaveConfigInt('spoofMasteryRank'); return false;">
|
|
||||||
<label class="form-label" for="spoofMasteryRank" data-loc="cheats_spoofMasteryRank"></label>
|
<label class="form-label" for="spoofMasteryRank" data-loc="cheats_spoofMasteryRank"></label>
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input class="form-control" id="spoofMasteryRank" type="number" min="-1" max="65535" data-default="-1" />
|
<input class="form-control" id="spoofMasteryRank" type="number" min="-1" max="65535" />
|
||||||
<button class="btn btn-primary" type="submit" data-loc="cheats_save"></button>
|
<button class="btn btn-primary" type="submit" data-loc="cheats_save"></button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
<form class="form-group mt-2" onsubmit="doSaveConfigInt('relicRewardItemCountMultiplier'); return false;">
|
<form class="form-group mt-2" onsubmit="doSaveConfig('nightwaveStandingMultiplier'); return false;">
|
||||||
<label class="form-label" for="relicRewardItemCountMultiplier" data-loc="cheats_relicRewardItemCountMultiplier"></label>
|
|
||||||
<div class="input-group">
|
|
||||||
<input class="form-control" id="relicRewardItemCountMultiplier" type="number" min="1" max="1000000" data-default="1" />
|
|
||||||
<button class="btn btn-primary" type="submit" data-loc="cheats_save"></button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
<form class="form-group mt-2" onsubmit="doSaveConfigInt('nightwaveStandingMultiplier'); return false;">
|
|
||||||
<label class="form-label" for="nightwaveStandingMultiplier" data-loc="cheats_nightwaveStandingMultiplier"></label>
|
<label class="form-label" for="nightwaveStandingMultiplier" data-loc="cheats_nightwaveStandingMultiplier"></label>
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input class="form-control" id="nightwaveStandingMultiplier" type="number" min="1" max="1000000" data-default="1" />
|
<input class="form-control" id="nightwaveStandingMultiplier" type="number" min="1" max="1000000" value="1" />
|
||||||
<button class="btn btn-primary" type="submit" data-loc="cheats_save"></button>
|
<button class="btn btn-primary" type="submit" data-loc="cheats_save"></button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
@ -865,7 +827,7 @@
|
|||||||
<label class="form-check-label" for="worldState.starDays" data-loc="worldState_starDays"></label>
|
<label class="form-check-label" for="worldState.starDays" data-loc="worldState_starDays"></label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group mt-2">
|
<div class="form-group mt-2">
|
||||||
<label class="form-label" for="worldState.galleonOfGhouls" data-loc="worldState_galleonOfGhouls"></label>
|
<label class="form-label" for="changeSyndicate" data-loc="worldState_galleonOfGhouls"></label>
|
||||||
<select class="form-control" id="worldState.galleonOfGhouls">
|
<select class="form-control" id="worldState.galleonOfGhouls">
|
||||||
<option value="0" data-loc="disabled"></option>
|
<option value="0" data-loc="disabled"></option>
|
||||||
<option value="1" data-loc="worldState_we1"></option>
|
<option value="1" data-loc="worldState_we1"></option>
|
||||||
@ -874,7 +836,7 @@
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group mt-2">
|
<div class="form-group mt-2">
|
||||||
<label class="form-label" for="worldState.eidolonOverride" data-loc="worldState_eidolonOverride"></label>
|
<label class="form-label" for="changeSyndicate" data-loc="worldState_eidolonOverride"></label>
|
||||||
<select class="form-control" id="worldState.eidolonOverride">
|
<select class="form-control" id="worldState.eidolonOverride">
|
||||||
<option value="" data-loc="disabled"></option>
|
<option value="" data-loc="disabled"></option>
|
||||||
<option value="day" data-loc="worldState_day"></option>
|
<option value="day" data-loc="worldState_day"></option>
|
||||||
@ -882,7 +844,7 @@
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group mt-2">
|
<div class="form-group mt-2">
|
||||||
<label class="form-label" for="worldState.vallisOverride" data-loc="worldState_vallisOverride"></label>
|
<label class="form-label" for="changeSyndicate" data-loc="worldState_vallisOverride"></label>
|
||||||
<select class="form-control" id="worldState.vallisOverride">
|
<select class="form-control" id="worldState.vallisOverride">
|
||||||
<option value="" data-loc="disabled"></option>
|
<option value="" data-loc="disabled"></option>
|
||||||
<option value="warm" data-loc="worldState_warm"></option>
|
<option value="warm" data-loc="worldState_warm"></option>
|
||||||
@ -890,7 +852,7 @@
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group mt-2">
|
<div class="form-group mt-2">
|
||||||
<label class="form-label" for="worldState.duviriOverride" data-loc="worldState_duviriOverride"></label>
|
<label class="form-label" for="changeSyndicate" data-loc="worldState_duviriOverride"></label>
|
||||||
<select class="form-control" id="worldState.duviriOverride">
|
<select class="form-control" id="worldState.duviriOverride">
|
||||||
<option value="" data-loc="disabled"></option>
|
<option value="" data-loc="disabled"></option>
|
||||||
<option value="joy" data-loc="worldState_joy"></option>
|
<option value="joy" data-loc="worldState_joy"></option>
|
||||||
@ -901,7 +863,7 @@
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group mt-2">
|
<div class="form-group mt-2">
|
||||||
<label class="form-label" for="worldState.nightwaveOverride" data-loc="worldState_nightwaveOverride"></label>
|
<label class="form-label" for="changeSyndicate" data-loc="worldState_nightwaveOverride"></label>
|
||||||
<select class="form-control" id="worldState.nightwaveOverride">
|
<select class="form-control" id="worldState.nightwaveOverride">
|
||||||
<option value="" data-loc="disabled"></option>
|
<option value="" data-loc="disabled"></option>
|
||||||
<option value="RadioLegionIntermission13Syndicate" data-loc="worldState_RadioLegionIntermission13Syndicate"></option>
|
<option value="RadioLegionIntermission13Syndicate" data-loc="worldState_RadioLegionIntermission13Syndicate"></option>
|
||||||
@ -923,27 +885,13 @@
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group mt-2">
|
<div class="form-group mt-2">
|
||||||
<label class="form-label" for="worldState.allTheFissures" data-loc="worldState_fissures"></label>
|
<label class="form-label" for="changeSyndicate" data-loc="worldState_fissures"></label>
|
||||||
<select class="form-control" id="worldState.allTheFissures">
|
<select class="form-control" id="worldState.allTheFissures">
|
||||||
<option value="" data-loc="normal"></option>
|
<option value="" data-loc="normal"></option>
|
||||||
<option value="normal" data-loc="worldState_allAtOnceNormal"></option>
|
<option value="normal" data-loc="worldState_allAtOnceNormal"></option>
|
||||||
<option value="hard" data-loc="worldState_allAtOnceSteelPath"></option>
|
<option value="hard" data-loc="worldState_allAtOnceSteelPath"></option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<form class="form-group mt-2" onsubmit="doSaveConfigStringArray('worldState.circuitGameModes'); return false;">
|
|
||||||
<label class="form-label" for="worldState.circuitGameModes" data-loc="worldState_theCircuitOverride"></label>
|
|
||||||
<div class="input-group">
|
|
||||||
<input id="worldState.circuitGameModes" type="text" class="form-control tags-input" list="datalist-circuitGameModes" />
|
|
||||||
<button class="btn btn-primary" type="submit" data-loc="cheats_save"></button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
<form class="form-group mt-2" onsubmit="doSaveConfigFloat('worldState.darvoStockMultiplier'); return false;">
|
|
||||||
<label class="form-label" for="worldState.darvoStockMultiplier" data-loc="worldState_darvoStockMultiplier"></label>
|
|
||||||
<div class="input-group">
|
|
||||||
<input id="worldState.darvoStockMultiplier" class="form-control" type="number" step="0.01" data-default="1" />
|
|
||||||
<button class="btn btn-primary" type="submit" data-loc="cheats_save"></button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -975,7 +923,10 @@
|
|||||||
<datalist id="datalist-KubrowPets"></datalist>
|
<datalist id="datalist-KubrowPets"></datalist>
|
||||||
<datalist id="datalist-QuestKeys"></datalist>
|
<datalist id="datalist-QuestKeys"></datalist>
|
||||||
<datalist id="datalist-miscitems"></datalist>
|
<datalist id="datalist-miscitems"></datalist>
|
||||||
<datalist id="datalist-mods"></datalist>
|
<datalist id="datalist-mods">
|
||||||
|
<option data-key="/Lotus/Upgrades/Mods/Fusers/LegendaryModFuser" value="Legendary Core"></option>
|
||||||
|
<option data-key="/Lotus/Upgrades/CosmeticEnhancers/Peculiars/CyoteMod" value="Traumatic Peculiar"></option>
|
||||||
|
</datalist>
|
||||||
<datalist id="datalist-archonCrystalUpgrades"></datalist>
|
<datalist id="datalist-archonCrystalUpgrades"></datalist>
|
||||||
<datalist id="datalist-OperatorAmps"></datalist>
|
<datalist id="datalist-OperatorAmps"></datalist>
|
||||||
<datalist id="datalist-EvolutionProgress"></datalist>
|
<datalist id="datalist-EvolutionProgress"></datalist>
|
||||||
@ -1007,15 +958,6 @@
|
|||||||
<datalist id="datalist-ModularParts-KUBROW_ANTIGEN"></datalist>
|
<datalist id="datalist-ModularParts-KUBROW_ANTIGEN"></datalist>
|
||||||
<datalist id="datalist-ModularParts-KUBROW_MUTAGEN"></datalist>
|
<datalist id="datalist-ModularParts-KUBROW_MUTAGEN"></datalist>
|
||||||
<datalist id="datalist-Boosters"></datalist>
|
<datalist id="datalist-Boosters"></datalist>
|
||||||
<datalist id="datalist-circuitGameModes">
|
|
||||||
<option>Survival</option>
|
|
||||||
<option>VoidFlood</option>
|
|
||||||
<option>Excavation</option>
|
|
||||||
<option>Defense</option>
|
|
||||||
<option>Exterminate</option>
|
|
||||||
<option>Assassination</option>
|
|
||||||
<option>Alchemy</option>
|
|
||||||
</datalist>
|
|
||||||
<script src="/webui/libs/jquery-3.6.0.min.js"></script>
|
<script src="/webui/libs/jquery-3.6.0.min.js"></script>
|
||||||
<script src="/webui/libs/whirlpool-js.min.js"></script>
|
<script src="/webui/libs/whirlpool-js.min.js"></script>
|
||||||
<script src="/webui/libs/single.js"></script>
|
<script src="/webui/libs/single.js"></script>
|
||||||
|
@ -230,18 +230,6 @@ function setLanguage(lang) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function setActiveTheme(theme) {
|
|
||||||
document.documentElement.setAttribute("data-bs-theme", theme);
|
|
||||||
document.querySelector("[data-theme].active").classList.remove("active");
|
|
||||||
document.querySelector("[data-theme=" + theme + "]").classList.add("active");
|
|
||||||
}
|
|
||||||
setActiveTheme(localStorage.getItem("theme") ?? "dark");
|
|
||||||
|
|
||||||
function setTheme(theme) {
|
|
||||||
setActiveTheme(theme);
|
|
||||||
localStorage.setItem("theme", theme);
|
|
||||||
}
|
|
||||||
|
|
||||||
const webUiModularWeapons = [
|
const webUiModularWeapons = [
|
||||||
"/Lotus/Weapons/Sentients/OperatorAmplifiers/OperatorAmpWeapon",
|
"/Lotus/Weapons/Sentients/OperatorAmplifiers/OperatorAmpWeapon",
|
||||||
"/Lotus/Weapons/Ostron/Melee/LotusModularWeapon",
|
"/Lotus/Weapons/Ostron/Melee/LotusModularWeapon",
|
||||||
@ -284,8 +272,6 @@ 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"),
|
||||||
@ -368,16 +354,6 @@ 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",
|
||||||
@ -462,13 +438,6 @@ 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") {
|
||||||
@ -651,7 +620,6 @@ function updateInventory() {
|
|||||||
{
|
{
|
||||||
const td = document.createElement("td");
|
const td = document.createElement("td");
|
||||||
td.classList = "text-end text-nowrap";
|
td.classList = "text-end text-nowrap";
|
||||||
|
|
||||||
let maxXP = Math.pow(uniqueLevelCaps[item.ItemType] ?? 30, 2) * 1000;
|
let maxXP = Math.pow(uniqueLevelCaps[item.ItemType] ?? 30, 2) * 1000;
|
||||||
if (
|
if (
|
||||||
category != "Suits" &&
|
category != "Suits" &&
|
||||||
@ -664,6 +632,7 @@ function updateInventory() {
|
|||||||
) {
|
) {
|
||||||
maxXP /= 2;
|
maxXP /= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
let anyExaltedMissingXP = false;
|
let anyExaltedMissingXP = false;
|
||||||
if (item.XP >= maxXP && item.ItemType in itemMap && "exalted" in itemMap[item.ItemType]) {
|
if (item.XP >= maxXP && item.ItemType in itemMap && "exalted" in itemMap[item.ItemType]) {
|
||||||
for (const exaltedType of itemMap[item.ItemType].exalted) {
|
for (const exaltedType of itemMap[item.ItemType].exalted) {
|
||||||
@ -677,6 +646,7 @@ function updateInventory() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item.XP < maxXP || anyExaltedMissingXP) {
|
if (item.XP < maxXP || anyExaltedMissingXP) {
|
||||||
const a = document.createElement("a");
|
const a = document.createElement("a");
|
||||||
a.href = "#";
|
a.href = "#";
|
||||||
@ -714,14 +684,6 @@ function updateInventory() {
|
|||||||
a.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M214.6 41.4c-12.5-12.5-32.8-12.5-45.3 0l-160 160c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L160 141.2V448c0 17.7 14.3 32 32 32s32-14.3 32-32V141.2L329.4 246.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3l-160-160z"/></svg>`;
|
a.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M214.6 41.4c-12.5-12.5-32.8-12.5-45.3 0l-160 160c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L160 141.2V448c0 17.7 14.3 32 32 32s32-14.3 32-32V141.2L329.4 246.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3l-160-160z"/></svg>`;
|
||||||
td.appendChild(a);
|
td.appendChild(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
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.Features & 8) && modularWeapons.includes(item.ItemType)) {
|
if (!(item.Features & 8) && modularWeapons.includes(item.ItemType)) {
|
||||||
const a = document.createElement("a");
|
const a = document.createElement("a");
|
||||||
a.href = "#";
|
a.href = "#";
|
||||||
@ -747,6 +709,13 @@ 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);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
@ -1145,73 +1114,53 @@ function updateInventory() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Populate detailedView route
|
// Populate powersuit route
|
||||||
if (single.getCurrentPath().substr(0, 19) == "/webui/detailedView") {
|
if (single.getCurrentPath().substr(0, 17) == "/webui/powersuit/") {
|
||||||
const urlParams = new URLSearchParams(window.location.search);
|
const oid = single.getCurrentPath().substr(17);
|
||||||
const oid = urlParams.get("itemId");
|
const item = data.Suits.find(x => x.ItemId.$oid == oid);
|
||||||
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) {
|
||||||
$("#detailedView-route h3").text(item.ItemName);
|
$("#powersuit-route h3").text(item.ItemName);
|
||||||
$("#detailedView-route .text-body-secondary").text(
|
$("#powersuit-route .text-body-secondary").text(itemMap[item.ItemType]?.name ?? item.ItemType);
|
||||||
itemMap[item.ItemType]?.name ?? item.ItemType
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
$("#detailedView-route h3").text(itemMap[item.ItemType]?.name ?? item.ItemType);
|
$("#powersuit-route h3").text(itemMap[item.ItemType]?.name ?? item.ItemType);
|
||||||
$("#detailedView-route .text-body-secondary").text("");
|
$("#powersuit-route .text-body-secondary").text("");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (category == "Suits") {
|
const uniqueUpgrades = {};
|
||||||
document.getElementById("archonShards-card").classList.remove("d-none");
|
(item.ArchonCrystalUpgrades ?? []).forEach(upgrade => {
|
||||||
|
if (upgrade && upgrade.UpgradeType) {
|
||||||
const uniqueUpgrades = {};
|
uniqueUpgrades[upgrade.UpgradeType] ??= 0;
|
||||||
(item.ArchonCrystalUpgrades ?? []).forEach(upgrade => {
|
uniqueUpgrades[upgrade.UpgradeType] += 1;
|
||||||
if (upgrade && upgrade.UpgradeType) {
|
|
||||||
uniqueUpgrades[upgrade.UpgradeType] ??= 0;
|
|
||||||
uniqueUpgrades[upgrade.UpgradeType] += 1;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
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").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 {
|
} else {
|
||||||
single.loadRoute("/webui/inventory");
|
single.loadRoute("/webui/inventory");
|
||||||
}
|
}
|
||||||
@ -1873,8 +1822,6 @@ function setFingerprint(ItemType, ItemId, fingerprint) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function doAcquireMod() {
|
function doAcquireMod() {
|
||||||
const maxed = !!window.maxed;
|
|
||||||
window.maxed = false;
|
|
||||||
const uniqueName = getKey(document.getElementById("mod-to-acquire"));
|
const uniqueName = getKey(document.getElementById("mod-to-acquire"));
|
||||||
if (!uniqueName) {
|
if (!uniqueName) {
|
||||||
$("#mod-to-acquire").addClass("is-invalid").focus();
|
$("#mod-to-acquire").addClass("is-invalid").focus();
|
||||||
@ -1882,15 +1829,14 @@ function doAcquireMod() {
|
|||||||
}
|
}
|
||||||
const count = parseInt($("#mod-count").val());
|
const count = parseInt($("#mod-count").val());
|
||||||
if (count != 0) {
|
if (count != 0) {
|
||||||
Promise.all([window.itemListPromise, revalidateAuthz()]).then(([itemList]) => {
|
revalidateAuthz().then(() => {
|
||||||
$.post({
|
$.post({
|
||||||
url: "/custom/addItems?" + window.authz,
|
url: "/custom/addItems?" + window.authz,
|
||||||
contentType: "application/json",
|
contentType: "application/json",
|
||||||
data: JSON.stringify([
|
data: JSON.stringify([
|
||||||
{
|
{
|
||||||
ItemType: uniqueName,
|
ItemType: uniqueName,
|
||||||
ItemCount: count,
|
ItemCount: count
|
||||||
Fingerprint: maxed ? JSON.stringify({ lvl: itemList[uniqueName].fusionLimit ?? 5 }) : undefined
|
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
}).done(function () {
|
}).done(function () {
|
||||||
@ -1905,11 +1851,6 @@ function doAcquireMod() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function doAcquireModMax() {
|
|
||||||
const uniqueName = getKey(document.getElementById("mod-to-acquire"));
|
|
||||||
alert("doAcquireModMax: " + uniqueName);
|
|
||||||
}
|
|
||||||
|
|
||||||
const uiConfigs = [...$(".config-form input[id], .config-form select[id]")].map(x => x.id);
|
const uiConfigs = [...$(".config-form input[id], .config-form select[id]")].map(x => x.id);
|
||||||
|
|
||||||
for (const id of uiConfigs) {
|
for (const id of uiConfigs) {
|
||||||
@ -1941,37 +1882,12 @@ for (const id of uiConfigs) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function doSaveConfigInt(id) {
|
function doSaveConfig(id) {
|
||||||
|
const elm = document.getElementById(id);
|
||||||
$.post({
|
$.post({
|
||||||
url: "/custom/setConfig?" + window.authz + "&wsid=" + wsid,
|
url: "/custom/setConfig?" + window.authz + "&wsid=" + wsid,
|
||||||
contentType: "application/json",
|
contentType: "application/json",
|
||||||
data: JSON.stringify({
|
data: JSON.stringify({ [id]: parseInt(elm.value) })
|
||||||
[id]: parseInt(document.getElementById(id).value)
|
|
||||||
})
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function doSaveConfigFloat(id) {
|
|
||||||
$.post({
|
|
||||||
url: "/custom/setConfig?" + window.authz + "&wsid=" + wsid,
|
|
||||||
contentType: "application/json",
|
|
||||||
data: JSON.stringify({
|
|
||||||
[id]: parseFloat(document.getElementById(id).value)
|
|
||||||
})
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function doSaveConfigStringArray(id) {
|
|
||||||
$.post({
|
|
||||||
url: "/custom/setConfig?" + window.authz + "&wsid=" + wsid,
|
|
||||||
contentType: "application/json",
|
|
||||||
data: JSON.stringify({
|
|
||||||
[id]: document
|
|
||||||
.getElementById(id)
|
|
||||||
.getAttribute("data-tags-value")
|
|
||||||
.split(", ")
|
|
||||||
.filter(x => x)
|
|
||||||
})
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1993,14 +1909,13 @@ single.getRoute("/webui/cheats").on("beforeload", function () {
|
|||||||
$(".config-admin-show").removeClass("d-none");
|
$(".config-admin-show").removeClass("d-none");
|
||||||
Object.entries(json).forEach(entry => {
|
Object.entries(json).forEach(entry => {
|
||||||
const [key, value] = entry;
|
const [key, value] = entry;
|
||||||
const elm = document.getElementById(key);
|
var x = document.getElementById(`${key}`);
|
||||||
if (elm.type == "checkbox") {
|
if (x != null) {
|
||||||
elm.checked = value;
|
if (x.type == "checkbox") {
|
||||||
} else if (elm.classList.contains("tags-input")) {
|
x.checked = value;
|
||||||
elm.value = value.join(", ");
|
} else if (x.type == "number") {
|
||||||
elm.oninput();
|
x.setAttribute("value", `${value}`);
|
||||||
} else {
|
}
|
||||||
elm.value = value ?? elm.getAttribute("data-default");
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
@ -2155,19 +2070,16 @@ function doAddMissingMaxRankMods() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// DetailedView Route
|
// Powersuit Route
|
||||||
|
|
||||||
single.getRoute("#detailedView-route").on("beforeload", function () {
|
single.getRoute("#powersuit-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();
|
||||||
@ -2178,7 +2090,7 @@ function doPushArchonCrystalUpgrade() {
|
|||||||
"/custom/pushArchonCrystalUpgrade?" +
|
"/custom/pushArchonCrystalUpgrade?" +
|
||||||
window.authz +
|
window.authz +
|
||||||
"&oid=" +
|
"&oid=" +
|
||||||
urlParams.get("itemId") +
|
single.getCurrentPath().substr(17) +
|
||||||
"&type=" +
|
"&type=" +
|
||||||
uniqueName +
|
uniqueName +
|
||||||
"&count=" +
|
"&count=" +
|
||||||
@ -2191,10 +2103,14 @@ function doPushArchonCrystalUpgrade() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function doPopArchonCrystalUpgrade(type) {
|
function doPopArchonCrystalUpgrade(type) {
|
||||||
const urlParams = new URLSearchParams(window.location.search);
|
|
||||||
revalidateAuthz().then(() => {
|
revalidateAuthz().then(() => {
|
||||||
$.get(
|
$.get(
|
||||||
"/custom/popArchonCrystalUpgrade?" + window.authz + "&oid=" + urlParams.get("itemId") + "&type=" + type
|
"/custom/popArchonCrystalUpgrade?" +
|
||||||
|
window.authz +
|
||||||
|
"&oid=" +
|
||||||
|
single.getCurrentPath().substr(17) +
|
||||||
|
"&type=" +
|
||||||
|
type
|
||||||
).done(function () {
|
).done(function () {
|
||||||
updateInventory();
|
updateInventory();
|
||||||
});
|
});
|
||||||
@ -2444,7 +2360,7 @@ async function doMaxPlexus() {
|
|||||||
async function doUnlockAllMissions() {
|
async function doUnlockAllMissions() {
|
||||||
await revalidateAuthz();
|
await revalidateAuthz();
|
||||||
await fetch("/custom/completeAllMissions?" + window.authz);
|
await fetch("/custom/completeAllMissions?" + window.authz);
|
||||||
toast(loc("cheats_unlockAllMissions_ok"));
|
updateInventory();
|
||||||
}
|
}
|
||||||
|
|
||||||
const importSamples = {
|
const importSamples = {
|
||||||
@ -2673,7 +2589,7 @@ const importSamples = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
ItemType: "/Lotus/Upgrades/Focus/Defense/Active/CloakHealOthersFocusUpgrade",
|
ItemType: "/Lotus/Upgrades/Focus/Defense/Active/CloakHealOthersFocusUpgrade",
|
||||||
Level: 3
|
Level: 2
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@ -2681,73 +2597,3 @@ const importSamples = {
|
|||||||
function setImportSample(key) {
|
function setImportSample(key) {
|
||||||
$("#import-inventory").val(JSON.stringify(importSamples[key], null, 2));
|
$("#import-inventory").val(JSON.stringify(importSamples[key], null, 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
document.querySelectorAll(".tags-input").forEach(input => {
|
|
||||||
const datalist = document.getElementById(input.getAttribute("list"));
|
|
||||||
const options = [...datalist.querySelectorAll("option")].map(x => x.textContent);
|
|
||||||
input.oninput = function () {
|
|
||||||
const value = [];
|
|
||||||
for (const tag of this.value.split(",")) {
|
|
||||||
const index = options.map(x => x.toLowerCase()).indexOf(tag.trim().toLowerCase());
|
|
||||||
if (index != -1) {
|
|
||||||
value.push(options[index]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.setAttribute("data-tags-value", value.join(", "));
|
|
||||||
|
|
||||||
datalist.innerHTML = "";
|
|
||||||
for (const option of options) {
|
|
||||||
const elm = document.createElement("option");
|
|
||||||
elm.textContent = [...value, option, ""].join(", ");
|
|
||||||
datalist.appendChild(elm);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
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();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
document.querySelectorAll("#sidebar .nav-link").forEach(function (elm) {
|
|
||||||
elm.addEventListener("click", function () {
|
|
||||||
window.scrollTo(0, 0);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
@ -4,19 +4,9 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
body.logged-in #sidebar {
|
body.logged-in #sidebar {
|
||||||
position: fixed;
|
position: sticky;
|
||||||
}
|
top: 5rem;
|
||||||
|
margin-right: 3rem;
|
||||||
body.logged-in #main-content {
|
|
||||||
margin-left: 7rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
body.logged-in:has([data-lang="de"].active) #main-content {
|
|
||||||
margin-left: 8rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
body.logged-in:has([data-lang="zh"].active) #main-content {
|
|
||||||
margin-left: 6rem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
body:not(.logged-in) #sidebar {
|
body:not(.logged-in) #sidebar {
|
||||||
|
@ -1,11 +1,8 @@
|
|||||||
// German translation by Animan8000
|
// German translation by Animan8000
|
||||||
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: `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_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?`,
|
||||||
@ -115,19 +112,14 @@ 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`,
|
||||||
detailedView_archonShardsLabel: `Archon-Scherben-Slots`,
|
powersuit_archonShardsDescription: `Du kannst diese unbegrenzten Slots nutzen, um eine Vielzahl von Verbesserungen anzuwenden.`,
|
||||||
detailedView_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_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?`,
|
||||||
mods_rivens: `Rivens`,
|
mods_rivens: `Rivens`,
|
||||||
mods_mods: `Mods`,
|
mods_mods: `Mods`,
|
||||||
mods_addMax: `[UNTRANSLATED] Add Maxed`,
|
|
||||||
mods_addMissingUnrankedMods: `Fehlende Mods ohne Rang hinzufügen`,
|
mods_addMissingUnrankedMods: `Fehlende Mods ohne Rang hinzufügen`,
|
||||||
mods_removeUnranked: `Mods ohne Rang entfernen`,
|
mods_removeUnranked: `Mods ohne Rang entfernen`,
|
||||||
mods_addMissingMaxRankMods: `Fehlende Mods mit Max. Rang hinzufügen`,
|
mods_addMissingMaxRankMods: `Fehlende Mods mit Max. Rang hinzufügen`,
|
||||||
@ -137,7 +129,6 @@ dict = {
|
|||||||
cheats_skipAllDialogue: `Alle Dialoge überspringen`,
|
cheats_skipAllDialogue: `Alle Dialoge überspringen`,
|
||||||
cheats_unlockAllScans: `Alle Scans freischalten`,
|
cheats_unlockAllScans: `Alle Scans freischalten`,
|
||||||
cheats_unlockAllMissions: `Alle Missionen freischalten`,
|
cheats_unlockAllMissions: `Alle Missionen freischalten`,
|
||||||
cheats_unlockAllMissions_ok: `[UNTRANSLATED] Success. Please note that you'll need to enter a dojo/relay or relog for the client to refresh the star chart.`,
|
|
||||||
cheats_infiniteCredits: `Unendlich Credits`,
|
cheats_infiniteCredits: `Unendlich Credits`,
|
||||||
cheats_infinitePlatinum: `Unendlich Platinum`,
|
cheats_infinitePlatinum: `Unendlich Platinum`,
|
||||||
cheats_infiniteEndo: `Unendlich Endo`,
|
cheats_infiniteEndo: `Unendlich Endo`,
|
||||||
@ -183,13 +174,8 @@ dict = {
|
|||||||
cheats_noDojoResearchTime: `Keine Dojo-Forschungszeit`,
|
cheats_noDojoResearchTime: `Keine Dojo-Forschungszeit`,
|
||||||
cheats_fastClanAscension: `Schneller Clan-Aufstieg`,
|
cheats_fastClanAscension: `Schneller Clan-Aufstieg`,
|
||||||
cheats_missionsCanGiveAllRelics: `[UNTRANSLATED] Missions Can Give All Relics`,
|
cheats_missionsCanGiveAllRelics: `[UNTRANSLATED] Missions Can Give All Relics`,
|
||||||
cheats_exceptionalRelicsAlwaysGiveBronzeReward: `[UNTRANSLATED] Exceptional Relics Always Give Bronze Reward`,
|
|
||||||
cheats_flawlessRelicsAlwaysGiveSilverReward: `[UNTRANSLATED] Flawless Relics Always Give Silver Reward`,
|
|
||||||
cheats_radiantRelicsAlwaysGiveGoldReward: `[UNTRANSLATED] Radiant Relics Always Give Gold Reward`,
|
|
||||||
cheats_unlockAllSimarisResearchEntries: `[UNTRANSLATED] Unlock All Simaris Research Entries`,
|
cheats_unlockAllSimarisResearchEntries: `[UNTRANSLATED] Unlock All Simaris Research Entries`,
|
||||||
cheats_disableDailyTribute: `[UNTRANSLATED] Disable Daily Tribute`,
|
|
||||||
cheats_spoofMasteryRank: `Gefälschter Meisterschaftsrang (-1 zum deaktivieren)`,
|
cheats_spoofMasteryRank: `Gefälschter Meisterschaftsrang (-1 zum deaktivieren)`,
|
||||||
cheats_relicRewardItemCountMultiplier: `[UNTRANSLATED] Relic Reward Item Count Multiplier`,
|
|
||||||
cheats_nightwaveStandingMultiplier: `[UNTRANSLATED] Nightwave Standing Multiplier`,
|
cheats_nightwaveStandingMultiplier: `[UNTRANSLATED] Nightwave Standing Multiplier`,
|
||||||
cheats_save: `[UNTRANSLATED] Save`,
|
cheats_save: `[UNTRANSLATED] Save`,
|
||||||
cheats_account: `Account`,
|
cheats_account: `Account`,
|
||||||
@ -244,8 +230,6 @@ dict = {
|
|||||||
normal: `[UNTRANSLATED] Normal`,
|
normal: `[UNTRANSLATED] Normal`,
|
||||||
worldState_allAtOnceNormal: `[UNTRANSLATED] All At Once, Normal`,
|
worldState_allAtOnceNormal: `[UNTRANSLATED] All At Once, Normal`,
|
||||||
worldState_allAtOnceSteelPath: `[UNTRANSLATED] All At Once, Steel Path`,
|
worldState_allAtOnceSteelPath: `[UNTRANSLATED] All At Once, Steel Path`,
|
||||||
worldState_theCircuitOverride: `[UNTRANSLATED] The Circuit Override`,
|
|
||||||
worldState_darvoStockMultiplier: `[UNTRANSLATED] Darvo Stock Multiplier`,
|
|
||||||
|
|
||||||
import_importNote: `Du kannst hier eine vollständige oder teilweise Inventarantwort (Client-Darstellung) einfügen. Alle Felder, die vom Importer unterstützt werden, <b>werden in deinem Account überschrieben</b>.`,
|
import_importNote: `Du kannst hier eine vollständige oder teilweise Inventarantwort (Client-Darstellung) einfügen. Alle Felder, die vom Importer unterstützt werden, <b>werden in deinem Account überschrieben</b>.`,
|
||||||
import_submit: `Absenden`,
|
import_submit: `Absenden`,
|
||||||
@ -270,7 +254,7 @@ dict = {
|
|||||||
upgrade_WarframeGlobeEffectEnergy: `[UNTRANSLATED] +|VAL|% Energy Orb Effectiveness`,
|
upgrade_WarframeGlobeEffectEnergy: `[UNTRANSLATED] +|VAL|% Energy Orb Effectiveness`,
|
||||||
upgrade_WarframeGlobeEffectHealth: `[UNTRANSLATED] +|VAL|% Health Orb Effectiveness`,
|
upgrade_WarframeGlobeEffectHealth: `[UNTRANSLATED] +|VAL|% Health Orb Effectiveness`,
|
||||||
upgrade_WarframeHealthMax: `[UNTRANSLATED] +|VAL| Health`,
|
upgrade_WarframeHealthMax: `[UNTRANSLATED] +|VAL| Health`,
|
||||||
upgrade_WarframeHPBoostFromImpact: `[UNTRANSLATED] +|VAL1| Health on kill with Blast Damage (Max |VAL2| Health)`,
|
upgrade_WarframeHPBoostFromImpact: `[UNTRANSLATED] +|VAL1| Health per enemy killed with Blast Damage (Max |VAL2| Health)`,
|
||||||
upgrade_WarframeParkourVelocity: `[UNTRANSLATED] +|VAL|% Parkour Velocity`,
|
upgrade_WarframeParkourVelocity: `[UNTRANSLATED] +|VAL|% Parkour Velocity`,
|
||||||
upgrade_WarframeRadiationDamageBoost: `[UNTRANSLATED] +|VAL|% Ability Damage on enemies affected by Radiation Status`,
|
upgrade_WarframeRadiationDamageBoost: `[UNTRANSLATED] +|VAL|% Ability Damage on enemies affected by Radiation Status`,
|
||||||
upgrade_WarframeRegen: `[UNTRANSLATED] +|VAL| Health Regen/s`,
|
upgrade_WarframeRegen: `[UNTRANSLATED] +|VAL| Health Regen/s`,
|
||||||
@ -286,33 +270,22 @@ dict = {
|
|||||||
upgrade_AvatarLootRadar: `[UNTRANSLATED] +7m Loot Radar`,
|
upgrade_AvatarLootRadar: `[UNTRANSLATED] +7m Loot Radar`,
|
||||||
upgrade_WeaponAmmoMax: `[UNTRANSLATED] +15% Ammo Max`,
|
upgrade_WeaponAmmoMax: `[UNTRANSLATED] +15% Ammo Max`,
|
||||||
upgrade_EnemyArmorReductionAura: `[UNTRANSLATED] -3% Enemy Armor`,
|
upgrade_EnemyArmorReductionAura: `[UNTRANSLATED] -3% Enemy Armor`,
|
||||||
upgrade_OnExecutionAmmo: `[UNTRANSLATED] +100% Primary and Secondary Magazine Refill on Mercy`,
|
upgrade_OnExecutionAmmo: `[UNTRANSLATED] 100% Primary and Secondary Magazine Refill on Mercy`,
|
||||||
upgrade_OnExecutionHealthDrop: `[UNTRANSLATED] +100% Health Orb Chance on Mercy`,
|
upgrade_OnExecutionHealthDrop: `[UNTRANSLATED] 100% chance to drop a Health Orb on Mercy`,
|
||||||
upgrade_OnExecutionEnergyDrop: `[UNTRANSLATED] +50% Energy Orb Chance on Mercy`,
|
upgrade_OnExecutionEnergyDrop: `[UNTRANSLATED] 50% chance to drop an Energy Orb on Mercy`,
|
||||||
upgrade_OnFailHackReset: `[UNTRANSLATED] +50% Hacking Retry Chance`,
|
upgrade_OnFailHackReset: `[UNTRANSLATED] +50% to retry on Hacking failure`,
|
||||||
upgrade_DamageReductionOnHack: `[UNTRANSLATED] +75% Damage Reduction while Hacking`,
|
upgrade_DamageReductionOnHack: `[UNTRANSLATED] 75% Damage Reduction while Hacking`,
|
||||||
upgrade_OnExecutionReviveCompanion: `[UNTRANSLATED] Mercy Kills reduce Companion Recovery by 15s`,
|
upgrade_OnExecutionReviveCompanion: `[UNTRANSLATED] Mercy Kills reduce Companion Recovery by 15s`,
|
||||||
upgrade_OnExecutionParkourSpeed: `[UNTRANSLATED] +60% Parkour Speed after a Mercy for 15s`,
|
upgrade_OnExecutionParkourSpeed: `[UNTRANSLATED] +60% Parkour Speed after a Mercy for 15s`,
|
||||||
upgrade_AvatarTimeLimitIncrease: `[UNTRANSLATED] +8s to Hacking`,
|
upgrade_AvatarTimeLimitIncrease: `[UNTRANSLATED] +8s to Hacking`,
|
||||||
upgrade_ElectrifyOnHack: `[UNTRANSLATED] Shock enemies within 20m while Hacking`,
|
upgrade_ElectrifyOnHack: `[UNTRANSLATED] Shock enemies within 20m while Hacking`,
|
||||||
upgrade_OnExecutionTerrify: `[UNTRANSLATED] +50% chance for enemies within 15m to cower in fear for 8 seconds on Mercy`,
|
upgrade_OnExecutionTerrify: `[UNTRANSLATED] 50% chance for enemies within 15m to cower in fear for 8 seconds on Mercy`,
|
||||||
upgrade_OnHackLockers: `[UNTRANSLATED] Unlock 5 lockers within 20m after Hacking`,
|
upgrade_OnHackLockers: `[UNTRANSLATED] Unlock 5 lockers within 20m after Hacking`,
|
||||||
upgrade_OnExecutionBlind: `[UNTRANSLATED] Blind enemies within 18m on Mercy`,
|
upgrade_OnExecutionBlind: `[UNTRANSLATED] Blind enemies within 18m on Mercy`,
|
||||||
upgrade_OnExecutionDrainPower: `[UNTRANSLATED] +100% chance for next ability cast to gain +50% Ability Strength on Mercy`,
|
upgrade_OnExecutionDrainPower: `[UNTRANSLATED] 100% chance for next ability cast to gain +50% Ability Strength on Mercy`,
|
||||||
upgrade_OnHackSprintSpeed: `[UNTRANSLATED] +75% Sprint Speed for 15s after Hacking`,
|
upgrade_OnHackSprintSpeed: `[UNTRANSLATED] +75% Sprint Speed for 15s after Hacking`,
|
||||||
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_light: `[UNTRANSLATED] Light Theme`,
|
|
||||||
|
|
||||||
prettier_sucks_ass: ``
|
prettier_sucks_ass: ``
|
||||||
};
|
};
|
||||||
|
@ -1,10 +1,7 @@
|
|||||||
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: 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_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?`,
|
||||||
@ -114,19 +111,14 @@ 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`,
|
||||||
detailedView_archonShardsLabel: `Archon Shard Slots`,
|
powersuit_archonShardsDescription: `You can use these unlimited slots to apply a wide range of upgrades.`,
|
||||||
detailedView_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_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?`,
|
||||||
mods_rivens: `Rivens`,
|
mods_rivens: `Rivens`,
|
||||||
mods_mods: `Mods`,
|
mods_mods: `Mods`,
|
||||||
mods_addMax: `Add Maxed`,
|
|
||||||
mods_addMissingUnrankedMods: `Add Missing Unranked Mods`,
|
mods_addMissingUnrankedMods: `Add Missing Unranked Mods`,
|
||||||
mods_removeUnranked: `Remove Unranked Mods`,
|
mods_removeUnranked: `Remove Unranked Mods`,
|
||||||
mods_addMissingMaxRankMods: `Add Missing Max Rank Mods`,
|
mods_addMissingMaxRankMods: `Add Missing Max Rank Mods`,
|
||||||
@ -136,7 +128,6 @@ dict = {
|
|||||||
cheats_skipAllDialogue: `Skip All Dialogue`,
|
cheats_skipAllDialogue: `Skip All Dialogue`,
|
||||||
cheats_unlockAllScans: `Unlock All Scans`,
|
cheats_unlockAllScans: `Unlock All Scans`,
|
||||||
cheats_unlockAllMissions: `Unlock All Missions`,
|
cheats_unlockAllMissions: `Unlock All Missions`,
|
||||||
cheats_unlockAllMissions_ok: `Success. Please note that you'll need to enter a dojo/relay or relog for the client to refresh the star chart.`,
|
|
||||||
cheats_infiniteCredits: `Infinite Credits`,
|
cheats_infiniteCredits: `Infinite Credits`,
|
||||||
cheats_infinitePlatinum: `Infinite Platinum`,
|
cheats_infinitePlatinum: `Infinite Platinum`,
|
||||||
cheats_infiniteEndo: `Infinite Endo`,
|
cheats_infiniteEndo: `Infinite Endo`,
|
||||||
@ -182,13 +173,8 @@ dict = {
|
|||||||
cheats_noDojoResearchTime: `No Dojo Research Time`,
|
cheats_noDojoResearchTime: `No Dojo Research Time`,
|
||||||
cheats_fastClanAscension: `Fast Clan Ascension`,
|
cheats_fastClanAscension: `Fast Clan Ascension`,
|
||||||
cheats_missionsCanGiveAllRelics: `Missions Can Give All Relics`,
|
cheats_missionsCanGiveAllRelics: `Missions Can Give All Relics`,
|
||||||
cheats_exceptionalRelicsAlwaysGiveBronzeReward: `Exceptional Relics Always Give Bronze Reward`,
|
|
||||||
cheats_flawlessRelicsAlwaysGiveSilverReward: `Flawless Relics Always Give Silver Reward`,
|
|
||||||
cheats_radiantRelicsAlwaysGiveGoldReward: `Radiant Relics Always Give Gold Reward`,
|
|
||||||
cheats_unlockAllSimarisResearchEntries: `Unlock All Simaris Research Entries`,
|
cheats_unlockAllSimarisResearchEntries: `Unlock All Simaris Research Entries`,
|
||||||
cheats_disableDailyTribute: `Disable Daily Tribute`,
|
|
||||||
cheats_spoofMasteryRank: `Spoofed Mastery Rank (-1 to disable)`,
|
cheats_spoofMasteryRank: `Spoofed Mastery Rank (-1 to disable)`,
|
||||||
cheats_relicRewardItemCountMultiplier: `Relic Reward Item Count Multiplier`,
|
|
||||||
cheats_nightwaveStandingMultiplier: `Nightwave Standing Multiplier`,
|
cheats_nightwaveStandingMultiplier: `Nightwave Standing Multiplier`,
|
||||||
cheats_save: `Save`,
|
cheats_save: `Save`,
|
||||||
cheats_account: `Account`,
|
cheats_account: `Account`,
|
||||||
@ -243,8 +229,6 @@ dict = {
|
|||||||
normal: `Normal`,
|
normal: `Normal`,
|
||||||
worldState_allAtOnceNormal: `All At Once, Normal`,
|
worldState_allAtOnceNormal: `All At Once, Normal`,
|
||||||
worldState_allAtOnceSteelPath: `All At Once, Steel Path`,
|
worldState_allAtOnceSteelPath: `All At Once, Steel Path`,
|
||||||
worldState_theCircuitOverride: `The Circuit Override`,
|
|
||||||
worldState_darvoStockMultiplier: `Darvo Stock Multiplier`,
|
|
||||||
|
|
||||||
import_importNote: `You can provide a full or partial inventory response (client respresentation) here. All fields that are supported by the importer <b>will be overwritten</b> in your account.`,
|
import_importNote: `You can provide a full or partial inventory response (client respresentation) here. All fields that are supported by the importer <b>will be overwritten</b> in your account.`,
|
||||||
import_submit: `Submit`,
|
import_submit: `Submit`,
|
||||||
@ -269,7 +253,7 @@ dict = {
|
|||||||
upgrade_WarframeGlobeEffectEnergy: `+|VAL|% Energy Orb Effectiveness`,
|
upgrade_WarframeGlobeEffectEnergy: `+|VAL|% Energy Orb Effectiveness`,
|
||||||
upgrade_WarframeGlobeEffectHealth: `+|VAL|% Health Orb Effectiveness`,
|
upgrade_WarframeGlobeEffectHealth: `+|VAL|% Health Orb Effectiveness`,
|
||||||
upgrade_WarframeHealthMax: `+|VAL| Health`,
|
upgrade_WarframeHealthMax: `+|VAL| Health`,
|
||||||
upgrade_WarframeHPBoostFromImpact: `+|VAL1| Health on kill with Blast Damage (Max |VAL2| Health)`,
|
upgrade_WarframeHPBoostFromImpact: `+|VAL1| Health per enemy killed with Blast Damage (Max |VAL2| Health)`,
|
||||||
upgrade_WarframeParkourVelocity: `+|VAL|% Parkour Velocity`,
|
upgrade_WarframeParkourVelocity: `+|VAL|% Parkour Velocity`,
|
||||||
upgrade_WarframeRadiationDamageBoost: `+|VAL|% Ability Damage on enemies affected by Radiation Status`,
|
upgrade_WarframeRadiationDamageBoost: `+|VAL|% Ability Damage on enemies affected by Radiation Status`,
|
||||||
upgrade_WarframeRegen: `+|VAL| Health Regen/s`,
|
upgrade_WarframeRegen: `+|VAL| Health Regen/s`,
|
||||||
@ -285,33 +269,22 @@ dict = {
|
|||||||
upgrade_AvatarLootRadar: `+7m Loot Radar`,
|
upgrade_AvatarLootRadar: `+7m Loot Radar`,
|
||||||
upgrade_WeaponAmmoMax: `+15% Ammo Max`,
|
upgrade_WeaponAmmoMax: `+15% Ammo Max`,
|
||||||
upgrade_EnemyArmorReductionAura: `-3% Enemy Armor`,
|
upgrade_EnemyArmorReductionAura: `-3% Enemy Armor`,
|
||||||
upgrade_OnExecutionAmmo: `+100% Primary and Secondary Magazine Refill on Mercy`,
|
upgrade_OnExecutionAmmo: `100% Primary and Secondary Magazine Refill on Mercy`,
|
||||||
upgrade_OnExecutionHealthDrop: `+100% Health Orb Chance on Mercy`,
|
upgrade_OnExecutionHealthDrop: `100% chance to drop a Health Orb on Mercy`,
|
||||||
upgrade_OnExecutionEnergyDrop: `+50% Energy Orb Chance on Mercy`,
|
upgrade_OnExecutionEnergyDrop: `50% chance to drop an Energy Orb on Mercy`,
|
||||||
upgrade_OnFailHackReset: `+50% Hacking Retry Chance`,
|
upgrade_OnFailHackReset: `+50% to retry on Hacking failure`,
|
||||||
upgrade_DamageReductionOnHack: `+75% Damage Reduction while Hacking`,
|
upgrade_DamageReductionOnHack: `75% Damage Reduction while Hacking`,
|
||||||
upgrade_OnExecutionReviveCompanion: `Mercy Kills reduce Companion Recovery by 15s`,
|
upgrade_OnExecutionReviveCompanion: `Mercy Kills reduce Companion Recovery by 15s`,
|
||||||
upgrade_OnExecutionParkourSpeed: `+60% Parkour Speed after a Mercy for 15s`,
|
upgrade_OnExecutionParkourSpeed: `+60% Parkour Speed after a Mercy for 15s`,
|
||||||
upgrade_AvatarTimeLimitIncrease: `+8s to Hacking`,
|
upgrade_AvatarTimeLimitIncrease: `+8s to Hacking`,
|
||||||
upgrade_ElectrifyOnHack: `Shock enemies within 20m while Hacking`,
|
upgrade_ElectrifyOnHack: `Shock enemies within 20m while Hacking`,
|
||||||
upgrade_OnExecutionTerrify: `+50% chance for enemies within 15m to cower in fear for 8 seconds on Mercy`,
|
upgrade_OnExecutionTerrify: `50% chance for enemies within 15m to cower in fear for 8 seconds on Mercy`,
|
||||||
upgrade_OnHackLockers: `Unlock 5 lockers within 20m after Hacking`,
|
upgrade_OnHackLockers: `Unlock 5 lockers within 20m after Hacking`,
|
||||||
upgrade_OnExecutionBlind: `Blind enemies within 18m on Mercy`,
|
upgrade_OnExecutionBlind: `Blind enemies within 18m on Mercy`,
|
||||||
upgrade_OnExecutionDrainPower: `+100% chance for next ability cast to gain +50% Ability Strength on Mercy`,
|
upgrade_OnExecutionDrainPower: `100% chance for next ability cast to gain +50% Ability Strength on Mercy`,
|
||||||
upgrade_OnHackSprintSpeed: `+75% Sprint Speed for 15s after Hacking`,
|
upgrade_OnHackSprintSpeed: `+75% Sprint Speed for 15s after Hacking`,
|
||||||
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_light: `Light Theme`,
|
|
||||||
|
|
||||||
prettier_sucks_ass: ``
|
prettier_sucks_ass: ``
|
||||||
};
|
};
|
||||||
|
@ -1,11 +1,8 @@
|
|||||||
// Spanish translation by hxedcl
|
// Spanish translation by hxedcl
|
||||||
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: `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_addButton: `Agregar`,
|
||||||
general_setButton: `Establecer`,
|
|
||||||
general_removeButton: `Quitar`,
|
|
||||||
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?`,
|
||||||
@ -115,19 +112,14 @@ 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`,
|
||||||
detailedView_archonShardsLabel: `Ranuras de Fragmento de Archón`,
|
powersuit_archonShardsDescription: `Puedes usar estas ranuras ilimitadas para aplicar una amplia variedad de mejoras`,
|
||||||
detailedView_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_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: `Puedes establecer o quitar el bono de valencia de tu arma.`,
|
|
||||||
|
|
||||||
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?`,
|
||||||
mods_rivens: `Agrietados`,
|
mods_rivens: `Agrietados`,
|
||||||
mods_mods: `Mods`,
|
mods_mods: `Mods`,
|
||||||
mods_addMax: `[UNTRANSLATED] Add Maxed`,
|
|
||||||
mods_addMissingUnrankedMods: `Agregar mods sin rango faltantes`,
|
mods_addMissingUnrankedMods: `Agregar mods sin rango faltantes`,
|
||||||
mods_removeUnranked: `Quitar mods sin rango`,
|
mods_removeUnranked: `Quitar mods sin rango`,
|
||||||
mods_addMissingMaxRankMods: `Agregar mods de rango máximo faltantes`,
|
mods_addMissingMaxRankMods: `Agregar mods de rango máximo faltantes`,
|
||||||
@ -137,7 +129,6 @@ dict = {
|
|||||||
cheats_skipAllDialogue: `Omitir todos los diálogos`,
|
cheats_skipAllDialogue: `Omitir todos los diálogos`,
|
||||||
cheats_unlockAllScans: `Desbloquear todos los escaneos`,
|
cheats_unlockAllScans: `Desbloquear todos los escaneos`,
|
||||||
cheats_unlockAllMissions: `Desbloquear todas las misiones`,
|
cheats_unlockAllMissions: `Desbloquear todas las misiones`,
|
||||||
cheats_unlockAllMissions_ok: `Éxito. Ten en cuenta que deberás entrar a un dojo, repetidor o volver a iniciar sesión para que el cliente actualice el mapa estelar.`,
|
|
||||||
cheats_infiniteCredits: `Créditos infinitos`,
|
cheats_infiniteCredits: `Créditos infinitos`,
|
||||||
cheats_infinitePlatinum: `Platino infinito`,
|
cheats_infinitePlatinum: `Platino infinito`,
|
||||||
cheats_infiniteEndo: `Endo infinito`,
|
cheats_infiniteEndo: `Endo infinito`,
|
||||||
@ -183,69 +174,62 @@ dict = {
|
|||||||
cheats_noDojoResearchTime: `Sin tiempo de investigación del dojo`,
|
cheats_noDojoResearchTime: `Sin tiempo de investigación del dojo`,
|
||||||
cheats_fastClanAscension: `Ascenso rápido del clan`,
|
cheats_fastClanAscension: `Ascenso rápido del clan`,
|
||||||
cheats_missionsCanGiveAllRelics: `Las misiones pueden otorgar todas las reliquias`,
|
cheats_missionsCanGiveAllRelics: `Las misiones pueden otorgar todas las reliquias`,
|
||||||
cheats_exceptionalRelicsAlwaysGiveBronzeReward: `[UNTRANSLATED] Exceptional Relics Always Give Bronze Reward`,
|
|
||||||
cheats_flawlessRelicsAlwaysGiveSilverReward: `[UNTRANSLATED] Flawless Relics Always Give Silver Reward`,
|
|
||||||
cheats_radiantRelicsAlwaysGiveGoldReward: `[UNTRANSLATED] Radiant Relics Always Give Gold Reward`,
|
|
||||||
cheats_unlockAllSimarisResearchEntries: `Desbloquear todas las entradas de investigación de Simaris`,
|
cheats_unlockAllSimarisResearchEntries: `Desbloquear todas las entradas de investigación de Simaris`,
|
||||||
cheats_disableDailyTribute: `Desactivar tributo diario`,
|
|
||||||
cheats_spoofMasteryRank: `Rango de maestría simulado (-1 para desactivar)`,
|
cheats_spoofMasteryRank: `Rango de maestría simulado (-1 para desactivar)`,
|
||||||
cheats_relicRewardItemCountMultiplier: `[UNTRANSLATED] Relic Reward Item Count Multiplier`,
|
|
||||||
cheats_nightwaveStandingMultiplier: `Multiplicador de Reputación de Onda Nocturna`,
|
cheats_nightwaveStandingMultiplier: `Multiplicador de Reputación de Onda Nocturna`,
|
||||||
cheats_save: `Guardar`,
|
cheats_save: `Guardar`,
|
||||||
cheats_account: `Cuenta`,
|
cheats_account: `Cuenta`,
|
||||||
cheats_unlockAllFocusSchools: `Desbloquear todas las escuelas de enfoque`,
|
cheats_unlockAllFocusSchools: `Desbloquear todas las escuelas de enfoque`,
|
||||||
cheats_helminthUnlockAll: `Subir al máximo el Helminto`,
|
cheats_helminthUnlockAll: `Subir al máximo el Helminto`,
|
||||||
cheats_addMissingSubsumedAbilities: `Agregar habilidades subsumidas faltantes`,
|
cheats_addMissingSubsumedAbilities: `[UNTRANSLATED] Add Missing Subsumed Abilities`,
|
||||||
cheats_intrinsicsUnlockAll: `Maximizar todos los intrínsecos`,
|
cheats_intrinsicsUnlockAll: `Maximizar todos los intrínsecos`,
|
||||||
cheats_changeSupportedSyndicate: `Sindicatos disponibles`,
|
cheats_changeSupportedSyndicate: `Sindicatos disponibles`,
|
||||||
cheats_changeButton: `Cambiar`,
|
cheats_changeButton: `Cambiar`,
|
||||||
cheats_none: `Ninguno`,
|
cheats_none: `Ninguno`,
|
||||||
|
|
||||||
worldState: `Estado del mundo`,
|
worldState: `[UNTRANSLATED] World State`,
|
||||||
worldState_creditBoost: `Potenciador de Créditos`,
|
worldState_creditBoost: `[UNTRANSLATED] Credit Boost`,
|
||||||
worldState_affinityBoost: `Potenciador de Afinidad`,
|
worldState_affinityBoost: `[UNTRANSLATED] Affinity Boost`,
|
||||||
worldState_resourceBoost: `Potenciador de Recursos`,
|
worldState_resourceBoost: `[UNTRANSLATED] Resource Boost`,
|
||||||
worldState_starDays: `Días estelares`,
|
worldState_starDays: `[UNTRANSLATED] Star Days`,
|
||||||
worldState_galleonOfGhouls: `Galeón de Gules`,
|
worldState_galleonOfGhouls: `[UNTRANSLATED] Galleon of Ghouls`,
|
||||||
disabled: `Desactivado`,
|
disabled: `[UNTRANSLATED] Disabled`,
|
||||||
worldState_we1: `Semana 1`,
|
worldState_we1: `[UNTRANSLATED] Weekend 1`,
|
||||||
worldState_we2: `Semana 2`,
|
worldState_we2: `[UNTRANSLATED] Weekend 2`,
|
||||||
worldState_we3: `Semana 3`,
|
worldState_we3: `[UNTRANSLATED] Weekend 3`,
|
||||||
worldState_eidolonOverride: `Tiempo de las Llanuras de Eidolon`,
|
worldState_eidolonOverride: `[UNTRANSLATED] Eidolon Override`,
|
||||||
worldState_day: `Dia`,
|
worldState_day: `[UNTRANSLATED] Day`,
|
||||||
worldState_night: `Noche`,
|
worldState_night: `[UNTRANSLATED] Night`,
|
||||||
worldState_vallisOverride: `Tiempo del Valle del Orbe`,
|
worldState_vallisOverride: `[UNTRANSLATED] Orb Vallis Override`,
|
||||||
worldState_warm: `Cálido`,
|
worldState_warm: `[UNTRANSLATED] Warm`,
|
||||||
worldState_cold: `Frío`,
|
worldState_cold: `[UNTRANSLATED] Cold`,
|
||||||
worldState_duviriOverride: `Tiempo de Duviri`,
|
worldState_duviriOverride: `[UNTRANSLATED] Duviri Override`,
|
||||||
worldState_joy: `Alegría`,
|
worldState_joy: `[UNTRANSLATED] Joy`,
|
||||||
worldState_anger: `Ira`,
|
worldState_anger: `[UNTRANSLATED] Anger`,
|
||||||
worldState_envy: `Envidia`,
|
worldState_envy: `[UNTRANSLATED] Envy`,
|
||||||
worldState_sorrow: `Tristeza`,
|
worldState_sorrow: `[UNTRANSLATED] Sorrow`,
|
||||||
worldState_fear: `Miedo`,
|
worldState_fear: `[UNTRANSLATED] Fear`,
|
||||||
worldState_nightwaveOverride: `Volúmen de Onda Nocturna`,
|
worldState_nightwaveOverride: `[UNTRANSLATED] Nightwave Override`,
|
||||||
worldState_RadioLegionIntermission13Syndicate: `Mix de Nora Vol. 9`,
|
worldState_RadioLegionIntermission13Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 9`,
|
||||||
worldState_RadioLegionIntermission12Syndicate: `Mix de Nora Vol. 8`,
|
worldState_RadioLegionIntermission12Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 8`,
|
||||||
worldState_RadioLegionIntermission11Syndicate: `Mix de Nora Vol. 7`,
|
worldState_RadioLegionIntermission11Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 7`,
|
||||||
worldState_RadioLegionIntermission10Syndicate: `Mix de Nora Vol. 6 `,
|
worldState_RadioLegionIntermission10Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 6`,
|
||||||
worldState_RadioLegionIntermission9Syndicate: `Mix de Nora Vol. 5`,
|
worldState_RadioLegionIntermission9Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 5`,
|
||||||
worldState_RadioLegionIntermission8Syndicate: `Mix de Nora Vol. 4`,
|
worldState_RadioLegionIntermission8Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 4`,
|
||||||
worldState_RadioLegionIntermission7Syndicate: `Mix de Nora Vol. 3`,
|
worldState_RadioLegionIntermission7Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 3`,
|
||||||
worldState_RadioLegionIntermission6Syndicate: `Mix de Nora Vol. 2`,
|
worldState_RadioLegionIntermission6Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 2`,
|
||||||
worldState_RadioLegionIntermission5Syndicate: `Mix de Nora Vol. 1`,
|
worldState_RadioLegionIntermission5Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 1`,
|
||||||
worldState_RadioLegionIntermission4Syndicate: `Elección de Nora`,
|
worldState_RadioLegionIntermission4Syndicate: `[UNTRANSLATED] Nora's Choice`,
|
||||||
worldState_RadioLegionIntermission3Syndicate: `Intermedio III`,
|
worldState_RadioLegionIntermission3Syndicate: `[UNTRANSLATED] Intermission III`,
|
||||||
worldState_RadioLegion3Syndicate: `El Artesano de Cristal`,
|
worldState_RadioLegion3Syndicate: `[UNTRANSLATED] Glassmaker`,
|
||||||
worldState_RadioLegionIntermission2Syndicate: `Intermedio II`,
|
worldState_RadioLegionIntermission2Syndicate: `[UNTRANSLATED] Intermission II`,
|
||||||
worldState_RadioLegion2Syndicate: `El Emisario`,
|
worldState_RadioLegion2Syndicate: `[UNTRANSLATED] The Emissary`,
|
||||||
worldState_RadioLegionIntermissionSyndicate: `Intermedio I`,
|
worldState_RadioLegionIntermissionSyndicate: `[UNTRANSLATED] Intermission I`,
|
||||||
worldState_RadioLegionSyndicate: `El lobo de Saturno Seis`,
|
worldState_RadioLegionSyndicate: `[UNTRANSLATED] The Wolf of Saturn Six`,
|
||||||
worldState_fissures: `Fisuras`,
|
worldState_fissures: `[UNTRANSLATED] Fissures`,
|
||||||
normal: `Normal`,
|
normal: `[UNTRANSLATED] Normal`,
|
||||||
worldState_allAtOnceNormal: `Todo a la vez, normal`,
|
worldState_allAtOnceNormal: `[UNTRANSLATED] All At Once, Normal`,
|
||||||
worldState_allAtOnceSteelPath: `Todo a la vez, Camino de Acero`,
|
worldState_allAtOnceSteelPath: `[UNTRANSLATED] All At Once, Steel Path`,
|
||||||
worldState_theCircuitOverride: `Cambio del Circuito`,
|
|
||||||
worldState_darvoStockMultiplier: `Multiplicador de stock de Darvo`,
|
|
||||||
|
|
||||||
import_importNote: `Puedes proporcionar una respuesta de inventario completa o parcial (representación del cliente) aquí. Todos los campos compatibles con el importador <b>serán sobrescritos</b> en tu cuenta.`,
|
import_importNote: `Puedes proporcionar una respuesta de inventario completa o parcial (representación del cliente) aquí. Todos los campos compatibles con el importador <b>serán sobrescritos</b> en tu cuenta.`,
|
||||||
import_submit: `Enviar`,
|
import_submit: `Enviar`,
|
||||||
@ -270,7 +254,7 @@ dict = {
|
|||||||
upgrade_WarframeGlobeEffectEnergy: `+|VAL|% de efectividad de orbes de energía`,
|
upgrade_WarframeGlobeEffectEnergy: `+|VAL|% de efectividad de orbes de energía`,
|
||||||
upgrade_WarframeGlobeEffectHealth: `+|VAL|% de efectividad de orbes de salud`,
|
upgrade_WarframeGlobeEffectHealth: `+|VAL|% de efectividad de orbes de salud`,
|
||||||
upgrade_WarframeHealthMax: `+|VAL| de salud máxima`,
|
upgrade_WarframeHealthMax: `+|VAL| de salud máxima`,
|
||||||
upgrade_WarframeHPBoostFromImpact: `+|VAL1| de salud al eliminar con daño explosivo (máx. |VAL2| de salud)`,
|
upgrade_WarframeHPBoostFromImpact: `+|VAL1| de salud por enemigo eliminado con daño explosivo (máximo |VAL2| de salud)`,
|
||||||
upgrade_WarframeParkourVelocity: `+|VAL|% de velocidad de parkour`,
|
upgrade_WarframeParkourVelocity: `+|VAL|% de velocidad de parkour`,
|
||||||
upgrade_WarframeRadiationDamageBoost: `+|VAL|% de daño de habilidades a enemigos con estado radiactivo`,
|
upgrade_WarframeRadiationDamageBoost: `+|VAL|% de daño de habilidades a enemigos con estado radiactivo`,
|
||||||
upgrade_WarframeRegen: `+|VAL| de regeneración de salud por segundo`,
|
upgrade_WarframeRegen: `+|VAL| de regeneración de salud por segundo`,
|
||||||
@ -293,7 +277,7 @@ dict = {
|
|||||||
upgrade_DamageReductionOnHack: `75% de reducción de daño al hackear`,
|
upgrade_DamageReductionOnHack: `75% de reducción de daño al hackear`,
|
||||||
upgrade_OnExecutionReviveCompanion: `Las ejecuciones reducen el tiempo de recuperación del compañero en 15s`,
|
upgrade_OnExecutionReviveCompanion: `Las ejecuciones reducen el tiempo de recuperación del compañero en 15s`,
|
||||||
upgrade_OnExecutionParkourSpeed: `+60% de velocidad de parkour durante 15s tras una ejecución`,
|
upgrade_OnExecutionParkourSpeed: `+60% de velocidad de parkour durante 15s tras una ejecución`,
|
||||||
upgrade_AvatarTimeLimitIncrease: `+8s para hackear`,
|
upgrade_AvatarTimeLimitIncrease: `[UNTRANSLATED] +8s to Hacking`,
|
||||||
upgrade_ElectrifyOnHack: `Electrocuta a los enemigos en un radio de 20m al hackear`,
|
upgrade_ElectrifyOnHack: `Electrocuta a los enemigos en un radio de 20m al hackear`,
|
||||||
upgrade_OnExecutionTerrify: `50% de probabilidad de que enemigos en un radio de 15m entren en pánico por 8s tras una ejecución`,
|
upgrade_OnExecutionTerrify: `50% de probabilidad de que enemigos en un radio de 15m entren en pánico por 8s tras una ejecución`,
|
||||||
upgrade_OnHackLockers: `Desbloquea 5 casilleros en un radio de 20m tras hackear`,
|
upgrade_OnHackLockers: `Desbloquea 5 casilleros en un radio de 20m tras hackear`,
|
||||||
@ -303,16 +287,5 @@ 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: `Tema Oscuro`,
|
|
||||||
theme_light: `Tema Claro`,
|
|
||||||
|
|
||||||
prettier_sucks_ass: ``
|
prettier_sucks_ass: ``
|
||||||
};
|
};
|
||||||
|
@ -1,11 +1,8 @@
|
|||||||
// French translation by Vitruvio
|
// French translation by Vitruvio
|
||||||
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: `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_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 :`,
|
||||||
@ -115,19 +112,14 @@ 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`,
|
||||||
detailedView_archonShardsLabel: `Emplacements de fragments d'Archonte`,
|
powersuit_archonShardsDescription: `Slots illimités pour appliquer plusieurs améliorations`,
|
||||||
detailedView_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_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 ?`,
|
||||||
mods_rivens: `Rivens`,
|
mods_rivens: `Rivens`,
|
||||||
mods_mods: `Mods`,
|
mods_mods: `Mods`,
|
||||||
mods_addMax: `[UNTRANSLATED] Add Maxed`,
|
|
||||||
mods_addMissingUnrankedMods: `Ajouter les mods sans rang manquants`,
|
mods_addMissingUnrankedMods: `Ajouter les mods sans rang manquants`,
|
||||||
mods_removeUnranked: `Retirer les mods sans rang`,
|
mods_removeUnranked: `Retirer les mods sans rang`,
|
||||||
mods_addMissingMaxRankMods: `Ajouter les mods niveau max manquants`,
|
mods_addMissingMaxRankMods: `Ajouter les mods niveau max manquants`,
|
||||||
@ -137,7 +129,6 @@ dict = {
|
|||||||
cheats_skipAllDialogue: `Passer les dialogues`,
|
cheats_skipAllDialogue: `Passer les dialogues`,
|
||||||
cheats_unlockAllScans: `Débloquer tous les scans`,
|
cheats_unlockAllScans: `Débloquer tous les scans`,
|
||||||
cheats_unlockAllMissions: `Débloquer toutes les missions`,
|
cheats_unlockAllMissions: `Débloquer toutes les missions`,
|
||||||
cheats_unlockAllMissions_ok: `[UNTRANSLATED] Success. Please note that you'll need to enter a dojo/relay or relog for the client to refresh the star chart.`,
|
|
||||||
cheats_infiniteCredits: `Crédits infinis`,
|
cheats_infiniteCredits: `Crédits infinis`,
|
||||||
cheats_infinitePlatinum: `Platinum infini`,
|
cheats_infinitePlatinum: `Platinum infini`,
|
||||||
cheats_infiniteEndo: `Endo infini`,
|
cheats_infiniteEndo: `Endo infini`,
|
||||||
@ -183,13 +174,8 @@ dict = {
|
|||||||
cheats_noDojoResearchTime: `Aucun temps de recherche (Dojo)`,
|
cheats_noDojoResearchTime: `Aucun temps de recherche (Dojo)`,
|
||||||
cheats_fastClanAscension: `Ascension de clan rapide`,
|
cheats_fastClanAscension: `Ascension de clan rapide`,
|
||||||
cheats_missionsCanGiveAllRelics: `Les missions donnent toutes les reliques`,
|
cheats_missionsCanGiveAllRelics: `Les missions donnent toutes les reliques`,
|
||||||
cheats_exceptionalRelicsAlwaysGiveBronzeReward: `[UNTRANSLATED] Exceptional Relics Always Give Bronze Reward`,
|
|
||||||
cheats_flawlessRelicsAlwaysGiveSilverReward: `[UNTRANSLATED] Flawless Relics Always Give Silver Reward`,
|
|
||||||
cheats_radiantRelicsAlwaysGiveGoldReward: `[UNTRANSLATED] Radiant Relics Always Give Gold Reward`,
|
|
||||||
cheats_unlockAllSimarisResearchEntries: `Débloquer toute les recherches chez Simaris`,
|
cheats_unlockAllSimarisResearchEntries: `Débloquer toute les recherches chez Simaris`,
|
||||||
cheats_disableDailyTribute: `[UNTRANSLATED] Disable Daily Tribute`,
|
|
||||||
cheats_spoofMasteryRank: `Rang de maîtrise personnalisé (-1 pour désactiver)`,
|
cheats_spoofMasteryRank: `Rang de maîtrise personnalisé (-1 pour désactiver)`,
|
||||||
cheats_relicRewardItemCountMultiplier: `[UNTRANSLATED] Relic Reward Item Count Multiplier`,
|
|
||||||
cheats_nightwaveStandingMultiplier: `Multiplicateur de réputation d'Ondes Nocturnes`,
|
cheats_nightwaveStandingMultiplier: `Multiplicateur de réputation d'Ondes Nocturnes`,
|
||||||
cheats_save: `Sauvegarder`,
|
cheats_save: `Sauvegarder`,
|
||||||
cheats_account: `Compte`,
|
cheats_account: `Compte`,
|
||||||
@ -244,8 +230,6 @@ dict = {
|
|||||||
normal: `[UNTRANSLATED] Normal`,
|
normal: `[UNTRANSLATED] Normal`,
|
||||||
worldState_allAtOnceNormal: `[UNTRANSLATED] All At Once, Normal`,
|
worldState_allAtOnceNormal: `[UNTRANSLATED] All At Once, Normal`,
|
||||||
worldState_allAtOnceSteelPath: `[UNTRANSLATED] All At Once, Steel Path`,
|
worldState_allAtOnceSteelPath: `[UNTRANSLATED] All At Once, Steel Path`,
|
||||||
worldState_theCircuitOverride: `[UNTRANSLATED] The Circuit Override`,
|
|
||||||
worldState_darvoStockMultiplier: `[UNTRANSLATED] Darvo Stock Multiplier`,
|
|
||||||
|
|
||||||
import_importNote: `Import manuel. Toutes les modifcations supportées par l'inventaire <b>écraseront celles présentes dans la base de données</b>.`,
|
import_importNote: `Import manuel. Toutes les modifcations supportées par l'inventaire <b>écraseront celles présentes dans la base de données</b>.`,
|
||||||
import_submit: `Soumettre`,
|
import_submit: `Soumettre`,
|
||||||
@ -270,7 +254,7 @@ dict = {
|
|||||||
upgrade_WarframeGlobeEffectEnergy: `+|VAL|% d'efficacité d'orbe d'énergie`,
|
upgrade_WarframeGlobeEffectEnergy: `+|VAL|% d'efficacité d'orbe d'énergie`,
|
||||||
upgrade_WarframeGlobeEffectHealth: `+|VAL|% d'efficacité d'orbe de santé`,
|
upgrade_WarframeGlobeEffectHealth: `+|VAL|% d'efficacité d'orbe de santé`,
|
||||||
upgrade_WarframeHealthMax: `+|VAL| de santé`,
|
upgrade_WarframeHealthMax: `+|VAL| de santé`,
|
||||||
upgrade_WarframeHPBoostFromImpact: `[UNTRANSLATED] +|VAL1| Health on kill with Blast Damage (Max |VAL2| Health)`,
|
upgrade_WarframeHPBoostFromImpact: `+|VAL1| de santé par ennemi tué avec des dégâts explosifs (Max |VAL2| de santé)`,
|
||||||
upgrade_WarframeParkourVelocity: `+|VAL|% de vélocité de parkour`,
|
upgrade_WarframeParkourVelocity: `+|VAL|% de vélocité de parkour`,
|
||||||
upgrade_WarframeRadiationDamageBoost: `+|VAL|% de dégâts de pouvoir sur les ennemis affectés par du statut radiation`,
|
upgrade_WarframeRadiationDamageBoost: `+|VAL|% de dégâts de pouvoir sur les ennemis affectés par du statut radiation`,
|
||||||
upgrade_WarframeRegen: `+|VAL| régénération de santé/s`,
|
upgrade_WarframeRegen: `+|VAL| régénération de santé/s`,
|
||||||
@ -289,7 +273,7 @@ dict = {
|
|||||||
upgrade_OnExecutionAmmo: `100% de rechargement des armes primaires et secondaires sur une une miséricorde`,
|
upgrade_OnExecutionAmmo: `100% de rechargement des armes primaires et secondaires sur une une miséricorde`,
|
||||||
upgrade_OnExecutionHealthDrop: `100% de chance de drop une orbe de santé sur une miséricorde`,
|
upgrade_OnExecutionHealthDrop: `100% de chance de drop une orbe de santé sur une miséricorde`,
|
||||||
upgrade_OnExecutionEnergyDrop: `50% de chance de drop une orbe d'énergie sur une miséricorde`,
|
upgrade_OnExecutionEnergyDrop: `50% de chance de drop une orbe d'énergie sur une miséricorde`,
|
||||||
upgrade_OnFailHackReset: `[UNTRANSLATED] +50% Hacking Retry Chance`,
|
upgrade_OnFailHackReset: `[UNTRANSLATED] +50% to retry on Hacking failure`,
|
||||||
upgrade_DamageReductionOnHack: `75% de réduction de dégâts pendant un piratage`,
|
upgrade_DamageReductionOnHack: `75% de réduction de dégâts pendant un piratage`,
|
||||||
upgrade_OnExecutionReviveCompanion: `Les miséricordes réduisent le temps de récupération du compagnon de 15s`,
|
upgrade_OnExecutionReviveCompanion: `Les miséricordes réduisent le temps de récupération du compagnon de 15s`,
|
||||||
upgrade_OnExecutionParkourSpeed: `+60% de vitesse de parkour pendant 15s après une miséricorde`,
|
upgrade_OnExecutionParkourSpeed: `+60% de vitesse de parkour pendant 15s après une miséricorde`,
|
||||||
@ -303,16 +287,5 @@ dict = {
|
|||||||
upgrade_SwiftExecute: `Vitesse des miséricordes augmentée de 50%`,
|
upgrade_SwiftExecute: `Vitesse des miséricordes augmentée de 50%`,
|
||||||
upgrade_OnHackInvis: `Invisible pendant 15 secondes après un piratage`,
|
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`,
|
|
||||||
|
|
||||||
theme_dark: `[UNTRANSLATED] Dark Theme`,
|
|
||||||
theme_light: `[UNTRANSLATED] Light Theme`,
|
|
||||||
|
|
||||||
prettier_sucks_ass: ``
|
prettier_sucks_ass: ``
|
||||||
};
|
};
|
||||||
|
@ -1,11 +1,8 @@
|
|||||||
// Russian translation by AMelonInsideLemon
|
// Russian translation by AMelonInsideLemon
|
||||||
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: `Примечание: изменения, внесенные здесь, отобразятся в игре только после повторной загрузки вашего инвентаря. Посещение навигации — самый простой способ этого добиться.`,
|
||||||
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: `Какое имя вы хотите установить для своей учетной записи?`,
|
||||||
@ -115,19 +112,14 @@ dict = {
|
|||||||
currency_FusionPoints: `Эндо`,
|
currency_FusionPoints: `Эндо`,
|
||||||
currency_PrimeTokens: `Королевские Айя`,
|
currency_PrimeTokens: `Королевские Айя`,
|
||||||
currency_owned: `У тебя |COUNT|.`,
|
currency_owned: `У тебя |COUNT|.`,
|
||||||
|
powersuit_archonShardsLabel: `Ячейки осколков архонта`,
|
||||||
detailedView_archonShardsLabel: `Ячейки осколков архонта`,
|
powersuit_archonShardsDescription: `Вы можете использовать эти неограниченные ячейки для установки множества улучшений.`,
|
||||||
detailedView_archonShardsDescription: `Вы можете использовать эти неограниченные ячейки для установки множества улучшений.`,
|
powersuit_archonShardsDescription2: `Обратите внимание: каждый фрагмент архонта применяется с задержкой при загрузке.`,
|
||||||
detailedView_archonShardsDescription2: `Обратите внимание: каждый фрагмент архонта применяется с задержкой при загрузке.`,
|
|
||||||
detailedView_valenceBonusLabel: `Бонус Валентности`,
|
|
||||||
detailedView_valenceBonusDescription: `Вы можете установить или убрать бонус валентности с вашего оружия.`,
|
|
||||||
|
|
||||||
mods_addRiven: `Добавить Мод Разлома`,
|
mods_addRiven: `Добавить Мод Разлома`,
|
||||||
mods_fingerprint: `Отпечаток`,
|
mods_fingerprint: `Отпечаток`,
|
||||||
mods_fingerprintHelp: `Нужна помощь с отпечатком?`,
|
mods_fingerprintHelp: `Нужна помощь с отпечатком?`,
|
||||||
mods_rivens: `Моды Разлома`,
|
mods_rivens: `Моды Разлома`,
|
||||||
mods_mods: `Моды`,
|
mods_mods: `Моды`,
|
||||||
mods_addMax: `[UNTRANSLATED] Add Maxed`,
|
|
||||||
mods_addMissingUnrankedMods: `Добавить недостающие моды без ранга`,
|
mods_addMissingUnrankedMods: `Добавить недостающие моды без ранга`,
|
||||||
mods_removeUnranked: `Удалить моды без ранга`,
|
mods_removeUnranked: `Удалить моды без ранга`,
|
||||||
mods_addMissingMaxRankMods: `Добавить недостающие моды максимального ранга`,
|
mods_addMissingMaxRankMods: `Добавить недостающие моды максимального ранга`,
|
||||||
@ -137,7 +129,6 @@ dict = {
|
|||||||
cheats_skipAllDialogue: `Пропустить все диалоги`,
|
cheats_skipAllDialogue: `Пропустить все диалоги`,
|
||||||
cheats_unlockAllScans: `Разблокировать все сканирования`,
|
cheats_unlockAllScans: `Разблокировать все сканирования`,
|
||||||
cheats_unlockAllMissions: `Разблокировать все миссии`,
|
cheats_unlockAllMissions: `Разблокировать все миссии`,
|
||||||
cheats_unlockAllMissions_ok: `[UNTRANSLATED] Success. Please note that you'll need to enter a dojo/relay or relog for the client to refresh the star chart.`,
|
|
||||||
cheats_infiniteCredits: `Бесконечные кредиты`,
|
cheats_infiniteCredits: `Бесконечные кредиты`,
|
||||||
cheats_infinitePlatinum: `Бесконечная платина`,
|
cheats_infinitePlatinum: `Бесконечная платина`,
|
||||||
cheats_infiniteEndo: `Бесконечное эндо`,
|
cheats_infiniteEndo: `Бесконечное эндо`,
|
||||||
@ -183,13 +174,8 @@ dict = {
|
|||||||
cheats_noDojoResearchTime: `Мгновенные Исследование Додзё`,
|
cheats_noDojoResearchTime: `Мгновенные Исследование Додзё`,
|
||||||
cheats_fastClanAscension: `Мгновенное Вознесение Клана`,
|
cheats_fastClanAscension: `Мгновенное Вознесение Клана`,
|
||||||
cheats_missionsCanGiveAllRelics: `[UNTRANSLATED] Missions Can Give All Relics`,
|
cheats_missionsCanGiveAllRelics: `[UNTRANSLATED] Missions Can Give All Relics`,
|
||||||
cheats_exceptionalRelicsAlwaysGiveBronzeReward: `[UNTRANSLATED] Exceptional Relics Always Give Bronze Reward`,
|
|
||||||
cheats_flawlessRelicsAlwaysGiveSilverReward: `[UNTRANSLATED] Flawless Relics Always Give Silver Reward`,
|
|
||||||
cheats_radiantRelicsAlwaysGiveGoldReward: `[UNTRANSLATED] Radiant Relics Always Give Gold Reward`,
|
|
||||||
cheats_unlockAllSimarisResearchEntries: `[UNTRANSLATED] Unlock All Simaris Research Entries`,
|
cheats_unlockAllSimarisResearchEntries: `[UNTRANSLATED] Unlock All Simaris Research Entries`,
|
||||||
cheats_disableDailyTribute: `[UNTRANSLATED] Disable Daily Tribute`,
|
|
||||||
cheats_spoofMasteryRank: `Подделанный ранг мастерства (-1 для отключения)`,
|
cheats_spoofMasteryRank: `Подделанный ранг мастерства (-1 для отключения)`,
|
||||||
cheats_relicRewardItemCountMultiplier: `[UNTRANSLATED] Relic Reward Item Count Multiplier`,
|
|
||||||
cheats_nightwaveStandingMultiplier: `[UNTRANSLATED] Nightwave Standing Multiplier`,
|
cheats_nightwaveStandingMultiplier: `[UNTRANSLATED] Nightwave Standing Multiplier`,
|
||||||
cheats_save: `[UNTRANSLATED] Save`,
|
cheats_save: `[UNTRANSLATED] Save`,
|
||||||
cheats_account: `Аккаунт`,
|
cheats_account: `Аккаунт`,
|
||||||
@ -244,8 +230,6 @@ dict = {
|
|||||||
normal: `[UNTRANSLATED] Normal`,
|
normal: `[UNTRANSLATED] Normal`,
|
||||||
worldState_allAtOnceNormal: `[UNTRANSLATED] All At Once, Normal`,
|
worldState_allAtOnceNormal: `[UNTRANSLATED] All At Once, Normal`,
|
||||||
worldState_allAtOnceSteelPath: `[UNTRANSLATED] All At Once, Steel Path`,
|
worldState_allAtOnceSteelPath: `[UNTRANSLATED] All At Once, Steel Path`,
|
||||||
worldState_theCircuitOverride: `[UNTRANSLATED] The Circuit Override`,
|
|
||||||
worldState_darvoStockMultiplier: `[UNTRANSLATED] Darvo Stock Multiplier`,
|
|
||||||
|
|
||||||
import_importNote: `Вы можете загрузить полный или частичный ответ инвентаря (клиентское представление) здесь. Все поддерживаемые поля <b>будут перезаписаны</b> в вашем аккаунте.`,
|
import_importNote: `Вы можете загрузить полный или частичный ответ инвентаря (клиентское представление) здесь. Все поддерживаемые поля <b>будут перезаписаны</b> в вашем аккаунте.`,
|
||||||
import_submit: `Отправить`,
|
import_submit: `Отправить`,
|
||||||
@ -270,7 +254,7 @@ dict = {
|
|||||||
upgrade_WarframeGlobeEffectEnergy: `[UNTRANSLATED] +|VAL|% Energy Orb Effectiveness`,
|
upgrade_WarframeGlobeEffectEnergy: `[UNTRANSLATED] +|VAL|% Energy Orb Effectiveness`,
|
||||||
upgrade_WarframeGlobeEffectHealth: `[UNTRANSLATED] +|VAL|% Health Orb Effectiveness`,
|
upgrade_WarframeGlobeEffectHealth: `[UNTRANSLATED] +|VAL|% Health Orb Effectiveness`,
|
||||||
upgrade_WarframeHealthMax: `[UNTRANSLATED] +|VAL| Health`,
|
upgrade_WarframeHealthMax: `[UNTRANSLATED] +|VAL| Health`,
|
||||||
upgrade_WarframeHPBoostFromImpact: `[UNTRANSLATED] +|VAL1| Health on kill with Blast Damage (Max |VAL2| Health)`,
|
upgrade_WarframeHPBoostFromImpact: `[UNTRANSLATED] +|VAL1| Health per enemy killed with Blast Damage (Max |VAL2| Health)`,
|
||||||
upgrade_WarframeParkourVelocity: `[UNTRANSLATED] +|VAL|% Parkour Velocity`,
|
upgrade_WarframeParkourVelocity: `[UNTRANSLATED] +|VAL|% Parkour Velocity`,
|
||||||
upgrade_WarframeRadiationDamageBoost: `[UNTRANSLATED] +|VAL|% Ability Damage on enemies affected by Radiation Status`,
|
upgrade_WarframeRadiationDamageBoost: `[UNTRANSLATED] +|VAL|% Ability Damage on enemies affected by Radiation Status`,
|
||||||
upgrade_WarframeRegen: `[UNTRANSLATED] +|VAL| Health Regen/s`,
|
upgrade_WarframeRegen: `[UNTRANSLATED] +|VAL| Health Regen/s`,
|
||||||
@ -286,33 +270,22 @@ dict = {
|
|||||||
upgrade_AvatarLootRadar: `[UNTRANSLATED] +7m Loot Radar`,
|
upgrade_AvatarLootRadar: `[UNTRANSLATED] +7m Loot Radar`,
|
||||||
upgrade_WeaponAmmoMax: `[UNTRANSLATED] +15% Ammo Max`,
|
upgrade_WeaponAmmoMax: `[UNTRANSLATED] +15% Ammo Max`,
|
||||||
upgrade_EnemyArmorReductionAura: `[UNTRANSLATED] -3% Enemy Armor`,
|
upgrade_EnemyArmorReductionAura: `[UNTRANSLATED] -3% Enemy Armor`,
|
||||||
upgrade_OnExecutionAmmo: `[UNTRANSLATED] +100% Primary and Secondary Magazine Refill on Mercy`,
|
upgrade_OnExecutionAmmo: `[UNTRANSLATED] 100% Primary and Secondary Magazine Refill on Mercy`,
|
||||||
upgrade_OnExecutionHealthDrop: `[UNTRANSLATED] +100% Health Orb Chance on Mercy`,
|
upgrade_OnExecutionHealthDrop: `[UNTRANSLATED] 100% chance to drop a Health Orb on Mercy`,
|
||||||
upgrade_OnExecutionEnergyDrop: `[UNTRANSLATED] +50% Energy Orb Chance on Mercy`,
|
upgrade_OnExecutionEnergyDrop: `[UNTRANSLATED] 50% chance to drop an Energy Orb on Mercy`,
|
||||||
upgrade_OnFailHackReset: `[UNTRANSLATED] +50% Hacking Retry Chance`,
|
upgrade_OnFailHackReset: `[UNTRANSLATED] +50% to retry on Hacking failure`,
|
||||||
upgrade_DamageReductionOnHack: `[UNTRANSLATED] +75% Damage Reduction while Hacking`,
|
upgrade_DamageReductionOnHack: `[UNTRANSLATED] 75% Damage Reduction while Hacking`,
|
||||||
upgrade_OnExecutionReviveCompanion: `[UNTRANSLATED] Mercy Kills reduce Companion Recovery by 15s`,
|
upgrade_OnExecutionReviveCompanion: `[UNTRANSLATED] Mercy Kills reduce Companion Recovery by 15s`,
|
||||||
upgrade_OnExecutionParkourSpeed: `[UNTRANSLATED] +60% Parkour Speed after a Mercy for 15s`,
|
upgrade_OnExecutionParkourSpeed: `[UNTRANSLATED] +60% Parkour Speed after a Mercy for 15s`,
|
||||||
upgrade_AvatarTimeLimitIncrease: `[UNTRANSLATED] +8s to Hacking`,
|
upgrade_AvatarTimeLimitIncrease: `[UNTRANSLATED] +8s to Hacking`,
|
||||||
upgrade_ElectrifyOnHack: `[UNTRANSLATED] Shock enemies within 20m while Hacking`,
|
upgrade_ElectrifyOnHack: `[UNTRANSLATED] Shock enemies within 20m while Hacking`,
|
||||||
upgrade_OnExecutionTerrify: `[UNTRANSLATED] +50% chance for enemies within 15m to cower in fear for 8 seconds on Mercy`,
|
upgrade_OnExecutionTerrify: `[UNTRANSLATED] 50% chance for enemies within 15m to cower in fear for 8 seconds on Mercy`,
|
||||||
upgrade_OnHackLockers: `[UNTRANSLATED] Unlock 5 lockers within 20m after Hacking`,
|
upgrade_OnHackLockers: `[UNTRANSLATED] Unlock 5 lockers within 20m after Hacking`,
|
||||||
upgrade_OnExecutionBlind: `[UNTRANSLATED] Blind enemies within 18m on Mercy`,
|
upgrade_OnExecutionBlind: `[UNTRANSLATED] Blind enemies within 18m on Mercy`,
|
||||||
upgrade_OnExecutionDrainPower: `[UNTRANSLATED] +100% chance for next ability cast to gain +50% Ability Strength on Mercy`,
|
upgrade_OnExecutionDrainPower: `[UNTRANSLATED] 100% chance for next ability cast to gain +50% Ability Strength on Mercy`,
|
||||||
upgrade_OnHackSprintSpeed: `[UNTRANSLATED] +75% Sprint Speed for 15s after Hacking`,
|
upgrade_OnHackSprintSpeed: `[UNTRANSLATED] +75% Sprint Speed for 15s after Hacking`,
|
||||||
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_light: `[UNTRANSLATED] Light Theme`,
|
|
||||||
|
|
||||||
prettier_sucks_ass: ``
|
prettier_sucks_ass: ``
|
||||||
};
|
};
|
||||||
|
@ -1,11 +1,8 @@
|
|||||||
// Chinese translation by meb154, bishan178 & Corvus
|
// Chinese translation by meb154, bishan178 & Corvus
|
||||||
dict = {
|
dict = {
|
||||||
general_inventoryUpdateNote: `注意:要在游戏中查看更改,您需要重新同步库存,例如使用引导程序的 /sync 命令、访问道场 / 中继站或重新登录`,
|
general_inventoryUpdateNote: `注意:此处所做的更改只有在游戏同步仓库后才会生效。您可以通过访问星图来触发仓库更新。`,
|
||||||
general_addButton: `添加`,
|
general_addButton: `添加`,
|
||||||
general_setButton: `设置`,
|
|
||||||
general_removeButton: `移除`,
|
|
||||||
general_bulkActions: `批量操作`,
|
general_bulkActions: `批量操作`,
|
||||||
|
|
||||||
code_loginFail: `登录失败。请检查邮箱和密码。`,
|
code_loginFail: `登录失败。请检查邮箱和密码。`,
|
||||||
code_regFail: `注册失败。账号已存在。`,
|
code_regFail: `注册失败。账号已存在。`,
|
||||||
code_changeNameConfirm: `您想将账户名称更改为什么?`,
|
code_changeNameConfirm: `您想将账户名称更改为什么?`,
|
||||||
@ -115,19 +112,14 @@ dict = {
|
|||||||
currency_FusionPoints: `内融核心`,
|
currency_FusionPoints: `内融核心`,
|
||||||
currency_PrimeTokens: `御品阿耶`,
|
currency_PrimeTokens: `御品阿耶`,
|
||||||
currency_owned: `当前拥有 |COUNT|。`,
|
currency_owned: `当前拥有 |COUNT|。`,
|
||||||
|
powersuit_archonShardsLabel: `执刑官源力石槽位`,
|
||||||
detailedView_archonShardsLabel: `执刑官源力石槽位`,
|
powersuit_archonShardsDescription: `您可以使用这些无限插槽应用各种强化效果`,
|
||||||
detailedView_archonShardsDescription: `您可以使用这些无限插槽应用各种强化效果`,
|
powersuit_archonShardsDescription2: `请注意, 在加载时, 每个执政官源力石都需要一定的时间来生效。`,
|
||||||
detailedView_archonShardsDescription2: `请注意, 在加载时, 每个执政官源力石都需要一定的时间来生效。`,
|
|
||||||
detailedView_valenceBonusLabel: `效价加成`,
|
|
||||||
detailedView_valenceBonusDescription: `您可以设置或移除武器上的效价加成。`,
|
|
||||||
|
|
||||||
mods_addRiven: `添加裂罅MOD`,
|
mods_addRiven: `添加裂罅MOD`,
|
||||||
mods_fingerprint: `印记`,
|
mods_fingerprint: `印记`,
|
||||||
mods_fingerprintHelp: `需要印记相关的帮助?`,
|
mods_fingerprintHelp: `需要印记相关的帮助?`,
|
||||||
mods_rivens: `裂罅MOD`,
|
mods_rivens: `裂罅MOD`,
|
||||||
mods_mods: `Mods`,
|
mods_mods: `Mods`,
|
||||||
mods_addMax: `添加(满级)`,
|
|
||||||
mods_addMissingUnrankedMods: `添加所有缺失的Mods`,
|
mods_addMissingUnrankedMods: `添加所有缺失的Mods`,
|
||||||
mods_removeUnranked: `删除所有未升级的Mods`,
|
mods_removeUnranked: `删除所有未升级的Mods`,
|
||||||
mods_addMissingMaxRankMods: `添加所有缺失的满级Mods`,
|
mods_addMissingMaxRankMods: `添加所有缺失的满级Mods`,
|
||||||
@ -137,17 +129,16 @@ dict = {
|
|||||||
cheats_skipAllDialogue: `跳过所有对话`,
|
cheats_skipAllDialogue: `跳过所有对话`,
|
||||||
cheats_unlockAllScans: `解锁所有扫描`,
|
cheats_unlockAllScans: `解锁所有扫描`,
|
||||||
cheats_unlockAllMissions: `解锁所有任务`,
|
cheats_unlockAllMissions: `解锁所有任务`,
|
||||||
cheats_unlockAllMissions_ok: `操作成功。请注意,您需要进入道场 / 中继站或重新登录客户端以刷新星图数据。`,
|
|
||||||
cheats_infiniteCredits: `无限现金`,
|
cheats_infiniteCredits: `无限现金`,
|
||||||
cheats_infinitePlatinum: `无限白金`,
|
cheats_infinitePlatinum: `无限白金`,
|
||||||
cheats_infiniteEndo: `无限内融核心`,
|
cheats_infiniteEndo: `无限内融核心`,
|
||||||
cheats_infiniteRegalAya: `无限御品阿耶`,
|
cheats_infiniteRegalAya: `无限御品阿耶`,
|
||||||
cheats_infiniteHelminthMaterials: `无限Helminth材料`,
|
cheats_infiniteHelminthMaterials: `无限Helminth材料`,
|
||||||
cheats_claimingBlueprintRefundsIngredients: `取消蓝图制造时返还材料`,
|
cheats_claimingBlueprintRefundsIngredients: `取消蓝图制造时返还材料`,
|
||||||
cheats_dontSubtractPurchaseCreditCost: `购物时不减少现金花费`,
|
cheats_dontSubtractPurchaseCreditCost: `不减少现金花费`,
|
||||||
cheats_dontSubtractPurchasePlatinumCost: `购物时不减少白金花费`,
|
cheats_dontSubtractPurchasePlatinumCost: `不减少白金花费`,
|
||||||
cheats_dontSubtractPurchaseItemCost: `购物时不减少物品花费`,
|
cheats_dontSubtractPurchaseItemCost: `不减少物品花费`,
|
||||||
cheats_dontSubtractPurchaseStandingCost: `购物时不减少声望花费`,
|
cheats_dontSubtractPurchaseStandingCost: `不减少声望花费`,
|
||||||
cheats_dontSubtractVoidTraces: `虚空光体无消耗`,
|
cheats_dontSubtractVoidTraces: `虚空光体无消耗`,
|
||||||
cheats_dontSubtractConsumables: `消耗物品使用时无损耗`,
|
cheats_dontSubtractConsumables: `消耗物品使用时无损耗`,
|
||||||
cheats_unlockAllShipFeatures: `解锁所有飞船功能`,
|
cheats_unlockAllShipFeatures: `解锁所有飞船功能`,
|
||||||
@ -183,13 +174,8 @@ dict = {
|
|||||||
cheats_noDojoResearchTime: `无视道场研究时间`,
|
cheats_noDojoResearchTime: `无视道场研究时间`,
|
||||||
cheats_fastClanAscension: `快速升级氏族`,
|
cheats_fastClanAscension: `快速升级氏族`,
|
||||||
cheats_missionsCanGiveAllRelics: `任务可获取所有遗物`,
|
cheats_missionsCanGiveAllRelics: `任务可获取所有遗物`,
|
||||||
cheats_exceptionalRelicsAlwaysGiveBronzeReward: `卓越遗物必定掉落青铜奖励`,
|
|
||||||
cheats_flawlessRelicsAlwaysGiveSilverReward: `无瑕遗物必定掉落白银奖励`,
|
|
||||||
cheats_radiantRelicsAlwaysGiveGoldReward: `光辉遗物必定掉落黄金奖励`,
|
|
||||||
cheats_unlockAllSimarisResearchEntries: `解锁所有Simaris研究条目`,
|
cheats_unlockAllSimarisResearchEntries: `解锁所有Simaris研究条目`,
|
||||||
cheats_disableDailyTribute: `禁用每日登录奖励`,
|
|
||||||
cheats_spoofMasteryRank: `伪造精通段位(-1为禁用)`,
|
cheats_spoofMasteryRank: `伪造精通段位(-1为禁用)`,
|
||||||
cheats_relicRewardItemCountMultiplier: `虚空遗物奖励物品数量倍率`,
|
|
||||||
cheats_nightwaveStandingMultiplier: `午夜电波声望倍率`,
|
cheats_nightwaveStandingMultiplier: `午夜电波声望倍率`,
|
||||||
cheats_save: `保存`,
|
cheats_save: `保存`,
|
||||||
cheats_account: `账户`,
|
cheats_account: `账户`,
|
||||||
@ -244,75 +230,62 @@ dict = {
|
|||||||
normal: `正常`,
|
normal: `正常`,
|
||||||
worldState_allAtOnceNormal: `全部开启(普通)`,
|
worldState_allAtOnceNormal: `全部开启(普通)`,
|
||||||
worldState_allAtOnceSteelPath: `全部开启(钢铁之路)`,
|
worldState_allAtOnceSteelPath: `全部开启(钢铁之路)`,
|
||||||
worldState_theCircuitOverride: `无尽回廊任务循环配置:`,
|
|
||||||
worldState_darvoStockMultiplier: `Darvo特惠库存倍率`,
|
|
||||||
|
|
||||||
import_importNote: `您可以在此处提供完整或部分库存响应(客户端表示)。支持的所有字段<b>将被覆盖</b>到您的账户中。`,
|
import_importNote: `您可以在此处提供完整或部分库存响应(客户端表示)。支持的所有字段<b>将被覆盖</b>到您的账户中。`,
|
||||||
import_submit: `提交`,
|
import_submit: `提交`,
|
||||||
import_samples: `示例:`,
|
import_samples: `示例:`,
|
||||||
import_samples_maxFocus: `所有专精学派完全精通`,
|
import_samples_maxFocus: `所有专精学派完全精通`,
|
||||||
|
|
||||||
upgrade_Equilibrium: `拾取生命球+|VAL|% 能量,拾取能量球+|VAL|% 生命`,
|
upgrade_Equilibrium: `+|VAL|% 能量 来自生命球, +|VAL|% 生命 来自能量球`,
|
||||||
upgrade_MeleeCritDamage: `+|VAL|% 近战暴击伤害`,
|
upgrade_MeleeCritDamage: `+|VAL|% 近战暴击伤害`,
|
||||||
upgrade_PrimaryStatusChance: `+|VAL|% 主要武器触发几率`,
|
upgrade_PrimaryStatusChance: `+|VAL|% 主武器触发几率`,
|
||||||
upgrade_SecondaryCritChance: `+|VAL|% 次要武器暴击几率`,
|
upgrade_SecondaryCritChance: `+|VAL|% 次要武器暴击几率`,
|
||||||
upgrade_WarframeAbilityDuration: `+|VAL|% 技能持续时间`,
|
upgrade_WarframeAbilityDuration: `+|VAL|% 技能持续时间`,
|
||||||
upgrade_WarframeAbilityStrength: `+|VAL|% 技能强度`,
|
upgrade_WarframeAbilityStrength: `+|VAL|% 技能强度`,
|
||||||
upgrade_WarframeArmourMax: `+|VAL| 护甲`,
|
upgrade_WarframeArmourMax: `+|VAL| 护甲`,
|
||||||
upgrade_WarframeBlastProc: `使用爆炸伤害击杀敌人时恢复+|VAL| 护盾`,
|
upgrade_WarframeBlastProc: `+|VAL| 护盾在击杀时附带爆炸伤害`,
|
||||||
upgrade_WarframeCastingSpeed: `+|VAL|% 施放速度`,
|
upgrade_WarframeCastingSpeed: `+|VAL|% 施放速度`,
|
||||||
upgrade_WarframeCorrosiveDamageBoost: `对受腐蚀异常影响的敌人+|VAL|% 额外技能伤害`,
|
upgrade_WarframeCorrosiveDamageBoost: `对受腐蚀状态影响的敌人 +|VAL|% 技能伤害`,
|
||||||
upgrade_WarframeCorrosiveStack: `腐蚀异常最大堆叠层数+|VAL|`,
|
upgrade_WarframeCorrosiveStack: `腐蚀状态最大堆叠数 +|VAL|`,
|
||||||
upgrade_WarframeCritDamageBoost: `+|VAL|% 近战暴击伤害 (最大能量超过500伤害翻倍)`,
|
upgrade_WarframeCritDamageBoost: `+|VAL|% 近战暴击伤害 (500能量以上翻倍)`,
|
||||||
upgrade_WarframeElectricDamage: `主要武器获得+|VAL1|% 电击伤害 (每装备一颗深红,蔚蓝,紫晶源力石+|VAL2|% 额外点击伤害 )`,
|
upgrade_WarframeElectricDamage: `+|VAL1|% 主武器伤害效果 (+|VAL2|% 每附加一个碎片)`,
|
||||||
upgrade_WarframeElectricDamageBoost: `对受电击异常影响的敌人+|VAL|% 额外技能伤害`,
|
upgrade_WarframeElectricDamageBoost: `对受电能状态影响的敌人 +|VAL|% 技能伤害`,
|
||||||
upgrade_WarframeEnergyMax: `+|VAL| 最大能量`,
|
upgrade_WarframeEnergyMax: `+|VAL| 最大能量`,
|
||||||
upgrade_WarframeGlobeEffectEnergy: `+|VAL|% 能量球效果`,
|
upgrade_WarframeGlobeEffectEnergy: `+|VAL|% 能量球效果`,
|
||||||
upgrade_WarframeGlobeEffectHealth: `+|VAL|% 生命球效果`,
|
upgrade_WarframeGlobeEffectHealth: `+|VAL|% 生命球效果`,
|
||||||
upgrade_WarframeHealthMax: `+|VAL| 生命值`,
|
upgrade_WarframeHealthMax: `+|VAL| 生命`,
|
||||||
upgrade_WarframeHPBoostFromImpact: ` 通过爆炸伤害击杀的每个敌人可增加|VAL1| 生命上限 (最大 |VAL2| 生命上限)`,
|
upgrade_WarframeHPBoostFromImpact: `每个被爆炸伤害击杀的敌人,补充 |VAL1|生命 (最大 |VAL2| 生命)`,
|
||||||
upgrade_WarframeParkourVelocity: `+|VAL|% 跑酷速度`,
|
upgrade_WarframeParkourVelocity: `+|VAL|% 跑酷速度`,
|
||||||
upgrade_WarframeRadiationDamageBoost: `对受辐射状态影响的敌人 +|VAL|% 技能伤害`,
|
upgrade_WarframeRadiationDamageBoost: `对受辐射状态影响的敌人 +|VAL|% 技能伤害`,
|
||||||
upgrade_WarframeRegen: `+|VAL| /s生命再生`,
|
upgrade_WarframeRegen: `+|VAL| 生命再生/s`,
|
||||||
upgrade_WarframeShieldMax: `+|VAL| 护盾值`,
|
upgrade_WarframeShieldMax: `+|VAL| 护盾`,
|
||||||
upgrade_WarframeStartingEnergy: `进任务时+|VAL|% 初始能量`,
|
upgrade_WarframeStartingEnergy: `+|VAL|% 能量出生时`,
|
||||||
upgrade_WarframeToxinDamage: `毒素伤害额外+|VAL|% 伤害`,
|
upgrade_WarframeToxinDamage: `+|VAL|% 毒素伤害效果`,
|
||||||
upgrade_WarframeToxinHeal: `每当敌人受到毒素伤害时回复|VAL| 生命值`,
|
upgrade_WarframeToxinHeal: `+|VAL| 生命 对毒素状态的敌人造成伤害时`,
|
||||||
upgrade_WeaponCritBoostFromHeat: `每个被火焰伤害杀死的敌人, 增加|VAL1|% 次要武器暴击几率 (最大|VAL2|% )`,
|
upgrade_WeaponCritBoostFromHeat: `每个被火焰伤害杀死的敌人, 增加|VAL1|% 次要武器暴击几率 (最大 |VAL2|%)`,
|
||||||
upgrade_AvatarAbilityRange: `+7.5% 技能范围`,
|
upgrade_AvatarAbilityRange: `+7.5% 技能范围`,
|
||||||
upgrade_AvatarAbilityEfficiency: `+5% 技能效率`,
|
upgrade_AvatarAbilityEfficiency: `+5% 技能效率`,
|
||||||
upgrade_AvatarEnergyRegen: `+0.5 能量再生/秒`,
|
upgrade_AvatarEnergyRegen: `+0.5 能量再生/秒`,
|
||||||
upgrade_AvatarEnemyRadar: `+5米 侦敌雷达`,
|
upgrade_AvatarEnemyRadar: `+5米 敌方雷达`,
|
||||||
upgrade_AvatarLootRadar: `+7米 寻物雷达`,
|
upgrade_AvatarLootRadar: `+7米 战利品雷达`,
|
||||||
upgrade_WeaponAmmoMax: `+15% 弹药最大容量`,
|
upgrade_WeaponAmmoMax: `+15% 弹药最大容量`,
|
||||||
upgrade_EnemyArmorReductionAura: `-3% 敌方护甲`,
|
upgrade_EnemyArmorReductionAura: `-3% 敌方护甲`,
|
||||||
upgrade_OnExecutionAmmo: `怜悯之击可装填100%主要武器和次要武器弹匣容量`,
|
upgrade_OnExecutionAmmo: `怜悯之击 100% 补充主次要武器弹匣`,
|
||||||
upgrade_OnExecutionHealthDrop: `怜悯之击有100%几率掉落生命球`,
|
upgrade_OnExecutionHealthDrop: `怜悯之击 100% 几率 掉落生命球`,
|
||||||
upgrade_OnExecutionEnergyDrop: `怜悯之击有50%几率掉落能量球`,
|
upgrade_OnExecutionEnergyDrop: `怜悯之击 50% 几率 掉落生命球`,
|
||||||
upgrade_OnFailHackReset: `入侵失败后有+50%几率重新尝试`,
|
upgrade_OnFailHackReset: `+50% 在入侵失败时重试`,
|
||||||
upgrade_DamageReductionOnHack: `入侵时,+75% 伤害减免`,
|
upgrade_DamageReductionOnHack: `入侵时,+75% 伤害减免`,
|
||||||
upgrade_OnExecutionReviveCompanion: `怜悯之击减少15秒同伴复苏时间 `,
|
upgrade_OnExecutionReviveCompanion: `怜悯之击 减少同伴复苏时间 15秒`,
|
||||||
upgrade_OnExecutionParkourSpeed: `怜悯之击后+60% 跑酷速度,持续15秒 `,
|
upgrade_OnExecutionParkourSpeed: `怜悯之击 15秒内 +60% 跑酷速度`,
|
||||||
upgrade_AvatarTimeLimitIncrease: `+8秒 入侵时间`,
|
upgrade_AvatarTimeLimitIncrease: `+8秒 入侵时间`,
|
||||||
upgrade_ElectrifyOnHack: `入侵时震慑20米之内的敌人`,
|
upgrade_ElectrifyOnHack: `入侵时震慑20米之内的敌人`,
|
||||||
upgrade_OnExecutionTerrify: `怜悯之击有50%几率让15米以内的敌人进入恐惧状态8秒`,
|
upgrade_OnExecutionTerrify: `怜悯之击 50% 几率让 15米 以内的敌人恐慌`,
|
||||||
upgrade_OnHackLockers: `入侵后解锁20米内的5个储物柜`,
|
upgrade_OnHackLockers: `入侵后解锁20米内的5个储物柜`,
|
||||||
upgrade_OnExecutionBlind: `怜悯之击致盲18米范围内的敌人`,
|
upgrade_OnExecutionBlind: `怜悯之击 致盲18米之内的敌人`,
|
||||||
upgrade_OnExecutionDrainPower: `怜悯之击会使下一个技能有100%的机会获得+50%的技能强度`,
|
upgrade_OnExecutionDrainPower: `怜悯之击会使下一个技能有100%的机会获得+50%的技能强度`,
|
||||||
upgrade_OnHackSprintSpeed: `入侵后+75%冲刺速度,持续15秒`,
|
upgrade_OnHackSprintSpeed: `入侵后+75%冲刺速度,持续15秒`,
|
||||||
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: `暗色主题`,
|
|
||||||
theme_light: `亮色主题`,
|
|
||||||
|
|
||||||
prettier_sucks_ass: ``
|
prettier_sucks_ass: ``
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user