forked from OpenWF/SpaceNinjaServer
merge upstream
This commit is contained in:
commit
2530dd2c5b
@ -86,6 +86,8 @@
|
|||||||
"bellyOfTheBeastProgressOverride": 0,
|
"bellyOfTheBeastProgressOverride": 0,
|
||||||
"eightClaw": false,
|
"eightClaw": false,
|
||||||
"eightClawProgressOverride": 0,
|
"eightClawProgressOverride": 0,
|
||||||
|
"thermiaFracturesOverride": null,
|
||||||
|
"thermiaFracturesProgressOverride": 0,
|
||||||
"eidolonOverride": "",
|
"eidolonOverride": "",
|
||||||
"vallisOverride": "",
|
"vallisOverride": "",
|
||||||
"duviriOverride": "",
|
"duviriOverride": "",
|
||||||
|
|||||||
8
package-lock.json
generated
8
package-lock.json
generated
@ -23,7 +23,7 @@
|
|||||||
"ncp": "^2.0.0",
|
"ncp": "^2.0.0",
|
||||||
"typescript": "^5.5",
|
"typescript": "^5.5",
|
||||||
"undici": "^7.10.0",
|
"undici": "^7.10.0",
|
||||||
"warframe-public-export-plus": "^0.5.81",
|
"warframe-public-export-plus": "^0.5.82",
|
||||||
"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.82",
|
||||||
"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.82.tgz",
|
||||||
"integrity": "sha512-kh3e21XThVDSwdC3TJsMsXZnlZ4B/21HdeJkKcjuTygpCd842EPEKS3lRZl3mpXFOmdha744vAW1XEyHfiLofg=="
|
"integrity": "sha512-hZa9KpMDA2wy0Hn03y9Nfyzbjxer1I6Rvb52b363uzrqS0cvDO56rhiDo71JbraeV34qF6yo+Vca1zwFmw2srA=="
|
||||||
},
|
},
|
||||||
"node_modules/warframe-riven-info": {
|
"node_modules/warframe-riven-info": {
|
||||||
"version": "0.1.2",
|
"version": "0.1.2",
|
||||||
|
|||||||
@ -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.82",
|
||||||
"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",
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { toMongoDate } from "@/src/helpers/inventoryHelpers";
|
import { toMongoDate } from "@/src/helpers/inventoryHelpers";
|
||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
||||||
import { getInventory } from "@/src/services/inventoryService";
|
import { getInventory, updateEntratiVault } from "@/src/services/inventoryService";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "@/src/services/loginService";
|
||||||
import { RequestHandler } from "express";
|
import { RequestHandler } from "express";
|
||||||
|
|
||||||
@ -11,26 +11,7 @@ export const entratiLabConquestModeController: RequestHandler = async (req, res)
|
|||||||
"EntratiVaultCountResetDate EntratiVaultCountLastPeriod EntratiLabConquestUnlocked EchoesHexConquestUnlocked EchoesHexConquestActiveFrameVariants EchoesHexConquestActiveStickers EntratiLabConquestActiveFrameVariants EntratiLabConquestCacheScoreMission EchoesHexConquestCacheScoreMission"
|
"EntratiVaultCountResetDate EntratiVaultCountLastPeriod EntratiLabConquestUnlocked EchoesHexConquestUnlocked EchoesHexConquestActiveFrameVariants EchoesHexConquestActiveStickers EntratiLabConquestActiveFrameVariants EntratiLabConquestCacheScoreMission EchoesHexConquestCacheScoreMission"
|
||||||
);
|
);
|
||||||
const body = getJSONfromString<IEntratiLabConquestModeRequest>(String(req.body));
|
const body = getJSONfromString<IEntratiLabConquestModeRequest>(String(req.body));
|
||||||
if (!inventory.EntratiVaultCountResetDate || Date.now() >= inventory.EntratiVaultCountResetDate.getTime()) {
|
updateEntratiVault(inventory);
|
||||||
const EPOCH = 1734307200 * 1000; // Mondays, amirite?
|
|
||||||
const day = Math.trunc((Date.now() - EPOCH) / 86400000);
|
|
||||||
const week = Math.trunc(day / 7);
|
|
||||||
const weekStart = EPOCH + week * 604800000;
|
|
||||||
const weekEnd = weekStart + 604800000;
|
|
||||||
inventory.EntratiVaultCountLastPeriod = 0;
|
|
||||||
inventory.EntratiVaultCountResetDate = new Date(weekEnd);
|
|
||||||
if (inventory.EntratiLabConquestUnlocked) {
|
|
||||||
inventory.EntratiLabConquestUnlocked = 0;
|
|
||||||
inventory.EntratiLabConquestCacheScoreMission = 0;
|
|
||||||
inventory.EntratiLabConquestActiveFrameVariants = [];
|
|
||||||
}
|
|
||||||
if (inventory.EchoesHexConquestUnlocked) {
|
|
||||||
inventory.EchoesHexConquestUnlocked = 0;
|
|
||||||
inventory.EchoesHexConquestCacheScoreMission = 0;
|
|
||||||
inventory.EchoesHexConquestActiveFrameVariants = [];
|
|
||||||
inventory.EchoesHexConquestActiveStickers = [];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (body.BuyMode) {
|
if (body.BuyMode) {
|
||||||
inventory.EntratiVaultCountLastPeriod! += 2;
|
inventory.EntratiVaultCountLastPeriod! += 2;
|
||||||
if (body.IsEchoesDeepArchemedea) {
|
if (body.IsEchoesDeepArchemedea) {
|
||||||
@ -51,7 +32,7 @@ export const entratiLabConquestModeController: RequestHandler = async (req, res)
|
|||||||
}
|
}
|
||||||
await inventory.save();
|
await inventory.save();
|
||||||
res.json({
|
res.json({
|
||||||
EntratiVaultCountResetDate: toMongoDate(inventory.EntratiVaultCountResetDate),
|
EntratiVaultCountResetDate: toMongoDate(inventory.EntratiVaultCountResetDate!),
|
||||||
EntratiVaultCountLastPeriod: inventory.EntratiVaultCountLastPeriod,
|
EntratiVaultCountLastPeriod: inventory.EntratiVaultCountLastPeriod,
|
||||||
EntratiLabConquestUnlocked: inventory.EntratiLabConquestUnlocked,
|
EntratiLabConquestUnlocked: inventory.EntratiLabConquestUnlocked,
|
||||||
EntratiLabConquestCacheScoreMission: inventory.EntratiLabConquestCacheScoreMission,
|
EntratiLabConquestCacheScoreMission: inventory.EntratiLabConquestCacheScoreMission,
|
||||||
|
|||||||
@ -20,8 +20,6 @@ export const saveDialogueController: RequestHandler = async (req, res) => {
|
|||||||
const tomorrowAt0Utc = config.noKimCooldowns
|
const tomorrowAt0Utc = config.noKimCooldowns
|
||||||
? Date.now()
|
? Date.now()
|
||||||
: (Math.trunc(Date.now() / 86400_000) + 1) * 86400_000;
|
: (Math.trunc(Date.now() / 86400_000) + 1) * 86400_000;
|
||||||
inventory.DialogueHistory ??= {};
|
|
||||||
inventory.DialogueHistory.Dialogues ??= [];
|
|
||||||
const dialogue = getDialogue(inventory, request.DialogueName);
|
const dialogue = getDialogue(inventory, request.DialogueName);
|
||||||
dialogue.Rank = request.Rank;
|
dialogue.Rank = request.Rank;
|
||||||
dialogue.Chemistry += request.Chemistry;
|
dialogue.Chemistry += request.Chemistry;
|
||||||
|
|||||||
@ -35,6 +35,7 @@ export const completeAllMissionsController: RequestHandler = async (req, res) =>
|
|||||||
await handleStoreItemAcquisition(reward.StoreItem, inventory, reward.ItemCount, undefined, true);
|
await handleStoreItemAcquisition(reward.StoreItem, inventory, reward.ItemCount, undefined, true);
|
||||||
}
|
}
|
||||||
addString(inventory.NodeIntrosCompleted, "TeshinHardModeUnlocked");
|
addString(inventory.NodeIntrosCompleted, "TeshinHardModeUnlocked");
|
||||||
|
addString(inventory.NodeIntrosCompleted, "CetusSyndicate_IntroJob");
|
||||||
await inventory.save();
|
await inventory.save();
|
||||||
res.end();
|
res.end();
|
||||||
};
|
};
|
||||||
|
|||||||
@ -98,6 +98,8 @@ export interface IConfig {
|
|||||||
bellyOfTheBeastProgressOverride?: number;
|
bellyOfTheBeastProgressOverride?: number;
|
||||||
eightClaw?: boolean;
|
eightClaw?: boolean;
|
||||||
eightClawProgressOverride?: number;
|
eightClawProgressOverride?: number;
|
||||||
|
thermiaFracturesOverride?: boolean;
|
||||||
|
thermiaFracturesProgressOverride?: number;
|
||||||
eidolonOverride?: string;
|
eidolonOverride?: string;
|
||||||
vallisOverride?: string;
|
vallisOverride?: string;
|
||||||
duviriOverride?: string;
|
duviriOverride?: string;
|
||||||
|
|||||||
@ -444,7 +444,7 @@ export const importLoadOutPresets = (db: ILoadoutDatabase, client: ILoadOutPrese
|
|||||||
db.NORMAL_PVP = client.NORMAL_PVP.map(convertLoadOutConfig);
|
db.NORMAL_PVP = client.NORMAL_PVP.map(convertLoadOutConfig);
|
||||||
db.LUNARO = client.LUNARO.map(convertLoadOutConfig);
|
db.LUNARO = client.LUNARO.map(convertLoadOutConfig);
|
||||||
db.OPERATOR = client.OPERATOR.map(convertLoadOutConfig);
|
db.OPERATOR = client.OPERATOR.map(convertLoadOutConfig);
|
||||||
db.GEAR = client.GEAR.map(convertLoadOutConfig);
|
db.GEAR = client.GEAR?.map(convertLoadOutConfig);
|
||||||
db.KDRIVE = client.KDRIVE.map(convertLoadOutConfig);
|
db.KDRIVE = client.KDRIVE.map(convertLoadOutConfig);
|
||||||
db.DATAKNIFE = client.DATAKNIFE.map(convertLoadOutConfig);
|
db.DATAKNIFE = client.DATAKNIFE.map(convertLoadOutConfig);
|
||||||
db.MECH = client.MECH.map(convertLoadOutConfig);
|
db.MECH = client.MECH.map(convertLoadOutConfig);
|
||||||
|
|||||||
@ -2286,11 +2286,13 @@ export const cleanupInventory = (inventory: TInventoryDatabaseDocument): void =>
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const getDialogue = (inventory: TInventoryDatabaseDocument, dialogueName: string): IDialogueDatabase => {
|
export const getDialogue = (inventory: TInventoryDatabaseDocument, dialogueName: string): IDialogueDatabase => {
|
||||||
let dialogue = inventory.DialogueHistory!.Dialogues!.find(x => x.DialogueName == dialogueName);
|
inventory.DialogueHistory ??= {};
|
||||||
|
inventory.DialogueHistory.Dialogues ??= [];
|
||||||
|
let dialogue = inventory.DialogueHistory.Dialogues.find(x => x.DialogueName == dialogueName);
|
||||||
if (!dialogue) {
|
if (!dialogue) {
|
||||||
dialogue =
|
dialogue =
|
||||||
inventory.DialogueHistory!.Dialogues![
|
inventory.DialogueHistory.Dialogues[
|
||||||
inventory.DialogueHistory!.Dialogues!.push({
|
inventory.DialogueHistory.Dialogues.push({
|
||||||
Rank: 0,
|
Rank: 0,
|
||||||
Chemistry: 0,
|
Chemistry: 0,
|
||||||
AvailableDate: new Date(0),
|
AvailableDate: new Date(0),
|
||||||
@ -2449,3 +2451,26 @@ export const giveNemesisPetRecipe = (
|
|||||||
export const getEffectiveAvatarImageType = (inventory: TInventoryDatabaseDocument): string => {
|
export const getEffectiveAvatarImageType = (inventory: TInventoryDatabaseDocument): string => {
|
||||||
return inventory.ActiveAvatarImageType ?? "/Lotus/Types/StoreItems/AvatarImages/AvatarImageDefault";
|
return inventory.ActiveAvatarImageType ?? "/Lotus/Types/StoreItems/AvatarImages/AvatarImageDefault";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const updateEntratiVault = (inventory: TInventoryDatabaseDocument): void => {
|
||||||
|
if (!inventory.EntratiVaultCountResetDate || Date.now() >= inventory.EntratiVaultCountResetDate.getTime()) {
|
||||||
|
const EPOCH = 1734307200 * 1000; // Mondays, amirite?
|
||||||
|
const day = Math.trunc((Date.now() - EPOCH) / 86400000);
|
||||||
|
const week = Math.trunc(day / 7);
|
||||||
|
const weekStart = EPOCH + week * 604800000;
|
||||||
|
const weekEnd = weekStart + 604800000;
|
||||||
|
inventory.EntratiVaultCountLastPeriod = 0;
|
||||||
|
inventory.EntratiVaultCountResetDate = new Date(weekEnd);
|
||||||
|
if (inventory.EntratiLabConquestUnlocked) {
|
||||||
|
inventory.EntratiLabConquestUnlocked = 0;
|
||||||
|
inventory.EntratiLabConquestCacheScoreMission = 0;
|
||||||
|
inventory.EntratiLabConquestActiveFrameVariants = [];
|
||||||
|
}
|
||||||
|
if (inventory.EchoesHexConquestUnlocked) {
|
||||||
|
inventory.EchoesHexConquestUnlocked = 0;
|
||||||
|
inventory.EchoesHexConquestCacheScoreMission = 0;
|
||||||
|
inventory.EchoesHexConquestActiveFrameVariants = [];
|
||||||
|
inventory.EchoesHexConquestActiveStickers = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|||||||
@ -39,6 +39,7 @@ import {
|
|||||||
giveNemesisPetRecipe,
|
giveNemesisPetRecipe,
|
||||||
giveNemesisWeaponRecipe,
|
giveNemesisWeaponRecipe,
|
||||||
updateCurrency,
|
updateCurrency,
|
||||||
|
updateEntratiVault,
|
||||||
updateSyndicate
|
updateSyndicate
|
||||||
} from "@/src/services/inventoryService";
|
} from "@/src/services/inventoryService";
|
||||||
import { updateQuestKey } from "@/src/services/questService";
|
import { updateQuestKey } from "@/src/services/questService";
|
||||||
@ -640,7 +641,7 @@ export const addMissionInventoryUpdates = async (
|
|||||||
}
|
}
|
||||||
|
|
||||||
const currentNode = inventoryUpdates.RewardInfo!.node;
|
const currentNode = inventoryUpdates.RewardInfo!.node;
|
||||||
let currentMissionKey;
|
let currentMissionKey: string | undefined;
|
||||||
if (currentNode == goal.Node) {
|
if (currentNode == goal.Node) {
|
||||||
currentMissionKey = goal.MissionKeyName;
|
currentMissionKey = goal.MissionKeyName;
|
||||||
} else if (goal.ConcurrentNodes && goal.ConcurrentMissionKeyNames) {
|
} else if (goal.ConcurrentNodes && goal.ConcurrentMissionKeyNames) {
|
||||||
@ -651,15 +652,15 @@ export const addMissionInventoryUpdates = async (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (currentMissionKey && currentMissionKey in goalMessagesByKey) {
|
const rewards = [];
|
||||||
let countBeforeUpload = goalProgress?.Count ?? 0;
|
let countBeforeUpload = goalProgress?.Count ?? 0;
|
||||||
let totalCount = countBeforeUpload + uploadProgress.Count;
|
let totalCount = countBeforeUpload + uploadProgress.Count;
|
||||||
if (goal.Best) {
|
if (goal.Best) {
|
||||||
countBeforeUpload = goalProgress?.Best ?? 0;
|
countBeforeUpload = goalProgress?.Best ?? 0;
|
||||||
totalCount = uploadProgress.Best;
|
totalCount = uploadProgress.Best;
|
||||||
}
|
}
|
||||||
let reward;
|
|
||||||
|
|
||||||
|
{
|
||||||
if (goal.InterimGoals && goal.InterimRewards) {
|
if (goal.InterimGoals && goal.InterimRewards) {
|
||||||
for (let i = 0; i < goal.InterimGoals.length; i++) {
|
for (let i = 0; i < goal.InterimGoals.length; i++) {
|
||||||
if (
|
if (
|
||||||
@ -668,70 +669,95 @@ export const addMissionInventoryUpdates = async (
|
|||||||
(!goalProgress || countBeforeUpload < goal.InterimGoals[i]) &&
|
(!goalProgress || countBeforeUpload < goal.InterimGoals[i]) &&
|
||||||
goal.InterimRewards[i]
|
goal.InterimRewards[i]
|
||||||
) {
|
) {
|
||||||
reward = goal.InterimRewards[i];
|
rewards.push(goal.InterimRewards[i]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (
|
if (
|
||||||
!reward &&
|
|
||||||
goal.Goal &&
|
goal.Goal &&
|
||||||
goal.Goal <= totalCount &&
|
goal.Goal <= totalCount &&
|
||||||
(!goalProgress || countBeforeUpload < goal.Goal) &&
|
(!goalProgress || countBeforeUpload < goal.Goal) &&
|
||||||
goal.Reward
|
goal.Reward
|
||||||
) {
|
) {
|
||||||
reward = goal.Reward;
|
rewards.push(goal.Reward);
|
||||||
}
|
}
|
||||||
if (
|
if (
|
||||||
!reward &&
|
|
||||||
goal.BonusGoal &&
|
goal.BonusGoal &&
|
||||||
goal.BonusGoal <= totalCount &&
|
goal.BonusGoal <= totalCount &&
|
||||||
(!goalProgress || countBeforeUpload < goal.BonusGoal) &&
|
(!goalProgress || countBeforeUpload < goal.BonusGoal) &&
|
||||||
goal.BonusReward
|
goal.BonusReward
|
||||||
) {
|
) {
|
||||||
reward = goal.BonusReward;
|
rewards.push(goal.BonusReward);
|
||||||
}
|
|
||||||
if (reward) {
|
|
||||||
if (currentMissionKey in goalMessagesByKey) {
|
|
||||||
// Send reward via inbox
|
|
||||||
const info = goalMessagesByKey[currentMissionKey];
|
|
||||||
const message: IMessageCreationTemplate = {
|
|
||||||
sndr: info.sndr,
|
|
||||||
msg: info.msg,
|
|
||||||
sub: info.sub,
|
|
||||||
icon: info.icon,
|
|
||||||
highPriority: true
|
|
||||||
};
|
|
||||||
|
|
||||||
if (reward.items) {
|
|
||||||
message.att = reward.items.map(x => (isStoreItem(x) ? fromStoreItem(x) : x));
|
|
||||||
}
|
|
||||||
if (reward.countedItems) {
|
|
||||||
message.countedAtt = reward.countedItems;
|
|
||||||
}
|
|
||||||
if (reward.credits) {
|
|
||||||
message.RegularCredits = reward.credits;
|
|
||||||
}
|
|
||||||
if (info.arg) {
|
|
||||||
const args: Record<string, string | number> = {
|
|
||||||
PLAYER_NAME: account.DisplayName,
|
|
||||||
CREDIT_REWARD: reward.credits ?? 0
|
|
||||||
};
|
|
||||||
|
|
||||||
info.arg.forEach(key => {
|
|
||||||
const value = args[key];
|
|
||||||
if (value) {
|
|
||||||
message.arg ??= [];
|
|
||||||
message.arg.push({ Key: key, Tag: value });
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
await createMessage(inventory.accountOwnerId, [message]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const messages: IMessageCreationTemplate[] = [];
|
||||||
|
const infos: {
|
||||||
|
sndr: string;
|
||||||
|
msg: string;
|
||||||
|
sub: string;
|
||||||
|
icon: string;
|
||||||
|
arg?: string[];
|
||||||
|
}[] = [];
|
||||||
|
|
||||||
|
{
|
||||||
|
if (currentMissionKey && currentMissionKey in goalMessagesByKey) {
|
||||||
|
infos.push(goalMessagesByKey[currentMissionKey]);
|
||||||
|
} else if (goal.Tag in goalMessagesByTag) {
|
||||||
|
const combinedGoals = [...(goal.InterimGoals || []), goal.Goal, goal.BonusGoal];
|
||||||
|
combinedGoals.forEach((n, i) => {
|
||||||
|
if (n !== undefined && n > countBeforeUpload && n <= totalCount) {
|
||||||
|
infos.push(goalMessagesByTag[goal.Tag][i]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = 0; i < rewards.length; i++) {
|
||||||
|
if (infos[i]) {
|
||||||
|
const info = infos[i];
|
||||||
|
const reward = rewards[i];
|
||||||
|
const message: IMessageCreationTemplate = {
|
||||||
|
sndr: info.sndr,
|
||||||
|
msg: info.msg,
|
||||||
|
sub: info.sub,
|
||||||
|
icon: info.icon,
|
||||||
|
highPriority: true
|
||||||
|
};
|
||||||
|
if (reward.items) {
|
||||||
|
message.att = reward.items.map(x => (isStoreItem(x) ? fromStoreItem(x) : x));
|
||||||
|
}
|
||||||
|
if (reward.countedItems) {
|
||||||
|
message.countedAtt = reward.countedItems;
|
||||||
|
}
|
||||||
|
if (reward.credits) {
|
||||||
|
message.RegularCredits = reward.credits;
|
||||||
|
}
|
||||||
|
if (info.arg) {
|
||||||
|
const args: Record<string, string | number> = {
|
||||||
|
PLAYER_NAME: account.DisplayName,
|
||||||
|
CREDIT_REWARD: reward.credits ?? 0
|
||||||
|
};
|
||||||
|
|
||||||
|
for (let j = 0; j < info.arg.length; j++) {
|
||||||
|
const key = info.arg[j];
|
||||||
|
const value = args[key];
|
||||||
|
if (value) {
|
||||||
|
message.arg ??= [];
|
||||||
|
message.arg.push({
|
||||||
|
Key: key,
|
||||||
|
Tag: value
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
messages.push(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (messages.length > 0) await createMessage(inventory.accountOwnerId, messages);
|
||||||
|
|
||||||
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;
|
||||||
@ -1059,6 +1085,22 @@ const droptableAliases: Record<string, string> = {
|
|||||||
"/Lotus/Types/DropTables/WF1999DropTables/LasrianTankHardModeDropTable"
|
"/Lotus/Types/DropTables/WF1999DropTables/LasrianTankHardModeDropTable"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const isEligibleForCreditReward = (rewardInfo: IRewardInfo, missions: IMission, node: IRegion): boolean => {
|
||||||
|
// (E)SO should not give credits for only completing zone 1, in which case it has no rewardQualifications (https://onlyg.it/OpenWF/SpaceNinjaServer/issues/1823)
|
||||||
|
if (getRotations(rewardInfo).length == 0) {
|
||||||
|
return missions.Tag == "SolNode720"; // Netracells don't use rewardQualifications but probably should give credits anyway
|
||||||
|
}
|
||||||
|
// The rest here might not be needed anymore, but just to be sure we don't give undue credits...
|
||||||
|
return (
|
||||||
|
node.missionIndex != 23 && // junction
|
||||||
|
node.missionIndex != 28 && // open world
|
||||||
|
missions.Tag != "SolNode761" && // the index
|
||||||
|
missions.Tag != "SolNode762" && // the index
|
||||||
|
missions.Tag != "SolNode763" && // the index
|
||||||
|
missions.Tag != "CrewBattleNode556" // free flight
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
//TODO: return type of partial missioninventoryupdate response
|
//TODO: return type of partial missioninventoryupdate response
|
||||||
export const addMissionRewards = async (
|
export const addMissionRewards = async (
|
||||||
account: TAccountDocument,
|
account: TAccountDocument,
|
||||||
@ -1151,15 +1193,7 @@ export const addMissionRewards = async (
|
|||||||
const node = ExportRegions[missions.Tag];
|
const node = ExportRegions[missions.Tag];
|
||||||
|
|
||||||
//node based credit rewards for mission completion
|
//node based credit rewards for mission completion
|
||||||
if (
|
if (isEligibleForCreditReward(rewardInfo, missions, node)) {
|
||||||
node.missionIndex != 23 && // junction
|
|
||||||
node.missionIndex != 28 && // open world
|
|
||||||
missions.Tag != "SolNode761" && // the index
|
|
||||||
missions.Tag != "SolNode762" && // the index
|
|
||||||
missions.Tag != "SolNode763" && // the index
|
|
||||||
missions.Tag != "CrewBattleNode556" && // free flight
|
|
||||||
getRotations(rewardInfo).length > 0 // (E)SO should not give credits for only completing zone 1, in which case it has no rewardQualifications (https://onlyg.it/OpenWF/SpaceNinjaServer/issues/1823)
|
|
||||||
) {
|
|
||||||
const levelCreditReward = getLevelCreditRewards(node);
|
const levelCreditReward = getLevelCreditRewards(node);
|
||||||
missionCompletionCredits += levelCreditReward;
|
missionCompletionCredits += levelCreditReward;
|
||||||
logger.debug(`levelCreditReward ${levelCreditReward}`);
|
logger.debug(`levelCreditReward ${levelCreditReward}`);
|
||||||
@ -1189,6 +1223,12 @@ export const addMissionRewards = async (
|
|||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Consume netracells search pulse. Moved here to only cover successful completions. Discussed in https://onlyg.it/OpenWF/SpaceNinjaServer/issues/2673
|
||||||
|
if (missions.Tag == "SolNode720") {
|
||||||
|
updateEntratiVault(inventory);
|
||||||
|
inventory.EntratiVaultCountLastPeriod! += 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rewardInfo.useVaultManifest) {
|
if (rewardInfo.useVaultManifest) {
|
||||||
@ -1352,7 +1392,7 @@ export const addMissionRewards = async (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
logger.error(`unknown droptable ${si.DropTable} for DROP_BLUEPRINT`);
|
logger.error(`unknown droptable ${si.DropTable} for DROP_MISC_ITEM`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2617,3 +2657,38 @@ const goalMessagesByKey: Record<string, { sndr: string; msg: string; sub: string
|
|||||||
arg: ["PLAYER_NAME"]
|
arg: ["PLAYER_NAME"]
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const goalMessagesByTag: Record<string, { sndr: string; msg: string; sub: string; icon: string; arg?: string[] }[]> = {
|
||||||
|
HeatFissure: [
|
||||||
|
{
|
||||||
|
sndr: "/Lotus/Language/Npcs/Eudico",
|
||||||
|
msg: "/Lotus/Language/Messages/OrbHeistEventRewardAInboxMessageBody",
|
||||||
|
sub: "/Lotus/Language/Messages/OrbHeistEventRewardAInboxMessageTitle",
|
||||||
|
icon: "/Lotus/Interface/Icons/Npcs/Eudico.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
sndr: "/Lotus/Language/Npcs/Eudico",
|
||||||
|
msg: "/Lotus/Language/Messages/OrbHeistEventRewardBInboxMessageBody",
|
||||||
|
sub: "/Lotus/Language/Messages/OrbHeistEventRewardBInboxMessageTitle",
|
||||||
|
icon: "/Lotus/Interface/Icons/Npcs/Eudico.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
sndr: "/Lotus/Language/Npcs/Eudico",
|
||||||
|
msg: "/Lotus/Language/Messages/OrbHeistEventRewardCInboxMessageBody",
|
||||||
|
sub: "/Lotus/Language/Messages/OrbHeistEventRewardCInboxMessageTitle",
|
||||||
|
icon: "/Lotus/Interface/Icons/Npcs/Eudico.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
sndr: "/Lotus/Language/Npcs/Eudico",
|
||||||
|
msg: "/Lotus/Language/Messages/OrbHeistEventRewardDInboxMessageBody",
|
||||||
|
sub: "/Lotus/Language/Messages/OrbHeistEventRewardDInboxMessageTitle",
|
||||||
|
icon: "/Lotus/Interface/Icons/Npcs/Eudico.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
sndr: "/Lotus/Language/Npcs/Eudico",
|
||||||
|
msg: "/Lotus/Language/Messages/OrbHeistEventRewardEInboxMessageBody",
|
||||||
|
sub: "/Lotus/Language/Messages/OrbHeistEventRewardEInboxMessageTitle",
|
||||||
|
icon: "/Lotus/Interface/Icons/Npcs/Eudico.png"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|||||||
@ -2629,6 +2629,87 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const thermiaFracturesCycleDay = day % 32;
|
||||||
|
const isThermiaFracturesActive = thermiaFracturesCycleDay < 14;
|
||||||
|
if (config.worldState?.thermiaFracturesOverride ?? isThermiaFracturesActive) {
|
||||||
|
const activeStartDay = day - thermiaFracturesCycleDay;
|
||||||
|
|
||||||
|
const count = config.worldState?.thermiaFracturesProgressOverride ?? 0;
|
||||||
|
const activation = config.worldState?.thermiaFracturesOverride ? 1740416400000 : getSortieTime(activeStartDay);
|
||||||
|
const expiry = config.worldState?.thermiaFracturesOverride ? 2000000000000 : getSortieTime(activeStartDay + 14);
|
||||||
|
|
||||||
|
worldState.Goals.push({
|
||||||
|
_id: { $oid: "5c7cb0d00000000000000000" },
|
||||||
|
Activation: { $date: { $numberLong: activation.toString() } },
|
||||||
|
Expiry: { $date: { $numberLong: expiry.toString() } },
|
||||||
|
Node: "SolNode129",
|
||||||
|
ScoreVar: "FissuresClosed",
|
||||||
|
ScoreLocTag: "/Lotus/Language/G1Quests/HeatFissuresEventScore",
|
||||||
|
Count: count,
|
||||||
|
HealthPct: count / 100,
|
||||||
|
Regions: [1],
|
||||||
|
Desc: "/Lotus/Language/G1Quests/HeatFissuresEventName",
|
||||||
|
ToolTip: "/Lotus/Language/G1Quests/HeatFissuresEventDesc",
|
||||||
|
OptionalInMission: true,
|
||||||
|
Tag: "HeatFissure",
|
||||||
|
UpgradeIds: [{ $oid: "5c81cefa4c4566791728eaa7" }, { $oid: "5c81cefa4c4566791728eaa6" }],
|
||||||
|
Personal: true,
|
||||||
|
Community: true,
|
||||||
|
Goal: 100,
|
||||||
|
Reward: {
|
||||||
|
items: ["/Lotus/StoreItems/Weapons/Corpus/LongGuns/CrpBFG/Vandal/VandalCrpBFG"]
|
||||||
|
},
|
||||||
|
InterimGoals: [5, 25, 50, 75],
|
||||||
|
InterimRewards: [
|
||||||
|
{ items: ["/Lotus/StoreItems/Upgrades/Skins/Clan/OrbBadgeItem"] },
|
||||||
|
{
|
||||||
|
items: [
|
||||||
|
"/Lotus/StoreItems/Upgrades/Mods/DualSource/Shotgun/ShotgunMedicMod",
|
||||||
|
"/Lotus/StoreItems/Upgrades/Mods/DualSource/Rifle/SerratedRushMod"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
items: [
|
||||||
|
"/Lotus/StoreItems/Upgrades/Mods/DualSource/Pistol/MultishotDodgeMod",
|
||||||
|
"/Lotus/StoreItems/Upgrades/Mods/DualSource/Melee/CritDamageChargeSpeedMod"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{ items: ["/Lotus/StoreItems/Upgrades/Skins/Sigils/OrbSigil"] }
|
||||||
|
]
|
||||||
|
});
|
||||||
|
worldState.NodeOverrides.push({
|
||||||
|
_id: { $oid: "5c7cb0d00000000000000000" },
|
||||||
|
Activation: { $date: { $numberLong: activation.toString() } },
|
||||||
|
Expiry: { $date: { $numberLong: expiry.toString() } },
|
||||||
|
Node: "SolNode129",
|
||||||
|
Faction: "FC_CORPUS",
|
||||||
|
CustomNpcEncounters: ["/Lotus/Types/Gameplay/Venus/Encounters/Heists/ExploiterHeistFissure"]
|
||||||
|
});
|
||||||
|
if (count >= 35) {
|
||||||
|
worldState.GlobalUpgrades.push({
|
||||||
|
_id: { $oid: "5c81cefa4c4566791728eaa6" },
|
||||||
|
Activation: { $date: { $numberLong: activation.toString() } },
|
||||||
|
ExpiryDate: { $date: { $numberLong: expiry.toString() } },
|
||||||
|
UpgradeType: "GAMEPLAY_MONEY_REWARD_AMOUNT",
|
||||||
|
OperationType: "MULTIPLY",
|
||||||
|
Value: 2,
|
||||||
|
Nodes: ["SolNode129"]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// Not sure about that
|
||||||
|
if (count == 100) {
|
||||||
|
worldState.GlobalUpgrades.push({
|
||||||
|
_id: { $oid: "5c81cefa4c4566791728eaa7" },
|
||||||
|
Activation: { $date: { $numberLong: activation.toString() } },
|
||||||
|
ExpiryDate: { $date: { $numberLong: expiry.toString() } },
|
||||||
|
UpgradeType: "GAMEPLAY_PICKUP_AMOUNT",
|
||||||
|
OperationType: "MULTIPLY",
|
||||||
|
Value: 2,
|
||||||
|
Nodes: ["SolNode129"]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Nightwave Challenges
|
// Nightwave Challenges
|
||||||
const nightwaveSyndicateTag = getNightwaveSyndicateTag(buildLabel);
|
const nightwaveSyndicateTag = getNightwaveSyndicateTag(buildLabel);
|
||||||
if (nightwaveSyndicateTag) {
|
if (nightwaveSyndicateTag) {
|
||||||
@ -2727,7 +2808,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
|||||||
: Date.UTC(
|
: Date.UTC(
|
||||||
date.getUTCFullYear(),
|
date.getUTCFullYear(),
|
||||||
date.getUTCMonth(),
|
date.getUTCMonth(),
|
||||||
date.getUTCDate() + (day - ghoulsCycleDay + 17)
|
date.getUTCDate() + activeStartDay
|
||||||
).toString()
|
).toString()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -2738,7 +2819,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
|||||||
: Date.UTC(
|
: Date.UTC(
|
||||||
date.getUTCFullYear(),
|
date.getUTCFullYear(),
|
||||||
date.getUTCMonth(),
|
date.getUTCMonth(),
|
||||||
date.getUTCDate() + (day - ghoulsCycleDay + 21)
|
date.getUTCDate() + activeEndDay
|
||||||
).toString()
|
).toString()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@ -79,7 +79,7 @@ export interface ILoadoutDatabase {
|
|||||||
NORMAL_PVP: ILoadoutConfigDatabase[];
|
NORMAL_PVP: ILoadoutConfigDatabase[];
|
||||||
LUNARO: ILoadoutConfigDatabase[];
|
LUNARO: ILoadoutConfigDatabase[];
|
||||||
OPERATOR: ILoadoutConfigDatabase[];
|
OPERATOR: ILoadoutConfigDatabase[];
|
||||||
GEAR: ILoadoutConfigDatabase[];
|
GEAR?: ILoadoutConfigDatabase[];
|
||||||
KDRIVE: ILoadoutConfigDatabase[];
|
KDRIVE: ILoadoutConfigDatabase[];
|
||||||
DATAKNIFE: ILoadoutConfigDatabase[];
|
DATAKNIFE: ILoadoutConfigDatabase[];
|
||||||
MECH: ILoadoutConfigDatabase[];
|
MECH: ILoadoutConfigDatabase[];
|
||||||
@ -96,7 +96,7 @@ export interface ILoadOutPresets {
|
|||||||
ARCHWING: ILoadoutConfigClient[];
|
ARCHWING: ILoadoutConfigClient[];
|
||||||
SENTINEL: ILoadoutConfigClient[];
|
SENTINEL: ILoadoutConfigClient[];
|
||||||
OPERATOR: ILoadoutConfigClient[];
|
OPERATOR: ILoadoutConfigClient[];
|
||||||
GEAR: ILoadoutConfigClient[];
|
GEAR?: ILoadoutConfigClient[];
|
||||||
KDRIVE: ILoadoutConfigClient[];
|
KDRIVE: ILoadoutConfigClient[];
|
||||||
DATAKNIFE: ILoadoutConfigClient[];
|
DATAKNIFE: ILoadoutConfigClient[];
|
||||||
MECH: ILoadoutConfigClient[];
|
MECH: ILoadoutConfigClient[];
|
||||||
|
|||||||
@ -43,7 +43,7 @@ export interface IGoal {
|
|||||||
Count?: number;
|
Count?: number;
|
||||||
HealthPct?: number;
|
HealthPct?: number;
|
||||||
|
|
||||||
Icon: string;
|
Icon?: string;
|
||||||
Desc: string;
|
Desc: string;
|
||||||
ToolTip?: string;
|
ToolTip?: string;
|
||||||
Faction?: string;
|
Faction?: string;
|
||||||
@ -94,6 +94,9 @@ export interface IGoal {
|
|||||||
MissionKeyRotation?: string[];
|
MissionKeyRotation?: string[];
|
||||||
MissionKeyRotationInterval?: number;
|
MissionKeyRotationInterval?: number;
|
||||||
|
|
||||||
|
OptionalInMission?: boolean;
|
||||||
|
UpgradeIds?: IOid[];
|
||||||
|
|
||||||
NightLevel?: string;
|
NightLevel?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -128,8 +131,9 @@ export interface IGlobalUpgrade {
|
|||||||
UpgradeType: string;
|
UpgradeType: string;
|
||||||
OperationType: string;
|
OperationType: string;
|
||||||
Value: number;
|
Value: number;
|
||||||
LocalizeTag: string;
|
LocalizeTag?: string;
|
||||||
LocalizeDescTag: string;
|
LocalizeDescTag?: string;
|
||||||
|
Nodes?: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IInvasion {
|
export interface IInvasion {
|
||||||
@ -183,7 +187,7 @@ export interface INodeOverride {
|
|||||||
Seed?: number;
|
Seed?: number;
|
||||||
LevelOverride?: string;
|
LevelOverride?: string;
|
||||||
Faction?: string;
|
Faction?: string;
|
||||||
CustomNpcEncounters?: string;
|
CustomNpcEncounters?: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ISortie {
|
export interface ISortie {
|
||||||
|
|||||||
@ -1103,6 +1103,25 @@
|
|||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-group mt-2 d-flex gap-2">
|
||||||
|
<div class="flex-fill">
|
||||||
|
<label class="form-label" for="worldState.thermiaFracturesOverride" data-loc="worldState_thermiaFractures"></label>
|
||||||
|
<select class="form-control" id="worldState.thermiaFracturesOverride" data-default="null">
|
||||||
|
<option value="null" data-loc="normal"></option>
|
||||||
|
<option value="true" data-loc="enabled"></option>
|
||||||
|
<option value="false" data-loc="disabled"></option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="flex-fill">
|
||||||
|
<form class="form-group" onsubmit="doSaveConfigInt('worldState.thermiaFracturesProgressOverride'); return false;">
|
||||||
|
<label class="form-label" for="worldState.thermiaFracturesProgressOverride" data-loc="worldState_thermiaFracturesProgressOverride"></label>
|
||||||
|
<div class="input-group">
|
||||||
|
<input id="worldState.thermiaFracturesProgressOverride" 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="">
|
||||||
|
|||||||
@ -265,6 +265,8 @@ dict = {
|
|||||||
worldState_bellyOfTheBeastProgressOverride: `[UNTRANSLATED] Belly of the Beast Progress`,
|
worldState_bellyOfTheBeastProgressOverride: `[UNTRANSLATED] Belly of the Beast Progress`,
|
||||||
worldState_eightClaw: `Acht Klauen`,
|
worldState_eightClaw: `Acht Klauen`,
|
||||||
worldState_eightClawProgressOverride: `[UNTRANSLATED] Eight Claw Progress`,
|
worldState_eightClawProgressOverride: `[UNTRANSLATED] Eight Claw Progress`,
|
||||||
|
worldState_thermiaFractures: `Thermische Risse`,
|
||||||
|
worldState_thermiaFracturesProgressOverride: `[UNTRANSLATED] Thermia Fractures Progress`,
|
||||||
worldState_from_year: `[UNTRANSLATED] from |VAL|`,
|
worldState_from_year: `[UNTRANSLATED] from |VAL|`,
|
||||||
worldState_pre_year: `[UNTRANSLATED] pre |VAL|`,
|
worldState_pre_year: `[UNTRANSLATED] pre |VAL|`,
|
||||||
worldState_week: `[UNTRANSLATED] Week |VAL|`,
|
worldState_week: `[UNTRANSLATED] Week |VAL|`,
|
||||||
|
|||||||
@ -264,6 +264,8 @@ dict = {
|
|||||||
worldState_bellyOfTheBeastProgressOverride: `Belly of the Beast Progress`,
|
worldState_bellyOfTheBeastProgressOverride: `Belly of the Beast Progress`,
|
||||||
worldState_eightClaw: `Eight Claw`,
|
worldState_eightClaw: `Eight Claw`,
|
||||||
worldState_eightClawProgressOverride: `Eight Claw Progress`,
|
worldState_eightClawProgressOverride: `Eight Claw Progress`,
|
||||||
|
worldState_thermiaFractures: `Thermia Fractures`,
|
||||||
|
worldState_thermiaFracturesProgressOverride: `Thermia Fractures Progress`,
|
||||||
worldState_from_year: `from |VAL|`,
|
worldState_from_year: `from |VAL|`,
|
||||||
worldState_pre_year: `pre |VAL|`,
|
worldState_pre_year: `pre |VAL|`,
|
||||||
worldState_week: `Week |VAL|`,
|
worldState_week: `Week |VAL|`,
|
||||||
|
|||||||
@ -265,6 +265,8 @@ dict = {
|
|||||||
worldState_bellyOfTheBeastProgressOverride: `Progreso del Vientre de la Bestia`,
|
worldState_bellyOfTheBeastProgressOverride: `Progreso del Vientre de la Bestia`,
|
||||||
worldState_eightClaw: `Octava Garra`,
|
worldState_eightClaw: `Octava Garra`,
|
||||||
worldState_eightClawProgressOverride: `Progreso de Octava Garra`,
|
worldState_eightClawProgressOverride: `Progreso de Octava Garra`,
|
||||||
|
worldState_thermiaFractures: `Fracturas Thermia`,
|
||||||
|
worldState_thermiaFracturesProgressOverride: `[UNTRANSLATED] Thermia Fractures Progress`,
|
||||||
worldState_from_year: `de |VAL|`,
|
worldState_from_year: `de |VAL|`,
|
||||||
worldState_pre_year: `antes de |VAL|`,
|
worldState_pre_year: `antes de |VAL|`,
|
||||||
worldState_week: `Semana |VAL|`,
|
worldState_week: `Semana |VAL|`,
|
||||||
|
|||||||
@ -265,6 +265,8 @@ dict = {
|
|||||||
worldState_bellyOfTheBeastProgressOverride: `[UNTRANSLATED] Belly of the Beast Progress`,
|
worldState_bellyOfTheBeastProgressOverride: `[UNTRANSLATED] Belly of the Beast Progress`,
|
||||||
worldState_eightClaw: `Huitième Griffe`,
|
worldState_eightClaw: `Huitième Griffe`,
|
||||||
worldState_eightClawProgressOverride: `[UNTRANSLATED] Eight Claw Progress`,
|
worldState_eightClawProgressOverride: `[UNTRANSLATED] Eight Claw Progress`,
|
||||||
|
worldState_thermiaFractures: `Crevasses Thermia`,
|
||||||
|
worldState_thermiaFracturesProgressOverride: `[UNTRANSLATED] Thermia Fractures Progress`,
|
||||||
worldState_from_year: `[UNTRANSLATED] from |VAL|`,
|
worldState_from_year: `[UNTRANSLATED] from |VAL|`,
|
||||||
worldState_pre_year: `[UNTRANSLATED] pre |VAL|`,
|
worldState_pre_year: `[UNTRANSLATED] pre |VAL|`,
|
||||||
worldState_week: `[UNTRANSLATED] Week |VAL|`,
|
worldState_week: `[UNTRANSLATED] Week |VAL|`,
|
||||||
|
|||||||
@ -265,6 +265,8 @@ dict = {
|
|||||||
worldState_bellyOfTheBeastProgressOverride: `Прогресс Чрева зверя`,
|
worldState_bellyOfTheBeastProgressOverride: `Прогресс Чрева зверя`,
|
||||||
worldState_eightClaw: `Восемь когтей`,
|
worldState_eightClaw: `Восемь когтей`,
|
||||||
worldState_eightClawProgressOverride: `Прогресс Восьми когтей`,
|
worldState_eightClawProgressOverride: `Прогресс Восьми когтей`,
|
||||||
|
worldState_thermiaFractures: `Разломы Термии`,
|
||||||
|
worldState_thermiaFracturesProgressOverride: `Прогресс Разломов Термии`,
|
||||||
worldState_from_year: `из |VAL|`,
|
worldState_from_year: `из |VAL|`,
|
||||||
worldState_pre_year: `до |VAL|`,
|
worldState_pre_year: `до |VAL|`,
|
||||||
worldState_week: `Неделя |VAL|`,
|
worldState_week: `Неделя |VAL|`,
|
||||||
|
|||||||
@ -265,6 +265,8 @@ dict = {
|
|||||||
worldState_bellyOfTheBeastProgressOverride: `Прогрес У лігві звіра`,
|
worldState_bellyOfTheBeastProgressOverride: `Прогрес У лігві звіра`,
|
||||||
worldState_eightClaw: `Вісім кігтів`,
|
worldState_eightClaw: `Вісім кігтів`,
|
||||||
worldState_eightClawProgressOverride: `Прогрес Восьми кігтів`,
|
worldState_eightClawProgressOverride: `Прогрес Восьми кігтів`,
|
||||||
|
worldState_thermiaFractures: `Розломи термії`,
|
||||||
|
worldState_thermiaFracturesProgressOverride: `Прогрес Розломів термії`,
|
||||||
worldState_from_year: `з |VAL|`,
|
worldState_from_year: `з |VAL|`,
|
||||||
worldState_pre_year: `до |VAL|`,
|
worldState_pre_year: `до |VAL|`,
|
||||||
worldState_week: `Тиждень |VAL|`,
|
worldState_week: `Тиждень |VAL|`,
|
||||||
|
|||||||
@ -265,6 +265,8 @@ dict = {
|
|||||||
worldState_bellyOfTheBeastProgressOverride: `不稳定微粒收集进度(%)`,
|
worldState_bellyOfTheBeastProgressOverride: `不稳定微粒收集进度(%)`,
|
||||||
worldState_eightClaw: `八爪`,
|
worldState_eightClaw: `八爪`,
|
||||||
worldState_eightClawProgressOverride: `大帝金币收集进度(%)`,
|
worldState_eightClawProgressOverride: `大帝金币收集进度(%)`,
|
||||||
|
worldState_thermiaFractures: `热美亚裂缝`,
|
||||||
|
worldState_thermiaFracturesProgressOverride: `[UNTRANSLATED] Thermia Fractures Progress`,
|
||||||
worldState_from_year: `|VAL|`,
|
worldState_from_year: `|VAL|`,
|
||||||
worldState_pre_year: `|VAL|之前`,
|
worldState_pre_year: `|VAL|之前`,
|
||||||
worldState_week: `第|VAL|周`,
|
worldState_week: `第|VAL|周`,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user