forked from OpenWF/SpaceNinjaServer
Compare commits
8 Commits
ec382866a8
...
f7573cc7cc
| Author | SHA1 | Date | |
|---|---|---|---|
| f7573cc7cc | |||
| 2fdd87aa1c | |||
| 6684595326 | |||
| 02f0935710 | |||
| af4c3a93ce | |||
| 4141970530 | |||
| ca589cb7cf | |||
| d6ed22d1ff |
@ -31,7 +31,7 @@
|
||||
"baroAlwaysAvailable": false,
|
||||
"baroFullyStocked": false,
|
||||
"varziaFullyStocked": false,
|
||||
"wolfHunt": false,
|
||||
"wolfHunt": null,
|
||||
"orphixVenom": false,
|
||||
"longShadow": false,
|
||||
"hallowedFlame": false,
|
||||
@ -45,6 +45,7 @@
|
||||
"voidCorruption2025Week2": false,
|
||||
"voidCorruption2025Week3": false,
|
||||
"voidCorruption2025Week4": false,
|
||||
"qtccAlerts": false,
|
||||
"galleonOfGhouls": 0,
|
||||
"ghoulEmergenceOverride": null,
|
||||
"plagueStarOverride": null,
|
||||
|
||||
8
package-lock.json
generated
8
package-lock.json
generated
@ -18,7 +18,7 @@
|
||||
"morgan": "^1.10.0",
|
||||
"ncp": "^2.0.0",
|
||||
"undici": "^7.10.0",
|
||||
"warframe-public-export-plus": "^0.5.89",
|
||||
"warframe-public-export-plus": "^0.5.90",
|
||||
"warframe-riven-info": "^0.1.2",
|
||||
"winston": "^3.17.0",
|
||||
"winston-daily-rotate-file": "^5.0.0",
|
||||
@ -5534,9 +5534,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/warframe-public-export-plus": {
|
||||
"version": "0.5.89",
|
||||
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.89.tgz",
|
||||
"integrity": "sha512-a6dM1MirzofSsuv3LlRQHFLSSIGKPVSN93dcXSDmA3njsWqOGjJJdWyXqcyxxYw8rEB8CNowSHst/MUmKvKlRg=="
|
||||
"version": "0.5.90",
|
||||
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.90.tgz",
|
||||
"integrity": "sha512-PzYFJ+qOZawPOVx9+hGlOosGdqSJMSRL6c1z3CCXMiY5SEHUs7p9JIMjkqnvg1g7vflVWnyG6E5/2gYkQs0d7w=="
|
||||
},
|
||||
"node_modules/warframe-riven-info": {
|
||||
"version": "0.1.2",
|
||||
|
||||
@ -36,7 +36,7 @@
|
||||
"morgan": "^1.10.0",
|
||||
"ncp": "^2.0.0",
|
||||
"undici": "^7.10.0",
|
||||
"warframe-public-export-plus": "^0.5.89",
|
||||
"warframe-public-export-plus": "^0.5.90",
|
||||
"warframe-riven-info": "^0.1.2",
|
||||
"winston": "^3.17.0",
|
||||
"winston-daily-rotate-file": "^5.0.0",
|
||||
|
||||
27
src/controllers/api/forceRemoveItemController.ts
Normal file
27
src/controllers/api/forceRemoveItemController.ts
Normal file
@ -0,0 +1,27 @@
|
||||
import type { RequestHandler } from "express";
|
||||
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||
import { getInventory } from "../../services/inventoryService.ts";
|
||||
import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
|
||||
|
||||
export const forceRemoveItemController: RequestHandler = async (req, res) => {
|
||||
const accountId = await getAccountIdForRequest(req);
|
||||
const inventory = await getInventory(accountId, "MiscItems");
|
||||
const body = getJSONfromString<IForceRemoveItemRequest>(String(req.body));
|
||||
const inventoryChanges: IInventoryChanges = {};
|
||||
for (const item of body.items) {
|
||||
const index = inventory.MiscItems.findIndex(x => x.ItemType == item);
|
||||
if (index != -1) {
|
||||
inventoryChanges.MiscItems ??= [];
|
||||
inventoryChanges.MiscItems.push({ ItemType: item, ItemCount: inventory.MiscItems[index].ItemCount * -1 });
|
||||
|
||||
inventory.MiscItems.splice(index, 1);
|
||||
}
|
||||
}
|
||||
await inventory.save();
|
||||
res.json({ InventoryChanges: inventoryChanges });
|
||||
};
|
||||
|
||||
interface IForceRemoveItemRequest {
|
||||
items: string[];
|
||||
}
|
||||
@ -177,7 +177,7 @@ export const inventoryController: RequestHandler = async (request, response) =>
|
||||
}
|
||||
}
|
||||
|
||||
cleanupInventory(inventory);
|
||||
await cleanupInventory(inventory);
|
||||
|
||||
inventory.NextRefill = new Date((today + 1) * 86400000); // tomorrow at 0 UTC
|
||||
//await inventory.save();
|
||||
|
||||
@ -77,6 +77,9 @@ export const sellController: RequestHandler = async (req, res) => {
|
||||
requiredFields.add("CrewShipSalvagedWeaponSkins");
|
||||
}
|
||||
}
|
||||
if (payload.Items.WeaponSkins) {
|
||||
requiredFields.add("WeaponSkins");
|
||||
}
|
||||
const inventory = await getInventory(accountId, Array.from(requiredFields).join(" "));
|
||||
|
||||
// Give currency
|
||||
@ -302,6 +305,11 @@ export const sellController: RequestHandler = async (req, res) => {
|
||||
addFusionTreasures(inventory, [parseFusionTreasure(sellItem.String, sellItem.Count * -1)]);
|
||||
});
|
||||
}
|
||||
if (payload.Items.WeaponSkins) {
|
||||
payload.Items.WeaponSkins.forEach(sellItem => {
|
||||
inventory.WeaponSkins.pull({ _id: sellItem.String });
|
||||
});
|
||||
}
|
||||
|
||||
await inventory.save();
|
||||
res.json({
|
||||
@ -335,6 +343,7 @@ interface ISellRequest {
|
||||
CrewShipWeapons?: ISellItem[];
|
||||
CrewShipWeaponSkins?: ISellItem[];
|
||||
FusionTreasures?: ISellItem[];
|
||||
WeaponSkins?: ISellItem[]; // SNS specific field
|
||||
};
|
||||
SellPrice: number;
|
||||
SellCurrency:
|
||||
|
||||
@ -66,6 +66,7 @@ interface ItemLists {
|
||||
VaultDecoRecipes: ListedItem[];
|
||||
FlavourItems: ListedItem[];
|
||||
ShipDecorations: ListedItem[];
|
||||
WeaponSkins: ListedItem[];
|
||||
//circuitGameModes: ListedItem[];
|
||||
}
|
||||
|
||||
@ -107,7 +108,8 @@ const getItemListsController: RequestHandler = (req, response) => {
|
||||
TechProjects: [],
|
||||
VaultDecoRecipes: [],
|
||||
FlavourItems: [],
|
||||
ShipDecorations: []
|
||||
ShipDecorations: [],
|
||||
WeaponSkins: []
|
||||
/*circuitGameModes: [
|
||||
{
|
||||
uniqueName: "Survival",
|
||||
@ -298,10 +300,18 @@ const getItemListsController: RequestHandler = (req, response) => {
|
||||
});
|
||||
}
|
||||
for (const [uniqueName, item] of Object.entries(ExportCustoms)) {
|
||||
res.miscitems.push({
|
||||
uniqueName: uniqueName,
|
||||
name: getString(item.name, lang)
|
||||
});
|
||||
if (
|
||||
item.productCategory == "WeaponSkins" &&
|
||||
!uniqueName.startsWith("/Lotus/Types/Game/Lotus") && // Base Items
|
||||
!uniqueName.endsWith("ProjectileSkin") && // UnrealTournament ProjectileSkins
|
||||
!uniqueName.endsWith("Coat") // Frost Prime stuff
|
||||
) {
|
||||
res.WeaponSkins.push({
|
||||
uniqueName: uniqueName,
|
||||
name: getString(item.name, lang),
|
||||
alwaysAvailable: item.alwaysAvailable
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
for (const [uniqueName, upgrade] of Object.entries(ExportUpgrades)) {
|
||||
|
||||
@ -20,13 +20,14 @@ import type {
|
||||
} from "../../types/inventoryTypes/inventoryTypes.ts";
|
||||
import { LoadoutIndex } from "../../types/inventoryTypes/inventoryTypes.ts";
|
||||
import type { RequestHandler } from "express";
|
||||
import { catBreadHash, getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||
import { ExportCustoms, ExportDojoRecipes } from "warframe-public-export-plus";
|
||||
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||
import { ExportDojoRecipes } from "warframe-public-export-plus";
|
||||
import type { IStatsClient } from "../../types/statTypes.ts";
|
||||
import { toStoreItem } from "../../services/itemDataService.ts";
|
||||
import type { FlattenMaps } from "mongoose";
|
||||
import type { IEquipmentClient } from "../../types/equipmentTypes.ts";
|
||||
import type { ILoadoutConfigClient } from "../../types/saveLoadoutTypes.ts";
|
||||
import { skinLookupTable } from "../../helpers/skinLookupTable.ts";
|
||||
|
||||
const getProfileViewingDataByPlayerIdImpl = async (playerId: string): Promise<IProfileViewingData | undefined> => {
|
||||
const account = await Account.findById(playerId, "DisplayName");
|
||||
@ -261,8 +262,6 @@ interface IXPComponentClient {
|
||||
locTags?: Record<string, string>;
|
||||
}
|
||||
|
||||
let skinLookupTable: Record<number, string> | undefined;
|
||||
|
||||
const resolveAndCollectSkins = (
|
||||
inventory: TInventoryDatabaseDocument,
|
||||
skins: Set<string>,
|
||||
@ -274,12 +273,6 @@ const resolveAndCollectSkins = (
|
||||
// Resolve oids to type names
|
||||
if (config.Skins[i].length == 24) {
|
||||
if (config.Skins[i].substring(0, 16) == "ca70ca70ca70ca70") {
|
||||
if (!skinLookupTable) {
|
||||
skinLookupTable = {};
|
||||
for (const key of Object.keys(ExportCustoms)) {
|
||||
skinLookupTable[catBreadHash(key)] = key;
|
||||
}
|
||||
}
|
||||
config.Skins[i] = skinLookupTable[parseInt(config.Skins[i].substring(16), 16)];
|
||||
} else {
|
||||
const skinItem = inventory.WeaponSkins.id(config.Skins[i]);
|
||||
|
||||
8
src/helpers/skinLookupTable.ts
Normal file
8
src/helpers/skinLookupTable.ts
Normal file
@ -0,0 +1,8 @@
|
||||
import { ExportCustoms } from "warframe-public-export-plus";
|
||||
import { catBreadHash } from "./stringHelpers.ts";
|
||||
|
||||
export const skinLookupTable: Record<number, string> = {};
|
||||
|
||||
for (const key of Object.keys(ExportCustoms)) {
|
||||
skinLookupTable[catBreadHash(key)] = key;
|
||||
}
|
||||
@ -53,6 +53,7 @@ import { evolveWeaponController } from "../controllers/api/evolveWeaponControlle
|
||||
import { findSessionsController } from "../controllers/api/findSessionsController.ts";
|
||||
import { fishmongerController } from "../controllers/api/fishmongerController.ts";
|
||||
import { focusController } from "../controllers/api/focusController.ts";
|
||||
import { forceRemoveItemController } from "../controllers/api/forceRemoveItemController.ts";
|
||||
import { fusionTreasuresController } from "../controllers/api/fusionTreasuresController.ts";
|
||||
import { gardeningController } from "../controllers/api/gardeningController.ts";
|
||||
import { genericUpdateController } from "../controllers/api/genericUpdateController.ts";
|
||||
@ -66,8 +67,8 @@ import { getGuildEventScoreController } from "../controllers/api/getGuildEventSc
|
||||
import { getGuildLogController } from "../controllers/api/getGuildLogController.ts";
|
||||
import { getIgnoredUsersController } from "../controllers/api/getIgnoredUsersController.ts";
|
||||
import { getNewRewardSeedController } from "../controllers/api/getNewRewardSeedController.ts";
|
||||
import { getProfileViewingDataPostController } from "../controllers/dynamic/getProfileViewingDataController.ts";
|
||||
import { getPastWeeklyChallengesController } from "../controllers/api/getPastWeeklyChallengesController.ts";
|
||||
import { getProfileViewingDataPostController } from "../controllers/dynamic/getProfileViewingDataController.ts";
|
||||
import { getShipController } from "../controllers/api/getShipController.ts";
|
||||
import { getVendorInfoController } from "../controllers/api/getVendorInfoController.ts";
|
||||
import { getVoidProjectionRewardsController } from "../controllers/api/getVoidProjectionRewardsController.ts";
|
||||
@ -273,6 +274,7 @@ apiRouter.post("/evolveWeapon.php", evolveWeaponController);
|
||||
apiRouter.post("/findSessions.php", findSessionsController);
|
||||
apiRouter.post("/fishmonger.php", fishmongerController);
|
||||
apiRouter.post("/focus.php", focusController);
|
||||
apiRouter.post("/forceRemoveItem.php", forceRemoveItemController);
|
||||
apiRouter.post("/fusionTreasures.php", fusionTreasuresController);
|
||||
apiRouter.post("/gardening.php", gardeningController);
|
||||
apiRouter.post("/genericUpdate.php", genericUpdateController);
|
||||
|
||||
@ -41,7 +41,7 @@ export interface IConfig {
|
||||
baroAlwaysAvailable?: boolean;
|
||||
baroFullyStocked?: boolean;
|
||||
varziaFullyStocked?: boolean;
|
||||
wolfHunt?: boolean;
|
||||
wolfHunt?: number;
|
||||
orphixVenom?: boolean;
|
||||
longShadow?: boolean;
|
||||
hallowedFlame?: boolean;
|
||||
@ -55,6 +55,7 @@ export interface IConfig {
|
||||
voidCorruption2025Week2?: boolean;
|
||||
voidCorruption2025Week3?: boolean;
|
||||
voidCorruption2025Week4?: boolean;
|
||||
qtccAlerts?: boolean;
|
||||
galleonOfGhouls?: number;
|
||||
ghoulEmergenceOverride?: boolean;
|
||||
plagueStarOverride?: boolean;
|
||||
|
||||
@ -92,6 +92,7 @@ import type {
|
||||
} from "../types/equipmentTypes.ts";
|
||||
import { EquipmentFeatures, Status } from "../types/equipmentTypes.ts";
|
||||
import type { ITypeCount } from "../types/commonTypes.ts";
|
||||
import { skinLookupTable } from "../helpers/skinLookupTable.ts";
|
||||
|
||||
export const createInventory = async (
|
||||
accountOwnerId: Types.ObjectId,
|
||||
@ -2260,7 +2261,7 @@ export const setupKahlSyndicate = (inventory: TInventoryDatabaseDocument): void
|
||||
});
|
||||
};
|
||||
|
||||
export const cleanupInventory = (inventory: TInventoryDatabaseDocument): void => {
|
||||
export const cleanupInventory = async (inventory: TInventoryDatabaseDocument): Promise<void> => {
|
||||
inventory.CurrentLoadOutIds = inventory.CurrentLoadOutIds.map(fromDbOid);
|
||||
|
||||
let index = inventory.MiscItems.findIndex(x => x.ItemType == "");
|
||||
@ -2314,6 +2315,99 @@ export const cleanupInventory = (inventory: TInventoryDatabaseDocument): void =>
|
||||
logger.debug(`removed ModularParts from ${numFixed} non-modular items`);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
const weaponMap = new Map<string, string>();
|
||||
for (const skin of inventory.WeaponSkins) {
|
||||
weaponMap.set(skin.ItemType, skin._id.toString());
|
||||
}
|
||||
|
||||
const itemsToAdd = new Set<string>();
|
||||
|
||||
for (const key of equipmentKeys) {
|
||||
if (key in inventory) {
|
||||
for (const equipment of inventory[key]) {
|
||||
for (const config of equipment.Configs) {
|
||||
if (config.Skins) collectSkins(config.Skins, weaponMap, itemsToAdd);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (const key of ["AdultOperatorLoadOuts", "OperatorLoadOuts", "KahlLoadOuts"] as const) {
|
||||
if (key in inventory) {
|
||||
for (const loadOut of inventory[key]) {
|
||||
if (loadOut.Skins) collectSkins(loadOut.Skins, weaponMap, itemsToAdd);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (inventory.LotusCustomization?.Skins)
|
||||
collectSkins(inventory.LotusCustomization.Skins, weaponMap, itemsToAdd);
|
||||
|
||||
if (itemsToAdd.size > 0) {
|
||||
logger.debug(`Adding ${itemsToAdd.size} items due to migration from unlockAllSkins cheat`);
|
||||
const inventoryChanges = await addItems(inventory, Array.from(itemsToAdd));
|
||||
|
||||
if (inventoryChanges.WeaponSkins) {
|
||||
for (const skin of inventoryChanges.WeaponSkins as IWeaponSkinClient[]) {
|
||||
weaponMap.set(skin.ItemType, skin.ItemId.toString());
|
||||
}
|
||||
}
|
||||
|
||||
for (const key of equipmentKeys) {
|
||||
if (key in inventory) {
|
||||
for (const equipment of inventory[key]) {
|
||||
for (const config of equipment.Configs) {
|
||||
if (config.Skins) replaceSkinIds(config.Skins, weaponMap);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (const key of ["AdultOperatorLoadOuts", "OperatorLoadOuts", "KahlLoadOuts"] as const) {
|
||||
if (key in inventory) {
|
||||
for (const loadOut of inventory[key]) {
|
||||
if (loadOut.Skins) replaceSkinIds(loadOut.Skins, weaponMap);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (inventory.LotusCustomization?.Skins) replaceSkinIds(inventory.LotusCustomization.Skins, weaponMap);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const collectSkins = (skins: string[], weaponMap: Map<string, string>, itemsToAdd: Set<string>): void => {
|
||||
for (const skinId of skins) {
|
||||
if (skinId.startsWith("ca70ca70ca70ca70")) {
|
||||
const typeName = skinLookupTable[parseInt(skinId.slice(16), 16)];
|
||||
if (!weaponMap.has(typeName)) {
|
||||
const { requirement } = ExportCustoms[typeName];
|
||||
if (typeof requirement == "string") {
|
||||
itemsToAdd.add(requirement);
|
||||
} else {
|
||||
itemsToAdd.add(typeName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const replaceSkinIds = (skins: string[], weaponMap: Map<string, string>): void => {
|
||||
for (let i = 0; i < skins.length; i++) {
|
||||
const skinId = skins[i];
|
||||
if (skinId.startsWith("ca70ca70ca70ca70")) {
|
||||
const typeName = skinLookupTable[parseInt(skinId.slice(16), 16)];
|
||||
const inventoryId = weaponMap.get(typeName);
|
||||
if (inventoryId) {
|
||||
skins[i] = inventoryId;
|
||||
} else if (typeName in ExportCustoms) {
|
||||
const { requirement } = ExportCustoms[typeName];
|
||||
skins[i] = typeof requirement == "string" ? typeName : "";
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export const getDialogue = (inventory: TInventoryDatabaseDocument, dialogueName: string): IDialogueDatabase => {
|
||||
|
||||
@ -2479,6 +2479,18 @@ const goalMessagesByKey: Record<string, { sndr: string; msg: string; sub: string
|
||||
sub: "/Lotus/Language/Inbox/WaterFightRewardSubjectD",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Grineer/KelaDeThaym.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/WolfTacAlertA": {
|
||||
sndr: "/Lotus/Language/Bosses/NoraNight",
|
||||
msg: "/Lotus/Language/Inbox/WolfTacAlertBody",
|
||||
sub: "/Lotus/Language/Inbox/WolfTacAlertTitle",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Seasonal/NoraNight.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/WolfTacAlertxB": {
|
||||
sndr: "/Lotus/Language/Bosses/NoraNight",
|
||||
msg: "/Lotus/Language/Inbox/WolfTacAlertHardBody",
|
||||
sub: "/Lotus/Language/Inbox/WolfTacAlertHardTitle",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Seasonal/NoraNight.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/WolfTacAlertReduxA": {
|
||||
sndr: "/Lotus/Language/Bosses/NoraNight",
|
||||
msg: "/Lotus/Language/Inbox/WolfTacAlertBody",
|
||||
|
||||
@ -151,7 +151,7 @@ const configAlerts: Record<string, IAlert> = {
|
||||
enemySpec: "/Lotus/Types/Game/EnemySpecs/CorpusShipEnemySpecs/CorpusShipSquadDefenseB",
|
||||
minEnemyLevel: 20,
|
||||
maxEnemyLevel: 25,
|
||||
maxWaveNum: 6
|
||||
maxRotations: 2
|
||||
}
|
||||
},
|
||||
voidCorruption2025Week3: {
|
||||
@ -1476,6 +1476,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
||||
const weekStart = EPOCH + week * 604800000;
|
||||
const weekEnd = weekStart + 604800000;
|
||||
const date = new Date(timeMs);
|
||||
const defenseWavesPerRotation = buildLabel && version_compare(buildLabel, "2025.03.18.16.07") < 0 ? 5 : 3;
|
||||
|
||||
const worldState: IWorldState = {
|
||||
BuildLabel: typeof buildLabel == "string" ? buildLabel.split(" ").join("+") : buildConfig.buildLabel,
|
||||
@ -1569,11 +1570,119 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
||||
if (config.worldState) {
|
||||
for (const [key, alert] of Object.entries(configAlerts)) {
|
||||
if (config.worldState[key as keyof typeof config.worldState]) {
|
||||
if (alert.MissionInfo.missionType == "MT_DEFENSE") {
|
||||
alert.MissionInfo.maxWaveNum = defenseWavesPerRotation * (alert.MissionInfo.maxRotations ?? 1);
|
||||
alert.MissionInfo.maxRotations = undefined;
|
||||
}
|
||||
worldState.Alerts.push(alert);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (config.worldState?.qtccAlerts) {
|
||||
worldState.Alerts.push(
|
||||
{
|
||||
_id: {
|
||||
$oid: "68dc23c42e9d3acfa708ff3b"
|
||||
},
|
||||
Activation: {
|
||||
$date: {
|
||||
$numberLong: "1759327200000"
|
||||
}
|
||||
},
|
||||
Expiry: {
|
||||
$date: {
|
||||
$numberLong: "2000000000000"
|
||||
}
|
||||
},
|
||||
MissionInfo: {
|
||||
location: "SolNode123",
|
||||
missionType: "MT_SURVIVAL",
|
||||
faction: "FC_CORPUS",
|
||||
difficulty: 1,
|
||||
missionReward: {
|
||||
credits: 10000,
|
||||
items: ["/Lotus/StoreItems/Types/Items/ShipDecos/Plushies/Plushy2021QTCC"]
|
||||
},
|
||||
levelOverride: "/Lotus/Levels/Proc/Corpus/CorpusShipSurvivalRaid",
|
||||
enemySpec: "/Lotus/Types/Game/EnemySpecs/CorpusShipEnemySpecs/CorpusShipSurvivalA",
|
||||
minEnemyLevel: 20,
|
||||
maxEnemyLevel: 30,
|
||||
descText: "/Lotus/Language/Alerts/TennoUnitedAlert",
|
||||
maxWaveNum: 5
|
||||
},
|
||||
Tag: "LotusGift",
|
||||
ForceUnlock: true
|
||||
},
|
||||
{
|
||||
_id: {
|
||||
$oid: "68dc2466e298b4f04206687a"
|
||||
},
|
||||
Activation: {
|
||||
$date: {
|
||||
$numberLong: "1759327200000"
|
||||
}
|
||||
},
|
||||
Expiry: {
|
||||
$date: {
|
||||
$numberLong: "2000000000000"
|
||||
}
|
||||
},
|
||||
MissionInfo: {
|
||||
location: "SolNode149",
|
||||
missionType: "MT_DEFENSE",
|
||||
faction: "FC_GRINEER",
|
||||
difficulty: 1,
|
||||
missionReward: {
|
||||
credits: 10000,
|
||||
items: ["/Lotus/StoreItems/Types/Items/ShipDecos/Plushies/Plushy2022QTCC"]
|
||||
},
|
||||
levelOverride: "/Lotus/Levels/Proc/Grineer/GrineerShipyardsDefense",
|
||||
enemySpec: "/Lotus/Types/Game/EnemySpecs/GrineerShipyardsDefenseA",
|
||||
minEnemyLevel: 20,
|
||||
maxEnemyLevel: 30,
|
||||
descText: "/Lotus/Language/Alerts/TennoUnitedAlert",
|
||||
maxWaveNum: defenseWavesPerRotation * 1
|
||||
},
|
||||
Tag: "LotusGift",
|
||||
ForceUnlock: true
|
||||
},
|
||||
{
|
||||
_id: {
|
||||
$oid: "68dc26865e7cb56b820b4252"
|
||||
},
|
||||
Activation: {
|
||||
$date: {
|
||||
$numberLong: "1759327200000"
|
||||
}
|
||||
},
|
||||
Expiry: {
|
||||
$date: {
|
||||
$numberLong: "2000000000000"
|
||||
}
|
||||
},
|
||||
MissionInfo: {
|
||||
location: "SolNode39",
|
||||
missionType: "MT_EXCAVATE",
|
||||
faction: "FC_GRINEER",
|
||||
difficulty: 1,
|
||||
missionReward: {
|
||||
credits: 10000,
|
||||
items: ["/Lotus/StoreItems/Types/Items/ShipDecos/Plushies/PlushyVirminkQTCC"]
|
||||
},
|
||||
levelOverride: "/Lotus/Levels/Proc/Grineer/GrineerForestExcavation",
|
||||
enemySpec: "/Lotus/Types/Game/EnemySpecs/ForestGrineerExcavationA",
|
||||
minEnemyLevel: 20,
|
||||
maxEnemyLevel: 30,
|
||||
descText: "/Lotus/Language/Alerts/TennoUnitedAlert",
|
||||
maxWaveNum: 5
|
||||
},
|
||||
Tag: "LotusGift",
|
||||
ForceUnlock: true
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
const isFebruary = date.getUTCMonth() == 1;
|
||||
if (config.worldState?.starDaysOverride ?? isFebruary) {
|
||||
worldState.Goals.push({
|
||||
@ -1638,7 +1747,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
||||
Personal: true,
|
||||
Bounty: true,
|
||||
ClampNodeScores: true,
|
||||
Node: "EventNode28", // Incompatible with Wolf Hunt (2025), Orphix Venom, Warframe Anniversary
|
||||
Node: "EventNode28", // Incompatible with Wolf Hunt, Orphix Venom, Warframe Anniversary
|
||||
MissionKeyName: "/Lotus/Types/Keys/GalleonRobberyAlertB",
|
||||
Desc: "/Lotus/Language/Events/GalleonRobberyEventMissionTitle",
|
||||
Icon: "/Lotus/Interface/Icons/Player/GalleonRobberiesEvent.png",
|
||||
@ -2035,7 +2144,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
||||
}
|
||||
|
||||
if (config.worldState?.anniversary != undefined) {
|
||||
// Incompatible with: Use Tag from Warframe Anniversary for old Events, Wolf Hunt (2025), Galleon Of Ghouls, Hallowed Flame, Hallowed Nightmares, Dog Days, Proxy Rebellion, Long Shadow
|
||||
// Incompatible with: Use Tag from Warframe Anniversary for old Events, Wolf Hunt, Galleon Of Ghouls, Hallowed Flame, Hallowed Nightmares, Dog Days, Proxy Rebellion, Long Shadow
|
||||
const goalsByWeek: Partial<IGoal>[][] = [
|
||||
[
|
||||
{
|
||||
@ -2254,65 +2363,110 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
||||
});
|
||||
}
|
||||
|
||||
if (config.worldState?.wolfHunt) {
|
||||
worldState.Goals.push({
|
||||
_id: {
|
||||
$oid: "67ed7672798d6466172e3b9d"
|
||||
},
|
||||
Activation: {
|
||||
$date: {
|
||||
$numberLong: "1743616800000"
|
||||
}
|
||||
},
|
||||
Expiry: {
|
||||
$date: {
|
||||
$numberLong: "2000000000000"
|
||||
}
|
||||
},
|
||||
Count: 0,
|
||||
Goal: 3,
|
||||
InterimGoals: [1, 2],
|
||||
BonusGoal: 4,
|
||||
Success: 0,
|
||||
Personal: true,
|
||||
Bounty: true,
|
||||
ClampNodeScores: true,
|
||||
Node: "EventNode29",
|
||||
ConcurrentMissionKeyNames: [
|
||||
"/Lotus/Types/Keys/WolfTacAlertReduxB",
|
||||
"/Lotus/Types/Keys/WolfTacAlertReduxC",
|
||||
"/Lotus/Types/Keys/WolfTacAlertReduxD"
|
||||
],
|
||||
ConcurrentNodeReqs: [1, 2, 3],
|
||||
ConcurrentNodes: ["EventNode28", "EventNode39", "EventNode40"], // Incompatible with Galleon Of Ghouls, Orphix Venom, Warframe Anniversary
|
||||
MissionKeyName: "/Lotus/Types/Keys/WolfTacAlertReduxA",
|
||||
Faction: "FC_GRINEER",
|
||||
Desc: "/Lotus/Language/Alerts/WolfAlert",
|
||||
Icon: "/Lotus/Interface/Icons/Npcs/Seasonal/WolfStalker.png",
|
||||
Tag: "WolfHuntRedux",
|
||||
InterimRewards: [
|
||||
{
|
||||
credits: 50000,
|
||||
items: ["/Lotus/StoreItems/Types/Recipes/Weapons/WeaponParts/ThrowingHammerHandle"]
|
||||
if (config.worldState?.wolfHunt != undefined) {
|
||||
const year = config.worldState.wolfHunt;
|
||||
console.log(year);
|
||||
if (year == 0) {
|
||||
worldState.Goals.push({
|
||||
_id: {
|
||||
$oid: "67ed7672798d6466172e3b9c"
|
||||
},
|
||||
{
|
||||
credits: 50000,
|
||||
items: ["/Lotus/StoreItems/Types/Recipes/Weapons/WeaponParts/ThrowingHammerHead"]
|
||||
Activation: {
|
||||
$date: {
|
||||
$numberLong: "1743616800000"
|
||||
}
|
||||
},
|
||||
Expiry: {
|
||||
$date: {
|
||||
$numberLong: "2000000000000"
|
||||
}
|
||||
},
|
||||
Count: 0,
|
||||
Goal: 1,
|
||||
BonusGoal: 2,
|
||||
Success: 0,
|
||||
Personal: true,
|
||||
Bounty: true,
|
||||
ClampNodeScores: true,
|
||||
Node: "EventNode29",
|
||||
ConcurrentMissionKeyNames: ["/Lotus/Types/Keys/WolfTacAlertB"],
|
||||
ConcurrentNodeReqs: [1],
|
||||
ConcurrentNodes: ["EventNode28"], // Incompatible with Galleon Of Ghouls, Orphix Venom, Warframe Anniversary
|
||||
MissionKeyName: "/Lotus/Types/Keys/WolfTacAlertA",
|
||||
Faction: "FC_GRINEER",
|
||||
Desc: "/Lotus/Language/Alerts/WolfAlert",
|
||||
Icon: "/Lotus/Interface/Icons/Npcs/Seasonal/WolfStalker.png",
|
||||
Tag: "WolfHuntRedux", // unfaithful
|
||||
Reward: {
|
||||
countedItems: [{ ItemType: "/Lotus/Types/Items/MiscItems/Alertium", ItemCount: 10 }]
|
||||
},
|
||||
BonusReward: {
|
||||
items: [
|
||||
"/Lotus/StoreItems/Upgrades/Mods/Randomized/RawRifleRandomMod",
|
||||
"/Lotus/StoreItems/Upgrades/Skins/Clan/BountyHunterBadgeItem"
|
||||
]
|
||||
}
|
||||
],
|
||||
Reward: {
|
||||
credits: 50000,
|
||||
items: ["/Lotus/StoreItems/Types/Recipes/Weapons/WeaponParts/ThrowingHammerMotor"]
|
||||
},
|
||||
BonusReward: {
|
||||
credits: 50000,
|
||||
items: [
|
||||
"/Lotus/StoreItems/Types/Recipes/Weapons/ThrowingHammerBlueprint",
|
||||
"/Lotus/StoreItems/Types/Items/MiscItems/OrokinCatalyst",
|
||||
"/Lotus/StoreItems/Upgrades/Skins/Clan/BountyHunterBadgeItem"
|
||||
]
|
||||
}
|
||||
});
|
||||
});
|
||||
} else if (year == 1) {
|
||||
worldState.Goals.push({
|
||||
_id: {
|
||||
$oid: "67ed7672798d6466172e3b9d"
|
||||
},
|
||||
Activation: {
|
||||
$date: {
|
||||
$numberLong: "1743616800000"
|
||||
}
|
||||
},
|
||||
Expiry: {
|
||||
$date: {
|
||||
$numberLong: "2000000000000"
|
||||
}
|
||||
},
|
||||
Count: 0,
|
||||
Goal: 3,
|
||||
InterimGoals: [1, 2],
|
||||
BonusGoal: 4,
|
||||
Success: 0,
|
||||
Personal: true,
|
||||
Bounty: true,
|
||||
ClampNodeScores: true,
|
||||
Node: "EventNode29",
|
||||
ConcurrentMissionKeyNames: [
|
||||
"/Lotus/Types/Keys/WolfTacAlertReduxB",
|
||||
"/Lotus/Types/Keys/WolfTacAlertReduxC",
|
||||
"/Lotus/Types/Keys/WolfTacAlertReduxD"
|
||||
],
|
||||
ConcurrentNodeReqs: [1, 2, 3],
|
||||
ConcurrentNodes: ["EventNode28", "EventNode39", "EventNode40"], // Incompatible with Galleon Of Ghouls, Orphix Venom, Warframe Anniversary
|
||||
MissionKeyName: "/Lotus/Types/Keys/WolfTacAlertReduxA",
|
||||
Faction: "FC_GRINEER",
|
||||
Desc: "/Lotus/Language/Alerts/WolfAlert",
|
||||
Icon: "/Lotus/Interface/Icons/Npcs/Seasonal/WolfStalker.png",
|
||||
Tag: "WolfHuntRedux",
|
||||
InterimRewards: [
|
||||
{
|
||||
credits: 50000,
|
||||
items: ["/Lotus/StoreItems/Types/Recipes/Weapons/WeaponParts/ThrowingHammerHandle"]
|
||||
},
|
||||
{
|
||||
credits: 50000,
|
||||
items: ["/Lotus/StoreItems/Types/Recipes/Weapons/WeaponParts/ThrowingHammerHead"]
|
||||
}
|
||||
],
|
||||
Reward: {
|
||||
credits: 50000,
|
||||
items: ["/Lotus/StoreItems/Types/Recipes/Weapons/WeaponParts/ThrowingHammerMotor"]
|
||||
},
|
||||
BonusReward: {
|
||||
credits: 50000,
|
||||
items: [
|
||||
"/Lotus/StoreItems/Types/Recipes/Weapons/ThrowingHammerBlueprint",
|
||||
"/Lotus/StoreItems/Types/Items/MiscItems/OrokinCatalyst",
|
||||
"/Lotus/StoreItems/Upgrades/Skins/Clan/BountyHunterBadgeItem"
|
||||
]
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const tagsForOlderGoals: string[] = [
|
||||
@ -2409,22 +2563,22 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
||||
// 2016
|
||||
[
|
||||
{
|
||||
items: ["/Lotus/StoreItems/Upgrades/Skins/Sigils/OrokinCatalyst"]
|
||||
},
|
||||
{
|
||||
items: ["/Lotus/StoreItems/Upgrades/Skins/Sigils/DotD2016Sigil"]
|
||||
items: ["/Lotus/StoreItems/Types/Items/MiscItems/OrokinCatalyst"]
|
||||
},
|
||||
{
|
||||
items: [
|
||||
"/Lotus/StoreItems/Types/Items/MiscItems/OrokinReactor",
|
||||
"/Lotus/StoreItems/Upgrades/Skins/Sigils/DotD2016Sigil",
|
||||
"/Lotus/StoreItems/Upgrades/Skins/Clan/BountyHunterBadgeItem"
|
||||
]
|
||||
},
|
||||
{
|
||||
items: ["/Lotus/StoreItems/Types/Items/MiscItems/OrokinReactor"]
|
||||
}
|
||||
],
|
||||
// 2015
|
||||
[
|
||||
{
|
||||
items: ["/Lotus/StoreItems/Upgrades/Skins/Sigils/OrokinCatalyst"]
|
||||
items: ["/Lotus/StoreItems/Types/Items/MiscItems/OrokinCatalyst"]
|
||||
},
|
||||
{
|
||||
items: ["/Lotus/StoreItems/Upgrades/Skins/Clan/BountyHunterBadgeItem"]
|
||||
@ -2713,7 +2867,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
||||
Success: 0,
|
||||
Personal: true,
|
||||
Best: true,
|
||||
Node: "EventNode28", // Incompatible with Galleon Of Ghouls, Wolf Hunt (2025)
|
||||
Node: "EventNode28", // Incompatible with Galleon Of Ghouls, Wolf Hunt
|
||||
MissionKeyName: "/Lotus/Types/Keys/MechSurvivalGrineerGalleon",
|
||||
Faction: "FC_SENTIENT",
|
||||
Desc: "/Lotus/Language/Events/MechEventMissionTier2",
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
import type { IMissionReward, TFaction } from "warframe-public-export-plus";
|
||||
import type { IMissionReward, TFaction, TMissionType } from "warframe-public-export-plus";
|
||||
import type { IMongoDate, IOid } from "./commonTypes.ts";
|
||||
|
||||
export interface IWorldState {
|
||||
@ -40,11 +40,13 @@ export interface IAlert {
|
||||
Activation: IMongoDate;
|
||||
Expiry: IMongoDate;
|
||||
MissionInfo: IAlertMissionInfo;
|
||||
Tag?: string;
|
||||
ForceUnlock?: true;
|
||||
}
|
||||
|
||||
export interface IAlertMissionInfo {
|
||||
location: string;
|
||||
missionType: string;
|
||||
missionType: TMissionType;
|
||||
faction: TFaction;
|
||||
difficulty: number;
|
||||
missionReward?: IMissionReward;
|
||||
@ -55,6 +57,9 @@ export interface IAlertMissionInfo {
|
||||
minEnemyLevel?: number;
|
||||
maxEnemyLevel?: number;
|
||||
maxWaveNum?: number;
|
||||
descText?: string;
|
||||
|
||||
maxRotations?: number; // SNS specific field
|
||||
}
|
||||
|
||||
export interface IGoal {
|
||||
|
||||
@ -526,6 +526,24 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row g-3 mb-3">
|
||||
<div class="col-lg-6">
|
||||
<div class="card" style="height: 400px;">
|
||||
<h5 class="card-header" data-loc="inventory_weaponSkins"></h5>
|
||||
<div class="card-body d-flex flex-column">
|
||||
<form class="input-group mb-3" onsubmit="doAcquireEquipment('WeaponSkins');return false;">
|
||||
<input class="form-control" id="acquire-type-WeaponSkins" list="datalist-WeaponSkins" />
|
||||
<button class="btn btn-primary" type="submit" data-loc="general_addButton"></button>
|
||||
</form>
|
||||
<div class="overflow-auto">
|
||||
<table class="table table-hover w-100">
|
||||
<tbody id="WeaponSkins-list"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<h5 class="card-header" data-loc="general_bulkActions"></h5>
|
||||
<div class="card-body">
|
||||
@ -538,6 +556,7 @@
|
||||
<button class="btn btn-primary" onclick="debounce(addMissingEquipment, ['SentinelWeapons']);" data-loc="inventory_bulkAddSentinelWeapons"></button>
|
||||
<button class="btn btn-primary" onclick="debounce(addMissingEquipment, ['FlavourItems']);" data-loc="inventory_bulkAddFlavourItems"></button>
|
||||
<button class="btn btn-primary" onclick="debounce(addMissingEquipment, ['ShipDecorations']);" data-loc="inventory_bulkAddShipDecorations"></button>
|
||||
<button class="btn btn-primary" onclick="debounce(addMissingEquipment, ['WeaponSkins']);" data-loc="inventory_bulkAddWeaponSkins"></button>
|
||||
<button class="btn btn-primary" onclick="debounce(addMissingEvolutionProgress);" data-loc="inventory_bulkAddEvolutionProgress"></button>
|
||||
</div>
|
||||
<div class="mb-2 d-flex flex-wrap gap-2">
|
||||
@ -1169,11 +1188,6 @@
|
||||
<label class="form-check-label" for="unfaithfulBugFixes.useAnniversaryTagForOldGoals" data-loc="worldState_useAnniversaryTagForOldGoals"></label>
|
||||
<abbr data-loc-inc="worldState_anniversary"><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.wolfHunt" />
|
||||
<label class="form-check-label" for="worldState.wolfHunt" data-loc="worldState_wolfHunt"></label>
|
||||
<abbr data-loc-inc="worldState_galleonOfGhouls|worldState_orphixVenom|worldState_anniversary"><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>
|
||||
@ -1189,6 +1203,19 @@
|
||||
<label class="form-check-label" for="worldState.hallowedFlame" data-loc="worldState_hallowedFlame"></label>
|
||||
<abbr data-loc-inc="worldState_hallowedNightmares|worldState_dogDays|worldState_anniversary"><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.qtccAlerts" />
|
||||
<label class="form-check-label" for="worldState.qtccAlerts" data-loc="worldState_qtccAlerts"></label>
|
||||
</div>
|
||||
<div class="form-group mt-2">
|
||||
<label class="form-label" for="worldState.wolfHunt" data-loc="worldState_wolfHunt"></label>
|
||||
<abbr data-loc-inc="worldState_galleonOfGhouls|worldState_orphixVenom|worldState_anniversary"><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.wolfHunt" data-default="null">
|
||||
<option value="null" data-loc="disabled"></option>
|
||||
<option value="0" data-loc="worldState_from_year" data-loc-replace="2019"></option>
|
||||
<option value="1" data-loc="worldState_from_year" data-loc-replace="2025"></option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group mt-2 d-flex gap-2">
|
||||
<div class="flex-fill">
|
||||
<label class="form-label" for="worldState.hallowedNightmares" data-loc="worldState_hallowedNightmares"></label>
|
||||
@ -1524,6 +1551,7 @@
|
||||
<datalist id="datalist-VaultDecoRecipes"></datalist>
|
||||
<datalist id="datalist-FlavourItems"></datalist>
|
||||
<datalist id="datalist-ShipDecorations"></datalist>
|
||||
<datalist id="datalist-WeaponSkins"></datalist>
|
||||
<datalist id="datalist-circuitGameModes">
|
||||
<option>Survival</option>
|
||||
<option>VoidFlood</option>
|
||||
|
||||
@ -599,6 +599,46 @@ function fetchItemList() {
|
||||
}
|
||||
itemMap[item.uniqueName] = { ...item, type };
|
||||
});
|
||||
} else if (type == "WeaponSkins") {
|
||||
let beardNumber = 1;
|
||||
let cutNumber = 13;
|
||||
let adultHeadNumber = 1;
|
||||
let headNumber = 1;
|
||||
items.forEach(item => {
|
||||
if (item.name == "") {
|
||||
if (item.uniqueName.includes("/Beards/")) {
|
||||
item.name = loc("code_drifterBeardName")
|
||||
.split("|INDEX|")
|
||||
.join(beardNumber.toString().padStart(3, "0"));
|
||||
beardNumber++;
|
||||
} else if (item.uniqueName.includes("/Hair/")) {
|
||||
item.name = loc("code_cutName")
|
||||
.split("|INDEX|")
|
||||
.join(cutNumber.toString().padStart(3, "0"));
|
||||
cutNumber++;
|
||||
if (cutNumber == 19) cutNumber = 21;
|
||||
} else if (item.uniqueName.includes("/Heads/Adult")) {
|
||||
item.name = loc("code_drifterFaceName")
|
||||
.split("|INDEX|")
|
||||
.join(adultHeadNumber.toString().padStart(3, "0"));
|
||||
adultHeadNumber++;
|
||||
} else if (item.uniqueName.includes("/Heads/")) {
|
||||
item.name = loc("code_operatorFaceName")
|
||||
.split("|INDEX|")
|
||||
.join(headNumber.toString().padStart(3, "0"));
|
||||
headNumber++;
|
||||
} else {
|
||||
item.name = item.uniqueName;
|
||||
}
|
||||
}
|
||||
if (!item.alwaysAvailable) {
|
||||
const option = document.createElement("option");
|
||||
option.setAttribute("data-key", item.uniqueName);
|
||||
option.value = item.name;
|
||||
document.getElementById("datalist-" + type).appendChild(option);
|
||||
}
|
||||
itemMap[item.uniqueName] = { ...item, type };
|
||||
});
|
||||
} else {
|
||||
const nameToItems = {};
|
||||
items.forEach(item => {
|
||||
@ -1103,6 +1143,44 @@ function updateInventory() {
|
||||
document.getElementById("FlavourItems-list").appendChild(tr);
|
||||
});
|
||||
|
||||
document.getElementById("WeaponSkins-list").innerHTML = "";
|
||||
data.WeaponSkins.forEach(item => {
|
||||
if (item.ItemId.$oid.startsWith("ca70ca70ca70ca70")) return;
|
||||
const datalist = document.getElementById("datalist-WeaponSkins");
|
||||
const optionToRemove = datalist.querySelector(`option[data-key="${item.ItemType}"]`);
|
||||
if (optionToRemove) {
|
||||
datalist.removeChild(optionToRemove);
|
||||
}
|
||||
const tr = document.createElement("tr");
|
||||
{
|
||||
const td = document.createElement("td");
|
||||
const name = itemMap[item.ItemType]?.name?.trim();
|
||||
td.textContent = name || item.ItemType;
|
||||
tr.appendChild(td);
|
||||
}
|
||||
{
|
||||
const td = document.createElement("td");
|
||||
td.classList = "text-end text-nowrap";
|
||||
{
|
||||
const a = document.createElement("a");
|
||||
a.href = "#";
|
||||
a.onclick = function (event) {
|
||||
event.preventDefault();
|
||||
document.getElementById("WeaponSkins-list").removeChild(tr);
|
||||
reAddToItemList(itemMap, "WeaponSkins", item.ItemType);
|
||||
disposeOfGear("WeaponSkins", item.ItemId.$oid);
|
||||
};
|
||||
a.title = loc("code_remove");
|
||||
a.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M135.2 17.7L128 32H32C14.3 32 0 46.3 0 64S14.3 96 32 96H416c17.7 0 32-14.3 32-32s-14.3-32-32-32H320l-7.2-14.3C307.4 6.8 296.3 0 284.2 0H163.8c-12.1 0-23.2 6.8-28.6 17.7zM416 128H32L53.2 467c1.6 25.3 22.6 45 47.9 45H346.9c25.3 0 46.3-19.7 47.9-45L416 128z"/></svg>`;
|
||||
td.appendChild(a);
|
||||
}
|
||||
|
||||
tr.appendChild(td);
|
||||
}
|
||||
|
||||
document.getElementById("WeaponSkins-list").appendChild(tr);
|
||||
});
|
||||
|
||||
const datalistEvolutionProgress = document.querySelectorAll("#datalist-EvolutionProgress option");
|
||||
const formEvolutionProgress = document.querySelector('form[onsubmit*="doAcquireEvolution()"]');
|
||||
|
||||
|
||||
@ -75,6 +75,10 @@ dict = {
|
||||
code_funded: `[UNTRANSLATED] Funded`,
|
||||
code_replays: `[UNTRANSLATED] Replays`,
|
||||
code_stalker: `Stalker`,
|
||||
code_cutName: `Frisur: |INDEX|`,
|
||||
code_drifterBeardName: `Drifter-Bart: |INDEX|`,
|
||||
code_drifterFaceName: `Drifter-Gesicht: |INDEX|`,
|
||||
code_operatorFaceName: `Operator-Gesicht: |INDEX|`,
|
||||
code_succChange: `Erfolgreich geändert.`,
|
||||
code_requiredInvigorationUpgrade: `[UNTRANSLATED] You must select both an offensive & utility upgrade.`,
|
||||
login_description: `Melde dich mit deinem OpenWF-Account an (denselben Angaben wie im Spiel, wenn du dich mit diesem Server verbindest).`,
|
||||
@ -112,6 +116,7 @@ dict = {
|
||||
inventory_boosters: `Booster`,
|
||||
inventory_flavourItems: `<abbr title="Animationssets, Glyphen, Farbpaletten usw.">Sammlerstücke</abbr>`,
|
||||
inventory_shipDecorations: `Schiffsdekorationen`,
|
||||
inventory_weaponSkins: `Skins`,
|
||||
inventory_bulkAddSuits: `Fehlende Warframes hinzufügen`,
|
||||
inventory_bulkAddWeapons: `Fehlende Waffen hinzufügen`,
|
||||
inventory_bulkAddSpaceSuits: `Fehlende Archwings hinzufügen`,
|
||||
@ -121,6 +126,7 @@ dict = {
|
||||
inventory_bulkAddFlavourItems: `[UNTRANSLATED] Add Missing Flavour Items`,
|
||||
inventory_bulkAddShipDecorations: `[UNTRANSLATED] Add Missing Ship Decorations`,
|
||||
inventory_bulkAddEvolutionProgress: `Fehlende Incarnon-Entwicklungsfortschritte hinzufügen`,
|
||||
inventory_bulkAddWeaponSkins: `[UNTRANSLATED] Add Missing Skins`,
|
||||
inventory_bulkRankUpSuits: `Alle Warframes auf Max. Rang`,
|
||||
inventory_bulkRankUpWeapons: `Alle Waffen auf Max. Rang`,
|
||||
inventory_bulkRankUpSpaceSuits: `Alle Archwings auf Max. Rang`,
|
||||
@ -278,8 +284,8 @@ dict = {
|
||||
worldState_plagueStar: `Plagenstern`,
|
||||
worldState_dogDays: `Hitzefrei`,
|
||||
worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`,
|
||||
worldState_wolfHunt: `Wolfsjagd (2025)`,
|
||||
worldState_voidCorruption: `[UNTRANSLATED] Void Corruption (|VAL|)`,
|
||||
worldState_wolfHunt: `Wolfsjagd`,
|
||||
worldState_voidCorruption: `Void-Korruption (|VAL|)`,
|
||||
worldState_orphixVenom: `Orphix Gift`,
|
||||
worldState_longShadow: `Lange Schatten`,
|
||||
worldState_hallowedFlame: `Geweihte Flamme`,
|
||||
@ -294,6 +300,7 @@ dict = {
|
||||
worldState_eightClawProgressOverride: `[UNTRANSLATED] Eight Claw Progress`,
|
||||
worldState_thermiaFractures: `Thermische Risse`,
|
||||
worldState_thermiaFracturesProgressOverride: `[UNTRANSLATED] Thermia Fractures Progress`,
|
||||
worldState_qtccAlerts: `[UNTRANSLATED] Quest to Conquer Cancer Alerts`,
|
||||
worldState_from_year: `[UNTRANSLATED] from |VAL|`,
|
||||
worldState_pre_year: `[UNTRANSLATED] pre |VAL|`,
|
||||
worldState_week: `[UNTRANSLATED] Week |VAL|`,
|
||||
|
||||
@ -74,6 +74,10 @@ dict = {
|
||||
code_funded: `Funded`,
|
||||
code_replays: `Replays`,
|
||||
code_stalker: `Stalker`,
|
||||
code_cutName: `Cut |INDEX|`,
|
||||
code_drifterBeardName: `Drifter Beard |INDEX|`,
|
||||
code_drifterFaceName: `Drifter Visage |INDEX|`,
|
||||
code_operatorFaceName: `Operator Visage |INDEX|`,
|
||||
code_succChange: `Successfully changed.`,
|
||||
code_requiredInvigorationUpgrade: `You must select both an offensive & utility upgrade.`,
|
||||
login_description: `Login using your OpenWF account credentials (same as in-game when connecting to this server).`,
|
||||
@ -111,6 +115,7 @@ dict = {
|
||||
inventory_boosters: `Boosters`,
|
||||
inventory_flavourItems: `<abbr title="Animation Sets, Glyphs, Palettes, etc.">Flavour Items</abbr>`,
|
||||
inventory_shipDecorations: `Ship Decorations`,
|
||||
inventory_weaponSkins: `Skins`,
|
||||
inventory_bulkAddSuits: `Add Missing Warframes`,
|
||||
inventory_bulkAddWeapons: `Add Missing Weapons`,
|
||||
inventory_bulkAddSpaceSuits: `Add Missing Archwings`,
|
||||
@ -120,6 +125,7 @@ dict = {
|
||||
inventory_bulkAddFlavourItems: `Add Missing Flavour Items`,
|
||||
inventory_bulkAddShipDecorations: `Add Missing Ship Decorations`,
|
||||
inventory_bulkAddEvolutionProgress: `Add Missing Incarnon Evolution Progress`,
|
||||
inventory_bulkAddWeaponSkins: `Add Missing Skins`,
|
||||
inventory_bulkRankUpSuits: `Max Rank All Warframes`,
|
||||
inventory_bulkRankUpWeapons: `Max Rank All Weapons`,
|
||||
inventory_bulkRankUpSpaceSuits: `Max Rank All Archwings`,
|
||||
@ -277,7 +283,7 @@ dict = {
|
||||
worldState_plagueStar: `Plague Star`,
|
||||
worldState_dogDays: `Dog Days`,
|
||||
worldState_dogDaysRewards: `Dog Days Rewards`,
|
||||
worldState_wolfHunt: `Wolf Hunt (2025)`,
|
||||
worldState_wolfHunt: `Wolf Hunt`,
|
||||
worldState_voidCorruption: `Void Corruption (|VAL|)`,
|
||||
worldState_orphixVenom: `Orphix Venom`,
|
||||
worldState_longShadow: `Long Shadow`,
|
||||
@ -293,6 +299,7 @@ dict = {
|
||||
worldState_eightClawProgressOverride: `Eight Claw Progress`,
|
||||
worldState_thermiaFractures: `Thermia Fractures`,
|
||||
worldState_thermiaFracturesProgressOverride: `Thermia Fractures Progress`,
|
||||
worldState_qtccAlerts: `Quest to Conquer Cancer Alerts`,
|
||||
worldState_from_year: `from |VAL|`,
|
||||
worldState_pre_year: `pre |VAL|`,
|
||||
worldState_week: `Week |VAL|`,
|
||||
|
||||
@ -75,6 +75,10 @@ dict = {
|
||||
code_funded: `Financiado`,
|
||||
code_replays: `Repeticiones`,
|
||||
code_stalker: `Stalker`,
|
||||
code_cutName: `[UNTRANSLATED] Cut |INDEX|`,
|
||||
code_drifterBeardName: `Barba del Viajero: |INDEX|`,
|
||||
code_drifterFaceName: `Rostro del Viajero |INDEX|`,
|
||||
code_operatorFaceName: `Rostro del operador |INDEX|`,
|
||||
code_succChange: `Cambiado correctamente`,
|
||||
code_requiredInvigorationUpgrade: `Debes seleccionar una mejora ofensiva y una mejora de utilidad.`,
|
||||
login_description: `Inicia sesión con las credenciales de tu cuenta OpenWF (las mismas que usas en el juego al conectarte a este servidor).`,
|
||||
@ -112,6 +116,7 @@ dict = {
|
||||
inventory_boosters: `Potenciadores`,
|
||||
inventory_flavourItems: `<abbr title="Conjuntos de animaciones, glifos, paletas, etc.">Ítems estéticos</abbr>`,
|
||||
inventory_shipDecorations: `Decoraciones de nave`,
|
||||
inventory_weaponSkins: `Diseños`,
|
||||
inventory_bulkAddSuits: `Agregar Warframes faltantes`,
|
||||
inventory_bulkAddWeapons: `Agregar armas faltantes`,
|
||||
inventory_bulkAddSpaceSuits: `Agregar Archwings faltantes`,
|
||||
@ -121,6 +126,7 @@ dict = {
|
||||
inventory_bulkAddFlavourItems: `Añadir items estéticos faltantes`,
|
||||
inventory_bulkAddShipDecorations: `Añadir decoraciones de Nave Faltantes`,
|
||||
inventory_bulkAddEvolutionProgress: `Completar el progreso de evolución Incarnon faltante`,
|
||||
inventory_bulkAddWeaponSkins: `[UNTRANSLATED] Add Missing Skins`,
|
||||
inventory_bulkRankUpSuits: `Maximizar rango de todos los Warframes`,
|
||||
inventory_bulkRankUpWeapons: `Maximizar rango de todas las armas`,
|
||||
inventory_bulkRankUpSpaceSuits: `Maximizar rango de todos los Archwings`,
|
||||
@ -278,7 +284,7 @@ dict = {
|
||||
worldState_plagueStar: `Estrella Infestada`,
|
||||
worldState_dogDays: `Canícula`,
|
||||
worldState_dogDaysRewards: `Recompensas de Canícula`,
|
||||
worldState_wolfHunt: `Cacería del Lobo (2025)`,
|
||||
worldState_wolfHunt: `Cacería del Lobo`,
|
||||
worldState_voidCorruption: `Corrupción del Vacío (|VAL|)`,
|
||||
worldState_orphixVenom: `Veneno de Orphix`,
|
||||
worldState_longShadow: `Sombra Prolongada`,
|
||||
@ -294,6 +300,7 @@ dict = {
|
||||
worldState_eightClawProgressOverride: `Progreso de Octava Garra`,
|
||||
worldState_thermiaFractures: `Fracturas Thermia`,
|
||||
worldState_thermiaFracturesProgressOverride: `Progreso de Fracturas Thermia`,
|
||||
worldState_qtccAlerts: `[UNTRANSLATED] Quest to Conquer Cancer Alerts`,
|
||||
worldState_from_year: `de |VAL|`,
|
||||
worldState_pre_year: `antes de |VAL|`,
|
||||
worldState_week: `Semana |VAL|`,
|
||||
|
||||
@ -75,6 +75,10 @@ dict = {
|
||||
code_funded: `Complété`,
|
||||
code_replays: `[UNTRANSLATED] Replays`,
|
||||
code_stalker: `Stalker`,
|
||||
code_cutName: `[UNTRANSLATED] Cut |INDEX|`,
|
||||
code_drifterBeardName: `Barbe du Voyageur |INDEX|`,
|
||||
code_drifterFaceName: `Visage du Voyageur |INDEX|`,
|
||||
code_operatorFaceName: `Visage de l'Opérateur |INDEX|`,
|
||||
code_succChange: `Changement effectué.`,
|
||||
code_requiredInvigorationUpgrade: `[UNTRANSLATED] You must select both an offensive & utility upgrade.`,
|
||||
login_description: `Connexion avec les informations de connexion OpenWF.`,
|
||||
@ -112,6 +116,7 @@ dict = {
|
||||
inventory_boosters: `Boosters`,
|
||||
inventory_flavourItems: `[UNTRANSLATED] <abbr title="Animation Sets, Glyphs, Palettes, etc.">Flavour Items</abbr>`,
|
||||
inventory_shipDecorations: `Décorations du vaisseau`,
|
||||
inventory_weaponSkins: `Aspects`,
|
||||
inventory_bulkAddSuits: `Ajouter les Warframes manquantes`,
|
||||
inventory_bulkAddWeapons: `Ajouter les armes manquantes`,
|
||||
inventory_bulkAddSpaceSuits: `Ajouter les Archwings manquants`,
|
||||
@ -121,6 +126,7 @@ dict = {
|
||||
inventory_bulkAddFlavourItems: `[UNTRANSLATED] Add Missing Flavour Items`,
|
||||
inventory_bulkAddShipDecorations: `[UNTRANSLATED] Add Missing Ship Decorations`,
|
||||
inventory_bulkAddEvolutionProgress: `Ajouter les évolutions Incarnon manquantes`,
|
||||
inventory_bulkAddWeaponSkins: `[UNTRANSLATED] Add Missing Skins`,
|
||||
inventory_bulkRankUpSuits: `Toutes les Warframes au rang max`,
|
||||
inventory_bulkRankUpWeapons: `Toutes les armes au rang max`,
|
||||
inventory_bulkRankUpSpaceSuits: `Tous les Archwings au rang max`,
|
||||
@ -278,8 +284,8 @@ dict = {
|
||||
worldState_plagueStar: `Fléau Céleste`,
|
||||
worldState_dogDays: `Bataille d'Eau`,
|
||||
worldState_dogDaysRewards: `Récompenses de la Bataille d'Eau`,
|
||||
worldState_wolfHunt: `Chasse au Loup (2025)`,
|
||||
worldState_voidCorruption: `[UNTRANSLATED] Void Corruption (|VAL|)`,
|
||||
worldState_wolfHunt: `Chasse au Loup`,
|
||||
worldState_voidCorruption: `Corruption du Néant (|VAL|)`,
|
||||
worldState_orphixVenom: `Venin Orphix`,
|
||||
worldState_longShadow: `La Propagation des Ombres`,
|
||||
worldState_hallowedFlame: `Flamme Hantée`,
|
||||
@ -294,6 +300,7 @@ dict = {
|
||||
worldState_eightClawProgressOverride: `Progrès de la Huitième Griffe`,
|
||||
worldState_thermiaFractures: `Crevasses Thermia`,
|
||||
worldState_thermiaFracturesProgressOverride: `Progrès des Fractures Thermia`,
|
||||
worldState_qtccAlerts: `[UNTRANSLATED] Quest to Conquer Cancer Alerts`,
|
||||
worldState_from_year: `de |VAL|`,
|
||||
worldState_pre_year: `pre-|VAL|`,
|
||||
worldState_week: `Semaine |VAL|`,
|
||||
|
||||
@ -75,6 +75,10 @@ dict = {
|
||||
code_funded: `Профинансировано`,
|
||||
code_replays: `Повторов`,
|
||||
code_stalker: `Сталкер`,
|
||||
code_cutName: `Причёска: |INDEX|`,
|
||||
code_drifterBeardName: `Борода скитальца: |INDEX|`,
|
||||
code_drifterFaceName: `Внешность скитальца: |INDEX|`,
|
||||
code_operatorFaceName: `Внешность оператора: |INDEX|`,
|
||||
code_succChange: `Успешно изменено.`,
|
||||
code_requiredInvigorationUpgrade: `Вы должны выбрать как атакующее, так и вспомогательное улучшение.`,
|
||||
login_description: `Войдите, используя учетные данные OpenWF (те же, что и в игре при подключении к этому серверу).`,
|
||||
@ -112,6 +116,7 @@ dict = {
|
||||
inventory_boosters: `Бустеры`,
|
||||
inventory_flavourItems: `<abbr title="Наборы анимаций, глифы, палитры и т. д.">Уникальные предметы</abbr>`,
|
||||
inventory_shipDecorations: `Украшения корабля`,
|
||||
inventory_weaponSkins: `Скины`,
|
||||
inventory_bulkAddSuits: `Добавить отсутствующие Варфреймы`,
|
||||
inventory_bulkAddWeapons: `Добавить отсутствующее оружие`,
|
||||
inventory_bulkAddSpaceSuits: `Добавить отсутствующие Арчвинги`,
|
||||
@ -121,6 +126,7 @@ dict = {
|
||||
inventory_bulkAddFlavourItems: `Добавить отсутствующие уникальные предметы`,
|
||||
inventory_bulkAddShipDecorations: `Добавить отсутствующие украшения корабля`,
|
||||
inventory_bulkAddEvolutionProgress: `Добавить отсутствующий прогресс эволюции Инкарнонов`,
|
||||
inventory_bulkAddWeaponSkins: `Добавить отсутствующие скины`,
|
||||
inventory_bulkRankUpSuits: `Макс. ранг всех Варфреймов`,
|
||||
inventory_bulkRankUpWeapons: `Макс. ранг всего оружия`,
|
||||
inventory_bulkRankUpSpaceSuits: `Макс. ранг всех Арчвингов`,
|
||||
@ -278,8 +284,8 @@ dict = {
|
||||
worldState_plagueStar: `Чумная звезда`,
|
||||
worldState_dogDays: `Знойные дни`,
|
||||
worldState_dogDaysRewards: `Награды Знойных дней`,
|
||||
worldState_wolfHunt: `Волчья Охота (2025)`,
|
||||
worldState_voidCorruption: `[UNTRANSLATED] Void Corruption (|VAL|)`,
|
||||
worldState_wolfHunt: `Волчья Охота`,
|
||||
worldState_voidCorruption: `Искажение Бездны (|VAL|)`,
|
||||
worldState_orphixVenom: `Яд Орфикса`,
|
||||
worldState_longShadow: `Длинная Тень`,
|
||||
worldState_hallowedFlame: `Священное пламя`,
|
||||
@ -294,6 +300,7 @@ dict = {
|
||||
worldState_eightClawProgressOverride: `Прогресс Восьми когтей`,
|
||||
worldState_thermiaFractures: `Разломы Термии`,
|
||||
worldState_thermiaFracturesProgressOverride: `Прогресс Разломов Термии`,
|
||||
worldState_qtccAlerts: `Тревоги Quest to Conquer Cancer`,
|
||||
worldState_from_year: `из |VAL|`,
|
||||
worldState_pre_year: `до |VAL|`,
|
||||
worldState_week: `Неделя |VAL|`,
|
||||
|
||||
@ -75,6 +75,10 @@ dict = {
|
||||
code_funded: `Профінансовано`,
|
||||
code_replays: `Повтори`,
|
||||
code_stalker: `Сталкер`,
|
||||
code_cutName: `Зачіска: |INDEX|`,
|
||||
code_drifterBeardName: `Борода мандрівника: |INDEX|`,
|
||||
code_drifterFaceName: `Зовнішність мандрівника: |INDEX|`,
|
||||
code_operatorFaceName: `Зовнішність оператора: |INDEX|`,
|
||||
code_succChange: `Успішно змінено.`,
|
||||
code_requiredInvigorationUpgrade: `Ви повинні вибрати як атакуюче, так і допоміжне вдосконалення.`,
|
||||
login_description: `Увійдіть, використовуючи облікові дані OpenWF (ті ж, що й у грі при підключенні до цього серверу).`,
|
||||
@ -112,6 +116,7 @@ dict = {
|
||||
inventory_boosters: `Посилення`,
|
||||
inventory_flavourItems: `<abbr title="Набори анімацій, гліфи, палітри і т. д.">Унікальні предмети</abbr>`,
|
||||
inventory_shipDecorations: `Прикраси судна`,
|
||||
inventory_weaponSkins: `Вигляди`,
|
||||
inventory_bulkAddSuits: `Додати відсутні Ворфрейми`,
|
||||
inventory_bulkAddWeapons: `Додати відсутню зброю`,
|
||||
inventory_bulkAddSpaceSuits: `Додати відсутні Арквінґи`,
|
||||
@ -121,6 +126,7 @@ dict = {
|
||||
inventory_bulkAddFlavourItems: `Додати відсутні унікальні предмети`,
|
||||
inventory_bulkAddShipDecorations: `Додати відсутні оздоби корабля`,
|
||||
inventory_bulkAddEvolutionProgress: `Додати відсутній прогрес еволюції Інкарнонів`,
|
||||
inventory_bulkAddWeaponSkins: `[UNTRANSLATED] Add Missing Skins`,
|
||||
inventory_bulkRankUpSuits: `Макс. рівень всіх Ворфреймів`,
|
||||
inventory_bulkRankUpWeapons: `Макс. рівень всієї зброї`,
|
||||
inventory_bulkRankUpSpaceSuits: `Макс. рівень всіх Арквінґів`,
|
||||
@ -278,8 +284,8 @@ dict = {
|
||||
worldState_plagueStar: `Морова зірка`,
|
||||
worldState_dogDays: `Спекотні дні`,
|
||||
worldState_dogDaysRewards: `Нагороди Спекотних днів`,
|
||||
worldState_wolfHunt: `Полювання на Вовка (2025)`,
|
||||
worldState_voidCorruption: `[UNTRANSLATED] Void Corruption (|VAL|)`,
|
||||
worldState_wolfHunt: `Полювання на Вовка`,
|
||||
worldState_voidCorruption: `Викривлення Порожнечі (|VAL|)`,
|
||||
worldState_orphixVenom: `Орфіксова отрута`,
|
||||
worldState_longShadow: `Довга тінь`,
|
||||
worldState_hallowedFlame: `Священне полум'я`,
|
||||
@ -294,6 +300,7 @@ dict = {
|
||||
worldState_eightClawProgressOverride: `Прогрес Восьми кігтів`,
|
||||
worldState_thermiaFractures: `Розломи термії`,
|
||||
worldState_thermiaFracturesProgressOverride: `Прогрес Розломів термії`,
|
||||
worldState_qtccAlerts: `[UNTRANSLATED] Quest to Conquer Cancer Alerts`,
|
||||
worldState_from_year: `з |VAL|`,
|
||||
worldState_pre_year: `до |VAL|`,
|
||||
worldState_week: `Тиждень |VAL|`,
|
||||
|
||||
@ -75,6 +75,10 @@ dict = {
|
||||
code_funded: `[UNTRANSLATED] Funded`,
|
||||
code_replays: `[UNTRANSLATED] Replays`,
|
||||
code_stalker: `追猎者`,
|
||||
code_cutName: `[UNTRANSLATED] Cut |INDEX|`,
|
||||
code_drifterBeardName: `漂泊者胡须 |INDEX|`,
|
||||
code_drifterFaceName: `漂泊者面部 |INDEX|`,
|
||||
code_operatorFaceName: `指挥官面部 |INDEX|`,
|
||||
code_succChange: `更改成功`,
|
||||
code_requiredInvigorationUpgrade: `[UNTRANSLATED] You must select both an offensive & utility upgrade.`,
|
||||
login_description: `使用您的 OpenWF 账户凭证登录(与游戏内连接本服务器时使用的昵称相同)`,
|
||||
@ -112,6 +116,7 @@ dict = {
|
||||
inventory_boosters: `加成器`,
|
||||
inventory_flavourItems: `<abbr title="动作表情、浮印、调色板等">装饰物品</abbr>`,
|
||||
inventory_shipDecorations: `飞船装饰`,
|
||||
inventory_weaponSkins: `外观`,
|
||||
inventory_bulkAddSuits: `添加缺失战甲`,
|
||||
inventory_bulkAddWeapons: `添加缺失武器`,
|
||||
inventory_bulkAddSpaceSuits: `添加缺失载具`,
|
||||
@ -121,6 +126,7 @@ dict = {
|
||||
inventory_bulkAddFlavourItems: `[UNTRANSLATED] Add Missing Flavour Items`,
|
||||
inventory_bulkAddShipDecorations: `[UNTRANSLATED] Add Missing Ship Decorations`,
|
||||
inventory_bulkAddEvolutionProgress: `添加缺失的灵化之源进度`,
|
||||
inventory_bulkAddWeaponSkins: `[UNTRANSLATED] Add Missing Skins`,
|
||||
inventory_bulkRankUpSuits: `所有战甲升满级`,
|
||||
inventory_bulkRankUpWeapons: `所有武器升满级`,
|
||||
inventory_bulkRankUpSpaceSuits: `所有载具升满级`,
|
||||
@ -278,8 +284,8 @@ dict = {
|
||||
worldState_plagueStar: `瘟疫之星`,
|
||||
worldState_dogDays: `三伏天`,
|
||||
worldState_dogDaysRewards: `三伏天奖励设置`,
|
||||
worldState_wolfHunt: `恶狼狩猎 (2025)`,
|
||||
worldState_voidCorruption: `[UNTRANSLATED] Void Corruption (|VAL|)`,
|
||||
worldState_wolfHunt: `恶狼狩猎`,
|
||||
worldState_voidCorruption: `虚空堕落 (|VAL|)`,
|
||||
worldState_orphixVenom: `奥影之毒`,
|
||||
worldState_longShadow: `暗夜长影`,
|
||||
worldState_hallowedFlame: `万圣之焰`,
|
||||
@ -294,6 +300,7 @@ dict = {
|
||||
worldState_eightClawProgressOverride: `大帝金币收集进度(%)`,
|
||||
worldState_thermiaFractures: `热美亚裂缝`,
|
||||
worldState_thermiaFracturesProgressOverride: `[UNTRANSLATED] Thermia Fractures Progress`,
|
||||
worldState_qtccAlerts: `[UNTRANSLATED] Quest to Conquer Cancer Alerts`,
|
||||
worldState_from_year: `|VAL|`,
|
||||
worldState_pre_year: `|VAL|之前`,
|
||||
worldState_week: `第|VAL|周`,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user