forked from OpenWF/SpaceNinjaServer
Compare commits
24 Commits
9f0cd91105
...
e345fc35b6
| Author | SHA1 | Date | |
|---|---|---|---|
| e345fc35b6 | |||
| f5335704b4 | |||
| 79c5f7a67a | |||
| e97b107853 | |||
| 7bc5065251 | |||
| 3194a693b3 | |||
| 261dbd5fdf | |||
| fd2ec696a0 | |||
| 9cc0c76ef5 | |||
| 2a4488d1dd | |||
| 2e1326cde8 | |||
| 70be467cbf | |||
| fac3ec01c6 | |||
| ebdca760e6 | |||
| 51c0ddda38 | |||
| 9129bdb5fc | |||
| a4922d4c35 | |||
| 679752633a | |||
| 67b5890f39 | |||
| 5d54e79e5d | |||
| 4606f28a58 | |||
| a2d383ee3c | |||
| 834b7a8196 | |||
| 4a2d863c9c |
@ -13,11 +13,6 @@
|
||||
"skipTutorial": false,
|
||||
"skipAllDialogue": false,
|
||||
"unlockAllScans": false,
|
||||
"infiniteCredits": false,
|
||||
"infinitePlatinum": false,
|
||||
"infiniteEndo": false,
|
||||
"infiniteRegalAya": false,
|
||||
"infiniteHelminthMaterials": false,
|
||||
"claimingBlueprintRefundsIngredients": false,
|
||||
"dontSubtractPurchaseCreditCost": false,
|
||||
"dontSubtractPurchasePlatinumCost": false,
|
||||
@ -71,8 +66,19 @@
|
||||
"affinityBoost": false,
|
||||
"resourceBoost": false,
|
||||
"tennoLiveRelay": false,
|
||||
"wolfHunt": false,
|
||||
"longShadow": false,
|
||||
"hallowedFlame": false,
|
||||
"hallowedNightmares": false,
|
||||
"hallowedNightmaresRewardsOverride": 0,
|
||||
"proxyRebellion": false,
|
||||
"proxyRebellionRewardsOverride": 0,
|
||||
"galleonOfGhouls": 0,
|
||||
"ghoulEmergenceOverride": null,
|
||||
"plagueStarOverride": null,
|
||||
"starDaysOverride": null,
|
||||
"dogDaysOverride": null,
|
||||
"dogDaysRewardsOverride": null,
|
||||
"eidolonOverride": "",
|
||||
"vallisOverride": "",
|
||||
"duviriOverride": "",
|
||||
|
||||
8
package-lock.json
generated
8
package-lock.json
generated
@ -23,7 +23,7 @@
|
||||
"ncp": "^2.0.0",
|
||||
"typescript": "^5.5",
|
||||
"undici": "^7.10.0",
|
||||
"warframe-public-export-plus": "^0.5.79",
|
||||
"warframe-public-export-plus": "^0.5.80",
|
||||
"warframe-riven-info": "^0.1.2",
|
||||
"winston": "^3.17.0",
|
||||
"winston-daily-rotate-file": "^5.0.0",
|
||||
@ -5507,9 +5507,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/warframe-public-export-plus": {
|
||||
"version": "0.5.79",
|
||||
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.79.tgz",
|
||||
"integrity": "sha512-mPaFGX7bmSo1FP0xzo//vNCkbzMRz517NHiQB1ZU8gyoRm41IaGQ7/pFWCP8iY8KWbEMvPty4pj1hZtxsujCIA=="
|
||||
"version": "0.5.80",
|
||||
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.80.tgz",
|
||||
"integrity": "sha512-K5f1Ws3szVdnO0tBcxlNdhXoGHIw09cjHel7spKPGL7aF/vmEkbBGRmYQFvs8n5cGo+v+3qIDMre54Ghb3t0Iw=="
|
||||
},
|
||||
"node_modules/warframe-riven-info": {
|
||||
"version": "0.1.2",
|
||||
|
||||
@ -40,7 +40,7 @@
|
||||
"ncp": "^2.0.0",
|
||||
"typescript": "^5.5",
|
||||
"undici": "^7.10.0",
|
||||
"warframe-public-export-plus": "^0.5.79",
|
||||
"warframe-public-export-plus": "^0.5.80",
|
||||
"warframe-riven-info": "^0.1.2",
|
||||
"winston": "^3.17.0",
|
||||
"winston-daily-rotate-file": "^5.0.0",
|
||||
|
||||
@ -3,7 +3,6 @@ import { getAccountIdForRequest } from "@/src/services/loginService";
|
||||
import { RequestHandler } from "express";
|
||||
import { IInventoryClient, IUpgradeClient } from "@/src/types/inventoryTypes/inventoryTypes";
|
||||
import { addMods, getInventory } from "@/src/services/inventoryService";
|
||||
import { config } from "@/src/services/configService";
|
||||
|
||||
export const artifactsController: RequestHandler = async (req, res) => {
|
||||
const accountId = await getAccountIdForRequest(req);
|
||||
@ -34,10 +33,10 @@ export const artifactsController: RequestHandler = async (req, res) => {
|
||||
addMods(inventory, [{ ItemType, ItemCount: -1 }]);
|
||||
}
|
||||
|
||||
if (!config.infiniteCredits) {
|
||||
if (!inventory.infiniteCredits) {
|
||||
inventory.RegularCredits -= Cost;
|
||||
}
|
||||
if (!config.infiniteEndo) {
|
||||
if (!inventory.infiniteEndo) {
|
||||
inventory.FusionPoints -= FusionPointCost;
|
||||
}
|
||||
|
||||
|
||||
@ -1,5 +1,4 @@
|
||||
import { RequestHandler } from "express";
|
||||
import { config } from "@/src/services/configService";
|
||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
||||
import { getInventory } from "@/src/services/inventoryService";
|
||||
|
||||
@ -9,7 +8,7 @@ export const creditsController: RequestHandler = async (req, res) => {
|
||||
getAccountIdForRequest(req),
|
||||
getInventory(
|
||||
req.query.accountId as string,
|
||||
"RegularCredits TradesRemaining PremiumCreditsFree PremiumCredits"
|
||||
"RegularCredits TradesRemaining PremiumCreditsFree PremiumCredits infiniteCredits infinitePlatinum"
|
||||
)
|
||||
])
|
||||
)[1];
|
||||
@ -21,10 +20,10 @@ export const creditsController: RequestHandler = async (req, res) => {
|
||||
PremiumCredits: inventory.PremiumCredits
|
||||
};
|
||||
|
||||
if (config.infiniteCredits) {
|
||||
if (inventory.infiniteCredits) {
|
||||
response.RegularCredits = 999999999;
|
||||
}
|
||||
if (config.infinitePlatinum) {
|
||||
if (inventory.infinitePlatinum) {
|
||||
response.PremiumCreditsFree = 0;
|
||||
response.PremiumCredits = 999999999;
|
||||
}
|
||||
|
||||
62
src/controllers/api/getPastWeeklyChallengesController.ts
Normal file
62
src/controllers/api/getPastWeeklyChallengesController.ts
Normal file
@ -0,0 +1,62 @@
|
||||
import { RequestHandler } from "express";
|
||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
||||
import { getInventory } from "@/src/services/inventoryService";
|
||||
import { EPOCH, getSeasonChallengePools, getWorldState, pushWeeklyActs } from "@/src/services/worldStateService";
|
||||
import { unixTimesInMs } from "@/src/constants/timeConstants";
|
||||
import { ISeasonChallenge } from "@/src/types/worldStateTypes";
|
||||
import { ExportChallenges } from "warframe-public-export-plus";
|
||||
|
||||
export const getPastWeeklyChallengesController: RequestHandler = async (req, res) => {
|
||||
const accountId = await getAccountIdForRequest(req);
|
||||
const inventory = await getInventory(accountId, "SeasonChallengeHistory ChallengeProgress");
|
||||
const worldState = getWorldState(undefined);
|
||||
|
||||
if (worldState.SeasonInfo) {
|
||||
const pools = getSeasonChallengePools(worldState.SeasonInfo.AffiliationTag);
|
||||
const nightwaveStartTimestamp = Number(worldState.SeasonInfo.Activation.$date.$numberLong);
|
||||
const nightwaveSeason = worldState.SeasonInfo.Season;
|
||||
const timeMs = worldState.Time * 1000;
|
||||
const completedChallengesIds = new Set<string>();
|
||||
|
||||
inventory.SeasonChallengeHistory.forEach(challengeHistory => {
|
||||
const entryNightwaveSeason = parseInt(challengeHistory.id.slice(0, 4), 10) - 1;
|
||||
if (nightwaveSeason == entryNightwaveSeason) {
|
||||
const meta = Object.entries(ExportChallenges).find(
|
||||
([key]) => key.split("/").pop() === challengeHistory.challenge
|
||||
);
|
||||
if (meta) {
|
||||
const [, challengeMeta] = meta;
|
||||
const challengeProgress = inventory.ChallengeProgress.find(
|
||||
c => c.Name === challengeHistory.challenge
|
||||
);
|
||||
|
||||
if (challengeProgress && challengeProgress.Progress >= (challengeMeta.requiredCount ?? 1)) {
|
||||
completedChallengesIds.add(challengeHistory.id);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
const PastWeeklyChallenges: ISeasonChallenge[] = [];
|
||||
|
||||
let week = Math.trunc((timeMs - EPOCH) / unixTimesInMs.week) - 1;
|
||||
|
||||
while (EPOCH + week * unixTimesInMs.week >= nightwaveStartTimestamp && PastWeeklyChallenges.length < 3) {
|
||||
const tempActs: ISeasonChallenge[] = [];
|
||||
pushWeeklyActs(tempActs, pools, week, nightwaveStartTimestamp, nightwaveSeason);
|
||||
|
||||
for (const act of tempActs) {
|
||||
if (!completedChallengesIds.has(act._id.$oid) && PastWeeklyChallenges.length < 3) {
|
||||
if (act.Challenge.startsWith("/Lotus/Types/Challenges/Seasons/Weekly/SeasonWeeklyPermanent")) {
|
||||
act.Permanent = true;
|
||||
}
|
||||
PastWeeklyChallenges.push(act);
|
||||
}
|
||||
}
|
||||
|
||||
week--;
|
||||
}
|
||||
|
||||
res.json({ PastWeeklyChallenges: PastWeeklyChallenges });
|
||||
}
|
||||
};
|
||||
@ -13,7 +13,8 @@ import {
|
||||
addItems,
|
||||
combineInventoryChanges,
|
||||
getEffectiveAvatarImageType,
|
||||
getInventory
|
||||
getInventory,
|
||||
updateCurrency
|
||||
} from "@/src/services/inventoryService";
|
||||
import { logger } from "@/src/utils/logger";
|
||||
import { ExportFlavour } from "warframe-public-export-plus";
|
||||
@ -100,6 +101,9 @@ export const inboxController: RequestHandler = async (req, res) => {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (message.RegularCredits) {
|
||||
updateCurrency(inventory, -message.RegularCredits, false, inventoryChanges);
|
||||
}
|
||||
await inventory.save();
|
||||
res.json({ InventoryChanges: inventoryChanges });
|
||||
} else if (latestClientMessageId) {
|
||||
|
||||
@ -15,7 +15,6 @@ import { getRecipe } from "@/src/services/itemDataService";
|
||||
import { toMongoDate, version_compare } from "@/src/helpers/inventoryHelpers";
|
||||
import { logger } from "@/src/utils/logger";
|
||||
import { colorToShard } from "@/src/helpers/shardHelper";
|
||||
import { config } from "@/src/services/configService";
|
||||
import {
|
||||
addInfestedFoundryXP,
|
||||
applyCheatsToInfestedFoundry,
|
||||
@ -73,7 +72,7 @@ export const infestedFoundryController: RequestHandler = async (req, res) => {
|
||||
addMiscItems(inventory, miscItemChanges);
|
||||
|
||||
// consume resources
|
||||
if (!config.infiniteHelminthMaterials) {
|
||||
if (!inventory.infiniteHelminthMaterials) {
|
||||
let type: string;
|
||||
let count: number;
|
||||
if (account.BuildLabel && version_compare(account.BuildLabel, "2025.05.20.10.18") < 0) {
|
||||
@ -99,7 +98,7 @@ export const infestedFoundryController: RequestHandler = async (req, res) => {
|
||||
await inventory.save();
|
||||
|
||||
const infestedFoundry = inventory.toJSON<IInventoryClient>().InfestedFoundry!;
|
||||
applyCheatsToInfestedFoundry(infestedFoundry);
|
||||
applyCheatsToInfestedFoundry(inventory, infestedFoundry);
|
||||
res.json({
|
||||
InventoryChanges: {
|
||||
MiscItems: miscItemChanges,
|
||||
@ -129,13 +128,14 @@ export const infestedFoundryController: RequestHandler = async (req, res) => {
|
||||
case "c": {
|
||||
// consume items
|
||||
|
||||
if (config.infiniteHelminthMaterials) {
|
||||
const inventory = await getInventory(account._id.toString());
|
||||
|
||||
if (inventory.infiniteHelminthMaterials) {
|
||||
res.status(400).end();
|
||||
return;
|
||||
}
|
||||
|
||||
const request = getJSONfromString<IHelminthFeedRequest>(String(req.body));
|
||||
const inventory = await getInventory(account._id.toString());
|
||||
inventory.InfestedFoundry ??= {};
|
||||
inventory.InfestedFoundry.Resources ??= [];
|
||||
|
||||
@ -240,7 +240,7 @@ export const infestedFoundryController: RequestHandler = async (req, res) => {
|
||||
}
|
||||
await inventory.save();
|
||||
const infestedFoundry = inventory.toJSON<IInventoryClient>().InfestedFoundry!;
|
||||
applyCheatsToInfestedFoundry(infestedFoundry);
|
||||
applyCheatsToInfestedFoundry(inventory, infestedFoundry);
|
||||
res.json({
|
||||
InventoryChanges: {
|
||||
InfestedFoundry: infestedFoundry
|
||||
@ -254,7 +254,7 @@ export const infestedFoundryController: RequestHandler = async (req, res) => {
|
||||
const request = getJSONfromString<IHelminthSubsumeRequest>(String(req.body));
|
||||
const inventory = await getInventory(account._id.toString());
|
||||
const recipe = getRecipe(request.Recipe)!;
|
||||
if (!config.infiniteHelminthMaterials) {
|
||||
if (!inventory.infiniteHelminthMaterials) {
|
||||
for (const ingredient of recipe.secretIngredients!) {
|
||||
const resource = inventory.InfestedFoundry!.Resources!.find(x => x.ItemType == ingredient.ItemType);
|
||||
if (resource) {
|
||||
@ -280,7 +280,7 @@ export const infestedFoundryController: RequestHandler = async (req, res) => {
|
||||
freeUpSlot(inventory, InventorySlot.SUITS);
|
||||
await inventory.save();
|
||||
const infestedFoundry = inventory.toJSON<IInventoryClient>().InfestedFoundry!;
|
||||
applyCheatsToInfestedFoundry(infestedFoundry);
|
||||
applyCheatsToInfestedFoundry(inventory, infestedFoundry);
|
||||
res.json({
|
||||
InventoryChanges: {
|
||||
Recipes: recipeChanges,
|
||||
@ -307,7 +307,7 @@ export const infestedFoundryController: RequestHandler = async (req, res) => {
|
||||
const recipeChanges = handleSubsumeCompletion(inventory);
|
||||
await inventory.save();
|
||||
const infestedFoundry = inventory.toJSON<IInventoryClient>().InfestedFoundry!;
|
||||
applyCheatsToInfestedFoundry(infestedFoundry);
|
||||
applyCheatsToInfestedFoundry(inventory, infestedFoundry);
|
||||
res.json({
|
||||
InventoryChanges: {
|
||||
...currencyChanges,
|
||||
@ -328,7 +328,7 @@ export const infestedFoundryController: RequestHandler = async (req, res) => {
|
||||
suit.UpgradesExpiry = upgradesExpiry;
|
||||
const recipeChanges = addInfestedFoundryXP(inventory.InfestedFoundry!, 4800_00);
|
||||
addRecipes(inventory, recipeChanges);
|
||||
if (!config.infiniteHelminthMaterials) {
|
||||
if (!inventory.infiniteHelminthMaterials) {
|
||||
for (let i = 0; i != request.ResourceTypes.length; ++i) {
|
||||
inventory.InfestedFoundry!.Resources!.find(x => x.ItemType == request.ResourceTypes[i])!.Count -=
|
||||
request.ResourceCosts[i];
|
||||
@ -338,7 +338,7 @@ export const infestedFoundryController: RequestHandler = async (req, res) => {
|
||||
inventory.InfestedFoundry!.InvigorationsApplied += 1;
|
||||
await inventory.save();
|
||||
const infestedFoundry = inventory.toJSON<IInventoryClient>().InfestedFoundry!;
|
||||
applyCheatsToInfestedFoundry(infestedFoundry);
|
||||
applyCheatsToInfestedFoundry(inventory, infestedFoundry);
|
||||
res.json({
|
||||
SuitId: request.SuitId,
|
||||
OffensiveUpgrade: request.OffensiveUpgradeType,
|
||||
|
||||
@ -295,17 +295,17 @@ export const getInventoryResponse = async (
|
||||
};
|
||||
}
|
||||
|
||||
if (config.infiniteCredits) {
|
||||
if (inventory.infiniteCredits) {
|
||||
inventoryResponse.RegularCredits = 999999999;
|
||||
}
|
||||
if (config.infinitePlatinum) {
|
||||
if (inventory.infinitePlatinum) {
|
||||
inventoryResponse.PremiumCreditsFree = 0;
|
||||
inventoryResponse.PremiumCredits = 999999999;
|
||||
}
|
||||
if (config.infiniteEndo) {
|
||||
if (inventory.infiniteEndo) {
|
||||
inventoryResponse.FusionPoints = 999999999;
|
||||
}
|
||||
if (config.infiniteRegalAya) {
|
||||
if (inventory.infiniteRegalAya) {
|
||||
inventoryResponse.PrimeTokens = 999999999;
|
||||
}
|
||||
|
||||
@ -450,7 +450,7 @@ export const getInventoryResponse = async (
|
||||
}
|
||||
|
||||
if (inventoryResponse.InfestedFoundry) {
|
||||
applyCheatsToInfestedFoundry(inventoryResponse.InfestedFoundry);
|
||||
applyCheatsToInfestedFoundry(inventory, inventoryResponse.InfestedFoundry);
|
||||
}
|
||||
|
||||
// Set 2FA enabled so trading post can be used
|
||||
|
||||
@ -6,7 +6,11 @@ import { addMissionInventoryUpdates, addMissionRewards } from "@/src/services/mi
|
||||
import { getInventory } from "@/src/services/inventoryService";
|
||||
import { getInventoryResponse } from "@/src/controllers/api/inventoryController";
|
||||
import { logger } from "@/src/utils/logger";
|
||||
import { IMissionInventoryUpdateResponse } from "@/src/types/missionTypes";
|
||||
import {
|
||||
IMissionInventoryUpdateResponse,
|
||||
IMissionInventoryUpdateResponseBackToDryDock,
|
||||
IMissionInventoryUpdateResponseRailjackInterstitial
|
||||
} from "@/src/types/missionTypes";
|
||||
import { sendWsBroadcastTo } from "@/src/services/wsService";
|
||||
import { generateRewardSeed } from "@/src/services/rngService";
|
||||
|
||||
@ -95,11 +99,9 @@ export const missionInventoryUpdateController: RequestHandler = async (req, res)
|
||||
inventory.RewardSeed = generateRewardSeed();
|
||||
}
|
||||
await inventory.save();
|
||||
const inventoryResponse = await getInventoryResponse(inventory, true, account.BuildLabel);
|
||||
|
||||
//TODO: figure out when to send inventory. it is needed for many cases.
|
||||
res.json({
|
||||
InventoryJson: JSON.stringify(inventoryResponse),
|
||||
const deltas: IMissionInventoryUpdateResponseRailjackInterstitial = {
|
||||
InventoryChanges: inventoryChanges,
|
||||
MissionRewards,
|
||||
...credits,
|
||||
@ -108,7 +110,25 @@ export const missionInventoryUpdateController: RequestHandler = async (req, res)
|
||||
SyndicateXPItemReward,
|
||||
AffiliationMods,
|
||||
ConquestCompletedMissionsCount
|
||||
} satisfies IMissionInventoryUpdateResponse);
|
||||
};
|
||||
if (missionReport.RJ) {
|
||||
logger.debug(`railjack interstitial request, sending only deltas`, deltas);
|
||||
res.json(deltas);
|
||||
} else if (missionReport.RewardInfo) {
|
||||
logger.debug(`classic mission completion, sending everything`);
|
||||
const inventoryResponse = await getInventoryResponse(inventory, true, account.BuildLabel);
|
||||
res.json({
|
||||
InventoryJson: JSON.stringify(inventoryResponse),
|
||||
...deltas
|
||||
} satisfies IMissionInventoryUpdateResponse);
|
||||
} else {
|
||||
logger.debug(`no reward info, assuming this wasn't a mission completion and we should just sync inventory`);
|
||||
const inventoryResponse = await getInventoryResponse(inventory, true, account.BuildLabel);
|
||||
res.json({
|
||||
InventoryJson: JSON.stringify(inventoryResponse)
|
||||
} satisfies IMissionInventoryUpdateResponseBackToDryDock);
|
||||
}
|
||||
|
||||
sendWsBroadcastTo(account._id.toString(), { update_inventory: true });
|
||||
};
|
||||
|
||||
|
||||
@ -7,7 +7,6 @@ import { addMiscItems, addRecipes, getInventory, updateCurrency } from "@/src/se
|
||||
import { getRecipeByResult } from "@/src/services/itemDataService";
|
||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
|
||||
import { addInfestedFoundryXP, applyCheatsToInfestedFoundry } from "@/src/services/infestedFoundryService";
|
||||
import { config } from "@/src/services/configService";
|
||||
import { sendWsBroadcastTo } from "@/src/services/wsService";
|
||||
import { EquipmentFeatures, IEquipmentDatabase } from "@/src/types/equipmentTypes";
|
||||
|
||||
@ -52,7 +51,7 @@ export const upgradesController: RequestHandler = async (req, res) => {
|
||||
const recipe = getRecipeByResult(operation.UpgradeRequirement)!;
|
||||
for (const ingredient of recipe.ingredients) {
|
||||
totalPercentagePointsConsumed += ingredient.ItemCount / 10;
|
||||
if (!config.infiniteHelminthMaterials) {
|
||||
if (!inventory.infiniteHelminthMaterials) {
|
||||
inventory.InfestedFoundry!.Resources!.find(x => x.ItemType == ingredient.ItemType)!.Count -=
|
||||
ingredient.ItemCount;
|
||||
}
|
||||
@ -69,7 +68,7 @@ export const upgradesController: RequestHandler = async (req, res) => {
|
||||
|
||||
inventoryChanges.Recipes = recipeChanges;
|
||||
inventoryChanges.InfestedFoundry = inventory.toJSON<IInventoryClient>().InfestedFoundry;
|
||||
applyCheatsToInfestedFoundry(inventoryChanges.InfestedFoundry!);
|
||||
applyCheatsToInfestedFoundry(inventory, inventoryChanges.InfestedFoundry!);
|
||||
} else
|
||||
switch (operation.UpgradeRequirement) {
|
||||
case "/Lotus/Types/Items/MiscItems/OrokinReactor":
|
||||
|
||||
18
src/controllers/custom/setAccountCheatController.ts
Normal file
18
src/controllers/custom/setAccountCheatController.ts
Normal file
@ -0,0 +1,18 @@
|
||||
import { getInventory } from "@/src/services/inventoryService";
|
||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
||||
import { IAccountCheats } from "@/src/types/inventoryTypes/inventoryTypes";
|
||||
import { RequestHandler } from "express";
|
||||
|
||||
export const setAccountCheatController: RequestHandler = async (req, res) => {
|
||||
const accountId = await getAccountIdForRequest(req);
|
||||
const payload = req.body as ISetAccountCheatRequest;
|
||||
const inventory = await getInventory(accountId, payload.key);
|
||||
inventory[payload.key] = payload.value;
|
||||
await inventory.save();
|
||||
res.end();
|
||||
};
|
||||
|
||||
interface ISetAccountCheatRequest {
|
||||
key: keyof IAccountCheats;
|
||||
value: boolean;
|
||||
}
|
||||
@ -22,8 +22,11 @@ export interface INemesisManifest {
|
||||
ephemeraTypes?: Record<TInnateDamageTag, string>;
|
||||
firstKillReward: string;
|
||||
firstConvertReward: string;
|
||||
messageTitle: string;
|
||||
messageBody: string;
|
||||
killMessageSubject: string;
|
||||
killMessageBody: string;
|
||||
convertMessageSubject: string;
|
||||
convertMessageBody: string;
|
||||
convertMessageIcon: string;
|
||||
minBuild: string;
|
||||
}
|
||||
|
||||
@ -57,8 +60,11 @@ class KuvaLichManifest implements INemesisManifest {
|
||||
};
|
||||
firstKillReward = "/Lotus/StoreItems/Upgrades/Skins/Clan/LichKillerBadgeItem";
|
||||
firstConvertReward = "/Lotus/StoreItems/Upgrades/Skins/Sigils/KuvaLichSigil";
|
||||
messageTitle = "/Lotus/Language/Inbox/VanquishKuvaMsgTitle";
|
||||
messageBody = "/Lotus/Language/Inbox/VanquishLichMsgBody";
|
||||
killMessageSubject = "/Lotus/Language/Inbox/VanquishKuvaMsgTitle";
|
||||
killMessageBody = "/Lotus/Language/Inbox/VanquishLichMsgBody";
|
||||
convertMessageSubject = "/Lotus/Language/Kingpins/InboxKuvaConvertedSubject";
|
||||
convertMessageBody = "/Lotus/Language/Kingpins/InboxKuvaConvertedBody";
|
||||
convertMessageIcon = "/Lotus/Interface/Graphics/WorldStatePanel/Grineer.png";
|
||||
minBuild = "2019.10.31.22.42"; // 26.0.0
|
||||
}
|
||||
|
||||
@ -131,8 +137,11 @@ class LawyerManifest implements INemesisManifest {
|
||||
};
|
||||
firstKillReward = "/Lotus/StoreItems/Upgrades/Skins/Clan/CorpusLichBadgeItem";
|
||||
firstConvertReward = "/Lotus/StoreItems/Upgrades/Skins/Sigils/CorpusLichSigil";
|
||||
messageTitle = "/Lotus/Language/Inbox/VanquishLawyerMsgTitle";
|
||||
messageBody = "/Lotus/Language/Inbox/VanquishLichMsgBody";
|
||||
killMessageSubject = "/Lotus/Language/Inbox/VanquishLawyerMsgTitle";
|
||||
killMessageBody = "/Lotus/Language/Inbox/VanquishLichMsgBody";
|
||||
convertMessageSubject = "/Lotus/Language/Kingpins/InboxSisterConvertedSubject";
|
||||
convertMessageBody = "/Lotus/Language/Kingpins/InboxSisterConvertedBody";
|
||||
convertMessageIcon = "/Lotus/Interface/Graphics/WorldStatePanel/Corpus.png";
|
||||
minBuild = "2021.07.05.17.03"; // 30.5.0
|
||||
}
|
||||
|
||||
@ -166,8 +175,11 @@ class InfestedLichManfest implements INemesisManifest {
|
||||
ephemeraChance = 0;
|
||||
firstKillReward = "/Lotus/StoreItems/Upgrades/Skins/Sigils/InfLichVanquishedSigil";
|
||||
firstConvertReward = "/Lotus/StoreItems/Upgrades/Skins/Sigils/InfLichConvertedSigil";
|
||||
messageTitle = "/Lotus/Language/Inbox/VanquishBandMsgTitle";
|
||||
messageBody = "/Lotus/Language/Inbox/VanquishBandMsgBody";
|
||||
killMessageSubject = "/Lotus/Language/Inbox/VanquishBandMsgTitle";
|
||||
killMessageBody = "/Lotus/Language/Inbox/VanquishBandMsgBody";
|
||||
convertMessageSubject = "/Lotus/Language/Kingpins/InboxBandConvertedSubject";
|
||||
convertMessageBody = "/Lotus/Language/Kingpins/InboxBandConvertedBody";
|
||||
convertMessageIcon = "/Lotus/Interface/Graphics/WorldStatePanel/Infested.png";
|
||||
minBuild = "2025.03.18.09.51"; // 38.5.0
|
||||
}
|
||||
|
||||
|
||||
@ -1,5 +1,17 @@
|
||||
import { slotPurchaseNameToSlotName } from "@/src/services/purchaseService";
|
||||
import { SlotPurchaseName } from "@/src/types/purchaseTypes";
|
||||
import { SlotPurchase, SlotPurchaseName } from "@/src/types/purchaseTypes";
|
||||
|
||||
export const slotPurchaseNameToSlotName: SlotPurchase = {
|
||||
SuitSlotItem: { name: "SuitBin", purchaseQuantity: 1 },
|
||||
TwoSentinelSlotItem: { name: "SentinelBin", purchaseQuantity: 2 },
|
||||
TwoWeaponSlotItem: { name: "WeaponBin", purchaseQuantity: 2 },
|
||||
SpaceSuitSlotItem: { name: "SpaceSuitBin", purchaseQuantity: 1 },
|
||||
TwoSpaceWeaponSlotItem: { name: "SpaceWeaponBin", purchaseQuantity: 2 },
|
||||
MechSlotItem: { name: "MechBin", purchaseQuantity: 1 },
|
||||
TwoOperatorWeaponSlotItem: { name: "OperatorAmpBin", purchaseQuantity: 2 },
|
||||
RandomModSlotItem: { name: "RandomModBin", purchaseQuantity: 3 },
|
||||
TwoCrewShipSalvageSlotItem: { name: "CrewShipSalvageBin", purchaseQuantity: 2 },
|
||||
CrewMemberSlotItem: { name: "CrewMemberBin", purchaseQuantity: 1 }
|
||||
};
|
||||
|
||||
export const isSlotPurchaseName = (slotPurchaseName: string): slotPurchaseName is SlotPurchaseName => {
|
||||
return slotPurchaseName in slotPurchaseNameToSlotName;
|
||||
|
||||
@ -47,6 +47,7 @@ export interface IMessage {
|
||||
acceptAction?: string;
|
||||
declineAction?: string;
|
||||
hasAccountAction?: boolean;
|
||||
RegularCredits?: number;
|
||||
}
|
||||
|
||||
export interface Arg {
|
||||
@ -139,7 +140,8 @@ const messageSchema = new Schema<IMessageDatabase>(
|
||||
contextInfo: String,
|
||||
acceptAction: String,
|
||||
declineAction: String,
|
||||
hasAccountAction: Boolean
|
||||
hasAccountAction: Boolean,
|
||||
RegularCredits: Number
|
||||
},
|
||||
{ id: false }
|
||||
);
|
||||
|
||||
@ -1425,6 +1425,14 @@ const hubNpcCustomizationSchema = new Schema<IHubNpcCustomization>(
|
||||
const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
|
||||
{
|
||||
accountOwnerId: Schema.Types.ObjectId,
|
||||
|
||||
// SNS account cheats
|
||||
infiniteCredits: Boolean,
|
||||
infinitePlatinum: Boolean,
|
||||
infiniteEndo: Boolean,
|
||||
infiniteRegalAya: Boolean,
|
||||
infiniteHelminthMaterials: Boolean,
|
||||
|
||||
SubscribedToEmails: { type: Number, default: 0 },
|
||||
SubscribedToEmailsPersonalized: { type: Number, default: 0 },
|
||||
RewardSeed: BigInt,
|
||||
|
||||
@ -66,6 +66,7 @@ import { getGuildLogController } from "@/src/controllers/api/getGuildLogControll
|
||||
import { getIgnoredUsersController } from "@/src/controllers/api/getIgnoredUsersController";
|
||||
import { getNewRewardSeedController } from "@/src/controllers/api/getNewRewardSeedController";
|
||||
import { getProfileViewingDataPostController } from "@/src/controllers/dynamic/getProfileViewingDataController";
|
||||
import { getPastWeeklyChallengesController } from "@/src/controllers/api/getPastWeeklyChallengesController";
|
||||
import { getShipController } from "@/src/controllers/api/getShipController";
|
||||
import { getVendorInfoController } from "@/src/controllers/api/getVendorInfoController";
|
||||
import { getVoidProjectionRewardsController } from "@/src/controllers/api/getVoidProjectionRewardsController";
|
||||
@ -195,6 +196,7 @@ apiRouter.get("/getGuildLog.php", getGuildLogController);
|
||||
apiRouter.get("/getIgnoredUsers.php", getIgnoredUsersController);
|
||||
apiRouter.get("/getMessages.php", inboxController); // unsure if this is correct, but needed for U17
|
||||
apiRouter.get("/getNewRewardSeed.php", getNewRewardSeedController);
|
||||
apiRouter.get("/getPastWeeklyChallenges.php", getPastWeeklyChallengesController)
|
||||
apiRouter.get("/getShip.php", getShipController);
|
||||
apiRouter.get("/getShipDecos.php", (_req, res) => { res.end(); }); // needed to log in on U22.8
|
||||
apiRouter.get("/getVendorInfo.php", getVendorInfoController);
|
||||
|
||||
@ -28,6 +28,7 @@ import { setBoosterController } from "@/src/controllers/custom/setBoosterControl
|
||||
import { updateFingerprintController } from "@/src/controllers/custom/updateFingerprintController";
|
||||
import { changeModularPartsController } from "@/src/controllers/custom/changeModularPartsController";
|
||||
import { editSuitInvigorationUpgradeController } from "@/src/controllers/custom/editSuitInvigorationUpgradeController";
|
||||
import { setAccountCheatController } from "@/src/controllers/custom/setAccountCheatController";
|
||||
|
||||
import { getConfigController, setConfigController } from "@/src/controllers/custom/configController";
|
||||
|
||||
@ -61,6 +62,7 @@ customRouter.post("/setBooster", setBoosterController);
|
||||
customRouter.post("/updateFingerprint", updateFingerprintController);
|
||||
customRouter.post("/changeModularParts", changeModularPartsController);
|
||||
customRouter.post("/editSuitInvigorationUpgrade", editSuitInvigorationUpgradeController);
|
||||
customRouter.post("/setAccountCheat", setAccountCheatController);
|
||||
|
||||
customRouter.post("/getConfig", getConfigController);
|
||||
customRouter.post("/setConfig", setConfigController);
|
||||
|
||||
@ -20,11 +20,6 @@ export interface IConfig {
|
||||
skipTutorial?: boolean;
|
||||
skipAllDialogue?: boolean;
|
||||
unlockAllScans?: boolean;
|
||||
infiniteCredits?: boolean;
|
||||
infinitePlatinum?: boolean;
|
||||
infiniteEndo?: boolean;
|
||||
infiniteRegalAya?: boolean;
|
||||
infiniteHelminthMaterials?: boolean;
|
||||
claimingBlueprintRefundsIngredients?: boolean;
|
||||
dontSubtractPurchaseCreditCost?: boolean;
|
||||
dontSubtractPurchasePlatinumCost?: boolean;
|
||||
@ -83,8 +78,19 @@ export interface IConfig {
|
||||
resourceBoost?: boolean;
|
||||
tennoLiveRelay?: boolean;
|
||||
baroTennoConRelay?: boolean;
|
||||
wolfHunt?: boolean;
|
||||
longShadow?: boolean;
|
||||
hallowedFlame?: boolean;
|
||||
hallowedNightmares?: boolean;
|
||||
hallowedNightmaresRewardsOverride?: number;
|
||||
proxyRebellion?: boolean;
|
||||
proxyRebellionRewardsOverride?: number;
|
||||
galleonOfGhouls?: number;
|
||||
ghoulEmergenceOverride?: boolean;
|
||||
plagueStarOverride?: boolean;
|
||||
starDaysOverride?: boolean;
|
||||
dogDaysOverride?: boolean;
|
||||
dogDaysRewardsOverride?: number;
|
||||
eidolonOverride?: string;
|
||||
vallisOverride?: string;
|
||||
duviriOverride?: string;
|
||||
|
||||
@ -1,8 +1,11 @@
|
||||
import { ExportRecipes } from "warframe-public-export-plus";
|
||||
import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
|
||||
import { IInfestedFoundryClient, IInfestedFoundryDatabase } from "@/src/types/inventoryTypes/inventoryTypes";
|
||||
import {
|
||||
IAccountCheats,
|
||||
IInfestedFoundryClient,
|
||||
IInfestedFoundryDatabase
|
||||
} from "@/src/types/inventoryTypes/inventoryTypes";
|
||||
import { addRecipes } from "@/src/services/inventoryService";
|
||||
import { config } from "@/src/services/configService";
|
||||
import { ITypeCount } from "@/src/types/commonTypes";
|
||||
|
||||
export const addInfestedFoundryXP = (infestedFoundry: IInfestedFoundryDatabase, delta: number): ITypeCount[] => {
|
||||
@ -97,8 +100,8 @@ export const handleSubsumeCompletion = (inventory: TInventoryDatabaseDocument):
|
||||
return recipeChanges;
|
||||
};
|
||||
|
||||
export const applyCheatsToInfestedFoundry = (infestedFoundry: IInfestedFoundryClient): void => {
|
||||
if (config.infiniteHelminthMaterials) {
|
||||
export const applyCheatsToInfestedFoundry = (cheats: IAccountCheats, infestedFoundry: IInfestedFoundryClient): void => {
|
||||
if (cheats.infiniteHelminthMaterials) {
|
||||
infestedFoundry.Resources = [
|
||||
{ ItemType: "/Lotus/Types/Items/InfestedFoundry/HelminthCalx", Count: 1000 },
|
||||
{ ItemType: "/Lotus/Types/Items/InfestedFoundry/HelminthBiotics", Count: 1000 },
|
||||
|
||||
@ -1201,8 +1201,8 @@ export const updateSlots = (
|
||||
}
|
||||
};
|
||||
|
||||
const isCurrencyTracked = (usePremium: boolean): boolean => {
|
||||
return usePremium ? !config.infinitePlatinum : !config.infiniteCredits;
|
||||
const isCurrencyTracked = (inventory: TInventoryDatabaseDocument, usePremium: boolean): boolean => {
|
||||
return usePremium ? !inventory.infinitePlatinum : !inventory.infiniteCredits;
|
||||
};
|
||||
|
||||
export const updateCurrency = (
|
||||
@ -1211,7 +1211,7 @@ export const updateCurrency = (
|
||||
usePremium: boolean,
|
||||
inventoryChanges: IInventoryChanges = {}
|
||||
): IInventoryChanges => {
|
||||
if (price != 0 && isCurrencyTracked(usePremium)) {
|
||||
if (price != 0 && isCurrencyTracked(inventory, usePremium)) {
|
||||
if (usePremium) {
|
||||
if (inventory.PremiumCreditsFree > 0) {
|
||||
const premiumCreditsFreeDelta = Math.min(price, inventory.PremiumCreditsFree) * -1;
|
||||
@ -1980,17 +1980,20 @@ export const addChallenges = async (
|
||||
dbChallenge.Completed ??= [];
|
||||
for (const completion of Completed!) {
|
||||
if (dbChallenge.Completed.indexOf(completion) == -1) {
|
||||
dbChallenge.Completed.push(completion);
|
||||
if (completion == "challengeRewards") {
|
||||
if (Name in challengeRewardsInboxMessages) {
|
||||
await createMessage(account._id, [challengeRewardsInboxMessages[Name]]);
|
||||
dbChallenge.Completed.push(completion);
|
||||
// Would love to somehow let the client know about inbox or inventory changes, but there doesn't seem to anything for updateChallengeProgress.
|
||||
continue;
|
||||
}
|
||||
logger.warn(`ignoring unknown challenge completion`, { challenge: Name, completion });
|
||||
dbChallenge.Completed = [];
|
||||
}
|
||||
logger.warn(`ignoring unknown challenge completion`, { challenge: Name, completion });
|
||||
}
|
||||
}
|
||||
} else {
|
||||
dbChallenge.Completed = Completed;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -50,7 +50,7 @@ import { getEntriesUnsafe } from "@/src/utils/ts-utils";
|
||||
import { handleStoreItemAcquisition } from "@/src/services/purchaseService";
|
||||
import { IMissionCredits, IMissionReward } from "@/src/types/missionTypes";
|
||||
import { crackRelic } from "@/src/helpers/relicHelper";
|
||||
import { createMessage } from "@/src/services/inboxService";
|
||||
import { createMessage, IMessageCreationTemplate } from "@/src/services/inboxService";
|
||||
import kuriaMessage50 from "@/static/fixed_responses/kuriaMessages/fiftyPercent.json";
|
||||
import kuriaMessage75 from "@/static/fixed_responses/kuriaMessages/seventyFivePercent.json";
|
||||
import kuriaMessage100 from "@/static/fixed_responses/kuriaMessages/oneHundredPercent.json";
|
||||
@ -76,13 +76,18 @@ import {
|
||||
} from "@/src/services/worldStateService";
|
||||
import { config } from "@/src/services/configService";
|
||||
import libraryDailyTasks from "@/static/fixed_responses/libraryDailyTasks.json";
|
||||
import { ISyndicateMissionInfo } from "@/src/types/worldStateTypes";
|
||||
import { IGoal, ISyndicateMissionInfo } from "@/src/types/worldStateTypes";
|
||||
import { fromOid } from "@/src/helpers/inventoryHelpers";
|
||||
import { TAccountDocument } from "@/src/services/loginService";
|
||||
import { ITypeCount } from "@/src/types/commonTypes";
|
||||
import { IEquipmentClient } from "@/src/types/equipmentTypes";
|
||||
|
||||
const getRotations = (rewardInfo: IRewardInfo, tierOverride?: number): number[] => {
|
||||
// Disruption missions just tell us (https://onlyg.it/OpenWF/SpaceNinjaServer/issues/2599)
|
||||
if (rewardInfo.rewardTierOverrides) {
|
||||
return rewardInfo.rewardTierOverrides;
|
||||
}
|
||||
|
||||
// For Spy missions, e.g. 3 vaults cracked = A, B, C
|
||||
if (rewardInfo.VaultsCracked) {
|
||||
const rotations: number[] = [];
|
||||
@ -92,14 +97,23 @@ const getRotations = (rewardInfo: IRewardInfo, tierOverride?: number): number[]
|
||||
return rotations;
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
||||
const missionIndex: number | undefined = ExportRegions[rewardInfo.node]?.missionIndex;
|
||||
const region = ExportRegions[rewardInfo.node] as IRegion | undefined;
|
||||
const missionIndex: number | undefined = region?.missionIndex;
|
||||
|
||||
// For Rescue missions
|
||||
if (missionIndex == 3 && rewardInfo.rewardTier) {
|
||||
return [rewardInfo.rewardTier];
|
||||
}
|
||||
|
||||
// 'rewardQualifications' is unreliable for non-endless railjack missions (https://onlyg.it/OpenWF/SpaceNinjaServer/issues/2586, https://onlyg.it/OpenWF/SpaceNinjaServer/issues/2612)
|
||||
switch (region?.missionName) {
|
||||
case "/Lotus/Language/Missions/MissionName_Railjack":
|
||||
case "/Lotus/Language/Missions/MissionName_RailjackVolatile":
|
||||
case "/Lotus/Language/Missions/MissionName_RailjackExterminate":
|
||||
case "/Lotus/Language/Missions/MissionName_RailjackAssassinate":
|
||||
return [0];
|
||||
}
|
||||
|
||||
const rotationCount = rewardInfo.rewardQualifications?.length || 0;
|
||||
|
||||
// Empty or absent rewardQualifications should not give rewards when:
|
||||
@ -614,37 +628,93 @@ export const addMissionInventoryUpdates = async (
|
||||
if (goal && goal.Personal) {
|
||||
inventory.PersonalGoalProgress ??= [];
|
||||
const goalProgress = inventory.PersonalGoalProgress.find(x => x.goalId.equals(goal._id.$oid));
|
||||
if (goalProgress) {
|
||||
goalProgress.Best = Math.max(goalProgress.Best, uploadProgress.Best);
|
||||
goalProgress.Count += uploadProgress.Count;
|
||||
} else {
|
||||
if (!goalProgress) {
|
||||
inventory.PersonalGoalProgress.push({
|
||||
Best: uploadProgress.Best,
|
||||
Count: uploadProgress.Count,
|
||||
Tag: goal.Tag,
|
||||
goalId: new Types.ObjectId(goal._id.$oid)
|
||||
});
|
||||
}
|
||||
|
||||
const currentNode = inventoryUpdates.RewardInfo!.node;
|
||||
let currentMissionKey;
|
||||
if (currentNode == goal.Node) {
|
||||
currentMissionKey = goal.MissionKeyName;
|
||||
} else if (goal.ConcurrentNodes && goal.ConcurrentMissionKeyNames) {
|
||||
for (let i = 0; i < goal.ConcurrentNodes.length; i++) {
|
||||
if (currentNode == goal.ConcurrentNodes[i]) {
|
||||
currentMissionKey = goal.ConcurrentMissionKeyNames[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (currentMissionKey && currentMissionKey in goalMessagesByKey) {
|
||||
const totalCount = (goalProgress?.Count ?? 0) + uploadProgress.Count;
|
||||
let reward;
|
||||
|
||||
if (goal.InterimGoals && goal.InterimRewards) {
|
||||
for (let i = 0; i < goal.InterimGoals.length; i++) {
|
||||
if (
|
||||
goal.InterimGoals[i] &&
|
||||
goal.InterimGoals[i] <= totalCount &&
|
||||
(!goalProgress || goalProgress.Count < goal.InterimGoals[i]) &&
|
||||
goal.InterimRewards[i]
|
||||
) {
|
||||
reward = goal.InterimRewards[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (
|
||||
goal.Reward &&
|
||||
goal.Reward.items &&
|
||||
goal.MissionKeyName &&
|
||||
goal.MissionKeyName in goalMessagesByKey
|
||||
!reward &&
|
||||
goal.Goal &&
|
||||
goal.Goal <= totalCount &&
|
||||
(!goalProgress || goalProgress.Count < goal.Goal) &&
|
||||
goal.Reward
|
||||
) {
|
||||
// Send reward via inbox
|
||||
const info = goalMessagesByKey[goal.MissionKeyName];
|
||||
await createMessage(inventory.accountOwnerId, [
|
||||
{
|
||||
reward = goal.Reward;
|
||||
}
|
||||
if (
|
||||
!reward &&
|
||||
goal.BonusGoal &&
|
||||
goal.BonusGoal <= totalCount &&
|
||||
(!goalProgress || goalProgress.Count < goal.BonusGoal) &&
|
||||
goal.BonusReward
|
||||
) {
|
||||
reward = goal.BonusReward;
|
||||
}
|
||||
if (reward) {
|
||||
if (currentMissionKey in goalMessagesByKey) {
|
||||
// Send reward via inbox
|
||||
const info = goalMessagesByKey[currentMissionKey];
|
||||
const message: IMessageCreationTemplate = {
|
||||
sndr: info.sndr,
|
||||
msg: info.msg,
|
||||
att: goal.Reward.items.map(x => (isStoreItem(x) ? fromStoreItem(x) : x)),
|
||||
sub: info.sub,
|
||||
icon: info.icon,
|
||||
highPriority: true
|
||||
};
|
||||
|
||||
if (reward.items) {
|
||||
message.att = reward.items.map(x => (isStoreItem(x) ? fromStoreItem(x) : x));
|
||||
}
|
||||
]);
|
||||
if (reward.countedItems) {
|
||||
message.countedAtt = reward.countedItems;
|
||||
}
|
||||
if (reward.credits) {
|
||||
message.RegularCredits = reward.credits;
|
||||
}
|
||||
|
||||
await createMessage(inventory.accountOwnerId, [message]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (goalProgress) {
|
||||
goalProgress.Best = Math.max(goalProgress.Best, uploadProgress.Best);
|
||||
goalProgress.Count += uploadProgress.Count;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -771,26 +841,24 @@ export const addMissionInventoryUpdates = async (
|
||||
}
|
||||
}
|
||||
|
||||
if (value.killed) {
|
||||
await createMessage(inventory.accountOwnerId, [
|
||||
{
|
||||
sndr: "/Lotus/Language/Bosses/Ordis",
|
||||
msg: manifest.messageBody,
|
||||
arg: [
|
||||
{
|
||||
Key: "LICH_NAME",
|
||||
Tag: value.nemesisName
|
||||
}
|
||||
],
|
||||
att: att,
|
||||
countedAtt: countedAtt,
|
||||
attVisualOnly: true,
|
||||
sub: manifest.messageTitle,
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Ordis.png",
|
||||
highPriority: true
|
||||
}
|
||||
]);
|
||||
}
|
||||
await createMessage(inventory.accountOwnerId, [
|
||||
{
|
||||
sndr: value.killed ? "/Lotus/Language/Bosses/Ordis" : value.nemesisName,
|
||||
msg: value.killed ? manifest.killMessageBody : manifest.convertMessageBody,
|
||||
arg: [
|
||||
{
|
||||
Key: "LICH_NAME",
|
||||
Tag: value.nemesisName
|
||||
}
|
||||
],
|
||||
att: att,
|
||||
countedAtt: countedAtt,
|
||||
attVisualOnly: true,
|
||||
sub: value.killed ? manifest.killMessageSubject : manifest.convertMessageSubject,
|
||||
icon: value.killed ? "/Lotus/Interface/Icons/Npcs/Ordis.png" : manifest.convertMessageIcon,
|
||||
highPriority: true
|
||||
}
|
||||
]);
|
||||
|
||||
inventory.Nemesis = undefined;
|
||||
}
|
||||
@ -1001,8 +1069,16 @@ export const addMissionRewards = async (
|
||||
|
||||
if (rewardInfo.goalId) {
|
||||
const goal = getWorldState().Goals.find(x => x._id.$oid == rewardInfo.goalId);
|
||||
if (goal?.MissionKeyName) {
|
||||
levelKeyName = goal.MissionKeyName;
|
||||
if (goal) {
|
||||
if (rewardInfo.node == goal.Node && goal.MissionKeyName) levelKeyName = goal.MissionKeyName;
|
||||
if (goal.ConcurrentNodes && goal.ConcurrentMissionKeyNames) {
|
||||
for (let i = 0; i < goal.ConcurrentNodes.length && i < goal.ConcurrentMissionKeyNames.length; i++) {
|
||||
if (rewardInfo.node == goal.ConcurrentNodes[i]) {
|
||||
levelKeyName = goal.ConcurrentMissionKeyNames[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1254,6 +1330,8 @@ export const addMissionRewards = async (
|
||||
}
|
||||
}
|
||||
|
||||
AffiliationMods ??= [];
|
||||
|
||||
if (rewardInfo.JobStage != undefined && rewardInfo.jobId) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
const [jobType, unkIndex, hubNode, syndicateMissionId] = rewardInfo.jobId.split("_");
|
||||
@ -1261,9 +1339,29 @@ export const addMissionRewards = async (
|
||||
if (syndicateMissionId) {
|
||||
pushClassicBounties(syndicateMissions, idToBountyCycle(syndicateMissionId));
|
||||
}
|
||||
const syndicateEntry = syndicateMissions.find(m => m._id.$oid === syndicateMissionId);
|
||||
let syndicateEntry: ISyndicateMissionInfo | IGoal | undefined = syndicateMissions.find(
|
||||
m => m._id.$oid === syndicateMissionId
|
||||
);
|
||||
if (
|
||||
[
|
||||
"/Lotus/Types/Gameplay/Eidolon/Jobs/Events/InfestedPlainsBounty",
|
||||
"/Lotus/Types/Gameplay/Eidolon/Jobs/Events/GhoulAlertBounty"
|
||||
].some(prefix => jobType.startsWith(prefix))
|
||||
) {
|
||||
const { Goals } = getWorldState(undefined);
|
||||
syndicateEntry = Goals.find(m => m._id.$oid === syndicateMissionId);
|
||||
if (syndicateEntry) syndicateEntry.Tag = syndicateEntry.JobAffiliationTag!;
|
||||
}
|
||||
if (syndicateEntry && syndicateEntry.Jobs) {
|
||||
let currentJob = syndicateEntry.Jobs[rewardInfo.JobTier!];
|
||||
if (
|
||||
[
|
||||
"/Lotus/Types/Gameplay/Eidolon/Jobs/Events/InfestedPlainsBounty",
|
||||
"/Lotus/Types/Gameplay/Eidolon/Jobs/Events/GhoulAlertBounty"
|
||||
].some(prefix => jobType.startsWith(prefix))
|
||||
) {
|
||||
currentJob = syndicateEntry.Jobs.find(j => j.jobType === jobType)!;
|
||||
}
|
||||
if (syndicateEntry.Tag === "EntratiSyndicate") {
|
||||
if (
|
||||
[
|
||||
@ -1306,31 +1404,35 @@ export const addMissionRewards = async (
|
||||
`Giving ${medallionAmount} medallions for the ${rewardInfo.JobStage} stage of the ${rewardInfo.JobTier} tier bounty`
|
||||
);
|
||||
} else {
|
||||
if (rewardInfo.JobTier! >= 0) {
|
||||
const specialCase = [
|
||||
{ endings: ["Heists/HeistProfitTakerBountyOne"], stage: 2, amount: 1000 },
|
||||
{ endings: ["Hunts/AllTeralystsHunt"], stage: 2, amount: 5000 },
|
||||
{
|
||||
endings: [
|
||||
"Hunts/TeralystHunt",
|
||||
"Heists/HeistProfitTakerBountyTwo",
|
||||
"Heists/HeistProfitTakerBountyThree",
|
||||
"Heists/HeistProfitTakerBountyFour",
|
||||
"Heists/HeistExploiterBountyOne"
|
||||
],
|
||||
amount: 1000
|
||||
}
|
||||
];
|
||||
const specialCaseReward = specialCase.find(
|
||||
rule =>
|
||||
rule.endings.some(e => jobType.endsWith(e)) &&
|
||||
(rule.stage === undefined || rewardInfo.JobStage === rule.stage)
|
||||
);
|
||||
|
||||
if (specialCaseReward) {
|
||||
addStanding(inventory, syndicateEntry.Tag, specialCaseReward.amount, AffiliationMods);
|
||||
} else {
|
||||
addStanding(
|
||||
inventory,
|
||||
syndicateEntry.Tag,
|
||||
Math.floor(currentJob.xpAmounts[rewardInfo.JobStage] / (rewardInfo.Q ? 0.8 : 1)),
|
||||
AffiliationMods
|
||||
);
|
||||
} else {
|
||||
if (jobType.endsWith("Heists/HeistProfitTakerBountyOne") && rewardInfo.JobStage === 2) {
|
||||
addStanding(inventory, syndicateEntry.Tag, 1000, AffiliationMods);
|
||||
}
|
||||
if (jobType.endsWith("Hunts/AllTeralystsHunt") && rewardInfo.JobStage === 2) {
|
||||
addStanding(inventory, syndicateEntry.Tag, 5000, AffiliationMods);
|
||||
}
|
||||
if (
|
||||
[
|
||||
"Hunts/TeralystHunt",
|
||||
"Heists/HeistProfitTakerBountyTwo",
|
||||
"Heists/HeistProfitTakerBountyThree",
|
||||
"Heists/HeistProfitTakerBountyFour",
|
||||
"Heists/HeistExploiterBountyOne"
|
||||
].some(ending => jobType.endsWith(ending))
|
||||
) {
|
||||
addStanding(inventory, syndicateEntry.Tag, 1000, AffiliationMods);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1667,7 +1769,19 @@ function getRandomMissionDrops(
|
||||
if (syndicateMissionId) {
|
||||
pushClassicBounties(syndicateMissions, idToBountyCycle(syndicateMissionId));
|
||||
}
|
||||
const syndicateEntry = syndicateMissions.find(m => m._id.$oid === syndicateMissionId);
|
||||
let syndicateEntry: ISyndicateMissionInfo | IGoal | undefined = syndicateMissions.find(
|
||||
m => m._id.$oid === syndicateMissionId
|
||||
);
|
||||
if (
|
||||
[
|
||||
"/Lotus/Types/Gameplay/Eidolon/Jobs/Events/InfestedPlainsBounty",
|
||||
"/Lotus/Types/Gameplay/Eidolon/Jobs/Events/GhoulAlertBounty"
|
||||
].some(prefix => jobType.startsWith(prefix))
|
||||
) {
|
||||
const { Goals } = getWorldState(undefined);
|
||||
syndicateEntry = Goals.find(m => m._id.$oid === syndicateMissionId);
|
||||
if (syndicateEntry) syndicateEntry.Tag = syndicateEntry.JobAffiliationTag!;
|
||||
}
|
||||
if (syndicateEntry && syndicateEntry.Jobs) {
|
||||
let job = syndicateEntry.Jobs[RewardInfo.JobTier!];
|
||||
|
||||
@ -1752,6 +1866,14 @@ function getRandomMissionDrops(
|
||||
}
|
||||
}
|
||||
}
|
||||
if (
|
||||
[
|
||||
"/Lotus/Types/Gameplay/Eidolon/Jobs/Events/InfestedPlainsBounty",
|
||||
"/Lotus/Types/Gameplay/Eidolon/Jobs/Events/GhoulAlertBounty"
|
||||
].some(prefix => jobType.startsWith(prefix))
|
||||
) {
|
||||
job = syndicateEntry.Jobs.find(j => j.jobType === jobType)!;
|
||||
}
|
||||
rewardManifests = [job.rewards];
|
||||
if (job.xpAmounts.length > 1) {
|
||||
const curentStage = RewardInfo.JobStage! + 1;
|
||||
@ -1880,6 +2002,36 @@ function getRandomMissionDrops(
|
||||
}
|
||||
});
|
||||
|
||||
// Railjack Abandoned Cache Rewards, Rotation A (Mandatory Objectives)
|
||||
if (RewardInfo.POICompletions) {
|
||||
if (region.cacheRewardManifest) {
|
||||
const deck = ExportRewards[region.cacheRewardManifest];
|
||||
for (let cache = 0; cache != RewardInfo.POICompletions; ++cache) {
|
||||
const drop = getRandomRewardByChance(deck[0]);
|
||||
if (drop) {
|
||||
drops.push({ StoreItem: drop.type, ItemCount: drop.itemCount, FromEnemyCache: true });
|
||||
}
|
||||
}
|
||||
} else {
|
||||
logger.error(`POI completed, but there was no cache reward manifest at ${RewardInfo.node}`);
|
||||
}
|
||||
}
|
||||
|
||||
// Railjack Abandoned Cache Rewards, Rotation B (Optional Objectives)
|
||||
if (RewardInfo.LootDungeonCompletions) {
|
||||
if (region.cacheRewardManifest) {
|
||||
const deck = ExportRewards[region.cacheRewardManifest];
|
||||
for (let cache = 0; cache != RewardInfo.LootDungeonCompletions; ++cache) {
|
||||
const drop = getRandomRewardByChance(deck[1]);
|
||||
if (drop) {
|
||||
drops.push({ StoreItem: drop.type, ItemCount: drop.itemCount, FromEnemyCache: true });
|
||||
}
|
||||
}
|
||||
} else {
|
||||
logger.error(`Loot dungeon completed, but there was no cache reward manifest at ${RewardInfo.node}`);
|
||||
}
|
||||
}
|
||||
|
||||
if (region.cacheRewardManifest && RewardInfo.EnemyCachesFound) {
|
||||
const deck = ExportRewards[region.cacheRewardManifest];
|
||||
for (let rotation = 0; rotation != RewardInfo.EnemyCachesFound; ++rotation) {
|
||||
@ -2093,5 +2245,143 @@ const goalMessagesByKey: Record<string, { sndr: string; msg: string; sub: string
|
||||
msg: "/Lotus/Language/Messages/GalleonRobbery2025RewardMsgC",
|
||||
sub: "/Lotus/Language/Messages/GalleonRobbery2025MissionTitleC",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/VayHekPortrait.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/TacAlertKeyWaterFightA": {
|
||||
sndr: "/Lotus/Language/Bosses/BossKelaDeThaym",
|
||||
msg: "/Lotus/Language/Inbox/WaterFightRewardMsgA",
|
||||
sub: "/Lotus/Language/Inbox/WaterFightRewardSubjectA",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Grineer/KelaDeThaym.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/TacAlertKeyWaterFightB": {
|
||||
sndr: "/Lotus/Language/Bosses/BossKelaDeThaym",
|
||||
msg: "/Lotus/Language/Inbox/WaterFightRewardMsgB",
|
||||
sub: "/Lotus/Language/Inbox/WaterFightRewardSubjectB",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Grineer/KelaDeThaym.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/TacAlertKeyWaterFightC": {
|
||||
sndr: "/Lotus/Language/Bosses/BossKelaDeThaym",
|
||||
msg: "/Lotus/Language/Inbox/WaterFightRewardMsgC",
|
||||
sub: "/Lotus/Language/Inbox/WaterFightRewardSubjectC",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Grineer/KelaDeThaym.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/TacAlertKeyWaterFightD": {
|
||||
sndr: "/Lotus/Language/Bosses/BossKelaDeThaym",
|
||||
msg: "/Lotus/Language/Inbox/WaterFightRewardMsgD",
|
||||
sub: "/Lotus/Language/Inbox/WaterFightRewardSubjectD",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Grineer/KelaDeThaym.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/WolfTacAlertReduxA": {
|
||||
sndr: "/Lotus/Language/Bosses/NoraNight",
|
||||
msg: "/Lotus/Language/Inbox/WolfTacAlertBody",
|
||||
sub: "/Lotus/Language/Inbox/WolfTacAlertTitle",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Seasonal/NoraNight.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/WolfTacAlertReduxB": {
|
||||
sndr: "/Lotus/Language/Bosses/NoraNight",
|
||||
msg: "/Lotus/Language/Inbox/WolfTacAlertBody",
|
||||
sub: "/Lotus/Language/Inbox/WolfTacAlertTitle",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Seasonal/NoraNight.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/WolfTacAlertReduxD": {
|
||||
sndr: "/Lotus/Language/Bosses/NoraNight",
|
||||
msg: "/Lotus/Language/Inbox/WolfTacAlertBody",
|
||||
sub: "/Lotus/Language/Inbox/WolfTacAlertTitle",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Seasonal/NoraNight.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/WolfTacAlertReduxC": {
|
||||
sndr: "/Lotus/Language/Bosses/NoraNight",
|
||||
msg: "/Lotus/Language/Inbox/WolfTacAlertBody",
|
||||
sub: "/Lotus/Language/Inbox/WolfTacAlertTitle",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Seasonal/NoraNight.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/LanternEndlessEventKeyA": {
|
||||
sndr: "/Lotus/Language/Bosses/Lotus",
|
||||
msg: "/Lotus/Language/G1Quests/GenericEventRewardMsgDesc",
|
||||
sub: "/Lotus/Language/G1Quests/GenericTacAlertRewardMsgTitle",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/LotusVamp_d.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/LanternEndlessEventKeyB": {
|
||||
sndr: "/Lotus/Language/Bosses/Lotus",
|
||||
msg: "/Lotus/Language/G1Quests/GenericEventRewardMsgDesc",
|
||||
sub: "/Lotus/Language/G1Quests/GenericTacAlertRewardMsgTitle",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/LotusVamp_d.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/LanternEndlessEventKeyD": {
|
||||
sndr: "/Lotus/Language/Bosses/Lotus",
|
||||
msg: "/Lotus/Language/G1Quests/GenericEventRewardMsgDesc",
|
||||
sub: "/Lotus/Language/G1Quests/GenericTacAlertRewardMsgTitle",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/LotusVamp_d.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/LanternEndlessEventKeyC": {
|
||||
sndr: "/Lotus/Language/Bosses/Lotus",
|
||||
msg: "/Lotus/Language/G1Quests/GenericEventRewardMsgDesc",
|
||||
sub: "/Lotus/Language/G1Quests/GenericTacAlertRewardMsgTitle",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/LotusVamp_d.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/TacAlertKeyHalloween": {
|
||||
sndr: "/Lotus/Language/Bosses/Lotus",
|
||||
msg: "/Lotus/Language/G1Quests/TacAlertHalloweenRewardsBonusBody",
|
||||
sub: "/Lotus/Language/G1Quests/TacAlertHalloweenRewardsBonusTitle",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/LotusVamp_d.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/TacAlertKeyHalloweenBonus": {
|
||||
sndr: "/Lotus/Language/Bosses/Lotus",
|
||||
msg: "/Lotus/Language/G1Quests/TacAlertHalloweenRewardsBody",
|
||||
sub: "/Lotus/Language/G1Quests/TacAlertHalloweenRewardsTitle",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/LotusVamp_d.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/TacAlertKeyHalloweenTimeAttack": {
|
||||
sndr: "/Lotus/Language/Bosses/Lotus",
|
||||
msg: "/Lotus/Language/G1Quests/TacAlertHalloweenRewardsBody",
|
||||
sub: "/Lotus/Language/G1Quests/TacAlertHalloweenRewardsTitle",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/LotusVamp_d.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/TacAlertKeyProxyRebellionOne": {
|
||||
sndr: "/Lotus/Language/Bosses/Lotus",
|
||||
msg: "/Lotus/Language/G1Quests/RazorbackArmadaRewardBody",
|
||||
sub: "/Lotus/Language/G1Quests/GenericTacAlertSmallRewardMsgTitle",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Lotus_d.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/TacAlertKeyProxyRebellionTwo": {
|
||||
sndr: "/Lotus/Language/Bosses/Lotus",
|
||||
msg: "/Lotus/Language/G1Quests/RazorbackArmadaRewardBody",
|
||||
sub: "/Lotus/Language/G1Quests/GenericTacAlertSmallRewardMsgTitle",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Lotus_d.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/TacAlertKeyProxyRebellionThree": {
|
||||
sndr: "/Lotus/Language/Bosses/Lotus",
|
||||
msg: "/Lotus/Language/G1Quests/RazorbackArmadaRewardBody",
|
||||
sub: "/Lotus/Language/G1Quests/GenericTacAlertSmallRewardMsgTitle",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Lotus_d.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/TacAlertKeyProxyRebellionFour": {
|
||||
sndr: "/Lotus/Language/Bosses/Lotus",
|
||||
msg: "/Lotus/Language/G1Quests/GenericTacAlertBadgeRewardMsgDesc",
|
||||
sub: "/Lotus/Language/G1Quests/GenericTacAlertBadgeRewardMsgTitle",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Lotus_d.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/TacAlertKeyProjectNightwatchEasy": {
|
||||
sndr: "/Lotus/Language/Bosses/Lotus",
|
||||
msg: "/Lotus/Language/G1Quests/ProjectNightwatchRewardMsgA",
|
||||
sub: "/Lotus/Language/G1Quests/ProjectNightwatchTacAlertMissionOneTitle",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Lotus_d.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/TacAlertKeyProjectNightwatch": {
|
||||
sndr: "/Lotus/Language/Bosses/Lotus",
|
||||
msg: "/Lotus/Language/G1Quests/ProjectNightwatchTacAlertMissionRewardBody",
|
||||
sub: "/Lotus/Language/G1Quests/ProjectNightwatchTacAlertMissionTwoTitle",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Lotus_d.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/TacAlertKeyProjectNightwatchHard": {
|
||||
sndr: "/Lotus/Language/Bosses/Lotus",
|
||||
msg: "/Lotus/Language/G1Quests/ProjectNightwatchTacAlertMissionRewardBody",
|
||||
sub: "/Lotus/Language/G1Quests/ProjectNightwatchTacAlertMissionThreeTitle",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Lotus_d.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/TacAlertKeyProjectNightwatchBonus": {
|
||||
sndr: "/Lotus/Language/Bosses/Lotus",
|
||||
msg: "/Lotus/Language/G1Quests/ProjectNightwatchTacAlertMissionRewardBody",
|
||||
sub: "/Lotus/Language/G1Quests/ProjectNightwatchTacAlertMissionFourTitle",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Lotus_d.png"
|
||||
}
|
||||
};
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
import { parseSlotPurchaseName } from "@/src/helpers/purchaseHelpers";
|
||||
import { parseSlotPurchaseName, slotPurchaseNameToSlotName } from "@/src/helpers/purchaseHelpers";
|
||||
import { getSubstringFromKeyword } from "@/src/helpers/stringHelpers";
|
||||
import {
|
||||
addBooster,
|
||||
@ -14,7 +14,6 @@ import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes";
|
||||
import {
|
||||
IPurchaseRequest,
|
||||
IPurchaseResponse,
|
||||
SlotPurchase,
|
||||
IInventoryChanges,
|
||||
PurchaseSource,
|
||||
IPurchaseParams
|
||||
@ -328,7 +327,7 @@ export const handlePurchase = async (
|
||||
purchaseResponse.InventoryChanges.MiscItems ??= [];
|
||||
purchaseResponse.InventoryChanges.MiscItems.push(invItem);
|
||||
}
|
||||
} else if (!config.infiniteRegalAya) {
|
||||
} else if (!inventory.infiniteRegalAya) {
|
||||
inventory.PrimeTokens -= offer.PrimePrice! * purchaseRequest.PurchaseParams.Quantity;
|
||||
|
||||
purchaseResponse.InventoryChanges.PrimeTokens ??= 0;
|
||||
@ -472,19 +471,6 @@ export const handleStoreItemAcquisition = async (
|
||||
return purchaseResponse;
|
||||
};
|
||||
|
||||
export const slotPurchaseNameToSlotName: SlotPurchase = {
|
||||
SuitSlotItem: { name: "SuitBin", purchaseQuantity: 1 },
|
||||
TwoSentinelSlotItem: { name: "SentinelBin", purchaseQuantity: 2 },
|
||||
TwoWeaponSlotItem: { name: "WeaponBin", purchaseQuantity: 2 },
|
||||
SpaceSuitSlotItem: { name: "SpaceSuitBin", purchaseQuantity: 1 },
|
||||
TwoSpaceWeaponSlotItem: { name: "SpaceWeaponBin", purchaseQuantity: 2 },
|
||||
MechSlotItem: { name: "MechBin", purchaseQuantity: 1 },
|
||||
TwoOperatorWeaponSlotItem: { name: "OperatorAmpBin", purchaseQuantity: 2 },
|
||||
RandomModSlotItem: { name: "RandomModBin", purchaseQuantity: 3 },
|
||||
TwoCrewShipSalvageSlotItem: { name: "CrewShipSalvageBin", purchaseQuantity: 2 },
|
||||
CrewMemberSlotItem: { name: "CrewMemberBin", purchaseQuantity: 1 }
|
||||
};
|
||||
|
||||
// // extra = everything above the base +2 slots (depending on slot type)
|
||||
// // new slot above base = extra + 1 and slots +1
|
||||
// // new frame = slots -1
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -19,6 +19,15 @@ export type InventoryDatabaseEquipment = {
|
||||
[_ in TEquipmentKey]: IEquipmentDatabase[];
|
||||
};
|
||||
|
||||
// Fields specific to SNS
|
||||
export interface IAccountCheats {
|
||||
infiniteCredits?: boolean;
|
||||
infinitePlatinum?: boolean;
|
||||
infiniteEndo?: boolean;
|
||||
infiniteRegalAya?: boolean;
|
||||
infiniteHelminthMaterials?: boolean;
|
||||
}
|
||||
|
||||
export interface IInventoryDatabase
|
||||
extends Omit<
|
||||
IInventoryClient,
|
||||
@ -61,7 +70,8 @@ export interface IInventoryDatabase
|
||||
| "PersonalGoalProgress"
|
||||
| TEquipmentKey
|
||||
>,
|
||||
InventoryDatabaseEquipment {
|
||||
InventoryDatabaseEquipment,
|
||||
IAccountCheats {
|
||||
accountOwnerId: Types.ObjectId;
|
||||
Created: Date;
|
||||
TrainingDate: Date;
|
||||
|
||||
@ -23,12 +23,19 @@ export interface IMissionCredits {
|
||||
DailyMissionBonus?: boolean;
|
||||
}
|
||||
|
||||
export interface IMissionInventoryUpdateResponse extends Partial<IMissionCredits> {
|
||||
export interface IMissionInventoryUpdateResponseRailjackInterstitial extends Partial<IMissionCredits> {
|
||||
ConquestCompletedMissionsCount?: number;
|
||||
InventoryJson?: string;
|
||||
MissionRewards?: IMissionReward[];
|
||||
InventoryChanges?: IInventoryChanges;
|
||||
FusionPoints?: number;
|
||||
SyndicateXPItemReward?: number;
|
||||
AffiliationMods?: IAffiliationMods[];
|
||||
}
|
||||
|
||||
export interface IMissionInventoryUpdateResponse extends IMissionInventoryUpdateResponseRailjackInterstitial {
|
||||
InventoryJson?: string;
|
||||
}
|
||||
|
||||
export interface IMissionInventoryUpdateResponseBackToDryDock {
|
||||
InventoryJson: string;
|
||||
}
|
||||
|
||||
@ -148,6 +148,7 @@ export type IMissionInventoryUpdateRequest = {
|
||||
MultiProgress: unknown[];
|
||||
}[];
|
||||
InvasionProgress?: IInvasionProgressClient[];
|
||||
RJ?: boolean;
|
||||
ConquestMissionsCompleted?: number;
|
||||
duviriSuitSelection?: string;
|
||||
duviriPistolSelection?: string;
|
||||
@ -184,7 +185,10 @@ export interface IRewardInfo {
|
||||
NemesisHintProgress?: number;
|
||||
EOM_AFK?: number;
|
||||
rewardQualifications?: string; // did a Survival for 5 minutes and this was "1"
|
||||
rewardTierOverrides?: number[]; // Disruption
|
||||
PurgatoryRewardQualifications?: string;
|
||||
POICompletions?: number;
|
||||
LootDungeonCompletions?: number;
|
||||
rewardSeed?: number | bigint;
|
||||
periodicMissionTag?: string;
|
||||
T?: number; // Duviri
|
||||
|
||||
@ -5,12 +5,14 @@ export interface IWorldState {
|
||||
Version: number; // for goals
|
||||
BuildLabel: string;
|
||||
Time: number;
|
||||
InGameMarket: IInGameMarket;
|
||||
Goals: IGoal[];
|
||||
Alerts: [];
|
||||
Sorties: ISortie[];
|
||||
LiteSorties: ILiteSortie[];
|
||||
SyndicateMissions: ISyndicateMissionInfo[];
|
||||
ActiveMissions: IFissure[];
|
||||
FlashSales: IFlashSale[];
|
||||
GlobalUpgrades: IGlobalUpgrade[];
|
||||
Invasions: IInvasion[];
|
||||
NodeOverrides: INodeOverride[];
|
||||
@ -37,19 +39,59 @@ export interface IGoal {
|
||||
_id: IOid;
|
||||
Activation: IMongoDate;
|
||||
Expiry: IMongoDate;
|
||||
Count: number;
|
||||
Goal: number;
|
||||
Success: number;
|
||||
Personal: boolean;
|
||||
Bounty?: boolean;
|
||||
Count?: number;
|
||||
Goal?: number;
|
||||
InterimGoals?: number[];
|
||||
BonusGoal?: number;
|
||||
HealthPct?: number;
|
||||
Success?: number;
|
||||
Personal?: boolean;
|
||||
Best?: boolean;
|
||||
Bounty?: boolean; // Tactical Alert
|
||||
Faction?: string;
|
||||
ClampNodeScores?: boolean;
|
||||
Desc: string;
|
||||
ToolTip?: string;
|
||||
Transmission?: string;
|
||||
InstructionalItem?: string;
|
||||
Icon: string;
|
||||
Tag: string;
|
||||
Node: string;
|
||||
PrereqGoalTags?: string[];
|
||||
Node?: string;
|
||||
VictimNode?: string;
|
||||
ConcurrentMissionKeyNames?: string[];
|
||||
ConcurrentNodeReqs?: number[];
|
||||
ConcurrentNodes?: string[];
|
||||
RegionIdx?: number;
|
||||
Regions?: number[];
|
||||
MissionKeyName?: string;
|
||||
Reward?: IMissionReward;
|
||||
InterimRewards?: IMissionReward[];
|
||||
BonusReward?: IMissionReward;
|
||||
|
||||
JobAffiliationTag?: string;
|
||||
Jobs?: ISyndicateJob[];
|
||||
PreviousJobs?: ISyndicateJob[];
|
||||
JobCurrentVersion?: IOid;
|
||||
JobPreviousVersion?: IOid;
|
||||
|
||||
ScoreVar?: string;
|
||||
ScoreMaxTag?: string;
|
||||
NightLevel?: string;
|
||||
}
|
||||
|
||||
export interface ISyndicateJob {
|
||||
jobType?: string;
|
||||
rewards: string;
|
||||
masteryReq?: number;
|
||||
minEnemyLevel: number;
|
||||
maxEnemyLevel: number;
|
||||
xpAmounts: number[];
|
||||
endless?: boolean;
|
||||
locationTag?: string;
|
||||
isVault?: boolean;
|
||||
requiredItems?: string[];
|
||||
useRequiredItemsAsMiscItemFee?: boolean;
|
||||
}
|
||||
|
||||
export interface ISyndicateMissionInfo {
|
||||
@ -59,17 +101,7 @@ export interface ISyndicateMissionInfo {
|
||||
Tag: string;
|
||||
Seed: number;
|
||||
Nodes: string[];
|
||||
Jobs?: {
|
||||
jobType?: string;
|
||||
rewards: string;
|
||||
masteryReq: number;
|
||||
minEnemyLevel: number;
|
||||
maxEnemyLevel: number;
|
||||
xpAmounts: number[];
|
||||
endless?: boolean;
|
||||
locationTag?: string;
|
||||
isVault?: boolean;
|
||||
}[];
|
||||
Jobs?: ISyndicateJob[];
|
||||
}
|
||||
|
||||
export interface IGlobalUpgrade {
|
||||
@ -265,6 +297,7 @@ export interface IEndlessXpChoice {
|
||||
export interface ISeasonChallenge {
|
||||
_id: IOid;
|
||||
Daily?: boolean;
|
||||
Permanent?: boolean; // only for getPastWeeklyChallenges response
|
||||
Activation: IMongoDate;
|
||||
Expiry: IMongoDate;
|
||||
Challenge: string;
|
||||
@ -303,6 +336,37 @@ export type TCircuitGameMode =
|
||||
| "Assassination"
|
||||
| "Alchemy";
|
||||
|
||||
export interface IFlashSale {
|
||||
TypeName: string;
|
||||
ShowInMarket: boolean;
|
||||
HideFromMarket: boolean;
|
||||
SupporterPack: boolean;
|
||||
Discount: number;
|
||||
BogoBuy: number;
|
||||
BogoGet: number;
|
||||
PremiumOverride: number;
|
||||
RegularOverride: number;
|
||||
ProductExpiryOverride?: IMongoDate;
|
||||
StartDate: IMongoDate;
|
||||
EndDate: IMongoDate;
|
||||
}
|
||||
|
||||
export interface IInGameMarket {
|
||||
LandingPage: ILandingPage;
|
||||
}
|
||||
|
||||
export interface ILandingPage {
|
||||
Categories: IGameMarketCategory[];
|
||||
}
|
||||
|
||||
export interface IGameMarketCategory {
|
||||
CategoryName: string;
|
||||
Name: string;
|
||||
Icon: string;
|
||||
AddToMenu?: boolean;
|
||||
Items?: string[];
|
||||
}
|
||||
|
||||
export interface ITmp {
|
||||
cavabegin: string;
|
||||
PurchasePlatformLockEnabled: boolean; // Seems unused
|
||||
|
||||
@ -663,26 +663,6 @@
|
||||
<input class="form-check-input" type="checkbox" id="unlockAllScans" />
|
||||
<label class="form-check-label" for="unlockAllScans" data-loc="cheats_unlockAllScans"></label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="infiniteCredits" />
|
||||
<label class="form-check-label" for="infiniteCredits" data-loc="cheats_infiniteCredits"></label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="infinitePlatinum" />
|
||||
<label class="form-check-label" for="infinitePlatinum" data-loc="cheats_infinitePlatinum"></label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="infiniteEndo" />
|
||||
<label class="form-check-label" for="infiniteEndo" data-loc="cheats_infiniteEndo"></label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="infiniteRegalAya" />
|
||||
<label class="form-check-label" for="infiniteRegalAya" data-loc="cheats_infiniteRegalAya"></label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="infiniteHelminthMaterials" />
|
||||
<label class="form-check-label" for="infiniteHelminthMaterials" data-loc="cheats_infiniteHelminthMaterials"></label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="claimingBlueprintRefundsIngredients" />
|
||||
<label class="form-check-label" for="claimingBlueprintRefundsIngredients" data-loc="cheats_claimingBlueprintRefundsIngredients"></label>
|
||||
@ -891,8 +871,28 @@
|
||||
<div class="col-md-6">
|
||||
<div class="card mb-3">
|
||||
<h5 class="card-header" data-loc="cheats_account"></h5>
|
||||
<div class="card-body">
|
||||
<div class="mb-2 d-flex flex-wrap gap-2">
|
||||
<div class="card-body" id="account-cheats">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="infiniteCredits" />
|
||||
<label class="form-check-label" for="infiniteCredits" data-loc="cheats_infiniteCredits"></label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="infinitePlatinum" />
|
||||
<label class="form-check-label" for="infinitePlatinum" data-loc="cheats_infinitePlatinum"></label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="infiniteEndo" />
|
||||
<label class="form-check-label" for="infiniteEndo" data-loc="cheats_infiniteEndo"></label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="infiniteRegalAya" />
|
||||
<label class="form-check-label" for="infiniteRegalAya" data-loc="cheats_infiniteRegalAya"></label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="infiniteHelminthMaterials" />
|
||||
<label class="form-check-label" for="infiniteHelminthMaterials" data-loc="cheats_infiniteHelminthMaterials"></label>
|
||||
</div>
|
||||
<div class="mt-2 mb-2 d-flex flex-wrap gap-2">
|
||||
<button class="btn btn-primary" onclick="debounce(doUnlockAllMissions);" data-loc="cheats_unlockAllMissions"></button>
|
||||
<button class="btn btn-primary" onclick="debounce(markAllAsRead);" data-loc="cheats_markAllAsRead"></button>
|
||||
<button class="btn btn-primary" onclick="doUnlockAllFocusSchools();" data-loc="cheats_unlockAllFocusSchools"></button>
|
||||
@ -937,8 +937,57 @@
|
||||
<input class="form-check-input" type="checkbox" id="worldState.varziaFullyStocked" />
|
||||
<label class="form-check-label" for="worldState.varziaFullyStocked" data-loc="worldState_varziaFullyStocked"></label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="worldState.wolfHunt" />
|
||||
<label class="form-check-label" for="worldState.wolfHunt" data-loc="worldState_wolfHunt"></label>
|
||||
<abbr data-loc-inc="worldState_galleonOfGhouls"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><path d="M320 576C461.4 576 576 461.4 576 320C576 178.6 461.4 64 320 64C178.6 64 64 178.6 64 320C64 461.4 178.6 576 320 576zM320 200C333.3 200 344 210.7 344 224L344 336C344 349.3 333.3 360 320 360C306.7 360 296 349.3 296 336L296 224C296 210.7 306.7 200 320 200zM293.3 416C292.7 406.1 297.6 396.7 306.1 391.5C314.6 386.4 325.3 386.4 333.8 391.5C342.3 396.7 347.2 406.1 346.6 416C347.2 425.9 342.3 435.3 333.8 440.5C325.3 445.6 314.6 445.6 306.1 440.5C297.6 435.3 292.7 425.9 293.3 416z"/></svg></abbr>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="worldState.longShadow" />
|
||||
<label class="form-check-label" for="worldState.longShadow" data-loc="worldState_longShadow"></label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="worldState.hallowedFlame" />
|
||||
<label class="form-check-label" for="worldState.hallowedFlame" data-loc="worldState_hallowedFlame"></label>
|
||||
<abbr data-loc-inc="worldState_hallowedNightmares|worldState_dogDays"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><path d="M320 576C461.4 576 576 461.4 576 320C576 178.6 461.4 64 320 64C178.6 64 64 178.6 64 320C64 461.4 178.6 576 320 576zM320 200C333.3 200 344 210.7 344 224L344 336C344 349.3 333.3 360 320 360C306.7 360 296 349.3 296 336L296 224C296 210.7 306.7 200 320 200zM293.3 416C292.7 406.1 297.6 396.7 306.1 391.5C314.6 386.4 325.3 386.4 333.8 391.5C342.3 396.7 347.2 406.1 346.6 416C347.2 425.9 342.3 435.3 333.8 440.5C325.3 445.6 314.6 445.6 306.1 440.5C297.6 435.3 292.7 425.9 293.3 416z"/></svg></abbr>
|
||||
</div>
|
||||
<div class="form-group mt-2 d-flex gap-2">
|
||||
<div class="flex-fill">
|
||||
<label class="form-label" for="worldState.hallowedNightmares" data-loc="worldState_hallowedNightmares"></label>
|
||||
<abbr data-loc-inc="worldState_hallowedFlame|worldState_dogDays"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><path d="M320 576C461.4 576 576 461.4 576 320C576 178.6 461.4 64 320 64C178.6 64 64 178.6 64 320C64 461.4 178.6 576 320 576zM320 200C333.3 200 344 210.7 344 224L344 336C344 349.3 333.3 360 320 360C306.7 360 296 349.3 296 336L296 224C296 210.7 306.7 200 320 200zM293.3 416C292.7 406.1 297.6 396.7 306.1 391.5C314.6 386.4 325.3 386.4 333.8 391.5C342.3 396.7 347.2 406.1 346.6 416C347.2 425.9 342.3 435.3 333.8 440.5C325.3 445.6 314.6 445.6 306.1 440.5C297.6 435.3 292.7 425.9 293.3 416z"/></svg></abbr>
|
||||
<select class="form-control" id="worldState.hallowedNightmares" data-default="false">
|
||||
<option value="true" data-loc="enabled"></option>
|
||||
<option value="false" data-loc="disabled"></option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="flex-fill">
|
||||
<label class="form-label" for="worldState.hallowedNightmaresRewardsOverride" data-loc="worldState_hallowedNightmaresRewards"></label>
|
||||
<select class="form-control" id="worldState.hallowedNightmaresRewardsOverride" data-default="0">
|
||||
<option value="0" data-loc="worldState_from_year" data-loc-year="2018"></option>
|
||||
<option value="1" data-loc="worldState_from_year" data-loc-year="2016"></option>
|
||||
<option value="2" data-loc="worldState_from_year" data-loc-year="2015"></option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group mt-2 d-flex gap-2">
|
||||
<div class="flex-fill">
|
||||
<label class="form-label" for="worldState.proxyRebellion" data-loc="worldState_proxyRebellion"></label>
|
||||
<select class="form-control" id="worldState.proxyRebellion" data-default="false">
|
||||
<option value="true" data-loc="enabled"></option>
|
||||
<option value="false" data-loc="disabled"></option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="flex-fill">
|
||||
<label class="form-label" for="worldState.proxyRebellionRewardsOverride" data-loc="worldState_proxyRebellionRewards"></label>
|
||||
<select class="form-control" id="worldState.proxyRebellionRewardsOverride" data-default="0">
|
||||
<option value="0" data-loc="worldState_from_year" data-loc-year="2019"></option>
|
||||
<option value="1" data-loc="worldState_from_year" data-loc-year="2018"></option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group mt-2">
|
||||
<label class="form-label" for="worldState.galleonOfGhouls" data-loc="worldState_galleonOfGhouls"></label>
|
||||
<abbr data-loc-inc="worldState_wolfHunt"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><path d="M320 576C461.4 576 576 461.4 576 320C576 178.6 461.4 64 320 64C178.6 64 64 178.6 64 320C64 461.4 178.6 576 320 576zM320 200C333.3 200 344 210.7 344 224L344 336C344 349.3 333.3 360 320 360C306.7 360 296 349.3 296 336L296 224C296 210.7 306.7 200 320 200zM293.3 416C292.7 406.1 297.6 396.7 306.1 391.5C314.6 386.4 325.3 386.4 333.8 391.5C342.3 396.7 347.2 406.1 346.6 416C347.2 425.9 342.3 435.3 333.8 440.5C325.3 445.6 314.6 445.6 306.1 440.5C297.6 435.3 292.7 425.9 293.3 416z"/></svg></abbr>
|
||||
<select class="form-control" id="worldState.galleonOfGhouls" data-default="0">
|
||||
<option value="0" data-loc="disabled"></option>
|
||||
<option value="1" data-loc="worldState_we1"></option>
|
||||
@ -946,6 +995,22 @@
|
||||
<option value="3" data-loc="worldState_we3"></option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group mt-2">
|
||||
<label class="form-label" for="worldState.ghoulEmergenceOverride" data-loc="worldState_ghoulEmergence"></label>
|
||||
<select class="form-control" id="worldState.ghoulEmergenceOverride" data-default="null">
|
||||
<option value="null" data-loc="normal"></option>
|
||||
<option value="true" data-loc="enabled"></option>
|
||||
<option value="false" data-loc="disabled"></option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group mt-2">
|
||||
<label class="form-label" for="worldState.plagueStarOverride" data-loc="worldState_plagueStar"></label>
|
||||
<select class="form-control" id="worldState.plagueStarOverride" data-default="null">
|
||||
<option value="null" data-loc="normal"></option>
|
||||
<option value="true" data-loc="enabled"></option>
|
||||
<option value="false" data-loc="disabled"></option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group mt-2">
|
||||
<label class="form-label" for="worldState.starDaysOverride" data-loc="worldState_starDays"></label>
|
||||
<select class="form-control" id="worldState.starDaysOverride" data-default="null">
|
||||
@ -954,6 +1019,27 @@
|
||||
<option value="false" data-loc="disabled"></option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group mt-2 d-flex gap-2">
|
||||
<div class="flex-fill">
|
||||
<label class="form-label" for="worldState.dogDaysOverride" data-loc="worldState_dogDays"></label>
|
||||
<abbr data-loc-inc="worldState_hallowedFlame|worldState_hallowedNightmares"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><path d="M320 576C461.4 576 576 461.4 576 320C576 178.6 461.4 64 320 64C178.6 64 64 178.6 64 320C64 461.4 178.6 576 320 576zM320 200C333.3 200 344 210.7 344 224L344 336C344 349.3 333.3 360 320 360C306.7 360 296 349.3 296 336L296 224C296 210.7 306.7 200 320 200zM293.3 416C292.7 406.1 297.6 396.7 306.1 391.5C314.6 386.4 325.3 386.4 333.8 391.5C342.3 396.7 347.2 406.1 346.6 416C347.2 425.9 342.3 435.3 333.8 440.5C325.3 445.6 314.6 445.6 306.1 440.5C297.6 435.3 292.7 425.9 293.3 416z"/></svg></abbr>
|
||||
<select class="form-control" id="worldState.dogDaysOverride" data-default="null">
|
||||
<option value="null" data-loc="normal"></option>
|
||||
<option value="true" data-loc="enabled"></option>
|
||||
<option value="false" data-loc="disabled"></option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="flex-fill">
|
||||
<label class="form-label" for="worldState.dogDaysRewardsOverride" data-loc="worldState_dogDaysRewards"></label>
|
||||
<select class="form-control" id="worldState.dogDaysRewardsOverride" data-default="null">
|
||||
<option value="null" data-loc="normal"></option>
|
||||
<option value="3" data-loc="worldState_from_year" data-loc-year="2025"></option>
|
||||
<option value="2" data-loc="worldState_from_year" data-loc-year="2024"></option>
|
||||
<option value="1" data-loc="worldState_from_year" data-loc-year="2023"></option>
|
||||
<option value="0" data-loc="worldState_pre_year" data-loc-year="2023"></option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group mt-2">
|
||||
<label class="form-label" for="worldState.eidolonOverride" data-loc="worldState_eidolonOverride"></label>
|
||||
<select class="form-control" id="worldState.eidolonOverride" data-default="">
|
||||
|
||||
@ -18,7 +18,7 @@ const sendAuth = isRegister => {
|
||||
window.ws.send(
|
||||
JSON.stringify({
|
||||
auth: {
|
||||
email: localStorage.getItem("email"),
|
||||
email: localStorage.getItem("email").toLowerCase(),
|
||||
password: wp.encSync(localStorage.getItem("password")),
|
||||
isRegister
|
||||
}
|
||||
@ -202,6 +202,17 @@ function updateLocElements() {
|
||||
document.querySelectorAll("[data-loc-placeholder]").forEach(elm => {
|
||||
elm.placeholder = loc(elm.getAttribute("data-loc-placeholder"));
|
||||
});
|
||||
document.querySelectorAll("[data-loc-inc]").forEach(elm => {
|
||||
const incWith = elm
|
||||
.getAttribute("data-loc-inc")
|
||||
.split("|")
|
||||
.map(key => loc(key))
|
||||
.join(", ");
|
||||
elm.title = `${loc("worldState_incompatibleWith")} ${incWith}`;
|
||||
});
|
||||
document.querySelectorAll("[data-loc-year]").forEach(elm => {
|
||||
elm.innerHTML = elm.innerHTML.replace("|YEAR|", elm.getAttribute("data-loc-year"));
|
||||
});
|
||||
}
|
||||
|
||||
function setActiveLanguage(lang) {
|
||||
@ -212,7 +223,7 @@ function setActiveLanguage(lang) {
|
||||
document.querySelector("[data-lang=" + lang + "]").classList.add("active");
|
||||
|
||||
window.dictPromise = new Promise(resolve => {
|
||||
const webui_lang = ["en", "ru", "fr", "de", "zh", "es"].indexOf(lang) == -1 ? "en" : lang;
|
||||
const webui_lang = ["en", "ru", "fr", "de", "zh", "es", "uk"].indexOf(lang) == -1 ? "en" : lang;
|
||||
let script = document.getElementById("translations");
|
||||
if (script) document.documentElement.removeChild(script);
|
||||
|
||||
@ -497,6 +508,9 @@ function fetchItemList() {
|
||||
uniqueLevelCaps = items;
|
||||
} else if (type == "Syndicates") {
|
||||
items.forEach(item => {
|
||||
if (item.uniqueName === "ConclaveSyndicate") {
|
||||
return;
|
||||
}
|
||||
if (item.uniqueName.startsWith("RadioLegion")) {
|
||||
item.name += " (" + item.uniqueName + ")";
|
||||
}
|
||||
@ -591,6 +605,8 @@ function fetchItemList() {
|
||||
}
|
||||
fetchItemList();
|
||||
|
||||
const accountCheats = document.querySelectorAll("#account-cheats input[id]");
|
||||
|
||||
// Assumes that caller revalidates authz
|
||||
function updateInventory() {
|
||||
const req = $.get("/api/inventory.php?" + window.authz + "&xpBasedLevelCapDisabled=1");
|
||||
@ -1291,7 +1307,10 @@ function updateInventory() {
|
||||
abilityOverrideFormLabel.setAttribute("data-loc", "abilityOverride_label");
|
||||
abilityOverrideFormLabel.innerHTML = loc("abilityOverride_label");
|
||||
abilityOverrideFormLabel.classList = "form-label";
|
||||
abilityOverrideFormLabel.setAttribute("for", "abilityOverride-ability");
|
||||
abilityOverrideFormLabel.setAttribute(
|
||||
"for",
|
||||
`abilityOverride-ability-config-${i}`
|
||||
);
|
||||
abilityOverrideForm.appendChild(abilityOverrideFormLabel);
|
||||
|
||||
const abilityOverrideInputGroup = document.createElement("div");
|
||||
@ -1299,7 +1318,7 @@ function updateInventory() {
|
||||
abilityOverrideForm.appendChild(abilityOverrideInputGroup);
|
||||
|
||||
const abilityOverrideInput = document.createElement("input");
|
||||
abilityOverrideInput.id = "abilityOverride-ability";
|
||||
abilityOverrideInput.id = `abilityOverride-ability-config-${i}`;
|
||||
abilityOverrideInput.classList = "form-control";
|
||||
abilityOverrideInput.setAttribute("list", "datalist-Abilities");
|
||||
if (config.AbilityOverride) {
|
||||
@ -1319,7 +1338,7 @@ function updateInventory() {
|
||||
abilityOverrideInputGroup.appendChild(abilityOverrideOnSlot);
|
||||
|
||||
const abilityOverrideSecondInput = document.createElement("input");
|
||||
abilityOverrideSecondInput.id = "abilityOverride-ability-index";
|
||||
abilityOverrideSecondInput.id = `abilityOverride-ability-index-config-${i}`;
|
||||
abilityOverrideSecondInput.classList = "form-control";
|
||||
abilityOverrideSecondInput.setAttribute("type", "number");
|
||||
abilityOverrideSecondInput.setAttribute("min", "0");
|
||||
@ -1456,6 +1475,10 @@ function updateInventory() {
|
||||
}
|
||||
document.getElementById("Boosters-list").appendChild(tr);
|
||||
});
|
||||
|
||||
for (const elm of accountCheats) {
|
||||
elm.checked = !!data[elm.id];
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
@ -2092,6 +2115,8 @@ function doAcquireModMax() {
|
||||
alert("doAcquireModMax: " + uniqueName);
|
||||
}
|
||||
|
||||
// Cheats route
|
||||
|
||||
const uiConfigs = [...$(".config-form input[id], .config-form select[id]")].map(x => x.id);
|
||||
|
||||
for (const id of uiConfigs) {
|
||||
@ -2176,8 +2201,6 @@ function doSaveConfigStringArray(id) {
|
||||
});
|
||||
}
|
||||
|
||||
// Cheats route
|
||||
|
||||
single.getRoute("/webui/cheats").on("beforeload", function () {
|
||||
let interval;
|
||||
interval = setInterval(() => {
|
||||
@ -2289,6 +2312,23 @@ function doIntrinsicsUnlockAll() {
|
||||
});
|
||||
}
|
||||
|
||||
document.querySelectorAll("#account-cheats input[type=checkbox]").forEach(elm => {
|
||||
elm.onchange = function () {
|
||||
revalidateAuthz().then(() => {
|
||||
$.post({
|
||||
url: "/custom/setAccountCheat?" + window.authz /*+ "&wsid=" + wsid*/,
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify({
|
||||
key: elm.id,
|
||||
value: elm.checked
|
||||
})
|
||||
});
|
||||
});
|
||||
};
|
||||
});
|
||||
|
||||
// Mods route
|
||||
|
||||
function doAddAllMods() {
|
||||
let modsAll = new Set();
|
||||
for (const child of document.getElementById("datalist-mods").children) {
|
||||
@ -3087,8 +3127,8 @@ function handleAbilityOverride(event, configIndex) {
|
||||
event.preventDefault();
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
const action = event.submitter.value;
|
||||
const Ability = getKey(document.getElementById("abilityOverride-ability"));
|
||||
const Index = document.getElementById("abilityOverride-ability-index").value;
|
||||
const Ability = getKey(document.getElementById(`abilityOverride-ability-config-${configIndex}`));
|
||||
const Index = document.getElementById(`abilityOverride-ability-index-config-${configIndex}`).value;
|
||||
revalidateAuthz().then(() => {
|
||||
$.post({
|
||||
url: "/custom/abilityOverride?" + window.authz,
|
||||
|
||||
@ -11,7 +11,8 @@
|
||||
margin-left: 7rem;
|
||||
}
|
||||
|
||||
body.logged-in:has([data-lang="de"].active) #main-content {
|
||||
body.logged-in:has([data-lang="de"].active) #main-content,
|
||||
body.logged-in:has([data-lang="uk"].active) #main-content {
|
||||
margin-left: 8rem;
|
||||
}
|
||||
|
||||
@ -28,9 +29,12 @@ body:not(.logged-in) .user-dropdown {
|
||||
display: none;
|
||||
}
|
||||
|
||||
td.text-end > a > svg {
|
||||
/* font awesome icons */
|
||||
svg {
|
||||
fill: currentColor;
|
||||
height: 1em;
|
||||
}
|
||||
td.text-end > a > svg {
|
||||
margin-left: 0.5em;
|
||||
margin-bottom: 4px; /* to centre the icon */
|
||||
}
|
||||
|
||||
@ -246,6 +246,20 @@ dict = {
|
||||
worldState_baroTennoConRelay: `Baros TennoCon Relais`,
|
||||
worldState_starDays: `Sternen-Tage`,
|
||||
worldState_galleonOfGhouls: `Galeone der Ghule`,
|
||||
worldState_ghoulEmergence: `Ghul Ausrottung`,
|
||||
worldState_plagueStar: `Plagenstern`,
|
||||
worldState_dogDays: `Hitzefrei`,
|
||||
worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`,
|
||||
worldState_wolfHunt: `Wolfsjagd (2025)`,
|
||||
worldState_longShadow: `Lange Schatten`,
|
||||
worldState_hallowedFlame: `Geweihte Flamme`,
|
||||
worldState_hallowedNightmares: `Geweihte Albträume`,
|
||||
worldState_hallowedNightmaresRewards: `[UNTRANSLATED] Hallowed Nightmares Rewards`,
|
||||
worldState_proxyRebellion: `Proxy-Rebellion`,
|
||||
worldState_proxyRebellionRewards: `[UNTRANSLATED] Proxy Rebellion Rewards`,
|
||||
worldState_from_year: `[UNTRANSLATED] from |YEAR|`,
|
||||
worldState_pre_year: `[UNTRANSLATED] pre |YEAR|`,
|
||||
worldState_incompatibleWith: `[UNTRANSLATED] Incompatible with:`,
|
||||
enabled: `Aktiviert`,
|
||||
disabled: `Deaktiviert`,
|
||||
worldState_we1: `Wochenende 1`,
|
||||
|
||||
@ -245,6 +245,20 @@ dict = {
|
||||
worldState_baroTennoConRelay: `Baro's TennoCon Relay`,
|
||||
worldState_starDays: `Star Days`,
|
||||
worldState_galleonOfGhouls: `Galleon of Ghouls`,
|
||||
worldState_ghoulEmergence: `Ghoul Purge`,
|
||||
worldState_plagueStar: `Plague Star`,
|
||||
worldState_dogDays: `Dog Days`,
|
||||
worldState_dogDaysRewards: `Dog Days Rewards`,
|
||||
worldState_wolfHunt: `Wolf Hunt (2025)`,
|
||||
worldState_longShadow: `Long Shadow`,
|
||||
worldState_hallowedFlame: `Hallowed Flame`,
|
||||
worldState_hallowedNightmares: `Hallowed Nightmares`,
|
||||
worldState_hallowedNightmaresRewards: `Hallowed Nightmares Rewards`,
|
||||
worldState_proxyRebellion: `Proxy Rebellion`,
|
||||
worldState_proxyRebellionRewards: `Proxy Rebellion Rewards`,
|
||||
worldState_from_year: `from |YEAR|`,
|
||||
worldState_pre_year: `pre |YEAR|`,
|
||||
worldState_incompatibleWith: `Incompatible with:`,
|
||||
enabled: `Enabled`,
|
||||
disabled: `Disabled`,
|
||||
worldState_we1: `Weekend 1`,
|
||||
|
||||
@ -36,7 +36,7 @@ dict = {
|
||||
code_succRemoved: `Eliminado exitosamente.`,
|
||||
code_buffsNumber: `Cantidad de mejoras`,
|
||||
code_cursesNumber: `Cantidad de maldiciones`,
|
||||
code_rerollsNumber: `Cantidad de reintentos`,
|
||||
code_rerollsNumber: `Cantidad de rerolls`,
|
||||
code_viewStats: `Ver estadísticas`,
|
||||
code_rank: `Rango`,
|
||||
code_rankUp: `Subir de rango`,
|
||||
@ -121,11 +121,11 @@ dict = {
|
||||
currency_PrimeTokens: `Aya Real`,
|
||||
currency_owned: `Tienes |COUNT|.`,
|
||||
|
||||
detailedView_archonShardsLabel: `Ranuras de Fragmento de Archón`,
|
||||
detailedView_archonShardsLabel: `Ranuras de Fragmento de Arconte`,
|
||||
detailedView_archonShardsDescription: `Puedes usar estas ranuras ilimitadas para aplicar una amplia variedad de mejoras`,
|
||||
detailedView_archonShardsDescription2: `Ten en cuenta que cada fragmento de archón tarda un poco en aplicarse al cargar`,
|
||||
detailedView_valenceBonusLabel: `Bônus de Valência`,
|
||||
detailedView_valenceBonusDescription: `Puedes establecer o quitar el bono de valencia de tu arma.`,
|
||||
detailedView_archonShardsDescription2: `Ten en cuenta que cada fragmento de arconte tarda un poco en aplicarse al cargar`,
|
||||
detailedView_valenceBonusLabel: `Bonus de Valéncia`,
|
||||
detailedView_valenceBonusDescription: `Puedes establecer o quitar el bonus de valencia de tu arma.`,
|
||||
detailedView_modularPartsLabel: `Cambiar partes modulares`,
|
||||
detailedView_suitInvigorationLabel: `Vigorización de Warframe`,
|
||||
detailedView_loadoutLabel: `Equipamientos`,
|
||||
@ -156,8 +156,8 @@ dict = {
|
||||
invigorations_defensiveLabel: `Mejora Defensiva`,
|
||||
invigorations_expiryLabel: `Caducidad de Mejoras (opcional)`,
|
||||
|
||||
abilityOverride_label: `[UNTRANSLATED] Ability Override`,
|
||||
abilityOverride_onSlot: `[UNTRANSLATED] on slot`,
|
||||
abilityOverride_label: `Intercambio de Habilidad`,
|
||||
abilityOverride_onSlot: `en el espacio`,
|
||||
|
||||
mods_addRiven: `Agregar Agrietado`,
|
||||
mods_fingerprint: `Huella digital`,
|
||||
@ -180,18 +180,18 @@ dict = {
|
||||
cheats_infiniteEndo: `Endo infinito`,
|
||||
cheats_infiniteRegalAya: `Aya Real infinita`,
|
||||
cheats_infiniteHelminthMaterials: `Materiales Helminto infinitos`,
|
||||
cheats_claimingBlueprintRefundsIngredients: `Reclamar ingredientes devueltos por planos`,
|
||||
cheats_dontSubtractPurchaseCreditCost: `No restar costo en créditos de la compra`,
|
||||
cheats_dontSubtractPurchasePlatinumCost: `No restar costo en platino de la compra`,
|
||||
cheats_dontSubtractPurchaseItemCost: `No restar costo de ítem en la compra`,
|
||||
cheats_dontSubtractPurchaseStandingCost: `No restar costo en reputación de la compra`,
|
||||
cheats_claimingBlueprintRefundsIngredients: `Reclamar planos devuelve los ingredientes`,
|
||||
cheats_dontSubtractPurchaseCreditCost: `No restar costo en créditos al comprar`,
|
||||
cheats_dontSubtractPurchasePlatinumCost: `No restar costo en platino al comprar`,
|
||||
cheats_dontSubtractPurchaseItemCost: `No restar costo de ítem al comprar`,
|
||||
cheats_dontSubtractPurchaseStandingCost: `No restar costo en reputación al comprar`,
|
||||
cheats_dontSubtractVoidTraces: `No descontar vestigios del Vacío`,
|
||||
cheats_dontSubtractConsumables: `No restar consumibles`,
|
||||
cheats_unlockAllShipFeatures: `Desbloquear todas las funciones de nave`,
|
||||
cheats_unlockAllShipDecorations: `Desbloquear todas las decoraciones de nave`,
|
||||
cheats_unlockAllFlavourItems: `Desbloquear todos los <abbr title="Conjuntos de animaciones, glifos, paletas, etc.">ítems estéticos</abbr>`,
|
||||
cheats_unlockAllSkins: `Desbloquear todas las apariencias`,
|
||||
cheats_unlockAllCapturaScenes: `Desbloquear todas las escenas Captura`,
|
||||
cheats_unlockAllSkins: `Desbloquear todas las skins`,
|
||||
cheats_unlockAllCapturaScenes: `Desbloquear todas las escenas de Captura`,
|
||||
cheats_unlockAllDecoRecipes: `Desbloquear todas las recetas decorativas del dojo`,
|
||||
cheats_universalPolarityEverywhere: `Polaridad universal en todas partes`,
|
||||
cheats_unlockDoubleCapacityPotatoesEverywhere: `Patatas en todas partes`,
|
||||
@ -208,7 +208,7 @@ dict = {
|
||||
cheats_baroAlwaysAvailable: `Baro siempre disponible`,
|
||||
cheats_baroFullyStocked: `Baro con stock completo`,
|
||||
cheats_syndicateMissionsRepeatable: `Misiones de sindicato rejugables`,
|
||||
cheats_unlockAllProfitTakerStages: `Deslobquea todas las etapas del Roba-ganancias`,
|
||||
cheats_unlockAllProfitTakerStages: `Desbloquea todas las etapas del Roba-ganancias`,
|
||||
cheats_instantFinishRivenChallenge: `Terminar desafío de agrietado inmediatamente`,
|
||||
cheats_instantResourceExtractorDrones: `Drones de extracción de recursos instantáneos`,
|
||||
cheats_noResourceExtractorDronesDamage: `Sin daño a los drones extractores de recursos`,
|
||||
@ -242,11 +242,25 @@ dict = {
|
||||
worldState_creditBoost: `Potenciador de Créditos`,
|
||||
worldState_affinityBoost: `Potenciador de Afinidad`,
|
||||
worldState_resourceBoost: `Potenciador de Recursos`,
|
||||
worldState_tennoLiveRelay: `[UNTRANSLATED] TennoLive Relay`,
|
||||
worldState_baroTennoConRelay: `[UNTRANSLATED] Baro's TennoCon Relay`,
|
||||
worldState_tennoLiveRelay: `Repetidor de TennoLive`,
|
||||
worldState_baroTennoConRelay: `Repetidor de Baro de la TennoCon`,
|
||||
worldState_starDays: `Días estelares`,
|
||||
worldState_galleonOfGhouls: `Galeón de Gules`,
|
||||
enabled: `[UNTRANSLATED] Enabled`,
|
||||
worldState_ghoulEmergence: `Purga de Gules`,
|
||||
worldState_plagueStar: `Estrella Infestada`,
|
||||
worldState_dogDays: `Canícula`,
|
||||
worldState_dogDaysRewards: `Recompensas de Canícula`,
|
||||
worldState_wolfHunt: `Cacería del Lobo (2025)`,
|
||||
worldState_longShadow: `Sombra Prolongada`,
|
||||
worldState_hallowedFlame: `Llama Sagrada`,
|
||||
worldState_hallowedNightmares: `Pesadillas Sagradas`,
|
||||
worldState_hallowedNightmaresRewards: `Recompensas de Pesadillas Sagradas`,
|
||||
worldState_proxyRebellion: `Rebelión Proxy`,
|
||||
worldState_proxyRebellionRewards: `Recompensas de Rebelión Proxy`,
|
||||
worldState_from_year: `de |YEAR|`,
|
||||
worldState_pre_year: `antes de |YEAR|`,
|
||||
worldState_incompatibleWith: `No compatible con:`,
|
||||
enabled: `Activado`,
|
||||
disabled: `Desactivado`,
|
||||
worldState_we1: `Semana 1`,
|
||||
worldState_we2: `Semana 2`,
|
||||
@ -304,7 +318,7 @@ dict = {
|
||||
upgrade_WarframeBlastProc: `+|VAL| de escudos al matar con daño de explosión`,
|
||||
upgrade_WarframeCastingSpeed: `+|VAL|% de velocidad de lanzamiento de habilidades`,
|
||||
upgrade_WarframeCorrosiveDamageBoost: `+|VAL|% de daño de habilidades a enemigos con estado corrosivo`,
|
||||
upgrade_WarframeCorrosiveStack: `Aumenta los acumuladores máximos de estado corrosivo en +|VAL|`,
|
||||
upgrade_WarframeCorrosiveStack: `Aumenta los stacks máximos de estado corrosivo en +|VAL|`,
|
||||
upgrade_WarframeCritDamageBoost: `+|VAL|% de daño crítico cuerpo a cuerpo (se duplica con más de 500 de energía)`,
|
||||
upgrade_WarframeElectricDamage: `+|VAL1|% de daño eléctrico en armas primarias (+|VAL2|% por fragmento adicional)`,
|
||||
upgrade_WarframeElectricDamageBoost: `+|VAL|% de daño de habilidades a enemigos con estado eléctrico`,
|
||||
@ -328,30 +342,30 @@ dict = {
|
||||
upgrade_AvatarLootRadar: `+7m de radar de botín`,
|
||||
upgrade_WeaponAmmoMax: `+15% de munición máxima`,
|
||||
upgrade_EnemyArmorReductionAura: `-3% de armadura enemiga`,
|
||||
upgrade_OnExecutionAmmo: `Recarga al 100% el cargador primario y secundario tras ejecución (Misericordia)`,
|
||||
upgrade_OnExecutionHealthDrop: `100% de probabilidad de soltar un orbe de salud tras ejecución (Misericordia)`,
|
||||
upgrade_OnExecutionEnergyDrop: `50% de probabilidad de soltar un orbe de energía tras ejecución (Misericordia)`,
|
||||
upgrade_OnExecutionAmmo: `Recarga al 100% el cargador primario y secundario tras ejecución (Mercy)`,
|
||||
upgrade_OnExecutionHealthDrop: `100% de probabilidad de soltar un orbe de salud tras ejecución (Mercy)`,
|
||||
upgrade_OnExecutionEnergyDrop: `50% de probabilidad de soltar un orbe de energía tras ejecución (Mercy)`,
|
||||
upgrade_OnFailHackReset: `+50% de probabilidad de reintento al fallar un hackeo`,
|
||||
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_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 (Mercy)`,
|
||||
upgrade_AvatarTimeLimitIncrease: `+8s para 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 (Mercy)`,
|
||||
upgrade_OnHackLockers: `Desbloquea 5 casilleros en un radio de 20m tras hackear`,
|
||||
upgrade_OnExecutionBlind: `Ciega a los enemigos en un radio de 18m tras una ejecución`,
|
||||
upgrade_OnExecutionDrainPower: `La próxima habilidad usada gana +50% de fuerza al realizar un remate (Mercy)`,
|
||||
upgrade_OnExecutionBlind: `Ciega a los enemigos en un radio de 18m tras una ejecución (Mercy)`,
|
||||
upgrade_OnExecutionDrainPower: `La próxima habilidad usada gana +50% de fuerza al realizar tras una ejecución (Mercy)`,
|
||||
upgrade_OnHackSprintSpeed: `+75% de velocidad de carrera durante 15s después de hackear`,
|
||||
upgrade_SwiftExecute: `+50% de velocidad al ejecutar remates (Mercy)`,
|
||||
upgrade_OnHackInvis: `Invisible durante 15 segundos después de hackear`,
|
||||
|
||||
damageType_Electricity: `Eletricidade`,
|
||||
damageType_Fire: `Ígneo`,
|
||||
damageType_Freeze: `Glacial`,
|
||||
damageType_Impact: `Colisivo`,
|
||||
damageType_Electricity: `Eletricidad`,
|
||||
damageType_Fire: `Calor`,
|
||||
damageType_Freeze: `Frío`,
|
||||
damageType_Impact: `Impacto`,
|
||||
damageType_Magnetic: `Magnético`,
|
||||
damageType_Poison: `Tóxico`,
|
||||
damageType_Radiation: `Radioativo`,
|
||||
damageType_Radiation: `Radiactivo`,
|
||||
|
||||
theme_dark: `Tema Oscuro`,
|
||||
theme_light: `Tema Claro`,
|
||||
|
||||
@ -156,8 +156,8 @@ dict = {
|
||||
invigorations_defensiveLabel: `Amélioration défensive`,
|
||||
invigorations_expiryLabel: `Expiration de l'invigoration (optionnel)`,
|
||||
|
||||
abilityOverride_label: `[UNTRANSLATED] Ability Override`,
|
||||
abilityOverride_onSlot: `[UNTRANSLATED] on slot`,
|
||||
abilityOverride_label: `Remplacement de pouvoir`,
|
||||
abilityOverride_onSlot: `Sur l'emplacement`,
|
||||
|
||||
mods_addRiven: `Ajouter un riven`,
|
||||
mods_fingerprint: `Empreinte`,
|
||||
@ -242,11 +242,25 @@ dict = {
|
||||
worldState_creditBoost: `Booster de Crédit`,
|
||||
worldState_affinityBoost: `Booster d'Affinité`,
|
||||
worldState_resourceBoost: `Booster de Ressource`,
|
||||
worldState_tennoLiveRelay: `[UNTRANSLATED] TennoLive Relay`,
|
||||
worldState_baroTennoConRelay: `[UNTRANSLATED] Baro's TennoCon Relay`,
|
||||
worldState_tennoLiveRelay: `Relais TennoLive`,
|
||||
worldState_baroTennoConRelay: `Relais Baro TennoCon`,
|
||||
worldState_starDays: `Jours Stellaires`,
|
||||
worldState_galleonOfGhouls: `Galion des Goules`,
|
||||
enabled: `[UNTRANSLATED] Enabled`,
|
||||
worldState_ghoulEmergence: `Purge des Goules`,
|
||||
worldState_plagueStar: `Fléau Céleste`,
|
||||
worldState_dogDays: `Bataille d'Eau`,
|
||||
worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`,
|
||||
worldState_wolfHunt: `Chasse au Loup (2025)`,
|
||||
worldState_longShadow: `La Propagation des Ombres`,
|
||||
worldState_hallowedFlame: `Flamme Hantée`,
|
||||
worldState_hallowedNightmares: `Cauchemars Hantés`,
|
||||
worldState_hallowedNightmaresRewards: `[UNTRANSLATED] Hallowed Nightmares Rewards`,
|
||||
worldState_proxyRebellion: `Rébellion Proxy`,
|
||||
worldState_proxyRebellionRewards: `[UNTRANSLATED] Proxy Rebellion Rewards`,
|
||||
worldState_from_year: `[UNTRANSLATED] from |YEAR|`,
|
||||
worldState_pre_year: `[UNTRANSLATED] pre |YEAR|`,
|
||||
worldState_incompatibleWith: `[UNTRANSLATED] Incompatible with:`,
|
||||
enabled: `Activé`,
|
||||
disabled: `Désactivé`,
|
||||
worldState_we1: `Weekend 1`,
|
||||
worldState_we2: `Weekend 2`,
|
||||
|
||||
@ -1,14 +1,14 @@
|
||||
// Russian translation by AMelonInsideLemon
|
||||
// Russian translation by AMelonInsideLemon, LoseFace
|
||||
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: `Примечание: Чтобы увидеть изменения в игре, вам нужно повторно синхронизировать свой инвентарь, например, используя команду /sync загрузчика, посетив Додзё/Реле или перезагрузив игру.`,
|
||||
general_addButton: `Добавить`,
|
||||
general_setButton: `Установить`,
|
||||
general_none: `Отсутствует`,
|
||||
general_bulkActions: `Массовые действия`,
|
||||
general_loading: `[UNTRANSLATED] Loading...`,
|
||||
general_loading: `Загрузка...`,
|
||||
|
||||
code_loginFail: `[UNTRANSLATED] Login failed. Double-check the email and password.`,
|
||||
code_regFail: `[UNTRANSLATED] Registration failed. Account already exists?`,
|
||||
code_loginFail: `Не удалось войти. Проверьте адрес электронной почты и пароль.`,
|
||||
code_regFail: `Не удалось зарегистрироваться. Учетная запись уже существует?`,
|
||||
code_changeNameConfirm: `Какое имя вы хотите установить для своей учетной записи?`,
|
||||
code_deleteAccountConfirm: `Вы уверены, что хотите удалить аккаунт |DISPLAYNAME| (|EMAIL|)? Это действие нельзя отменить.`,
|
||||
code_archgun: `Арч-Пушка`,
|
||||
@ -34,9 +34,9 @@ dict = {
|
||||
code_noEquipmentToRankUp: `Нет снаряжения для повышения ранга.`,
|
||||
code_succAdded: `Успешно добавлено.`,
|
||||
code_succRemoved: `Успешно удалено.`,
|
||||
code_buffsNumber: `Количество усилений`,
|
||||
code_cursesNumber: `Количество проклятий`,
|
||||
code_rerollsNumber: `Количество циклов`,
|
||||
code_buffsNumber: `Количество позитивных эффектов`,
|
||||
code_cursesNumber: `Количество негативных эффектов`,
|
||||
code_rerollsNumber: `Количество рероллов`,
|
||||
code_viewStats: `Просмотр характеристики`,
|
||||
code_rank: `Ранг`,
|
||||
code_rankUp: `Повысить Ранг`,
|
||||
@ -46,14 +46,14 @@ dict = {
|
||||
code_focusUnlocked: `Разблокировано |COUNT| новых школ фокуса! Для отображения изменений в игре потребуется обновление инвентаря. Посещение навигации — самый простой способ этого добиться.`,
|
||||
code_addModsConfirm: `Вы уверены, что хотите добавить |COUNT| модов на ваш аккаунт?`,
|
||||
code_succImport: `Успешно импортировано.`,
|
||||
code_succRelog: `[UNTRANSLATED] Done. Please note that you'll need to relog to see a difference in-game.`,
|
||||
code_nothingToDo: `[UNTRANSLATED] Done. There was nothing to do.`,
|
||||
code_succRelog: `Готово. Обратите внимание, что вам нужно будет перезайти, чтобы увидеть изменения в игре.`,
|
||||
code_nothingToDo: `Готово. Нечего делать.`,
|
||||
code_gild: `Улучшить`,
|
||||
code_moa: `МОА`,
|
||||
code_zanuka: `Гончая`,
|
||||
code_stage: `Этап`,
|
||||
code_complete: `Завершить`,
|
||||
code_nextStage: `Cледующий этап`,
|
||||
code_nextStage: `Следующий этап`,
|
||||
code_prevStage: `Предыдущий этап`,
|
||||
code_reset: `Сбросить`,
|
||||
code_setInactive: `Сделать квест неактивным`,
|
||||
@ -63,7 +63,7 @@ dict = {
|
||||
code_mature: `Подготовить к сражениям`,
|
||||
code_unmature: `Регрессия генетического старения`,
|
||||
code_succChange: `Успешно изменено.`,
|
||||
code_requiredInvigorationUpgrade: `[UNTRANSLATED] You must select both an offensive & defensive upgrade.`,
|
||||
code_requiredInvigorationUpgrade: `Вы должны выбрать как атакующее, так и вспомогательное улучшение.`,
|
||||
login_description: `Войдите, используя учетные данные OpenWF (те же, что и в игре при подключении к этому серверу).`,
|
||||
login_emailLabel: `Адрес электронной почты`,
|
||||
login_passwordLabel: `Пароль`,
|
||||
@ -93,14 +93,14 @@ dict = {
|
||||
inventory_moaPets: `МОА`,
|
||||
inventory_kubrowPets: `Звери`,
|
||||
inventory_evolutionProgress: `Прогресс эволюции Инкарнонов`,
|
||||
inventory_Boosters: `[UNTRANSLATED] Boosters`,
|
||||
inventory_Boosters: `Бустеры`,
|
||||
inventory_bulkAddSuits: `Добавить отсутствующие варфреймы`,
|
||||
inventory_bulkAddWeapons: `Добавить отсутствующее оружие`,
|
||||
inventory_bulkAddSpaceSuits: `Добавить отсутствующие арчвинги`,
|
||||
inventory_bulkAddSpaceWeapons: `Добавить отсутствующее оружие арчвингов`,
|
||||
inventory_bulkAddSentinels: `Добавить отсутствующих стражей`,
|
||||
inventory_bulkAddSentinelWeapons: `Добавить отсутствующее оружие стражей`,
|
||||
inventory_bulkAddEvolutionProgress: `Добавить отсуствующий прогресс эволюции Инкарнонов`,
|
||||
inventory_bulkAddEvolutionProgress: `Добавить отсутствующий прогресс эволюции Инкарнонов`,
|
||||
inventory_bulkRankUpSuits: `Максимальный ранг всех варфреймов`,
|
||||
inventory_bulkRankUpWeapons: `Максимальный ранг всего оружия`,
|
||||
inventory_bulkRankUpSpaceSuits: `Максимальный ранг всех арчвингов`,
|
||||
@ -108,7 +108,7 @@ dict = {
|
||||
inventory_bulkRankUpSentinels: `Максимальный ранг всех стражей`,
|
||||
inventory_bulkRankUpSentinelWeapons: `Максимальный ранг всего оружия стражей`,
|
||||
inventory_bulkRankUpEvolutionProgress: `Максимальный ранг всех эволюций Инкарнонов`,
|
||||
inventory_maxPlexus: `[UNTRANSLATED] Max Rank Plexus`,
|
||||
inventory_maxPlexus: `Максимальный ранг Плексуса`,
|
||||
|
||||
quests_list: `Квесты`,
|
||||
quests_completeAll: `Завершить все квесты`,
|
||||
@ -123,38 +123,38 @@ dict = {
|
||||
|
||||
detailedView_archonShardsLabel: `Ячейки осколков архонта`,
|
||||
detailedView_archonShardsDescription: `Вы можете использовать эти неограниченные ячейки для установки множества улучшений.`,
|
||||
detailedView_archonShardsDescription2: `Обратите внимание: каждый фрагмент архонта применяется с задержкой при загрузке.`,
|
||||
detailedView_archonShardsDescription2: `Обратите внимание: каждый осколок архонта применяется с задержкой при загрузке.`,
|
||||
detailedView_valenceBonusLabel: `Бонус Валентности`,
|
||||
detailedView_valenceBonusDescription: `Вы можете установить или убрать бонус валентности с вашего оружия.`,
|
||||
detailedView_modularPartsLabel: `Изменить Модульные Части`,
|
||||
detailedView_suitInvigorationLabel: `[UNTRANSLATED] Warframe Invigoration`,
|
||||
detailedView_suitInvigorationLabel: `Воодушевление Варфрейма`,
|
||||
detailedView_loadoutLabel: `Конфигурации`,
|
||||
|
||||
invigorations_offensive_AbilityStrength: `[UNTRANSLATED] +200% Ability Strength`,
|
||||
invigorations_offensive_AbilityRange: `[UNTRANSLATED] +100% Ability Range`,
|
||||
invigorations_offensive_AbilityDuration: `[UNTRANSLATED] +100% Ability Duration`,
|
||||
invigorations_offensive_MeleeDamage: `[UNTRANSLATED] +250% Melee Damage`,
|
||||
invigorations_offensive_PrimaryDamage: `[UNTRANSLATED] +250% Primary Damage`,
|
||||
invigorations_offensive_SecondaryDamage: `[UNTRANSLATED] +250% Secondary Damage`,
|
||||
invigorations_offensive_PrimaryCritChance: `[UNTRANSLATED] +200% Primary Critical Chance`,
|
||||
invigorations_offensive_SecondaryCritChance: `[UNTRANSLATED] +200% Secondary Critical Chance`,
|
||||
invigorations_offensive_MeleeCritChance: `[UNTRANSLATED] +200% Melee Critical Chance`,
|
||||
invigorations_offensive_AbilityStrength: `+200% Сила Способностей`,
|
||||
invigorations_offensive_AbilityRange: `+100% Радиус Способностей`,
|
||||
invigorations_offensive_AbilityDuration: `+100% Длительность Способностей`,
|
||||
invigorations_offensive_MeleeDamage: `+250% Урон Ближнего Боя`,
|
||||
invigorations_offensive_PrimaryDamage: `+250% Урон Основного Оружия`,
|
||||
invigorations_offensive_SecondaryDamage: `+250% Урон Вторичного Оружия`,
|
||||
invigorations_offensive_PrimaryCritChance: `+200% Шанс Критического Урона Основного Оружия`,
|
||||
invigorations_offensive_SecondaryCritChance: `+200% Шанс Критического Урона Вторичного Оружия`,
|
||||
invigorations_offensive_MeleeCritChance: `+200% Шанс Критического Урона Ближнего Боя`,
|
||||
|
||||
invigorations_utility_AbilityEfficiency: `[UNTRANSLATED] +75% Ability Efficiency`,
|
||||
invigorations_utility_SprintSpeed: `[UNTRANSLATED] +75% Sprint Speed`,
|
||||
invigorations_utility_ParkourVelocity: `[UNTRANSLATED] +75% Parkour Velocity`,
|
||||
invigorations_utility_HealthMax: `[UNTRANSLATED] +1000 Health`,
|
||||
invigorations_utility_EnergyMax: `[UNTRANSLATED] +200% Energy Max`,
|
||||
invigorations_utility_StatusImmune: `[UNTRANSLATED] Immune to Status Effects`,
|
||||
invigorations_utility_ReloadSpeed: `[UNTRANSLATED] +75% Reload Speed`,
|
||||
invigorations_utility_HealthRegen: `[UNTRANSLATED] +25 Health Regen/s`,
|
||||
invigorations_utility_ArmorMax: `[UNTRANSLATED] +1000 Armor`,
|
||||
invigorations_utility_Jumps: `[UNTRANSLATED] +5 Jump Resets`,
|
||||
invigorations_utility_EnergyRegen: `[UNTRANSLATED] +2 Energy Regen/s`,
|
||||
invigorations_utility_AbilityEfficiency: `+75% Энергоэффективность Способностей`,
|
||||
invigorations_utility_SprintSpeed: `+75% Скорость Бега`,
|
||||
invigorations_utility_ParkourVelocity: `+75% Скорость Паркура`,
|
||||
invigorations_utility_HealthMax: `+1000 Здоровья`,
|
||||
invigorations_utility_EnergyMax: `+200% Максимум Энергии`,
|
||||
invigorations_utility_StatusImmune: `Иммунитет к Эффектам Статуса`,
|
||||
invigorations_utility_ReloadSpeed: `+75% Скорость Перезарядки`,
|
||||
invigorations_utility_HealthRegen: `+25 Здоровья в секунду`,
|
||||
invigorations_utility_ArmorMax: `+1000 Брони`,
|
||||
invigorations_utility_Jumps: `+5 Сбросов Прыжков`,
|
||||
invigorations_utility_EnergyRegen: `+2 Энергии в секунду`,
|
||||
|
||||
invigorations_offensiveLabel: `[UNTRANSLATED] Offensive Upgrade`,
|
||||
invigorations_defensiveLabel: `[UNTRANSLATED] Defensive Upgrade`,
|
||||
invigorations_expiryLabel: `[UNTRANSLATED] Upgrades Expiry (optional)`,
|
||||
invigorations_offensiveLabel: `Атакующее Улучшение`,
|
||||
invigorations_defensiveLabel: `Вспомогательное Улучшение`,
|
||||
invigorations_expiryLabel: `Срок действия Воодушевления (необязательно)`,
|
||||
|
||||
abilityOverride_label: `Переопределение способности`,
|
||||
abilityOverride_onSlot: `в ячейке`,
|
||||
@ -164,7 +164,7 @@ dict = {
|
||||
mods_fingerprintHelp: `Нужна помощь с отпечатком?`,
|
||||
mods_rivens: `Моды Разлома`,
|
||||
mods_mods: `Моды`,
|
||||
mods_addMax: `[UNTRANSLATED] Add Maxed`,
|
||||
mods_addMax: `Добавить максимально улучшенный`,
|
||||
mods_addMissingUnrankedMods: `Добавить недостающие моды без ранга`,
|
||||
mods_removeUnranked: `Удалить моды без ранга`,
|
||||
mods_addMissingMaxRankMods: `Добавить недостающие моды максимального ранга`,
|
||||
@ -174,19 +174,19 @@ dict = {
|
||||
cheats_skipAllDialogue: `Пропустить все диалоги`,
|
||||
cheats_unlockAllScans: `Разблокировать все сканирования`,
|
||||
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_unlockAllMissions_ok: `Успех. Пожалуйста, обратите внимание, что вам нужно будет войти в Додзё/Реле или перезайти, чтобы клиент обновил звездную карту.`,
|
||||
cheats_infiniteCredits: `Бесконечные кредиты`,
|
||||
cheats_infinitePlatinum: `Бесконечная платина`,
|
||||
cheats_infiniteEndo: `Бесконечное эндо`,
|
||||
cheats_infiniteRegalAya: `Бесконечная Королевская Айя`,
|
||||
cheats_infiniteHelminthMaterials: `Бесконечные Выделения Гельминта`,
|
||||
cheats_claimingBlueprintRefundsIngredients: `[UNTRANSLATED] Claiming Blueprint Refunds Ingredients`,
|
||||
cheats_dontSubtractPurchaseCreditCost: `[UNTRANSLATED] Don't Subtract Purchase Credit Cost`,
|
||||
cheats_dontSubtractPurchasePlatinumCost: `[UNTRANSLATED] Don't Subtract Purchase Platinum Cost`,
|
||||
cheats_dontSubtractPurchaseItemCost: `[UNTRANSLATED] Don't Subtract Purchase Item Cost`,
|
||||
cheats_dontSubtractPurchaseStandingCost: `[UNTRANSLATED] Don't Subtract Purchase Standing Cost`,
|
||||
cheats_dontSubtractVoidTraces: `[UNTRANSLATED] Don't Subtract Void Traces`,
|
||||
cheats_dontSubtractConsumables: `Не уменьшать количество расходников`,
|
||||
cheats_infiniteHelminthMaterials: `Бесконечные Секреции Гельминта`,
|
||||
cheats_claimingBlueprintRefundsIngredients: `Возврат ингредиентов чертежей`,
|
||||
cheats_dontSubtractPurchaseCreditCost: `Не вычитать стоимость кредитов при покупке`,
|
||||
cheats_dontSubtractPurchasePlatinumCost: `Не вычитать стоимость платины при покупке`,
|
||||
cheats_dontSubtractPurchaseItemCost: `Не вычитать стоимость предметов при покупке`,
|
||||
cheats_dontSubtractPurchaseStandingCost: `Не вычитать стоимость репутации при покупке`,
|
||||
cheats_dontSubtractVoidTraces: `Не вычитать количество Отголосков Бездны`,
|
||||
cheats_dontSubtractConsumables: `Не вычитать количество расходников`,
|
||||
cheats_unlockAllShipFeatures: `Разблокировать все функции корабля`,
|
||||
cheats_unlockAllShipDecorations: `Разблокировать все украшения корабля`,
|
||||
cheats_unlockAllFlavourItems: `Разблокировать все <abbr title="Наборы анимаций, глифы, палитры и т. д.">уникальные предметы</abbr>`,
|
||||
@ -194,41 +194,41 @@ dict = {
|
||||
cheats_unlockAllCapturaScenes: `Разблокировать все сцены Каптуры`,
|
||||
cheats_unlockAllDecoRecipes: `Разблокировать все рецепты декораций Дoдзё`,
|
||||
cheats_universalPolarityEverywhere: `Универсальная полярность везде`,
|
||||
cheats_unlockDoubleCapacityPotatoesEverywhere: `Катализаторы везде`,
|
||||
cheats_unlockDoubleCapacityPotatoesEverywhere: `Реакторы/Катализаторы орокин везде`,
|
||||
cheats_unlockExilusEverywhere: `Адаптеры Эксилус везде`,
|
||||
cheats_unlockArcanesEverywhere: `Адаптеры для мистификаторов везде`,
|
||||
cheats_noDailyStandingLimits: `Без ежедневных лимитов репутации`,
|
||||
cheats_noDailyFocusLimit: `Без ежедневных лимитов фокуса`,
|
||||
cheats_noArgonCrystalDecay: `Без распада аргоновых кристаллов`,
|
||||
cheats_noMasteryRankUpCooldown: `Повышение ранга мастерства без кулдауна`,
|
||||
cheats_noVendorPurchaseLimits: `Отсутствие лимитов на покупки у вендоров`,
|
||||
cheats_noDeathMarks: `Без меток сметри`,
|
||||
cheats_noVendorPurchaseLimits: `Отсутствие лимитов на покупки у торговцев`,
|
||||
cheats_noDeathMarks: `Без меток смерти`,
|
||||
cheats_noKimCooldowns: `Чаты KIM без кулдауна`,
|
||||
cheats_fullyStockedVendors: `[UNTRANSLATED] Fully Stocked Vendors`,
|
||||
cheats_baroAlwaysAvailable: `[UNTRANSLATED] Baro Always Available`,
|
||||
cheats_baroFullyStocked: `[UNTRANSLATED] Baro Fully Stocked`,
|
||||
cheats_syndicateMissionsRepeatable: `[UNTRANSLATED] Syndicate Missions Repeatable`,
|
||||
cheats_unlockAllProfitTakerStages: `[UNTRANSLATED] Unlock All Profit Taker Stages`,
|
||||
cheats_instantFinishRivenChallenge: `[UNTRANSLATED] Instant Finish Riven Challenge`,
|
||||
cheats_instantResourceExtractorDrones: `Мгновенные Экстракторы Ресурсов`,
|
||||
cheats_fullyStockedVendors: `Полностью укомплектованные торговцы`,
|
||||
cheats_baroAlwaysAvailable: `Баро всегда доступен`,
|
||||
cheats_baroFullyStocked: `Баро полностью укомплектован`,
|
||||
cheats_syndicateMissionsRepeatable: `Повторять миссии синдиката`,
|
||||
cheats_unlockAllProfitTakerStages: `Разблокировать все этапы Сферы извлечения прибыли`,
|
||||
cheats_instantFinishRivenChallenge: `Мгновенное завершение испытания Мода разлома`,
|
||||
cheats_instantResourceExtractorDrones: `Мгновенно добывающие дроны-сборщики`,
|
||||
cheats_noResourceExtractorDronesDamage: `Без урона по дронам-сборщикам`,
|
||||
cheats_skipClanKeyCrafting: `Пропустить крафт кланового ключа`,
|
||||
cheats_noDojoRoomBuildStage: `Мгновенное Строительтво Комнат Додзё`,
|
||||
cheats_noDojoDecoBuildStage: `Мгновенное Строительтво Декораций Додзё`,
|
||||
cheats_noDojoRoomBuildStage: `Мгновенное строительство Комнат Додзё`,
|
||||
cheats_noDojoDecoBuildStage: `Мгновенное строительство Декораций Додзё`,
|
||||
cheats_fastDojoRoomDestruction: `Мгновенные Уничтожение Комнат Додзё`,
|
||||
cheats_noDojoResearchCosts: `Бесплатные Исследование Додзё`,
|
||||
cheats_noDojoResearchTime: `Мгновенные Исследование Додзё`,
|
||||
cheats_fastClanAscension: `Мгновенное Вознесение Клана`,
|
||||
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_disableDailyTribute: `[UNTRANSLATED] Disable Daily Tribute`,
|
||||
cheats_spoofMasteryRank: `Подделанный ранг мастерства (-1 для отключения)`,
|
||||
cheats_relicRewardItemCountMultiplier: `[UNTRANSLATED] Relic Reward Item Count Multiplier`,
|
||||
cheats_nightwaveStandingMultiplier: `[UNTRANSLATED] Nightwave Standing Multiplier`,
|
||||
cheats_save: `[UNTRANSLATED] Save`,
|
||||
cheats_missionsCanGiveAllRelics: `Миссии могут давать все реликвии`,
|
||||
cheats_exceptionalRelicsAlwaysGiveBronzeReward: `Необычные реликвии всегда дают бронзовую награду`,
|
||||
cheats_flawlessRelicsAlwaysGiveSilverReward: `Бесподобные реликвии всегда дают серебряную награду`,
|
||||
cheats_radiantRelicsAlwaysGiveGoldReward: `Сияющие реликвии всегда дают золотую награду`,
|
||||
cheats_unlockAllSimarisResearchEntries: `Разблокировать все записи исследований Симэриса`,
|
||||
cheats_disableDailyTribute: `Отключить Ежедневные награды`,
|
||||
cheats_spoofMasteryRank: `Поддельный ранг мастерства (-1 для отключения)`,
|
||||
cheats_relicRewardItemCountMultiplier: `Мультипликатор количества предметов награды реликвии`,
|
||||
cheats_nightwaveStandingMultiplier: `Мультипликатор репутации Ночной волны`,
|
||||
cheats_save: `Сохранить`,
|
||||
cheats_account: `Аккаунт`,
|
||||
cheats_unlockAllFocusSchools: `Разблокировать все школы фокуса`,
|
||||
cheats_helminthUnlockAll: `Полностью улучшить Гельминта`,
|
||||
@ -236,114 +236,128 @@ dict = {
|
||||
cheats_intrinsicsUnlockAll: `Полностью улучшить Модуляры`,
|
||||
cheats_changeSupportedSyndicate: `Поддерживаемый синдикат`,
|
||||
cheats_changeButton: `Изменить`,
|
||||
cheats_markAllAsRead: `[UNTRANSLATED] Mark Inbox As Read`,
|
||||
cheats_markAllAsRead: `Пометить все входящие как прочитанные`,
|
||||
|
||||
worldState: `[UNTRANSLATED] World State`,
|
||||
worldState_creditBoost: `[UNTRANSLATED] Credit Boost`,
|
||||
worldState_affinityBoost: `[UNTRANSLATED] Affinity Boost`,
|
||||
worldState_resourceBoost: `[UNTRANSLATED] Resource Boost`,
|
||||
worldState_tennoLiveRelay: `[UNTRANSLATED] TennoLive Relay`,
|
||||
worldState_baroTennoConRelay: `[UNTRANSLATED] Baro's TennoCon Relay`,
|
||||
worldState_starDays: `[UNTRANSLATED] Star Days`,
|
||||
worldState_galleonOfGhouls: `[UNTRANSLATED] Galleon of Ghouls`,
|
||||
enabled: `[UNTRANSLATED] Enabled`,
|
||||
disabled: `[UNTRANSLATED] Disabled`,
|
||||
worldState_we1: `[UNTRANSLATED] Weekend 1`,
|
||||
worldState_we2: `[UNTRANSLATED] Weekend 2`,
|
||||
worldState_we3: `[UNTRANSLATED] Weekend 3`,
|
||||
worldState_eidolonOverride: `[UNTRANSLATED] Eidolon/Deimos Override`,
|
||||
worldState_day: `[UNTRANSLATED] Day/Fass`,
|
||||
worldState_night: `[UNTRANSLATED] Night/Vome`,
|
||||
worldState_vallisOverride: `[UNTRANSLATED] Orb Vallis Override`,
|
||||
worldState_warm: `[UNTRANSLATED] Warm`,
|
||||
worldState_cold: `[UNTRANSLATED] Cold`,
|
||||
worldState_duviriOverride: `[UNTRANSLATED] Duviri Override`,
|
||||
worldState_joy: `[UNTRANSLATED] Joy`,
|
||||
worldState_anger: `[UNTRANSLATED] Anger`,
|
||||
worldState_envy: `[UNTRANSLATED] Envy`,
|
||||
worldState_sorrow: `[UNTRANSLATED] Sorrow`,
|
||||
worldState_fear: `[UNTRANSLATED] Fear`,
|
||||
worldState_nightwaveOverride: `[UNTRANSLATED] Nightwave Override`,
|
||||
worldState_RadioLegionIntermission13Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 9`,
|
||||
worldState_RadioLegionIntermission12Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 8`,
|
||||
worldState_RadioLegionIntermission11Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 7`,
|
||||
worldState_RadioLegionIntermission10Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 6`,
|
||||
worldState_RadioLegionIntermission9Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 5`,
|
||||
worldState_RadioLegionIntermission8Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 4`,
|
||||
worldState_RadioLegionIntermission7Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 3`,
|
||||
worldState_RadioLegionIntermission6Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 2`,
|
||||
worldState_RadioLegionIntermission5Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 1`,
|
||||
worldState_RadioLegionIntermission4Syndicate: `[UNTRANSLATED] Nora's Choice`,
|
||||
worldState_RadioLegionIntermission3Syndicate: `[UNTRANSLATED] Intermission III`,
|
||||
worldState_RadioLegion3Syndicate: `[UNTRANSLATED] Glassmaker`,
|
||||
worldState_RadioLegionIntermission2Syndicate: `[UNTRANSLATED] Intermission II`,
|
||||
worldState_RadioLegion2Syndicate: `[UNTRANSLATED] The Emissary`,
|
||||
worldState_RadioLegionIntermissionSyndicate: `[UNTRANSLATED] Intermission I`,
|
||||
worldState_RadioLegionSyndicate: `[UNTRANSLATED] The Wolf of Saturn Six`,
|
||||
worldState_fissures: `[UNTRANSLATED] Fissures`,
|
||||
normal: `[UNTRANSLATED] Normal`,
|
||||
worldState_allAtOnceNormal: `[UNTRANSLATED] All At Once, Normal`,
|
||||
worldState_allAtOnceSteelPath: `[UNTRANSLATED] All At Once, Steel Path`,
|
||||
worldState_theCircuitOverride: `[UNTRANSLATED] The Circuit Override`,
|
||||
worldState_darvoStockMultiplier: `[UNTRANSLATED] Darvo Stock Multiplier`,
|
||||
worldState: `Состояние мира`,
|
||||
worldState_creditBoost: `Глобальный бустер кредитов`,
|
||||
worldState_affinityBoost: `Глобальный бустер синтеза`,
|
||||
worldState_resourceBoost: `Глобальный бустер ресурсов`,
|
||||
worldState_tennoLiveRelay: `Реле TennoLive`,
|
||||
worldState_baroTennoConRelay: `Реле Баро TennoCon`,
|
||||
worldState_starDays: `Звёздные дни`,
|
||||
worldState_galleonOfGhouls: `Галеон Гулей`,
|
||||
worldState_ghoulEmergence: `Избавление от гулей`,
|
||||
worldState_plagueStar: `Чумная звезда`,
|
||||
worldState_dogDays: `Знойные дни`,
|
||||
worldState_dogDaysRewards: `Награды Знойных дней`,
|
||||
worldState_wolfHunt: `Волчья Охота (2025)`,
|
||||
worldState_longShadow: `Длинная Тень`,
|
||||
worldState_hallowedFlame: `Священное пламя`,
|
||||
worldState_hallowedNightmares: `Священные Кошмары`,
|
||||
worldState_hallowedNightmaresRewards: `Награды Священных Кошмаров`,
|
||||
worldState_proxyRebellion: `Восстание Роботов`,
|
||||
worldState_proxyRebellionRewards: `Награды Восстания Роботов`,
|
||||
worldState_from_year: `из |YEAR|`,
|
||||
worldState_pre_year: `до |YEAR|`,
|
||||
worldState_incompatibleWith: `Несовместимо с:`,
|
||||
enabled: `Включено`,
|
||||
disabled: `Отключено`,
|
||||
worldState_we1: `Выходные 1`,
|
||||
worldState_we2: `Выходные 2`,
|
||||
worldState_we3: `Выходные 3`,
|
||||
worldState_eidolonOverride: `Цикл Равнин Эйдолона/Деймоса`,
|
||||
worldState_day: `День/Фэз`,
|
||||
worldState_night: `Ночь/Воум`,
|
||||
worldState_vallisOverride: `Цикл Долины сфер`,
|
||||
worldState_warm: `Тепло`,
|
||||
worldState_cold: `Холод`,
|
||||
worldState_duviriOverride: `Цикл Дувири`,
|
||||
worldState_joy: `Радость`,
|
||||
worldState_anger: `Гнев`,
|
||||
worldState_envy: `Зависть`,
|
||||
worldState_sorrow: `Печаль`,
|
||||
worldState_fear: `Страх`,
|
||||
worldState_nightwaveOverride: `Сезон Ночной волны`,
|
||||
worldState_RadioLegionIntermission13Syndicate: `Микс Норы, Диск 9`,
|
||||
worldState_RadioLegionIntermission12Syndicate: `Микс Норы, Диск 8`,
|
||||
worldState_RadioLegionIntermission11Syndicate: `Микс Норы, Диск 7`,
|
||||
worldState_RadioLegionIntermission10Syndicate: `Микс Норы, Диск 6`,
|
||||
worldState_RadioLegionIntermission9Syndicate: `Микс Норы, Диск 5`,
|
||||
worldState_RadioLegionIntermission8Syndicate: `Микс Норы, Диск 4`,
|
||||
worldState_RadioLegionIntermission7Syndicate: `Микс Норы, Диск 3`,
|
||||
worldState_RadioLegionIntermission6Syndicate: `Микс Норы, Диск 2`,
|
||||
worldState_RadioLegionIntermission5Syndicate: `Микс Норы, Диск 1`,
|
||||
worldState_RadioLegionIntermission4Syndicate: `Выбор Норы`,
|
||||
worldState_RadioLegionIntermission3Syndicate: `Антракт III`,
|
||||
worldState_RadioLegion3Syndicate: `Стеклодув`,
|
||||
worldState_RadioLegionIntermission2Syndicate: `Антракт II`,
|
||||
worldState_RadioLegion2Syndicate: `Эмиссар`,
|
||||
worldState_RadioLegionIntermissionSyndicate: `Антракт I`,
|
||||
worldState_RadioLegionSyndicate: `Волк Сатурна Шесть`,
|
||||
worldState_fissures: `Разрывы бездны`,
|
||||
normal: `Стандартные`,
|
||||
worldState_allAtOnceNormal: `Все сразу, в обычном режиме`,
|
||||
worldState_allAtOnceSteelPath: `Все сразу, в режиме Стального Пути`,
|
||||
worldState_theCircuitOverride: `Типы миссий в подземелье Дувири`,
|
||||
worldState_darvoStockMultiplier: `Множитель Запасов Дарво`,
|
||||
worldState_varziaFullyStocked: `Полный Ассортимент Варзии`,
|
||||
worldState_varziaOverride: `Изменение Ротации Варзии`,
|
||||
|
||||
import_importNote: `Вы можете загрузить полный или частичный ответ инвентаря (клиентское представление) здесь. Все поддерживаемые поля <b>будут перезаписаны</b> в вашем аккаунте.`,
|
||||
import_submit: `Отправить`,
|
||||
import_samples: `[UNTRANSLATED] Samples:`,
|
||||
import_samples_maxFocus: `[UNTRANSLATED] All Focus Schools Maxed Out`,
|
||||
import_samples: `Пример:`,
|
||||
import_samples_maxFocus: `Все школы Фокуса максимального уровня`,
|
||||
|
||||
upgrade_Equilibrium: `[UNTRANSLATED] +|VAL|% Energy from Health pickups, +|VAL|% Health from Energy pickups`,
|
||||
upgrade_MeleeCritDamage: `[UNTRANSLATED] +|VAL|% Melee Critical Damage`,
|
||||
upgrade_PrimaryStatusChance: `[UNTRANSLATED] +|VAL|% Primary Status Chance`,
|
||||
upgrade_SecondaryCritChance: `[UNTRANSLATED] +|VAL|% Secondary Critical Chance`,
|
||||
upgrade_WarframeAbilityDuration: `[UNTRANSLATED] +|VAL|% Ability Duration`,
|
||||
upgrade_WarframeAbilityStrength: `[UNTRANSLATED] +|VAL|% Ability Strength`,
|
||||
upgrade_WarframeArmorMax: `[UNTRANSLATED] +|VAL| Armor`,
|
||||
upgrade_WarframeBlastProc: `[UNTRANSLATED] +|VAL| Shields on kill with Blast Damage`,
|
||||
upgrade_WarframeCastingSpeed: `[UNTRANSLATED] +|VAL|% Casting Speed`,
|
||||
upgrade_WarframeCorrosiveDamageBoost: `[UNTRANSLATED] +|VAL|% Ability Damage on enemies affected by Corrosion Status`,
|
||||
upgrade_WarframeCorrosiveStack: `[UNTRANSLATED] Increase max stacks of Corrosion Status by +|VAL|`,
|
||||
upgrade_WarframeCritDamageBoost: `[UNTRANSLATED] +|VAL|% Melee Critical Damage (Doubles over 500 Energy)`,
|
||||
upgrade_WarframeElectricDamage: `[UNTRANSLATED] +|VAL1|% Primary Electricity Damage (+|VAL2|% per additional Shard)`,
|
||||
upgrade_WarframeElectricDamageBoost: `[UNTRANSLATED] +|VAL|% Ability Damage on enemies affected by Electricity Status`,
|
||||
upgrade_WarframeEnergyMax: `[UNTRANSLATED] +|VAL| Energy Max`,
|
||||
upgrade_WarframeGlobeEffectEnergy: `[UNTRANSLATED] +|VAL|% Energy Orb Effectiveness`,
|
||||
upgrade_WarframeGlobeEffectHealth: `[UNTRANSLATED] +|VAL|% Health Orb Effectiveness`,
|
||||
upgrade_WarframeHealthMax: `[UNTRANSLATED] +|VAL| Health`,
|
||||
upgrade_WarframeHPBoostFromImpact: `[UNTRANSLATED] +|VAL1| Health on kill with Blast Damage (Max |VAL2| Health)`,
|
||||
upgrade_WarframeParkourVelocity: `[UNTRANSLATED] +|VAL|% Parkour Velocity`,
|
||||
upgrade_WarframeRadiationDamageBoost: `[UNTRANSLATED] +|VAL|% Ability Damage on enemies affected by Radiation Status`,
|
||||
upgrade_WarframeHealthRegen: `[UNTRANSLATED] +|VAL| Health Regen/s`,
|
||||
upgrade_WarframeShieldMax: `[UNTRANSLATED] +|VAL| Shield`,
|
||||
upgrade_WarframeStartingEnergy: `[UNTRANSLATED] +|VAL|% Energy on Spawn`,
|
||||
upgrade_WarframeToxinDamage: `[UNTRANSLATED] +|VAL|% Toxin Status Effect Damage`,
|
||||
upgrade_WarframeToxinHeal: `[UNTRANSLATED] +|VAL| Health on damaging enemies with Toxin Status`,
|
||||
upgrade_WeaponCritBoostFromHeat: `[UNTRANSLATED] +|VAL1|% Secondary Critical Chance per Heat-affected enemy killed (Max |VAL2|%)`,
|
||||
upgrade_AvatarAbilityRange: `[UNTRANSLATED] +7.5% Ability Range`,
|
||||
upgrade_AvatarAbilityEfficiency: `[UNTRANSLATED] +5% Ability Efficiency`,
|
||||
upgrade_AvatarEnergyRegen: `[UNTRANSLATED] +0.5 Energy Regen/s`,
|
||||
upgrade_AvatarEnemyRadar: `[UNTRANSLATED] +5m Enemy Radar`,
|
||||
upgrade_AvatarLootRadar: `[UNTRANSLATED] +7m Loot Radar`,
|
||||
upgrade_WeaponAmmoMax: `[UNTRANSLATED] +15% Ammo Max`,
|
||||
upgrade_EnemyArmorReductionAura: `[UNTRANSLATED] -3% Enemy Armor`,
|
||||
upgrade_OnExecutionAmmo: `[UNTRANSLATED] +100% Primary and Secondary Magazine Refill on Mercy`,
|
||||
upgrade_OnExecutionHealthDrop: `[UNTRANSLATED] +100% Health Orb Chance on Mercy`,
|
||||
upgrade_OnExecutionEnergyDrop: `[UNTRANSLATED] +50% Energy Orb Chance on Mercy`,
|
||||
upgrade_OnFailHackReset: `[UNTRANSLATED] +50% Hacking Retry Chance`,
|
||||
upgrade_DamageReductionOnHack: `[UNTRANSLATED] +75% Damage Reduction while Hacking`,
|
||||
upgrade_OnExecutionReviveCompanion: `[UNTRANSLATED] Mercy Kills reduce Companion Recovery by 15s`,
|
||||
upgrade_OnExecutionParkourSpeed: `[UNTRANSLATED] +60% Parkour Speed after a Mercy for 15s`,
|
||||
upgrade_AvatarTimeLimitIncrease: `[UNTRANSLATED] +8s to 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_OnHackLockers: `[UNTRANSLATED] Unlock 5 lockers within 20m after Hacking`,
|
||||
upgrade_OnExecutionBlind: `[UNTRANSLATED] Blind enemies within 18m on Mercy`,
|
||||
upgrade_OnExecutionDrainPower: `[UNTRANSLATED] Next ability cast gains +50% Ability Strength on Mercy`,
|
||||
upgrade_OnHackSprintSpeed: `[UNTRANSLATED] +75% Sprint Speed for 15s after Hacking`,
|
||||
upgrade_SwiftExecute: `[UNTRANSLATED] +50% Mercy Kill Speed`,
|
||||
upgrade_OnHackInvis: `[UNTRANSLATED] Invisible for 15 seconds after Hacking`,
|
||||
upgrade_Equilibrium: `+|VAL|% Энергия от подбирания здоровья, +|VAL|% Здоровье от подбирания энергии`,
|
||||
upgrade_MeleeCritDamage: `+|VAL|% Критический урон ближнего боя`,
|
||||
upgrade_PrimaryStatusChance: `+|VAL|% Шанс наложения статуса основным оружием`,
|
||||
upgrade_SecondaryCritChance: `+|VAL|% Шанс критического удара вторичным оружием`,
|
||||
upgrade_WarframeAbilityDuration: `+|VAL|% Длительность способностей`,
|
||||
upgrade_WarframeAbilityStrength: `+|VAL|% Сила способностей`,
|
||||
upgrade_WarframeArmorMax: `+|VAL| Броня`,
|
||||
upgrade_WarframeBlastProc: `+|VAL| Щиты при убийстве с Взрывным Уроном`,
|
||||
upgrade_WarframeCastingSpeed: `+|VAL|% Скорость Применения Способностей`,
|
||||
upgrade_WarframeCorrosiveDamageBoost: `+|VAL|% Урон Способностей по врагам, пораженным Коррозией`,
|
||||
upgrade_WarframeCorrosiveStack: `Увеличить макс. стаки Коррозии на +|VAL|`,
|
||||
upgrade_WarframeCritDamageBoost: `+|VAL|% Критический Урон Ближнего Боя (Удваивается при 500 Энергии)`,
|
||||
upgrade_WarframeElectricDamage: `+|VAL1|% Урон Электричеством Основным Оружием (+|VAL2|% за каждый дополнительный Осколок)`,
|
||||
upgrade_WarframeElectricDamageBoost: `+|VAL|% Урон Способностей по врагам, пораженным Электричеством`,
|
||||
upgrade_WarframeEnergyMax: `+|VAL| Макс. Энергия`,
|
||||
upgrade_WarframeGlobeEffectEnergy: `+|VAL|% Эффективность сфер Энергии`,
|
||||
upgrade_WarframeGlobeEffectHealth: `+|VAL|% Эффективность сфер Здоровья`,
|
||||
upgrade_WarframeHealthMax: `+|VAL| Макс. Здоровье`,
|
||||
upgrade_WarframeHPBoostFromImpact: `+|VAL1| Здоровья при убийстве с Взрывным Уроном (Макс. |VAL2| Здоровья)`,
|
||||
upgrade_WarframeParkourVelocity: `+|VAL|% Скорость Паркура`,
|
||||
upgrade_WarframeRadiationDamageBoost: `+|VAL|% Урон Способностей по врагам, пораженным Радиацией`,
|
||||
upgrade_WarframeHealthRegen: `+|VAL| Здоровья в секунду`,
|
||||
upgrade_WarframeShieldMax: `+|VAL| Щитов`,
|
||||
upgrade_WarframeStartingEnergy: `+|VAL|% Энергии при Спавне`,
|
||||
upgrade_WarframeToxinDamage: `+|VAL|% Урон Токсином`,
|
||||
upgrade_WarframeToxinHeal: `+|VAL| Здоровья при нанесении урона врагам с Токсином`,
|
||||
upgrade_WeaponCritBoostFromHeat: `+|VAL1|% Шанс Критического Удара Вторичным Оружием за каждого убитого врага, пораженного Огнем (Макс. |VAL2|%)`,
|
||||
upgrade_AvatarAbilityRange: `+7.5% Радиус Способностей`,
|
||||
upgrade_AvatarAbilityEfficiency: `+5% Энергоэффективность Способностей`,
|
||||
upgrade_AvatarEnergyRegen: `+0.5 Регенерация Энергии в секунду`,
|
||||
upgrade_AvatarEnemyRadar: `+5m обнаружение врагов`,
|
||||
upgrade_AvatarLootRadar: `+7m обнаружение добычи`,
|
||||
upgrade_WeaponAmmoMax: `+15% Макс. Патронов`,
|
||||
upgrade_EnemyArmorReductionAura: `-3% Броня Врагов`,
|
||||
upgrade_OnExecutionAmmo: `+100% Заполнение Магазина Основного и Вторичного Оружия при убийстве Милосердием`,
|
||||
upgrade_OnExecutionHealthDrop: `+100% Шанс Падения сферы Здоровья при убийстве Милосердием`,
|
||||
upgrade_OnExecutionEnergyDrop: `+50% Шанс Падения сферы Энергии при убийстве Милосердием`,
|
||||
upgrade_OnFailHackReset: `+50% Шанс Повтора Взлома`,
|
||||
upgrade_DamageReductionOnHack: `+75% Уменьшение Урона во время Взлома`,
|
||||
upgrade_OnExecutionReviveCompanion: `Убийства Милосердием уменьшают время восстановления Компаньона на 15 секунд`,
|
||||
upgrade_OnExecutionParkourSpeed: `+60% Скорость Паркура после убийства Милосердием на 15 секунд`,
|
||||
upgrade_AvatarTimeLimitIncrease: `+8 секунд к Взлому`,
|
||||
upgrade_ElectrifyOnHack: `Шокировать врагов в пределах 20 метров во время Взлома`,
|
||||
upgrade_OnExecutionTerrify: `+50% шанс, что враги в пределах 15 метров будут дрожать от страха в течение 8 секунд после убийства Милосердием`,
|
||||
upgrade_OnHackLockers: `Открыть 5 шкафчиков в пределах 20 метров после Взлома`,
|
||||
upgrade_OnExecutionBlind: `Ослепить врагов в пределах 18 метров после убийства Милосердием`,
|
||||
upgrade_OnExecutionDrainPower: `Следующее использование способности получает +50% Силы Способности после убийства Милосердием`,
|
||||
upgrade_OnHackSprintSpeed: `+75% Скорость Бега в течение 15 секунд после Взлома`,
|
||||
upgrade_SwiftExecute: `+50% Скорость Убийства Милосердием`,
|
||||
upgrade_OnHackInvis: `Невидимость в течение 15 секунд после Взлома`,
|
||||
|
||||
damageType_Electricity: `Электричество`,
|
||||
damageType_Fire: `Огонь`,
|
||||
@ -353,8 +367,8 @@ dict = {
|
||||
damageType_Poison: `Токсин`,
|
||||
damageType_Radiation: `Радиация`,
|
||||
|
||||
theme_dark: `[UNTRANSLATED] Dark Theme`,
|
||||
theme_light: `[UNTRANSLATED] Light Theme`,
|
||||
theme_dark: `Темная тема`,
|
||||
theme_light: `Светлая тема`,
|
||||
|
||||
prettier_sucks_ass: ``
|
||||
};
|
||||
|
||||
374
static/webui/translations/uk.js
Normal file
374
static/webui/translations/uk.js
Normal file
@ -0,0 +1,374 @@
|
||||
// Ukrainian translation by LoseFace
|
||||
dict = {
|
||||
general_inventoryUpdateNote: `Пам'ятка: Щоб побачити зміни в грі, вам потрібно повторно синхронізувати свій інвентар, наприклад, використовуючи команду /sync завантажувача, відвідавши Доджьо/Реле або перезавантаживши гру.`,
|
||||
general_addButton: `Добавити`,
|
||||
general_setButton: `Встановити`,
|
||||
general_none: `Відсутній`,
|
||||
general_bulkActions: `Масові дії`,
|
||||
general_loading: `Завантаження...`,
|
||||
|
||||
code_loginFail: `Не вдалося увійти. Перевірте адресу електронної пошти та пароль.`,
|
||||
code_regFail: `Не вдалося зареєструватися. Обліковий запис вже існує?`,
|
||||
code_changeNameConfirm: `Яке ім'я ви хочете встановити для свого облікового запису?`,
|
||||
code_deleteAccountConfirm: `Ви впевнені, що хочете видалити обліковий запис |DISPLAYNAME| (|EMAIL|)? Цю дію не можна скасувати.`,
|
||||
code_archgun: `Арч-Пушка`,
|
||||
code_melee: `Ближній бій`,
|
||||
code_pistol: `Пістолет`,
|
||||
code_rifle: `Гвинтівка`,
|
||||
code_shotgun: `Рушниця`,
|
||||
code_kitgun: `Складостріл`,
|
||||
code_zaw: `Зо`,
|
||||
code_moteAmp: `Порошинка`,
|
||||
code_amp: `Підсилювач`,
|
||||
code_kDrive: `К-Драйв`,
|
||||
code_legendaryCore: `Легендарне ядро`,
|
||||
code_traumaticPeculiar: `Травмуюча Странність`,
|
||||
code_starter: `|MOD| (Пошкоджений)`,
|
||||
code_badItem: `(Самозванець)`,
|
||||
code_maxRank: `Максимальний рівень`,
|
||||
code_rename: `Переіменувати`,
|
||||
code_renamePrompt: `Введіть нове ім'я:`,
|
||||
code_remove: `Видалити`,
|
||||
code_addItemsConfirm: `Ви впевнені, що хочете додати |COUNT| предметів на ваш обліковий запис?`,
|
||||
code_succRankUp: `Рівень успішно підвищено`,
|
||||
code_noEquipmentToRankUp: `Немає спорядження для підвищення рівня.`,
|
||||
code_succAdded: `Успішно додано.`,
|
||||
code_succRemoved: `Успішно видалено.`,
|
||||
code_buffsNumber: `Кількість позитивних ефектів`,
|
||||
code_cursesNumber: `Кількість негативних ефектів`,
|
||||
code_rerollsNumber: `Кількість рероллів`,
|
||||
code_viewStats: `Перегляд характеристики`,
|
||||
code_rank: `Рівень`,
|
||||
code_rankUp: `Підвищити рівень`,
|
||||
code_rankDown: `Понизити рівень`,
|
||||
code_count: `Кількість`,
|
||||
code_focusAllUnlocked: `Всі школи фокуса вже розблоковані.`,
|
||||
code_focusUnlocked: `Розблоковано |COUNT| нових шкіл фокуса! Для відображення змін в грі знадобиться оновлення спорядження. Відвідування навігації — найпростіший спосіб цього досягти.`,
|
||||
code_addModsConfirm: `Ви впевнені, що хочете додати |COUNT| модифікаторів на ваш обліковий запис?`,
|
||||
code_succImport: `Успішно імпортовано.`,
|
||||
code_succRelog: `Готово. Зверніть увагу, що вам потрібно буде перезайти, щоб побачити зміни в грі.`,
|
||||
code_nothingToDo: `Готово. Немає що робити.`,
|
||||
code_gild: `Покращити`,
|
||||
code_moa: `МОА`,
|
||||
code_zanuka: `Гончарка`,
|
||||
code_stage: `Етап`,
|
||||
code_complete: `Завершити`,
|
||||
code_nextStage: `Наступний етап`,
|
||||
code_prevStage: `Попередній етап`,
|
||||
code_reset: `Скинути`,
|
||||
code_setInactive: `Зробити пригоду неактивною`,
|
||||
code_completed: `Завершено`,
|
||||
code_active: `Активний`,
|
||||
code_pigment: `Пігмент`,
|
||||
code_mature: `Підготувати до бою`,
|
||||
code_unmature: `Обернути старіння`,
|
||||
code_succChange: `Успішно змінено.`,
|
||||
code_requiredInvigorationUpgrade: `Ви повинні вибрати як атакуюче, так і допоміжне покращення.`,
|
||||
login_description: `Увійдіть, використовуючи облікові дані OpenWF (ті ж, що й у грі при підключенні до цього сервера).`,
|
||||
login_emailLabel: `Адреса електронної пошти`,
|
||||
login_passwordLabel: `Пароль`,
|
||||
login_loginButton: `Увійти`,
|
||||
login_registerButton: `Зареєструватися`,
|
||||
navbar_logout: `Вийти`,
|
||||
navbar_renameAccount: `Переіменувати обліковий запис`,
|
||||
navbar_deleteAccount: `Видалити обліковий запис`,
|
||||
navbar_inventory: `Спорядження`,
|
||||
navbar_mods: `Моди`,
|
||||
navbar_quests: `Пригоди`,
|
||||
navbar_cheats: `Чити`,
|
||||
navbar_import: `Імпорт`,
|
||||
inventory_addItems: `Додати предмети`,
|
||||
inventory_suits: `Ворфрейми`,
|
||||
inventory_longGuns: `Основне озброєння`,
|
||||
inventory_pistols: `Допоміжне озброєння`,
|
||||
inventory_melee: `Холодне озброєння`,
|
||||
inventory_spaceSuits: `Арквінґи`,
|
||||
inventory_spaceGuns: `Озброєння арквінґів`,
|
||||
inventory_spaceMelee: `Холодне озброєння арквінґів`,
|
||||
inventory_mechSuits: `Некрамехи`,
|
||||
inventory_sentinels: `Вартові`,
|
||||
inventory_sentinelWeapons: `Озброєння вартових`,
|
||||
inventory_operatorAmps: `Підсилювачі`,
|
||||
inventory_hoverboards: `К-Драйви`,
|
||||
inventory_moaPets: `МОА`,
|
||||
inventory_kubrowPets: `Тварини`,
|
||||
inventory_evolutionProgress: `Прогрес Еволюції Інкарнонов`,
|
||||
inventory_Boosters: `Бустери`,
|
||||
inventory_bulkAddSuits: `Додати відсутні ворфрейми`,
|
||||
inventory_bulkAddWeapons: `Додати відсутнє озброєння`,
|
||||
inventory_bulkAddSpaceSuits: `Додати відсутні арквінґи`,
|
||||
inventory_bulkAddSpaceWeapons: `Додати відсутнє озброєння арквінґів`,
|
||||
inventory_bulkAddSentinels: `Додати відсутніх вартових`,
|
||||
inventory_bulkAddSentinelWeapons: `Додати відсутнє озброєння вартових`,
|
||||
inventory_bulkAddEvolutionProgress: `Додати відсутній прогрес Еволюції Інкарнонов`,
|
||||
inventory_bulkRankUpSuits: `Максимальний рівень всіх ворфреймів`,
|
||||
inventory_bulkRankUpWeapons: `Максимальний рівень всього озброєння`,
|
||||
inventory_bulkRankUpSpaceSuits: `Максимальний рівень всіх арквінґів`,
|
||||
inventory_bulkRankUpSpaceWeapons: `Максимальний рівень всього озброєння арквінґів`,
|
||||
inventory_bulkRankUpSentinels: `Максимальний рівень всіх вартових`,
|
||||
inventory_bulkRankUpSentinelWeapons: `Максимальний рівень всього озброєння вартових`,
|
||||
inventory_bulkRankUpEvolutionProgress: `Максимальний рівень всіх еволюцій Інкарнонов`,
|
||||
inventory_maxPlexus: `Максимальний рівень Плексу`,
|
||||
|
||||
quests_list: `Пригоди`,
|
||||
quests_completeAll: `Закінчити всі пригоди`,
|
||||
quests_resetAll: `Скинути прогрес всіх пригод`,
|
||||
quests_giveAll: `Видати всі пригоди`,
|
||||
|
||||
currency_RegularCredits: `Кредити`,
|
||||
currency_PremiumCredits: `Платина`,
|
||||
currency_FusionPoints: `Ендо`,
|
||||
currency_PrimeTokens: `Королівські Ая`,
|
||||
currency_owned: `У тебе |COUNT|.`,
|
||||
|
||||
detailedView_archonShardsLabel: `Клітинки осколків архонта`,
|
||||
detailedView_archonShardsDescription: `Ви можете використовувати ці необмежені клітинки для встановлення безлічі вдосконалень.`,
|
||||
detailedView_archonShardsDescription2: `Зверніть увагу: кожен уламок архонта застосовується з затримкою при завантаженні.`,
|
||||
detailedView_valenceBonusLabel: `Ознака Валентності`,
|
||||
detailedView_valenceBonusDescription: `Ви можете встановити або прибрати ознака валентності з вашої зброї.`,
|
||||
detailedView_modularPartsLabel: `Змінити Модульні Частини`,
|
||||
detailedView_suitInvigorationLabel: `Зміцнення Ворфрейма`,
|
||||
detailedView_loadoutLabel: `Конфігурації`,
|
||||
|
||||
invigorations_offensive_AbilityStrength: `+200% Потужності Здібностей`,
|
||||
invigorations_offensive_AbilityRange: `+100% Досяжність Здібностей`,
|
||||
invigorations_offensive_AbilityDuration: `+100% Тривалість Здібностей`,
|
||||
invigorations_offensive_MeleeDamage: `+250% Шкода Ближнього Бою`,
|
||||
invigorations_offensive_PrimaryDamage: `+250% Шкода Основного Озброєння`,
|
||||
invigorations_offensive_SecondaryDamage: `+250% Шкода Допоміжного Озброєння`,
|
||||
invigorations_offensive_PrimaryCritChance: `+200% Імовірність Критичної Шкоди Основного Озброєння`,
|
||||
invigorations_offensive_SecondaryCritChance: `+200% Імовірність Критичної Шкоди Допоміжного Озброєння`,
|
||||
invigorations_offensive_MeleeCritChance: `+200% Імовірність Критичної Шкоди Ближнього Бою`,
|
||||
|
||||
invigorations_utility_AbilityEfficiency: `+75% Ощадливість Здібностей`,
|
||||
invigorations_utility_SprintSpeed: `+75% Швидкість Бігу`,
|
||||
invigorations_utility_ParkourVelocity: `+75% Швидкість Паркура`,
|
||||
invigorations_utility_HealthMax: `+1000 Здоров'я`,
|
||||
invigorations_utility_EnergyMax: `+200% Максимум Енергії`,
|
||||
invigorations_utility_StatusImmune: `Імунітет до Ефектів Статусу`,
|
||||
invigorations_utility_ReloadSpeed: `+75% Швидкість Перезаряджання`,
|
||||
invigorations_utility_HealthRegen: `+25 Здоров'я в секунду`,
|
||||
invigorations_utility_ArmorMax: `+1000 Захисту`,
|
||||
invigorations_utility_Jumps: `+5 Оновлень Стрибків`,
|
||||
invigorations_utility_EnergyRegen: `+2 Енергії в секунду`,
|
||||
|
||||
invigorations_offensiveLabel: `Атакуюче Вдосконалення`,
|
||||
invigorations_defensiveLabel: `Вспомогательное Вдосконалення`,
|
||||
invigorations_expiryLabel: `Термін дії Зміцнення (необов'язково)`,
|
||||
|
||||
abilityOverride_label: `Перевизначення здібностей`,
|
||||
abilityOverride_onSlot: `у клітинці`,
|
||||
|
||||
mods_addRiven: `Добавити Модифікатор Розколу`,
|
||||
mods_fingerprint: `Відбиток`,
|
||||
mods_fingerprintHelp: `Потрібна допомога з відбитком?`,
|
||||
mods_rivens: `Модифікатори Розколу`,
|
||||
mods_mods: `Модифікатори`,
|
||||
mods_addMax: `Добавити максимально вдосконалений`,
|
||||
mods_addMissingUnrankedMods: `Добавити недостаючі модифікатори без рівня`,
|
||||
mods_removeUnranked: `Видалити модифікатори без рівня`,
|
||||
mods_addMissingMaxRankMods: `Добавити недостаючі модифікатори максимального рівня`,
|
||||
cheats_administratorRequirement: `Ви повинні бути адміністратором для використання цієї функції. Щоб стати адміністратором, додайте <code>\"|DISPLAYNAME|\"</code> в <code>administratorNames</code> в config.json.`,
|
||||
cheats_server: `Сервер`,
|
||||
cheats_skipTutorial: `Пропустити навчання`,
|
||||
cheats_skipAllDialogue: `Пропустити всі діалоги`,
|
||||
cheats_unlockAllScans: `Розблокувати всі сканування`,
|
||||
cheats_unlockAllMissions: `Розблокувати всі місії`,
|
||||
cheats_unlockAllMissions_ok: `Успіх. Будь ласка, зверніть увагу, що вам потрібно буде увійти в Доджьо/Реле або перезайти, щоб клієнт оновив зоряну мапу.`,
|
||||
cheats_infiniteCredits: `Бескінечні кредити`,
|
||||
cheats_infinitePlatinum: `Бескінечна платина`,
|
||||
cheats_infiniteEndo: `Бескінечне ендо`,
|
||||
cheats_infiniteRegalAya: `Бескінечна Королівська Ая`,
|
||||
cheats_infiniteHelminthMaterials: `Бескінечні Секреції Гельмінта`,
|
||||
cheats_claimingBlueprintRefundsIngredients: `Повернення інгредієнтів креслеників`,
|
||||
cheats_dontSubtractPurchaseCreditCost: `Не вираховувати вартість кредитів при купівлі`,
|
||||
cheats_dontSubtractPurchasePlatinumCost: `Не вираховувати вартість платини при купівлі`,
|
||||
cheats_dontSubtractPurchaseItemCost: `Не вираховувати вартість предметів при купівлі`,
|
||||
cheats_dontSubtractPurchaseStandingCost: `Не вираховувати вартість репутації при купівлі`,
|
||||
cheats_dontSubtractVoidTraces: `Не вираховувати кількість Відголосків Безодні`,
|
||||
cheats_dontSubtractConsumables: `Не вираховувати кількість витратних матеріалів`,
|
||||
cheats_unlockAllShipFeatures: `Розблокувати всі функції судна`,
|
||||
cheats_unlockAllShipDecorations: `Розблокувати всі прикраси судна`,
|
||||
cheats_unlockAllFlavourItems: `Розблокувати всі <abbr title="Набори анімацій, гліфи, палітри і т. д.">унікальні предмети</abbr>`,
|
||||
cheats_unlockAllSkins: `Розблокувати всі скіни`,
|
||||
cheats_unlockAllCapturaScenes: `Розблокувати всі сцени Світлописця`,
|
||||
cheats_unlockAllDecoRecipes: `Розблокувати всі рецепти декорацій Доджьо`,
|
||||
cheats_universalPolarityEverywhere: `Будь-яка полярність скрізь`,
|
||||
cheats_unlockDoubleCapacityPotatoesEverywhere: `Орокінські Реактори/Каталізатори скрізь`,
|
||||
cheats_unlockExilusEverywhere: `Ексилотримач скрізь`,
|
||||
cheats_unlockArcanesEverywhere: `Тримач містифікаторів скрізь`,
|
||||
cheats_noDailyStandingLimits: `Без щоденних лімітів репутації`,
|
||||
cheats_noDailyFocusLimit: `Без щоденних лімітів фокуса`,
|
||||
cheats_noArgonCrystalDecay: `Без розпаду аргонових кристалів`,
|
||||
cheats_noMasteryRankUpCooldown: `Підвищення ранга майстерності без очікування`,
|
||||
cheats_noVendorPurchaseLimits: `Відсутність лімітів на купівлю у продавців`,
|
||||
cheats_noDeathMarks: `Без позначок смерті`,
|
||||
cheats_noKimCooldowns: `Чати KIM без очікування`,
|
||||
cheats_fullyStockedVendors: `Повністю укомплектовані продавці`,
|
||||
cheats_baroAlwaysAvailable: `Баро завжди доступний`,
|
||||
cheats_baroFullyStocked: `Баро повністю укомплектований`,
|
||||
cheats_syndicateMissionsRepeatable: `Повторювати місії синдиката`,
|
||||
cheats_unlockAllProfitTakerStages: `Розблокувати всі етапи Привласнювачки`,
|
||||
cheats_instantFinishRivenChallenge: `Миттєве завершення випробування Модифікатора Розколу`,
|
||||
cheats_instantResourceExtractorDrones: `Миттєво добуваючі дрони-видобувачі`,
|
||||
cheats_noResourceExtractorDronesDamage: `Без шкоди по дронам-видобувачам`,
|
||||
cheats_skipClanKeyCrafting: `Пропустити створення кланового ключа`,
|
||||
cheats_noDojoRoomBuildStage: `Миттєве будівництво Кімнат Доджьо`,
|
||||
cheats_noDojoDecoBuildStage: `Миттєве будівництво Декорацій Доджьо`,
|
||||
cheats_fastDojoRoomDestruction: `Миттєве знищення Кімнат Доджьо`,
|
||||
cheats_noDojoResearchCosts: `Безкоштовні Дослідження Доджьо`,
|
||||
cheats_noDojoResearchTime: `Миттєві Дослідження Доджьо`,
|
||||
cheats_fastClanAscension: `Миттєве Піднесення Клану`,
|
||||
cheats_missionsCanGiveAllRelics: `Місії можуть давати всі реліквії`,
|
||||
cheats_exceptionalRelicsAlwaysGiveBronzeReward: `Вийняткові реліквії завжди дають бронзову нагороду`,
|
||||
cheats_flawlessRelicsAlwaysGiveSilverReward: `Бездоганні реліквії завжди дають срібну нагороду`,
|
||||
cheats_radiantRelicsAlwaysGiveGoldReward: `Сяйнисті реліквії завжди дають золоту нагороду`,
|
||||
cheats_unlockAllSimarisResearchEntries: `Розблокувати всі записи досліджень Симаріса`,
|
||||
cheats_disableDailyTribute: `Вимкнути щоденні нагороди`,
|
||||
cheats_spoofMasteryRank: `Підроблений ранг майстерності (-1 для вимкнення)`,
|
||||
cheats_relicRewardItemCountMultiplier: `Множник кількості предметів нагороди реліквії`,
|
||||
cheats_nightwaveStandingMultiplier: `Множник репутації Нічної хвилі`,
|
||||
cheats_save: `Зберегти`,
|
||||
cheats_account: `Обліковий запис`,
|
||||
cheats_unlockAllFocusSchools: `Розблокувати всі школи фокуса`,
|
||||
cheats_helminthUnlockAll: `Повністю покращити Гельмінта`,
|
||||
cheats_addMissingSubsumedAbilities: `Додати відсутні поглинуті здібності`,
|
||||
cheats_intrinsicsUnlockAll: `Повністю покращити Кваліфікації`,
|
||||
cheats_changeSupportedSyndicate: `Підтримуваний синдикат`,
|
||||
cheats_changeButton: `Змінити`,
|
||||
cheats_markAllAsRead: `Помітити всі вхідні як прочитані`,
|
||||
|
||||
worldState: `Стан світу`,
|
||||
worldState_creditBoost: `Глобальний бустер кредитів`,
|
||||
worldState_affinityBoost: `Глобальний бустер синтезу`,
|
||||
worldState_resourceBoost: `Глобальний бустер ресурсів`,
|
||||
worldState_tennoLiveRelay: `Реле TennoLive`,
|
||||
worldState_baroTennoConRelay: `Реле Баро TennoCon`,
|
||||
worldState_starDays: `Зоряні дні`,
|
||||
worldState_galleonOfGhouls: `Гульський Галеон`,
|
||||
worldState_ghoulEmergence: `Зачищення від гулів`,
|
||||
worldState_plagueStar: `Морова зірка`,
|
||||
worldState_dogDays: `Спекотні дні`,
|
||||
worldState_dogDaysRewards: `Нагороди Спекотних днів`,
|
||||
worldState_wolfHunt: `Полювання на Вовка (2025)`,
|
||||
worldState_longShadow: `Довга тінь`,
|
||||
worldState_hallowedFlame: `Священне полум'я`,
|
||||
worldState_hallowedNightmares: `Священні жахіття`,
|
||||
worldState_hallowedNightmaresRewards: `Нагороди Священних Жахіть`,
|
||||
worldState_proxyRebellion: `Повстання роботів`,
|
||||
worldState_proxyRebellionRewards: `Нагороди Повстання роботів`,
|
||||
worldState_from_year: `з |YEAR|`,
|
||||
worldState_pre_year: `до |YEAR|`,
|
||||
worldState_incompatibleWith: `Несумісне з:`,
|
||||
enabled: `Увімкнено`,
|
||||
disabled: `Вимкнено`,
|
||||
worldState_we1: `Вихідні 1`,
|
||||
worldState_we2: `Вихідні 2`,
|
||||
worldState_we3: `Вихідні 3`,
|
||||
worldState_eidolonOverride: `Цикл Рівнин Ейдолонів/Деймоса`,
|
||||
worldState_day: `День/Фасс`,
|
||||
worldState_night: `Ніч/Воум`,
|
||||
worldState_vallisOverride: `Цикл Долини куль`,
|
||||
worldState_warm: `Тепло`,
|
||||
worldState_cold: `Холод`,
|
||||
worldState_duviriOverride: `Цикл Дувірі`,
|
||||
worldState_joy: `Радість`,
|
||||
worldState_anger: `Гнів`,
|
||||
worldState_envy: `Заздрість`,
|
||||
worldState_sorrow: `Скорбота`,
|
||||
worldState_fear: `Страх`,
|
||||
worldState_nightwaveOverride: `Сезон Нічної хвилі`,
|
||||
worldState_RadioLegionIntermission13Syndicate: `Вибірка Нори 9`,
|
||||
worldState_RadioLegionIntermission12Syndicate: `Вибірка Нори 8`,
|
||||
worldState_RadioLegionIntermission11Syndicate: `Вибірка Нори 7`,
|
||||
worldState_RadioLegionIntermission10Syndicate: `Вибірка Нори 6`,
|
||||
worldState_RadioLegionIntermission9Syndicate: `Вибірка Нори 5`,
|
||||
worldState_RadioLegionIntermission8Syndicate: `Вибірка Нори 4`,
|
||||
worldState_RadioLegionIntermission7Syndicate: `Вибірка Нори 3`,
|
||||
worldState_RadioLegionIntermission6Syndicate: `Вибірка Нори 2`,
|
||||
worldState_RadioLegionIntermission5Syndicate: `Вибірка Нори 1`,
|
||||
worldState_RadioLegionIntermission4Syndicate: `Вибір Нори`,
|
||||
worldState_RadioLegionIntermission3Syndicate: `Антракт III`,
|
||||
worldState_RadioLegion3Syndicate: `Скляр`,
|
||||
worldState_RadioLegionIntermission2Syndicate: `Антракт II`,
|
||||
worldState_RadioLegion2Syndicate: `Емісар`,
|
||||
worldState_RadioLegionIntermissionSyndicate: `Антракт I`,
|
||||
worldState_RadioLegionSyndicate: `Вовк із Сатурна-6`,
|
||||
worldState_fissures: `Прориви порожнечі`,
|
||||
normal: `Стандартні`,
|
||||
worldState_allAtOnceNormal: `Всі одразу, в звичайному режимі`,
|
||||
worldState_allAtOnceSteelPath: `Всі одразу, в режимі Шляху Сталі`,
|
||||
worldState_theCircuitOverride: `Типи місій у підземеллі Дувірі`,
|
||||
worldState_darvoStockMultiplier: `Множник Запасів Дарво`,
|
||||
worldState_varziaFullyStocked: `Повний Асортимент Варзії`,
|
||||
worldState_varziaOverride: `Зміна Ротації Варзії`,
|
||||
|
||||
import_importNote: `Ви можете завантажити повну або часткову відповідь спорядження (клієнтське представлення) тут. Всі підтримувані поля <b>будуть перезаписані</b> у вашому акаунті.`,
|
||||
import_submit: `Відправити`,
|
||||
import_samples: `Приклад:`,
|
||||
import_samples_maxFocus: `Всі школи Фокуса максимального рівня`,
|
||||
|
||||
upgrade_Equilibrium: `+|VAL|% Енергія від підбирання здоров'я, +|VAL|% Здоров'я від підбирання енергії`,
|
||||
upgrade_MeleeCritDamage: `+|VAL|% Критична шкода ближнього бою`,
|
||||
upgrade_PrimaryStatusChance: `+|VAL|% Імовірність накладення ефекту стану основною зброєю`,
|
||||
upgrade_SecondaryCritChance: `+|VAL|% Імовірність критичної шкоди допоміжною зброєю`,
|
||||
upgrade_WarframeAbilityDuration: `+|VAL|% Тривалість здібностей`,
|
||||
upgrade_WarframeAbilityStrength: `+|VAL|% Потужність здібностей`,
|
||||
upgrade_WarframeArmorMax: `+|VAL| Захист`,
|
||||
upgrade_WarframeBlastProc: `+|VAL| Щит при вбивстві з Вибуховим Уронoм`,
|
||||
upgrade_WarframeCastingSpeed: `+|VAL|% Швидкість Застосування Здібностей`,
|
||||
upgrade_WarframeCorrosiveDamageBoost: `+|VAL|% Урон Здібностей по ворогам, ураженим Корозією`,
|
||||
upgrade_WarframeCorrosiveStack: `Збільшити макс. стаки Корозії на +|VAL|`,
|
||||
upgrade_WarframeCritDamageBoost: `+|VAL|% Критична шкода Ближнього Бою (Подвоюється при 500 Енергії)`,
|
||||
upgrade_WarframeElectricDamage: `+|VAL1|% Урон Електрикою Основним Озброєнням (+|VAL2|% за кожен додатковий Уламок)`,
|
||||
upgrade_WarframeElectricDamageBoost: `+|VAL|% Шкода Здібностей по ворогам, ураженим Електрикою`,
|
||||
upgrade_WarframeEnergyMax: `+|VAL| Макс. Енергія`,
|
||||
upgrade_WarframeGlobeEffectEnergy: `+|VAL|% Ефективність згустків Енергії`,
|
||||
upgrade_WarframeGlobeEffectHealth: `+|VAL|% Ефективність згустків Здоров'я`,
|
||||
upgrade_WarframeHealthMax: `+|VAL| Макс. Здоров'я`,
|
||||
upgrade_WarframeHPBoostFromImpact: `+|VAL1| Здоров'я при вбивстві з Вибуховою шкодою (Макс. |VAL2| Здоров'я)`,
|
||||
upgrade_WarframeParkourVelocity: `+|VAL|% Швидкість Паркура`,
|
||||
upgrade_WarframeRadiationDamageBoost: `+|VAL|% Шкода Здібностей по ворогам, ураженим Радіацією`,
|
||||
upgrade_WarframeHealthRegen: `+|VAL| Здоров'я в секунду`,
|
||||
upgrade_WarframeShieldMax: `+|VAL| Щиту`,
|
||||
upgrade_WarframeStartingEnergy: `+|VAL|% Енергії при Спавні`,
|
||||
upgrade_WarframeToxinDamage: `+|VAL|% Шкода Токсином`,
|
||||
upgrade_WarframeToxinHeal: `+|VAL| Здоров'я при нанесенні шкоди ворогам з Токсином`,
|
||||
upgrade_WeaponCritBoostFromHeat: `+|VAL1|% Імовірність Критичної Шкоди Допоміжною Зброєю за кожного вбитого ворога, ураженого Термічною шкодою (Макс. |VAL2|%)`,
|
||||
upgrade_AvatarAbilityRange: `+7.5% Досяжність Здібностей`,
|
||||
upgrade_AvatarAbilityEfficiency: `+5% Ощадливість Здібностей`,
|
||||
upgrade_AvatarEnergyRegen: `+0.5 Відновлення Енергії в секунду`,
|
||||
upgrade_AvatarEnemyRadar: `+5m Виявлення ворогів`,
|
||||
upgrade_AvatarLootRadar: `+7m Виявлення здобичі`,
|
||||
upgrade_WeaponAmmoMax: `+15% Макс. Набоїв`,
|
||||
upgrade_EnemyArmorReductionAura: `-3% Захист Ворогів`,
|
||||
upgrade_OnExecutionAmmo: `+100% Заповнення Магазина Основного і Допоміжного Озброєння при вбивстві Милосердям`,
|
||||
upgrade_OnExecutionHealthDrop: `+100% Імовірність Падіння згустка Здоров'я при вбивстві Милосердям`,
|
||||
upgrade_OnExecutionEnergyDrop: `+50% Імовірність Падіння згустка Енергії при вбивстві Милосердям`,
|
||||
upgrade_OnFailHackReset: `+50% Імовірність Повтора Зламу`,
|
||||
upgrade_DamageReductionOnHack: `+75% Зменшення Шкоди під час Зламу`,
|
||||
upgrade_OnExecutionReviveCompanion: `Вбивства Милосердям зменшують час відновлення Компаньйона на 15 секунд`,
|
||||
upgrade_OnExecutionParkourSpeed: `+60% Швидкість Паркура після вбивства Милосердям на 15 секунд`,
|
||||
upgrade_AvatarTimeLimitIncrease: `+8 секунд до Зламу`,
|
||||
upgrade_ElectrifyOnHack: `Шокувати ворогів в межах 20 метрів під час Зламу`,
|
||||
upgrade_OnExecutionTerrify: `+50% Імовірність, що вороги в межах 15 метрів будуть тремтіти від страху протягом 8 секунд після вбивства Милосердям`,
|
||||
upgrade_OnHackLockers: `Відкрити 5 шафок в межах 20 метрів після Зламу`,
|
||||
upgrade_OnExecutionBlind: `Засліпити ворогів в межах 18 метрів після вбивства Милосердям`,
|
||||
upgrade_OnExecutionDrainPower: `Наступне застосування здібності отримує +50% Потужності Здібності після вбивства Милосердям`,
|
||||
upgrade_OnHackSprintSpeed: `+75% Швидкість Бігу протягом 15 секунд після Зламу`,
|
||||
upgrade_SwiftExecute: `+50% Швидкість Вбивства Милосердям`,
|
||||
upgrade_OnHackInvis: `Невидимість протягом 15 секунд після Зламу`,
|
||||
|
||||
damageType_Electricity: `Електричний`,
|
||||
damageType_Fire: `Трммічний`,
|
||||
damageType_Freeze: `Крижаний`,
|
||||
damageType_Impact: `Ударний`,
|
||||
damageType_Magnetic: `Магнетичний`,
|
||||
damageType_Poison: `Токсичний`,
|
||||
damageType_Radiation: `Радіаційний`,
|
||||
|
||||
theme_dark: `Темна тема`,
|
||||
theme_light: `Світла тема`,
|
||||
|
||||
prettier_sucks_ass: ``
|
||||
};
|
||||
@ -1,16 +1,16 @@
|
||||
// Chinese translation by meb154, bishan178, nyaoouo, qianlishun, CrazyZhang & Corvus
|
||||
// Chinese translation by meb154, bishan178, nyaoouo, qianlishun, CrazyZhang, Corvus, & qingchun
|
||||
dict = {
|
||||
general_inventoryUpdateNote: `注意:要在游戏中查看更改,您需要重新同步库存,例如使用引导程序的 /sync 命令、访问道场/中继站或重新登录客户端.`,
|
||||
general_inventoryUpdateNote: `注意: 要在游戏中查看更改,您需要重新同步库存,例如使用客户端的 /sync 命令,访问道场/中继站或重新登录。`,
|
||||
general_addButton: `添加`,
|
||||
general_setButton: `设置`,
|
||||
general_none: `无`,
|
||||
general_bulkActions: `批量操作`,
|
||||
general_loading: `加载中...`,
|
||||
|
||||
code_loginFail: `登录失败.请检查邮箱和密码.`,
|
||||
code_regFail: `注册失败.账号已存在.`,
|
||||
code_loginFail: `登录失败。请检查邮箱和密码。`,
|
||||
code_regFail: `注册失败。账号是否已存在?`,
|
||||
code_changeNameConfirm: `您想将账户名称更改为?`,
|
||||
code_deleteAccountConfirm: `确定要删除账户 |DISPLAYNAME|(|EMAIL|)吗?此操作不可撤销。`,
|
||||
code_deleteAccountConfirm: `确定要删除您的账户 |DISPLAYNAME|(|EMAIL|) 吗?此操作不可撤销。`,
|
||||
code_archgun: `空战`,
|
||||
code_melee: `近战`,
|
||||
code_pistol: `手枪`,
|
||||
@ -23,17 +23,17 @@ dict = {
|
||||
code_kDrive: `K式悬浮板`,
|
||||
code_legendaryCore: `传奇核心`,
|
||||
code_traumaticPeculiar: `创伤怪奇`,
|
||||
code_starter: `|MOD|(有瑕疵的)`,
|
||||
code_starter: `|MOD| (有瑕疵的)`,
|
||||
code_badItem: `(Imposter)`,
|
||||
code_maxRank: `满级`,
|
||||
code_rename: `重命名`,
|
||||
code_renamePrompt: `输入新的自定义名称:`,
|
||||
code_renamePrompt: `输入新的自定义名称:`,
|
||||
code_remove: `移除`,
|
||||
code_addItemsConfirm: `确定要向账户添加|COUNT|件物品吗?`,
|
||||
code_addItemsConfirm: `确定要向您的账户添加 |COUNT| 件物品吗?`,
|
||||
code_succRankUp: `等级已提升`,
|
||||
code_noEquipmentToRankUp: `没有可升级的装备。`,
|
||||
code_succAdded: `已成功添加。`,
|
||||
code_succRemoved: `已成功移除。`,
|
||||
code_noEquipmentToRankUp: `没有可升级的装备`,
|
||||
code_succAdded: `添加成功`,
|
||||
code_succRemoved: `移除成功`,
|
||||
code_buffsNumber: `增益数量`,
|
||||
code_cursesNumber: `负面数量`,
|
||||
code_rerollsNumber: `洗卡次数`,
|
||||
@ -42,12 +42,12 @@ dict = {
|
||||
code_rankUp: `等级提升`,
|
||||
code_rankDown: `等级下降`,
|
||||
code_count: `数量`,
|
||||
code_focusAllUnlocked: `所有专精学派均已解锁。`,
|
||||
code_focusUnlocked: `已解锁|COUNT|个新专精学派!需要游戏内仓库更新才能生效,您可以通过访问星图来触发仓库更新.`,
|
||||
code_addModsConfirm: `确定要向账户添加|COUNT|张MOD吗?`,
|
||||
code_succImport: `导入成功。`,
|
||||
code_succRelog: `完成. 需要重新登录游戏才能看到变化.`,
|
||||
code_nothingToDo: `完成. 没有可执行的操作.`,
|
||||
code_focusAllUnlocked: `所有专精学派均已解锁`,
|
||||
code_focusUnlocked: `已解锁 |COUNT| 个新专精学派!需要游戏内仓库更新才能生效,您可以通过访问星图来触发仓库更新。`,
|
||||
code_addModsConfirm: `确定要向您的账户添加 |COUNT| 张MOD吗?`,
|
||||
code_succImport: `导入成功`,
|
||||
code_succRelog: `完成。需要重新登录游戏才能看到变化。`,
|
||||
code_nothingToDo: `完成。没有可执行的操作。`,
|
||||
code_gild: `镀金`,
|
||||
code_moa: `恐鸟`,
|
||||
code_zanuka: `猎犬`,
|
||||
@ -62,9 +62,9 @@ dict = {
|
||||
code_pigment: `颜料`,
|
||||
code_mature: `成长并战备`,
|
||||
code_unmature: `逆转衰老基因`,
|
||||
code_succChange: `更改成功.`,
|
||||
code_requiredInvigorationUpgrade: `您必须同时选择一个进攻型和一个功能型活化属性.`,
|
||||
login_description: `使用您的 OpenWF 账户凭证登录(与游戏内连接本服务器时使用的昵称相同).`,
|
||||
code_succChange: `更改成功`,
|
||||
code_requiredInvigorationUpgrade: `您必须同时选择一个进攻型和一个功能型活化属性。`,
|
||||
login_description: `使用您的 OpenWF 账户凭证登录(与游戏内连接本服务器时使用的昵称相同)`,
|
||||
login_emailLabel: `电子邮箱`,
|
||||
login_passwordLabel: `密码`,
|
||||
login_loginButton: `登录`,
|
||||
@ -125,7 +125,7 @@ dict = {
|
||||
detailedView_archonShardsDescription: `您可以使用这些无限插槽应用各种强化效果`,
|
||||
detailedView_archonShardsDescription2: `请注意,在加载时,每个执政官源力石都需要一定的时间来生效。`,
|
||||
detailedView_valenceBonusLabel: `效价加成`,
|
||||
detailedView_valenceBonusDescription: `您可以设置或移除武器上的效价加成.`,
|
||||
detailedView_valenceBonusDescription: `您可以设置或移除武器上的效价加成。`,
|
||||
detailedView_modularPartsLabel: `更换部件`,
|
||||
detailedView_suitInvigorationLabel: `编辑战甲活化属性`,
|
||||
detailedView_loadoutLabel: `配置`,
|
||||
@ -168,19 +168,19 @@ dict = {
|
||||
mods_addMissingUnrankedMods: `添加所有缺失的Mods`,
|
||||
mods_removeUnranked: `删除所有未升级的Mods`,
|
||||
mods_addMissingMaxRankMods: `添加所有缺失的满级Mods`,
|
||||
cheats_administratorRequirement: `您必须是管理员才能使用此功能.要成为管理员,请将 <code>|DISPLAYNAME|</code> 添加到 config.json 的 <code>administratorNames</code> 中.`,
|
||||
cheats_administratorRequirement: `您必须是管理员才能使用此功能。要成为管理员,请在 config.json 中将 <code>|DISPLAYNAME|</code> 添加到 <code>administratorNames</code>`,
|
||||
cheats_server: `服务器`,
|
||||
cheats_skipTutorial: `跳过教程`,
|
||||
cheats_skipAllDialogue: `跳过所有对话`,
|
||||
cheats_unlockAllScans: `解锁所有扫描`,
|
||||
cheats_unlockAllMissions: `解锁所有任务`,
|
||||
cheats_unlockAllMissions_ok: `操作成功.请注意,您需要进入道场/中继站或重新登录客户端以刷新星图数据。`,
|
||||
cheats_unlockAllMissions: `解锁所有星图`,
|
||||
cheats_unlockAllMissions_ok: `操作成功。请注意,您需要进入道场/中继站或重新登录以刷新星图数据。`,
|
||||
cheats_infiniteCredits: `无限现金`,
|
||||
cheats_infinitePlatinum: `无限白金`,
|
||||
cheats_infiniteEndo: `无限内融核心`,
|
||||
cheats_infiniteRegalAya: `无限御品阿耶`,
|
||||
cheats_infiniteHelminthMaterials: `无限Helminth材料`,
|
||||
cheats_claimingBlueprintRefundsIngredients: `取消蓝图制造时返还材料`,
|
||||
cheats_claimingBlueprintRefundsIngredients: `蓝图制造完成领取后返还材料`,
|
||||
cheats_dontSubtractPurchaseCreditCost: `购物时不减少现金花费`,
|
||||
cheats_dontSubtractPurchasePlatinumCost: `购物时不减少白金花费`,
|
||||
cheats_dontSubtractPurchaseItemCost: `购物时不减少物品花费`,
|
||||
@ -246,6 +246,20 @@ dict = {
|
||||
worldState_baroTennoConRelay: `Baro的TennoCon中继站`,
|
||||
worldState_starDays: `活动:星日`,
|
||||
worldState_galleonOfGhouls: `战术警报:尸鬼的帆船战舰`,
|
||||
worldState_ghoulEmergence: `尸鬼净化`,
|
||||
worldState_plagueStar: `瘟疫之星`,
|
||||
worldState_dogDays: `三伏天`,
|
||||
worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`,
|
||||
worldState_wolfHunt: `恶狼狩猎 (2025)`,
|
||||
worldState_longShadow: `暗夜长影`,
|
||||
worldState_hallowedFlame: `万圣之焰`,
|
||||
worldState_hallowedNightmares: `万圣噩梦`,
|
||||
worldState_hallowedNightmaresRewards: `[UNTRANSLATED] Hallowed Nightmares Rewards`,
|
||||
worldState_proxyRebellion: `机械叛乱`,
|
||||
worldState_proxyRebellionRewards: `[UNTRANSLATED] Proxy Rebellion Rewards`,
|
||||
worldState_from_year: `[UNTRANSLATED] from |YEAR|`,
|
||||
worldState_pre_year: `[UNTRANSLATED] pre |YEAR|`,
|
||||
worldState_incompatibleWith: `[UNTRANSLATED] Incompatible with:`,
|
||||
enabled: `启用`,
|
||||
disabled: `关闭/取消配置`,
|
||||
worldState_we1: `活动阶段:第一周`,
|
||||
@ -289,7 +303,7 @@ dict = {
|
||||
worldState_varziaFullyStocked: `瓦奇娅开启全部库存商品`,
|
||||
worldState_varziaOverride: `瓦奇娅(Prime重生)轮换状态`,
|
||||
|
||||
import_importNote: `您可以在此处提供完整或部分库存响应(客户端表示).支持的所有字段<b>将被覆盖</b>到您的账户中.`,
|
||||
import_importNote: `您可以在此处提供完整或部分库存响应(客户端表示)。支持的所有字段<b>将被覆盖</b>到您的账户中。`,
|
||||
import_submit: `提交`,
|
||||
import_samples: `示例:`,
|
||||
import_samples_maxFocus: `所有专精学派完全精通`,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user