make Ghoul Purge and Plague Star events periodic
All checks were successful
Build / build (pull_request) Successful in 55s

This commit is contained in:
AMelonInsideLemon 2025-08-09 04:56:55 +02:00
parent 19c2e85c44
commit dedf73b5ee
11 changed files with 70 additions and 26 deletions

View File

@ -82,8 +82,8 @@
"darvoStockMultiplier": 1, "darvoStockMultiplier": 1,
"varziaOverride": "", "varziaOverride": "",
"varziaFullyStocked": false, "varziaFullyStocked": false,
"plagueStar": false, "plagueStar": null,
"ghoulEmergence": false "ghoulEmergence": null
}, },
"dev": { "dev": {
"keepVendorsExpired": false "keepVendorsExpired": false

View File

@ -1259,7 +1259,7 @@ export const addMissionRewards = async (
} }
} }
if (!AffiliationMods) AffiliationMods ??= []; AffiliationMods ??= [];
if (rewardInfo.JobStage != undefined && rewardInfo.jobId) { if (rewardInfo.JobStage != undefined && rewardInfo.jobId) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars

View File

@ -1563,17 +1563,24 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
}); });
} }
if (config.worldState?.plagueStar) { const firstNovemberWeekday = new Date(Date.UTC(date.getUTCFullYear(), 10, 1)).getUTCDay();
const firstNovemberMondayOffset = (8 - firstNovemberWeekday) % 7;
const plagueStarStart = Date.UTC(date.getUTCFullYear(), 10, firstNovemberMondayOffset + 1, 16);
const plagueStarEnd = Date.UTC(date.getUTCFullYear(), 10, firstNovemberMondayOffset + 15, 16);
const isPlagueStarActive = timeMs >= plagueStarStart && timeMs < plagueStarEnd;
if (config.worldState?.plagueStar ?? isPlagueStarActive) {
worldState.Goals.push({ worldState.Goals.push({
_id: { $oid: "654a5058c757487cdb11824f" }, _id: { $oid: "654a5058c757487cdb11824f" },
Activation: { Activation: {
$date: { $date: {
$numberLong: "1699372800000" $numberLong: config.worldState?.plagueStar ? "1699372800000" : plagueStarStart.toString()
} }
}, },
Expiry: { Expiry: {
$date: { $date: {
$numberLong: "2000000000000" $numberLong: config.worldState?.plagueStar ? "2000000000000" : plagueStarEnd.toString()
} }
}, },
Tag: "InfestedPlains", Tag: "InfestedPlains",
@ -1692,7 +1699,9 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
pushClassicBounties(worldState.SyndicateMissions, bountyCycle); pushClassicBounties(worldState.SyndicateMissions, bountyCycle);
} while (isBeforeNextExpectedWorldStateRefresh(timeMs, bountyCycleEnd) && ++bountyCycle); } while (isBeforeNextExpectedWorldStateRefresh(timeMs, bountyCycleEnd) && ++bountyCycle);
if (config.worldState?.ghoulEmergence) { const ghoulsCycleDay = day % 21;
const isGhoulEmergenceActive = ghoulsCycleDay >= 17 && ghoulsCycleDay <= 20; // 4 days for event and 17 days for break
if (config.worldState?.ghoulEmergence ?? isGhoulEmergenceActive) {
const ghoulPool = [...eidolonGhoulJobs]; const ghoulPool = [...eidolonGhoulJobs];
const pastGhoulPool = [...eidolonGhoulJobs]; const pastGhoulPool = [...eidolonGhoulJobs];
@ -1702,11 +1711,38 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
const rng = new SRng(seed); const rng = new SRng(seed);
const pastRng = new SRng(pastSeed); const pastRng = new SRng(pastSeed);
const activeStartDay = day - ghoulsCycleDay + 17;
const activeEndDay = activeStartDay + 5;
const dayWithFraction = (timeMs - EPOCH) / 86400000;
const progress = (dayWithFraction - activeStartDay) / (activeEndDay - activeStartDay);
const healthPct = 1 - Math.min(Math.max(progress, 0), 1);
worldState.Goals.push({ worldState.Goals.push({
_id: { $oid: "687ebbe6d1d17841c9c59f38" }, _id: { $oid: "687ebbe6d1d17841c9c59f38" },
Activation: { $date: { $numberLong: "1753204900185" } }, Activation: {
Expiry: { $date: { $numberLong: "2000000000000" } }, $date: {
HealthPct: 1, $numberLong: config.worldState?.ghoulEmergence
? "1753204900185"
: Date.UTC(
date.getUTCFullYear(),
date.getUTCMonth(),
date.getUTCDate() + (day - ghoulsCycleDay + 17)
).toString()
}
},
Expiry: {
$date: {
$numberLong: config.worldState?.ghoulEmergence
? "2000000000000"
: Date.UTC(
date.getUTCFullYear(),
date.getUTCMonth(),
date.getUTCDate() + (day - ghoulsCycleDay + 21)
).toString()
}
},
HealthPct: config.worldState?.ghoulEmergence ? 1 : healthPct,
VictimNode: "SolNode228", VictimNode: "SolNode228",
Regions: [2], Regions: [2],
Success: 0, Success: 0,
@ -1737,7 +1773,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
} }
], ],
JobPreviousVersion: { JobPreviousVersion: {
$oid: (((bountyCycle - 9000) / 1000) & 0xffffffff).toString(16).padStart(8, "0") + "0000000000000008" $oid: (((bountyCycle - 1) * 9000) & 0xffffffff).toString(16).padStart(8, "0") + "0000000000000008"
}, },
PreviousJobs: [ PreviousJobs: [
{ {

View File

@ -937,14 +937,6 @@
<input class="form-check-input" type="checkbox" id="worldState.varziaFullyStocked" /> <input class="form-check-input" type="checkbox" id="worldState.varziaFullyStocked" />
<label class="form-check-label" for="worldState.varziaFullyStocked" data-loc="worldState_varziaFullyStocked"></label> <label class="form-check-label" for="worldState.varziaFullyStocked" data-loc="worldState_varziaFullyStocked"></label>
</div> </div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="worldState.plagueStar" />
<label class="form-check-label" for="worldState.plagueStar" data-loc="worldState_plagueStar"></label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="worldState.ghoulEmergence" />
<label class="form-check-label" for="worldState.ghoulEmergence" data-loc="worldState_ghoulEmergence"></label>
</div>
<div class="form-group mt-2"> <div class="form-group mt-2">
<label class="form-label" for="worldState.galleonOfGhouls" data-loc="worldState_galleonOfGhouls"></label> <label class="form-label" for="worldState.galleonOfGhouls" data-loc="worldState_galleonOfGhouls"></label>
<select class="form-control" id="worldState.galleonOfGhouls" data-default="0"> <select class="form-control" id="worldState.galleonOfGhouls" data-default="0">
@ -954,6 +946,22 @@
<option value="3" data-loc="worldState_we3"></option> <option value="3" data-loc="worldState_we3"></option>
</select> </select>
</div> </div>
<div class="form-group mt-2">
<label class="form-label" for="worldState.ghoulEmergence" data-loc="worldState_ghoulEmergence"></label>
<select class="form-control" id="worldState.ghoulEmergence" 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="form-group mt-2">
<label class="form-label" for="worldState.plagueStar" data-loc="worldState_plagueStar"></label>
<select class="form-control" id="worldState.plagueStar" 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="form-group mt-2"> <div class="form-group mt-2">
<label class="form-label" for="worldState.starDaysOverride" data-loc="worldState_starDays"></label> <label class="form-label" for="worldState.starDaysOverride" data-loc="worldState_starDays"></label>
<select class="form-control" id="worldState.starDaysOverride" data-default="null"> <select class="form-control" id="worldState.starDaysOverride" data-default="null">

View File

@ -246,8 +246,8 @@ dict = {
worldState_baroTennoConRelay: `Baros TennoCon Relais`, worldState_baroTennoConRelay: `Baros TennoCon Relais`,
worldState_starDays: `Sternen-Tage`, worldState_starDays: `Sternen-Tage`,
worldState_galleonOfGhouls: `Galeone der Ghule`, worldState_galleonOfGhouls: `Galeone der Ghule`,
worldState_plagueStar: `Plagenstern`,
worldState_ghoulEmergence: `Ghul Ausrottung`, worldState_ghoulEmergence: `Ghul Ausrottung`,
worldState_plagueStar: `Plagenstern`,
enabled: `Aktiviert`, enabled: `Aktiviert`,
disabled: `Deaktiviert`, disabled: `Deaktiviert`,
worldState_we1: `Wochenende 1`, worldState_we1: `Wochenende 1`,

View File

@ -245,8 +245,8 @@ dict = {
worldState_baroTennoConRelay: `Baro's TennoCon Relay`, worldState_baroTennoConRelay: `Baro's TennoCon Relay`,
worldState_starDays: `Star Days`, worldState_starDays: `Star Days`,
worldState_galleonOfGhouls: `Galleon of Ghouls`, worldState_galleonOfGhouls: `Galleon of Ghouls`,
worldState_plagueStar: `Plague Star`,
worldState_ghoulEmergence: `Ghoul Purge`, worldState_ghoulEmergence: `Ghoul Purge`,
worldState_plagueStar: `Plague Star`,
enabled: `Enabled`, enabled: `Enabled`,
disabled: `Disabled`, disabled: `Disabled`,
worldState_we1: `Weekend 1`, worldState_we1: `Weekend 1`,

View File

@ -246,8 +246,8 @@ dict = {
worldState_baroTennoConRelay: `Repetidor de Baro de la TennoCon`, worldState_baroTennoConRelay: `Repetidor de Baro de la TennoCon`,
worldState_starDays: `Días estelares`, worldState_starDays: `Días estelares`,
worldState_galleonOfGhouls: `Galeón de Gules`, worldState_galleonOfGhouls: `Galeón de Gules`,
worldState_plagueStar: `Estrella Infestada`,
worldState_ghoulEmergence: `Purga de Gules`, worldState_ghoulEmergence: `Purga de Gules`,
worldState_plagueStar: `Estrella Infestada`,
enabled: `Activado`, enabled: `Activado`,
disabled: `Desactivado`, disabled: `Desactivado`,
worldState_we1: `Semana 1`, worldState_we1: `Semana 1`,

View File

@ -246,8 +246,8 @@ dict = {
worldState_baroTennoConRelay: `[UNTRANSLATED] Baro's TennoCon Relay`, worldState_baroTennoConRelay: `[UNTRANSLATED] Baro's TennoCon Relay`,
worldState_starDays: `Jours Stellaires`, worldState_starDays: `Jours Stellaires`,
worldState_galleonOfGhouls: `Galion des Goules`, worldState_galleonOfGhouls: `Galion des Goules`,
worldState_plagueStar: `Fléau Céleste`,
worldState_ghoulEmergence: `Purge des Goules`, worldState_ghoulEmergence: `Purge des Goules`,
worldState_plagueStar: `Fléau Céleste`,
enabled: `[UNTRANSLATED] Enabled`, enabled: `[UNTRANSLATED] Enabled`,
disabled: `Désactivé`, disabled: `Désactivé`,
worldState_we1: `Weekend 1`, worldState_we1: `Weekend 1`,

View File

@ -246,8 +246,8 @@ dict = {
worldState_baroTennoConRelay: `Реле Баро TennoCon`, worldState_baroTennoConRelay: `Реле Баро TennoCon`,
worldState_starDays: `Звёздные дни`, worldState_starDays: `Звёздные дни`,
worldState_galleonOfGhouls: `Галеон Гулей`, worldState_galleonOfGhouls: `Галеон Гулей`,
worldState_plagueStar: `Чумная звезда`,
worldState_ghoulEmergence: `Избавление от гулей`, worldState_ghoulEmergence: `Избавление от гулей`,
worldState_plagueStar: `Чумная звезда`,
enabled: `Включено`, enabled: `Включено`,
disabled: `Отключено`, disabled: `Отключено`,
worldState_we1: `Выходные 1`, worldState_we1: `Выходные 1`,

View File

@ -246,8 +246,8 @@ dict = {
worldState_baroTennoConRelay: `Реле Баро TennoCon`, worldState_baroTennoConRelay: `Реле Баро TennoCon`,
worldState_starDays: `Зоряні дні`, worldState_starDays: `Зоряні дні`,
worldState_galleonOfGhouls: `Гульський Галеон`, worldState_galleonOfGhouls: `Гульський Галеон`,
worldState_plagueStar: `Морова зірка`,
worldState_ghoulEmergence: `Зачищення від гулів`, worldState_ghoulEmergence: `Зачищення від гулів`,
worldState_plagueStar: `Морова зірка`,
enabled: `Увімкнено`, enabled: `Увімкнено`,
disabled: `Вимкнено`, disabled: `Вимкнено`,
worldState_we1: `Вихідні 1`, worldState_we1: `Вихідні 1`,

View File

@ -246,8 +246,8 @@ dict = {
worldState_baroTennoConRelay: `Baro的TennoCon中继站`, worldState_baroTennoConRelay: `Baro的TennoCon中继站`,
worldState_starDays: `活动:星日`, worldState_starDays: `活动:星日`,
worldState_galleonOfGhouls: `战术警报:尸鬼的帆船战舰`, worldState_galleonOfGhouls: `战术警报:尸鬼的帆船战舰`,
worldState_plagueStar: `瘟疫之星`,
worldState_ghoulEmergence: `尸鬼净化`, worldState_ghoulEmergence: `尸鬼净化`,
worldState_plagueStar: `瘟疫之星`,
enabled: `启用`, enabled: `启用`,
disabled: `关闭/取消配置`, disabled: `关闭/取消配置`,
worldState_we1: `活动阶段:第一周`, worldState_we1: `活动阶段:第一周`,