chore(webui): update to Spanish translation #1772
@ -33,6 +33,7 @@
|
||||
"noArgonCrystalDecay": false,
|
||||
"noMasteryRankUpCooldown": false,
|
||||
"noVendorPurchaseLimits": true,
|
||||
"noDeathMarks": false,
|
||||
"noKimCooldowns": false,
|
||||
"instantResourceExtractorDrones": false,
|
||||
"noResourceExtractorDronesDamage": false,
|
||||
|
@ -1,33 +1,64 @@
|
||||
import { addCrewShipSalvagedWeaponSkin, addCrewShipRawSalvage, getInventory } from "@/src/services/inventoryService";
|
||||
import {
|
||||
addCrewShipSalvagedWeaponSkin,
|
||||
addCrewShipRawSalvage,
|
||||
getInventory,
|
||||
addEquipment
|
||||
} from "@/src/services/inventoryService";
|
||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
||||
import { RequestHandler } from "express";
|
||||
import { ICrewShipComponentFingerprint } from "@/src/types/inventoryTypes/inventoryTypes";
|
||||
import { ExportCustoms } from "warframe-public-export-plus";
|
||||
import { ICrewShipComponentFingerprint, IInnateDamageFingerprint } from "@/src/types/inventoryTypes/inventoryTypes";
|
||||
import { ExportCustoms, ExportRailjackWeapons, ExportUpgrades } from "warframe-public-export-plus";
|
||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
|
||||
import { getRandomInt } from "@/src/services/rngService";
|
||||
import { IFingerprintStat } from "@/src/helpers/rivenHelper";
|
||||
|
||||
export const crewShipIdentifySalvageController: RequestHandler = async (req, res) => {
|
||||
const accountId = await getAccountIdForRequest(req);
|
||||
const inventory = await getInventory(accountId, "CrewShipSalvagedWeaponSkins CrewShipRawSalvage");
|
||||
const inventory = await getInventory(
|
||||
accountId,
|
||||
"CrewShipSalvagedWeaponSkins CrewShipSalvagedWeapons CrewShipRawSalvage"
|
||||
);
|
||||
const payload = getJSONfromString<ICrewShipIdentifySalvageRequest>(String(req.body));
|
||||
|
||||
const meta = ExportCustoms[payload.ItemType];
|
||||
let upgradeFingerprint: ICrewShipComponentFingerprint = { compat: payload.ItemType, buffs: [] };
|
||||
if (meta.subroutines) {
|
||||
upgradeFingerprint = {
|
||||
SubroutineIndex: getRandomInt(0, meta.subroutines.length - 1),
|
||||
...upgradeFingerprint
|
||||
};
|
||||
const inventoryChanges: IInventoryChanges = {};
|
||||
if (payload.ItemType in ExportCustoms) {
|
||||
const meta = ExportCustoms[payload.ItemType];
|
||||
let upgradeFingerprint: ICrewShipComponentFingerprint = { compat: payload.ItemType, buffs: [] };
|
||||
if (meta.subroutines) {
|
||||
upgradeFingerprint = {
|
||||
SubroutineIndex: getRandomInt(0, meta.subroutines.length - 1),
|
||||
...upgradeFingerprint
|
||||
};
|
||||
}
|
||||
for (const upgrade of meta.randomisedUpgrades!) {
|
||||
upgradeFingerprint.buffs.push({ Tag: upgrade.tag, Value: Math.trunc(Math.random() * 0x40000000) });
|
||||
}
|
||||
addCrewShipSalvagedWeaponSkin(
|
||||
inventory,
|
||||
payload.ItemType,
|
||||
JSON.stringify(upgradeFingerprint),
|
||||
inventoryChanges
|
||||
);
|
||||
} else {
|
||||
const meta = ExportRailjackWeapons[payload.ItemType];
|
||||
const upgradeType = meta.defaultUpgrades![0].ItemType;
|
||||
const upgradeMeta = ExportUpgrades[upgradeType];
|
||||
const buffs: IFingerprintStat[] = [];
|
||||
for (const buff of upgradeMeta.upgradeEntries!) {
|
||||
buffs.push({
|
||||
Tag: buff.tag,
|
||||
Value: Math.trunc(Math.random() * 0x40000000)
|
||||
});
|
||||
}
|
||||
addEquipment(inventory, "CrewShipSalvagedWeapons", payload.ItemType, undefined, inventoryChanges, {
|
||||
UpgradeType: upgradeType,
|
||||
UpgradeFingerprint: JSON.stringify({
|
||||
compat: payload.ItemType,
|
||||
buffs
|
||||
} satisfies IInnateDamageFingerprint)
|
||||
});
|
||||
}
|
||||
for (const upgrade of meta.randomisedUpgrades!) {
|
||||
upgradeFingerprint.buffs.push({ Tag: upgrade.tag, Value: Math.trunc(Math.random() * 0x40000000) });
|
||||
}
|
||||
const inventoryChanges: IInventoryChanges = addCrewShipSalvagedWeaponSkin(
|
||||
inventory,
|
||||
payload.ItemType,
|
||||
JSON.stringify(upgradeFingerprint)
|
||||
);
|
||||
|
||||
inventoryChanges.CrewShipRawSalvage = [
|
||||
{
|
||||
|
@ -15,6 +15,7 @@ import { ExportDojoRecipes } from "warframe-public-export-plus";
|
||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
||||
import {
|
||||
addCrewShipWeaponSkin,
|
||||
addEquipment,
|
||||
addItem,
|
||||
addMiscItems,
|
||||
addRecipes,
|
||||
@ -382,18 +383,31 @@ interface IGuildTechContributeRequest {
|
||||
const claimSalvagedComponent = (inventory: TInventoryDatabaseDocument, itemId: string): IInventoryChanges => {
|
||||
// delete personal tech project
|
||||
const personalTechProjectIndex = inventory.PersonalTechProjects.findIndex(x => x.CategoryItemId?.equals(itemId));
|
||||
if (personalTechProjectIndex != -1) {
|
||||
inventory.PersonalTechProjects.splice(personalTechProjectIndex, 1);
|
||||
}
|
||||
const personalTechProject = inventory.PersonalTechProjects[personalTechProjectIndex];
|
||||
inventory.PersonalTechProjects.splice(personalTechProjectIndex, 1);
|
||||
|
||||
const category = personalTechProject.ProductCategory! as "CrewShipWeapons" | "CrewShipWeaponSkins";
|
||||
const salvageCategory = category == "CrewShipWeapons" ? "CrewShipSalvagedWeapons" : "CrewShipSalvagedWeaponSkins";
|
||||
|
||||
// find salved part & delete it
|
||||
const crewShipSalvagedWeaponSkinsIndex = inventory.CrewShipSalvagedWeaponSkins.findIndex(x => x._id.equals(itemId));
|
||||
const crewShipWeaponSkin = inventory.CrewShipSalvagedWeaponSkins[crewShipSalvagedWeaponSkinsIndex];
|
||||
inventory.CrewShipSalvagedWeaponSkins.splice(crewShipSalvagedWeaponSkinsIndex, 1);
|
||||
const salvageIndex = inventory[salvageCategory].findIndex(x => x._id.equals(itemId));
|
||||
const salvageItem = inventory[category][salvageIndex];
|
||||
inventory[salvageCategory].splice(salvageIndex, 1);
|
||||
|
||||
// add final item
|
||||
const inventoryChanges = {
|
||||
...addCrewShipWeaponSkin(inventory, crewShipWeaponSkin.ItemType, crewShipWeaponSkin.UpgradeFingerprint),
|
||||
...(category == "CrewShipWeaponSkins"
|
||||
? addCrewShipWeaponSkin(inventory, salvageItem.ItemType, salvageItem.UpgradeFingerprint)
|
||||
: addEquipment(
|
||||
inventory,
|
||||
category,
|
||||
salvageItem.ItemType,
|
||||
undefined,
|
||||
{},
|
||||
{
|
||||
UpgradeFingerprint: salvageItem.UpgradeFingerprint
|
||||
}
|
||||
)),
|
||||
...occupySlot(inventory, InventorySlot.RJ_COMPONENT_AND_ARMAMENTS, false)
|
||||
};
|
||||
|
||||
|
@ -7,16 +7,18 @@ import {
|
||||
addMiscItems,
|
||||
addConsumables,
|
||||
freeUpSlot,
|
||||
combineInventoryChanges
|
||||
combineInventoryChanges,
|
||||
addCrewShipRawSalvage
|
||||
} from "@/src/services/inventoryService";
|
||||
import { InventorySlot } from "@/src/types/inventoryTypes/inventoryTypes";
|
||||
import { ExportDojoRecipes } from "warframe-public-export-plus";
|
||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
|
||||
import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
|
||||
|
||||
export const sellController: RequestHandler = async (req, res) => {
|
||||
const payload = JSON.parse(String(req.body)) as ISellRequest;
|
||||
const accountId = await getAccountIdForRequest(req);
|
||||
const requiredFields = new Set();
|
||||
const requiredFields = new Set<keyof TInventoryDatabaseDocument>();
|
||||
if (payload.SellCurrency == "SC_RegularCredits") {
|
||||
requiredFields.add("RegularCredits");
|
||||
} else if (payload.SellCurrency == "SC_FusionPoints") {
|
||||
@ -25,7 +27,7 @@ export const sellController: RequestHandler = async (req, res) => {
|
||||
requiredFields.add("MiscItems");
|
||||
}
|
||||
for (const key of Object.keys(payload.Items)) {
|
||||
requiredFields.add(key);
|
||||
requiredFields.add(key as keyof TInventoryDatabaseDocument);
|
||||
}
|
||||
if (requiredFields.has("Upgrades")) {
|
||||
requiredFields.add("RawUpgrades");
|
||||
@ -51,8 +53,15 @@ export const sellController: RequestHandler = async (req, res) => {
|
||||
if (payload.Items.Hoverboards) {
|
||||
requiredFields.add(InventorySlot.SPACESUITS);
|
||||
}
|
||||
if (payload.Items.CrewShipWeapons) {
|
||||
if (payload.Items.CrewShipWeapons || payload.Items.CrewShipWeaponSkins) {
|
||||
requiredFields.add(InventorySlot.RJ_COMPONENT_AND_ARMAMENTS);
|
||||
requiredFields.add("CrewShipRawSalvage");
|
||||
if (payload.Items.CrewShipWeapons) {
|
||||
requiredFields.add("CrewShipSalvagedWeapons");
|
||||
}
|
||||
if (payload.Items.CrewShipWeaponSkins) {
|
||||
requiredFields.add("CrewShipSalvagedWeaponSkins");
|
||||
}
|
||||
}
|
||||
const inventory = await getInventory(accountId, Array.from(requiredFields).join(" "));
|
||||
|
||||
@ -76,7 +85,7 @@ export const sellController: RequestHandler = async (req, res) => {
|
||||
}
|
||||
]);
|
||||
} else if (payload.SellCurrency == "SC_Resources") {
|
||||
// Will add appropriate MiscItems from CrewShipWeapons
|
||||
// Will add appropriate MiscItems from CrewShipWeapons or CrewShipWeaponSkins
|
||||
} else {
|
||||
throw new Error("Unknown SellCurrency: " + payload.SellCurrency);
|
||||
}
|
||||
@ -157,19 +166,51 @@ export const sellController: RequestHandler = async (req, res) => {
|
||||
}
|
||||
if (payload.Items.CrewShipWeapons) {
|
||||
payload.Items.CrewShipWeapons.forEach(sellItem => {
|
||||
const index = inventory.CrewShipWeapons.findIndex(x => x._id.equals(sellItem.String));
|
||||
if (index != -1) {
|
||||
const itemType = inventory.CrewShipWeapons[index].ItemType;
|
||||
const recipe = Object.values(ExportDojoRecipes.fabrications).find(x => x.resultType == itemType)!;
|
||||
const miscItemChanges = recipe.ingredients.map(x => ({
|
||||
ItemType: x.ItemType,
|
||||
ItemCount: Math.trunc(x.ItemCount * 0.8)
|
||||
}));
|
||||
addMiscItems(inventory, miscItemChanges);
|
||||
combineInventoryChanges(inventoryChanges, { MiscItems: miscItemChanges });
|
||||
|
||||
inventory.CrewShipWeapons.splice(index, 1);
|
||||
freeUpSlot(inventory, InventorySlot.RJ_COMPONENT_AND_ARMAMENTS);
|
||||
if (sellItem.String[0] == "/") {
|
||||
addCrewShipRawSalvage(inventory, [
|
||||
{
|
||||
ItemType: sellItem.String,
|
||||
ItemCount: sellItem.Count * -1
|
||||
}
|
||||
]);
|
||||
} else {
|
||||
const index = inventory.CrewShipWeapons.findIndex(x => x._id.equals(sellItem.String));
|
||||
if (index != -1) {
|
||||
if (payload.SellCurrency == "SC_Resources") {
|
||||
refundPartialBuildCosts(inventory, inventory.CrewShipWeapons[index].ItemType, inventoryChanges);
|
||||
}
|
||||
inventory.CrewShipWeapons.splice(index, 1);
|
||||
freeUpSlot(inventory, InventorySlot.RJ_COMPONENT_AND_ARMAMENTS);
|
||||
} else {
|
||||
inventory.CrewShipSalvagedWeapons.pull({ _id: sellItem.String });
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
if (payload.Items.CrewShipWeaponSkins) {
|
||||
payload.Items.CrewShipWeaponSkins.forEach(sellItem => {
|
||||
if (sellItem.String[0] == "/") {
|
||||
addCrewShipRawSalvage(inventory, [
|
||||
{
|
||||
ItemType: sellItem.String,
|
||||
ItemCount: sellItem.Count * -1
|
||||
}
|
||||
]);
|
||||
} else {
|
||||
const index = inventory.CrewShipWeaponSkins.findIndex(x => x._id.equals(sellItem.String));
|
||||
if (index != -1) {
|
||||
if (payload.SellCurrency == "SC_Resources") {
|
||||
refundPartialBuildCosts(
|
||||
inventory,
|
||||
inventory.CrewShipWeaponSkins[index].ItemType,
|
||||
inventoryChanges
|
||||
);
|
||||
}
|
||||
inventory.CrewShipWeaponSkins.splice(index, 1);
|
||||
freeUpSlot(inventory, InventorySlot.RJ_COMPONENT_AND_ARMAMENTS);
|
||||
} else {
|
||||
inventory.CrewShipSalvagedWeaponSkins.pull({ _id: sellItem.String });
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -243,6 +284,7 @@ interface ISellRequest {
|
||||
Hoverboards?: ISellItem[];
|
||||
Drones?: ISellItem[];
|
||||
CrewShipWeapons?: ISellItem[];
|
||||
CrewShipWeaponSkins?: ISellItem[];
|
||||
};
|
||||
SellPrice: number;
|
||||
SellCurrency:
|
||||
@ -259,3 +301,33 @@ interface ISellItem {
|
||||
String: string; // oid or uniqueName
|
||||
Count: number;
|
||||
}
|
||||
|
||||
const refundPartialBuildCosts = (
|
||||
inventory: TInventoryDatabaseDocument,
|
||||
itemType: string,
|
||||
inventoryChanges: IInventoryChanges
|
||||
): void => {
|
||||
// House versions
|
||||
const research = Object.values(ExportDojoRecipes.research).find(x => x.resultType == itemType);
|
||||
if (research) {
|
||||
const miscItemChanges = research.ingredients.map(x => ({
|
||||
ItemType: x.ItemType,
|
||||
ItemCount: Math.trunc(x.ItemCount * 0.8)
|
||||
}));
|
||||
addMiscItems(inventory, miscItemChanges);
|
||||
combineInventoryChanges(inventoryChanges, { MiscItems: miscItemChanges });
|
||||
return;
|
||||
}
|
||||
|
||||
// Sigma versions
|
||||
const recipe = Object.values(ExportDojoRecipes.fabrications).find(x => x.resultType == itemType);
|
||||
if (recipe) {
|
||||
const miscItemChanges = recipe.ingredients.map(x => ({
|
||||
ItemType: x.ItemType,
|
||||
ItemCount: Math.trunc(x.ItemCount * 0.8)
|
||||
}));
|
||||
addMiscItems(inventory, miscItemChanges);
|
||||
combineInventoryChanges(inventoryChanges, { MiscItems: miscItemChanges });
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
@ -51,7 +51,7 @@ export const syndicateSacrificeController: RequestHandler = async (request, resp
|
||||
syndicate.Title ??= 0;
|
||||
syndicate.Title += 1;
|
||||
|
||||
if (syndicate.Title > 0 && manifest.favours.length != 0) {
|
||||
if (syndicate.Title > 0 && manifest.favours.find(x => x.rankUpReward && x.requiredLevel == syndicate.Title)) {
|
||||
syndicate.FreeFavorsEarned ??= [];
|
||||
if (!syndicate.FreeFavorsEarned.includes(syndicate.Title)) {
|
||||
syndicate.FreeFavorsEarned.push(syndicate.Title);
|
||||
|
@ -86,7 +86,9 @@ import {
|
||||
IWeeklyMission,
|
||||
ILockedWeaponGroupDatabase,
|
||||
IPersonalTechProjectDatabase,
|
||||
IPersonalTechProjectClient
|
||||
IPersonalTechProjectClient,
|
||||
ILastSortieRewardDatabase,
|
||||
ILastSortieRewardClient
|
||||
} from "../../types/inventoryTypes/inventoryTypes";
|
||||
import { IOid } from "../../types/commonTypes";
|
||||
import {
|
||||
@ -1202,6 +1204,28 @@ const alignmentSchema = new Schema<IAlignment>(
|
||||
{ _id: false }
|
||||
);
|
||||
|
||||
const lastSortieRewardSchema = new Schema<ILastSortieRewardDatabase>(
|
||||
{
|
||||
SortieId: Schema.Types.ObjectId,
|
||||
StoreItem: String,
|
||||
Manifest: String
|
||||
},
|
||||
{ _id: false }
|
||||
);
|
||||
|
||||
lastSortieRewardSchema.set("toJSON", {
|
||||
virtuals: true,
|
||||
transform(_doc, obj) {
|
||||
const db = obj as ILastSortieRewardDatabase;
|
||||
const client = obj as ILastSortieRewardClient;
|
||||
|
||||
client.SortieId = toOid(db.SortieId);
|
||||
|
||||
delete obj._id;
|
||||
delete obj.__v;
|
||||
}
|
||||
});
|
||||
|
||||
const lockedWeaponGroupSchema = new Schema<ILockedWeaponGroupDatabase>(
|
||||
{
|
||||
s: Schema.Types.ObjectId,
|
||||
@ -1419,7 +1443,8 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
|
||||
|
||||
//https://warframe.fandom.com/wiki/Sortie
|
||||
CompletedSorties: [String],
|
||||
LastSortieReward: [Schema.Types.Mixed],
|
||||
LastSortieReward: { type: [lastSortieRewardSchema], default: undefined },
|
||||
LastLiteSortieReward: { type: [lastSortieRewardSchema], default: undefined },
|
||||
|
||||
// Resource Extractor Drones
|
||||
Drones: [droneSchema],
|
||||
|
@ -39,6 +39,7 @@ interface IConfig {
|
||||
noArgonCrystalDecay?: boolean;
|
||||
noMasteryRankUpCooldown?: boolean;
|
||||
noVendorPurchaseLimits?: boolean;
|
||||
noDeathMarks?: boolean;
|
||||
noKimCooldowns?: boolean;
|
||||
instantResourceExtractorDrones?: boolean;
|
||||
noResourceExtractorDronesDamage?: boolean;
|
||||
|
@ -1083,7 +1083,7 @@ export const addEquipment = (
|
||||
Configs: [],
|
||||
XP: 0,
|
||||
ModularParts: modularParts,
|
||||
IsNew: category != "CrewShipWeapons" ? true : undefined
|
||||
IsNew: category != "CrewShipWeapons" && category != "CrewShipSalvagedWeapons" ? true : undefined
|
||||
},
|
||||
defaultOverwrites
|
||||
);
|
||||
|
@ -54,6 +54,7 @@ import { getInfNodes } from "@/src/helpers/nemesisHelpers";
|
||||
import { Loadout } from "../models/inventoryModels/loadoutModel";
|
||||
import { ILoadoutConfigDatabase } from "../types/saveLoadoutTypes";
|
||||
import { getWorldState } from "./worldStateService";
|
||||
import { config } from "./configService";
|
||||
|
||||
const getRotations = (rewardInfo: IRewardInfo, tierOverride?: number): number[] => {
|
||||
// For Spy missions, e.g. 3 vaults cracked = A, B, C
|
||||
@ -418,22 +419,24 @@ export const addMissionInventoryUpdates = async (
|
||||
break;
|
||||
}
|
||||
case "DeathMarks": {
|
||||
for (const bossName of value) {
|
||||
if (inventory.DeathMarks.indexOf(bossName) == -1) {
|
||||
// It's a new death mark; we have to say the line.
|
||||
await createMessage(inventory.accountOwnerId, [
|
||||
{
|
||||
sub: bossName,
|
||||
sndr: "/Lotus/Language/G1Quests/DeathMarkSender",
|
||||
msg: "/Lotus/Language/G1Quests/DeathMarkMessage",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Stalker_d.png",
|
||||
highPriority: true,
|
||||
expiry: new Date(Date.now() + 86400_000) // TOVERIFY: This type of inbox message seems to automatically delete itself. We'll just delete it after 24 hours, but it's clear if this is correct.
|
||||
}
|
||||
]);
|
||||
if (!config.noDeathMarks) {
|
||||
for (const bossName of value) {
|
||||
if (inventory.DeathMarks.indexOf(bossName) == -1) {
|
||||
// It's a new death mark; we have to say the line.
|
||||
await createMessage(inventory.accountOwnerId, [
|
||||
{
|
||||
sub: bossName,
|
||||
sndr: "/Lotus/Language/G1Quests/DeathMarkSender",
|
||||
msg: "/Lotus/Language/G1Quests/DeathMarkMessage",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Stalker_d.png",
|
||||
highPriority: true,
|
||||
expiry: new Date(Date.now() + 86400_000) // TOVERIFY: This type of inbox message seems to automatically delete itself. We'll just delete it after 24 hours, but it's clear if this is correct.
|
||||
}
|
||||
]);
|
||||
}
|
||||
}
|
||||
inventory.DeathMarks = value;
|
||||
}
|
||||
inventory.DeathMarks = value;
|
||||
break;
|
||||
}
|
||||
case "CapturedAnimals": {
|
||||
@ -581,6 +584,16 @@ export const addMissionRewards = async (
|
||||
const AffiliationMods: IAffiliationMods[] = [];
|
||||
let SyndicateXPItemReward;
|
||||
|
||||
if (rewardInfo.sortieTag == "Final") {
|
||||
inventory.LastSortieReward = [
|
||||
{
|
||||
SortieId: new Types.ObjectId(rewardInfo.sortieId!.split("_")[1]),
|
||||
StoreItem: MissionRewards[0].StoreItem,
|
||||
Manifest: "/Lotus/Types/Game/MissionDecks/SortieRewards"
|
||||
}
|
||||
];
|
||||
}
|
||||
|
||||
let missionCompletionCredits = 0;
|
||||
//inventory change is what the client has not rewarded itself, also the client needs to know the credit changes for display
|
||||
if (levelKeyName) {
|
||||
@ -940,6 +953,10 @@ function getLevelCreditRewards(node: IRegion): number {
|
||||
|
||||
function getRandomMissionDrops(RewardInfo: IRewardInfo, tierOverride: number | undefined): IMissionReward[] {
|
||||
const drops: IMissionReward[] = [];
|
||||
if (RewardInfo.sortieTag == "Final") {
|
||||
const drop = getRandomRewardByChance(ExportRewards["/Lotus/Types/Game/MissionDecks/SortieRewards"][0])!;
|
||||
drops.push({ StoreItem: drop.type, ItemCount: drop.itemCount });
|
||||
}
|
||||
if (RewardInfo.periodicMissionTag?.startsWith("HardDaily")) {
|
||||
drops.push({
|
||||
StoreItem: "/Lotus/StoreItems/Types/Items/MiscItems/SteelEssence",
|
||||
|
@ -1,14 +1,10 @@
|
||||
import staticWorldState from "@/static/fixed_responses/worldState/worldState.json";
|
||||
import static1999FallDays from "@/static/fixed_responses/worldState/1999_fall_days.json";
|
||||
import static1999SpringDays from "@/static/fixed_responses/worldState/1999_spring_days.json";
|
||||
import static1999SummerDays from "@/static/fixed_responses/worldState/1999_summer_days.json";
|
||||
import static1999WinterDays from "@/static/fixed_responses/worldState/1999_winter_days.json";
|
||||
import { buildConfig } from "@/src/services/buildConfigService";
|
||||
import { unixTimesInMs } from "@/src/constants/timeConstants";
|
||||
import { config } from "@/src/services/configService";
|
||||
import { CRng } from "@/src/services/rngService";
|
||||
import { eMissionType, ExportNightwave, ExportRegions } from "warframe-public-export-plus";
|
||||
import { ISeasonChallenge, ISortie, IWorldState } from "../types/worldStateTypes";
|
||||
import { ICalendarDay, ICalendarSeason, ISeasonChallenge, ISortie, IWorldState } from "../types/worldStateTypes";
|
||||
|
||||
const sortieBosses = [
|
||||
"SORTIE_BOSS_HYENA",
|
||||
@ -352,6 +348,209 @@ const getSeasonWeeklyHardChallenge = (week: number, id: number): ISeasonChalleng
|
||||
};
|
||||
};
|
||||
|
||||
const birthdays: number[] = [
|
||||
1, // Kaya
|
||||
45, // Lettie
|
||||
74, // Minerva (MinervaVelemirDialogue_rom.dialogue)
|
||||
143, // Amir
|
||||
166, // Flare
|
||||
191, // Aoi
|
||||
306, // Eleanor
|
||||
307, // Arthur
|
||||
338, // Quincy
|
||||
355 // Velimir (MinervaVelemirDialogue_rom.dialogue)
|
||||
];
|
||||
|
||||
const getCalendarSeason = (week: number): ICalendarSeason => {
|
||||
const seasonIndex = week % 4;
|
||||
const seasonDay1 = seasonIndex * 90 + 1;
|
||||
const seasonDay91 = seasonIndex * 90 + 91;
|
||||
const eventDays: ICalendarDay[] = [];
|
||||
for (const day of birthdays) {
|
||||
if (day < seasonDay1) {
|
||||
continue;
|
||||
}
|
||||
if (day >= seasonDay91) {
|
||||
break;
|
||||
}
|
||||
//logger.debug(`birthday on day ${day}`);
|
||||
eventDays.push({ day, events: [] }); // This is how CET_PLOT looks in worldState as of around 38.5.0
|
||||
}
|
||||
const rng = new CRng(week);
|
||||
const challenges = [
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillEnemiesEasy",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillEnemiesMedium",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillEnemiesHard",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillEnemiesWithMeleeEasy",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillEnemiesWithMeleeMedium",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillEnemiesWithMeleeHard",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillEnemiesWithAbilitiesEasy",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillEnemiesWithAbilitiesMedium",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillEnemiesWithAbilitiesHard",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarDestroyPropsEasy",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarDestroyPropsMedium",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarDestroyPropsHard",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillEximusEasy",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillEximusMedium",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillEximusHard",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillScaldraEnemiesEasy",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillScaldraEnemiesMedium",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillScaldraEnemiesHard",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillScaldraEnemiesWithAbilitiesEasy",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillScaldraEnemiesWithAbilitiesMedium",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillScaldraEnemiesWithAbilitiesHard",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillTankHard",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillScaldraEnemiesWithMeleeEasy",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillScaldraEnemiesWithMeleeMedium",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillScaldraEnemiesWithMeleeHard",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillTechrotEnemiesEasy",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillTechrotEnemiesMedium",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillTechrotEnemiesHard",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillTechrotEnemiesWithAbilitiesEasy",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillTechrotEnemiesWithAbilitiesMedium",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillTechrotEnemiesWithAbilitiesHard",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillTechrotEnemiesWithMeleeEasy",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillTechrotEnemiesWithMeleeMedium",
|
||||
"/Lotus/Types/Challenges/Calendar1999/CalendarKillTechrotEnemiesWithMeleeHard"
|
||||
];
|
||||
const rewardRanges: number[] = [];
|
||||
const upgradeRanges: number[] = [];
|
||||
for (let i = 0; i != 6; ++i) {
|
||||
const chunkDay1 = seasonDay1 + i * 15;
|
||||
const chunkDay13 = chunkDay1 - 1 + 13;
|
||||
let challengeDay: number;
|
||||
do {
|
||||
challengeDay = rng.randomInt(chunkDay1, chunkDay13);
|
||||
} while (birthdays.indexOf(challengeDay) != -1);
|
||||
|
||||
const challengeIndex = rng.randomInt(0, challenges.length - 1);
|
||||
const challenge = challenges[challengeIndex];
|
||||
challenges.splice(challengeIndex, 1);
|
||||
|
||||
//logger.debug(`challenge on day ${challengeDay}`);
|
||||
eventDays.push({
|
||||
day: challengeDay,
|
||||
events: [{ type: "CET_CHALLENGE", challenge }]
|
||||
});
|
||||
|
||||
rewardRanges.push(challengeDay);
|
||||
if (i == 0 || i == 3 || i == 5) {
|
||||
upgradeRanges.push(challengeDay);
|
||||
}
|
||||
}
|
||||
rewardRanges.push(seasonDay91);
|
||||
upgradeRanges.push(seasonDay91);
|
||||
|
||||
const rewards = [
|
||||
"/Lotus/StoreItems/Types/Items/MiscItems/UtilityUnlocker",
|
||||
"/Lotus/StoreItems/Types/Recipes/Components/FormaAuraBlueprint",
|
||||
"/Lotus/StoreItems/Types/Recipes/Components/FormaBlueprint",
|
||||
"/Lotus/StoreItems/Types/Recipes/Components/WeaponUtilityUnlockerBlueprint",
|
||||
"/Lotus/StoreItems/Types/Items/MiscItems/WeaponMeleeArcaneUnlocker",
|
||||
"/Lotus/StoreItems/Types/Items/MiscItems/WeaponSecondaryArcaneUnlocker",
|
||||
"/Lotus/StoreItems/Types/Items/MiscItems/WeaponPrimaryArcaneUnlocker",
|
||||
"/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CircuitSilverSteelPathFusionBundle",
|
||||
"/Lotus/StoreItems/Types/BoosterPacks/CalendarRivenPack",
|
||||
"/Lotus/Types/StoreItems/Packages/Calendar/CalendarKuvaBundleSmall",
|
||||
"/Lotus/Types/StoreItems/Packages/Calendar/CalendarKuvaBundleLarge",
|
||||
"/Lotus/StoreItems/Types/BoosterPacks/CalendarArtifactPack",
|
||||
"/Lotus/StoreItems/Types/BoosterPacks/CalendarMajorArtifactPack",
|
||||
"/Lotus/Types/StoreItems/Boosters/AffinityBooster3DayStoreItem",
|
||||
"/Lotus/Types/StoreItems/Boosters/ModDropChanceBooster3DayStoreItem",
|
||||
"/Lotus/Types/StoreItems/Boosters/ResourceDropChance3DayStoreItem",
|
||||
"/Lotus/StoreItems/Types/Items/MiscItems/Forma",
|
||||
"/Lotus/StoreItems/Types/Recipes/Components/OrokinCatalystBlueprint",
|
||||
"/Lotus/StoreItems/Types/Recipes/Components/OrokinReactorBlueprint",
|
||||
"/Lotus/StoreItems/Types/Items/MiscItems/WeaponUtilityUnlocker",
|
||||
"/Lotus/Types/StoreItems/Packages/Calendar/CalendarVosforPack",
|
||||
"/Lotus/StoreItems/Types/Gameplay/NarmerSorties/ArchonCrystalOrange",
|
||||
"/Lotus/StoreItems/Types/Gameplay/NarmerSorties/ArchonCrystalNira",
|
||||
"/Lotus/StoreItems/Types/Gameplay/NarmerSorties/ArchonCrystalGreen",
|
||||
"/Lotus/StoreItems/Types/Gameplay/NarmerSorties/ArchonCrystalBoreal",
|
||||
"/Lotus/StoreItems/Types/Gameplay/NarmerSorties/ArchonCrystalAmar",
|
||||
"/Lotus/StoreItems/Types/Gameplay/NarmerSorties/ArchonCrystalViolet"
|
||||
];
|
||||
for (let i = 0; i != rewardRanges.length - 1; ++i) {
|
||||
const rewardIndex = rng.randomInt(0, rewards.length - 1);
|
||||
const reward = rewards[rewardIndex];
|
||||
rewards.splice(rewardIndex, 1);
|
||||
|
||||
//logger.debug(`trying to fit a reward between day ${rewardRanges[i]} and ${rewardRanges[i + 1]}`);
|
||||
let day: number;
|
||||
do {
|
||||
day = rng.randomInt(rewardRanges[i] + 1, rewardRanges[i + 1] - 1);
|
||||
} while (eventDays.find(x => x.day == day));
|
||||
eventDays.push({ day, events: [{ type: "CET_REWARD", reward }] });
|
||||
}
|
||||
|
||||
const upgrades = [
|
||||
"/Lotus/Upgrades/Calendar/MeleeCritChance",
|
||||
"/Lotus/Upgrades/Calendar/MeleeAttackSpeed",
|
||||
"/Lotus/Upgrades/Calendar/EnergyOrbToAbilityRange",
|
||||
"/Lotus/Upgrades/Calendar/AbilityStrength",
|
||||
"/Lotus/Upgrades/Calendar/Armor",
|
||||
"/Lotus/Upgrades/Calendar/RadiationProcOnTakeDamage",
|
||||
"/Lotus/Upgrades/Calendar/CompanionDamage",
|
||||
"/Lotus/Upgrades/Calendar/GasChanceToPrimaryAndSecondary",
|
||||
"/Lotus/Upgrades/Calendar/MagazineCapacity",
|
||||
"/Lotus/Upgrades/Calendar/PunchToPrimary",
|
||||
"/Lotus/Upgrades/Calendar/HealingEffects",
|
||||
"/Lotus/Upgrades/Calendar/EnergyRestoration",
|
||||
"/Lotus/Upgrades/Calendar/OvershieldCap",
|
||||
"/Lotus/Upgrades/Calendar/ElectricStatusDamageAndChance",
|
||||
"/Lotus/Upgrades/Calendar/FinisherChancePerComboMultiplier",
|
||||
"/Lotus/Upgrades/Calendar/MagnetStatusPull",
|
||||
"/Lotus/Upgrades/Calendar/CompanionsBuffNearbyPlayer",
|
||||
"/Lotus/Upgrades/Calendar/StatusChancePerAmmoSpent",
|
||||
"/Lotus/Upgrades/Calendar/OrbsDuplicateOnPickup",
|
||||
"/Lotus/Upgrades/Calendar/AttackAndMovementSpeedOnCritMelee",
|
||||
"/Lotus/Upgrades/Calendar/RadialJavelinOnHeavy",
|
||||
"/Lotus/Upgrades/Calendar/MagnitizeWithinRangeEveryXCasts",
|
||||
"/Lotus/Upgrades/Calendar/CompanionsRadiationChance",
|
||||
"/Lotus/Upgrades/Calendar/BlastEveryXShots",
|
||||
"/Lotus/Upgrades/Calendar/GenerateOmniOrbsOnWeakKill",
|
||||
"/Lotus/Upgrades/Calendar/ElectricDamagePerDistance",
|
||||
"/Lotus/Upgrades/Calendar/MeleeSlideFowardMomentumOnEnemyHit",
|
||||
"/Lotus/Upgrades/Calendar/SharedFreeAbilityEveryXCasts",
|
||||
"/Lotus/Upgrades/Calendar/ReviveEnemyAsSpectreOnKill",
|
||||
"/Lotus/Upgrades/Calendar/RefundBulletOnStatusProc",
|
||||
"/Lotus/Upgrades/Calendar/ExplodingHealthOrbs",
|
||||
"/Lotus/Upgrades/Calendar/SpeedBuffsWhenAirborne",
|
||||
"/Lotus/Upgrades/Calendar/EnergyWavesOnCombo",
|
||||
"/Lotus/Upgrades/Calendar/PowerStrengthAndEfficiencyPerEnergySpent",
|
||||
"/Lotus/Upgrades/Calendar/CloneActiveCompanionForEnergySpent",
|
||||
"/Lotus/Upgrades/Calendar/GuidingMissilesChance",
|
||||
"/Lotus/Upgrades/Calendar/EnergyOrbsGrantShield",
|
||||
"/Lotus/Upgrades/Calendar/ElectricalDamageOnBulletJump"
|
||||
];
|
||||
for (let i = 0; i != upgradeRanges.length - 1; ++i) {
|
||||
const upgradeIndex = rng.randomInt(0, upgrades.length - 1);
|
||||
const upgrade = upgrades[upgradeIndex];
|
||||
upgrades.splice(upgradeIndex, 1);
|
||||
|
||||
//logger.debug(`trying to fit an upgrade between day ${upgradeRanges[i]} and ${upgradeRanges[i + 1]}`);
|
||||
let day: number;
|
||||
do {
|
||||
day = rng.randomInt(upgradeRanges[i] + 1, upgradeRanges[i + 1] - 1);
|
||||
} while (eventDays.find(x => x.day == day));
|
||||
eventDays.push({ day, events: [{ type: "CET_UPGRADE", upgrade }] });
|
||||
}
|
||||
|
||||
eventDays.sort((a, b) => a.day - b.day);
|
||||
|
||||
const weekStart = EPOCH + week * 604800000;
|
||||
const weekEnd = weekStart + 604800000;
|
||||
return {
|
||||
Activation: { $date: { $numberLong: weekStart.toString() } },
|
||||
Expiry: { $date: { $numberLong: weekEnd.toString() } },
|
||||
Days: eventDays,
|
||||
Season: ["CST_WINTER", "CST_SPRING", "CST_SUMMER", "CST_FALL"][seasonIndex],
|
||||
YearIteration: Math.trunc(week / 4),
|
||||
Version: 19,
|
||||
UpgradeAvaliabilityRequirements: ["/Lotus/Upgrades/Calendar/1999UpgradeApplicationRequirement"]
|
||||
};
|
||||
};
|
||||
|
||||
export const getWorldState = (buildLabel?: string): IWorldState => {
|
||||
const day = Math.trunc((Date.now() - EPOCH) / 86400000);
|
||||
const week = Math.trunc(day / 7);
|
||||
@ -376,6 +575,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
||||
Params: "",
|
||||
ActiveChallenges: []
|
||||
},
|
||||
KnownCalendarSeasons: [],
|
||||
...staticWorldState,
|
||||
SyndicateMissions: [...staticWorldState.SyndicateMissions]
|
||||
};
|
||||
@ -834,17 +1034,10 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
||||
});
|
||||
|
||||
// 1999 Calendar Season cycling every week + YearIteration every 4 weeks
|
||||
// TODO: Handle imminent rollover
|
||||
worldState.KnownCalendarSeasons[0].Activation = { $date: { $numberLong: weekStart.toString() } };
|
||||
worldState.KnownCalendarSeasons[0].Expiry = { $date: { $numberLong: weekEnd.toString() } };
|
||||
worldState.KnownCalendarSeasons[0].Season = ["CST_WINTER", "CST_SPRING", "CST_SUMMER", "CST_FALL"][week % 4];
|
||||
worldState.KnownCalendarSeasons[0].Days = [
|
||||
static1999WinterDays,
|
||||
static1999SpringDays,
|
||||
static1999SummerDays,
|
||||
static1999FallDays
|
||||
][week % 4];
|
||||
worldState.KnownCalendarSeasons[0].YearIteration = Math.trunc(week / 4);
|
||||
worldState.KnownCalendarSeasons.push(getCalendarSeason(week));
|
||||
if (isBeforeNextExpectedWorldStateRefresh(weekEnd)) {
|
||||
worldState.KnownCalendarSeasons.push(getCalendarSeason(week + 1));
|
||||
}
|
||||
|
||||
// Sentient Anomaly cycling every 30 minutes
|
||||
const halfHour = Math.trunc(Date.now() / (unixTimesInMs.hour / 2));
|
||||
|
@ -47,6 +47,8 @@ export interface IInventoryDatabase
|
||||
| "BrandedSuits"
|
||||
| "LockedWeaponGroup"
|
||||
| "PersonalTechProjects"
|
||||
| "LastSortieReward"
|
||||
| "LastLiteSortieReward"
|
||||
| TEquipmentKey
|
||||
>,
|
||||
InventoryDatabaseEquipment {
|
||||
@ -79,6 +81,8 @@ export interface IInventoryDatabase
|
||||
BrandedSuits?: Types.ObjectId[];
|
||||
LockedWeaponGroup?: ILockedWeaponGroupDatabase;
|
||||
PersonalTechProjects: IPersonalTechProjectDatabase[];
|
||||
LastSortieReward?: ILastSortieRewardDatabase[];
|
||||
LastLiteSortieReward?: ILastSortieRewardDatabase[];
|
||||
}
|
||||
|
||||
export interface IQuestKeyDatabase {
|
||||
@ -277,7 +281,8 @@ export interface IInventoryClient extends IDailyAffiliations, InventoryClientEqu
|
||||
Wishlist: string[];
|
||||
Alignment?: IAlignment;
|
||||
CompletedSorties: string[];
|
||||
LastSortieReward: ILastSortieReward[];
|
||||
LastSortieReward?: ILastSortieRewardClient[];
|
||||
LastLiteSortieReward?: ILastSortieRewardClient[];
|
||||
Drones: IDroneClient[];
|
||||
StepSequencers: IStepSequencer[];
|
||||
ActiveAvatarImageType: string;
|
||||
@ -724,12 +729,16 @@ export enum Status {
|
||||
StatusStasis = "STATUS_STASIS"
|
||||
}
|
||||
|
||||
export interface ILastSortieReward {
|
||||
export interface ILastSortieRewardClient {
|
||||
SortieId: IOid;
|
||||
StoreItem: string;
|
||||
Manifest: string;
|
||||
}
|
||||
|
||||
export interface ILastSortieRewardDatabase extends Omit<ILastSortieRewardClient, "SortieId"> {
|
||||
SortieId: Types.ObjectId;
|
||||
}
|
||||
|
||||
export interface ILibraryDailyTaskInfo {
|
||||
EnemyTypes: string[];
|
||||
EnemyLocTag: string;
|
||||
|
@ -129,6 +129,9 @@ export type IMissionInventoryUpdateRequest = {
|
||||
|
||||
export interface IRewardInfo {
|
||||
node: string;
|
||||
sortieId?: string;
|
||||
sortieTag?: string;
|
||||
sortiePrereqs?: string[];
|
||||
VaultsCracked?: number; // for Spy missions
|
||||
rewardTier?: number;
|
||||
nightmareMode?: boolean;
|
||||
|
@ -127,8 +127,22 @@ export interface ICalendarSeason {
|
||||
Activation: IMongoDate;
|
||||
Expiry: IMongoDate;
|
||||
Season: string; // "CST_UNDEFINED" | "CST_WINTER" | "CST_SPRING" | "CST_SUMMER" | "CST_FALL"
|
||||
Days: {
|
||||
day: number;
|
||||
}[];
|
||||
Days: ICalendarDay[];
|
||||
YearIteration: number;
|
||||
Version: number;
|
||||
UpgradeAvaliabilityRequirements: string[];
|
||||
}
|
||||
|
||||
export interface ICalendarDay {
|
||||
day: number;
|
||||
events: ICalendarEvent[];
|
||||
}
|
||||
|
||||
export interface ICalendarEvent {
|
||||
type: string;
|
||||
challenge?: string;
|
||||
reward?: string;
|
||||
upgrade?: string;
|
||||
dialogueName?: string;
|
||||
dialogueConvo?: string;
|
||||
}
|
||||
|
@ -1,77 +0,0 @@
|
||||
[
|
||||
{ "day": 276, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarKillScaldraEnemiesEasy" }] },
|
||||
{
|
||||
"day": 283,
|
||||
"events": [
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/CompanionDamage" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/GasChanceToPrimaryAndSecondary" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/ElectricStatusDamageAndChance" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"day": 289,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/Items/MiscItems/WeaponUtilityUnlocker" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/BoosterPacks/CalendarMajorArtifactPack" }
|
||||
]
|
||||
},
|
||||
{ "day": 295, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarKillEnemiesWithMeleeEasy" }] },
|
||||
{
|
||||
"day": 302,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/BoosterPacks/CalendarArtifactPack" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/Items/MiscItems/WeaponSecondaryArcaneUnlocker" }
|
||||
]
|
||||
},
|
||||
{ "day": 305, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarKillEximusMedium" }] },
|
||||
{ "day": 306, "events": [{ "type": "CET_PLOT", "dialogueName": "/Lotus/Types/Gameplay/1999Wf/Dialogue/EleanorDialogue_rom.dialogue", "dialogueConvo": "EleanorBirthdayConvo" }] },
|
||||
{ "day": 307, "events": [{ "type": "CET_PLOT", "dialogueName": "/Lotus/Types/Gameplay/1999Wf/Dialogue/ArthurDialogue_rom.dialogue", "dialogueConvo": "ArthurBirthdayConvo" }] },
|
||||
{
|
||||
"day": 309,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/Items/MiscItems/Forma" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/Gameplay/NarmerSorties/ArchonCrystalBoreal" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"day": 314,
|
||||
"events": [
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/PowerStrengthAndEfficiencyPerEnergySpent" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/ElectricalDamageOnBulletJump" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/MeleeSlideFowardMomentumOnEnemyHit" }
|
||||
]
|
||||
},
|
||||
{ "day": 322, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarKillEnemiesMedium" }] },
|
||||
{
|
||||
"day": 328,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/Items/MiscItems/WeaponSecondaryArcaneUnlocker" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/Types/StoreItems/Packages/Calendar/CalendarKuvaBundleSmall" }
|
||||
]
|
||||
},
|
||||
{ "day": 337, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarKillScaldraEnemiesWithAbilitiesHard" }] },
|
||||
{ "day": 338, "events": [{ "type": "CET_PLOT", "dialogueName": "/Lotus/Types/Gameplay/1999Wf/Dialogue/QuincyDialogue_rom.dialogue", "dialogueConvo": "QuincyBirthdayConvo" }] },
|
||||
{
|
||||
"day": 340,
|
||||
"events": [
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/MeleeCritChance" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/RadiationProcOnTakeDamage" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/AbilityStrength" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"day": 343,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/Items/MiscItems/WeaponPrimaryArcaneUnlocker" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/Items/MiscItems/FormaAura" }
|
||||
]
|
||||
},
|
||||
{ "day": 352, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarKillTankHard" }] },
|
||||
{
|
||||
"day": 364,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/BoosterPacks/CalendarMajorArtifactPack" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/Types/StoreItems/Boosters/ModDropChanceBooster3DayStoreItem" }
|
||||
]
|
||||
}
|
||||
]
|
@ -1,75 +0,0 @@
|
||||
[
|
||||
{ "day": 100, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarKillScaldraEnemiesEasy" }] },
|
||||
{
|
||||
"day": 101,
|
||||
"events": [
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/EnergyOrbToAbilityRange" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/ElectricStatusDamageAndChance" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/EnergyRestoration" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"day": 102,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/Gameplay/NarmerSorties/ArchonCrystalBoreal" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/BoosterPacks/CalendarMajorArtifactPack" }
|
||||
]
|
||||
},
|
||||
{ "day": 106, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarKillTechrotEnemiesEasy" }] },
|
||||
{
|
||||
"day": 107,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/BoosterPacks/CalendarArtifactPack" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/Types/StoreItems/Packages/Calendar/CalendarKuvaBundleSmall" }
|
||||
]
|
||||
},
|
||||
{ "day": 122, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarKillTechrotEnemiesWithMeleeMedium" }] },
|
||||
{
|
||||
"day": 127,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/Items/MiscItems/Forma" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/Types/StoreItems/Packages/Calendar/CalendarVosforPack" }
|
||||
]
|
||||
},
|
||||
{ "day": 129, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarKillEnemiesWithAbilitiesMedium" }] },
|
||||
{
|
||||
"day": 135,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/BoosterPacks/CalendarArtifactPack" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/Items/MiscItems/WeaponMeleeArcaneUnlocker" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"day": 142,
|
||||
"events": [
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/BlastEveryXShots" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/MagnitizeWithinRangeEveryXCasts" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/GenerateOmniOrbsOnWeakKill" }
|
||||
]
|
||||
},
|
||||
{ "day": 143, "events": [{ "type": "CET_PLOT", "dialogueName": "/Lotus/Types/Gameplay/1999Wf/Dialogue/JabirDialogue_rom.dialogue", "dialogueConvo": "AmirBirthdayConvo" }] },
|
||||
{ "day": 161, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarKillScaldraEnemiesWithAbilitiesHard" }] },
|
||||
{
|
||||
"day": 165,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/Items/MiscItems/Forma" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/Types/StoreItems/Boosters/ModDropChanceBooster3DayStoreItem" }
|
||||
]
|
||||
},
|
||||
{ "day": 169, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarDestroyPropsHard" }] },
|
||||
{
|
||||
"day": 171,
|
||||
"events": [
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/GasChanceToPrimaryAndSecondary" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/AbilityStrength" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/MeleeCritChance" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"day": 176,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/BoosterPacks/CalendarArtifactPack" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/Recipes/Components/WeaponUtilityUnlockerBlueprint" }
|
||||
]
|
||||
}
|
||||
]
|
@ -1,75 +0,0 @@
|
||||
[
|
||||
{ "day": 186, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarKillScaldraEnemiesEasy" }] },
|
||||
{ "day": 191, "events": [{ "type": "CET_PLOT", "dialogueName": "/Lotus/Types/Gameplay/1999Wf/Dialogue/AoiDialogue_rom.dialogue", "dialogueConvo": "AoiBirthdayConvo" }] },
|
||||
{
|
||||
"day": 193,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/Gameplay/NarmerSorties/ArchonCrystalAmar" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/BoosterPacks/CalendarMajorArtifactPack" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"day": 197,
|
||||
"events": [
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/MeleeAttackSpeed" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/AbilityStrength" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/CompanionDamage" }
|
||||
]
|
||||
},
|
||||
{ "day": 199, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarKillScaldraEnemiesWithMeleeMedium" }] },
|
||||
{
|
||||
"day": 210,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/BoosterPacks/CalendarArtifactPack" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CircuitSilverSteelPathFusionBundle" }
|
||||
]
|
||||
},
|
||||
{ "day": 215, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarKillTechrotEnemiesWithMeleeEasy" }] },
|
||||
{
|
||||
"day": 228,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/Recipes/Components/WeaponUtilityUnlockerBlueprint" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/BoosterPacks/CalendarRivenPack" }
|
||||
]
|
||||
},
|
||||
{ "day": 236, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarDestroyPropsMedium" }] },
|
||||
{
|
||||
"day": 237,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/Types/StoreItems/Packages/Calendar/CalendarKuvaBundleLarge" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/BoosterPacks/CalendarMajorArtifactPack" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"day": 240,
|
||||
"events": [
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/RadialJavelinOnHeavy" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/SharedFreeAbilityEveryXCasts" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/CompanionsRadiationChance" }
|
||||
]
|
||||
},
|
||||
{ "day": 245, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarKillEnemiesWithAbilitiesHard" }] },
|
||||
{
|
||||
"day": 250,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/Types/StoreItems/Boosters/AffinityBooster3DayStoreItem" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/Recipes/Components/OrokinReactorBlueprint" }
|
||||
]
|
||||
},
|
||||
{ "day": 254, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarKillTankHard" }] },
|
||||
{
|
||||
"day": 267,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/BoosterPacks/CalendarArtifactPack" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/Items/MiscItems/WeaponSecondaryArcaneUnlocker" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"day": 270,
|
||||
"events": [
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/EnergyOrbToAbilityRange" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/PunchToPrimary" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/OvershieldCap" }
|
||||
]
|
||||
}
|
||||
]
|
@ -1,75 +0,0 @@
|
||||
[
|
||||
{ "day": 6, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarKillEximusEasy" }] },
|
||||
{
|
||||
"day": 15,
|
||||
"events": [
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/MagazineCapacity" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/Armor" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/EnergyRestoration" }
|
||||
]
|
||||
},
|
||||
{ "day": 21, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarKillScaldraEnemiesEasy" }] },
|
||||
{
|
||||
"day": 25,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/BoosterPacks/CalendarMajorArtifactPack" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/Gameplay/NarmerSorties/ArchonCrystalGreen" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"day": 31,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/Recipes/Components/WeaponUtilityUnlockerBlueprint" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/Types/StoreItems/Packages/Calendar/CalendarKuvaBundleSmall" }
|
||||
]
|
||||
},
|
||||
{ "day": 43, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarKillEnemiesWithAbilitiesMedium" }] },
|
||||
{ "day": 45, "events": [{ "type": "CET_PLOT", "dialogueName": "/Lotus/Types/Gameplay/1999Wf/Dialogue/LettieDialogue_rom.dialogue", "dialogueConvo": "LettieBirthdayConvo" }] },
|
||||
{
|
||||
"day": 47,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/Types/StoreItems/Boosters/AffinityBooster3DayStoreItem" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/BoosterPacks/CalendarMajorArtifactPack" }
|
||||
]
|
||||
},
|
||||
{ "day": 48, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarKillScaldraEnemiesWithMeleeMedium" }] },
|
||||
{
|
||||
"day": 54,
|
||||
"events": [
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/CompanionsBuffNearbyPlayer" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/OrbsDuplicateOnPickup" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/FinisherChancePerComboMultiplier" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"day": 56,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/BoosterPacks/CalendarArtifactPack" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/Types/StoreItems/Packages/Calendar/CalendarKuvaBundleSmall" }
|
||||
]
|
||||
},
|
||||
{ "day": 71, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarKillTechrotEnemiesHard" }] },
|
||||
{
|
||||
"day": 77,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/Items/MiscItems/WeaponSecondaryArcaneUnlocker" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CircuitSilverSteelPathFusionBundle" }
|
||||
]
|
||||
},
|
||||
{ "day": 80, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarDestroyPropsMedium" }] },
|
||||
{
|
||||
"day": 83,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/Recipes/Components/OrokinReactorBlueprint" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/Items/MiscItems/WeaponUtilityUnlocker" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"day": 87,
|
||||
"events": [
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/EnergyOrbToAbilityRange" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/MeleeAttackSpeed" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/CompanionDamage" }
|
||||
]
|
||||
}
|
||||
]
|
@ -2716,90 +2716,5 @@
|
||||
"ConstructionProjects": [],
|
||||
"TwitchPromos": [],
|
||||
"ExperimentRecommended": [],
|
||||
"ForceLogoutVersion": 0,
|
||||
"KnownCalendarSeasons": [
|
||||
{
|
||||
"Activation": { "$date": { "$numberLong": "1733961600000" } },
|
||||
"Expiry": { "$date": { "$numberLong": "2000000000000" } },
|
||||
"Days": [
|
||||
{ "day": 6, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarKillEximusEasy" }] },
|
||||
{
|
||||
"day": 15,
|
||||
"events": [
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/MagazineCapacity" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/Armor" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/EnergyRestoration" }
|
||||
]
|
||||
},
|
||||
{ "day": 21, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarKillScaldraEnemiesEasy" }] },
|
||||
{
|
||||
"day": 25,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/BoosterPacks/CalendarMajorArtifactPack" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/Gameplay/NarmerSorties/ArchonCrystalGreen" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"day": 31,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/Recipes/Components/WeaponUtilityUnlockerBlueprint" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/Types/StoreItems/Packages/Calendar/CalendarKuvaBundleSmall" }
|
||||
]
|
||||
},
|
||||
{ "day": 43, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarKillEnemiesWithAbilitiesMedium" }] },
|
||||
{ "day": 45, "events": [{ "type": "CET_PLOT", "dialogueName": "/Lotus/Types/Gameplay/1999Wf/Dialogue/LettieDialogue_rom.dialogue", "dialogueConvo": "LettieBirthdayConvo" }] },
|
||||
{
|
||||
"day": 47,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/Types/StoreItems/Boosters/AffinityBooster3DayStoreItem" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/BoosterPacks/CalendarMajorArtifactPack" }
|
||||
]
|
||||
},
|
||||
{ "day": 48, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarKillScaldraEnemiesWithMeleeMedium" }] },
|
||||
{
|
||||
"day": 54,
|
||||
"events": [
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/CompanionsBuffNearbyPlayer" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/OrbsDuplicateOnPickup" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/FinisherChancePerComboMultiplier" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"day": 56,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/BoosterPacks/CalendarArtifactPack" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/Types/StoreItems/Packages/Calendar/CalendarKuvaBundleSmall" }
|
||||
]
|
||||
},
|
||||
{ "day": 71, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarKillTechrotEnemiesHard" }] },
|
||||
{
|
||||
"day": 77,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/Items/MiscItems/WeaponSecondaryArcaneUnlocker" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CircuitSilverSteelPathFusionBundle" }
|
||||
]
|
||||
},
|
||||
{ "day": 80, "events": [{ "type": "CET_CHALLENGE", "challenge": "/Lotus/Types/Challenges/Calendar1999/CalendarDestroyPropsMedium" }] },
|
||||
{
|
||||
"day": 83,
|
||||
"events": [
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/Recipes/Components/OrokinReactorBlueprint" },
|
||||
{ "type": "CET_REWARD", "reward": "/Lotus/StoreItems/Types/Items/MiscItems/WeaponUtilityUnlocker" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"day": 87,
|
||||
"events": [
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/EnergyOrbToAbilityRange" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/MeleeAttackSpeed" },
|
||||
{ "type": "CET_UPGRADE", "upgrade": "/Lotus/Upgrades/Calendar/CompanionDamage" }
|
||||
]
|
||||
}
|
||||
],
|
||||
"Season": "CST_WINTER",
|
||||
"YearIteration": 0,
|
||||
"Version": 17,
|
||||
"UpgradeAvaliabilityRequirements": ["/Lotus/Upgrades/Calendar/1999UpgradeApplicationRequirement"]
|
||||
}
|
||||
]
|
||||
"ForceLogoutVersion": 0
|
||||
}
|
||||
|
@ -611,6 +611,10 @@
|
||||
<input class="form-check-input" type="checkbox" id="noVendorPurchaseLimits" />
|
||||
<label class="form-check-label" for="noVendorPurchaseLimits" data-loc="cheats_noVendorPurchaseLimits"></label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="noDeathMarks" />
|
||||
<label class="form-check-label" for="noDeathMarks" data-loc="cheats_noDeathMarks"></label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="noKimCooldowns" />
|
||||
<label class="form-check-label" for="noKimCooldowns" data-loc="cheats_noKimCooldowns"></label>
|
||||
|
@ -138,6 +138,7 @@ dict = {
|
||||
cheats_noArgonCrystalDecay: `Argon-Kristalle verschwinden niemals`,
|
||||
cheats_noMasteryRankUpCooldown: `Keine Wartezeit beim Meisterschaftsrangaufstieg`,
|
||||
cheats_noVendorPurchaseLimits: `Keine Kaufbeschränkungen bei Händlern`,
|
||||
cheats_noDeathMarks: `[UNTRANSLATED] No Death Marks`,
|
||||
cheats_noKimCooldowns: `Keine Wartezeit bei KIM`,
|
||||
cheats_instantResourceExtractorDrones: `Sofortige Ressourcen-Extraktor-Drohnen`,
|
||||
cheats_noResourceExtractorDronesDamage: `Kein Schaden für Ressourcen-Extraktor-Drohnen`,
|
||||
|
@ -137,6 +137,7 @@ dict = {
|
||||
cheats_noArgonCrystalDecay: `No Argon Crystal Decay`,
|
||||
cheats_noMasteryRankUpCooldown: `No Mastery Rank Up Cooldown`,
|
||||
cheats_noVendorPurchaseLimits: `No Vendor Purchase Limits`,
|
||||
cheats_noDeathMarks: `No Death Marks`,
|
||||
cheats_noKimCooldowns: `No KIM Cooldowns`,
|
||||
cheats_instantResourceExtractorDrones: `Instant Resource Extractor Drones`,
|
||||
cheats_noResourceExtractorDronesDamage: `No Resource Extractor Drones Damage`,
|
||||
|
@ -138,6 +138,7 @@ dict = {
|
||||
cheats_noArgonCrystalDecay: `Sin descomposición de cristal de Argón`,
|
||||
cheats_noMasteryRankUpCooldown: `Sin tiempo de espera para rango de maestría`,
|
||||
cheats_noVendorPurchaseLimits: `Sin límite de compras de vendedores`,
|
||||
cheats_noDeathMarks: `[UNTRANSLATED] No Death Marks`,
|
||||
cheats_noKimCooldowns: `Sin tiempo de espera para conversaciones KIM`,
|
||||
cheats_instantResourceExtractorDrones: `Drones de extracción de recursos instantáneos`,
|
||||
cheats_noResourceExtractorDronesDamage: `Sin daño a los drones extractores de recursos`,
|
||||
|
@ -138,6 +138,7 @@ dict = {
|
||||
cheats_noArgonCrystalDecay: `[UNTRANSLATED] No Argon Crystal Decay`,
|
||||
cheats_noMasteryRankUpCooldown: `[UNTRANSLATED] No Mastery Rank Up Cooldown`,
|
||||
cheats_noVendorPurchaseLimits: `[UNTRANSLATED] No Vendor Purchase Limits`,
|
||||
cheats_noDeathMarks: `[UNTRANSLATED] No Death Marks`,
|
||||
cheats_noKimCooldowns: `[UNTRANSLATED] No KIM Cooldowns`,
|
||||
cheats_instantResourceExtractorDrones: `Ressources de drone d'extraction instantannées`,
|
||||
cheats_noResourceExtractorDronesDamage: `[UNTRANSLATED] No Resource Extractor Drones Damage`,
|
||||
|
@ -138,6 +138,7 @@ dict = {
|
||||
cheats_noArgonCrystalDecay: `Без распада аргоновых кристаллов`,
|
||||
cheats_noMasteryRankUpCooldown: `Повышение ранга мастерства без кулдауна`,
|
||||
cheats_noVendorPurchaseLimits: `Отсутствие лимитов на покупки у вендоров`,
|
||||
cheats_noDeathMarks: `[UNTRANSLATED] No Death Marks`,
|
||||
cheats_noKimCooldowns: `[UNTRANSLATED] No KIM Cooldowns`,
|
||||
cheats_instantResourceExtractorDrones: `Мгновенные Экстракторы Ресурсов`,
|
||||
cheats_noResourceExtractorDronesDamage: `[UNTRANSLATED] No Resource Extractor Drones Damage`,
|
||||
|
@ -138,6 +138,7 @@ dict = {
|
||||
cheats_noArgonCrystalDecay: `[UNTRANSLATED] No Argon Crystal Decay`,
|
||||
cheats_noMasteryRankUpCooldown: `[UNTRANSLATED] No Mastery Rank Up Cooldown`,
|
||||
cheats_noVendorPurchaseLimits: `[UNTRANSLATED] No Vendor Purchase Limits`,
|
||||
cheats_noDeathMarks: `[UNTRANSLATED] No Death Marks`,
|
||||
cheats_noKimCooldowns: `[UNTRANSLATED] No KIM Cooldowns`,
|
||||
cheats_instantResourceExtractorDrones: `即时资源采集无人机`,
|
||||
cheats_noResourceExtractorDronesDamage: `[UNTRANSLATED] No Resource Extractor Drones Damage`,
|
||||
|
Loading…
x
Reference in New Issue
Block a user