diff --git a/ui/eureka/eureka.ts b/ui/eureka/eureka.ts index f4862017ec..e2286213bc 100644 --- a/ui/eureka/eureka.ts +++ b/ui/eureka/eureka.ts @@ -66,6 +66,8 @@ type NMInfo = { x: number; y: number; respawnMinutes?: number; + partnerFateId?: number; + partnerFateRespawnMinutes?: number; // Modified element?: HTMLElement; @@ -546,8 +548,40 @@ class EurekaTracker { } } + StartPartnerFateRespawnTimer(fate: NMInfo) { + if (!fate.partnerFateId || !fate.partnerFateRespawnMinutes) + return; + + const partnerFate = Object.values(this.nms).find( + (nm) => nm.fateId === fate.partnerFateId, + ); + + if (!partnerFate) { + this.DebugPrint( + `Partner FATE ${fate.partnerFateId} not found for ${this.TransByDispLang(fate.label)}`, + ); + return; + } + + partnerFate.respawnTimeMsLocal = Date.now() + fate.partnerFateRespawnMinutes * 60 * 1000; + + partnerFate.element?.classList.remove('nm-hidden'); + partnerFate.element?.classList.remove('nm-pop'); + partnerFate.element?.classList.add('nm-down'); + + if (partnerFate.progressElement) + partnerFate.progressElement.innerText = ''; + + this.DebugPrint( + `Started ${fate.partnerFateRespawnMinutes} minute timer for partner FATE: ${ + this.TransByDispLang(partnerFate.label) + }`, + ); + } + OnFateKill(fate: NMInfo) { this.DebugPrint(`OnFateKill: ${this.TransByDispLang(fate.label)}`); + this.StartPartnerFateRespawnTimer(fate); this.UpdateTimes(); if (fate.element?.classList.contains('nm-pop')) { if (this.zoneInfo?.onlyShowInactiveWithExplicitRespawns && !fate.respawnMinutes) diff --git a/ui/eureka/zone_north_horn.ts b/ui/eureka/zone_north_horn.ts index f8013006ae..9c5486577d 100644 --- a/ui/eureka/zone_north_horn.ts +++ b/ui/eureka/zone_north_horn.ts @@ -5,8 +5,6 @@ import northHornMap from './northhorn.png'; // https://v2.xivapi.com/api/search?sheets=Fate&limit=9999&fields=Name@en,Name@de,Name@fr,Name@ja&query=EurekaFate=3 - Fates // https://v2.xivapi.com/api/search?sheets=MKDLore&limit=9999&fields=Name@en,Name@de,Name@fr,Name@ja&query=Unknown5=4 - Occult Records -/* TODO: Write code for alternating cooldowns (e.g., for the "Pots" fates) */ - export const zoneInfoNorthHorn: EurekaZoneInfo = { mapImage: northHornMap, mapWidth: 2048,