Repository: xivanalysis/xivanalysis
Pull request #2228: [AST] update card CD management plus wording
Author: login: otocephaly
Labels: name: Parser - AST
description: Astrologian
Created: 2025-04-17T04:41:48Z | Merged: 2025-04-20T19:08:56Z

## Pull request type

- [x] This is a bugfix to existing functionality

## Pull request details
- [x] This is in response to a discussion or thread on Discord: *[Link to thread or start of discussion]*(https://www.fflogs.com/reports/a:LhGYBmQVjwpJWKqb?fight=20&source=75)
- [x] The goal of this PR is detailed below:
    - Update amount of cards to align with divination burst windows rather than keeping always on CD

## Testing / Validation
- [x] I used the log(s) listed below to develop and test this bugfix:
    - https://www.fflogs.com/reports/a:LhGYBmQVjwpJWKqb?fight=20&source=75
    - (overwritting example) https://www.fflogs.com/reports/a:N418xZWmrDX2aKBR?fight=25&source=359

   *[Provide a list of log links - either direct to FFLogs or the xivanalysis log link for development or production]*

## Job Maintenance
- [x] I have collaborated with one or more job maintainers for the job(s) in this PR while developing it

## Screenshots
Updated wording and logic
![image](https://github.com/user-attachments/assets/44c51385-7aa3-45a7-8436-bd6e5bce1338)

Overwrite example and updated macrocosmos wording
![image](https://github.com/user-attachments/assets/20f99a70-f756-486a-a8a7-4e7e06cbdbed)

Old for reference
![image](https://github.com/user-attachments/assets/147f58e5-9be0-425d-a684-59baee7762fe)
![image](https://github.com/user-attachments/assets/b560a3fd-4c6d-4d8c-960e-615c06610da4)



Diff:
diff --git a/locale/de/messages.json b/locale/de/messages.json
index 7e2abcc22f..9d0bfce89f 100644
--- a/locale/de/messages.json
+++ b/locale/de/messages.json
@@ -36,10 +36,10 @@
   "ast.draw.checklist.description": "",
   "ast.draw.checklist.description.total": "Gesamtanzahl von erhaltenen Karten:",
   "ast.draw.checklist.name": "Spiele so viele Karten wie möglich",
-  "ast.draw.checklist.requirement.playI": "",
-  "ast.draw.checklist.requirement.playLord": "<0/> Nutzungen",
   "ast.draw.suggestions.draw-no-usage.content": "",
   "ast.draw.suggestions.draw-no-usage.why": "Keine Karten gezogen.",
+  "ast.draw.suggestions.draw-overwrite.content": "",
+  "ast.draw.suggestions.draw-overwrite.why": "",
   "ast.draw.suggestions.draw-uses.content": "",
   "ast.draw.suggestions.draw-uses.why": "",
   "ast.draw.title": "Ziehen",
diff --git a/locale/en/messages.json b/locale/en/messages.json
index f9bdd3080e..73f8283279 100644
--- a/locale/en/messages.json
+++ b/locale/en/messages.json
@@ -33,15 +33,15 @@
   "ast.dots.rule.name": "Keep your DoT up",
   "ast.dots.suggestion.clip.content": "Avoid refreshing <0/> significantly before it expires.",
   "ast.dots.suggestion.clip.why": "An average of {0} seconds of <0/> clipped per minute due to early refreshes.",
-  "ast.draw.checklist.description": "These cards provide additional damage either directly (<0/>) or for the party (<1/> / <2/>).<3/>Casting <4/> and <5/> will help with mana management.",
+  "ast.draw.checklist.description": "These cards provide additional damage either directly (<0/>) or for the party (<1/> / <2/>).<3/>Cards should be played in alignment with <4/> as much as possible.<5/>Casting <6/> and <7/> will help with mana management.",
   "ast.draw.checklist.description.total": "Total cards obtained:",
-  "ast.draw.checklist.name": "Play as many cards as possible",
-  "ast.draw.checklist.requirement.playI": "<0/> (<1/> / <2/>) uses",
-  "ast.draw.checklist.requirement.playLord": "<0/> uses",
+  "ast.draw.checklist.name": "Draw cards in preparation for <0/> windows.",
   "ast.draw.suggestions.draw-no-usage.content": "No uses of <0/> or <1/> at all.",
   "ast.draw.suggestions.draw-no-usage.why": "No draws used.",
-  "ast.draw.suggestions.draw-uses.content": "Consider casting <0/> / <1/> as soon as its available to maximize both MP regen and the number of cards played.",
-  "ast.draw.suggestions.draw-uses.why": "About {drawsMissed, plural, one {# use} other {# uses}} of <0/> / <1/> {drawsMissed, plural, one {was} other {were}} missed by holding cards on full cooldown for at least a total of {0}.",
+  "ast.draw.suggestions.draw-overwrite.content": "Try to not use <0/> / <1/> until you have used <2/> and <3/>.",
+  "ast.draw.suggestions.draw-overwrite.why": "<0/> / <1/> was used {0, plural, one {once} other {# times}} when there was an available <2/> or <3/>.",
+  "ast.draw.suggestions.draw-uses.content": "Consider casting <0/> / <1/> in a timely manner to align with <2/> to ensure 2 cards are in every window and to help with mana management.",
+  "ast.draw.suggestions.draw-uses.why": "About {drawsMissed, plural, one {# use} other {# uses}} of <0/> / <1/> {drawsMissed, plural, one {was} other {were}} missed by drifting cards outside <2/> for at least a total of {0}.",
   "ast.draw.title": "Draw",
   "ast.dropped-defensives.action.header": "<0/> as activated by {actionStatusDependency}",
   "ast.dropped-defensives.action.unused": "Available to use between <0></0> {0} and {1}",
@@ -56,8 +56,8 @@
   "ast.horoscope.suggestion.usage.content": "Try to plan your <0/> or <1/> usages to have either up before you need to cast <2/> or <3/>.<4/> and <5/> may help to cover more damage later without needing to cast additional AOE heals.",
   "ast.horoscope.suggestion.usage.why": "{0, plural, one {# AOE GCD heal was cast} other {# AOE GCD heals were cast}} without <0/> or <1/> even though one of the two abilities were available.",
   "ast.horoscope.title": "Horoscope",
-  "ast.macrocosmos.content.general": "Consider utilizing <0/> more frequently. <1/> has the same potency as <2/>; however, <3/> can be utilized to weave in healing for incoming raid wide attacks leading to more value for your GCD. <4/>",
-  "ast.macrocosmos.why.general": "Out of a possible {macrocosmosMaxUses} {macrocosmosMaxUses, plural, one {cast} other {casts}} during available dps uptime, there {0, plural, one {was} other {were}} {1} {2, plural, one {cast} other {casts}} noted. <0/>",
+  "ast.macrocosmos.content.general": "Consider utilizing <0/> more frequently. <1/> has the same potency as <2/> and even greater potency per target than <3/>.<4/>While this should not be used on cooldown if you plan to use for healing purposes, it can help with keeping dps uptime or with weaving in healing for incoming raid wide attacks leading to more value for your GCD.",
+  "ast.macrocosmos.why.general": "There {0, plural, one {was only # cast} other {were only # casts}} of <0/> noted.",
   "ast.macrocosmos.why.nocasts": "There were no casts recorded for <0/>.",
   "ast.ogcds_dps.divination.content": "Consider using <0/> more frequently. <1/> provides an Astrologian with a strong amount of raid DPS.",
   "ast.ogcds_dps.oracle.content": "Consider using <0/> more frequently. <1/> is a very hard-hitting oGCD that should be utilized during the <2/> window.",
diff --git a/locale/fr/messages.json b/locale/fr/messages.json
index adb425e84d..0299463260 100644
--- a/locale/fr/messages.json
+++ b/locale/fr/messages.json
@@ -36,10 +36,10 @@
   "ast.draw.checklist.description": "Ces cartes infligent des dégâts supplémentaires, soit directement (<0/>), soit pour le groupe (<1/> / <2/>).<3/>Le lancement des cartes <4/> et <5/> permet de mieux gérer le mana.",
   "ast.draw.checklist.description.total": "Total de cartes obtenues :",
   "ast.draw.checklist.name": "Jouez le plus de cartes possible",
-  "ast.draw.checklist.requirement.playI": "<0/>(<1/>/<2/>) utilisé",
-  "ast.draw.checklist.requirement.playLord": "<0/> utilisations",
   "ast.draw.suggestions.draw-no-usage.content": "Aucune utilisation de <0/>. ou <1/>.",
   "ast.draw.suggestions.draw-no-usage.why": "Aucun tirage utilisé.",
+  "ast.draw.suggestions.draw-overwrite.content": "",
+  "ast.draw.suggestions.draw-overwrite.why": "",
   "ast.draw.suggestions.draw-uses.content": "Envisagez de lancer <0/>/<1/> dès que possible pour maximiser autant votre mana et le nombre de cartes jouées.",
   "ast.draw.suggestions.draw-uses.why": "Environ {drawsMissed, plural, one {# utilisation} other {# utilisations}} de <0/> /<1/>{drawsMissed, plural, one {a été perdue} other {ont été perdues}} en retenant deux cartes en cooldown pour un minimum de {0}.",
   "ast.draw.title": "Tirage",
diff --git a/locale/ja/messages.json b/locale/ja/messages.json
index 6d67819f5d..698531b281 100644
--- a/locale/ja/messages.json
+++ b/locale/ja/messages.json
@@ -36,10 +36,10 @@
   "ast.draw.checklist.description": "",
   "ast.draw.checklist.description.total": "取得したカードの枚数:",
   "ast.draw.checklist.name": "カードを出来るだけ使用する",
-  "ast.draw.checklist.requirement.playI": "",
-  "ast.draw.checklist.requirement.playLord": "使用回数：<0/>",
   "ast.draw.suggestions.draw-no-usage.content": "",
   "ast.draw.suggestions.draw-no-usage.why": "ドローを使わなかった。",
+  "ast.draw.suggestions.draw-overwrite.content": "",
+  "ast.draw.suggestions.draw-overwrite.why": "",
   "ast.draw.suggestions.draw-uses.content": "",
   "ast.draw.suggestions.draw-uses.why": "",
   "ast.draw.title": "ドロー",
diff --git a/locale/ko/messages.json b/locale/ko/messages.json
index db3c562002..0b3351bb81 100644
--- a/locale/ko/messages.json
+++ b/locale/ko/messages.json
@@ -36,10 +36,10 @@
   "ast.draw.checklist.description": "",
   "ast.draw.checklist.description.total": "총 획득한 카드:",
   "ast.draw.checklist.name": "카드 사용 횟수를 최대한 늘리기",
-  "ast.draw.checklist.requirement.playI": "",
-  "ast.draw.checklist.requirement.playLord": "사용횟수: <0/>",
   "ast.draw.suggestions.draw-no-usage.content": "",
   "ast.draw.suggestions.draw-no-usage.why": "점지를 사용하지 않았습니다.",
+  "ast.draw.suggestions.draw-overwrite.content": "",
+  "ast.draw.suggestions.draw-overwrite.why": "",
   "ast.draw.suggestions.draw-uses.content": "",
   "ast.draw.suggestions.draw-uses.why": "",
   "ast.draw.title": "점지",
diff --git a/locale/zh/messages.json b/locale/zh/messages.json
index 11dceb42c2..9747e4f99f 100644
--- a/locale/zh/messages.json
+++ b/locale/zh/messages.json
@@ -36,10 +36,10 @@
   "ast.draw.checklist.description": "这些卡牌可以直接（<0/>）或为团队（<1/> / <2/>）提供额外伤害。<3/>使用<4/>和<5/>将有助于回复蓝量。",
   "ast.draw.checklist.description.total": "总计获得的卡片:",
   "ast.draw.checklist.name": "尽量多发卡",
-  "ast.draw.checklist.requirement.playI": "使用 <0/> (<1/> / <2/>)",
-  "ast.draw.checklist.requirement.playLord": "<0/> 的使用次数",
   "ast.draw.suggestions.draw-no-usage.content": "完全未使用 <0/> 及 <1/>",
   "ast.draw.suggestions.draw-no-usage.why": "没有使用抽卡",
+  "ast.draw.suggestions.draw-overwrite.content": "",
+  "ast.draw.suggestions.draw-overwrite.why": "",
   "ast.draw.suggestions.draw-uses.content": "尽量在<0/> / <1/>冷却结束后立即再次发动以最大化MP回复量与生效的卡片数。",
   "ast.draw.suggestions.draw-uses.why": "因为CD空转了至少 {0}，你大约少用了 {drawsMissed, plural, other {#}} {drawsMissed, plural, other {次}} <0/> / <1/>。",
   "ast.draw.title": "抽卡",
diff --git a/src/parser/jobs/ast/changelog.tsx b/src/parser/jobs/ast/changelog.tsx
index 3d83e68a59..28e78cea50 100644
--- a/src/parser/jobs/ast/changelog.tsx
+++ b/src/parser/jobs/ast/changelog.tsx
@@ -2,6 +2,13 @@ import {DataLink} from 'components/ui/DbLink'
 import {CONTRIBUTORS} from 'data/CONTRIBUTORS'
 
 export const changelog = [
+	{
+		date: new Date('2025-04-19'),
+		Changes: () => <>Fixed draw suggestions and checklist to align better with <DataLink action="DIVINATION" />.
+			<br/> Added a suggestion when using Draw (overwritting) when there is an available <DataLink action="LORD_OF_CROWNS" /> or <DataLink action="PLAY_I" />.
+			<br/> Updated <DataLink action="MACROCOSMOS" /> suggestion with higher thresholds and better wording to align better with defensives in a way. </>,
+		contributors: [CONTRIBUTORS.OTOCEPHALY],
+	},
 	{
 		date: new Date('2025-03-26'),
 		Changes: () => <>Added AoE Usages section and adjusted <DataLink action="MACROCOSMOS" /> suggestion to exclude considerations for <DataLink action="GRAVITY_II" />. </>,
diff --git a/src/parser/jobs/ast/modules/Draw.tsx b/src/parser/jobs/ast/modules/Draw.tsx
index c2232e5925..293acb882f 100644
--- a/src/parser/jobs/ast/modules/Draw.tsx
+++ b/src/parser/jobs/ast/modules/Draw.tsx
@@ -2,25 +2,29 @@ import {t} from '@lingui/macro'
 import {Plural, Trans} from '@lingui/react'
 import {DataLink} from 'components/ui/DbLink'
 import {Action} from 'data/ACTIONS'
-import {Status} from 'data/STATUSES'
 import {Event, Events} from 'event'
 import {Analyser} from 'parser/core/Analyser'
+import {EventHook} from 'parser/core/Dispatcher'
 import {filter, oneOf} from 'parser/core/filter'
 import {dependency} from 'parser/core/Injectable'
 import {Checklist, Requirement, Rule} from 'parser/core/modules/Checklist'
 import {Data} from 'parser/core/modules/Data'
 import {Suggestions, SEVERITY, Suggestion, TieredSuggestion} from 'parser/core/modules/Suggestions'
 import {DISPLAY_ORDER} from 'parser/jobs/ast/modules/DISPLAY_ORDER'
-import {PLAY_I, OFFENSIVE_ARCANA_STATUS} from './ArcanaGroups'
+import {PLAY_I} from './ArcanaGroups'
 
 const oGCD_ALLOWANCE = 7500 //used in case the last draw comes up in the last second of the fight. Since plays are typically done in a separate weave, a full GCD would be needed to play the card. Takes another second to cast PLAY and therefore an AST would not DRAW if they couldn't even PLAY. Additionally, an AST would not play if not even a GCD could be cast before the end of the fight. Therefore, the oGCD_ALLOWANCE should be approcimately 3 GCDs (2 for AST to cast, 1 for job to do an action) = 3 * 2500
 const INTENTIONAL_DRIFT_FOR_BURST = 7500 //gcds until draw is used in opener
+const ADDITIONAL_CD_TO_ALIGN_WITH_DIVINATION = 5000 // 5s chosen since CD is 55s and div is 120s
 
 const SEVERITIES = {
 	DRAW_HOLDING: { //harsh thresholds were chosen since a drift will invariably mess up burst alignment
 		1: SEVERITY.MEDIUM,
 		2: SEVERITY.MAJOR,
 	},
+	OVERWRITE_CARD: {
+		1: SEVERITY.MAJOR,
+	},
 }
 
 export class Draw extends Analyser {
@@ -34,19 +38,21 @@ export class Draw extends Analyser {
 	private draws: number = 0
 	private cooldownEndTime: number = this.parser.pull.timestamp
 	private drawTotalDrift: number = 0
-	private playIs: number = 0
-	private playLord: number = 0
-	private playLady: number = 0
+	private additionalCD: number = ADDITIONAL_CD_TO_ALIGN_WITH_DIVINATION
+
+	//tracked actions/hooks to be used. note: on prepull balance/lord starts active. tracking spear/balance only through play I
+	private playIActive: boolean = true
+	private lordActive: boolean = true
+	private lordHook: EventHook<Events['action']> | undefined = undefined
+	private cardOverwrites: number = 0
 
 	private prepullPrepped: boolean = true //always true
 
 	private playDamageActions: Array<Action['id']> = []
-	private arcanaDamageStatuses: Array<Status['id']> = []
 
 	override initialise() {
 
 		this.playDamageActions = PLAY_I.map(actionKey => this.data.actions[actionKey].id)
-		this.arcanaDamageStatuses = OFFENSIVE_ARCANA_STATUS.map(statusKey => this.data.statuses[statusKey].id)
 
 		const playerFilter = filter<Event>().source(this.parser.actor.id)
 
@@ -62,19 +68,14 @@ export class Draw extends Analyser {
 			.type('action')
 			.action(oneOf(this.playDamageActions))
 		, this.onPlayI)
-		this.addEventHook(playerFilter
+		this.lordHook = this.addEventHook(playerFilter
 			.type('action')
 			.action(this.data.actions.LORD_OF_CROWNS.id)
 		, this.onPlayLord)
-		this.addEventHook(playerFilter
-			.type('action')
-			.action(this.data.actions.LADY_OF_CROWNS.id)
-		, this.onPlayLady)
-
-		this.addEventHook(playerFilter
-			.type('statusApply')
-			.status(oneOf(this.arcanaDamageStatuses))
-		, this.onPlayIBuff)
+		this.addEventHook({
+			type: 'death',
+			actor: this.parser.actor.id,
+		}, this.onDeath)
 
 		this.addEventHook('complete', this.onComplete)
 	}
@@ -87,28 +88,48 @@ export class Draw extends Analyser {
 			this.drawTotalDrift += Math.max(0, event.timestamp - this.cooldownEndTime)
 
 			// update the last use
-			this.cooldownEndTime = this.data.actions.ASTRAL_DRAW.cooldown + Math.max(this.cooldownEndTime, event.timestamp) //note UMBRAL and ASTRAL share same CD
+			this.cooldownEndTime = this.data.actions.ASTRAL_DRAW.cooldown + this.additionalCD + Math.max(this.cooldownEndTime, event.timestamp)
+			//note UMBRAL and ASTRAL share same CD and we also want to align with divination
 			this.draws++
 		}
+
+		//check for any overwrites
+		if (this.playIActive || this.lordActive) {
+			this.cardOverwrites += 1
+		}
+
+		//initialize
+		this.playIActive = true
+		if (event.action === this.data.actions.ASTRAL_DRAW.id) {
+			this.lordActive = true
+			if (this.lordHook === undefined) {
+				this.lordHook = this.addEventHook(filter<Event>()
+					.source(this.parser.actor.id)
+					.type('action')
+					.action(this.data.actions.LORD_OF_CROWNS.id)
+				, this.onPlayLord)
+			}
+		}
 	}
 
 	private onPlayI() {
-		this.playIs++
+		this.playIActive = false
 	}
 
 	private onPlayLord() {
-		this.playLord++
-	}
-
-	private onPlayLady() {
-		this.playLady++
+		if (this.lordHook !== undefined) {
+			this.lordHook = undefined
+		}
+		this.lordActive = false
 	}
 
-	private onPlayIBuff(event: Events['statusApply']) {
-		if (event.timestamp > this.parser.pull.timestamp) {
-			return
+	private onDeath() {
+		// if they die, just set it to false
+		if (this.lordHook !== undefined) {
+			this.lordHook = undefined
 		}
-		this.playIs++
+		this.lordActive = false
+		this.playIActive = false
 	}
 
 	private onComplete() {
@@ -124,13 +145,12 @@ export class Draw extends Analyser {
 		// in otherwords, fightDuration - 15s (for the buff @ CARD_DURATION)
 
 		// Begin Theoretical Max Plays calc
-		const playsFromDraw = Math.ceil(Math.max(0, (this.parser.pull.duration - oGCD_ALLOWANCE - INTENTIONAL_DRIFT_FOR_BURST)) / this.data.actions.ASTRAL_DRAW.cooldown)
-		const lordPlaysFromDraw = Math.ceil(Math.max(0, (this.parser.pull.duration - oGCD_ALLOWANCE - INTENTIONAL_DRIFT_FOR_BURST)) / (this.data.actions.ASTRAL_DRAW.cooldown * 2)) //*2 done since they share the same cooldown and same button
+		const cooldownToConsider: number = this.data.actions.ASTRAL_DRAW.cooldown + this.additionalCD // Additional CD added to align with divination
+		const playsFromDraw = Math.ceil(Math.max(0, (this.parser.pull.duration - oGCD_ALLOWANCE - INTENTIONAL_DRIFT_FOR_BURST)) / cooldownToConsider)
 
 		// TODO: Include downtime calculation for each fight??
 
 		const theoreticalMaxPlays = playsFromDraw + (this.prepullPrepped ? 1 : 0)
-		const lordTheoreticalMaxPlays = lordPlaysFromDraw + (this.prepullPrepped ? 1 : 0)
 		const totalCardsObtained = (this.prepullPrepped ? 1 : 0) + this.draws
 
 		/*
@@ -139,33 +159,24 @@ export class Draw extends Analyser {
 		this.checklist.add(new Rule({
 			displayOrder: DISPLAY_ORDER.DRAW_CHECKLIST,
 			name: <Trans id="ast.draw.checklist.name">
-				Play as many cards as possible
+				Draw cards in preparation for <DataLink action="DIVINATION" /> windows.
 			</Trans>,
 			description: <><Trans id="ast.draw.checklist.description">
 				These cards provide additional damage either directly (<DataLink action="LORD_OF_CROWNS" />) or for the party (<DataLink action="THE_BALANCE" /> / <DataLink action="THE_SPEAR" />).
+				<br/>Cards should be played in alignment with <DataLink action="DIVINATION" /> as much as possible.
 				<br/>Casting <DataLink action="ASTRAL_DRAW" /> and <DataLink action="UMBRAL_DRAW" /> will help with mana management.
 			</Trans>
-			<li><Trans id="ast.draw.checklist.description.total">Total cards obtained:</Trans>&nbsp;{totalCardsObtained}/{theoreticalMaxPlays}</li>
 			</>,
 			requirements: [
 				new Requirement({
-					name: <Trans id="ast.draw.checklist.requirement.playI">
-						<DataLink action="PLAY_I" /> (<DataLink action="THE_BALANCE" /> / <DataLink action="THE_SPEAR" />) uses
-					</Trans>,
-					value: this.playIs,
+					name: <Trans id="ast.draw.checklist.description.total">Total cards obtained:</Trans>,
+					value: totalCardsObtained,
 					target: theoreticalMaxPlays,
 				}),
-				new Requirement({
-					name: <Trans id="ast.draw.checklist.requirement.playLord">
-						<DataLink action="LORD_OF_CROWNS" /> uses
-					</Trans>,
-					value: this.playLord,
-					target: lordTheoreticalMaxPlays,
-				}),
 			],
 		}))
 
-		const drawsMissed = Math.floor(this.drawTotalDrift / this.data.actions.ASTRAL_DRAW.cooldown)
+		const drawsMissed = Math.floor(this.drawTotalDrift / (this.data.actions.ASTRAL_DRAW.cooldown + this.additionalCD))
 		if (this.draws === 0) {
 		/*
 		SUGGESTION: Didn't use draw at all
@@ -187,14 +198,29 @@ export class Draw extends Analyser {
 			this.suggestions.add(new TieredSuggestion({
 				icon: this.data.actions.ASTRAL_DRAW.icon,
 				content: <Trans id="ast.draw.suggestions.draw-uses.content">
-						Consider casting <DataLink action="ASTRAL_DRAW" /> / <DataLink action="UMBRAL_DRAW" /> as soon as its available to maximize both MP regen and the number of cards played.
+						Consider casting <DataLink action="ASTRAL_DRAW" /> / <DataLink action="UMBRAL_DRAW" /> in a timely manner to align with <DataLink action="DIVINATION" /> to ensure 2 cards are in every window and to help with mana management.
 				</Trans>,
 				tiers: SEVERITIES.DRAW_HOLDING,
 				value: drawsMissed,
 				why: <Trans id="ast.draw.suggestions.draw-uses.why">
-					About <Plural value={drawsMissed} one="# use" other="# uses" /> of <DataLink action="ASTRAL_DRAW" /> / <DataLink action="UMBRAL_DRAW" /> <Plural value={drawsMissed} one="was" other="were" /> missed by holding cards on full cooldown for at least a total of {this.parser.formatDuration(this.drawTotalDrift)}.
+					About <Plural value={drawsMissed} one="# use" other="# uses" /> of <DataLink action="ASTRAL_DRAW" /> / <DataLink action="UMBRAL_DRAW" /> <Plural value={drawsMissed} one="was" other="were" /> missed by drifting cards outside <DataLink action="DIVINATION" /> for at least a total of {this.parser.formatDuration(this.drawTotalDrift)}.
 				</Trans>,
 			}))
 		}
+
+		/*
+		SUGGESTION: Overwrote when cards were available
+		*/
+		this.suggestions.add(new TieredSuggestion({
+			icon: this.data.actions.THE_BALANCE.icon,
+			content: <Trans id="ast.draw.suggestions.draw-overwrite.content">
+					Try to not use <DataLink action="ASTRAL_DRAW" /> / <DataLink action="UMBRAL_DRAW" /> until you have used <DataLink action="PLAY_I" /> and <DataLink action="LORD_OF_CROWNS" />.
+			</Trans>,
+			tiers: SEVERITIES.OVERWRITE_CARD,
+			value: this.cardOverwrites,
+			why: <Trans id="ast.draw.suggestions.draw-overwrite.why">
+				<DataLink action="ASTRAL_DRAW" /> / <DataLink action="UMBRAL_DRAW" /> was used <Plural value={this.cardOverwrites} one="once" other="# times" /> when there was an available <DataLink action="PLAY_I" /> or <DataLink action="LORD_OF_CROWNS" />.
+			</Trans>,
+		}))
 	}
 }
diff --git a/src/parser/jobs/ast/modules/Macrocosmos.tsx b/src/parser/jobs/ast/modules/Macrocosmos.tsx
index ef0b63be49..011730fde9 100644
--- a/src/parser/jobs/ast/modules/Macrocosmos.tsx
+++ b/src/parser/jobs/ast/modules/Macrocosmos.tsx
@@ -9,9 +9,9 @@ import {Invulnerability} from 'parser/core/modules/Invulnerability'
 import {Suggestions, SEVERITY, Suggestion, TieredSuggestion} from 'parser/core/modules/Suggestions'
 
 const SEVERITY_MOD = {
-	0.2: SEVERITY.MINOR,
-	0.6: SEVERITY.MEDIUM,
-	0.8: SEVERITY.MAJOR,
+	0.5: SEVERITY.MINOR,
+	0.75: SEVERITY.MEDIUM,
+	0.9: SEVERITY.MAJOR,
 }
 
 // Lifted from WHM benison and adapted to AST and TSX
@@ -42,12 +42,13 @@ export class Macrocosmos extends Analyser {
 
 		const generalContent =
 			<Trans id="ast.macrocosmos.content.general">
-				Consider utilizing <DataLink action="MACROCOSMOS" /> more frequently. <DataLink action="MACROCOSMOS" showIcon={false} /> has the same potency as <DataLink action="FALL_MALEFIC" />; however, <DataLink action="MACROCOSMOS" showIcon={false} /> can be utilized to weave in healing for incoming raid wide attacks leading to more value for your GCD. <br/>
+				Consider utilizing <DataLink action="MACROCOSMOS" /> more frequently. <DataLink action="MACROCOSMOS" showIcon={false} /> has the same potency as <DataLink action="FALL_MALEFIC" /> and even greater potency per target than <DataLink action="GRAVITY_II" />.
+				<br />While this should not be used on cooldown if you plan to use for healing purposes, it can help with keeping dps uptime or with weaving in healing for incoming raid wide attacks leading to more value for your GCD.
 			</Trans>
 
 		const generalWhy =
 			<Trans id="ast.macrocosmos.why.general">
-				Out of a possible {macrocosmosMaxUses} <Plural value={macrocosmosMaxUses} one="cast" other="casts" /> during available dps uptime, there <Plural value={this.macrocosmosUses} one="was" other="were" /> {this.macrocosmosUses} <Plural value={this.macrocosmosUses} one="cast" other="casts" /> noted. <br />
+				There <Plural value={this.macrocosmosUses} one="was only # cast" other="were only # casts" /> of <DataLink action="MACROCOSMOS" /> noted.
 			</Trans>
 
 		const noCastWhy =<p><span className="text-error"><Trans id="ast.macrocosmos.why.nocasts">


Reviews:
user: login: AkairyuGestalter
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-20T14:20:44Z
user: login: otocephaly
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-20T17:21:20Z
user: login: AkairyuGestalter
body: I like it. Away we go.
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-20T19:08:50Z

Review comments:
diff_hunk: @@ -139,33 +159,24 @@ export class Draw extends Analyser {
 		this.checklist.add(new Rule({
 			displayOrder: DISPLAY_ORDER.DRAW_CHECKLIST,
 			name: <Trans id="ast.draw.checklist.name">
-				Play as many cards as possible
+				Play as many cards as possible considering <DataLink action="DIVINATION" /> windows.
path: src/parser/jobs/ast/modules/Draw.tsx
user: login: AkairyuGestalter
body: Probably want to revise the checklist name and description now that it's truly focusing on Draw usage. Otherwise lgtm.
created_at: 2025-04-20T14:20:44Z
author_association: CONTRIBUTOR
diff_hunk: @@ -139,33 +159,24 @@ export class Draw extends Analyser {
 		this.checklist.add(new Rule({
 			displayOrder: DISPLAY_ORDER.DRAW_CHECKLIST,
 			name: <Trans id="ast.draw.checklist.name">
-				Play as many cards as possible
+				Play as many cards as possible considering <DataLink action="DIVINATION" /> windows.
path: src/parser/jobs/ast/modules/Draw.tsx
user: login: otocephaly
body: good catch! thank you
updated
created_at: 2025-04-20T17:21:20Z
author_association: CONTRIBUTOR

PR comments:
user: login: AkairyuGestalter
created_at: 2025-04-19T18:47:45Z
body: I still feel like there's a better way to represent the intent we're trying to get at here. The cooldown fudging to only ask for a certain number of Draw uses based on alignment with Divination's CD makes sense, but the checklist requirements for using Play 1 and Lord are already being handled by the ExpectedCardEvaluator as part of the Divination RaidBuffWindow analysis. I feel like what we're actually missing to account for the "you might intentionally drift outside of the window because of fight timeline reasons" case, is a warning against overwriting Lord/Play 1 if not used when the next Draw is pressed, rather than trying to stuff to much into this checklist's requirements.

If you'd rather we keep this as-is at least for now, let me know and I'll go ahead and merge it in since it is doing what it was designed to do. I just wanted to bring up the alternative while I was thinking about it :)
author_association: CONTRIBUTOR
user: login: otocephaly
created_at: 2025-04-19T20:23:59Z
body: > I still feel like there's a better way to represent the intent we're trying to get at here. The cooldown fudging to only ask for a certain number of Draw uses based on alignment with Divination's CD makes sense, but the checklist requirements for using Play 1 and Lord are already being handled by the ExpectedCardEvaluator as part of the Divination RaidBuffWindow analysis. I feel like what we're actually missing to account for the "you might intentionally drift outside of the window because of fight timeline reasons" case, is a warning against overwriting Lord/Play 1 if not used when the next Draw is pressed, rather than trying to stuff to much into this checklist's requirements.
> 
> If you'd rather we keep this as-is at least for now, let me know and I'll go ahead and merge it in since it is doing what it was designed to do. I just wanted to bring up the alternative while I was thinking about it :)

hmm I see what you're getting at. the only edge case it covers that raidbuffwindow does not is when a boss is killed between the odd minute and even minute where in that case, you'd be better off just using the melee card and lord during the 1 min burst. The overwriting is a good suggestion, let me take that back and put something in.
Do you think it'd be better to remove the checklist portion and only put a recommendation for when the boss is killed within 1 min of the expected divination cast and the balance/lord is held? (an example of this happening is M5S since the boss even during enrage is always killed just before raidbuffs can go out, could put as a medium or minor suggestion since sometimes you can't predict if the boss will be killed before raid buffs)
author_association: CONTRIBUTOR
user: login: AkairyuGestalter
created_at: 2025-04-19T20:30:37Z
body: > hmm I see what you're getting at. the only edge case it covers that raidbuffwindow does not is when a boss is killed between the odd minute and even minute where in that case, you'd be better off just using the melee card and lord during the 1 min burst. The overwriting is a good suggestion, let me take that back and put something in. Do you think it'd be better to remove the checklist portion and only put a recommendation for when the boss is killed within 1 min of the expected divination cast and the balance/lord is held? (an example of this happening is M5S since the boss even during enrage is always killed just before raidbuffs can go out, could put as a medium or minor suggestion since sometimes you can't predict if the boss will be killed before raid buffs)

I think keeping the checklist with just the "did you use Draw enough" requirement, but leaving off the "use Play 1" and "use Lord" requirements since those are covered by Divination is good. I know we're usually hesitant about being too strict about ending the fight with resources still available since killtimes are variable, so if you choose to add something there, I'd probably make it only ever a Minor suggestion.

author_association: CONTRIBUTOR
user: login: otocephaly
created_at: 2025-04-19T22:07:30Z
body: Hi @AkairyuGestalter ,
I've updated per your suggestions (the screenshots above have been updated)
Additionally, I updated macrocosmos usages to have higher thresholds and better wording to not imply it should be used on CD (it's mostly just to suggest that people use it more often in the fight)
author_association: CONTRIBUTOR