feat: thermia fractures (#2670)
Re #1103 Reviewed-on: #2670 Reviewed-by: Sainan <63328889+sainan@users.noreply.github.com> Co-authored-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Co-committed-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com>
This commit is contained in:
parent
bfc4048721
commit
7dc44e81ec
@ -86,6 +86,8 @@
|
||||
"bellyOfTheBeastProgressOverride": 0,
|
||||
"eightClaw": false,
|
||||
"eightClawProgressOverride": 0,
|
||||
"thermiaFracturesOverride": null,
|
||||
"thermiaFracturesProgressOverride": 0,
|
||||
"eidolonOverride": "",
|
||||
"vallisOverride": "",
|
||||
"duviriOverride": "",
|
||||
|
||||
@ -98,6 +98,8 @@ export interface IConfig {
|
||||
bellyOfTheBeastProgressOverride?: number;
|
||||
eightClaw?: boolean;
|
||||
eightClawProgressOverride?: number;
|
||||
thermiaFracturesOverride?: boolean;
|
||||
thermiaFracturesProgressOverride?: number;
|
||||
eidolonOverride?: string;
|
||||
vallisOverride?: string;
|
||||
duviriOverride?: string;
|
||||
|
||||
@ -640,7 +640,7 @@ export const addMissionInventoryUpdates = async (
|
||||
}
|
||||
|
||||
const currentNode = inventoryUpdates.RewardInfo!.node;
|
||||
let currentMissionKey;
|
||||
let currentMissionKey: string | undefined;
|
||||
if (currentNode == goal.Node) {
|
||||
currentMissionKey = goal.MissionKeyName;
|
||||
} else if (goal.ConcurrentNodes && goal.ConcurrentMissionKeyNames) {
|
||||
@ -651,15 +651,15 @@ export const addMissionInventoryUpdates = async (
|
||||
}
|
||||
}
|
||||
}
|
||||
if (currentMissionKey && currentMissionKey in goalMessagesByKey) {
|
||||
let countBeforeUpload = goalProgress?.Count ?? 0;
|
||||
let totalCount = countBeforeUpload + uploadProgress.Count;
|
||||
if (goal.Best) {
|
||||
countBeforeUpload = goalProgress?.Best ?? 0;
|
||||
totalCount = uploadProgress.Best;
|
||||
}
|
||||
let reward;
|
||||
const rewards = [];
|
||||
let countBeforeUpload = goalProgress?.Count ?? 0;
|
||||
let totalCount = countBeforeUpload + uploadProgress.Count;
|
||||
if (goal.Best) {
|
||||
countBeforeUpload = goalProgress?.Best ?? 0;
|
||||
totalCount = uploadProgress.Best;
|
||||
}
|
||||
|
||||
{
|
||||
if (goal.InterimGoals && goal.InterimRewards) {
|
||||
for (let i = 0; i < goal.InterimGoals.length; i++) {
|
||||
if (
|
||||
@ -668,70 +668,95 @@ export const addMissionInventoryUpdates = async (
|
||||
(!goalProgress || countBeforeUpload < goal.InterimGoals[i]) &&
|
||||
goal.InterimRewards[i]
|
||||
) {
|
||||
reward = goal.InterimRewards[i];
|
||||
rewards.push(goal.InterimRewards[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (
|
||||
!reward &&
|
||||
goal.Goal &&
|
||||
goal.Goal <= totalCount &&
|
||||
(!goalProgress || countBeforeUpload < goal.Goal) &&
|
||||
goal.Reward
|
||||
) {
|
||||
reward = goal.Reward;
|
||||
rewards.push(goal.Reward);
|
||||
}
|
||||
if (
|
||||
!reward &&
|
||||
goal.BonusGoal &&
|
||||
goal.BonusGoal <= totalCount &&
|
||||
(!goalProgress || countBeforeUpload < 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,
|
||||
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]);
|
||||
}
|
||||
rewards.push(goal.BonusReward);
|
||||
}
|
||||
}
|
||||
|
||||
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) {
|
||||
goalProgress.Best = Math.max(goalProgress.Best!, uploadProgress.Best);
|
||||
goalProgress.Count += uploadProgress.Count;
|
||||
@ -2617,3 +2642,38 @@ const goalMessagesByKey: Record<string, { sndr: string; msg: string; sub: string
|
||||
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
|
||||
const nightwaveSyndicateTag = getNightwaveSyndicateTag(buildLabel);
|
||||
if (nightwaveSyndicateTag) {
|
||||
@ -2727,7 +2808,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
||||
: Date.UTC(
|
||||
date.getUTCFullYear(),
|
||||
date.getUTCMonth(),
|
||||
date.getUTCDate() + (day - ghoulsCycleDay + 17)
|
||||
date.getUTCDate() + activeStartDay
|
||||
).toString()
|
||||
}
|
||||
},
|
||||
@ -2738,7 +2819,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
||||
: Date.UTC(
|
||||
date.getUTCFullYear(),
|
||||
date.getUTCMonth(),
|
||||
date.getUTCDate() + (day - ghoulsCycleDay + 21)
|
||||
date.getUTCDate() + activeEndDay
|
||||
).toString()
|
||||
}
|
||||
},
|
||||
|
||||
@ -43,7 +43,7 @@ export interface IGoal {
|
||||
Count?: number;
|
||||
HealthPct?: number;
|
||||
|
||||
Icon: string;
|
||||
Icon?: string;
|
||||
Desc: string;
|
||||
ToolTip?: string;
|
||||
Faction?: string;
|
||||
@ -94,6 +94,9 @@ export interface IGoal {
|
||||
MissionKeyRotation?: string[];
|
||||
MissionKeyRotationInterval?: number;
|
||||
|
||||
OptionalInMission?: boolean;
|
||||
UpgradeIds?: IOid[];
|
||||
|
||||
NightLevel?: string;
|
||||
}
|
||||
|
||||
@ -128,8 +131,9 @@ export interface IGlobalUpgrade {
|
||||
UpgradeType: string;
|
||||
OperationType: string;
|
||||
Value: number;
|
||||
LocalizeTag: string;
|
||||
LocalizeDescTag: string;
|
||||
LocalizeTag?: string;
|
||||
LocalizeDescTag?: string;
|
||||
Nodes?: string[];
|
||||
}
|
||||
|
||||
export interface IInvasion {
|
||||
@ -183,7 +187,7 @@ export interface INodeOverride {
|
||||
Seed?: number;
|
||||
LevelOverride?: string;
|
||||
Faction?: string;
|
||||
CustomNpcEncounters?: string;
|
||||
CustomNpcEncounters?: string[];
|
||||
}
|
||||
|
||||
export interface ISortie {
|
||||
|
||||
@ -1103,6 +1103,25 @@
|
||||
</form>
|
||||
</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">
|
||||
<label class="form-label" for="worldState.eidolonOverride" data-loc="worldState_eidolonOverride"></label>
|
||||
<select class="form-control" id="worldState.eidolonOverride" data-default="">
|
||||
|
||||
@ -265,6 +265,8 @@ dict = {
|
||||
worldState_bellyOfTheBeastProgressOverride: `[UNTRANSLATED] Belly of the Beast Progress`,
|
||||
worldState_eightClaw: `Acht Klauen`,
|
||||
worldState_eightClawProgressOverride: `[UNTRANSLATED] Eight Claw Progress`,
|
||||
worldState_thermiaFractures: `Thermische Risse`,
|
||||
worldState_thermiaFracturesProgressOverride: `[UNTRANSLATED] Thermia Fractures Progress`,
|
||||
worldState_from_year: `[UNTRANSLATED] from |VAL|`,
|
||||
worldState_pre_year: `[UNTRANSLATED] pre |VAL|`,
|
||||
worldState_week: `[UNTRANSLATED] Week |VAL|`,
|
||||
|
||||
@ -264,6 +264,8 @@ dict = {
|
||||
worldState_bellyOfTheBeastProgressOverride: `Belly of the Beast Progress`,
|
||||
worldState_eightClaw: `Eight Claw`,
|
||||
worldState_eightClawProgressOverride: `Eight Claw Progress`,
|
||||
worldState_thermiaFractures: `Thermia Fractures`,
|
||||
worldState_thermiaFracturesProgressOverride: `Thermia Fractures Progress`,
|
||||
worldState_from_year: `from |VAL|`,
|
||||
worldState_pre_year: `pre |VAL|`,
|
||||
worldState_week: `Week |VAL|`,
|
||||
|
||||
@ -265,6 +265,8 @@ dict = {
|
||||
worldState_bellyOfTheBeastProgressOverride: `Progreso del Vientre de la Bestia`,
|
||||
worldState_eightClaw: `Octava Garra`,
|
||||
worldState_eightClawProgressOverride: `Progreso de Octava Garra`,
|
||||
worldState_thermiaFractures: `Fracturas Thermia`,
|
||||
worldState_thermiaFracturesProgressOverride: `[UNTRANSLATED] Thermia Fractures Progress`,
|
||||
worldState_from_year: `de |VAL|`,
|
||||
worldState_pre_year: `antes de |VAL|`,
|
||||
worldState_week: `Semana |VAL|`,
|
||||
|
||||
@ -265,6 +265,8 @@ dict = {
|
||||
worldState_bellyOfTheBeastProgressOverride: `[UNTRANSLATED] Belly of the Beast Progress`,
|
||||
worldState_eightClaw: `Huitième Griffe`,
|
||||
worldState_eightClawProgressOverride: `[UNTRANSLATED] Eight Claw Progress`,
|
||||
worldState_thermiaFractures: `Crevasses Thermia`,
|
||||
worldState_thermiaFracturesProgressOverride: `[UNTRANSLATED] Thermia Fractures Progress`,
|
||||
worldState_from_year: `[UNTRANSLATED] from |VAL|`,
|
||||
worldState_pre_year: `[UNTRANSLATED] pre |VAL|`,
|
||||
worldState_week: `[UNTRANSLATED] Week |VAL|`,
|
||||
|
||||
@ -265,6 +265,8 @@ dict = {
|
||||
worldState_bellyOfTheBeastProgressOverride: `Прогресс Чрева зверя`,
|
||||
worldState_eightClaw: `Восемь когтей`,
|
||||
worldState_eightClawProgressOverride: `Прогресс Восьми когтей`,
|
||||
worldState_thermiaFractures: `Разломы Термии`,
|
||||
worldState_thermiaFracturesProgressOverride: `Прогресс Разломов Термии`,
|
||||
worldState_from_year: `из |VAL|`,
|
||||
worldState_pre_year: `до |VAL|`,
|
||||
worldState_week: `Неделя |VAL|`,
|
||||
|
||||
@ -265,6 +265,8 @@ dict = {
|
||||
worldState_bellyOfTheBeastProgressOverride: `Прогрес У лігві звіра`,
|
||||
worldState_eightClaw: `Вісім кігтів`,
|
||||
worldState_eightClawProgressOverride: `Прогрес Восьми кігтів`,
|
||||
worldState_thermiaFractures: `Розломи термії`,
|
||||
worldState_thermiaFracturesProgressOverride: `[UNTRANSLATED] Thermia Fractures Progress`,
|
||||
worldState_from_year: `з |VAL|`,
|
||||
worldState_pre_year: `до |VAL|`,
|
||||
worldState_week: `Тиждень |VAL|`,
|
||||
|
||||
@ -265,6 +265,8 @@ dict = {
|
||||
worldState_bellyOfTheBeastProgressOverride: `不稳定微粒收集进度(%)`,
|
||||
worldState_eightClaw: `八爪`,
|
||||
worldState_eightClawProgressOverride: `大帝金币收集进度(%)`,
|
||||
worldState_thermiaFractures: `热美亚裂缝`,
|
||||
worldState_thermiaFracturesProgressOverride: `[UNTRANSLATED] Thermia Fractures Progress`,
|
||||
worldState_from_year: `|VAL|`,
|
||||
worldState_pre_year: `|VAL|之前`,
|
||||
worldState_week: `第|VAL|周`,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user