Compare commits

..

No commits in common. "main" and "main" have entirely different histories.
main ... main

44 changed files with 518 additions and 1586 deletions

View File

@ -67,7 +67,6 @@
"resourceBoost": false, "resourceBoost": false,
"tennoLiveRelay": false, "tennoLiveRelay": false,
"wolfHunt": false, "wolfHunt": false,
"orphixVenom": false,
"longShadow": false, "longShadow": false,
"hallowedFlame": false, "hallowedFlame": false,
"hallowedNightmares": false, "hallowedNightmares": false,
@ -80,10 +79,6 @@
"starDaysOverride": null, "starDaysOverride": null,
"dogDaysOverride": null, "dogDaysOverride": null,
"dogDaysRewardsOverride": null, "dogDaysRewardsOverride": null,
"bellyOfTheBeast": false,
"bellyOfTheBeastProgressOverride": 0,
"eightClaw": false,
"eightClawProgressOverride": 0,
"eidolonOverride": "", "eidolonOverride": "",
"vallisOverride": "", "vallisOverride": "",
"duviriOverride": "", "duviriOverride": "",

8
package-lock.json generated
View File

@ -23,7 +23,7 @@
"ncp": "^2.0.0", "ncp": "^2.0.0",
"typescript": "^5.5", "typescript": "^5.5",
"undici": "^7.10.0", "undici": "^7.10.0",
"warframe-public-export-plus": "^0.5.81", "warframe-public-export-plus": "^0.5.80",
"warframe-riven-info": "^0.1.2", "warframe-riven-info": "^0.1.2",
"winston": "^3.17.0", "winston": "^3.17.0",
"winston-daily-rotate-file": "^5.0.0", "winston-daily-rotate-file": "^5.0.0",
@ -5507,9 +5507,9 @@
} }
}, },
"node_modules/warframe-public-export-plus": { "node_modules/warframe-public-export-plus": {
"version": "0.5.81", "version": "0.5.80",
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.81.tgz", "resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.80.tgz",
"integrity": "sha512-kh3e21XThVDSwdC3TJsMsXZnlZ4B/21HdeJkKcjuTygpCd842EPEKS3lRZl3mpXFOmdha744vAW1XEyHfiLofg==" "integrity": "sha512-K5f1Ws3szVdnO0tBcxlNdhXoGHIw09cjHel7spKPGL7aF/vmEkbBGRmYQFvs8n5cGo+v+3qIDMre54Ghb3t0Iw=="
}, },
"node_modules/warframe-riven-info": { "node_modules/warframe-riven-info": {
"version": "0.1.2", "version": "0.1.2",

View File

@ -40,7 +40,7 @@
"ncp": "^2.0.0", "ncp": "^2.0.0",
"typescript": "^5.5", "typescript": "^5.5",
"undici": "^7.10.0", "undici": "^7.10.0",
"warframe-public-export-plus": "^0.5.81", "warframe-public-export-plus": "^0.5.80",
"warframe-riven-info": "^0.1.2", "warframe-riven-info": "^0.1.2",
"winston": "^3.17.0", "winston": "^3.17.0",
"winston-daily-rotate-file": "^5.0.0", "winston-daily-rotate-file": "^5.0.0",

View File

@ -102,10 +102,7 @@ export const claimCompletedRecipeController: RequestHandler = async (req, res) =
const secondsElapsed = Math.trunc(Date.now() / 1000) - start; const secondsElapsed = Math.trunc(Date.now() / 1000) - start;
const progress = secondsElapsed / recipe.buildTime; const progress = secondsElapsed / recipe.buildTime;
logger.debug(`rushing recipe at ${Math.trunc(progress * 100)}% completion`); logger.debug(`rushing recipe at ${Math.trunc(progress * 100)}% completion`);
const cost = const cost = Math.round(recipe.skipBuildTimePrice * (1 - (progress - 0.5)));
progress > 0.5
? Math.round(recipe.skipBuildTimePrice * (1 - (progress - 0.5)))
: recipe.skipBuildTimePrice;
InventoryChanges = { InventoryChanges = {
...InventoryChanges, ...InventoryChanges,
...updateCurrency(inventory, cost, true) ...updateCurrency(inventory, cost, true)

View File

@ -72,7 +72,7 @@ export const dronesController: RequestHandler = async (req, res) => {
); );
} }
} else { } else {
drone.ResourceCount = droneMeta.binCapacity * droneMeta.capacityMultipliers[resource.Rarity]; drone.ResourceCount = 1;
} }
await inventory.save(); await inventory.save();
res.json({}); res.json({});

View File

@ -1,26 +0,0 @@
import { RequestHandler } from "express";
import { getAccountForRequest } from "@/src/services/loginService";
import { getInventory } from "@/src/services/inventoryService";
import { Guild } from "@/src/models/guildModel";
export const getGuildEventScoreController: RequestHandler = async (req, res) => {
const account = await getAccountForRequest(req);
const inventory = await getInventory(account._id.toString(), "GuildId");
const guild = await Guild.findById(inventory.GuildId);
const goalId = req.query.goalId as string;
if (guild && guild.GoalProgress && goalId) {
const goal = guild.GoalProgress.find(x => x.goalId.toString() == goalId);
if (goal) {
res.json({
Tier: guild.Tier,
GoalProgress: {
Count: goal.Count,
Tag: goal.Tag,
_id: { $oid: goal.goalId }
}
});
return;
}
}
res.json({});
};

View File

@ -12,7 +12,7 @@ export const hubBlessingController: RequestHandler = async (req, res) => {
if (req.query.mode == "send") { if (req.query.mode == "send") {
const inventory = await getInventory(accountId, "BlessingCooldown Boosters"); const inventory = await getInventory(accountId, "BlessingCooldown Boosters");
inventory.BlessingCooldown = new Date(Date.now() + 86400000); inventory.BlessingCooldown = new Date(Date.now() + 86400000);
addBooster(boosterType, 3 * 3600, inventory); // unfaithful, but current HUB server does not handle broadcasting, so this way users can bless themselves. addBooster(boosterType, 3 * 3600, inventory);
await inventory.save(); await inventory.save();
let token = ""; let token = "";

View File

@ -1,19 +1,23 @@
import { getAccountIdForRequest } from "@/src/services/loginService"; import { getAccountIdForRequest } from "@/src/services/loginService";
import { ISetPlacedDecoInfoRequest } from "@/src/types/personalRoomsTypes"; import { IPictureFrameInfo, ISetPlacedDecoInfoRequest } from "@/src/types/personalRoomsTypes";
import { RequestHandler } from "express"; import { RequestHandler } from "express";
import { handleSetPlacedDecoInfo } from "@/src/services/shipCustomizationsService"; import { handleSetPlacedDecoInfo } from "@/src/services/shipCustomizationsService";
export const setPlacedDecoInfoController: RequestHandler = async (req, res) => { export const setPlacedDecoInfoController: RequestHandler = async (req, res) => {
const accountId = await getAccountIdForRequest(req); const accountId = await getAccountIdForRequest(req);
const payload = JSON.parse(req.body as string) as ISetPlacedDecoInfoRequest; const payload = JSON.parse(req.body as string) as ISetPlacedDecoInfoRequest;
//console.log(JSON.stringify(payload, null, 2));
await handleSetPlacedDecoInfo(accountId, payload); await handleSetPlacedDecoInfo(accountId, payload);
res.json({ res.json({
...payload, DecoId: payload.DecoId,
IsPicture: !!payload.PictureFrameInfo IsPicture: true,
PictureFrameInfo: payload.PictureFrameInfo,
BootLocation: payload.BootLocation
} satisfies ISetPlacedDecoInfoResponse); } satisfies ISetPlacedDecoInfoResponse);
}; };
interface ISetPlacedDecoInfoResponse extends ISetPlacedDecoInfoRequest { interface ISetPlacedDecoInfoResponse {
DecoId: string;
IsPicture: boolean; IsPicture: boolean;
PictureFrameInfo?: IPictureFrameInfo;
BootLocation?: string;
} }

View File

@ -1,10 +1,8 @@
import { importInventory, importLoadOutPresets, importPersonalRooms } from "@/src/services/importService"; import { importInventory, importLoadOutPresets } from "@/src/services/importService";
import { getInventory } from "@/src/services/inventoryService"; import { getInventory } from "@/src/services/inventoryService";
import { getLoadout } from "@/src/services/loadoutService"; import { getLoadout } from "@/src/services/loadoutService";
import { getAccountIdForRequest } from "@/src/services/loginService"; import { getAccountIdForRequest } from "@/src/services/loginService";
import { getPersonalRooms } from "@/src/services/personalRoomsService";
import { IInventoryClient } from "@/src/types/inventoryTypes/inventoryTypes"; import { IInventoryClient } from "@/src/types/inventoryTypes/inventoryTypes";
import { IGetShipResponse } from "@/src/types/personalRoomsTypes";
import { RequestHandler } from "express"; import { RequestHandler } from "express";
export const importController: RequestHandler = async (req, res) => { export const importController: RequestHandler = async (req, res) => {
@ -15,21 +13,15 @@ export const importController: RequestHandler = async (req, res) => {
importInventory(inventory, request.inventory); importInventory(inventory, request.inventory);
await inventory.save(); await inventory.save();
if ("LoadOutPresets" in request.inventory && request.inventory.LoadOutPresets) { if (request.inventory.LoadOutPresets) {
const loadout = await getLoadout(accountId); const loadout = await getLoadout(accountId);
importLoadOutPresets(loadout, request.inventory.LoadOutPresets); importLoadOutPresets(loadout, request.inventory.LoadOutPresets);
await loadout.save(); await loadout.save();
} }
if ("Ship" in request.inventory || "Apartment" in request.inventory || "TailorShop" in request.inventory) {
const personalRooms = await getPersonalRooms(accountId);
importPersonalRooms(personalRooms, request.inventory);
await personalRooms.save();
}
res.end(); res.end();
}; };
interface IImportRequest { interface IImportRequest {
inventory: Partial<IInventoryClient> | Partial<IGetShipResponse>; inventory: Partial<IInventoryClient>;
} }

View File

@ -19,8 +19,6 @@ import {
import { Document, Model, model, Schema, Types } from "mongoose"; import { Document, Model, model, Schema, Types } from "mongoose";
import { fusionTreasuresSchema, typeCountSchema } from "@/src/models/inventoryModels/inventoryModel"; import { fusionTreasuresSchema, typeCountSchema } from "@/src/models/inventoryModels/inventoryModel";
import { pictureFrameInfoSchema } from "@/src/models/personalRoomsModel"; import { pictureFrameInfoSchema } from "@/src/models/personalRoomsModel";
import { IGoalProgressClient, IGoalProgressDatabase } from "@/src/types/inventoryTypes/inventoryTypes";
import { toOid } from "@/src/helpers/inventoryHelpers";
const dojoDecoSchema = new Schema<IDojoDecoDatabase>({ const dojoDecoSchema = new Schema<IDojoDecoDatabase>({
Type: String, Type: String,
@ -176,28 +174,6 @@ const guildLogEntryNumberSchema = new Schema<IGuildLogEntryNumber>(
{ _id: false } { _id: false }
); );
const goalProgressSchema = new Schema<IGoalProgressDatabase>(
{
Count: Number,
Tag: String,
goalId: Types.ObjectId
},
{ _id: false }
);
goalProgressSchema.set("toJSON", {
virtuals: true,
transform(_doc, obj: Record<string, any>) {
const db = obj as IGoalProgressDatabase;
const client = obj as IGoalProgressClient;
client._id = toOid(db.goalId);
delete obj.goalId;
delete obj.__v;
}
});
const guildSchema = new Schema<IGuildDatabase>( const guildSchema = new Schema<IGuildDatabase>(
{ {
Name: { type: String, required: true, unique: true }, Name: { type: String, required: true, unique: true },
@ -230,8 +206,7 @@ const guildSchema = new Schema<IGuildDatabase>(
RoomChanges: { type: [guildLogRoomChangeSchema], default: undefined }, RoomChanges: { type: [guildLogRoomChangeSchema], default: undefined },
TechChanges: { type: [guildLogEntryContributableSchema], default: undefined }, TechChanges: { type: [guildLogEntryContributableSchema], default: undefined },
RosterActivity: { type: [guildLogEntryRosterSchema], default: undefined }, RosterActivity: { type: [guildLogEntryRosterSchema], default: undefined },
ClassChanges: { type: [guildLogEntryNumberSchema], default: undefined }, ClassChanges: { type: [guildLogEntryNumberSchema], default: undefined }
GoalProgress: { type: [goalProgressSchema], default: undefined }
}, },
{ id: false } { id: false }
); );

View File

@ -85,8 +85,8 @@ import {
IAccolades, IAccolades,
IHubNpcCustomization, IHubNpcCustomization,
IEndlessXpReward, IEndlessXpReward,
IGoalProgressDatabase, IPersonalGoalProgressDatabase,
IGoalProgressClient, IPersonalGoalProgressClient,
IKubrowPetPrintClient, IKubrowPetPrintClient,
IKubrowPetPrintDatabase IKubrowPetPrintDatabase
} from "@/src/types/inventoryTypes/inventoryTypes"; } from "@/src/types/inventoryTypes/inventoryTypes";
@ -445,7 +445,7 @@ const discoveredMarkerSchema = new Schema<IDiscoveredMarker>(
{ _id: false } { _id: false }
); );
const personalGoalProgressSchema = new Schema<IGoalProgressDatabase>( const personalGoalProgressSchema = new Schema<IPersonalGoalProgressDatabase>(
{ {
Best: Number, Best: Number,
Count: Number, Count: Number,
@ -458,8 +458,8 @@ const personalGoalProgressSchema = new Schema<IGoalProgressDatabase>(
personalGoalProgressSchema.set("toJSON", { personalGoalProgressSchema.set("toJSON", {
virtuals: true, virtuals: true,
transform(_doc, obj: Record<string, any>) { transform(_doc, obj: Record<string, any>) {
const db = obj as IGoalProgressDatabase; const db = obj as IPersonalGoalProgressDatabase;
const client = obj as IGoalProgressClient; const client = obj as IPersonalGoalProgressClient;
client._id = toOid(db.goalId); client._id = toOid(db.goalId);

View File

@ -25,7 +25,7 @@ export const EquipmentSelectionSchema = new Schema<IEquipmentSelection>(
} }
); );
export const loadoutConfigSchema = new Schema<ILoadoutConfigDatabase>( const loadoutConfigSchema = new Schema<ILoadoutConfigDatabase>(
{ {
FocusSchool: String, FocusSchool: String,
PresetIcon: String, PresetIcon: String,

View File

@ -8,7 +8,7 @@ const leaderboardEntrySchema = new Schema<ILeaderboardEntryDatabase>(
displayName: { type: String, required: true }, displayName: { type: String, required: true },
score: { type: Number, required: true }, score: { type: Number, required: true },
guildId: Schema.Types.ObjectId, guildId: Schema.Types.ObjectId,
expiry: Date, expiry: { type: Date, required: true },
guildTier: Number guildTier: Number
}, },
{ id: false } { id: false }

View File

@ -1,7 +1,6 @@
import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers"; import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers";
import { import {
IApartmentDatabase, IApartmentDatabase,
ICustomizationInfoDatabase,
IFavouriteLoadoutDatabase, IFavouriteLoadoutDatabase,
IGardeningDatabase, IGardeningDatabase,
IOrbiterClient, IOrbiterClient,
@ -12,13 +11,12 @@ import {
IPlantClient, IPlantClient,
IPlantDatabase, IPlantDatabase,
IPlanterDatabase, IPlanterDatabase,
IRoomDatabase, IRoom,
ITailorShopDatabase, ITailorShopDatabase,
PersonalRoomsModelType PersonalRoomsModelType
} from "@/src/types/personalRoomsTypes"; } from "@/src/types/personalRoomsTypes";
import { Schema, Types, model } from "mongoose"; import { Schema, Types, model } from "mongoose";
import { colorSchema, shipCustomizationSchema } from "@/src/models/commonModel"; import { colorSchema, shipCustomizationSchema } from "@/src/models/commonModel";
import { loadoutConfigSchema } from "@/src/models/inventoryModels/loadoutModel";
export const pictureFrameInfoSchema = new Schema<IPictureFrameInfo>( export const pictureFrameInfoSchema = new Schema<IPictureFrameInfo>(
{ {
@ -36,20 +34,7 @@ export const pictureFrameInfoSchema = new Schema<IPictureFrameInfo>(
TextColorB: Number, TextColorB: Number,
TextOrientation: Number TextOrientation: Number
}, },
{ _id: false } { id: false, _id: false }
);
export const customizationInfoSchema = new Schema<ICustomizationInfoDatabase>(
{
Anim: String,
AnimPose: Number,
LoadOutPreset: loadoutConfigSchema,
VehiclePreset: loadoutConfigSchema,
EquippedWeapon: String,
AvatarType: String,
LoadOutType: String
},
{ _id: false }
); );
const placedDecosSchema = new Schema<IPlacedDecosDatabase>( const placedDecosSchema = new Schema<IPlacedDecosDatabase>(
@ -59,9 +44,7 @@ const placedDecosSchema = new Schema<IPlacedDecosDatabase>(
Rot: [Number], Rot: [Number],
Scale: Number, Scale: Number,
Sockets: Number, Sockets: Number,
PictureFrameInfo: { type: pictureFrameInfoSchema, default: undefined }, PictureFrameInfo: { type: pictureFrameInfoSchema, default: undefined }
CustomizationInfo: { type: customizationInfoSchema, default: undefined },
AnimPoseItem: String
}, },
{ id: false } { id: false }
); );
@ -77,7 +60,7 @@ placedDecosSchema.set("toJSON", {
} }
}); });
const roomSchema = new Schema<IRoomDatabase>( const roomSchema = new Schema<IRoom>(
{ {
Name: String, Name: String,
MaxCapacity: Number, MaxCapacity: Number,

View File

@ -97,19 +97,7 @@ const statsSchema = new Schema<IStatsDatabase>({
SentinelGameScore: Number, SentinelGameScore: Number,
CaliberChicksScore: Number, CaliberChicksScore: Number,
OlliesCrashCourseScore: Number, OlliesCrashCourseScore: Number,
DojoObstacleScore: Number, DojoObstacleScore: Number
Halloween16: Number,
AmalgamEventScoreMax: Number,
Halloween19ScoreMax: Number,
FlotillaEventScore: Number,
FlotillaSpaceBadgesTier1: Number,
FlotillaSpaceBadgesTier2: Number,
FlotillaSpaceBadgesTier3: Number,
FlotillaGroundBadgesTier1: Number,
FlotillaGroundBadgesTier2: Number,
FlotillaGroundBadgesTier3: Number,
MechSurvivalScoreMax: Number
}); });
statsSchema.set("toJSON", { statsSchema.set("toJSON", {

View File

@ -62,7 +62,6 @@ import { getFriendsController } from "@/src/controllers/api/getFriendsController
import { getGuildContributionsController } from "@/src/controllers/api/getGuildContributionsController"; import { getGuildContributionsController } from "@/src/controllers/api/getGuildContributionsController";
import { getGuildController } from "@/src/controllers/api/getGuildController"; import { getGuildController } from "@/src/controllers/api/getGuildController";
import { getGuildDojoController } from "@/src/controllers/api/getGuildDojoController"; import { getGuildDojoController } from "@/src/controllers/api/getGuildDojoController";
import { getGuildEventScoreController } from "@/src/controllers/api/getGuildEventScoreController";
import { getGuildLogController } from "@/src/controllers/api/getGuildLogController"; import { getGuildLogController } from "@/src/controllers/api/getGuildLogController";
import { getIgnoredUsersController } from "@/src/controllers/api/getIgnoredUsersController"; import { getIgnoredUsersController } from "@/src/controllers/api/getIgnoredUsersController";
import { getNewRewardSeedController } from "@/src/controllers/api/getNewRewardSeedController"; import { getNewRewardSeedController } from "@/src/controllers/api/getNewRewardSeedController";
@ -193,7 +192,6 @@ apiRouter.get("/getFriends.php", getFriendsController);
apiRouter.get("/getGuild.php", getGuildController); apiRouter.get("/getGuild.php", getGuildController);
apiRouter.get("/getGuildContributions.php", getGuildContributionsController); apiRouter.get("/getGuildContributions.php", getGuildContributionsController);
apiRouter.get("/getGuildDojo.php", getGuildDojoController); apiRouter.get("/getGuildDojo.php", getGuildDojoController);
apiRouter.get("/getGuildEventScore.php", getGuildEventScoreController);
apiRouter.get("/getGuildLog.php", getGuildLogController); apiRouter.get("/getGuildLog.php", getGuildLogController);
apiRouter.get("/getIgnoredUsers.php", getIgnoredUsersController); apiRouter.get("/getIgnoredUsers.php", getIgnoredUsersController);
apiRouter.get("/getMessages.php", inboxController); // unsure if this is correct, but needed for U17 apiRouter.get("/getMessages.php", inboxController); // unsure if this is correct, but needed for U17

View File

@ -8,6 +8,5 @@ const statsRouter = express.Router();
statsRouter.get("/view.php", viewController); statsRouter.get("/view.php", viewController);
statsRouter.post("/upload.php", uploadController); statsRouter.post("/upload.php", uploadController);
statsRouter.post("/leaderboardWeekly.php", leaderboardController); statsRouter.post("/leaderboardWeekly.php", leaderboardController);
statsRouter.post("/leaderboardArchived.php", leaderboardController);
export { statsRouter }; export { statsRouter };

View File

@ -79,7 +79,6 @@ export interface IConfig {
tennoLiveRelay?: boolean; tennoLiveRelay?: boolean;
baroTennoConRelay?: boolean; baroTennoConRelay?: boolean;
wolfHunt?: boolean; wolfHunt?: boolean;
orphixVenom?: boolean;
longShadow?: boolean; longShadow?: boolean;
hallowedFlame?: boolean; hallowedFlame?: boolean;
hallowedNightmares?: boolean; hallowedNightmares?: boolean;
@ -92,10 +91,6 @@ export interface IConfig {
starDaysOverride?: boolean; starDaysOverride?: boolean;
dogDaysOverride?: boolean; dogDaysOverride?: boolean;
dogDaysRewardsOverride?: number; dogDaysRewardsOverride?: number;
bellyOfTheBeast?: boolean;
bellyOfTheBeastProgressOverride?: number;
eightClaw?: boolean;
eightClawProgressOverride?: number;
eidolonOverride?: string; eidolonOverride?: string;
vallisOverride?: string; vallisOverride?: string;
duviriOverride?: string; duviriOverride?: string;

View File

@ -115,14 +115,7 @@ export const getGuildClient = async (
NumContributors: guild.CeremonyContributors?.length ?? 0, NumContributors: guild.CeremonyContributors?.length ?? 0,
CeremonyResetDate: guild.CeremonyResetDate ? toMongoDate(guild.CeremonyResetDate) : undefined, CeremonyResetDate: guild.CeremonyResetDate ? toMongoDate(guild.CeremonyResetDate) : undefined,
AutoContributeFromVault: guild.AutoContributeFromVault, AutoContributeFromVault: guild.AutoContributeFromVault,
AllianceId: guild.AllianceId ? toOid2(guild.AllianceId, account.BuildLabel) : undefined, AllianceId: guild.AllianceId ? toOid2(guild.AllianceId, account.BuildLabel) : undefined
GoalProgress: guild.GoalProgress
? guild.GoalProgress.map(gp => ({
Count: gp.Count,
Tag: gp.Tag,
_id: { $oid: gp.goalId.toString() }
}))
: undefined
}; };
}; };
@ -816,100 +809,3 @@ export const getAllianceClient = async (
} }
}; };
}; };
export const handleGuildGoalProgress = async (
guild: TGuildDatabaseDocument,
upload: { Count: number; Tag: string; goalId: Types.ObjectId }
): Promise<void> => {
guild.GoalProgress ??= [];
const goalProgress = guild.GoalProgress.find(x => x.goalId.equals(upload.goalId));
if (!goalProgress) {
guild.GoalProgress.push({
Count: upload.Count,
Tag: upload.Tag,
goalId: upload.goalId
});
}
const totalCount = (goalProgress?.Count ?? 0) + upload.Count;
const guildRewards = goalGuildRewardByTag[upload.Tag].rewards;
const tierGoals = goalGuildRewardByTag[upload.Tag].guildGoals[guild.Tier - 1];
const rewards = [];
if (tierGoals.length && guildRewards.length) {
for (let i = 0; i < tierGoals.length; i++) {
if (
tierGoals[i] &&
tierGoals[i] <= totalCount &&
(!goalProgress || goalProgress.Count < tierGoals[i]) &&
guildRewards[i]
) {
rewards.push(guildRewards[i]);
}
}
if (rewards.length) {
logger.debug(`guild goal rewards`, rewards);
guild.VaultDecoRecipes ??= [];
rewards.forEach(type => {
guild.VaultDecoRecipes!.push({
ItemType: type,
ItemCount: 1
});
});
}
}
if (goalProgress) {
goalProgress.Count += upload.Count;
}
await guild.save();
};
export const goalGuildRewardByTag: Record<string, { guildGoals: number[][]; rewards: string[] }> = {
JadeShadowsEvent: {
guildGoals: [
// I don't know what ClanGoal means
[15, 30, 45, 60],
[45, 90, 135, 180],
[150, 300, 450, 600],
[450, 900, 1350, 1800],
[1500, 3000, 4500, 6000]
],
rewards: [
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/JadeShadowsEventPewterTrophyRecipe",
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/JadeShadowsEventBronzeTrophyRecipe",
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/JadeShadowsEventSilverTrophyRecipe",
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/JadeShadowsEventGoldTrophyRecipe"
]
},
DuviriMurmurEvent: {
guildGoals: [
// I don't know what ClanGoal means
[260, 519, 779, 1038],
[779, 1557, 2336, 3114],
[2595, 5190, 7785, 10380],
[7785, 15570, 23355, 31140],
[29950, 51900, 77850, 103800]
],
rewards: [
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/DuviriMurmurEventClayTrophyRecipe",
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/DuviriMurmurEventBronzeTrophyRecipe",
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/DuviriMurmurEventSilverTrophyRecipe",
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/DuviriMurmurEventGoldTrophyRecipe"
]
},
MechSurvival: {
guildGoals: [
[1390, 5860, 13920, 18850],
[3510, 22275, 69120, 137250],
[11700, 75250, 230400, 457500],
[35100, 222750, 691200, 1372500],
[117000, 742500, 2304000, 4575000]
],
rewards: [
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/MechEventTrophyTerracottaRecipe",
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/MechEventTrophyBronzeRecipe",
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/MechEventTrophySilverRecipe",
"/Lotus/Levels/ClanDojo/ComponentPropRecipes/MechEventTrophyGoldRecipe"
]
}
};

View File

@ -44,28 +44,6 @@ import {
IKubrowPetDetailsClient, IKubrowPetDetailsClient,
IKubrowPetDetailsDatabase IKubrowPetDetailsDatabase
} from "@/src/types/equipmentTypes"; } from "@/src/types/equipmentTypes";
import {
IApartmentClient,
IApartmentDatabase,
ICustomizationInfoClient,
ICustomizationInfoDatabase,
IFavouriteLoadout,
IFavouriteLoadoutDatabase,
IGetShipResponse,
IOrbiterClient,
IOrbiterDatabase,
IPersonalRoomsDatabase,
IPlacedDecosClient,
IPlacedDecosDatabase,
IPlantClient,
IPlantDatabase,
IPlanterClient,
IPlanterDatabase,
IRoomClient,
IRoomDatabase,
ITailorShop,
ITailorShopDatabase
} from "@/src/types/personalRoomsTypes";
const convertDate = (value: IMongoDate): Date => { const convertDate = (value: IMongoDate): Date => {
return new Date(parseInt(value.$date.$numberLong)); return new Date(parseInt(value.$date.$numberLong));
@ -451,84 +429,3 @@ export const importLoadOutPresets = (db: ILoadoutDatabase, client: ILoadOutPrese
db.OPERATOR_ADULT = client.OPERATOR_ADULT.map(convertLoadOutConfig); db.OPERATOR_ADULT = client.OPERATOR_ADULT.map(convertLoadOutConfig);
db.DRIFTER = client.DRIFTER.map(convertLoadOutConfig); db.DRIFTER = client.DRIFTER.map(convertLoadOutConfig);
}; };
export const convertCustomizationInfo = (client: ICustomizationInfoClient): ICustomizationInfoDatabase => {
return {
...client,
LoadOutPreset: client.LoadOutPreset ? convertLoadOutConfig(client.LoadOutPreset) : undefined,
VehiclePreset: client.VehiclePreset ? convertLoadOutConfig(client.VehiclePreset) : undefined
};
};
const convertDeco = (client: IPlacedDecosClient): IPlacedDecosDatabase => {
const { id, ...rest } = client;
return {
...rest,
CustomizationInfo: client.CustomizationInfo ? convertCustomizationInfo(client.CustomizationInfo) : undefined,
_id: new Types.ObjectId(id.$oid)
};
};
const convertRoom = (client: IRoomClient): IRoomDatabase => {
return {
...client,
PlacedDecos: client.PlacedDecos ? client.PlacedDecos.map(convertDeco) : []
};
};
const convertShip = (client: IOrbiterClient): IOrbiterDatabase => {
return {
...client,
ShipInterior: {
...client.ShipInterior,
Colors: Array.isArray(client.ShipInterior.Colors) ? {} : client.ShipInterior.Colors
},
Rooms: client.Rooms.map(convertRoom),
FavouriteLoadoutId: client.FavouriteLoadoutId ? new Types.ObjectId(client.FavouriteLoadoutId.$oid) : undefined
};
};
const convertPlant = (client: IPlantClient): IPlantDatabase => {
return {
...client,
EndTime: convertDate(client.EndTime)
};
};
const convertPlanter = (client: IPlanterClient): IPlanterDatabase => {
return {
...client,
Plants: client.Plants.map(convertPlant)
};
};
const convertFavouriteLoadout = (client: IFavouriteLoadout): IFavouriteLoadoutDatabase => {
return {
...client,
LoadoutId: new Types.ObjectId(client.LoadoutId.$oid)
};
};
const convertApartment = (client: IApartmentClient): IApartmentDatabase => {
return {
...client,
Rooms: client.Rooms.map(convertRoom),
Gardening: { Planters: client.Gardening.Planters.map(convertPlanter) },
FavouriteLoadouts: client.FavouriteLoadouts ? client.FavouriteLoadouts.map(convertFavouriteLoadout) : []
};
};
const convertTailorShop = (client: ITailorShop): ITailorShopDatabase => {
return {
...client,
Rooms: client.Rooms.map(convertRoom),
Colors: Array.isArray(client.Colors) ? {} : client.Colors,
FavouriteLoadouts: client.FavouriteLoadouts ? client.FavouriteLoadouts.map(convertFavouriteLoadout) : []
};
};
export const importPersonalRooms = (db: IPersonalRoomsDatabase, client: Partial<IGetShipResponse>): void => {
if (client.Ship !== undefined) db.Ship = convertShip(client.Ship);
if (client.Apartment !== undefined) db.Apartment = convertApartment(client.Apartment);
if (client.TailorShop !== undefined) db.TailorShop = convertTailorShop(client.TailorShop);
};

View File

@ -847,32 +847,6 @@ export const addItem = async (
return addMotorcycle(inventory, typeName); return addMotorcycle(inventory, typeName);
} }
break; break;
case "Lore":
if (typeName == "/Lotus/Types/Lore/Fragments/GrineerGhoulFragments/GhoulFragmentRewards") {
const fragmentType = getRandomElement([
"/Lotus/Types/Lore/Fragments/GrineerGhoulFragments/GhoulFragmentA",
"/Lotus/Types/Lore/Fragments/GrineerGhoulFragments/GhoulFragmentB",
"/Lotus/Types/Lore/Fragments/GrineerGhoulFragments/GhoulFragmentC",
"/Lotus/Types/Lore/Fragments/GrineerGhoulFragments/GhoulFragmentD",
"/Lotus/Types/Lore/Fragments/GrineerGhoulFragments/GhoulFragmentE",
"/Lotus/Types/Lore/Fragments/GrineerGhoulFragments/GhoulFragmentF",
"/Lotus/Types/Lore/Fragments/GrineerGhoulFragments/GhoulFragmentG",
"/Lotus/Types/Lore/Fragments/GrineerGhoulFragments/GhoulFragmentH",
"/Lotus/Types/Lore/Fragments/GrineerGhoulFragments/GhoulFragmentI",
"/Lotus/Types/Lore/Fragments/GrineerGhoulFragments/GhoulFragmentJ",
"/Lotus/Types/Lore/Fragments/GrineerGhoulFragments/GhoulFragmentK",
"/Lotus/Types/Lore/Fragments/GrineerGhoulFragments/GhoulFragmentL",
"/Lotus/Types/Lore/Fragments/GrineerGhoulFragments/GhoulFragmentM"
])!;
addLoreFragmentScans(inventory, [
{
Progress: 1,
Region: "",
ItemType: fragmentType
}
]);
}
break;
} }
break; break;
} }

View File

@ -1,66 +1,38 @@
import { Guild } from "@/src/models/guildModel"; import { Guild } from "@/src/models/guildModel";
import { Leaderboard, TLeaderboardEntryDocument } from "@/src/models/leaderboardModel"; import { Leaderboard, TLeaderboardEntryDocument } from "@/src/models/leaderboardModel";
import { ILeaderboardEntryClient } from "@/src/types/leaderboardTypes"; import { ILeaderboardEntryClient } from "@/src/types/leaderboardTypes";
import { handleGuildGoalProgress } from "@/src/services/guildService";
import { getWorldState } from "@/src/services/worldStateService";
import { Types } from "mongoose";
export const submitLeaderboardScore = async ( export const submitLeaderboardScore = async (
schedule: "weekly" | "daily" | "events", schedule: "weekly" | "daily",
leaderboard: string, leaderboard: string,
ownerId: string, ownerId: string,
displayName: string, displayName: string,
score: number, score: number,
guildId: string | undefined guildId: string | undefined
): Promise<void> => { ): Promise<void> => {
let expiry: Date | undefined; let expiry: Date;
if (schedule == "daily") { if (schedule == "daily") {
expiry = new Date(Math.trunc(Date.now() / 86400000) * 86400000 + 86400000); expiry = new Date(Math.trunc(Date.now() / 86400000) * 86400000 + 86400000);
} else if (schedule == "weekly") { } else {
const EPOCH = 1734307200 * 1000; // Monday const EPOCH = 1734307200 * 1000; // Monday
const week = Math.trunc((Date.now() - EPOCH) / 604800000); const week = Math.trunc((Date.now() - EPOCH) / 604800000);
const weekStart = EPOCH + week * 604800000; const weekStart = EPOCH + week * 604800000;
const weekEnd = weekStart + 604800000; const weekEnd = weekStart + 604800000;
expiry = new Date(weekEnd); expiry = new Date(weekEnd);
} }
if (guildId) {
const guild = (await Guild.findById(guildId, "Name Tier GoalProgress VaultDecoRecipes"))!;
if (schedule == "events") {
const prevAccount = await Leaderboard.findOne(
{ leaderboard: `${schedule}.accounts.${leaderboard}`, ownerId },
"score"
);
const delta = score - (prevAccount?.score ?? 0);
if (delta > 0) {
await Leaderboard.findOneAndUpdate(
{ leaderboard: `${schedule}.guilds.${leaderboard}`, ownerId: guildId },
{ $inc: { score: delta }, $set: { displayName: guild.Name, guildTier: guild.Tier } },
{ upsert: true }
);
const goal = getWorldState().Goals.find(x => x.ScoreMaxTag == leaderboard);
if (goal) {
await handleGuildGoalProgress(guild, {
Count: delta,
Tag: goal.Tag,
goalId: new Types.ObjectId(goal._id.$oid)
});
}
}
} else {
await Leaderboard.findOneAndUpdate(
{ leaderboard: `${schedule}.guilds.${leaderboard}`, ownerId: guildId },
{ $max: { score }, $set: { displayName: guild.Name, guildTier: guild.Tier, expiry } },
{ upsert: true, new: true }
);
}
}
await Leaderboard.findOneAndUpdate( await Leaderboard.findOneAndUpdate(
{ leaderboard: `${schedule}.accounts.${leaderboard}`, ownerId }, { leaderboard: `${schedule}.accounts.${leaderboard}`, ownerId },
{ $max: { score }, $set: { displayName, guildId, expiry } }, { $max: { score }, $set: { displayName, guildId, expiry } },
{ upsert: true } { upsert: true }
); );
if (guildId) {
const guild = (await Guild.findById(guildId, "Name Tier"))!;
await Leaderboard.findOneAndUpdate(
{ leaderboard: `${schedule}.guilds.${leaderboard}`, ownerId: guildId },
{ $max: { score }, $set: { displayName: guild.Name, guildTier: guild.Tier, expiry } },
{ upsert: true }
);
}
}; };
export const getLeaderboard = async ( export const getLeaderboard = async (
@ -71,7 +43,6 @@ export const getLeaderboard = async (
guildId: string | undefined, guildId: string | undefined,
guildTier: number | undefined guildTier: number | undefined
): Promise<ILeaderboardEntryClient[]> => { ): Promise<ILeaderboardEntryClient[]> => {
leaderboard = leaderboard.replace("archived", guildTier || guildId ? "events.guilds" : "events.accounts");
const filter: { leaderboard: string; guildId?: string; guildTier?: number } = { leaderboard }; const filter: { leaderboard: string; guildId?: string; guildTier?: number } = { leaderboard };
if (guildId) { if (guildId) {
filter.guildId = guildId; filter.guildId = guildId;

View File

@ -81,8 +81,6 @@ import { fromOid } from "@/src/helpers/inventoryHelpers";
import { TAccountDocument } from "@/src/services/loginService"; import { TAccountDocument } from "@/src/services/loginService";
import { ITypeCount } from "@/src/types/commonTypes"; import { ITypeCount } from "@/src/types/commonTypes";
import { IEquipmentClient } from "@/src/types/equipmentTypes"; import { IEquipmentClient } from "@/src/types/equipmentTypes";
import { Guild } from "@/src/models/guildModel";
import { handleGuildGoalProgress } from "@/src/services/guildService";
const getRotations = (rewardInfo: IRewardInfo, tierOverride?: number): number[] => { const getRotations = (rewardInfo: IRewardInfo, tierOverride?: number): number[] => {
// Disruption missions just tell us (https://onlyg.it/OpenWF/SpaceNinjaServer/issues/2599) // Disruption missions just tell us (https://onlyg.it/OpenWF/SpaceNinjaServer/issues/2599)
@ -652,12 +650,7 @@ export const addMissionInventoryUpdates = async (
} }
} }
if (currentMissionKey && currentMissionKey in goalMessagesByKey) { if (currentMissionKey && currentMissionKey in goalMessagesByKey) {
let countBeforeUpload = goalProgress?.Count ?? 0; const totalCount = (goalProgress?.Count ?? 0) + uploadProgress.Count;
let totalCount = countBeforeUpload + uploadProgress.Count;
if (goal.Best) {
countBeforeUpload = goalProgress?.Best ?? 0;
totalCount = uploadProgress.Best;
}
let reward; let reward;
if (goal.InterimGoals && goal.InterimRewards) { if (goal.InterimGoals && goal.InterimRewards) {
@ -665,7 +658,7 @@ export const addMissionInventoryUpdates = async (
if ( if (
goal.InterimGoals[i] && goal.InterimGoals[i] &&
goal.InterimGoals[i] <= totalCount && goal.InterimGoals[i] <= totalCount &&
(!goalProgress || countBeforeUpload < goal.InterimGoals[i]) && (!goalProgress || goalProgress.Count < goal.InterimGoals[i]) &&
goal.InterimRewards[i] goal.InterimRewards[i]
) { ) {
reward = goal.InterimRewards[i]; reward = goal.InterimRewards[i];
@ -677,7 +670,7 @@ export const addMissionInventoryUpdates = async (
!reward && !reward &&
goal.Goal && goal.Goal &&
goal.Goal <= totalCount && goal.Goal <= totalCount &&
(!goalProgress || countBeforeUpload < goal.Goal) && (!goalProgress || goalProgress.Count < goal.Goal) &&
goal.Reward goal.Reward
) { ) {
reward = goal.Reward; reward = goal.Reward;
@ -686,7 +679,7 @@ export const addMissionInventoryUpdates = async (
!reward && !reward &&
goal.BonusGoal && goal.BonusGoal &&
goal.BonusGoal <= totalCount && goal.BonusGoal <= totalCount &&
(!goalProgress || countBeforeUpload < goal.BonusGoal) && (!goalProgress || goalProgress.Count < goal.BonusGoal) &&
goal.BonusReward goal.BonusReward
) { ) {
reward = goal.BonusReward; reward = goal.BonusReward;
@ -719,20 +712,10 @@ export const addMissionInventoryUpdates = async (
} }
if (goalProgress) { if (goalProgress) {
goalProgress.Best = Math.max(goalProgress.Best!, uploadProgress.Best); goalProgress.Best = Math.max(goalProgress.Best, uploadProgress.Best);
goalProgress.Count += uploadProgress.Count; goalProgress.Count += uploadProgress.Count;
} }
} }
if (goal && goal.ClanGoal && inventory.GuildId) {
const guild = await Guild.findById(inventory.GuildId, "GoalProgress Tier VaultDecoRecipes");
if (guild) {
await handleGuildGoalProgress(guild, {
Count: uploadProgress.Count,
Tag: goal.Tag,
goalId: new Types.ObjectId(goal._id.$oid)
});
}
}
} }
break; break;
} }
@ -1096,12 +1079,6 @@ export const addMissionRewards = async (
} }
} }
} }
if (rewardInfo.GoalProgressAmount && goal.Tag.startsWith("MechSurvival")) {
MissionRewards.push({
StoreItem: "/Lotus/StoreItems/Types/Items/MiscItems/MechSurvivalEventCreds",
ItemCount: Math.trunc(rewardInfo.GoalProgressAmount / 10)
});
}
} }
} }
@ -1320,27 +1297,6 @@ export const addMissionRewards = async (
logger.error(`unknown droptable ${si.DropTable} for DROP_BLUEPRINT`); logger.error(`unknown droptable ${si.DropTable} for DROP_BLUEPRINT`);
} }
} }
// e.g. H-09 Apex Turret Sumdali
if (si.DROP_MISC_ITEM) {
const resourceDroptable = droptables.find(x => x.type == "resource");
if (resourceDroptable) {
for (let i = 0; i != si.DROP_MISC_ITEM.length; ++i) {
const reward = getRandomReward(resourceDroptable.items)!;
logger.debug(`stripped droptable (resources pool) rolled`, reward);
if (Object.keys(await addItem(inventory, reward.type)).length == 0) {
logger.debug(`item already owned, skipping`);
} else {
MissionRewards.push({
StoreItem: toStoreItem(reward.type),
ItemCount: 1,
FromEnemyCache: true // to show "identified"
});
}
}
} else {
logger.error(`unknown droptable ${si.DropTable} for DROP_BLUEPRINT`);
}
}
} }
} }
@ -2427,35 +2383,5 @@ const goalMessagesByKey: Record<string, { sndr: string; msg: string; sub: string
msg: "/Lotus/Language/G1Quests/ProjectNightwatchTacAlertMissionRewardBody", msg: "/Lotus/Language/G1Quests/ProjectNightwatchTacAlertMissionRewardBody",
sub: "/Lotus/Language/G1Quests/ProjectNightwatchTacAlertMissionFourTitle", sub: "/Lotus/Language/G1Quests/ProjectNightwatchTacAlertMissionFourTitle",
icon: "/Lotus/Interface/Icons/Npcs/Lotus_d.png" icon: "/Lotus/Interface/Icons/Npcs/Lotus_d.png"
},
"/Lotus/Types/Keys/MechSurvivalCorpusShip": {
sndr: "/Lotus/Language/Bosses/DeimosFather",
msg: "/Lotus/Language/Inbox/MechEvent2020Tier1CompleteDesc",
sub: "/Lotus/Language/Inbox/MechEvent2020Tier1CompleteTitle",
icon: "/Lotus/Interface/Icons/Npcs/Entrati/Father.png"
},
"/Lotus/Types/Keys/MechSurvivalGrineerGalleon": {
sndr: "/Lotus/Language/Bosses/DeimosFather",
msg: "/Lotus/Language/Inbox/MechEvent2020Tier2CompleteDesc",
sub: "/Lotus/Language/Inbox/MechEvent2020Tier2CompleteTitle",
icon: "/Lotus/Interface/Icons/Npcs/Entrati/Father.png"
},
"/Lotus/Types/Keys/MechSurvivalGasCity": {
sndr: "/Lotus/Language/Bosses/DeimosFather",
msg: "/Lotus/Language/Inbox/MechEvent2020Tier3CompleteDesc",
sub: "/Lotus/Language/Inbox/MechEvent2020Tier3CompleteTitle",
icon: "/Lotus/Interface/Icons/Npcs/Entrati/Father.png"
},
"/Lotus/Types/Keys/MechSurvivalCorpusShipEndurance": {
sndr: "/Lotus/Language/Bosses/DeimosFather",
msg: "/Lotus/Language/Inbox/MechEvent2020Tier3CompleteDesc",
sub: "/Lotus/Language/Inbox/MechEvent2020Tier3CompleteTitle",
icon: "/Lotus/Interface/Icons/Npcs/Entrati/Father.png"
},
"/Lotus/Types/Keys/MechSurvivalGrineerGalleonEndurance": {
sndr: "/Lotus/Language/Bosses/DeimosFather",
msg: "/Lotus/Language/Inbox/MechEvent2020Tier3CompleteDesc",
sub: "/Lotus/Language/Inbox/MechEvent2020Tier3CompleteTitle",
icon: "/Lotus/Interface/Icons/Npcs/Entrati/Father.png"
} }
}; };

View File

@ -36,9 +36,6 @@ import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/invento
import { fromStoreItem, toStoreItem } from "@/src/services/itemDataService"; import { fromStoreItem, toStoreItem } from "@/src/services/itemDataService";
import { DailyDeal } from "@/src/models/worldStateModel"; import { DailyDeal } from "@/src/models/worldStateModel";
import { fromMongoDate, toMongoDate } from "@/src/helpers/inventoryHelpers"; import { fromMongoDate, toMongoDate } from "@/src/helpers/inventoryHelpers";
import { Guild } from "@/src/models/guildModel";
import { handleGuildGoalProgress } from "@/src/services/guildService";
import { Types } from "mongoose";
export const getStoreItemCategory = (storeItem: string): string => { export const getStoreItemCategory = (storeItem: string): string => {
const storeItemString = getSubstringFromKeyword(storeItem, "StoreItems/"); const storeItemString = getSubstringFromKeyword(storeItem, "StoreItems/");
@ -140,22 +137,6 @@ export const handlePurchase = async (
updateCurrency(inventory, offer.PremiumPrice[0], true, prePurchaseInventoryChanges); updateCurrency(inventory, offer.PremiumPrice[0], true, prePurchaseInventoryChanges);
} }
} }
if (
inventory.GuildId &&
offer.ItemPrices &&
manifest.VendorInfo.TypeName ==
"/Lotus/Types/Game/VendorManifests/Events/DuviriMurmurInvasionVendorManifest"
) {
const guild = await Guild.findById(inventory.GuildId, "GoalProgress Tier VaultDecoRecipes");
const goal = getWorldState().Goals.find(x => x.Tag == "DuviriMurmurEvent");
if (guild && goal) {
await handleGuildGoalProgress(guild, {
Count: offer.ItemPrices[0].ItemCount * purchaseRequest.PurchaseParams.Quantity,
Tag: goal.Tag,
goalId: new Types.ObjectId(goal._id.$oid)
});
}
}
if (!config.dontSubtractPurchaseItemCost) { if (!config.dontSubtractPurchaseItemCost) {
if (offer.ItemPrices) { if (offer.ItemPrices) {
handleItemPrices( handleItemPrices(

View File

@ -19,7 +19,6 @@ import { Guild } from "@/src/models/guildModel";
import { hasGuildPermission } from "@/src/services/guildService"; import { hasGuildPermission } from "@/src/services/guildService";
import { GuildPermission } from "@/src/types/guildTypes"; import { GuildPermission } from "@/src/types/guildTypes";
import { ExportResources } from "warframe-public-export-plus"; import { ExportResources } from "warframe-public-export-plus";
import { convertCustomizationInfo } from "@/src/services/importService";
export const setShipCustomizations = async ( export const setShipCustomizations = async (
accountId: string, accountId: string,
@ -270,8 +269,6 @@ export const handleSetPlacedDecoInfo = async (accountId: string, req: ISetPlaced
} }
placedDeco.PictureFrameInfo = req.PictureFrameInfo; placedDeco.PictureFrameInfo = req.PictureFrameInfo;
placedDeco.CustomizationInfo = req.CustomizationInfo ? convertCustomizationInfo(req.CustomizationInfo) : undefined;
placedDeco.AnimPoseItem = req.AnimPoseItem;
await personalRooms.save(); await personalRooms.save();
}; };

View File

@ -382,29 +382,6 @@ export const updateStats = async (accountOwnerId: string, payload: IStatsUpdate)
); );
break; break;
case "Halloween16":
case "AmalgamEventScoreMax":
case "Halloween19ScoreMax":
case "FlotillaEventScore":
case "FlotillaSpaceBadgesTier1":
case "FlotillaSpaceBadgesTier2":
case "FlotillaSpaceBadgesTier3":
case "FlotillaGroundBadgesTier1":
case "FlotillaGroundBadgesTier2":
case "FlotillaGroundBadgesTier3":
case "MechSurvivalScoreMax":
playerStats[category] ??= 0;
if (data > playerStats[category]) playerStats[category] = data as number;
await submitLeaderboardScore(
"events",
category,
accountOwnerId,
payload.displayName,
data as number,
payload.guildId
);
break;
default: default:
if (!ignoredCategories.includes(category)) { if (!ignoredCategories.includes(category)) {
unknownCategories[action] ??= []; unknownCategories[action] ??= [];

View File

@ -8,7 +8,6 @@ import syndicateMissions from "@/static/fixed_responses/worldState/syndicateMiss
import darvoDeals from "@/static/fixed_responses/worldState/darvoDeals.json"; import darvoDeals from "@/static/fixed_responses/worldState/darvoDeals.json";
import invasionNodes from "@/static/fixed_responses/worldState/invasionNodes.json"; import invasionNodes from "@/static/fixed_responses/worldState/invasionNodes.json";
import invasionRewards from "@/static/fixed_responses/worldState/invasionRewards.json"; import invasionRewards from "@/static/fixed_responses/worldState/invasionRewards.json";
import pvpChallenges from "@/static/fixed_responses/worldState/pvpChallenges.json";
import { buildConfig } from "@/src/services/buildConfigService"; import { buildConfig } from "@/src/services/buildConfigService";
import { unixTimesInMs } from "@/src/constants/timeConstants"; import { unixTimesInMs } from "@/src/constants/timeConstants";
import { config } from "@/src/services/configService"; import { config } from "@/src/services/configService";
@ -22,7 +21,6 @@ import {
ILiteSortie, ILiteSortie,
IPrimeVaultTrader, IPrimeVaultTrader,
IPrimeVaultTraderOffer, IPrimeVaultTraderOffer,
IPVPChallengeInstance,
ISeasonChallenge, ISeasonChallenge,
ISortie, ISortie,
ISortieMission, ISortieMission,
@ -1403,7 +1401,6 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
DailyDeals: [], DailyDeals: [],
EndlessXpChoices: [], EndlessXpChoices: [],
KnownCalendarSeasons: [], KnownCalendarSeasons: [],
PVPChallengeInstances: [],
...staticWorldState, ...staticWorldState,
SyndicateMissions: [...staticWorldState.SyndicateMissions], SyndicateMissions: [...staticWorldState.SyndicateMissions],
InGameMarket: { InGameMarket: {
@ -1538,7 +1535,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
Personal: true, Personal: true,
Bounty: true, Bounty: true,
ClampNodeScores: true, ClampNodeScores: true,
Node: "EventNode28", // Incompatible with Wolf Hunt (2025), Orphix Venom Node: "EventNode28", // Incompatible with Wolf Hunt (2025)
MissionKeyName: "/Lotus/Types/Keys/GalleonRobberyAlertB", MissionKeyName: "/Lotus/Types/Keys/GalleonRobberyAlertB",
Desc: "/Lotus/Language/Events/GalleonRobberyEventMissionTitle", Desc: "/Lotus/Language/Events/GalleonRobberyEventMissionTitle",
Icon: "/Lotus/Interface/Icons/Player/GalleonRobberiesEvent.png", Icon: "/Lotus/Interface/Icons/Player/GalleonRobberiesEvent.png",
@ -1804,10 +1801,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
worldState.Goals.push({ worldState.Goals.push({
_id: { _id: {
$oid: $oid: ((dogDaysStart / 1000) & 0xffffffff).toString(16).padStart(8, "0") + "c57487c3768936df"
((dogDaysStart / 1000) & 0xffffffff).toString(16).padStart(8, "0") +
"c57487c3768936d" +
year.toString(16)
}, },
Activation: { $date: { $numberLong: activationTimeStamp } }, Activation: { $date: { $numberLong: activationTimeStamp } },
Expiry: { $date: { $numberLong: expiryTimeStamp } }, Expiry: { $date: { $numberLong: expiryTimeStamp } },
@ -1964,7 +1958,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
"/Lotus/Types/Keys/WolfTacAlertReduxD" "/Lotus/Types/Keys/WolfTacAlertReduxD"
], ],
ConcurrentNodeReqs: [1, 2, 3], ConcurrentNodeReqs: [1, 2, 3],
ConcurrentNodes: ["EventNode28", "EventNode39", "EventNode40"], // Incompatible with Galleon Of Ghouls, Orphix Venom ConcurrentNodes: ["EventNode28", "EventNode39", "EventNode40"], // Incompatible with Galleon Of Ghouls
MissionKeyName: "/Lotus/Types/Keys/WolfTacAlertReduxA", MissionKeyName: "/Lotus/Types/Keys/WolfTacAlertReduxA",
Faction: "FC_GRINEER", Faction: "FC_GRINEER",
Desc: "/Lotus/Language/Alerts/WolfAlert", Desc: "/Lotus/Language/Alerts/WolfAlert",
@ -2100,7 +2094,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
const year = config.worldState.hallowedNightmaresRewardsOverride ?? 0; const year = config.worldState.hallowedNightmaresRewardsOverride ?? 0;
worldState.Goals.push({ worldState.Goals.push({
_id: { $oid: "5bc98f00000000000000000" + year.toString(16) }, _id: { $oid: "5bc9e8f7972d7d184c8398c9" },
Activation: { $date: { $numberLong: "1539972000000" } }, Activation: { $date: { $numberLong: "1539972000000" } },
Expiry: { $date: { $numberLong: "2000000000000" } }, Expiry: { $date: { $numberLong: "2000000000000" } },
Count: 0, Count: 0,
@ -2125,7 +2119,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
}); });
if (year != 2) { if (year != 2) {
worldState.Goals.push({ worldState.Goals.push({
_id: { $oid: "5bc98f01000000000000000" + year.toString(16) }, _id: { $oid: "5bca18b1e12d9e14a0b6ad27" },
Activation: { $date: { $numberLong: "1539972000000" } }, Activation: { $date: { $numberLong: "1539972000000" } },
Expiry: { $date: { $numberLong: "2000000000000" } }, Expiry: { $date: { $numberLong: "2000000000000" } },
Count: 0, Count: 0,
@ -2198,7 +2192,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
const year = config.worldState.proxyRebellionRewardsOverride ?? 0; const year = config.worldState.proxyRebellionRewardsOverride ?? 0;
worldState.Goals.push({ worldState.Goals.push({
_id: { $oid: "5b5b5da0000000000000000" + year.toString(16) }, _id: { $oid: "5b5743ac972d7d3ed0517b0d" },
Activation: { $date: { $numberLong: "1532714400000" } }, Activation: { $date: { $numberLong: "1532714400000" } },
Expiry: { $date: { $numberLong: "2000000000000" } }, Expiry: { $date: { $numberLong: "2000000000000" } },
Count: 0, Count: 0,
@ -2216,7 +2210,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
"/Lotus/Types/Keys/TacAlertKeyProxyRebellionFour" "/Lotus/Types/Keys/TacAlertKeyProxyRebellionFour"
], ],
ConcurrentNodeReqs: [1, 2, 3], ConcurrentNodeReqs: [1, 2, 3],
ConcurrentNodes: ["EventNode7", "EventNode4", "EventNode17"], // Incompatible with Orphix venom ConcurrentNodes: ["EventNode7", "EventNode4", "EventNode17"],
MissionKeyName: "/Lotus/Types/Keys/TacAlertKeyProxyRebellionOne", MissionKeyName: "/Lotus/Types/Keys/TacAlertKeyProxyRebellionOne",
Faction: "FC_CORPUS", Faction: "FC_CORPUS",
Desc: "/Lotus/Language/Alerts/TacAlertProxyRebellion", Desc: "/Lotus/Language/Alerts/TacAlertProxyRebellion",
@ -2271,126 +2265,6 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
BonusReward: { items: ["/Lotus/StoreItems/Upgrades/Skins/Clan/BountyHunterBadgeItem"] } BonusReward: { items: ["/Lotus/StoreItems/Upgrades/Skins/Clan/BountyHunterBadgeItem"] }
}); });
} }
if (config.worldState?.bellyOfTheBeast) {
worldState.Goals.push({
_id: { $oid: "67a5035c2a198564d62e165e" },
Activation: { $date: { $numberLong: "1738868400000" } },
Expiry: { $date: { $numberLong: "2000000000000" } },
Count: config.worldState.bellyOfTheBeastProgressOverride ?? 0,
HealthPct: (config.worldState.bellyOfTheBeastProgressOverride ?? 0) / 100,
Goal: 0,
Personal: true,
Community: true,
ClanGoal: [72, 216, 648, 1944, 5832],
Tag: "JadeShadowsEvent",
Faction: "FC_MITW",
Desc: "/Lotus/Language/JadeShadows/JadeShadowsEventName",
ToolTip: "/Lotus/Language/JadeShadows/JadeShadowsShortEventDesc",
Icon: "/Lotus/Interface/Icons/WorldStatePanel/JadeShadowsEventBadge.png",
ScoreLocTag: "/Lotus/Language/JadeShadows/JadeShadowsEventScore",
Node: "SolNode723",
MissionKeyName: "/Lotus/Types/Keys/JadeShadowsEventMission",
ItemType: "/Lotus/Types/Gameplay/JadeShadows/Resources/AscensionEventResourceItem"
});
}
if (config.worldState?.eightClaw) {
worldState.Goals.push({
_id: { $oid: "685c15f80000000000000000" },
Activation: { $date: { $numberLong: "1750865400000" } },
Expiry: { $date: { $numberLong: "2000000000000" } },
Count: config.worldState.eightClawProgressOverride ?? 0,
HealthPct: (config.worldState.eightClawProgressOverride ?? 0) / 100,
Goal: 0,
Personal: true,
Community: true,
ClanGoal: [72, 216, 648, 1944, 5832],
Tag: "DuviriMurmurEvent",
Faction: "FC_MITW",
Desc: "/Lotus/Language/Isleweaver/DuviriMurmurEventTitle",
ToolTip: "/Lotus/Language/Isleweaver/DuviriMurmurEventDescription",
Icon: "/Lotus/Interface/Icons/WorldStatePanel/EightClawEventBadge.png",
ScoreLocTag: "/Lotus/Language/Isleweaver/DuviriMurmurEventScore",
Node: "SolNode236",
MissionKeyName: "/Lotus/Types/Keys/DuviriMITW/DuviriMITWEventKey"
});
}
if (config.worldState?.orphixVenom) {
worldState.Goals.push(
{
_id: { $oid: "5fdcccb875d5ad500dc477d0" },
Activation: { $date: { $numberLong: "1608320400000" } },
Expiry: { $date: { $numberLong: "2000000000000" } },
Count: 0,
Goal: 500,
Success: 0,
Personal: true,
Best: true,
Node: "EventNode17", // Incompatible with Proxy Rebellion
MissionKeyName: "/Lotus/Types/Keys/MechSurvivalCorpusShip",
Faction: "FC_SENTIENT",
Desc: "/Lotus/Language/Events/MechEventMissionTier1",
Icon: "/Lotus/Interface/Icons/Categories/IconMech256.png",
Tag: "MechSurvivalA",
ScoreVar: "MechSurvivalScore",
Reward: {
items: ["/Lotus/StoreItems/Upgrades/Skins/Clan/MechEventEmblemItem"]
}
},
{
_id: { $oid: "5fdcccb875d5ad500dc477d1" },
Activation: { $date: { $numberLong: "1608320400000" } },
Expiry: { $date: { $numberLong: "2000000000000" } },
Count: 0,
Goal: 1000,
Success: 0,
Personal: true,
Best: true,
Node: "EventNode28", // Incompatible with Galleon Of Ghouls, Wolf Hunt (2025)
MissionKeyName: "/Lotus/Types/Keys/MechSurvivalGrineerGalleon",
Faction: "FC_SENTIENT",
Desc: "/Lotus/Language/Events/MechEventMissionTier2",
Icon: "/Lotus/Interface/Icons/Categories/IconMech256.png",
Tag: "MechSurvivalB",
PrereqGoalTags: ["MechSurvivalA"],
ScoreVar: "MechSurvivalScore",
Reward: {
items: ["/Lotus/StoreItems/Types/Items/FusionTreasures/OroFusexJ"]
}
},
{
_id: { $oid: "5fdcccb875d5ad500dc477d2" },
Activation: { $date: { $numberLong: "1608320400000" } },
Expiry: { $date: { $numberLong: "2000000000000" } },
Count: 0,
Goal: 2000,
Success: 0,
Personal: true,
Best: true,
Node: "EventNode32",
MissionKeyName: "/Lotus/Types/Keys/MechSurvivalGasCity",
MissionKeyRotation: [
"/Lotus/Types/Keys/MechSurvivalGasCity",
"/Lotus/Types/Keys/MechSurvivalCorpusShipEndurance",
"/Lotus/Types/Keys/MechSurvivalGrineerGalleonEndurance"
],
MissionKeyRotationInterval: 3600, // 1 hour
Faction: "FC_SENTIENT",
Desc: "/Lotus/Language/Events/MechEventMissionTier3",
Icon: "/Lotus/Interface/Icons/Categories/IconMech256.png",
Tag: "MechSurvival",
PrereqGoalTags: ["MechSurvivalA", "MechSurvivalB"],
ScoreVar: "MechSurvivalScore",
ScoreMaxTag: "MechSurvivalScoreMax",
Reward: {
items: [
"/Lotus/StoreItems/Types/Items/MiscItems/FormaAura",
"/Lotus/StoreItems/Upgrades/Skins/Necramech/MechWeapon/MechEventMausolonSkin"
]
}
}
);
}
// Nightwave Challenges // Nightwave Challenges
const nightwaveSyndicateTag = getNightwaveSyndicateTag(buildLabel); const nightwaveSyndicateTag = getNightwaveSyndicateTag(buildLabel);
@ -2712,23 +2586,6 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
pushSyndicateMissions(worldState, sdy, rng.randomInt(0, 100_000), "ba6f84724fa48061", "SteelMeridianSyndicate"); pushSyndicateMissions(worldState, sdy, rng.randomInt(0, 100_000), "ba6f84724fa48061", "SteelMeridianSyndicate");
} }
{
const conclaveDayStart = EPOCH + day * unixTimesInMs.day + 5 * unixTimesInMs.hour + 30 * unixTimesInMs.minute;
const conclaveDayEnd = conclaveDayStart + unixTimesInMs.day;
const conclaveWeekStart = weekStart + 40 * unixTimesInMs.minute - 2 * unixTimesInMs.day;
const conclaveWeekEnd = conclaveWeekStart + unixTimesInMs.week;
pushConclaveWeakly(worldState.PVPChallengeInstances, week);
pushConclaveDailys(worldState.PVPChallengeInstances, day);
if (isBeforeNextExpectedWorldStateRefresh(timeMs, conclaveDayEnd)) {
pushConclaveDailys(worldState.PVPChallengeInstances, day + 1);
}
if (isBeforeNextExpectedWorldStateRefresh(timeMs, conclaveWeekEnd)) {
pushConclaveWeakly(worldState.PVPChallengeInstances, week + 1);
}
}
// Archon Hunt cycling every week // Archon Hunt cycling every week
worldState.LiteSorties.push(getLiteSortie(week)); worldState.LiteSorties.push(getLiteSortie(week));
if (isBeforeNextExpectedWorldStateRefresh(timeMs, weekEnd)) { if (isBeforeNextExpectedWorldStateRefresh(timeMs, weekEnd)) {
@ -3114,136 +2971,3 @@ const updateDailyDeal = async (): Promise<void> => {
export const updateWorldStateCollections = async (): Promise<void> => { export const updateWorldStateCollections = async (): Promise<void> => {
await Promise.all([updateFissures(), updateDailyDeal()]); await Promise.all([updateFissures(), updateDailyDeal()]);
}; };
const pushConclaveDaily = (
activeChallenges: IPVPChallengeInstance[],
PVPMode: string,
pool: {
key: string;
ScriptParamValue: number;
PVPModeAllowed: string[];
SyndicateXP: number;
DuringSingleMatch?: boolean;
}[],
day: number,
id: number
): void => {
const conclaveDayStart = EPOCH + day * unixTimesInMs.day + 5 * unixTimesInMs.hour + 30 * unixTimesInMs.minute;
const conclaveDayEnd = conclaveDayStart + unixTimesInMs.day;
const challengeId = day * 8 + id;
const rng = new SRng(new SRng(challengeId).randomInt(0, 100_000));
let challenge: {
key: string;
ScriptParamValue: number;
PVPModeAllowed?: string[];
SyndicateXP?: number;
DuringSingleMatch?: boolean;
};
do {
challenge = rng.randomElement(pool)!;
} while (
activeChallenges.some(x => x.challengeTypeRefID == challenge.key) &&
activeChallenges.some(x => x.PVPMode == PVPMode)
);
activeChallenges.push({
_id: {
$oid: "689ec5d985b55902" + challengeId.toString().padStart(8, "0")
},
challengeTypeRefID: challenge.key,
startDate: { $date: { $numberLong: conclaveDayStart.toString() } },
endDate: { $date: { $numberLong: conclaveDayEnd.toString() } },
params: [{ n: "ScriptParamValue", v: challenge.ScriptParamValue }],
isGenerated: true,
PVPMode,
subChallenges: [],
Category: "PVPChallengeTypeCategory_DAILY"
});
};
const pushConclaveDailys = (activeChallenges: IPVPChallengeInstance[], day: number): void => {
const modes = [
"PVPMODE_SPEEDBALL",
"PVPMODE_CAPTURETHEFLAG",
"PVPMODE_DEATHMATCH",
"PVPMODE_TEAMDEATHMATCH"
] as const;
const challengesMap: Record<
string,
{
key: string;
ScriptParamValue: number;
PVPModeAllowed: string[];
SyndicateXP: number;
DuringSingleMatch?: boolean;
}[]
> = {};
for (const mode of modes) {
challengesMap[mode] = Object.entries(pvpChallenges)
.filter(([_, challenge]) => challenge.PVPModeAllowed.includes(mode))
.map(([key, challenge]) => ({ key, ...challenge }));
}
modes.forEach((mode, index) => {
pushConclaveDaily(activeChallenges, mode, challengesMap[mode], day, index * 2);
pushConclaveDaily(activeChallenges, mode, challengesMap[mode], day, index * 2 + 1);
});
};
const pushConclaveWeakly = (activeChallenges: IPVPChallengeInstance[], week: number): void => {
const weekStart = EPOCH + week * unixTimesInMs.week;
const conclaveWeekStart = weekStart + 40 * unixTimesInMs.minute - 2 * unixTimesInMs.day;
const conclaveWeekEnd = conclaveWeekStart + unixTimesInMs.week;
const conclaveIdStart = ((conclaveWeekStart / 1000) & 0xffffffff).toString(16).padStart(8, "0").padEnd(23, "0");
activeChallenges.push(
{
_id: { $oid: conclaveIdStart + "1" },
challengeTypeRefID: "/Lotus/PVPChallengeTypes/PVPTimedChallengeGameModeWins",
startDate: { $date: { $numberLong: conclaveWeekStart.toString() } },
endDate: { $date: { $numberLong: conclaveWeekEnd.toString() } },
params: [{ n: "ScriptParamValue", v: 6 }],
isGenerated: true,
PVPMode: "PVPMODE_ALL",
subChallenges: [],
Category: "PVPChallengeTypeCategory_WEEKLY"
},
{
_id: { $oid: conclaveIdStart + "2" },
challengeTypeRefID: "/Lotus/PVPChallengeTypes/PVPTimedChallengeGameModeComplete",
startDate: { $date: { $numberLong: conclaveWeekStart.toString() } },
endDate: { $date: { $numberLong: conclaveWeekEnd.toString() } },
params: [{ n: "ScriptParamValue", v: 20 }],
isGenerated: true,
PVPMode: "PVPMODE_ALL",
subChallenges: [],
Category: "PVPChallengeTypeCategory_WEEKLY"
},
{
_id: { $oid: conclaveIdStart + "3" },
challengeTypeRefID: "/Lotus/PVPChallengeTypes/PVPTimedChallengeOtherChallengeCompleteANY",
startDate: { $date: { $numberLong: conclaveWeekStart.toString() } },
endDate: { $date: { $numberLong: conclaveWeekEnd.toString() } },
params: [{ n: "ScriptParamValue", v: 10 }],
isGenerated: true,
PVPMode: "PVPMODE_ALL",
subChallenges: [],
Category: "PVPChallengeTypeCategory_WEEKLY"
},
{
_id: { $oid: conclaveIdStart + "4" },
challengeTypeRefID: "/Lotus/PVPChallengeTypes/PVPTimedChallengeWeeklyStandardSet",
startDate: { $date: { $numberLong: conclaveWeekStart.toString() } },
endDate: { $date: { $numberLong: conclaveWeekEnd.toString() } },
params: [{ n: "ScriptParamValue", v: 0 }],
isGenerated: true,
PVPMode: "PVPMODE_NONE",
subChallenges: [
{ $oid: conclaveIdStart + "1" },
{ $oid: conclaveIdStart + "2" },
{ $oid: conclaveIdStart + "3" }
],
Category: "PVPChallengeTypeCategory_WEEKLY_ROOT"
}
);
};

View File

@ -1,11 +1,6 @@
import { Types } from "mongoose"; import { Types } from "mongoose";
import { IOid, IMongoDate, IOidWithLegacySupport, ITypeCount } from "@/src/types/commonTypes"; import { IOid, IMongoDate, IOidWithLegacySupport, ITypeCount } from "@/src/types/commonTypes";
import { import { IFusionTreasure, IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes";
IFusionTreasure,
IMiscItem,
IGoalProgressDatabase,
IGoalProgressClient
} from "@/src/types/inventoryTypes/inventoryTypes";
import { IPictureFrameInfo } from "@/src/types/personalRoomsTypes"; import { IPictureFrameInfo } from "@/src/types/personalRoomsTypes";
import { IFriendInfo } from "@/src/types/friendTypes"; import { IFriendInfo } from "@/src/types/friendTypes";
@ -28,8 +23,6 @@ export interface IGuildClient {
CrossPlatformEnabled?: boolean; CrossPlatformEnabled?: boolean;
AutoContributeFromVault?: boolean; AutoContributeFromVault?: boolean;
AllianceId?: IOidWithLegacySupport; AllianceId?: IOidWithLegacySupport;
GoalProgress?: IGoalProgressClient[];
} }
export interface IGuildDatabase { export interface IGuildDatabase {
@ -70,8 +63,6 @@ export interface IGuildDatabase {
TechChanges?: IGuildLogEntryContributable[]; TechChanges?: IGuildLogEntryContributable[];
RosterActivity?: IGuildLogEntryRoster[]; RosterActivity?: IGuildLogEntryRoster[];
ClassChanges?: IGuildLogEntryNumber[]; ClassChanges?: IGuildLogEntryNumber[];
GoalProgress?: IGoalProgressDatabase[];
} }
export interface ILongMOTD { export interface ILongMOTD {

View File

@ -109,7 +109,7 @@ export interface IInventoryDatabase
QualifyingInvasions: IInvasionProgressDatabase[]; QualifyingInvasions: IInvasionProgressDatabase[];
LastInventorySync?: Types.ObjectId; LastInventorySync?: Types.ObjectId;
EndlessXP?: IEndlessXpProgressDatabase[]; EndlessXP?: IEndlessXpProgressDatabase[];
PersonalGoalProgress?: IGoalProgressDatabase[]; PersonalGoalProgress?: IPersonalGoalProgressDatabase[];
} }
export interface IQuestKeyDatabase { export interface IQuestKeyDatabase {
@ -318,7 +318,7 @@ export interface IInventoryClient extends IDailyAffiliations, InventoryClientEqu
HWIDProtectEnabled?: boolean; HWIDProtectEnabled?: boolean;
KubrowPetPrints: IKubrowPetPrintClient[]; KubrowPetPrints: IKubrowPetPrintClient[];
AlignmentReplay?: IAlignment; AlignmentReplay?: IAlignment;
PersonalGoalProgress?: IGoalProgressClient[]; PersonalGoalProgress?: IPersonalGoalProgressClient[];
ThemeStyle: string; ThemeStyle: string;
ThemeBackground: string; ThemeBackground: string;
ThemeSounds: string; ThemeSounds: string;
@ -730,7 +730,7 @@ export enum UpgradeType {
export interface ILoreFragmentScan { export interface ILoreFragmentScan {
Progress: number; Progress: number;
Region: string; Region?: string;
ItemType: string; ItemType: string;
} }
@ -895,8 +895,8 @@ export interface IPeriodicMissionCompletionResponse extends Omit<IPeriodicMissio
date: IMongoDate; date: IMongoDate;
} }
export interface IGoalProgressClient { export interface IPersonalGoalProgressClient {
Best?: number; Best: number;
Count: number; Count: number;
Tag: string; Tag: string;
_id: IOid; _id: IOid;
@ -904,7 +904,7 @@ export interface IGoalProgressClient {
//ReceivedClanReward1?: boolean; //ReceivedClanReward1?: boolean;
} }
export interface IGoalProgressDatabase extends Omit<IGoalProgressClient, "_id"> { export interface IPersonalGoalProgressDatabase extends Omit<IPersonalGoalProgressClient, "_id"> {
goalId: Types.ObjectId; goalId: Types.ObjectId;
} }

View File

@ -6,7 +6,7 @@ export interface ILeaderboardEntryDatabase {
displayName: string; displayName: string;
score: number; score: number;
guildId?: Types.ObjectId; guildId?: Types.ObjectId;
expiry?: Date; expiry: Date;
guildTier?: number; guildTier?: number;
} }

View File

@ -1,6 +1,6 @@
import { IColor, IShipAttachments, IShipCustomization } from "@/src/types/inventoryTypes/commonInventoryTypes"; import { IColor, IShipAttachments, IShipCustomization } from "@/src/types/inventoryTypes/commonInventoryTypes";
import { Document, Model, Types } from "mongoose"; import { Document, Model, Types } from "mongoose";
import { ILoadoutClient, ILoadoutConfigClient, ILoadoutConfigDatabase } from "@/src/types/saveLoadoutTypes"; import { ILoadoutClient } from "@/src/types/saveLoadoutTypes";
import { IMongoDate, IOid } from "@/src/types/commonTypes"; import { IMongoDate, IOid } from "@/src/types/commonTypes";
export interface IGetShipResponse { export interface IGetShipResponse {
@ -17,7 +17,7 @@ export interface IOrbiterClient {
Features: string[]; Features: string[];
ShipId: IOid; ShipId: IOid;
ShipInterior: IShipCustomization; ShipInterior: IShipCustomization;
Rooms: IRoomClient[]; Rooms: IRoom[];
VignetteFish?: string[]; VignetteFish?: string[];
FavouriteLoadoutId?: IOid; FavouriteLoadoutId?: IOid;
Wallpaper?: string; Wallpaper?: string;
@ -28,7 +28,7 @@ export interface IOrbiterClient {
export interface IOrbiterDatabase { export interface IOrbiterDatabase {
Features: string[]; Features: string[];
Rooms: IRoomDatabase[]; Rooms: IRoom[];
ShipInterior?: IShipCustomization; ShipInterior?: IShipCustomization;
VignetteFish?: string[]; VignetteFish?: string[];
FavouriteLoadoutId?: Types.ObjectId; FavouriteLoadoutId?: Types.ObjectId;
@ -53,18 +53,12 @@ export interface IPersonalRoomsDatabase {
TailorShop: ITailorShopDatabase; TailorShop: ITailorShopDatabase;
} }
export interface IRoomDatabase { export interface IRoom {
Name: string; Name: string;
MaxCapacity: number; MaxCapacity: number;
PlacedDecos?: IPlacedDecosDatabase[]; PlacedDecos?: IPlacedDecosDatabase[];
} }
export interface IRoomClient {
Name: string;
MaxCapacity: number;
PlacedDecos?: IPlacedDecosClient[];
}
export interface IPlantClient { export interface IPlantClient {
PlantType: string; PlantType: string;
EndTime: IMongoDate; EndTime: IMongoDate;
@ -95,15 +89,15 @@ export interface IGardeningDatabase {
export interface IApartmentClient { export interface IApartmentClient {
Gardening: IGardeningClient; Gardening: IGardeningClient;
Rooms: IRoomClient[]; Rooms: IRoom[];
FavouriteLoadouts?: IFavouriteLoadout[]; FavouriteLoadouts: IFavouriteLoadout[];
VideoWallBackdrop?: string; VideoWallBackdrop?: string;
Soundscape?: string; Soundscape?: string;
} }
export interface IApartmentDatabase { export interface IApartmentDatabase {
Gardening: IGardeningDatabase; Gardening: IGardeningDatabase;
Rooms: IRoomDatabase[]; Rooms: IRoom[];
FavouriteLoadouts: IFavouriteLoadoutDatabase[]; FavouriteLoadouts: IFavouriteLoadoutDatabase[];
VideoWallBackdrop?: string; VideoWallBackdrop?: string;
Soundscape?: string; Soundscape?: string;
@ -116,14 +110,11 @@ export interface IPlacedDecosDatabase {
Scale?: number; Scale?: number;
Sockets?: number; Sockets?: number;
PictureFrameInfo?: IPictureFrameInfo; PictureFrameInfo?: IPictureFrameInfo;
CustomizationInfo?: ICustomizationInfoDatabase;
AnimPoseItem?: string;
_id: Types.ObjectId; _id: Types.ObjectId;
} }
export interface IPlacedDecosClient extends Omit<IPlacedDecosDatabase, "_id" | "CustomizationInfo"> { export interface IPlacedDecosClient extends Omit<IPlacedDecosDatabase, "_id"> {
id: IOid; id: IOid;
CustomizationInfo?: ICustomizationInfoClient;
} }
export interface ISetShipCustomizationsRequest { export interface ISetShipCustomizationsRequest {
@ -175,13 +166,11 @@ export interface IResetShipDecorationsResponse {
} }
export interface ISetPlacedDecoInfoRequest { export interface ISetPlacedDecoInfoRequest {
DecoType?: string; DecoType: string;
DecoId: string; DecoId: string;
Room: string; Room: string;
PictureFrameInfo: IPictureFrameInfo; // IsPicture PictureFrameInfo: IPictureFrameInfo;
CustomizationInfo?: ICustomizationInfoClient; // !IsPicture
BootLocation?: TBootLocation; BootLocation?: TBootLocation;
AnimPoseItem?: string; // !IsPicture
ComponentId?: string; ComponentId?: string;
GuildId?: string; GuildId?: string;
} }
@ -202,21 +191,6 @@ export interface IPictureFrameInfo {
TextOrientation: number; TextOrientation: number;
} }
export interface ICustomizationInfoClient {
Anim?: string;
AnimPose?: number;
LoadOutPreset?: ILoadoutConfigClient;
VehiclePreset?: ILoadoutConfigClient;
EquippedWeapon?: "SUIT_SLOT" | "LONG_GUN_SLOT" | "PISTOL_SLOT";
AvatarType?: string;
LoadOutType?: string; // "LOT_NORMAL"
}
export interface ICustomizationInfoDatabase extends Omit<ICustomizationInfoClient, "LoadOutPreset" | "VehiclePreset"> {
LoadOutPreset?: ILoadoutConfigDatabase;
VehiclePreset?: ILoadoutConfigDatabase;
}
export interface IFavouriteLoadout { export interface IFavouriteLoadout {
Tag: string; Tag: string;
LoadoutId: IOid; LoadoutId: IOid;
@ -232,12 +206,11 @@ export interface ITailorShopDatabase {
Colors?: IColor; Colors?: IColor;
CustomJson?: string; CustomJson?: string;
LevelDecosVisible?: boolean; LevelDecosVisible?: boolean;
Rooms: IRoomDatabase[]; Rooms: IRoom[];
} }
export interface ITailorShop extends Omit<ITailorShopDatabase, "Rooms" | "FavouriteLoadouts"> { export interface ITailorShop extends Omit<ITailorShopDatabase, "FavouriteLoadouts"> {
Rooms: IRoomClient[]; FavouriteLoadouts: IFavouriteLoadout[];
FavouriteLoadouts?: IFavouriteLoadout[];
} }
export type RoomsType = { Name: string; MaxCapacity: number; PlacedDecos: Types.DocumentArray<IPlacedDecosDatabase> }; export type RoomsType = { Name: string; MaxCapacity: number; PlacedDecos: Types.DocumentArray<IPlacedDecosDatabase> };

View File

@ -117,7 +117,6 @@ export type IMissionInventoryUpdateRequest = {
DropTable: string; DropTable: string;
DROP_MOD?: number[]; DROP_MOD?: number[];
DROP_BLUEPRINT?: number[]; DROP_BLUEPRINT?: number[];
DROP_MISC_ITEM?: number[];
}[]; }[];
DeathMarks?: string[]; DeathMarks?: string[];
Nemesis?: number; Nemesis?: number;
@ -206,7 +205,6 @@ export interface IRewardInfo {
Q?: boolean; // likely indicates that the bonus objective for this stage was completed Q?: boolean; // likely indicates that the bonus objective for this stage was completed
CheckpointCounter?: number; // starts at 1, is incremented with each job stage upload, and does not reset when starting a new job CheckpointCounter?: number; // starts at 1, is incremented with each job stage upload, and does not reset when starting a new job
challengeMissionId?: string; challengeMissionId?: string;
GoalProgressAmount?: number;
} }
export type IMissionStatus = "GS_SUCCESS" | "GS_FAILURE" | "GS_DUMPED" | "GS_QUIT" | "GS_INTERRUPTED"; export type IMissionStatus = "GS_SUCCESS" | "GS_FAILURE" | "GS_DUMPED" | "GS_QUIT" | "GS_INTERRUPTED";

View File

@ -32,19 +32,6 @@ export interface IStatsClient {
OlliesCrashCourseScore?: number; OlliesCrashCourseScore?: number;
DojoObstacleScore?: number; DojoObstacleScore?: number;
// event scores
Halloween16?: number;
AmalgamEventScoreMax?: number;
Halloween19ScoreMax?: number;
FlotillaEventScore?: number;
FlotillaSpaceBadgesTier1?: number;
FlotillaSpaceBadgesTier2?: number;
FlotillaSpaceBadgesTier3?: number;
FlotillaGroundBadgesTier1?: number;
FlotillaGroundBadgesTier2?: number;
FlotillaGroundBadgesTier3?: number;
MechSurvivalScoreMax?: number;
// not in schema // not in schema
PVP?: { PVP?: {
suitDeaths?: number; suitDeaths?: number;

View File

@ -39,44 +39,32 @@ export interface IGoal {
_id: IOid; _id: IOid;
Activation: IMongoDate; Activation: IMongoDate;
Expiry: IMongoDate; Expiry: IMongoDate;
Count?: number; Count?: number;
HealthPct?: number;
Icon: string;
Desc: string;
ToolTip?: string;
Faction?: string;
Goal?: number; Goal?: number;
InterimGoals?: number[]; InterimGoals?: number[];
BonusGoal?: number; BonusGoal?: number;
ClanGoal?: number[]; HealthPct?: number;
Success?: number; Success?: number;
Personal?: boolean; Personal?: boolean;
Community?: boolean; Best?: boolean;
Best?: boolean; // Use Best instead of Count to check for reward
Bounty?: boolean; // Tactical Alert Bounty?: boolean; // Tactical Alert
Faction?: string;
ClampNodeScores?: boolean; ClampNodeScores?: boolean;
Desc: string;
ToolTip?: string;
Transmission?: string; Transmission?: string;
InstructionalItem?: string; InstructionalItem?: string;
ItemType?: string; Icon: string;
Tag: string; Tag: string;
PrereqGoalTags?: string[]; PrereqGoalTags?: string[];
Node?: string; Node?: string;
VictimNode?: string; VictimNode?: string;
ConcurrentMissionKeyNames?: string[]; ConcurrentMissionKeyNames?: string[];
ConcurrentNodeReqs?: number[]; ConcurrentNodeReqs?: number[];
ConcurrentNodes?: string[]; ConcurrentNodes?: string[];
RegionIdx?: number; RegionIdx?: number;
Regions?: number[]; Regions?: number[];
MissionKeyName?: string; MissionKeyName?: string;
Reward?: IMissionReward; Reward?: IMissionReward;
InterimRewards?: IMissionReward[]; InterimRewards?: IMissionReward[];
BonusReward?: IMissionReward; BonusReward?: IMissionReward;
@ -88,12 +76,7 @@ export interface IGoal {
JobPreviousVersion?: IOid; JobPreviousVersion?: IOid;
ScoreVar?: string; ScoreVar?: string;
ScoreMaxTag?: string; // Field in leaderboard ScoreMaxTag?: string;
ScoreLocTag?: string;
MissionKeyRotation?: string[];
MissionKeyRotationInterval?: number;
NightLevel?: string; NightLevel?: string;
} }

View File

@ -1,290 +0,0 @@
{
"/Lotus/PVPChallengeTypes/PVPTimedChallengeFlagCaptureEASY": {
"ScriptParamValue": 1,
"PVPModeAllowed": ["PVPMODE_CAPTURETHEFLAG"],
"SyndicateXP": 500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeFlagCaptureMEDIUM": {
"ScriptParamValue": 4,
"PVPModeAllowed": ["PVPMODE_CAPTURETHEFLAG"],
"SyndicateXP": 1500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeFlagReturnEASY": {
"ScriptParamValue": 1,
"PVPModeAllowed": ["PVPMODE_CAPTURETHEFLAG"],
"SyndicateXP": 500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsComboEASY": {
"ScriptParamValue": 1,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsComboMEDIUM": {
"ScriptParamValue": 4,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 1500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsHeadShotsEASY": {
"ScriptParamValue": 1,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsHeadShotsMEDIUM": {
"ScriptParamValue": 4,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 1500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsMeleeEASY": {
"ScriptParamValue": 1,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsMeleeMEDIUM": {
"ScriptParamValue": 4,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 1500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsMeleeHARD": {
"ScriptParamValue": 3,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 3000,
"DuringSingleMatch": true
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsMultiMEDIUM": {
"ScriptParamValue": 4,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 1500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsPaybackEASY": {
"ScriptParamValue": 1,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsPayback_MEDIUM": {
"ScriptParamValue": 3,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 1500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsPowerEASY": {
"ScriptParamValue": 1,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsPowerMEDIUM": {
"ScriptParamValue": 4,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 1500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsPowerHARD": {
"ScriptParamValue": 3,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 3000,
"DuringSingleMatch": true
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsPrimaryEASY": {
"ScriptParamValue": 1,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsPrimaryMEDIUM": {
"ScriptParamValue": 4,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 1500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsPrimaryHARD": {
"ScriptParamValue": 3,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 3000,
"DuringSingleMatch": true
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsSecondaryEASY": {
"ScriptParamValue": 1,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsSecondaryMEDIUM": {
"ScriptParamValue": 4,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 1500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsSecondaryHARD": {
"ScriptParamValue": 3,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 3000,
"DuringSingleMatch": true
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsStreak_MEDIUM": {
"ScriptParamValue": 3,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 1500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsStreakDominationEASY": {
"ScriptParamValue": 1,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsStreakDomination_MEDIUM": {
"ScriptParamValue": 3,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 1500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsStreakDominationHARD": {
"ScriptParamValue": 3,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 3000,
"DuringSingleMatch": true
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsStreakStoppedEASY": {
"ScriptParamValue": 1,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsStreakStopped_MEDIUM": {
"ScriptParamValue": 3,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 1500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsStreakHARD": {
"ScriptParamValue": 2,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 3000,
"DuringSingleMatch": true
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsTargetInAirEASY": {
"ScriptParamValue": 1,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsTargetInAirMEDIUM": {
"ScriptParamValue": 4,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 1500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsTargetInAirHARD": {
"ScriptParamValue": 3,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 3000,
"DuringSingleMatch": true
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsWhileSlidingEASY": {
"ScriptParamValue": 1,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsWhileSlidingMEDIUM": {
"ScriptParamValue": 4,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 1500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsWhileSlidingHARD": {
"ScriptParamValue": 3,
"PVPModeAllowed": ["PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 3000,
"DuringSingleMatch": true
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeMatchCompleteEASY": {
"ScriptParamValue": 1,
"PVPModeAllowed": ["PVPMODE_CAPTURETHEFLAG", "PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeMatchCompleteMEDIUM": {
"ScriptParamValue": 4,
"PVPModeAllowed": ["PVPMODE_CAPTURETHEFLAG", "PVPMODE_DEATHMATCH", "PVPMODE_TEAMDEATHMATCH"],
"SyndicateXP": 1500
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeSpeedballCatchesEASY": {
"ScriptParamValue": 3,
"PVPModeAllowed": ["PVPMODE_SPEEDBALL"],
"SyndicateXP": 1000
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeSpeedballCatchesMEDIUM": {
"ScriptParamValue": 10,
"PVPModeAllowed": ["PVPMODE_SPEEDBALL"],
"SyndicateXP": 3000
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeSpeedballCatchesHARD": {
"ScriptParamValue": 6,
"PVPModeAllowed": ["PVPMODE_SPEEDBALL"],
"SyndicateXP": 6000,
"DuringSingleMatch": true
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeSpeedballChecksEASY": {
"ScriptParamValue": 3,
"PVPModeAllowed": ["PVPMODE_SPEEDBALL"],
"SyndicateXP": 1000
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeSpeedballChecksMEDIUM": {
"ScriptParamValue": 10,
"PVPModeAllowed": ["PVPMODE_SPEEDBALL"],
"SyndicateXP": 3000
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeSpeedballChecksHARD": {
"ScriptParamValue": 6,
"PVPModeAllowed": ["PVPMODE_SPEEDBALL"],
"SyndicateXP": 6000,
"DuringSingleMatch": true
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeSpeedballGoalsEASY": {
"ScriptParamValue": 2,
"PVPModeAllowed": ["PVPMODE_SPEEDBALL"],
"SyndicateXP": 1000
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeSpeedballGoalsMEDIUM": {
"ScriptParamValue": 6,
"PVPModeAllowed": ["PVPMODE_SPEEDBALL"],
"SyndicateXP": 3000
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeSpeedballGoalsHARD": {
"ScriptParamValue": 4,
"PVPModeAllowed": ["PVPMODE_SPEEDBALL"],
"SyndicateXP": 6000,
"DuringSingleMatch": true
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeSpeedballInterceptionsEASY": {
"ScriptParamValue": 3,
"PVPModeAllowed": ["PVPMODE_SPEEDBALL"],
"SyndicateXP": 1000
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeSpeedballInterceptionsMEDIUM": {
"ScriptParamValue": 6,
"PVPModeAllowed": ["PVPMODE_SPEEDBALL"],
"SyndicateXP": 3000
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeSpeedballInterceptionsHARD": {
"ScriptParamValue": 6,
"PVPModeAllowed": ["PVPMODE_SPEEDBALL"],
"SyndicateXP": 6000,
"DuringSingleMatch": true
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeSpeedballPassesEASY": {
"ScriptParamValue": 3,
"PVPModeAllowed": ["PVPMODE_SPEEDBALL"],
"SyndicateXP": 1000
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeSpeedballPassesMEDIUM": {
"ScriptParamValue": 6,
"PVPModeAllowed": ["PVPMODE_SPEEDBALL"],
"SyndicateXP": 3000
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeSpeedballPassesHARD": {
"ScriptParamValue": 3,
"PVPModeAllowed": ["PVPMODE_SPEEDBALL"],
"SyndicateXP": 6000,
"DuringSingleMatch": true
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeSpeedballStealsEASY": {
"ScriptParamValue": 3,
"PVPModeAllowed": ["PVPMODE_SPEEDBALL"],
"SyndicateXP": 1000
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeSpeedballStealsMEDIUM": {
"ScriptParamValue": 6,
"PVPModeAllowed": ["PVPMODE_SPEEDBALL"],
"SyndicateXP": 3000
},
"/Lotus/PVPChallengeTypes/PVPTimedChallengeSpeedballStealsHARD": {
"ScriptParamValue": 3,
"PVPModeAllowed": ["PVPMODE_SPEEDBALL"],
"SyndicateXP": 6000
}
}

View File

@ -311,6 +311,140 @@
"PrimeVaultAvailabilities": [false, false, false, false, false], "PrimeVaultAvailabilities": [false, false, false, false, false],
"PrimeTokenAvailability": true, "PrimeTokenAvailability": true,
"LibraryInfo": { "LastCompletedTargetType": "/Lotus/Types/Game/Library/Targets/Research7Target" }, "LibraryInfo": { "LastCompletedTargetType": "/Lotus/Types/Game/Library/Targets/Research7Target" },
"PVPChallengeInstances": [
{
"_id": { "$oid": "6635562d036ce37f7f98e264" },
"challengeTypeRefID": "/Lotus/PVPChallengeTypes/PVPTimedChallengeGameModeComplete",
"startDate": { "$date": { "$numberLong": "1714771501460" } },
"endDate": { "$date": { "$numberLong": "2000000000000" } },
"params": [{ "n": "ScriptParamValue", "v": 20 }],
"isGenerated": true,
"PVPMode": "PVPMODE_ALL",
"subChallenges": [],
"Category": "PVPChallengeTypeCategory_WEEKLY"
},
{
"_id": { "$oid": "6635562d036ce37f7f98e263" },
"challengeTypeRefID": "/Lotus/PVPChallengeTypes/PVPTimedChallengeGameModeWins",
"startDate": { "$date": { "$numberLong": "1714771501460" } },
"endDate": { "$date": { "$numberLong": "2000000000000" } },
"params": [{ "n": "ScriptParamValue", "v": 6 }],
"isGenerated": true,
"PVPMode": "PVPMODE_ALL",
"subChallenges": [],
"Category": "PVPChallengeTypeCategory_WEEKLY"
},
{
"_id": { "$oid": "6635562d036ce37f7f98e265" },
"challengeTypeRefID": "/Lotus/PVPChallengeTypes/PVPTimedChallengeOtherChallengeCompleteANY",
"startDate": { "$date": { "$numberLong": "1714771501460" } },
"endDate": { "$date": { "$numberLong": "2000000000000" } },
"params": [{ "n": "ScriptParamValue", "v": 10 }],
"isGenerated": true,
"PVPMode": "PVPMODE_ALL",
"subChallenges": [],
"Category": "PVPChallengeTypeCategory_WEEKLY"
},
{
"_id": { "$oid": "6635562d036ce37f7f98e266" },
"challengeTypeRefID": "/Lotus/PVPChallengeTypes/PVPTimedChallengeWeeklyStandardSet",
"startDate": { "$date": { "$numberLong": "1714771501460" } },
"endDate": { "$date": { "$numberLong": "2000000000000" } },
"params": [{ "n": "ScriptParamValue", "v": 0 }],
"isGenerated": true,
"PVPMode": "PVPMODE_NONE",
"subChallenges": [{ "$oid": "6635562d036ce37f7f98e263" }, { "$oid": "6635562d036ce37f7f98e264" }, { "$oid": "6635562d036ce37f7f98e265" }],
"Category": "PVPChallengeTypeCategory_WEEKLY_ROOT"
},
{
"_id": { "$oid": "6639ca6967c1192987d75fee" },
"challengeTypeRefID": "/Lotus/PVPChallengeTypes/PVPTimedChallengeFlagReturnEASY",
"startDate": { "$date": { "$numberLong": "1715063401824" } },
"endDate": { "$date": { "$numberLong": "2000000000000" } },
"params": [{ "n": "ScriptParamValue", "v": 1 }],
"isGenerated": true,
"PVPMode": "PVPMODE_CAPTURETHEFLAG",
"subChallenges": [],
"Category": "PVPChallengeTypeCategory_DAILY"
},
{
"_id": { "$oid": "6639ca6967c1192987d75fed" },
"challengeTypeRefID": "/Lotus/PVPChallengeTypes/PVPTimedChallengeMatchCompleteMEDIUM",
"startDate": { "$date": { "$numberLong": "1715063401824" } },
"endDate": { "$date": { "$numberLong": "2000000000000" } },
"params": [{ "n": "ScriptParamValue", "v": 4 }],
"isGenerated": true,
"PVPMode": "PVPMODE_CAPTURETHEFLAG",
"subChallenges": [],
"Category": "PVPChallengeTypeCategory_DAILY"
},
{
"_id": { "$oid": "6639ca6967c1192987d75ff2" },
"challengeTypeRefID": "/Lotus/PVPChallengeTypes/PVPTimedChallengeMatchCompleteEASY",
"startDate": { "$date": { "$numberLong": "1715063401824" } },
"endDate": { "$date": { "$numberLong": "2000000000000" } },
"params": [{ "n": "ScriptParamValue", "v": 1 }],
"isGenerated": true,
"PVPMode": "PVPMODE_DEATHMATCH",
"subChallenges": [],
"Category": "PVPChallengeTypeCategory_DAILY"
},
{
"_id": { "$oid": "6639ca6967c1192987d75ff1" },
"challengeTypeRefID": "/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsPayback_MEDIUM",
"startDate": { "$date": { "$numberLong": "1715063401824" } },
"endDate": { "$date": { "$numberLong": "2000000000000" } },
"params": [{ "n": "ScriptParamValue", "v": 3 }],
"isGenerated": true,
"PVPMode": "PVPMODE_DEATHMATCH",
"subChallenges": [],
"Category": "PVPChallengeTypeCategory_DAILY"
},
{
"_id": { "$oid": "6639ca6967c1192987d75fef" },
"challengeTypeRefID": "/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsStreakDominationEASY",
"startDate": { "$date": { "$numberLong": "1715063401824" } },
"endDate": { "$date": { "$numberLong": "2000000000000" } },
"params": [{ "n": "ScriptParamValue", "v": 1 }],
"isGenerated": true,
"PVPMode": "PVPMODE_TEAMDEATHMATCH",
"subChallenges": [],
"Category": "PVPChallengeTypeCategory_DAILY"
},
{
"_id": { "$oid": "6639ca6967c1192987d75ff0" },
"challengeTypeRefID": "/Lotus/PVPChallengeTypes/PVPTimedChallengeKillsWhileInAirHARD",
"startDate": { "$date": { "$numberLong": "1715063401824" } },
"endDate": { "$date": { "$numberLong": "2000000000000" } },
"params": [{ "n": "ScriptParamValue", "v": 3 }],
"isGenerated": true,
"PVPMode": "PVPMODE_TEAMDEATHMATCH",
"subChallenges": [],
"Category": "PVPChallengeTypeCategory_DAILY"
},
{
"_id": { "$oid": "6639ca6967c1192987d75ff3" },
"challengeTypeRefID": "/Lotus/PVPChallengeTypes/PVPTimedChallengeSpeedballCatchesMEDIUM",
"startDate": { "$date": { "$numberLong": "1715063401824" } },
"endDate": { "$date": { "$numberLong": "2000000000000" } },
"params": [{ "n": "ScriptParamValue", "v": 10 }],
"isGenerated": true,
"PVPMode": "PVPMODE_SPEEDBALL",
"subChallenges": [],
"Category": "PVPChallengeTypeCategory_DAILY"
},
{
"_id": { "$oid": "6639ca6967c1192987d75ff4" },
"challengeTypeRefID": "/Lotus/PVPChallengeTypes/PVPTimedChallengeSpeedballInterceptionsEASY",
"startDate": { "$date": { "$numberLong": "1715063401824" } },
"endDate": { "$date": { "$numberLong": "2000000000000" } },
"params": [{ "n": "ScriptParamValue", "v": 3 }],
"isGenerated": true,
"PVPMode": "PVPMODE_SPEEDBALL",
"subChallenges": [],
"Category": "PVPChallengeTypeCategory_DAILY"
}
],
"PersistentEnemies": [], "PersistentEnemies": [],
"PVPAlternativeModes": [], "PVPAlternativeModes": [],
"PVPActiveTournaments": [], "PVPActiveTournaments": [],

View File

@ -940,12 +940,7 @@
<div class="form-check"> <div class="form-check">
<input class="form-check-input" type="checkbox" id="worldState.wolfHunt" /> <input class="form-check-input" type="checkbox" id="worldState.wolfHunt" />
<label class="form-check-label" for="worldState.wolfHunt" data-loc="worldState_wolfHunt"></label> <label class="form-check-label" for="worldState.wolfHunt" data-loc="worldState_wolfHunt"></label>
<abbr data-loc-inc="worldState_galleonOfGhouls|worldState_orphixVenom"><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> <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.orphixVenom" />
<label class="form-check-label" for="worldState.orphixVenom" data-loc="worldState_orphixVenom"></label>
<abbr data-loc-inc="worldState_galleonOfGhouls|worldState_wolfHunt|worldState_proxyRebellion"><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>
<div class="form-check"> <div class="form-check">
<input class="form-check-input" type="checkbox" id="worldState.longShadow" /> <input class="form-check-input" type="checkbox" id="worldState.longShadow" />
@ -977,7 +972,6 @@
<div class="form-group mt-2 d-flex gap-2"> <div class="form-group mt-2 d-flex gap-2">
<div class="flex-fill"> <div class="flex-fill">
<label class="form-label" for="worldState.proxyRebellion" data-loc="worldState_proxyRebellion"></label> <label class="form-label" for="worldState.proxyRebellion" data-loc="worldState_proxyRebellion"></label>
<abbr data-loc-inc="worldState_orphixVenom"><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.proxyRebellion" data-default="false"> <select class="form-control" id="worldState.proxyRebellion" data-default="false">
<option value="true" data-loc="enabled"></option> <option value="true" data-loc="enabled"></option>
<option value="false" data-loc="disabled"></option> <option value="false" data-loc="disabled"></option>
@ -1046,42 +1040,6 @@
</select> </select>
</div> </div>
</div> </div>
<div class="form-group mt-2 d-flex gap-2">
<div class="flex-fill">
<label class="form-label" for="worldState.bellyOfTheBeast" data-loc="worldState_bellyOfTheBeast"></label>
<select class="form-control" id="worldState.bellyOfTheBeast" data-default="false">
<option value="true" data-loc="enabled"></option>
<option value="false" data-loc="disabled"></option>
</select>
</div>
<div class="flex-fill">
<form class="form-group" onsubmit="doSaveConfigInt('worldState.bellyOfTheBeastProgressOverride'); return false;">
<label class="form-label" for="worldState.bellyOfTheBeastProgressOverride" data-loc="worldState_bellyOfTheBeastProgressOverride"></label>
<div class="input-group">
<input id="worldState.bellyOfTheBeastProgressOverride" class="form-control" type="number" min="0" max="100" data-default="0" />
<button class="btn btn-secondary" type="submit" data-loc="cheats_save"></button>
</div>
</form>
</div>
</div>
<div class="form-group mt-2 d-flex gap-2">
<div class="flex-fill">
<label class="form-label" for="worldState.eightClaw" data-loc="worldState_eightClaw"></label>
<select class="form-control" id="worldState.eightClaw" data-default="false">
<option value="true" data-loc="enabled"></option>
<option value="false" data-loc="disabled"></option>
</select>
</div>
<div class="flex-fill">
<form class="form-group" onsubmit="doSaveConfigInt('worldState.eightClawProgressOverride'); return false;">
<label class="form-label" for="worldState.eightClawProgressOverride" data-loc="worldState_eightClawProgressOverride"></label>
<div class="input-group">
<input id="worldState.eightClawProgressOverride" class="form-control" type="number" min="0" max="100" data-default="0" />
<button class="btn btn-secondary" type="submit" data-loc="cheats_save"></button>
</div>
</form>
</div>
</div>
<div class="form-group mt-2"> <div class="form-group mt-2">
<label class="form-label" for="worldState.eidolonOverride" data-loc="worldState_eidolonOverride"></label> <label class="form-label" for="worldState.eidolonOverride" data-loc="worldState_eidolonOverride"></label>
<select class="form-control" id="worldState.eidolonOverride" data-default=""> <select class="form-control" id="worldState.eidolonOverride" data-default="">
@ -1163,10 +1121,7 @@
</div> </div>
</div> </div>
<div data-route="/webui/import" data-title="Import | OpenWF WebUI"> <div data-route="/webui/import" data-title="Import | OpenWF WebUI">
<p> <p data-loc="import_importNote"></p>
<span data-loc="import_importNote"></span>
<span data-loc="import_importNote2"></span>
</p>
<textarea class="form-control" id="import-inventory" style="height: calc(100vh - 300px)"></textarea> <textarea class="form-control" id="import-inventory" style="height: calc(100vh - 300px)"></textarea>
<button class="btn btn-primary mt-3" onclick="doImport();" data-loc="import_submit"></button> <button class="btn btn-primary mt-3" onclick="doImport();" data-loc="import_submit"></button>
<p class="mt-3 mb-1" data-loc="import_samples"></p> <p class="mt-3 mb-1" data-loc="import_samples"></p>

View File

@ -251,17 +251,12 @@ dict = {
worldState_dogDays: `Hitzefrei`, worldState_dogDays: `Hitzefrei`,
worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`, worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`,
worldState_wolfHunt: `Wolfsjagd (2025)`, worldState_wolfHunt: `Wolfsjagd (2025)`,
worldState_orphixVenom: `Orphix Gift`,
worldState_longShadow: `Lange Schatten`, worldState_longShadow: `Lange Schatten`,
worldState_hallowedFlame: `Geweihte Flamme`, worldState_hallowedFlame: `Geweihte Flamme`,
worldState_hallowedNightmares: `Geweihte Albträume`, worldState_hallowedNightmares: `Geweihte Albträume`,
worldState_hallowedNightmaresRewards: `[UNTRANSLATED] Hallowed Nightmares Rewards`, worldState_hallowedNightmaresRewards: `[UNTRANSLATED] Hallowed Nightmares Rewards`,
worldState_proxyRebellion: `Proxy-Rebellion`, worldState_proxyRebellion: `Proxy-Rebellion`,
worldState_proxyRebellionRewards: `[UNTRANSLATED] Proxy Rebellion Rewards`, worldState_proxyRebellionRewards: `[UNTRANSLATED] Proxy Rebellion Rewards`,
worldState_bellyOfTheBeast: `Das Innere der Bestie`,
worldState_bellyOfTheBeastProgressOverride: `[UNTRANSLATED] Belly of the Beast Progress`,
worldState_eightClaw: `Acht Klauen`,
worldState_eightClawProgressOverride: `[UNTRANSLATED] Eight Claw Progress`,
worldState_from_year: `[UNTRANSLATED] from |YEAR|`, worldState_from_year: `[UNTRANSLATED] from |YEAR|`,
worldState_pre_year: `[UNTRANSLATED] pre |YEAR|`, worldState_pre_year: `[UNTRANSLATED] pre |YEAR|`,
worldState_incompatibleWith: `[UNTRANSLATED] Incompatible with:`, worldState_incompatibleWith: `[UNTRANSLATED] Incompatible with:`,
@ -308,8 +303,7 @@ dict = {
worldState_varziaFullyStocked: `Varzia hat volles Inventar`, worldState_varziaFullyStocked: `Varzia hat volles Inventar`,
worldState_varziaOverride: `Varzia-Angebotsüberschreibung`, worldState_varziaOverride: `Varzia-Angebotsüberschreibung`,
import_importNote: `[UNTRANSLATED] You can provide a full or partial <code>inventory.php</code> or <code>getShip.php</code> response (client representation) here.`, import_importNote: `Du kannst hier eine vollständige oder teilweise Inventarantwort (Client-Darstellung) einfügen. Alle Felder, die vom Importer unterstützt werden, <b>werden in deinem Account überschrieben</b>.`,
import_importNote2: `Alle Felder, die vom Importer unterstützt werden, <b>werden in deinem Account überschrieben</b>.`,
import_submit: `Absenden`, import_submit: `Absenden`,
import_samples: `Beispiele:`, import_samples: `Beispiele:`,
import_samples_maxFocus: `Alle Fokus-Schulen maximiert`, import_samples_maxFocus: `Alle Fokus-Schulen maximiert`,

View File

@ -250,17 +250,12 @@ dict = {
worldState_dogDays: `Dog Days`, worldState_dogDays: `Dog Days`,
worldState_dogDaysRewards: `Dog Days Rewards`, worldState_dogDaysRewards: `Dog Days Rewards`,
worldState_wolfHunt: `Wolf Hunt (2025)`, worldState_wolfHunt: `Wolf Hunt (2025)`,
worldState_orphixVenom: `Orphix Venom`,
worldState_longShadow: `Long Shadow`, worldState_longShadow: `Long Shadow`,
worldState_hallowedFlame: `Hallowed Flame`, worldState_hallowedFlame: `Hallowed Flame`,
worldState_hallowedNightmares: `Hallowed Nightmares`, worldState_hallowedNightmares: `Hallowed Nightmares`,
worldState_hallowedNightmaresRewards: `Hallowed Nightmares Rewards`, worldState_hallowedNightmaresRewards: `Hallowed Nightmares Rewards`,
worldState_proxyRebellion: `Proxy Rebellion`, worldState_proxyRebellion: `Proxy Rebellion`,
worldState_proxyRebellionRewards: `Proxy Rebellion Rewards`, worldState_proxyRebellionRewards: `Proxy Rebellion Rewards`,
worldState_bellyOfTheBeast: `Belly of the Beast`,
worldState_bellyOfTheBeastProgressOverride: `Belly of the Beast Progress`,
worldState_eightClaw: `Eight Claw`,
worldState_eightClawProgressOverride: `Eight Claw Progress`,
worldState_from_year: `from |YEAR|`, worldState_from_year: `from |YEAR|`,
worldState_pre_year: `pre |YEAR|`, worldState_pre_year: `pre |YEAR|`,
worldState_incompatibleWith: `Incompatible with:`, worldState_incompatibleWith: `Incompatible with:`,
@ -307,8 +302,7 @@ dict = {
worldState_varziaFullyStocked: `Varzia Fully Stocked`, worldState_varziaFullyStocked: `Varzia Fully Stocked`,
worldState_varziaOverride: `Varzia Rotation Override`, worldState_varziaOverride: `Varzia Rotation Override`,
import_importNote: `You can provide a full or partial <code>inventory.php</code> or <code>getShip.php</code> response (client representation) here.`, import_importNote: `You can provide a full or partial inventory response (client respresentation) here. All fields that are supported by the importer <b>will be overwritten</b> in your account.`,
import_importNote2: `All fields that are supported by the importer <b>will be overwritten</b> in your account.`,
import_submit: `Submit`, import_submit: `Submit`,
import_samples: `Samples:`, import_samples: `Samples:`,
import_samples_maxFocus: `All Focus Schools Maxed Out`, import_samples_maxFocus: `All Focus Schools Maxed Out`,

View File

@ -251,17 +251,12 @@ dict = {
worldState_dogDays: `Canícula`, worldState_dogDays: `Canícula`,
worldState_dogDaysRewards: `Recompensas de Canícula`, worldState_dogDaysRewards: `Recompensas de Canícula`,
worldState_wolfHunt: `Cacería del Lobo (2025)`, worldState_wolfHunt: `Cacería del Lobo (2025)`,
worldState_orphixVenom: `Veneno de Orphix`,
worldState_longShadow: `Sombra Prolongada`, worldState_longShadow: `Sombra Prolongada`,
worldState_hallowedFlame: `Llama Sagrada`, worldState_hallowedFlame: `Llama Sagrada`,
worldState_hallowedNightmares: `Pesadillas Sagradas`, worldState_hallowedNightmares: `Pesadillas Sagradas`,
worldState_hallowedNightmaresRewards: `Recompensas de Pesadillas Sagradas`, worldState_hallowedNightmaresRewards: `Recompensas de Pesadillas Sagradas`,
worldState_proxyRebellion: `Rebelión Proxy`, worldState_proxyRebellion: `Rebelión Proxy`,
worldState_proxyRebellionRewards: `Recompensas de Rebelión Proxy`, worldState_proxyRebellionRewards: `Recompensas de Rebelión Proxy`,
worldState_bellyOfTheBeast: `Vientre de la Bestia`,
worldState_bellyOfTheBeastProgressOverride: `[UNTRANSLATED] Belly of the Beast Progress`,
worldState_eightClaw: `Octava Garra`,
worldState_eightClawProgressOverride: `[UNTRANSLATED] Eight Claw Progress`,
worldState_from_year: `de |YEAR|`, worldState_from_year: `de |YEAR|`,
worldState_pre_year: `antes de |YEAR|`, worldState_pre_year: `antes de |YEAR|`,
worldState_incompatibleWith: `No compatible con:`, worldState_incompatibleWith: `No compatible con:`,
@ -308,8 +303,7 @@ dict = {
worldState_varziaFullyStocked: `Varzia con stock completo`, worldState_varziaFullyStocked: `Varzia con stock completo`,
worldState_varziaOverride: `Cambio en rotación de Varzia`, worldState_varziaOverride: `Cambio en rotación de Varzia`,
import_importNote: `[UNTRANSLATED] You can provide a full or partial <code>inventory.php</code> or <code>getShip.php</code> response (client representation) here.`, import_importNote: `Puedes proporcionar una respuesta de inventario completa o parcial (representación del cliente) aquí. Todos los campos compatibles con el importador <b>serán sobrescritos</b> en tu cuenta.`,
import_importNote2: `Todos los campos compatibles con el importador <b>serán sobrescritos</b> en tu cuenta.`,
import_submit: `Enviar`, import_submit: `Enviar`,
import_samples: `Muestras:`, import_samples: `Muestras:`,
import_samples_maxFocus: `Todas las escuelas de enfoque al máximo`, import_samples_maxFocus: `Todas las escuelas de enfoque al máximo`,

View File

@ -251,17 +251,12 @@ dict = {
worldState_dogDays: `Bataille d'Eau`, worldState_dogDays: `Bataille d'Eau`,
worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`, worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`,
worldState_wolfHunt: `Chasse au Loup (2025)`, worldState_wolfHunt: `Chasse au Loup (2025)`,
worldState_orphixVenom: `Venin Orphix`,
worldState_longShadow: `La Propagation des Ombres`, worldState_longShadow: `La Propagation des Ombres`,
worldState_hallowedFlame: `Flamme Hantée`, worldState_hallowedFlame: `Flamme Hantée`,
worldState_hallowedNightmares: `Cauchemars Hantés`, worldState_hallowedNightmares: `Cauchemars Hantés`,
worldState_hallowedNightmaresRewards: `[UNTRANSLATED] Hallowed Nightmares Rewards`, worldState_hallowedNightmaresRewards: `[UNTRANSLATED] Hallowed Nightmares Rewards`,
worldState_proxyRebellion: `Rébellion Proxy`, worldState_proxyRebellion: `Rébellion Proxy`,
worldState_proxyRebellionRewards: `[UNTRANSLATED] Proxy Rebellion Rewards`, worldState_proxyRebellionRewards: `[UNTRANSLATED] Proxy Rebellion Rewards`,
worldState_bellyOfTheBeast: `Ventre de la Bête`,
worldState_bellyOfTheBeastProgressOverride: `[UNTRANSLATED] Belly of the Beast Progress`,
worldState_eightClaw: `Huitième Griffe`,
worldState_eightClawProgressOverride: `[UNTRANSLATED] Eight Claw Progress`,
worldState_from_year: `[UNTRANSLATED] from |YEAR|`, worldState_from_year: `[UNTRANSLATED] from |YEAR|`,
worldState_pre_year: `[UNTRANSLATED] pre |YEAR|`, worldState_pre_year: `[UNTRANSLATED] pre |YEAR|`,
worldState_incompatibleWith: `[UNTRANSLATED] Incompatible with:`, worldState_incompatibleWith: `[UNTRANSLATED] Incompatible with:`,
@ -308,8 +303,7 @@ dict = {
worldState_varziaFullyStocked: `Stock de Varzia au max`, worldState_varziaFullyStocked: `Stock de Varzia au max`,
worldState_varziaOverride: `Rotation de Varzia`, worldState_varziaOverride: `Rotation de Varzia`,
import_importNote: `[UNTRANSLATED] You can provide a full or partial <code>inventory.php</code> or <code>getShip.php</code> response (client representation) here.`, import_importNote: `Import manuel. Toutes les modifcations supportées par l'inventaire <b>écraseront celles présentes dans la base de données</b>.`,
import_importNote2: `[UNTRANSLATED] All fields that are supported by the importer <b>will be overwritten</b> in your account.`,
import_submit: `Soumettre`, import_submit: `Soumettre`,
import_samples: `Échantillons :`, import_samples: `Échantillons :`,
import_samples_maxFocus: `Toutes les écoles de focus au rang max`, import_samples_maxFocus: `Toutes les écoles de focus au rang max`,

View File

@ -25,12 +25,12 @@ dict = {
code_traumaticPeculiar: `Травмирующая Странность`, code_traumaticPeculiar: `Травмирующая Странность`,
code_starter: `|MOD| (Повреждённый)`, code_starter: `|MOD| (Повреждённый)`,
code_badItem: `(Самозванец)`, code_badItem: `(Самозванец)`,
code_maxRank: `Макс. ранг`, code_maxRank: `Максимальный ранг`,
code_rename: `Переименовать`, code_rename: `Переименовать`,
code_renamePrompt: `Введите новое имя:`, code_renamePrompt: `Введите новое имя:`,
code_remove: `Удалить`, code_remove: `Удалить`,
code_addItemsConfirm: `Вы уверены, что хотите добавить |COUNT| предметов на ваш аккаунт?`, code_addItemsConfirm: `Вы уверены, что хотите добавить |COUNT| предметов на ваш аккаунт?`,
code_succRankUp: `Ранг успешно повышен.`, code_succRankUp: `Ранг успешно повышен`,
code_noEquipmentToRankUp: `Нет снаряжения для повышения ранга.`, code_noEquipmentToRankUp: `Нет снаряжения для повышения ранга.`,
code_succAdded: `Успешно добавлено.`, code_succAdded: `Успешно добавлено.`,
code_succRemoved: `Успешно удалено.`, code_succRemoved: `Успешно удалено.`,
@ -39,11 +39,11 @@ dict = {
code_rerollsNumber: `Количество рероллов`, code_rerollsNumber: `Количество рероллов`,
code_viewStats: `Просмотр характеристики`, code_viewStats: `Просмотр характеристики`,
code_rank: `Ранг`, code_rank: `Ранг`,
code_rankUp: `Повысить ранг`, code_rankUp: `Повысить Ранг`,
code_rankDown: `Понизить ранг`, code_rankDown: `Понизить Ранг`,
code_count: `Количество`, code_count: `Количество`,
code_focusAllUnlocked: `Все школы Фокуса уже разблокированы.`, code_focusAllUnlocked: `Все школы фокуса уже разблокированы.`,
code_focusUnlocked: `Разблокировано |COUNT| новых школ Фокуса! Для отображения изменений в игре потребуется обновление инвентаря. Посещение навигации — самый простой способ этого добиться.`, code_focusUnlocked: `Разблокировано |COUNT| новых школ фокуса! Для отображения изменений в игре потребуется обновление инвентаря. Посещение навигации — самый простой способ этого добиться.`,
code_addModsConfirm: `Вы уверены, что хотите добавить |COUNT| модов на ваш аккаунт?`, code_addModsConfirm: `Вы уверены, что хотите добавить |COUNT| модов на ваш аккаунт?`,
code_succImport: `Успешно импортировано.`, code_succImport: `Успешно импортировано.`,
code_succRelog: `Готово. Обратите внимание, что вам нужно будет перезайти, чтобы увидеть изменения в игре.`, code_succRelog: `Готово. Обратите внимание, что вам нужно будет перезайти, чтобы увидеть изменения в игре.`,
@ -83,7 +83,7 @@ dict = {
inventory_pistols: `Вторичное оружие`, inventory_pistols: `Вторичное оружие`,
inventory_melee: `Оружие ближнего боя`, inventory_melee: `Оружие ближнего боя`,
inventory_spaceSuits: `Арчвинги`, inventory_spaceSuits: `Арчвинги`,
inventory_spaceGuns: `Оружие Арчвинга`, inventory_spaceGuns: `Оружие арчвинга`,
inventory_spaceMelee: `Оружие ближнего боя арчвинга`, inventory_spaceMelee: `Оружие ближнего боя арчвинга`,
inventory_mechSuits: `Некрамехи`, inventory_mechSuits: `Некрамехи`,
inventory_sentinels: `Стражи`, inventory_sentinels: `Стражи`,
@ -94,21 +94,21 @@ dict = {
inventory_kubrowPets: `Звери`, inventory_kubrowPets: `Звери`,
inventory_evolutionProgress: `Прогресс эволюции Инкарнонов`, inventory_evolutionProgress: `Прогресс эволюции Инкарнонов`,
inventory_Boosters: `Бустеры`, inventory_Boosters: `Бустеры`,
inventory_bulkAddSuits: `Добавить отсутствующие Варфреймы`, inventory_bulkAddSuits: `Добавить отсутствующие варфреймы`,
inventory_bulkAddWeapons: `Добавить отсутствующее оружие`, inventory_bulkAddWeapons: `Добавить отсутствующее оружие`,
inventory_bulkAddSpaceSuits: `Добавить отсутствующие Арчвинги`, inventory_bulkAddSpaceSuits: `Добавить отсутствующие арчвинги`,
inventory_bulkAddSpaceWeapons: `Добавить отсутствующее оружие Арчвингов`, inventory_bulkAddSpaceWeapons: `Добавить отсутствующее оружие арчвингов`,
inventory_bulkAddSentinels: `Добавить отсутствующих Стражей`, inventory_bulkAddSentinels: `Добавить отсутствующих стражей`,
inventory_bulkAddSentinelWeapons: `Добавить отсутствующее оружие Стражей`, inventory_bulkAddSentinelWeapons: `Добавить отсутствующее оружие стражей`,
inventory_bulkAddEvolutionProgress: `Добавить отсутствующий прогресс эволюции Инкарнонов`, inventory_bulkAddEvolutionProgress: `Добавить отсутствующий прогресс эволюции Инкарнонов`,
inventory_bulkRankUpSuits: `Макс. ранг всех Варфреймов`, inventory_bulkRankUpSuits: `Максимальный ранг всех варфреймов`,
inventory_bulkRankUpWeapons: `Макс. ранг всего оружия`, inventory_bulkRankUpWeapons: `Максимальный ранг всего оружия`,
inventory_bulkRankUpSpaceSuits: `Макс. ранг всех Арчвингов`, inventory_bulkRankUpSpaceSuits: `Максимальный ранг всех арчвингов`,
inventory_bulkRankUpSpaceWeapons: `Макс. ранг всего оружия Арчвингов`, inventory_bulkRankUpSpaceWeapons: `Максимальный ранг всего оружия арчвингов`,
inventory_bulkRankUpSentinels: `Макс. ранг всех Стражей`, inventory_bulkRankUpSentinels: `Максимальный ранг всех стражей`,
inventory_bulkRankUpSentinelWeapons: `Макс. ранг всего оружия Стражей`, inventory_bulkRankUpSentinelWeapons: `Максимальный ранг всего оружия стражей`,
inventory_bulkRankUpEvolutionProgress: `Макс. ранг всех эволюций Инкарнонов`, inventory_bulkRankUpEvolutionProgress: `Максимальный ранг всех эволюций Инкарнонов`,
inventory_maxPlexus: `Макс. ранг Плексуса`, inventory_maxPlexus: `Максимальный ранг Плексуса`,
quests_list: `Квесты`, quests_list: `Квесты`,
quests_completeAll: `Завершить все квесты`, quests_completeAll: `Завершить все квесты`,
@ -121,53 +121,53 @@ dict = {
currency_PrimeTokens: `Королевские Айя`, currency_PrimeTokens: `Королевские Айя`,
currency_owned: `У тебя |COUNT|.`, currency_owned: `У тебя |COUNT|.`,
detailedView_archonShardsLabel: `Ячейки осколков Архонта`, detailedView_archonShardsLabel: `Ячейки осколков архонта`,
detailedView_archonShardsDescription: `Вы можете использовать эти неограниченные ячейки для установки множества улучшений.`, detailedView_archonShardsDescription: `Вы можете использовать эти неограниченные ячейки для установки множества улучшений.`,
detailedView_archonShardsDescription2: `Обратите внимание: каждый осколок Архонта применяется с задержкой при загрузке.`, detailedView_archonShardsDescription2: `Обратите внимание: каждый осколок архонта применяется с задержкой при загрузке.`,
detailedView_valenceBonusLabel: `Бонус Валентности`, detailedView_valenceBonusLabel: `Бонус Валентности`,
detailedView_valenceBonusDescription: `Вы можете установить или убрать бонус Валентности с вашего оружия.`, detailedView_valenceBonusDescription: `Вы можете установить или убрать бонус валентности с вашего оружия.`,
detailedView_modularPartsLabel: `Изменить модульные части`, detailedView_modularPartsLabel: `Изменить Модульные Части`,
detailedView_suitInvigorationLabel: `Воодушевление Варфрейма`, detailedView_suitInvigorationLabel: `Воодушевление Варфрейма`,
detailedView_loadoutLabel: `Конфигурации`, detailedView_loadoutLabel: `Конфигурации`,
invigorations_offensive_AbilityStrength: `+200% к силе способностей.`, invigorations_offensive_AbilityStrength: `+200% Сила Способностей`,
invigorations_offensive_AbilityRange: `+100% к зоне поражения способностей.`, invigorations_offensive_AbilityRange: `+100% Радиус Способностей`,
invigorations_offensive_AbilityDuration: `+100% к длительности способностей.`, invigorations_offensive_AbilityDuration: `+100% Длительность Способностей`,
invigorations_offensive_MeleeDamage: `+250% к урону оружия ближнего боя.`, invigorations_offensive_MeleeDamage: `+250% Урон Ближнего Боя`,
invigorations_offensive_PrimaryDamage: `+250% к урону основного оружия.`, invigorations_offensive_PrimaryDamage: `+250% Урон Основного Оружия`,
invigorations_offensive_SecondaryDamage: `+250% к урону вторичного оружия.`, invigorations_offensive_SecondaryDamage: `+250% Урон Вторичного Оружия`,
invigorations_offensive_PrimaryCritChance: `+200% к шансу крит. урона для основного оружия.`, invigorations_offensive_PrimaryCritChance: `+200% Шанс Критического Урона Основного Оружия`,
invigorations_offensive_SecondaryCritChance: `+200% к шансу крит. урона для вторичного оружия.`, invigorations_offensive_SecondaryCritChance: `+200% Шанс Критического Урона Вторичного Оружия`,
invigorations_offensive_MeleeCritChance: `+200% у шансу крит. урона для оружия ближнего боя.`, invigorations_offensive_MeleeCritChance: `+200% Шанс Критического Урона Ближнего Боя`,
invigorations_utility_AbilityEfficiency: `+75% к энергоэффективности способностей.`, invigorations_utility_AbilityEfficiency: `+75% Энергоэффективность Способностей`,
invigorations_utility_SprintSpeed: `+75% к скорости бега.`, invigorations_utility_SprintSpeed: `+75% Скорость Бега`,
invigorations_utility_ParkourVelocity: `+75% к скорости паркура.`, invigorations_utility_ParkourVelocity: `+75% Скорость Паркура`,
invigorations_utility_HealthMax: `+1000 к здоровью.`, invigorations_utility_HealthMax: `+1000 Здоровья`,
invigorations_utility_EnergyMax: `+200% к макс. запасу энергии.`, invigorations_utility_EnergyMax: `+200% Максимум Энергии`,
invigorations_utility_StatusImmune: `Иммунитет к статусным эффектам.`, invigorations_utility_StatusImmune: `Иммунитет к Эффектам Статуса`,
invigorations_utility_ReloadSpeed: `+75% к скорости перезарядки.`, invigorations_utility_ReloadSpeed: `+75% Скорость Перезарядки`,
invigorations_utility_HealthRegen: `+25 к регенерации здоровья в секунду.`, invigorations_utility_HealthRegen: `+25 Здоровья в секунду`,
invigorations_utility_ArmorMax: `+1000 к брони.`, invigorations_utility_ArmorMax: `+1000 Брони`,
invigorations_utility_Jumps: `+5 сбросов прыжка.`, invigorations_utility_Jumps: `+5 Сбросов Прыжков`,
invigorations_utility_EnergyRegen: `+2 к регенерации энергии в секунду.`, invigorations_utility_EnergyRegen: `+2 Энергии в секунду`,
invigorations_offensiveLabel: `Атакующее улучшение`, invigorations_offensiveLabel: `Атакующее Улучшение`,
invigorations_defensiveLabel: `Вспомогательное улучшение`, invigorations_defensiveLabel: `Вспомогательное Улучшение`,
invigorations_expiryLabel: `Срок действия Воодушевления (необязательно)`, invigorations_expiryLabel: `Срок действия Воодушевления (необязательно)`,
abilityOverride_label: `Переопределение способности`, abilityOverride_label: `Переопределение способности`,
abilityOverride_onSlot: `в ячейке`, abilityOverride_onSlot: `в ячейке`,
mods_addRiven: `Добавить мод Разлома`, mods_addRiven: `Добавить Мод Разлома`,
mods_fingerprint: `Отпечаток`, mods_fingerprint: `Отпечаток`,
mods_fingerprintHelp: `Нужна помощь с отпечатком?`, mods_fingerprintHelp: `Нужна помощь с отпечатком?`,
mods_rivens: `Моды Разлома`, mods_rivens: `Моды Разлома`,
mods_mods: `Моды`, mods_mods: `Моды`,
mods_addMax: `Добавить макс. улучшенный`, mods_addMax: `Добавить максимально улучшенный`,
mods_addMissingUnrankedMods: `Добавить недостающие моды без ранга`, mods_addMissingUnrankedMods: `Добавить недостающие моды без ранга`,
mods_removeUnranked: `Удалить моды без ранга`, mods_removeUnranked: `Удалить моды без ранга`,
mods_addMissingMaxRankMods: `Добавить недостающие моды макс. ранга`, mods_addMissingMaxRankMods: `Добавить недостающие моды максимального ранга`,
cheats_administratorRequirement: `Вы должны быть администратором для использования этой функции. Чтобы стать администратором, добавьте <code>\"|DISPLAYNAME|\"</code> в <code>administratorNames</code> в config.json.`, cheats_administratorRequirement: `Вы должны быть администратором для использования этой функции. Чтобы стать администратором, добавьте <code>\"|DISPLAYNAME|\"</code> в <code>administratorNames</code> в config.json.`,
cheats_server: `Сервер`, cheats_server: `Сервер`,
cheats_skipTutorial: `Пропустить обучение`, cheats_skipTutorial: `Пропустить обучение`,
@ -175,14 +175,14 @@ dict = {
cheats_unlockAllScans: `Разблокировать все сканирования`, cheats_unlockAllScans: `Разблокировать все сканирования`,
cheats_unlockAllMissions: `Разблокировать все миссии`, cheats_unlockAllMissions: `Разблокировать все миссии`,
cheats_unlockAllMissions_ok: `Успех. Пожалуйста, обратите внимание, что вам нужно будет войти в Додзё/Реле или перезайти, чтобы клиент обновил звездную карту.`, cheats_unlockAllMissions_ok: `Успех. Пожалуйста, обратите внимание, что вам нужно будет войти в Додзё/Реле или перезайти, чтобы клиент обновил звездную карту.`,
cheats_infiniteCredits: `Бесконечные Кредиты`, cheats_infiniteCredits: `Бесконечные кредиты`,
cheats_infinitePlatinum: `Бесконечная Платина`, cheats_infinitePlatinum: `Бесконечная платина`,
cheats_infiniteEndo: `Бесконечное Эндо`, cheats_infiniteEndo: `Бесконечное эндо`,
cheats_infiniteRegalAya: `Бесконечная Королевская Айя`, cheats_infiniteRegalAya: `Бесконечная Королевская Айя`,
cheats_infiniteHelminthMaterials: `Бесконечные секреции Гельминта`, cheats_infiniteHelminthMaterials: `Бесконечные Секреции Гельминта`,
cheats_claimingBlueprintRefundsIngredients: `Возврат ингредиентов чертежей`, cheats_claimingBlueprintRefundsIngredients: `Возврат ингредиентов чертежей`,
cheats_dontSubtractPurchaseCreditCost: `Не вычитать стоимость Кредитов при покупке`, cheats_dontSubtractPurchaseCreditCost: `Не вычитать стоимость кредитов при покупке`,
cheats_dontSubtractPurchasePlatinumCost: `Не вычитать стоимость Платины при покупке`, cheats_dontSubtractPurchasePlatinumCost: `Не вычитать стоимость платины при покупке`,
cheats_dontSubtractPurchaseItemCost: `Не вычитать стоимость предметов при покупке`, cheats_dontSubtractPurchaseItemCost: `Не вычитать стоимость предметов при покупке`,
cheats_dontSubtractPurchaseStandingCost: `Не вычитать стоимость репутации при покупке`, cheats_dontSubtractPurchaseStandingCost: `Не вычитать стоимость репутации при покупке`,
cheats_dontSubtractVoidTraces: `Не вычитать количество Отголосков Бездны`, cheats_dontSubtractVoidTraces: `Не вычитать количество Отголосков Бездны`,
@ -196,10 +196,10 @@ dict = {
cheats_universalPolarityEverywhere: `Универсальная полярность везде`, cheats_universalPolarityEverywhere: `Универсальная полярность везде`,
cheats_unlockDoubleCapacityPotatoesEverywhere: `Реакторы/Катализаторы орокин везде`, cheats_unlockDoubleCapacityPotatoesEverywhere: `Реакторы/Катализаторы орокин везде`,
cheats_unlockExilusEverywhere: `Адаптеры Эксилус везде`, cheats_unlockExilusEverywhere: `Адаптеры Эксилус везде`,
cheats_unlockArcanesEverywhere: `Адаптеры для Мистификаторов везде`, cheats_unlockArcanesEverywhere: `Адаптеры для мистификаторов везде`,
cheats_noDailyStandingLimits: `Без ежедневных лимитов репутации`, cheats_noDailyStandingLimits: `Без ежедневных лимитов репутации`,
cheats_noDailyFocusLimit: `Без ежедневных лимитов Фокуса`, cheats_noDailyFocusLimit: `Без ежедневных лимитов фокуса`,
cheats_noArgonCrystalDecay: `Без распада Аргоновых кристаллов`, cheats_noArgonCrystalDecay: `Без распада аргоновых кристаллов`,
cheats_noMasteryRankUpCooldown: `Повышение ранга мастерства без кулдауна`, cheats_noMasteryRankUpCooldown: `Повышение ранга мастерства без кулдауна`,
cheats_noVendorPurchaseLimits: `Отсутствие лимитов на покупки у торговцев`, cheats_noVendorPurchaseLimits: `Отсутствие лимитов на покупки у торговцев`,
cheats_noDeathMarks: `Без меток смерти`, cheats_noDeathMarks: `Без меток смерти`,
@ -209,28 +209,28 @@ dict = {
cheats_baroFullyStocked: `Баро полностью укомплектован`, cheats_baroFullyStocked: `Баро полностью укомплектован`,
cheats_syndicateMissionsRepeatable: `Повторять миссии синдиката`, cheats_syndicateMissionsRepeatable: `Повторять миссии синдиката`,
cheats_unlockAllProfitTakerStages: `Разблокировать все этапы Сферы извлечения прибыли`, cheats_unlockAllProfitTakerStages: `Разблокировать все этапы Сферы извлечения прибыли`,
cheats_instantFinishRivenChallenge: `Мгновенное завершение испытания мода Разлома`, cheats_instantFinishRivenChallenge: `Мгновенное завершение испытания Мода разлома`,
cheats_instantResourceExtractorDrones: `Мгновенно добывающие Дроны-сборщики`, cheats_instantResourceExtractorDrones: `Мгновенно добывающие дроны-сборщики`,
cheats_noResourceExtractorDronesDamage: `Без урона по Дронам-сборщикам`, cheats_noResourceExtractorDronesDamage: `Без урона по дронам-сборщикам`,
cheats_skipClanKeyCrafting: `Пропустить создание кланового ключа`, cheats_skipClanKeyCrafting: `Пропустить крафт кланового ключа`,
cheats_noDojoRoomBuildStage: `Мгновенное строительство комнат Додзё`, cheats_noDojoRoomBuildStage: `Мгновенное строительство Комнат Додзё`,
cheats_noDojoDecoBuildStage: `Мгновенное строительство декораций Додзё`, cheats_noDojoDecoBuildStage: `Мгновенное строительство Декораций Додзё`,
cheats_fastDojoRoomDestruction: `Мгновенные уничтожение комнат Додзё`, cheats_fastDojoRoomDestruction: `Мгновенные Уничтожение Комнат Додзё`,
cheats_noDojoResearchCosts: `Бесплатные исследование Додзё`, cheats_noDojoResearchCosts: `Бесплатные Исследование Додзё`,
cheats_noDojoResearchTime: `Мгновенные исследование Додзё`, cheats_noDojoResearchTime: `Мгновенные Исследование Додзё`,
cheats_fastClanAscension: `Мгновенное вознесение клана`, cheats_fastClanAscension: `Мгновенное Вознесение Клана`,
cheats_missionsCanGiveAllRelics: `Миссии могут давать все реликвии`, cheats_missionsCanGiveAllRelics: `Миссии могут давать все реликвии`,
cheats_exceptionalRelicsAlwaysGiveBronzeReward: `Необычные реликвии всегда дают бронзовую награду`, cheats_exceptionalRelicsAlwaysGiveBronzeReward: `Необычные реликвии всегда дают бронзовую награду`,
cheats_flawlessRelicsAlwaysGiveSilverReward: `Бесподобные реликвии всегда дают серебряную награду`, cheats_flawlessRelicsAlwaysGiveSilverReward: `Бесподобные реликвии всегда дают серебряную награду`,
cheats_radiantRelicsAlwaysGiveGoldReward: `Сияющие реликвии всегда дают золотую награду`, cheats_radiantRelicsAlwaysGiveGoldReward: `Сияющие реликвии всегда дают золотую награду`,
cheats_unlockAllSimarisResearchEntries: `Разблокировать все записи исследований Симэриса`, cheats_unlockAllSimarisResearchEntries: `Разблокировать все записи исследований Симэриса`,
cheats_disableDailyTribute: `Отключить ежедневные награды`, cheats_disableDailyTribute: `Отключить Ежедневные награды`,
cheats_spoofMasteryRank: `Поддельный ранг мастерства (-1 для отключения)`, cheats_spoofMasteryRank: `Поддельный ранг мастерства (-1 для отключения)`,
cheats_relicRewardItemCountMultiplier: `Мультипликатор количества предметов награды реликвии`, cheats_relicRewardItemCountMultiplier: `Мультипликатор количества предметов награды реликвии`,
cheats_nightwaveStandingMultiplier: `Мультипликатор репутации Ночной волны`, cheats_nightwaveStandingMultiplier: `Мультипликатор репутации Ночной волны`,
cheats_save: `Сохранить`, cheats_save: `Сохранить`,
cheats_account: `Аккаунт`, cheats_account: `Аккаунт`,
cheats_unlockAllFocusSchools: `Разблокировать все школы Фокуса`, cheats_unlockAllFocusSchools: `Разблокировать все школы фокуса`,
cheats_helminthUnlockAll: `Полностью улучшить Гельминта`, cheats_helminthUnlockAll: `Полностью улучшить Гельминта`,
cheats_addMissingSubsumedAbilities: `Добавить отсутствующие поглощённые способности`, cheats_addMissingSubsumedAbilities: `Добавить отсутствующие поглощённые способности`,
cheats_intrinsicsUnlockAll: `Полностью улучшить Модуляры`, cheats_intrinsicsUnlockAll: `Полностью улучшить Модуляры`,
@ -239,9 +239,9 @@ dict = {
cheats_markAllAsRead: `Пометить все входящие как прочитанные`, cheats_markAllAsRead: `Пометить все входящие как прочитанные`,
worldState: `Состояние мира`, worldState: `Состояние мира`,
worldState_creditBoost: `Глобальный бустер Кредитов`, worldState_creditBoost: `Глобальный бустер кредитов`,
worldState_affinityBoost: `Глобальный бустер Синтеза`, worldState_affinityBoost: `Глобальный бустер синтеза`,
worldState_resourceBoost: `Глобальный бустер Ресурсов`, worldState_resourceBoost: `Глобальный бустер ресурсов`,
worldState_tennoLiveRelay: `Реле TennoLive`, worldState_tennoLiveRelay: `Реле TennoLive`,
worldState_baroTennoConRelay: `Реле Баро TennoCon`, worldState_baroTennoConRelay: `Реле Баро TennoCon`,
worldState_starDays: `Звёздные дни`, worldState_starDays: `Звёздные дни`,
@ -251,17 +251,12 @@ dict = {
worldState_dogDays: `Знойные дни`, worldState_dogDays: `Знойные дни`,
worldState_dogDaysRewards: `Награды Знойных дней`, worldState_dogDaysRewards: `Награды Знойных дней`,
worldState_wolfHunt: `Волчья Охота (2025)`, worldState_wolfHunt: `Волчья Охота (2025)`,
worldState_orphixVenom: `Яд Орфикса`,
worldState_longShadow: `Длинная Тень`, worldState_longShadow: `Длинная Тень`,
worldState_hallowedFlame: `Священное пламя`, worldState_hallowedFlame: `Священное пламя`,
worldState_hallowedNightmares: `Священные кошмары`, worldState_hallowedNightmares: `Священные Кошмары`,
worldState_hallowedNightmaresRewards: `Награды Священных кошмаров`, worldState_hallowedNightmaresRewards: `Награды Священных Кошмаров`,
worldState_proxyRebellion: `Восстание роботов`, worldState_proxyRebellion: `Восстание Роботов`,
worldState_proxyRebellionRewards: `Награды Восстания роботов`, worldState_proxyRebellionRewards: `Награды Восстания Роботов`,
worldState_bellyOfTheBeast: `Чрево зверя`,
worldState_bellyOfTheBeastProgressOverride: `Прогресс Чрева зверя`,
worldState_eightClaw: `Восемь когтей`,
worldState_eightClawProgressOverride: `Прогресс Восьми когтей`,
worldState_from_year: `из |YEAR|`, worldState_from_year: `из |YEAR|`,
worldState_pre_year: `до |YEAR|`, worldState_pre_year: `до |YEAR|`,
worldState_incompatibleWith: `Несовместимо с:`, worldState_incompatibleWith: `Несовместимо с:`,
@ -304,74 +299,73 @@ dict = {
worldState_allAtOnceNormal: `Все сразу, в обычном режиме`, worldState_allAtOnceNormal: `Все сразу, в обычном режиме`,
worldState_allAtOnceSteelPath: `Все сразу, в режиме Стального Пути`, worldState_allAtOnceSteelPath: `Все сразу, в режиме Стального Пути`,
worldState_theCircuitOverride: `Типы миссий в подземелье Дувири`, worldState_theCircuitOverride: `Типы миссий в подземелье Дувири`,
worldState_darvoStockMultiplier: `Множитель запасов Дарво`, worldState_darvoStockMultiplier: `Множитель Запасов Дарво`,
worldState_varziaFullyStocked: `Полный ассортимент Варзии`, worldState_varziaFullyStocked: `Полный Ассортимент Варзии`,
worldState_varziaOverride: `Изменение ротации Варзии`, worldState_varziaOverride: `Изменение Ротации Варзии`,
import_importNote: `Вы можете загрузить полный или частичный ответ <code>inventory.php</code> или <code>getShip.php</code> (клиентское представление) здесь. `, import_importNote: `Вы можете загрузить полный или частичный ответ инвентаря (клиентское представление) здесь. Все поддерживаемые поля <b>будут перезаписаны</b> в вашем аккаунте.`,
import_importNote2: `Все поддерживаемые поля <b>будут перезаписаны</b> в вашем аккаунте.`,
import_submit: `Отправить`, import_submit: `Отправить`,
import_samples: `Пример:`, import_samples: `Пример:`,
import_samples_maxFocus: `Все школы Фокуса макс. уровня`, import_samples_maxFocus: `Все школы Фокуса максимального уровня`,
upgrade_Equilibrium: `Подбор сфер здоровья даёт +|VAL|% энергии. Подбор сфер энергии даёт +|VAL|% здоровья.`, upgrade_Equilibrium: `+|VAL|% Энергия от подбирания здоровья, +|VAL|% Здоровье от подбирания энергии`,
upgrade_MeleeCritDamage: `+|VAL|% к крит. урону в ближнем бою.`, upgrade_MeleeCritDamage: `+|VAL|% Критический урон ближнего боя`,
upgrade_PrimaryStatusChance: `+|VAL|% к шансу статуса основного оружия.`, upgrade_PrimaryStatusChance: `+|VAL|% Шанс наложения статуса основным оружием`,
upgrade_SecondaryCritChance: `+|VAL|% к шансу крит. урона от вторичного оружия.`, upgrade_SecondaryCritChance: `+|VAL|% Шанс критического удара вторичным оружием`,
upgrade_WarframeAbilityDuration: `+|VAL|% к длительности способностей.`, upgrade_WarframeAbilityDuration: `+|VAL|% Длительность способностей`,
upgrade_WarframeAbilityStrength: `+|VAL|% к силе способностей.`, upgrade_WarframeAbilityStrength: `+|VAL|% Сила способностей`,
upgrade_WarframeArmorMax: `+|VAL| к броне.`, upgrade_WarframeArmorMax: `+|VAL| Броня`,
upgrade_WarframeBlastProc: `Регенерирует +|VAL| щитов, когда вы убиваете врага, наложив статус Взрыва.`, upgrade_WarframeBlastProc: `+|VAL| Щиты при убийстве с Взрывным Уроном`,
upgrade_WarframeCastingSpeed: `+|VAL|% к скорости применения способностей.`, upgrade_WarframeCastingSpeed: `+|VAL|% Скорость Применения Способностей`,
upgrade_WarframeCorrosiveDamageBoost: `Даёт +|VAL|% урона от сопсобнстй по врагам, находящимся под действием статуса Коррозии.`, upgrade_WarframeCorrosiveDamageBoost: `+|VAL|% Урон Способностей по врагам, пораженным Коррозией`,
upgrade_WarframeCorrosiveStack: `Увеличить макс. количество стаков статуса Коррози на +|VAL|.`, upgrade_WarframeCorrosiveStack: `Увеличить макс. стаки Коррозии на +|VAL|`,
upgrade_WarframeCritDamageBoost: `Даёт +|VAL|% крит. урона в ближнем бою. Когда макс. энергия превышает 500, увеличение урона удваивается.`, upgrade_WarframeCritDamageBoost: `+|VAL|% Критический Урон Ближнего Боя (Удваивается при 500 Энергии)`,
upgrade_WarframeElectricDamage: `Даёт +|VAL1|% Электрического урона основному оружию. Получите дополнительно +|VAL2|% за каждый экипированный багровый, лазурный или фиолетовый осколок архонта (Комбинируется с модами).`, upgrade_WarframeElectricDamage: `+|VAL1|% Урон Электричеством Основным Оружием (+|VAL2|% за каждый дополнительный Осколок)`,
upgrade_WarframeElectricDamageBoost: `Даёт +|VAL|% урон аот спсобностей по врагам, находящимся под действием статуса Электричества.`, upgrade_WarframeElectricDamageBoost: `+|VAL|% Урон Способностей по врагам, пораженным Электричеством`,
upgrade_WarframeEnergyMax: `+|VAL| к запасу энергии.`, upgrade_WarframeEnergyMax: `+|VAL| Макс. Энергия`,
upgrade_WarframeGlobeEffectEnergy: `+|VAL|% к эффективности сфер энергии.`, upgrade_WarframeGlobeEffectEnergy: `+|VAL|% Эффективность сфер Энергии`,
upgrade_WarframeGlobeEffectHealth: `+|VAL|% к эффективности сфер здоровья.`, upgrade_WarframeGlobeEffectHealth: `+|VAL|% Эффективность сфер Здоровья`,
upgrade_WarframeHealthMax: `+|VAL| к здоровью.`, upgrade_WarframeHealthMax: `+|VAL| Макс. Здоровье`,
upgrade_WarframeHPBoostFromImpact: `Даёт +|VAL1| здоровья за каждого врага, убитого с помощью Взрывного урона. Макс. |VAL2| здоровья.`, upgrade_WarframeHPBoostFromImpact: `+|VAL1| Здоровья при убийстве с Взрывным Уроном (Макс. |VAL2| Здоровья)`,
upgrade_WarframeParkourVelocity: `+|VAL|% к скорости паркура.`, upgrade_WarframeParkourVelocity: `+|VAL|% Скорость Паркура`,
upgrade_WarframeRadiationDamageBoost: `Даёт +|VAL|% урона от способностей по врагам, находящимся под действием статуса Радиации.`, upgrade_WarframeRadiationDamageBoost: `+|VAL|% Урон Способностей по врагам, пораженным Радиацией`,
upgrade_WarframeHealthRegen: `+|VAL| к восстановлению здоровья в секунду.`, upgrade_WarframeHealthRegen: `+|VAL| Здоровья в секунду`,
upgrade_WarframeShieldMax: `+|VAL| к мощности щитов.`, upgrade_WarframeShieldMax: `+|VAL| Щитов`,
upgrade_WarframeStartingEnergy: `+|VAL|% к макс. энергии при появлении.`, upgrade_WarframeStartingEnergy: `+|VAL|% Энергии при Спавне`,
upgrade_WarframeToxinDamage: `Статусный эффект Токсина наносит на +|VAL|% больше урона.`, upgrade_WarframeToxinDamage: `+|VAL|% Урон Токсином`,
upgrade_WarframeToxinHeal: `Восстанавливает +|VAL| здоровья кадый раз, когда враги получают урон от эффекта статуса Токсина.`, upgrade_WarframeToxinHeal: `+|VAL| Здоровья при нанесении урона врагам с Токсином`,
upgrade_WeaponCritBoostFromHeat: `Увеличивает шанс крит. урона вторичным оружием на |VAL1|% каждый раз, когда вы убиваете врага, назодящегося под действием статуса Огня. Макс.: |VAL2|%.`, upgrade_WeaponCritBoostFromHeat: `+|VAL1|% Шанс Критического Удара Вторичным Оружием за каждого убитого врага, пораженного Огнем (Макс. |VAL2|%)`,
upgrade_AvatarAbilityRange: `+7.5% к зоне поражения способностей.`, upgrade_AvatarAbilityRange: `+7.5% Радиус Способностей`,
upgrade_AvatarAbilityEfficiency: `+5% к энергоэффективности способностей.`, upgrade_AvatarAbilityEfficiency: `+5% Энергоэффективность Способностей`,
upgrade_AvatarEnergyRegen: `+0.5 к регенерации энергии в секунду.`, upgrade_AvatarEnergyRegen: `+0.5 Регенерация Энергии в секунду`,
upgrade_AvatarEnemyRadar: `+5м обнаружение врагов.`, upgrade_AvatarEnemyRadar: `+5m обнаружение врагов`,
upgrade_AvatarLootRadar: `+7м к радиусу обнаружения добычи.`, upgrade_AvatarLootRadar: `+7m обнаружение добычи`,
upgrade_WeaponAmmoMax: `+15% макс. боеприпасов.`, upgrade_WeaponAmmoMax: `+15% Макс. Патронов`,
upgrade_EnemyArmorReductionAura: `Враги теряют -3% брони.`, upgrade_EnemyArmorReductionAura: `-3% Броня Врагов`,
upgrade_OnExecutionAmmo: `Убийство Милосердием пополняет магазины основного и вторичного оружия на 100%.`, upgrade_OnExecutionAmmo: `+100% Заполнение Магазина Основного и Вторичного Оружия при убийстве Милосердием`,
upgrade_OnExecutionHealthDrop: `+100% шанс выпадения сферы здоровья при убийстве Милосердием.`, upgrade_OnExecutionHealthDrop: `+100% Шанс Падения сферы Здоровья при убийстве Милосердием`,
upgrade_OnExecutionEnergyDrop: `+50% шанс выпадения сферы энергии при убийстве Милосердием.`, upgrade_OnExecutionEnergyDrop: `+50% Шанс Падения сферы Энергии при убийстве Милосердием`,
upgrade_OnFailHackReset: `+50% шанс доволнительной попытки взлома в случае неудачи.`, upgrade_OnFailHackReset: `+50% Шанс Повтора Взлома`,
upgrade_DamageReductionOnHack: `Уменьшает урон на 75% во время взлома.`, upgrade_DamageReductionOnHack: `+75% Уменьшение Урона во время Взлома`,
upgrade_OnExecutionReviveCompanion: `Убийства Милосердием уменьшают время восстановления компаньона на 15 секунд.`, upgrade_OnExecutionReviveCompanion: `Убийства Милосердием уменьшают время восстановления Компаньона на 15 секунд`,
upgrade_OnExecutionParkourSpeed: `+60% к скорости паркура после убийства Милосердием на 15 секунд.`, upgrade_OnExecutionParkourSpeed: `+60% Скорость Паркура после убийства Милосердием на 15 секунд`,
upgrade_AvatarTimeLimitIncrease: `+8 секунд на взлом.`, upgrade_AvatarTimeLimitIncrease: `+8 секунд к Взлому`,
upgrade_ElectrifyOnHack: `Шокирует врагов в радиусе 20м во время взлома.`, upgrade_ElectrifyOnHack: `Шокировать врагов в пределах 20 метров во время Взлома`,
upgrade_OnExecutionTerrify: `50% шанс, что при убийстве Милосердием враги в радиусе 15м будут параллизованы от страха на 8 секунд.`, upgrade_OnExecutionTerrify: `+50% шанс, что враги в пределах 15 метров будут дрожать от страха в течение 8 секунд после убийства Милосердием`,
upgrade_OnHackLockers: `Открывает 5 контейнеров в радиусе 20м после взлома.`, upgrade_OnHackLockers: `Открыть 5 шкафчиков в пределах 20 метров после Взлома`,
upgrade_OnExecutionBlind: `Ослепляет врагов в радиусе 18м при убийстве Милосердием.`, upgrade_OnExecutionBlind: `Ослепить врагов в пределах 18 метров после убийства Милосердием`,
upgrade_OnExecutionDrainPower: `Следующая способность, применённая после убийства Милосердием, получает +50% к силе способности.`, upgrade_OnExecutionDrainPower: `Следующее использование способности получает +50% Силы Способности после убийства Милосердием`,
upgrade_OnHackSprintSpeed: `+75% к скорости бега после взлома на 15 секунд.`, upgrade_OnHackSprintSpeed: `+75% Скорость Бега в течение 15 секунд после Взлома`,
upgrade_SwiftExecute: `Увеличивает скорость добиваний Милосердием на 50%.`, upgrade_SwiftExecute: `+50% Скорость Убийства Милосердием`,
upgrade_OnHackInvis: `Невидимсть на 15 секунд после взлома.`, upgrade_OnHackInvis: `Невидимость в течение 15 секунд после Взлома`,
damageType_Electricity: `Электрический`, damageType_Electricity: `Электричество`,
damageType_Fire: `Огненный`, damageType_Fire: `Огонь`,
damageType_Freeze: `Холодовой`, damageType_Freeze: `Холод`,
damageType_Impact: `Ударный`, damageType_Impact: `Удар`,
damageType_Magnetic: `Магнитный`, damageType_Magnetic: `Магнит`,
damageType_Poison: `Токсичный`, damageType_Poison: `Токсин`,
damageType_Radiation: `Радиационный`, damageType_Radiation: `Радиация`,
theme_dark: `Темная тема`, theme_dark: `Темная тема`,
theme_light: `Светлая тема`, theme_light: `Светлая тема`,

View File

@ -1,6 +1,6 @@
// Ukrainian translation by LoseFace // Ukrainian translation by LoseFace
dict = { dict = {
general_inventoryUpdateNote: `Пам'ятка: Щоб побачити зміни в грі, вам потрібно повторно синхронізувати своє спорядження, наприклад, використовуючи команду /sync завантажувача, відвідавши Доджьо/Реле або перезавантаживши гру.`, general_inventoryUpdateNote: `Пам'ятка: Щоб побачити зміни в грі, вам потрібно повторно синхронізувати свій інвентар, наприклад, використовуючи команду /sync завантажувача, відвідавши Доджьо/Реле або перезавантаживши гру.`,
general_addButton: `Добавити`, general_addButton: `Добавити`,
general_setButton: `Встановити`, general_setButton: `Встановити`,
general_none: `Відсутній`, general_none: `Відсутній`,
@ -11,8 +11,8 @@ dict = {
code_regFail: `Не вдалося зареєструватися. Обліковий запис вже існує?`, code_regFail: `Не вдалося зареєструватися. Обліковий запис вже існує?`,
code_changeNameConfirm: `Яке ім'я ви хочете встановити для свого облікового запису?`, code_changeNameConfirm: `Яке ім'я ви хочете встановити для свого облікового запису?`,
code_deleteAccountConfirm: `Ви впевнені, що хочете видалити обліковий запис |DISPLAYNAME| (|EMAIL|)? Цю дію не можна скасувати.`, code_deleteAccountConfirm: `Ви впевнені, що хочете видалити обліковий запис |DISPLAYNAME| (|EMAIL|)? Цю дію не можна скасувати.`,
code_archgun: `Арк-гармата`, code_archgun: `Арч-Пушка`,
code_melee: `Холодна зброя`, code_melee: `Ближній бій`,
code_pistol: `Пістолет`, code_pistol: `Пістолет`,
code_rifle: `Гвинтівка`, code_rifle: `Гвинтівка`,
code_shotgun: `Рушниця`, code_shotgun: `Рушниця`,
@ -22,11 +22,11 @@ dict = {
code_amp: `Підсилювач`, code_amp: `Підсилювач`,
code_kDrive: `К-Драйв`, code_kDrive: `К-Драйв`,
code_legendaryCore: `Легендарне ядро`, code_legendaryCore: `Легендарне ядро`,
code_traumaticPeculiar: `Особливе травмування`, code_traumaticPeculiar: `Травмуюча Странність`,
code_starter: `|MOD| (Пошкоджений)`, code_starter: `|MOD| (Пошкоджений)`,
code_badItem: `(Самозванець)`, code_badItem: `(Самозванець)`,
code_maxRank: `Макс. рівень`, code_maxRank: `Максимальний рівень`,
code_rename: `Перейменувати`, code_rename: `Переіменувати`,
code_renamePrompt: `Введіть нове ім'я:`, code_renamePrompt: `Введіть нове ім'я:`,
code_remove: `Видалити`, code_remove: `Видалити`,
code_addItemsConfirm: `Ви впевнені, що хочете додати |COUNT| предметів на ваш обліковий запис?`, code_addItemsConfirm: `Ви впевнені, що хочете додати |COUNT| предметів на ваш обліковий запис?`,
@ -42,15 +42,15 @@ dict = {
code_rankUp: `Підвищити рівень`, code_rankUp: `Підвищити рівень`,
code_rankDown: `Понизити рівень`, code_rankDown: `Понизити рівень`,
code_count: `Кількість`, code_count: `Кількість`,
code_focusAllUnlocked: `Всі школи Фокусу вже розблоковані.`, code_focusAllUnlocked: `Всі школи фокуса вже розблоковані.`,
code_focusUnlocked: `Розблоковано |COUNT| нових шкіл Фокусу! Для відображення змін в грі знадобиться оновлення спорядження. Відвідування навігації — найпростіший спосіб цього досягти.`, code_focusUnlocked: `Розблоковано |COUNT| нових шкіл фокуса! Для відображення змін в грі знадобиться оновлення спорядження. Відвідування навігації — найпростіший спосіб цього досягти.`,
code_addModsConfirm: `Ви впевнені, що хочете додати |COUNT| модифікаторів на ваш обліковий запис?`, code_addModsConfirm: `Ви впевнені, що хочете додати |COUNT| модифікаторів на ваш обліковий запис?`,
code_succImport: `Успішно імпортовано.`, code_succImport: `Успішно імпортовано.`,
code_succRelog: `Готово. Зверніть увагу, що вам потрібно буде перезайти, щоб побачити зміни в грі.`, code_succRelog: `Готово. Зверніть увагу, що вам потрібно буде перезайти, щоб побачити зміни в грі.`,
code_nothingToDo: `Готово. Немає що робити.`, code_nothingToDo: `Готово. Немає що робити.`,
code_gild: `Покращити`, code_gild: `Покращити`,
code_moa: `МОА`, code_moa: `МОА`,
code_zanuka: `Гончак`, code_zanuka: `Гончарка`,
code_stage: `Етап`, code_stage: `Етап`,
code_complete: `Завершити`, code_complete: `Завершити`,
code_nextStage: `Наступний етап`, code_nextStage: `Наступний етап`,
@ -59,56 +59,56 @@ dict = {
code_setInactive: `Зробити пригоду неактивною`, code_setInactive: `Зробити пригоду неактивною`,
code_completed: `Завершено`, code_completed: `Завершено`,
code_active: `Активний`, code_active: `Активний`,
code_pigment: `Барвник`, code_pigment: `Пігмент`,
code_mature: `Виростити для бою`, code_mature: `Підготувати до бою`,
code_unmature: `Обернути старіння`, code_unmature: `Обернути старіння`,
code_succChange: `Успішно змінено.`, code_succChange: `Успішно змінено.`,
code_requiredInvigorationUpgrade: `Ви повинні вибрати як атакуюче, так і допоміжне вдосконалення.`, code_requiredInvigorationUpgrade: `Ви повинні вибрати як атакуюче, так і допоміжне покращення.`,
login_description: `Увійдіть, використовуючи облікові дані OpenWF (ті ж, що й у грі при підключенні до цього серверу).`, login_description: `Увійдіть, використовуючи облікові дані OpenWF (ті ж, що й у грі при підключенні до цього сервера).`,
login_emailLabel: `Адреса електронної пошти`, login_emailLabel: `Адреса електронної пошти`,
login_passwordLabel: `Пароль`, login_passwordLabel: `Пароль`,
login_loginButton: `Увійти`, login_loginButton: `Увійти`,
login_registerButton: `Зареєструватися`, login_registerButton: `Зареєструватися`,
navbar_logout: `Вийти`, navbar_logout: `Вийти`,
navbar_renameAccount: `Перейменувати обліковий запис`, navbar_renameAccount: `Переіменувати обліковий запис`,
navbar_deleteAccount: `Видалити обліковий запис`, navbar_deleteAccount: `Видалити обліковий запис`,
navbar_inventory: `Спорядження`, navbar_inventory: `Спорядження`,
navbar_mods: `Модифікатори`, navbar_mods: `Моди`,
navbar_quests: `Пригоди`, navbar_quests: `Пригоди`,
navbar_cheats: `Чити`, navbar_cheats: `Чити`,
navbar_import: `Імпорт`, navbar_import: `Імпорт`,
inventory_addItems: `Додати предмети`, inventory_addItems: `Додати предмети`,
inventory_suits: `Ворфрейми`, inventory_suits: `Ворфрейми`,
inventory_longGuns: `Основна зброя`, inventory_longGuns: `Основне озброєння`,
inventory_pistols: `Допоміжна зброя`, inventory_pistols: `Допоміжне озброєння`,
inventory_melee: `Холодна зброя`, inventory_melee: `Холодне озброєння`,
inventory_spaceSuits: `Арквінґи`, inventory_spaceSuits: `Арквінґи`,
inventory_spaceGuns: `Зброя Арквінґів`, inventory_spaceGuns: `Озброєння арквінґів`,
inventory_spaceMelee: `Холодна зброя Арквінґів`, inventory_spaceMelee: `Холодне озброєння арквінґів`,
inventory_mechSuits: `Некрамехи`, inventory_mechSuits: `Некрамехи`,
inventory_sentinels: `Вартові`, inventory_sentinels: `Вартові`,
inventory_sentinelWeapons: `Зброя Вартових`, inventory_sentinelWeapons: `Озброєння вартових`,
inventory_operatorAmps: `Підсилювачі`, inventory_operatorAmps: `Підсилювачі`,
inventory_hoverboards: `К-Драйви`, inventory_hoverboards: `К-Драйви`,
inventory_moaPets: `МОА`, inventory_moaPets: `МОА`,
inventory_kubrowPets: `Тварини`, inventory_kubrowPets: `Тварини`,
inventory_evolutionProgress: `Прогрес еволюції Інкарнонів`, inventory_evolutionProgress: `Прогрес Еволюції Інкарнонов`,
inventory_Boosters: `Посилення`, inventory_Boosters: `Бустери`,
inventory_bulkAddSuits: `Додати відсутні Ворфрейми`, inventory_bulkAddSuits: `Додати відсутні ворфрейми`,
inventory_bulkAddWeapons: `Додати відсутню зброю`, inventory_bulkAddWeapons: `Додати відсутнє озброєння`,
inventory_bulkAddSpaceSuits: `Додати відсутні Арквінґи`, inventory_bulkAddSpaceSuits: `Додати відсутні арквінґи`,
inventory_bulkAddSpaceWeapons: `Додати відсутню зброю Арквінґів`, inventory_bulkAddSpaceWeapons: `Додати відсутнє озброєння арквінґів`,
inventory_bulkAddSentinels: `Додати відсутніх Вартових`, inventory_bulkAddSentinels: `Додати відсутніх вартових`,
inventory_bulkAddSentinelWeapons: `Додати відсутню зброю Вартових`, inventory_bulkAddSentinelWeapons: `Додати відсутнє озброєння вартових`,
inventory_bulkAddEvolutionProgress: `Додати відсутній прогрес еволюції Інкарнонів`, inventory_bulkAddEvolutionProgress: `Додати відсутній прогрес Еволюції Інкарнонов`,
inventory_bulkRankUpSuits: `Макс. рівень всіх Ворфреймів`, inventory_bulkRankUpSuits: `Максимальний рівень всіх ворфреймів`,
inventory_bulkRankUpWeapons: `Макс. рівень всієї зброї`, inventory_bulkRankUpWeapons: `Максимальний рівень всього озброєння`,
inventory_bulkRankUpSpaceSuits: `Макс. рівень всіх Арквінґів`, inventory_bulkRankUpSpaceSuits: `Максимальний рівень всіх арквінґів`,
inventory_bulkRankUpSpaceWeapons: `Макс. рівень всієї зброї Арквінґів`, inventory_bulkRankUpSpaceWeapons: `Максимальний рівень всього озброєння арквінґів`,
inventory_bulkRankUpSentinels: `Макс. рівень всіх Вартових`, inventory_bulkRankUpSentinels: `Максимальний рівень всіх вартових`,
inventory_bulkRankUpSentinelWeapons: `Макс. рівень всієї зброї Вартових`, inventory_bulkRankUpSentinelWeapons: `Максимальний рівень всього озброєння вартових`,
inventory_bulkRankUpEvolutionProgress: `Макс. рівень всіх еволюцій Інкарнонів`, inventory_bulkRankUpEvolutionProgress: `Максимальний рівень всіх еволюцій Інкарнонов`,
inventory_maxPlexus: `Макс. рівень Плексу`, inventory_maxPlexus: `Максимальний рівень Плексу`,
quests_list: `Пригоди`, quests_list: `Пригоди`,
quests_completeAll: `Закінчити всі пригоди`, quests_completeAll: `Закінчити всі пригоди`,
@ -121,71 +121,71 @@ dict = {
currency_PrimeTokens: `Королівські Ая`, currency_PrimeTokens: `Королівські Ая`,
currency_owned: `У тебе |COUNT|.`, currency_owned: `У тебе |COUNT|.`,
detailedView_archonShardsLabel: `Комірки уламків Архонта`, detailedView_archonShardsLabel: `Клітинки осколків архонта`,
detailedView_archonShardsDescription: `Ви можете використовувати ці необмежені комірки для встановлення безлічі вдосконалень.`, detailedView_archonShardsDescription: `Ви можете використовувати ці необмежені клітинки для встановлення безлічі вдосконалень.`,
detailedView_archonShardsDescription2: `Зверніть увагу: кожен уламок Архонта застосовується з затримкою при завантаженні.`, detailedView_archonShardsDescription2: `Зверніть увагу: кожен уламок архонта застосовується з затримкою при завантаженні.`,
detailedView_valenceBonusLabel: `Ознака Валентності`, detailedView_valenceBonusLabel: `Ознака Валентності`,
detailedView_valenceBonusDescription: `Ви можете встановити або прибрати ознаку Валентності з вашої зброї.`, detailedView_valenceBonusDescription: `Ви можете встановити або прибрати ознака валентності з вашої зброї.`,
detailedView_modularPartsLabel: `Змінити модульні частини`, detailedView_modularPartsLabel: `Змінити Модульні Частини`,
detailedView_suitInvigorationLabel: `Зміцнення Ворфрейма`, detailedView_suitInvigorationLabel: `Зміцнення Ворфрейма`,
detailedView_loadoutLabel: `Конфігурації`, detailedView_loadoutLabel: `Конфігурації`,
invigorations_offensive_AbilityStrength: `+200% до потужності здібностей.`, invigorations_offensive_AbilityStrength: `+200% Потужності Здібностей`,
invigorations_offensive_AbilityRange: `+100% до досяжності здібностей.`, invigorations_offensive_AbilityRange: `+100% Досяжність Здібностей`,
invigorations_offensive_AbilityDuration: `+100% до тривалості дії здібностей.`, invigorations_offensive_AbilityDuration: `+100% Тривалість Здібностей`,
invigorations_offensive_MeleeDamage: `+250% до шкоди від холодної зброї.`, invigorations_offensive_MeleeDamage: `+250% Шкода Ближнього Бою`,
invigorations_offensive_PrimaryDamage: `+250% до шкоди від основної зброї.`, invigorations_offensive_PrimaryDamage: `+250% Шкода Основного Озброєння`,
invigorations_offensive_SecondaryDamage: `+250% до шкоди від допоміжної зброї.`, invigorations_offensive_SecondaryDamage: `+250% Шкода Допоміжного Озброєння`,
invigorations_offensive_PrimaryCritChance: `+200% до ймовірності критичної шкоди від основної зброї.`, invigorations_offensive_PrimaryCritChance: `+200% Імовірність Критичної Шкоди Основного Озброєння`,
invigorations_offensive_SecondaryCritChance: `+200% до ймовірності критичної шкоди від допоміжної зброї.`, invigorations_offensive_SecondaryCritChance: `+200% Імовірність Критичної Шкоди Допоміжного Озброєння`,
invigorations_offensive_MeleeCritChance: `+200% до ймовірності критичної шкоди від холодної зброї.`, invigorations_offensive_MeleeCritChance: `+200% Імовірність Критичної Шкоди Ближнього Бою`,
invigorations_utility_AbilityEfficiency: `+75% до ощадливості здібностей.`, invigorations_utility_AbilityEfficiency: `+75% Ощадливість Здібностей`,
invigorations_utility_SprintSpeed: `+75% до швидкості бігу.`, invigorations_utility_SprintSpeed: `+75% Швидкість Бігу`,
invigorations_utility_ParkourVelocity: `+75% до швидкості паркуру.`, invigorations_utility_ParkourVelocity: `+75% Швидкість Паркура`,
invigorations_utility_HealthMax: `+1000 до здоров'я.`, invigorations_utility_HealthMax: `+1000 Здоров'я`,
invigorations_utility_EnergyMax: `+200% до макс. енергії.`, invigorations_utility_EnergyMax: `+200% Максимум Енергії`,
invigorations_utility_StatusImmune: `Імунітет до ефектів стану.`, invigorations_utility_StatusImmune: `Імунітет до Ефектів Статусу`,
invigorations_utility_ReloadSpeed: `+75% до швидкості перезаряджання.`, invigorations_utility_ReloadSpeed: `+75% Швидкість Перезаряджання`,
invigorations_utility_HealthRegen: `+25 до відновлення здоров'я на секунду.`, invigorations_utility_HealthRegen: `+25 Здоров'я в секунду`,
invigorations_utility_ArmorMax: `+1000 до захисту.`, invigorations_utility_ArmorMax: `+1000 Захисту`,
invigorations_utility_Jumps: `+5 Оновлень стрибків.`, invigorations_utility_Jumps: `+5 Оновлень Стрибків`,
invigorations_utility_EnergyRegen: `+2 до відновлення енергії на секунду.`, invigorations_utility_EnergyRegen: `+2 Енергії в секунду`,
invigorations_offensiveLabel: `Атакуюче вдосконалення`, invigorations_offensiveLabel: `Атакуюче Вдосконалення`,
invigorations_defensiveLabel: `Допоміжне вдосконалення`, invigorations_defensiveLabel: `Вспомогательное Вдосконалення`,
invigorations_expiryLabel: `Термін дії Зміцнення (необов'язково)`, invigorations_expiryLabel: `Термін дії Зміцнення (необов'язково)`,
abilityOverride_label: `Перевизначення здібностей`, abilityOverride_label: `Перевизначення здібностей`,
abilityOverride_onSlot: `у комірці`, abilityOverride_onSlot: `у клітинці`,
mods_addRiven: `Добавити модифікатор Розколу`, mods_addRiven: `Добавити Модифікатор Розколу`,
mods_fingerprint: `Відбиток`, mods_fingerprint: `Відбиток`,
mods_fingerprintHelp: `Потрібна допомога з відбитком?`, mods_fingerprintHelp: `Потрібна допомога з відбитком?`,
mods_rivens: `Модифікатори Розколу`, mods_rivens: `Модифікатори Розколу`,
mods_mods: `Модифікатори`, mods_mods: `Модифікатори`,
mods_addMax: `Добавити макс. вдосконалений`, mods_addMax: `Добавити максимально вдосконалений`,
mods_addMissingUnrankedMods: `Добавити недостаючі модифікатори без рівня`, mods_addMissingUnrankedMods: `Добавити недостаючі модифікатори без рівня`,
mods_removeUnranked: `Видалити модифікатори без рівня`, mods_removeUnranked: `Видалити модифікатори без рівня`,
mods_addMissingMaxRankMods: `Добавити недостаючі модифікатори макс. рівня`, mods_addMissingMaxRankMods: `Добавити недостаючі модифікатори максимального рівня`,
cheats_administratorRequirement: `Ви повинні бути адміністратором для використання цієї функції. Щоб стати адміністратором, додайте <code>\"|DISPLAYNAME|\"</code> в <code>administratorNames</code> в config.json.`, cheats_administratorRequirement: `Ви повинні бути адміністратором для використання цієї функції. Щоб стати адміністратором, додайте <code>\"|DISPLAYNAME|\"</code> в <code>administratorNames</code> в config.json.`,
cheats_server: `Сервер`, cheats_server: `Сервер`,
cheats_skipTutorial: `Пропустити навчання`, cheats_skipTutorial: `Пропустити навчання`,
cheats_skipAllDialogue: `Пропустити всі діалоги`, cheats_skipAllDialogue: `Пропустити всі діалоги`,
cheats_unlockAllScans: `Розблокувати всі сканування`, cheats_unlockAllScans: `Розблокувати всі сканування`,
cheats_unlockAllMissions: `Розблокувати всі місії`, cheats_unlockAllMissions: `Розблокувати всі місії`,
cheats_unlockAllMissions_ok: `Успіх. Будь ласка, зверніть увагу, що вам потрібно буде увійти в Доджьо/Реле або перезайти, щоб клієнт оновив Зоряну мапу.`, cheats_unlockAllMissions_ok: `Успіх. Будь ласка, зверніть увагу, що вам потрібно буде увійти в Доджьо/Реле або перезайти, щоб клієнт оновив зоряну мапу.`,
cheats_infiniteCredits: `Бескінечні Кредити`, cheats_infiniteCredits: `Бескінечні кредити`,
cheats_infinitePlatinum: `Бескінечна Платина`, cheats_infinitePlatinum: `Бескінечна платина`,
cheats_infiniteEndo: `Бескінечне Ендо`, cheats_infiniteEndo: `Бескінечне ендо`,
cheats_infiniteRegalAya: `Бескінечна Королівська Ая`, cheats_infiniteRegalAya: `Бескінечна Королівська Ая`,
cheats_infiniteHelminthMaterials: `Бескінечні секреції Гельмінта`, cheats_infiniteHelminthMaterials: `Бескінечні Секреції Гельмінта`,
cheats_claimingBlueprintRefundsIngredients: `Повернення інгредієнтів креслеників`, cheats_claimingBlueprintRefundsIngredients: `Повернення інгредієнтів креслеників`,
cheats_dontSubtractPurchaseCreditCost: `Не вираховувати вартість Кредитів при купівлі`, cheats_dontSubtractPurchaseCreditCost: `Не вираховувати вартість кредитів при купівлі`,
cheats_dontSubtractPurchasePlatinumCost: `Не вираховувати вартість Платини при купівлі`, cheats_dontSubtractPurchasePlatinumCost: `Не вираховувати вартість платини при купівлі`,
cheats_dontSubtractPurchaseItemCost: `Не вираховувати вартість предметів при купівлі`, cheats_dontSubtractPurchaseItemCost: `Не вираховувати вартість предметів при купівлі`,
cheats_dontSubtractPurchaseStandingCost: `Не вираховувати вартість репутації при купівлі`, cheats_dontSubtractPurchaseStandingCost: `Не вираховувати вартість репутації при купівлі`,
cheats_dontSubtractVoidTraces: `Не вираховувати кількість Відлуння`, cheats_dontSubtractVoidTraces: `Не вираховувати кількість Відголосків Безодні`,
cheats_dontSubtractConsumables: `Не вираховувати кількість витратних матеріалів`, cheats_dontSubtractConsumables: `Не вираховувати кількість витратних матеріалів`,
cheats_unlockAllShipFeatures: `Розблокувати всі функції судна`, cheats_unlockAllShipFeatures: `Розблокувати всі функції судна`,
cheats_unlockAllShipDecorations: `Розблокувати всі прикраси судна`, cheats_unlockAllShipDecorations: `Розблокувати всі прикраси судна`,
@ -196,10 +196,10 @@ dict = {
cheats_universalPolarityEverywhere: `Будь-яка полярність скрізь`, cheats_universalPolarityEverywhere: `Будь-яка полярність скрізь`,
cheats_unlockDoubleCapacityPotatoesEverywhere: `Орокінські Реактори/Каталізатори скрізь`, cheats_unlockDoubleCapacityPotatoesEverywhere: `Орокінські Реактори/Каталізатори скрізь`,
cheats_unlockExilusEverywhere: `Ексилотримач скрізь`, cheats_unlockExilusEverywhere: `Ексилотримач скрізь`,
cheats_unlockArcanesEverywhere: `Тримач Містифікаторів скрізь`, cheats_unlockArcanesEverywhere: `Тримач містифікаторів скрізь`,
cheats_noDailyStandingLimits: `Без щоденних лімітів репутації`, cheats_noDailyStandingLimits: `Без щоденних лімітів репутації`,
cheats_noDailyFocusLimit: `Без щоденних лімітів Фокусу`, cheats_noDailyFocusLimit: `Без щоденних лімітів фокуса`,
cheats_noArgonCrystalDecay: `Без розпаду Аргонових кристалів`, cheats_noArgonCrystalDecay: `Без розпаду аргонових кристалів`,
cheats_noMasteryRankUpCooldown: `Підвищення ранга майстерності без очікування`, cheats_noMasteryRankUpCooldown: `Підвищення ранга майстерності без очікування`,
cheats_noVendorPurchaseLimits: `Відсутність лімітів на купівлю у продавців`, cheats_noVendorPurchaseLimits: `Відсутність лімітів на купівлю у продавців`,
cheats_noDeathMarks: `Без позначок смерті`, cheats_noDeathMarks: `Без позначок смерті`,
@ -209,16 +209,16 @@ dict = {
cheats_baroFullyStocked: `Баро повністю укомплектований`, cheats_baroFullyStocked: `Баро повністю укомплектований`,
cheats_syndicateMissionsRepeatable: `Повторювати місії синдиката`, cheats_syndicateMissionsRepeatable: `Повторювати місії синдиката`,
cheats_unlockAllProfitTakerStages: `Розблокувати всі етапи Привласнювачки`, cheats_unlockAllProfitTakerStages: `Розблокувати всі етапи Привласнювачки`,
cheats_instantFinishRivenChallenge: `Миттєве завершення випробування модифікатора Розколу`, cheats_instantFinishRivenChallenge: `Миттєве завершення випробування Модифікатора Розколу`,
cheats_instantResourceExtractorDrones: `Миттєво добуваючі Дрони-видобувачі`, cheats_instantResourceExtractorDrones: `Миттєво добуваючі дрони-видобувачі`,
cheats_noResourceExtractorDronesDamage: `Без шкоди по Дронам-видобувачам`, cheats_noResourceExtractorDronesDamage: `Без шкоди по дронам-видобувачам`,
cheats_skipClanKeyCrafting: `Пропустити створення кланового ключа`, cheats_skipClanKeyCrafting: `Пропустити створення кланового ключа`,
cheats_noDojoRoomBuildStage: `Миттєве будівництво кімнат Доджьо`, cheats_noDojoRoomBuildStage: `Миттєве будівництво Кімнат Доджьо`,
cheats_noDojoDecoBuildStage: `Миттєве будівництво декорацій Доджьо`, cheats_noDojoDecoBuildStage: `Миттєве будівництво Декорацій Доджьо`,
cheats_fastDojoRoomDestruction: `Миттєве знищення кімнат Доджьо`, cheats_fastDojoRoomDestruction: `Миттєве знищення Кімнат Доджьо`,
cheats_noDojoResearchCosts: `Безкоштовні дослідження Доджьо`, cheats_noDojoResearchCosts: `Безкоштовні Дослідження Доджьо`,
cheats_noDojoResearchTime: `Миттєві дослідження Доджьо`, cheats_noDojoResearchTime: `Миттєві Дослідження Доджьо`,
cheats_fastClanAscension: `Миттєве піднесення клану`, cheats_fastClanAscension: `Миттєве Піднесення Клану`,
cheats_missionsCanGiveAllRelics: `Місії можуть давати всі реліквії`, cheats_missionsCanGiveAllRelics: `Місії можуть давати всі реліквії`,
cheats_exceptionalRelicsAlwaysGiveBronzeReward: `Вийняткові реліквії завжди дають бронзову нагороду`, cheats_exceptionalRelicsAlwaysGiveBronzeReward: `Вийняткові реліквії завжди дають бронзову нагороду`,
cheats_flawlessRelicsAlwaysGiveSilverReward: `Бездоганні реліквії завжди дають срібну нагороду`, cheats_flawlessRelicsAlwaysGiveSilverReward: `Бездоганні реліквії завжди дають срібну нагороду`,
@ -230,7 +230,7 @@ dict = {
cheats_nightwaveStandingMultiplier: `Множник репутації Нічної хвилі`, cheats_nightwaveStandingMultiplier: `Множник репутації Нічної хвилі`,
cheats_save: `Зберегти`, cheats_save: `Зберегти`,
cheats_account: `Обліковий запис`, cheats_account: `Обліковий запис`,
cheats_unlockAllFocusSchools: `Розблокувати всі школи Фокусу`, cheats_unlockAllFocusSchools: `Розблокувати всі школи фокуса`,
cheats_helminthUnlockAll: `Повністю покращити Гельмінта`, cheats_helminthUnlockAll: `Повністю покращити Гельмінта`,
cheats_addMissingSubsumedAbilities: `Додати відсутні поглинуті здібності`, cheats_addMissingSubsumedAbilities: `Додати відсутні поглинуті здібності`,
cheats_intrinsicsUnlockAll: `Повністю покращити Кваліфікації`, cheats_intrinsicsUnlockAll: `Повністю покращити Кваліфікації`,
@ -239,29 +239,24 @@ dict = {
cheats_markAllAsRead: `Помітити всі вхідні як прочитані`, cheats_markAllAsRead: `Помітити всі вхідні як прочитані`,
worldState: `Стан світу`, worldState: `Стан світу`,
worldState_creditBoost: `Глобальне посилення Кредитів`, worldState_creditBoost: `Глобальний бустер кредитів`,
worldState_affinityBoost: `Глобальне посилення Синтезу`, worldState_affinityBoost: `Глобальний бустер синтезу`,
worldState_resourceBoost: `Глобальне посилення Ресурсів`, worldState_resourceBoost: `Глобальний бустер ресурсів`,
worldState_tennoLiveRelay: `Реле TennoLive`, worldState_tennoLiveRelay: `Реле TennoLive`,
worldState_baroTennoConRelay: `Реле Баро TennoCon`, worldState_baroTennoConRelay: `Реле Баро TennoCon`,
worldState_starDays: `Зоряні дні`, worldState_starDays: `Зоряні дні`,
worldState_galleonOfGhouls: `Гульський галеон`, worldState_galleonOfGhouls: `Гульський Галеон`,
worldState_ghoulEmergence: `Зачищення від гулів`, worldState_ghoulEmergence: `Зачищення від гулів`,
worldState_plagueStar: `Морова зірка`, worldState_plagueStar: `Морова зірка`,
worldState_dogDays: `Спекотні дні`, worldState_dogDays: `Спекотні дні`,
worldState_dogDaysRewards: `Нагороди Спекотних днів`, worldState_dogDaysRewards: `Нагороди Спекотних днів`,
worldState_wolfHunt: `Полювання на Вовка (2025)`, worldState_wolfHunt: `Полювання на Вовка (2025)`,
worldState_orphixVenom: `Орфіксова отрута`,
worldState_longShadow: `Довга тінь`, worldState_longShadow: `Довга тінь`,
worldState_hallowedFlame: `Священне полум'я`, worldState_hallowedFlame: `Священне полум'я`,
worldState_hallowedNightmares: `Священні жахіття`, worldState_hallowedNightmares: `Священні жахіття`,
worldState_hallowedNightmaresRewards: `Нагороди Священних жахіть`, worldState_hallowedNightmaresRewards: `Нагороди Священних Жахіть`,
worldState_proxyRebellion: `Повстання роботів`, worldState_proxyRebellion: `Повстання роботів`,
worldState_proxyRebellionRewards: `Нагороди Повстання роботів`, worldState_proxyRebellionRewards: `Нагороди Повстання роботів`,
worldState_bellyOfTheBeast: `У лігві звіра`,
worldState_bellyOfTheBeastProgressOverride: `Прогрес У лігві звіра`,
worldState_eightClaw: `Вісім кігтів`,
worldState_eightClawProgressOverride: `Прогрес Восьми кігтів`,
worldState_from_year: `з |YEAR|`, worldState_from_year: `з |YEAR|`,
worldState_pre_year: `до |YEAR|`, worldState_pre_year: `до |YEAR|`,
worldState_incompatibleWith: `Несумісне з:`, worldState_incompatibleWith: `Несумісне з:`,
@ -278,9 +273,9 @@ dict = {
worldState_cold: `Холод`, worldState_cold: `Холод`,
worldState_duviriOverride: `Цикл Дувірі`, worldState_duviriOverride: `Цикл Дувірі`,
worldState_joy: `Радість`, worldState_joy: `Радість`,
worldState_anger: `Злість`, worldState_anger: `Гнів`,
worldState_envy: `Заздрість`, worldState_envy: `Заздрість`,
worldState_sorrow: `Журба`, worldState_sorrow: `Скорбота`,
worldState_fear: `Страх`, worldState_fear: `Страх`,
worldState_nightwaveOverride: `Сезон Нічної хвилі`, worldState_nightwaveOverride: `Сезон Нічної хвилі`,
worldState_RadioLegionIntermission13Syndicate: `Вибірка Нори 9`, worldState_RadioLegionIntermission13Syndicate: `Вибірка Нори 9`,
@ -304,69 +299,68 @@ dict = {
worldState_allAtOnceNormal: `Всі одразу, в звичайному режимі`, worldState_allAtOnceNormal: `Всі одразу, в звичайному режимі`,
worldState_allAtOnceSteelPath: `Всі одразу, в режимі Шляху Сталі`, worldState_allAtOnceSteelPath: `Всі одразу, в режимі Шляху Сталі`,
worldState_theCircuitOverride: `Типи місій у підземеллі Дувірі`, worldState_theCircuitOverride: `Типи місій у підземеллі Дувірі`,
worldState_darvoStockMultiplier: `Множник запасів Дарво`, worldState_darvoStockMultiplier: `Множник Запасів Дарво`,
worldState_varziaFullyStocked: `Повний асортимент Варзії`, worldState_varziaFullyStocked: `Повний Асортимент Варзії`,
worldState_varziaOverride: `Зміна ротації Варзії`, worldState_varziaOverride: `Зміна Ротації Варзії`,
import_importNote: `Ви можете завантажити повну або часткову відповідь <code>inventory.php</code> або <code>getShip.php</code> (клієнтське представлення) тут.`, import_importNote: `Ви можете завантажити повну або часткову відповідь спорядження (клієнтське представлення) тут. Всі підтримувані поля <b>будуть перезаписані</b> у вашому акаунті.`,
import_importNote2: `Всі підтримувані поля <b>будуть перезаписані</b> у вашому акаунті.`,
import_submit: `Відправити`, import_submit: `Відправити`,
import_samples: `Приклад:`, import_samples: `Приклад:`,
import_samples_maxFocus: `Всі школи Фокусу макс. рівня`, import_samples_maxFocus: `Всі школи Фокуса максимального рівня`,
upgrade_Equilibrium: `Згустки здоров'я дають +|VAL|% енергії, згустки енергії дають +|VAL|% здоров'я.`, upgrade_Equilibrium: `+|VAL|% Енергія від підбирання здоров'я, +|VAL|% Здоров'я від підбирання енергії`,
upgrade_MeleeCritDamage: `+|VAL|% до критичної шкоди від холодної зброї.`, upgrade_MeleeCritDamage: `+|VAL|% Критична шкода ближнього бою`,
upgrade_PrimaryStatusChance: `+|VAL|% до ймовірності ефекту стану від основної зброї.`, upgrade_PrimaryStatusChance: `+|VAL|% Імовірність накладення ефекту стану основною зброєю`,
upgrade_SecondaryCritChance: `+|VAL|% до ймовірності критичної шкоди від допоміжної зброї.`, upgrade_SecondaryCritChance: `+|VAL|% Імовірність критичної шкоди допоміжною зброєю`,
upgrade_WarframeAbilityDuration: `+|VAL|% до тривалості дії здібностей.`, upgrade_WarframeAbilityDuration: `+|VAL|% Тривалість здібностей`,
upgrade_WarframeAbilityStrength: `+|VAL|% до потужності здібностей.`, upgrade_WarframeAbilityStrength: `+|VAL|% Потужність здібностей`,
upgrade_WarframeArmorMax: `+|VAL| до захисту.`, upgrade_WarframeArmorMax: `+|VAL| Захист`,
upgrade_WarframeBlastProc: `Відновлює +|VAL| щитів, коли ви вбиваєте ворога Вибуховою шкодою.`, upgrade_WarframeBlastProc: `+|VAL| Щит при вбивстві з Вибуховим Уронoм`,
upgrade_WarframeCastingSpeed: `+|VAL|% до швидкості застосування здібностей.`, upgrade_WarframeCastingSpeed: `+|VAL|% Швидкість Застосування Здібностей`,
upgrade_WarframeCorrosiveDamageBoost: `Дає +|VAL|% до шкоди від здібностей ворогам під впливом Корозійної шкоди.`, upgrade_WarframeCorrosiveDamageBoost: `+|VAL|% Урон Здібностей по ворогам, ураженим Корозією`,
upgrade_WarframeCorrosiveStack: `Збільшує макс. кількість накопичень Коррозійних ефектів стану на +|VAL|.`, upgrade_WarframeCorrosiveStack: `Збільшити макс. стаки Корозії на +|VAL|`,
upgrade_WarframeCritDamageBoost: `Дає +|VAL|% до критичної шкоди холодної зброї. Коли макс. енергія перевищує 500, то збільшення шкоди подвоюється.`, upgrade_WarframeCritDamageBoost: `+|VAL|% Критична шкода Ближнього Бою (Подвоюється при 500 Енергії)`,
upgrade_WarframeElectricDamage: `Дає +|VAL1|% до Електричної шкоди від основної зрої. Додатково дає +|VAL2|% за споряджений багряний, блакитний чи фіолетовий архонтовий уламок (Поєднується з модифікаторами).`, upgrade_WarframeElectricDamage: `+|VAL1|% Урон Електрикою Основним Озброєнням (+|VAL2|% за кожен додатковий Уламок)`,
upgrade_WarframeElectricDamageBoost: `Дає +|VAL|% до шкоди від здібностей ворогам під впливом Електричної шкоди.`, upgrade_WarframeElectricDamageBoost: `+|VAL|% Шкода Здібностей по ворогам, ураженим Електрикою`,
upgrade_WarframeEnergyMax: `+|VAL| до макс. енергії.`, upgrade_WarframeEnergyMax: `+|VAL| Макс. Енергія`,
upgrade_WarframeGlobeEffectEnergy: `+|VAL|% до дієвості згустків енергії.`, upgrade_WarframeGlobeEffectEnergy: `+|VAL|% Ефективність згустків Енергії`,
upgrade_WarframeGlobeEffectHealth: `+|VAL|% до дієвості згустків здоров'я.`, upgrade_WarframeGlobeEffectHealth: `+|VAL|% Ефективність згустків Здоров'я`,
upgrade_WarframeHealthMax: `+|VAL| до здоров'я.`, upgrade_WarframeHealthMax: `+|VAL| Макс. Здоров'я`,
upgrade_WarframeHPBoostFromImpact: `Отримайте +|VAL1| здоров'я за ворога, вбитого Вибуховою шкодою. Макс. — |VAL2| здоров'я.`, upgrade_WarframeHPBoostFromImpact: `+|VAL1| Здоров'я при вбивстві з Вибуховою шкодою (Макс. |VAL2| Здоров'я)`,
upgrade_WarframeParkourVelocity: `+|VAL|% до швидкості паркуру.`, upgrade_WarframeParkourVelocity: `+|VAL|% Швидкість Паркура`,
upgrade_WarframeRadiationDamageBoost: `Дає +|VAL|% до шкоди від здібностей ворогам під впливом Радіаційної шкоди.`, upgrade_WarframeRadiationDamageBoost: `+|VAL|% Шкода Здібностей по ворогам, ураженим Радіацією`,
upgrade_WarframeHealthRegen: `+|VAL| до відновлення здоров'я на секунду.`, upgrade_WarframeHealthRegen: `+|VAL| Здоров'я в секунду`,
upgrade_WarframeShieldMax: `+|VAL| до місткості щитів.`, upgrade_WarframeShieldMax: `+|VAL| Щиту`,
upgrade_WarframeStartingEnergy: `+|VAL|% до початкової макс. енергії.`, upgrade_WarframeStartingEnergy: `+|VAL|% Енергії при Спавні`,
upgrade_WarframeToxinDamage: `Токсичні ефекти стану завдаватимуть на +|VAL|% більше шкоди.`, upgrade_WarframeToxinDamage: `+|VAL|% Шкода Токсином`,
upgrade_WarframeToxinHeal: `Відновлює +|VAL| здоров'я за кожен раз як вороги отримують шкоду від Токсичних ефектів стану.`, upgrade_WarframeToxinHeal: `+|VAL| Здоров'я при нанесенні шкоди ворогам з Токсином`,
upgrade_WeaponCritBoostFromHeat: `Збільшує ймовірність критичної шкоди від допоміжної зброї на |VAL1|% щоразу, коли ви вбиваєте ворога під впливом Термічного ефекту стану. Накопичується до |VAL2|%.`, upgrade_WeaponCritBoostFromHeat: `+|VAL1|% Імовірність Критичної Шкоди Допоміжною Зброєю за кожного вбитого ворога, ураженого Термічною шкодою (Макс. |VAL2|%)`,
upgrade_AvatarAbilityRange: `+7.5% Досяжність Здібностей.`, upgrade_AvatarAbilityRange: `+7.5% Досяжність Здібностей`,
upgrade_AvatarAbilityEfficiency: `+5% Ощадливість Здібностей.`, upgrade_AvatarAbilityEfficiency: `+5% Ощадливість Здібностей`,
upgrade_AvatarEnergyRegen: `+0.5 Відновлення Енергії в секунду.`, upgrade_AvatarEnergyRegen: `+0.5 Відновлення Енергії в секунду`,
upgrade_AvatarEnemyRadar: `+5м Виявлення ворогів.`, upgrade_AvatarEnemyRadar: `+5m Виявлення ворогів`,
upgrade_AvatarLootRadar: `+7м Виявлення здобичі.`, upgrade_AvatarLootRadar: `+7m Виявлення здобичі`,
upgrade_WeaponAmmoMax: `+15% Макс. Набоїв.`, upgrade_WeaponAmmoMax: `+15% Макс. Набоїв`,
upgrade_EnemyArmorReductionAura: `-3% Захист Ворогів.`, upgrade_EnemyArmorReductionAura: `-3% Захист Ворогів`,
upgrade_OnExecutionAmmo: `+100% Заповнення Магазина Основного і Допоміжного Озброєння при вбивстві Милосердям.`, upgrade_OnExecutionAmmo: `+100% Заповнення Магазина Основного і Допоміжного Озброєння при вбивстві Милосердям`,
upgrade_OnExecutionHealthDrop: `+100% Імовірність Падіння згустка здоров'я при вбивстві Милосердям.`, upgrade_OnExecutionHealthDrop: `+100% Імовірність Падіння згустка Здоров'я при вбивстві Милосердям`,
upgrade_OnExecutionEnergyDrop: `+50% Імовірність Падіння згустка Енергії при вбивстві Милосердям.`, upgrade_OnExecutionEnergyDrop: `+50% Імовірність Падіння згустка Енергії при вбивстві Милосердям`,
upgrade_OnFailHackReset: `+50% Імовірність Повтора Зламу.`, upgrade_OnFailHackReset: `+50% Імовірність Повтора Зламу`,
upgrade_DamageReductionOnHack: `+75% Зменшення Шкоди під час Зламу.`, upgrade_DamageReductionOnHack: `+75% Зменшення Шкоди під час Зламу`,
upgrade_OnExecutionReviveCompanion: `Вбивства Милосердям зменшують час відновлення Компаньйона на 15 секунд.`, upgrade_OnExecutionReviveCompanion: `Вбивства Милосердям зменшують час відновлення Компаньйона на 15 секунд`,
upgrade_OnExecutionParkourSpeed: `+60% Швидкість Паркура після вбивства Милосердям на 15 секунд.`, upgrade_OnExecutionParkourSpeed: `+60% Швидкість Паркура після вбивства Милосердям на 15 секунд`,
upgrade_AvatarTimeLimitIncrease: `+8 секунд до Зламу.`, upgrade_AvatarTimeLimitIncrease: `+8 секунд до Зламу`,
upgrade_ElectrifyOnHack: `Шокувати ворогів в межах 20м під час Зламу.`, upgrade_ElectrifyOnHack: `Шокувати ворогів в межах 20 метрів під час Зламу`,
upgrade_OnExecutionTerrify: `+50% Імовірність, що вороги в межах 15м будуть тремтіти від страху протягом 8 секунд після вбивства Милосердям.`, upgrade_OnExecutionTerrify: `+50% Імовірність, що вороги в межах 15 метрів будуть тремтіти від страху протягом 8 секунд після вбивства Милосердям`,
upgrade_OnHackLockers: `Відкрити 5 шафок в межах 20м після Зламу.`, upgrade_OnHackLockers: `Відкрити 5 шафок в межах 20 метрів після Зламу`,
upgrade_OnExecutionBlind: `Засліпити ворогів в межах 18м після вбивства Милосердям.`, upgrade_OnExecutionBlind: `Засліпити ворогів в межах 18 метрів після вбивства Милосердям`,
upgrade_OnExecutionDrainPower: `Наступне застосування здібності отримує +50% Потужності Здібності після вбивства Милосердям.`, upgrade_OnExecutionDrainPower: `Наступне застосування здібності отримує +50% Потужності Здібності після вбивства Милосердям`,
upgrade_OnHackSprintSpeed: `+75% Швидкість Бігу протягом 15 секунд після Зламу.`, upgrade_OnHackSprintSpeed: `+75% Швидкість Бігу протягом 15 секунд після Зламу`,
upgrade_SwiftExecute: `+50% Швидкість Вбивства Милосердям.`, upgrade_SwiftExecute: `+50% Швидкість Вбивства Милосердям`,
upgrade_OnHackInvis: `Невидимість протягом 15 секунд після Зламу.`, upgrade_OnHackInvis: `Невидимість протягом 15 секунд після Зламу`,
damageType_Electricity: `Електричний`, damageType_Electricity: `Електричний`,
damageType_Fire: `Термічний`, damageType_Fire: `Трммічний`,
damageType_Freeze: `Крижаний`, damageType_Freeze: `Крижаний`,
damageType_Impact: `Ударний`, damageType_Impact: `Ударний`,
damageType_Magnetic: `Магнетичний`, damageType_Magnetic: `Магнетичний`,

View File

@ -251,17 +251,12 @@ dict = {
worldState_dogDays: `三伏天`, worldState_dogDays: `三伏天`,
worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`, worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`,
worldState_wolfHunt: `恶狼狩猎 (2025)`, worldState_wolfHunt: `恶狼狩猎 (2025)`,
worldState_orphixVenom: `奥影之毒`,
worldState_longShadow: `暗夜长影`, worldState_longShadow: `暗夜长影`,
worldState_hallowedFlame: `万圣之焰`, worldState_hallowedFlame: `万圣之焰`,
worldState_hallowedNightmares: `万圣噩梦`, worldState_hallowedNightmares: `万圣噩梦`,
worldState_hallowedNightmaresRewards: `[UNTRANSLATED] Hallowed Nightmares Rewards`, worldState_hallowedNightmaresRewards: `[UNTRANSLATED] Hallowed Nightmares Rewards`,
worldState_proxyRebellion: `机械叛乱`, worldState_proxyRebellion: `机械叛乱`,
worldState_proxyRebellionRewards: `[UNTRANSLATED] Proxy Rebellion Rewards`, worldState_proxyRebellionRewards: `[UNTRANSLATED] Proxy Rebellion Rewards`,
worldState_bellyOfTheBeast: `兽之腹`,
worldState_bellyOfTheBeastProgressOverride: `[UNTRANSLATED] Belly of the Beast Progress`,
worldState_eightClaw: `八爪`,
worldState_eightClawProgressOverride: `[UNTRANSLATED] Eight Claw Progress`,
worldState_from_year: `[UNTRANSLATED] from |YEAR|`, worldState_from_year: `[UNTRANSLATED] from |YEAR|`,
worldState_pre_year: `[UNTRANSLATED] pre |YEAR|`, worldState_pre_year: `[UNTRANSLATED] pre |YEAR|`,
worldState_incompatibleWith: `[UNTRANSLATED] Incompatible with:`, worldState_incompatibleWith: `[UNTRANSLATED] Incompatible with:`,
@ -308,8 +303,7 @@ dict = {
worldState_varziaFullyStocked: `瓦奇娅开启全部库存商品`, worldState_varziaFullyStocked: `瓦奇娅开启全部库存商品`,
worldState_varziaOverride: `瓦奇娅(Prime重生)轮换状态`, worldState_varziaOverride: `瓦奇娅(Prime重生)轮换状态`,
import_importNote: `[UNTRANSLATED] You can provide a full or partial <code>inventory.php</code> or <code>getShip.php</code> response (client representation) here.`, import_importNote: `您可以在此处提供完整或部分库存响应(客户端表示)。支持的所有字段<b>将被覆盖</b>到您的账户中。`,
import_importNote2: `支持的所有字段<b>将被覆盖</b>到您的账户中。`,
import_submit: `提交`, import_submit: `提交`,
import_samples: `示例:`, import_samples: `示例:`,
import_samples_maxFocus: `所有专精学派完全精通`, import_samples_maxFocus: `所有专精学派完全精通`,