parent
9cc0c76ef5
commit
4d29fb634a
@ -75,6 +75,8 @@
|
||||
"ghoulEmergenceOverride": null,
|
||||
"plagueStarOverride": null,
|
||||
"starDaysOverride": null,
|
||||
"waterFightOverride": null,
|
||||
"waterFightRewardsOverride": null,
|
||||
"eidolonOverride": "",
|
||||
"vallisOverride": "",
|
||||
"duviriOverride": "",
|
||||
|
@ -13,7 +13,8 @@ import {
|
||||
addItems,
|
||||
combineInventoryChanges,
|
||||
getEffectiveAvatarImageType,
|
||||
getInventory
|
||||
getInventory,
|
||||
updateCurrency
|
||||
} from "@/src/services/inventoryService";
|
||||
import { logger } from "@/src/utils/logger";
|
||||
import { ExportFlavour } from "warframe-public-export-plus";
|
||||
@ -100,6 +101,9 @@ export const inboxController: RequestHandler = async (req, res) => {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (message.RegularCredits) {
|
||||
updateCurrency(inventory, -message.RegularCredits, false, inventoryChanges);
|
||||
}
|
||||
await inventory.save();
|
||||
res.json({ InventoryChanges: inventoryChanges });
|
||||
} else if (latestClientMessageId) {
|
||||
|
@ -47,6 +47,7 @@ export interface IMessage {
|
||||
acceptAction?: string;
|
||||
declineAction?: string;
|
||||
hasAccountAction?: boolean;
|
||||
RegularCredits?: number;
|
||||
}
|
||||
|
||||
export interface Arg {
|
||||
@ -139,7 +140,8 @@ const messageSchema = new Schema<IMessageDatabase>(
|
||||
contextInfo: String,
|
||||
acceptAction: String,
|
||||
declineAction: String,
|
||||
hasAccountAction: Boolean
|
||||
hasAccountAction: Boolean,
|
||||
RegularCredits: Number
|
||||
},
|
||||
{ id: false }
|
||||
);
|
||||
|
@ -87,6 +87,8 @@ export interface IConfig {
|
||||
ghoulEmergenceOverride?: boolean;
|
||||
plagueStarOverride?: boolean;
|
||||
starDaysOverride?: boolean;
|
||||
waterFightOverride?: boolean;
|
||||
waterFightRewardsOverride?: number;
|
||||
eidolonOverride?: string;
|
||||
vallisOverride?: string;
|
||||
duviriOverride?: string;
|
||||
|
@ -50,7 +50,7 @@ import { getEntriesUnsafe } from "@/src/utils/ts-utils";
|
||||
import { handleStoreItemAcquisition } from "@/src/services/purchaseService";
|
||||
import { IMissionCredits, IMissionReward } from "@/src/types/missionTypes";
|
||||
import { crackRelic } from "@/src/helpers/relicHelper";
|
||||
import { createMessage } from "@/src/services/inboxService";
|
||||
import { createMessage, IMessageCreationTemplate } from "@/src/services/inboxService";
|
||||
import kuriaMessage50 from "@/static/fixed_responses/kuriaMessages/fiftyPercent.json";
|
||||
import kuriaMessage75 from "@/static/fixed_responses/kuriaMessages/seventyFivePercent.json";
|
||||
import kuriaMessage100 from "@/static/fixed_responses/kuriaMessages/oneHundredPercent.json";
|
||||
@ -624,37 +624,93 @@ export const addMissionInventoryUpdates = async (
|
||||
if (goal && goal.Personal) {
|
||||
inventory.PersonalGoalProgress ??= [];
|
||||
const goalProgress = inventory.PersonalGoalProgress.find(x => x.goalId.equals(goal._id.$oid));
|
||||
if (goalProgress) {
|
||||
goalProgress.Best = Math.max(goalProgress.Best, uploadProgress.Best);
|
||||
goalProgress.Count += uploadProgress.Count;
|
||||
} else {
|
||||
if (!goalProgress) {
|
||||
inventory.PersonalGoalProgress.push({
|
||||
Best: uploadProgress.Best,
|
||||
Count: uploadProgress.Count,
|
||||
Tag: goal.Tag,
|
||||
goalId: new Types.ObjectId(goal._id.$oid)
|
||||
});
|
||||
}
|
||||
|
||||
const currentNode = inventoryUpdates.RewardInfo!.node;
|
||||
let currentMissionKey;
|
||||
if (currentNode == goal.Node) {
|
||||
currentMissionKey = goal.MissionKeyName;
|
||||
} else if (goal.ConcurrentNodes && goal.ConcurrentMissionKeyNames) {
|
||||
for (let i = 0; i < goal.ConcurrentNodes.length; i++) {
|
||||
if (currentNode == goal.ConcurrentNodes[i]) {
|
||||
currentMissionKey = goal.ConcurrentMissionKeyNames[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (currentMissionKey && currentMissionKey in goalMessagesByKey) {
|
||||
const totalCount = (goalProgress?.Count ?? 0) + uploadProgress.Count;
|
||||
let reward;
|
||||
|
||||
if (goal.InterimGoals && goal.InterimRewards) {
|
||||
for (let i = 0; i < goal.InterimGoals.length; i++) {
|
||||
if (
|
||||
goal.InterimGoals[i] &&
|
||||
goal.InterimGoals[i] <= totalCount &&
|
||||
(!goalProgress || goalProgress.Count < goal.InterimGoals[i]) &&
|
||||
goal.InterimRewards[i]
|
||||
) {
|
||||
reward = goal.InterimRewards[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (
|
||||
goal.Reward &&
|
||||
goal.Reward.items &&
|
||||
goal.MissionKeyName &&
|
||||
goal.MissionKeyName in goalMessagesByKey
|
||||
!reward &&
|
||||
goal.Goal &&
|
||||
goal.Goal <= totalCount &&
|
||||
(!goalProgress || goalProgress.Count < goal.Goal) &&
|
||||
goal.Reward
|
||||
) {
|
||||
// Send reward via inbox
|
||||
const info = goalMessagesByKey[goal.MissionKeyName];
|
||||
await createMessage(inventory.accountOwnerId, [
|
||||
{
|
||||
reward = goal.Reward;
|
||||
}
|
||||
if (
|
||||
!reward &&
|
||||
goal.BonusGoal &&
|
||||
goal.BonusGoal <= totalCount &&
|
||||
(!goalProgress || goalProgress.Count < goal.BonusGoal) &&
|
||||
goal.BonusReward
|
||||
) {
|
||||
reward = goal.BonusReward;
|
||||
}
|
||||
if (reward) {
|
||||
if (currentMissionKey in goalMessagesByKey) {
|
||||
// Send reward via inbox
|
||||
const info = goalMessagesByKey[currentMissionKey];
|
||||
const message: IMessageCreationTemplate = {
|
||||
sndr: info.sndr,
|
||||
msg: info.msg,
|
||||
att: goal.Reward.items.map(x => (isStoreItem(x) ? fromStoreItem(x) : x)),
|
||||
sub: info.sub,
|
||||
icon: info.icon,
|
||||
highPriority: true
|
||||
};
|
||||
|
||||
if (reward.items) {
|
||||
message.att = reward.items.map(x => (isStoreItem(x) ? fromStoreItem(x) : x));
|
||||
}
|
||||
]);
|
||||
if (reward.countedItems) {
|
||||
message.countedAtt = reward.countedItems;
|
||||
}
|
||||
if (reward.credits) {
|
||||
message.RegularCredits = reward.credits;
|
||||
}
|
||||
|
||||
await createMessage(inventory.accountOwnerId, [message]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (goalProgress) {
|
||||
goalProgress.Best = Math.max(goalProgress.Best, uploadProgress.Best);
|
||||
goalProgress.Count += uploadProgress.Count;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -1011,8 +1067,16 @@ export const addMissionRewards = async (
|
||||
|
||||
if (rewardInfo.goalId) {
|
||||
const goal = getWorldState().Goals.find(x => x._id.$oid == rewardInfo.goalId);
|
||||
if (goal?.MissionKeyName) {
|
||||
levelKeyName = goal.MissionKeyName;
|
||||
if (goal) {
|
||||
if (rewardInfo.node == goal.Node && goal.MissionKeyName) levelKeyName = goal.MissionKeyName;
|
||||
if (goal.ConcurrentNodes && goal.ConcurrentMissionKeyNames) {
|
||||
for (let i = 0; i < goal.ConcurrentNodes.length && i < goal.ConcurrentMissionKeyNames.length; i++) {
|
||||
if (rewardInfo.node == goal.ConcurrentNodes[i]) {
|
||||
levelKeyName = goal.ConcurrentMissionKeyNames[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -2149,5 +2213,29 @@ const goalMessagesByKey: Record<string, { sndr: string; msg: string; sub: string
|
||||
msg: "/Lotus/Language/Messages/GalleonRobbery2025RewardMsgC",
|
||||
sub: "/Lotus/Language/Messages/GalleonRobbery2025MissionTitleC",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/VayHekPortrait.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/TacAlertKeyWaterFightA": {
|
||||
sndr: "/Lotus/Language/Bosses/BossKelaDeThaym",
|
||||
msg: "/Lotus/Language/Inbox/WaterFightRewardMsgA",
|
||||
sub: "/Lotus/Language/Inbox/WaterFightRewardSubjectA",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Grineer/KelaDeThaym.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/TacAlertKeyWaterFightB": {
|
||||
sndr: "/Lotus/Language/Bosses/BossKelaDeThaym",
|
||||
msg: "/Lotus/Language/Inbox/WaterFightRewardMsgB",
|
||||
sub: "/Lotus/Language/Inbox/WaterFightRewardSubjectB",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Grineer/KelaDeThaym.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/TacAlertKeyWaterFightC": {
|
||||
sndr: "/Lotus/Language/Bosses/BossKelaDeThaym",
|
||||
msg: "/Lotus/Language/Inbox/WaterFightRewardMsgC",
|
||||
sub: "/Lotus/Language/Inbox/WaterFightRewardSubjectC",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Grineer/KelaDeThaym.png"
|
||||
},
|
||||
"/Lotus/Types/Keys/TacAlertKeyWaterFightD": {
|
||||
sndr: "/Lotus/Language/Bosses/BossKelaDeThaym",
|
||||
msg: "/Lotus/Language/Inbox/WaterFightRewardMsgD",
|
||||
sub: "/Lotus/Language/Inbox/WaterFightRewardSubjectD",
|
||||
icon: "/Lotus/Interface/Icons/Npcs/Grineer/KelaDeThaym.png"
|
||||
}
|
||||
};
|
||||
|
@ -1392,6 +1392,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
||||
Sorties: [],
|
||||
LiteSorties: [],
|
||||
ActiveMissions: [],
|
||||
FlashSales: [],
|
||||
GlobalUpgrades: [],
|
||||
Invasions: [],
|
||||
VoidTraders: [],
|
||||
@ -1401,7 +1402,8 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
||||
EndlessXpChoices: [],
|
||||
KnownCalendarSeasons: [],
|
||||
...staticWorldState,
|
||||
SyndicateMissions: [...staticWorldState.SyndicateMissions]
|
||||
SyndicateMissions: [...staticWorldState.SyndicateMissions],
|
||||
InGameMarket: staticWorldState.InGameMarket
|
||||
};
|
||||
|
||||
// Old versions seem to really get hung up on not being able to load these.
|
||||
@ -1629,6 +1631,299 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
||||
});
|
||||
}
|
||||
|
||||
const firstAugustWeekday = new Date(Date.UTC(date.getUTCFullYear(), 7, 1)).getUTCDay();
|
||||
const firstAugustWednesdayOffset = (3 - firstAugustWeekday + 7) % 7;
|
||||
const waterFightStart = Date.UTC(date.getUTCFullYear(), 7, 1 + firstAugustWednesdayOffset, 15);
|
||||
|
||||
const firstSeptemberWeekday = new Date(Date.UTC(date.getUTCFullYear(), 8, 1)).getUTCDay();
|
||||
const firstSeptemberWednesdayOffset = (3 - firstSeptemberWeekday + 7) % 7;
|
||||
const waterFightEnd = Date.UTC(date.getUTCFullYear(), 8, 1 + firstSeptemberWednesdayOffset, 15);
|
||||
|
||||
const isWaterFightActive = timeMs >= waterFightStart && timeMs < waterFightEnd;
|
||||
logger.debug(isWaterFightActive);
|
||||
if (config.worldState?.waterFightOverride ?? isWaterFightActive) {
|
||||
const activationTimeStamp = config.worldState?.waterFightOverride
|
||||
? "1699372800000"
|
||||
: waterFightStart.toString();
|
||||
const expiryTimeStamp = config.worldState?.waterFightOverride ? "2000000000000" : waterFightEnd.toString();
|
||||
const rewards = [
|
||||
[
|
||||
{
|
||||
credits: 50000,
|
||||
items: ["/Lotus/StoreItems/Upgrades/Skins/Weapons/Redeemer/RedeemerRelayWaterSkin"]
|
||||
},
|
||||
{
|
||||
credits: 50000,
|
||||
items: ["/Lotus/StoreItems/Types/Items/MiscItems/PhotoboothTileHydroidRelay"]
|
||||
},
|
||||
{
|
||||
credits: 50000,
|
||||
items: ["/Lotus/StoreItems/Types/Items/ShipDecos/RelayHydroidBobbleHead"]
|
||||
},
|
||||
{
|
||||
items: [
|
||||
"/Lotus/StoreItems/Types/Items/MiscItems/OrokinReactor",
|
||||
"/Lotus/StoreItems/Upgrades/Skins/Clan/BountyHunterBadgeItem"
|
||||
]
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
credits: 50000,
|
||||
items: ["/Lotus/StoreItems/Upgrades/Skins/Sigils/DogDays2023ASigil"],
|
||||
countedItems: [
|
||||
{
|
||||
ItemType: "/Lotus/Types/Items/MiscItems/WaterFightBucks",
|
||||
ItemCount: 25
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
credits: 50000,
|
||||
items: ["/Lotus/StoreItems/Types/Items/ShipDecos/Plushies/PlushyBeachKavat"],
|
||||
countedItems: [
|
||||
{
|
||||
ItemType: "/Lotus/Types/Items/MiscItems/WaterFightBucks",
|
||||
ItemCount: 50
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
credits: 50000,
|
||||
items: ["/Lotus/StoreItems/Types/Items/ShipDecos/Plushies/PlushyRucksackKubrow"],
|
||||
countedItems: [
|
||||
{
|
||||
ItemType: "/Lotus/Types/Items/MiscItems/WaterFightBucks",
|
||||
ItemCount: 75
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
items: ["/Lotus/StoreItems/Types/Items/ShipDecos/LisetPropCleaningDroneBeachcomber"],
|
||||
countedItems: [
|
||||
{
|
||||
ItemType: "/Lotus/Types/Items/MiscItems/WaterFightBucks",
|
||||
ItemCount: 100
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
credits: 50000,
|
||||
items: ["/Lotus/StoreItems/Types/StoreItems/AvatarImages/Seasonal/AvatarImageDogDays2024Glyph"],
|
||||
countedItems: [
|
||||
{
|
||||
ItemType: "/Lotus/Types/Items/MiscItems/WaterFightBucks",
|
||||
ItemCount: 25
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
credits: 50000,
|
||||
items: ["/Lotus/StoreItems/Types/Items/ShipDecos/DogDays2024Poster"],
|
||||
countedItems: [
|
||||
{
|
||||
ItemType: "/Lotus/Types/Items/MiscItems/WaterFightBucks",
|
||||
ItemCount: 50
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
credits: 50000,
|
||||
items: ["/Lotus/StoreItems/Upgrades/Skins/Clan/DogDaysKubrowBadgeItem"],
|
||||
countedItems: [
|
||||
{
|
||||
ItemType: "/Lotus/Types/Items/MiscItems/WaterFightBucks",
|
||||
ItemCount: 75
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
items: ["/Lotus/StoreItems/Types/Items/ShipDecos/DogDays2024LisetPropCleaningDroneBeachcomber"],
|
||||
countedItems: [
|
||||
{
|
||||
ItemType: "/Lotus/Types/Items/MiscItems/WaterFightBucks",
|
||||
ItemCount: 100
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
credits: 50000,
|
||||
items: ["/Lotus/StoreItems/Types/StoreItems/AvatarImages/AvatarImageDogDaysHydroidGlyph"],
|
||||
countedItems: [
|
||||
{
|
||||
ItemType: "/Lotus/Types/Items/MiscItems/WaterFightBucks",
|
||||
ItemCount: 25
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
credits: 50000,
|
||||
items: ["/Lotus/StoreItems/Types/StoreItems/AvatarImages/AvatarImageDogDaysLokiGlyph"],
|
||||
countedItems: [
|
||||
{
|
||||
ItemType: "/Lotus/Types/Items/MiscItems/WaterFightBucks",
|
||||
ItemCount: 50
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
credits: 50000,
|
||||
items: ["/Lotus/StoreItems/Types/StoreItems/AvatarImages/AvatarImageDogDaysNovaGlyph"],
|
||||
countedItems: [
|
||||
{
|
||||
ItemType: "/Lotus/Types/Items/MiscItems/WaterFightBucks",
|
||||
ItemCount: 75
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
credits: 50000,
|
||||
items: ["/Lotus/StoreItems/Types/StoreItems/AvatarImages/AvatarImageDogDaysValkyrGlyph"],
|
||||
countedItems: [
|
||||
{
|
||||
ItemType: "/Lotus/Types/Items/MiscItems/WaterFightBucks",
|
||||
ItemCount: 100
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
];
|
||||
|
||||
const year = config.worldState?.waterFightRewardsOverride ?? 3;
|
||||
|
||||
worldState.Goals.push({
|
||||
_id: {
|
||||
$oid: ((waterFightStart / 1000) & 0xffffffff).toString(16).padStart(8, "0") + "c57487c3768936df"
|
||||
},
|
||||
Activation: { $date: { $numberLong: activationTimeStamp } },
|
||||
Expiry: { $date: { $numberLong: expiryTimeStamp } },
|
||||
Count: 0,
|
||||
Goal: 100,
|
||||
InterimGoals: [25, 50],
|
||||
BonusGoal: 200,
|
||||
Success: 0,
|
||||
Personal: true,
|
||||
Bounty: true,
|
||||
ClampNodeScores: true,
|
||||
Node: "EventNode25",
|
||||
ConcurrentMissionKeyNames: [
|
||||
"/Lotus/Types/Keys/TacAlertKeyWaterFightB",
|
||||
"/Lotus/Types/Keys/TacAlertKeyWaterFightC",
|
||||
"/Lotus/Types/Keys/TacAlertKeyWaterFightD"
|
||||
],
|
||||
ConcurrentNodeReqs: [25, 50, 100],
|
||||
ConcurrentNodes: ["EventNode24", "EventNode34", "EventNode35"],
|
||||
MissionKeyName: "/Lotus/Types/Keys/TacAlertKeyWaterFightA",
|
||||
Faction: "FC_CORPUS",
|
||||
Desc: "/Lotus/Language/Alerts/TacAlertWaterFight",
|
||||
Icon: "/Lotus/Interface/Icons/StoreIcons/Emblems/SplashEventIcon.png",
|
||||
Tag: "WaterFight",
|
||||
InterimRewards: rewards[year].slice(0, 2),
|
||||
Reward: rewards[year][2],
|
||||
BonusReward: rewards[year][3],
|
||||
ScoreVar: "Team1Score",
|
||||
NightLevel: "/Lotus/Levels/GrineerBeach/GrineerBeachEventNight.level"
|
||||
});
|
||||
|
||||
const baseStoreItem = {
|
||||
ShowInMarket: true,
|
||||
HideFromMarket: false,
|
||||
SupporterPack: false,
|
||||
Discount: 0,
|
||||
BogoBuy: 0,
|
||||
BogoGet: 0,
|
||||
StartDate: { $date: { $numberLong: activationTimeStamp } },
|
||||
EndDate: { $date: { $numberLong: expiryTimeStamp } },
|
||||
ProductExpiryOverride: { $date: { $numberLong: expiryTimeStamp } }
|
||||
};
|
||||
|
||||
const storeItems = [
|
||||
{
|
||||
TypeName: "/Lotus/Types/StoreItems/Packages/WaterFightNoggleBundle",
|
||||
PremiumOverride: 240,
|
||||
RegularOverride: 0
|
||||
},
|
||||
{
|
||||
TypeName: "/Lotus/Types/Items/ShipDecos/Events/WFBeastMasterBobbleHead",
|
||||
PremiumOverride: 35,
|
||||
RegularOverride: 0
|
||||
},
|
||||
{
|
||||
TypeName: "/Lotus/Types/Items/ShipDecos/Events/WFChargerBobbleHead",
|
||||
PremiumOverride: 35,
|
||||
RegularOverride: 0
|
||||
},
|
||||
{
|
||||
TypeName: "/Lotus/Types/Items/ShipDecos/Events/WFEngineerBobbleHead",
|
||||
PremiumOverride: 35,
|
||||
RegularOverride: 0
|
||||
},
|
||||
{
|
||||
TypeName: "/Lotus/Types/Items/ShipDecos/Events/WFGruntBobbleHead",
|
||||
PremiumOverride: 35,
|
||||
RegularOverride: 0
|
||||
},
|
||||
{
|
||||
TypeName: "/Lotus/Types/StoreItems/AvatarImages/ImagePopsicleGrineerPurple",
|
||||
PremiumOverride: 0,
|
||||
RegularOverride: 1
|
||||
},
|
||||
{
|
||||
TypeName: "/Lotus/Types/Items/ShipDecos/Events/WFHealerBobbleHead",
|
||||
PremiumOverride: 35,
|
||||
RegularOverride: 0
|
||||
},
|
||||
{
|
||||
TypeName: "/Lotus/Types/Items/ShipDecos/Events/WFHeavyBobbleHead",
|
||||
PremiumOverride: 35,
|
||||
RegularOverride: 0
|
||||
},
|
||||
{
|
||||
TypeName: "/Lotus/Types/Items/ShipDecos/Events/WFHellionBobbleHead",
|
||||
PremiumOverride: 35,
|
||||
RegularOverride: 0
|
||||
},
|
||||
{
|
||||
TypeName: "/Lotus/Types/Items/ShipDecos/Events/WFSniperBobbleHead",
|
||||
PremiumOverride: 35,
|
||||
RegularOverride: 0
|
||||
},
|
||||
{
|
||||
TypeName: "/Lotus/Types/Items/ShipDecos/Events/WFTankBobbleHead",
|
||||
PremiumOverride: 35,
|
||||
RegularOverride: 0
|
||||
},
|
||||
{
|
||||
TypeName: "/Lotus/Types/StoreItems/SuitCustomizations/ColourPickerRollers",
|
||||
PremiumOverride: 75,
|
||||
RegularOverride: 0
|
||||
}
|
||||
];
|
||||
|
||||
worldState.FlashSales.push(...storeItems.map(item => ({ ...baseStoreItem, ...item })));
|
||||
|
||||
const seasonalItems = storeItems.map(item => item.TypeName);
|
||||
|
||||
const seasonalCategory = worldState.InGameMarket.LandingPage.Categories.find(c => c.CategoryName == "SEASONAL");
|
||||
|
||||
if (seasonalCategory) {
|
||||
seasonalCategory.Items ??= [];
|
||||
seasonalCategory.Items.push(...seasonalItems);
|
||||
} else {
|
||||
worldState.InGameMarket.LandingPage.Categories.push({
|
||||
CategoryName: "SEASONAL",
|
||||
Name: "/Lotus/Language/Store/SeasonalCategoryTitle",
|
||||
Icon: "seasonal",
|
||||
AddToMenu: true,
|
||||
Items: seasonalItems
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Nightwave Challenges
|
||||
const nightwaveSyndicateTag = getNightwaveSyndicateTag(buildLabel);
|
||||
if (nightwaveSyndicateTag) {
|
||||
|
@ -5,12 +5,14 @@ export interface IWorldState {
|
||||
Version: number; // for goals
|
||||
BuildLabel: string;
|
||||
Time: number;
|
||||
InGameMarket: IInGameMarket;
|
||||
Goals: IGoal[];
|
||||
Alerts: [];
|
||||
Sorties: ISortie[];
|
||||
LiteSorties: ILiteSortie[];
|
||||
SyndicateMissions: ISyndicateMissionInfo[];
|
||||
ActiveMissions: IFissure[];
|
||||
FlashSales: IFlashSale[];
|
||||
GlobalUpgrades: IGlobalUpgrade[];
|
||||
Invasions: IInvasion[];
|
||||
NodeOverrides: INodeOverride[];
|
||||
@ -39,6 +41,8 @@ export interface IGoal {
|
||||
Expiry: IMongoDate;
|
||||
Count?: number;
|
||||
Goal?: number;
|
||||
InterimGoals?: number[];
|
||||
BonusGoal?: number;
|
||||
HealthPct?: number;
|
||||
Success?: number;
|
||||
Personal?: boolean;
|
||||
@ -53,16 +57,24 @@ export interface IGoal {
|
||||
Tag: string;
|
||||
Node?: string;
|
||||
VictimNode?: string;
|
||||
ConcurrentMissionKeyNames?: string[];
|
||||
ConcurrentNodeReqs?: number[];
|
||||
ConcurrentNodes?: string[];
|
||||
RegionIdx?: number;
|
||||
Regions?: number[];
|
||||
MissionKeyName?: string;
|
||||
Reward?: IMissionReward;
|
||||
InterimRewards?: IMissionReward[];
|
||||
BonusReward?: IMissionReward;
|
||||
|
||||
JobAffiliationTag?: string;
|
||||
Jobs?: ISyndicateJob[];
|
||||
PreviousJobs?: ISyndicateJob[];
|
||||
JobCurrentVersion?: IOid;
|
||||
JobPreviousVersion?: IOid;
|
||||
|
||||
ScoreVar?: string;
|
||||
NightLevel?: string;
|
||||
}
|
||||
|
||||
export interface ISyndicateJob {
|
||||
@ -321,6 +333,37 @@ export type TCircuitGameMode =
|
||||
| "Assassination"
|
||||
| "Alchemy";
|
||||
|
||||
export interface IFlashSale {
|
||||
TypeName: string;
|
||||
ShowInMarket: boolean;
|
||||
HideFromMarket: boolean;
|
||||
SupporterPack: boolean;
|
||||
Discount: number;
|
||||
BogoBuy: number;
|
||||
BogoGet: number;
|
||||
PremiumOverride: number;
|
||||
RegularOverride: number;
|
||||
ProductExpiryOverride?: IMongoDate;
|
||||
StartDate: IMongoDate;
|
||||
EndDate: IMongoDate;
|
||||
}
|
||||
|
||||
export interface IInGameMarket {
|
||||
LandingPage: ILandingPage;
|
||||
}
|
||||
|
||||
export interface ILandingPage {
|
||||
Categories: IGameMarketCategory[];
|
||||
}
|
||||
|
||||
export interface IGameMarketCategory {
|
||||
CategoryName: string;
|
||||
Name: string;
|
||||
Icon: string;
|
||||
AddToMenu?: boolean;
|
||||
Items?: string[];
|
||||
}
|
||||
|
||||
export interface ITmp {
|
||||
cavabegin: string;
|
||||
PurchasePlatformLockEnabled: boolean; // Seems unused
|
||||
|
@ -970,6 +970,26 @@
|
||||
<option value="false" data-loc="disabled"></option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group mt-2 d-flex gap-2">
|
||||
<div class="flex-fill">
|
||||
<label class="form-label" for="worldState.waterFightOverride" data-loc="worldState_waterFight"></label>
|
||||
<select class="form-control" id="worldState.waterFightOverride" data-default="null">
|
||||
<option value="null" data-loc="normal"></option>
|
||||
<option value="true" data-loc="enabled"></option>
|
||||
<option value="false" data-loc="disabled"></option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="flex-fill">
|
||||
<label class="form-label" for="worldState.waterFightRewardsOverride" data-loc="worldState_waterFightRewards"></label>
|
||||
<select class="form-control" id="worldState.waterFightRewardsOverride" data-default="null">
|
||||
<option value="null" data-loc="normal"></option>
|
||||
<option value="3" data-loc="worldState_from_2025"></option>
|
||||
<option value="2" data-loc="worldState_from_2024"></option>
|
||||
<option value="1" data-loc="worldState_from_2023"></option>
|
||||
<option value="0" data-loc="worldState_pre_2023"></option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group mt-2">
|
||||
<label class="form-label" for="worldState.eidolonOverride" data-loc="worldState_eidolonOverride"></label>
|
||||
<select class="form-control" id="worldState.eidolonOverride" data-default="">
|
||||
|
@ -248,6 +248,12 @@ dict = {
|
||||
worldState_galleonOfGhouls: `Galeone der Ghule`,
|
||||
worldState_ghoulEmergence: `Ghul Ausrottung`,
|
||||
worldState_plagueStar: `Plagenstern`,
|
||||
worldState_waterFight: `Hitzefrei`,
|
||||
worldState_waterFightRewards: `[UNTRANSLATED] Dog Days Rewards`,
|
||||
worldState_from_2025: `[UNTRANSLATED] from 2025`,
|
||||
worldState_from_2024: `[UNTRANSLATED] from 2024`,
|
||||
worldState_from_2023: `[UNTRANSLATED] from 2023`,
|
||||
worldState_pre_2023: `[UNTRANSLATED] pre 2023`,
|
||||
enabled: `Aktiviert`,
|
||||
disabled: `Deaktiviert`,
|
||||
worldState_we1: `Wochenende 1`,
|
||||
|
@ -247,6 +247,12 @@ dict = {
|
||||
worldState_galleonOfGhouls: `Galleon of Ghouls`,
|
||||
worldState_ghoulEmergence: `Ghoul Purge`,
|
||||
worldState_plagueStar: `Plague Star`,
|
||||
worldState_waterFight: `Dog Days`,
|
||||
worldState_waterFightRewards: `Dog Days Rewards`,
|
||||
worldState_from_2025: `from 2025`,
|
||||
worldState_from_2024: `from 2024`,
|
||||
worldState_from_2023: `from 2023`,
|
||||
worldState_pre_2023: `pre 2023`,
|
||||
enabled: `Enabled`,
|
||||
disabled: `Disabled`,
|
||||
worldState_we1: `Weekend 1`,
|
||||
|
@ -248,6 +248,12 @@ dict = {
|
||||
worldState_galleonOfGhouls: `Galeón de Gules`,
|
||||
worldState_ghoulEmergence: `Purga de Gules`,
|
||||
worldState_plagueStar: `Estrella Infestada`,
|
||||
worldState_waterFight: `Canícula`,
|
||||
worldState_waterFightRewards: `[UNTRANSLATED] Dog Days Rewards`,
|
||||
worldState_from_2025: `[UNTRANSLATED] from 2025`,
|
||||
worldState_from_2024: `[UNTRANSLATED] from 2024`,
|
||||
worldState_from_2023: `[UNTRANSLATED] from 2023`,
|
||||
worldState_pre_2023: `[UNTRANSLATED] pre 2023`,
|
||||
enabled: `Activado`,
|
||||
disabled: `Desactivado`,
|
||||
worldState_we1: `Semana 1`,
|
||||
|
@ -248,6 +248,12 @@ dict = {
|
||||
worldState_galleonOfGhouls: `Galion des Goules`,
|
||||
worldState_ghoulEmergence: `Purge des Goules`,
|
||||
worldState_plagueStar: `Fléau Céleste`,
|
||||
worldState_waterFight: `Bataille d'Eau`,
|
||||
worldState_waterFightRewards: `[UNTRANSLATED] Dog Days Rewards`,
|
||||
worldState_from_2025: `[UNTRANSLATED] from 2025`,
|
||||
worldState_from_2024: `[UNTRANSLATED] from 2024`,
|
||||
worldState_from_2023: `[UNTRANSLATED] from 2023`,
|
||||
worldState_pre_2023: `[UNTRANSLATED] pre 2023`,
|
||||
enabled: `Activé`,
|
||||
disabled: `Désactivé`,
|
||||
worldState_we1: `Weekend 1`,
|
||||
|
@ -248,6 +248,12 @@ dict = {
|
||||
worldState_galleonOfGhouls: `Галеон Гулей`,
|
||||
worldState_ghoulEmergence: `Избавление от гулей`,
|
||||
worldState_plagueStar: `Чумная звезда`,
|
||||
worldState_waterFight: `Знойные дни`,
|
||||
worldState_waterFightRewards: `Награды Знойных дней`,
|
||||
worldState_from_2025: `из 2025`,
|
||||
worldState_from_2024: `из 2024`,
|
||||
worldState_from_2023: `из 2023`,
|
||||
worldState_pre_2023: `до 2023`,
|
||||
enabled: `Включено`,
|
||||
disabled: `Отключено`,
|
||||
worldState_we1: `Выходные 1`,
|
||||
|
@ -248,6 +248,12 @@ dict = {
|
||||
worldState_galleonOfGhouls: `Гульський Галеон`,
|
||||
worldState_ghoulEmergence: `Зачищення від гулів`,
|
||||
worldState_plagueStar: `Морова зірка`,
|
||||
worldState_waterFight: `Спекотні дні`,
|
||||
worldState_waterFightRewards: `[UNTRANSLATED] Dog Days Rewards`,
|
||||
worldState_from_2025: `[UNTRANSLATED] from 2025`,
|
||||
worldState_from_2024: `[UNTRANSLATED] from 2024`,
|
||||
worldState_from_2023: `[UNTRANSLATED] from 2023`,
|
||||
worldState_pre_2023: `[UNTRANSLATED] pre 2023`,
|
||||
enabled: `Увімкнено`,
|
||||
disabled: `Вимкнено`,
|
||||
worldState_we1: `Вихідні 1`,
|
||||
|
@ -248,6 +248,12 @@ dict = {
|
||||
worldState_galleonOfGhouls: `战术警报:尸鬼的帆船战舰`,
|
||||
worldState_ghoulEmergence: `尸鬼净化`,
|
||||
worldState_plagueStar: `瘟疫之星`,
|
||||
worldState_waterFight: `三伏天`,
|
||||
worldState_waterFightRewards: `[UNTRANSLATED] Dog Days Rewards`,
|
||||
worldState_from_2025: `[UNTRANSLATED] from 2025`,
|
||||
worldState_from_2024: `[UNTRANSLATED] from 2024`,
|
||||
worldState_from_2023: `[UNTRANSLATED] from 2023`,
|
||||
worldState_pre_2023: `[UNTRANSLATED] pre 2023`,
|
||||
enabled: `启用`,
|
||||
disabled: `关闭/取消配置`,
|
||||
worldState_we1: `活动阶段:第一周`,
|
||||
|
Loading…
x
Reference in New Issue
Block a user