diff --git a/scripts/hv-unified.user.js b/scripts/hv-unified.user.js index f65b57c..f5e5065 100644 --- a/scripts/hv-unified.user.js +++ b/scripts/hv-unified.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @name HV Unified // @namespace hvunified -// @version 0.14.4 +// @version 0.14.5 // @description HV Unified — battle automation, guidance, and UI enhancements for HentaiVerse // @author GaboGG + Hermes // @match *://*.hentaiverse.org/* @@ -17,7 +17,7 @@ // CONFIG — default settings // ═══════════════════════════════════════════════════════════════════════ -const VERSION = '0.14.4'; +const VERSION = '0.14.5'; const CFG = { // — Battle automation @@ -1337,14 +1337,15 @@ function strategyAdept() { } } - // 4. Debuffs — Imperil on 2+ mobs or bosses; Weaken on high-threat - if (CFG.autoDebuff && STATE.mp > 0.20) { - if (hasReadySpell('Imperil') && (anyRareMonster() || STATE.monsters.length >= 2)) { + // 4. Debuffs — conservative: Imperil on bosses/rares or 5+ mobs + // Weaken only on high-threat or bosses. Estoc handles <5. + if (CFG.autoDebuff && STATE.mp > 0.35) { + if (hasReadySpell('Imperil') && (anyRareMonster() || STATE.monsters.length >= 5)) { const b = findStrongestMonster(); if (b >= 0 && !checkMonsterDebuff(b, 'imperil')) return { type: 'spell', name: 'Imperil', target: b, _reason: 'imperil' }; } - if (hasReadySpell('Weaken') && (anyRareMonster() || hasHighThreat(80) || STATE.monsters.length >= 3)) { + if (hasReadySpell('Weaken') && (anyRareMonster() || hasHighThreat(THREAT_PX))) { const b = findDangerousMonster(); if (b >= 0 && !checkMonsterDebuff(b, 'weaken')) return { type: 'spell', name: 'Weaken', target: b, _reason: 'weaken' }; @@ -1497,18 +1498,18 @@ function strategyVeteran() { } } - // 4. Debuffs — Imperil on any 2+ mobs or bosses; Weaken on high-threat enemies - // On IWBTH, non-boss elites hit hard — debuffs are worth the MP cost - if (CFG.autoDebuff && STATE.mp > 0.20) { - // Imperil: reduce physical mitigation by 25-50% (stacks with Penetrated Armor) - // Use on any tanky enemy when facing 2+ monsters or a rare - if (hasReadySpell('Imperil') && (anyRareMonster() || STATE.monsters.length >= 2)) { + // 4. Debuffs — conservative: Imperil only on bosses/rares or 5+ mobs (Grindfest) + // Weaken only on high-threat (SP >85%) or bosses. Estoc already applies + // Penetrated Armor natively, so Imperil on 2-mob waves is wasteful. + if (CFG.autoDebuff && STATE.mp > 0.35) { + // Imperil: bosses only, or 5+ mobs in Grindfest (Estoc handles <5) + if (hasReadySpell('Imperil') && (anyRareMonster() || STATE.monsters.length >= 5)) { const b = findStrongestMonster(); if (b >= 0 && !checkMonsterDebuff(b, 'imperil')) return { type: 'spell', name: 'Imperil', target: b, _reason: 'imperil' }; } - // Weaken: reduce incoming damage by 50% — use on high-threat or 3+ mobs - if (hasReadySpell('Weaken') && (anyRareMonster() || hasHighThreat(80) || STATE.monsters.length >= 3)) { + // Weaken: only on monsters about to use special attacks (high SP) or bosses + if (hasReadySpell('Weaken') && (anyRareMonster() || hasHighThreat(THREAT_PX))) { const b = findDangerousMonster(); if (b >= 0 && !checkMonsterDebuff(b, 'weaken')) return { type: 'spell', name: 'Weaken', target: b, _reason: 'weaken' }; diff --git a/scripts/latest.user.js b/scripts/latest.user.js index f65b57c..f5e5065 100644 --- a/scripts/latest.user.js +++ b/scripts/latest.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @name HV Unified // @namespace hvunified -// @version 0.14.4 +// @version 0.14.5 // @description HV Unified — battle automation, guidance, and UI enhancements for HentaiVerse // @author GaboGG + Hermes // @match *://*.hentaiverse.org/* @@ -17,7 +17,7 @@ // CONFIG — default settings // ═══════════════════════════════════════════════════════════════════════ -const VERSION = '0.14.4'; +const VERSION = '0.14.5'; const CFG = { // — Battle automation @@ -1337,14 +1337,15 @@ function strategyAdept() { } } - // 4. Debuffs — Imperil on 2+ mobs or bosses; Weaken on high-threat - if (CFG.autoDebuff && STATE.mp > 0.20) { - if (hasReadySpell('Imperil') && (anyRareMonster() || STATE.monsters.length >= 2)) { + // 4. Debuffs — conservative: Imperil on bosses/rares or 5+ mobs + // Weaken only on high-threat or bosses. Estoc handles <5. + if (CFG.autoDebuff && STATE.mp > 0.35) { + if (hasReadySpell('Imperil') && (anyRareMonster() || STATE.monsters.length >= 5)) { const b = findStrongestMonster(); if (b >= 0 && !checkMonsterDebuff(b, 'imperil')) return { type: 'spell', name: 'Imperil', target: b, _reason: 'imperil' }; } - if (hasReadySpell('Weaken') && (anyRareMonster() || hasHighThreat(80) || STATE.monsters.length >= 3)) { + if (hasReadySpell('Weaken') && (anyRareMonster() || hasHighThreat(THREAT_PX))) { const b = findDangerousMonster(); if (b >= 0 && !checkMonsterDebuff(b, 'weaken')) return { type: 'spell', name: 'Weaken', target: b, _reason: 'weaken' }; @@ -1497,18 +1498,18 @@ function strategyVeteran() { } } - // 4. Debuffs — Imperil on any 2+ mobs or bosses; Weaken on high-threat enemies - // On IWBTH, non-boss elites hit hard — debuffs are worth the MP cost - if (CFG.autoDebuff && STATE.mp > 0.20) { - // Imperil: reduce physical mitigation by 25-50% (stacks with Penetrated Armor) - // Use on any tanky enemy when facing 2+ monsters or a rare - if (hasReadySpell('Imperil') && (anyRareMonster() || STATE.monsters.length >= 2)) { + // 4. Debuffs — conservative: Imperil only on bosses/rares or 5+ mobs (Grindfest) + // Weaken only on high-threat (SP >85%) or bosses. Estoc already applies + // Penetrated Armor natively, so Imperil on 2-mob waves is wasteful. + if (CFG.autoDebuff && STATE.mp > 0.35) { + // Imperil: bosses only, or 5+ mobs in Grindfest (Estoc handles <5) + if (hasReadySpell('Imperil') && (anyRareMonster() || STATE.monsters.length >= 5)) { const b = findStrongestMonster(); if (b >= 0 && !checkMonsterDebuff(b, 'imperil')) return { type: 'spell', name: 'Imperil', target: b, _reason: 'imperil' }; } - // Weaken: reduce incoming damage by 50% — use on high-threat or 3+ mobs - if (hasReadySpell('Weaken') && (anyRareMonster() || hasHighThreat(80) || STATE.monsters.length >= 3)) { + // Weaken: only on monsters about to use special attacks (high SP) or bosses + if (hasReadySpell('Weaken') && (anyRareMonster() || hasHighThreat(THREAT_PX))) { const b = findDangerousMonster(); if (b >= 0 && !checkMonsterDebuff(b, 'weaken')) return { type: 'spell', name: 'Weaken', target: b, _reason: 'weaken' }; diff --git a/src/config.js b/src/config.js index 1c9f6cf..ccfb92e 100644 --- a/src/config.js +++ b/src/config.js @@ -2,7 +2,7 @@ // CONFIG — default settings // ═══════════════════════════════════════════════════════════════════════ -const VERSION = '0.14.4'; +const VERSION = '0.14.5'; const CFG = { // — Battle automation diff --git a/src/header.user.js b/src/header.user.js index 6888b41..6f335d6 100644 --- a/src/header.user.js +++ b/src/header.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @name HV Unified // @namespace hvunified -// @version 0.14.4 +// @version 0.14.5 // @description HV Unified — battle automation, guidance, and UI enhancements for HentaiVerse // @author GaboGG + Hermes // @match *://*.hentaiverse.org/* diff --git a/src/strategy-engine.js b/src/strategy-engine.js index 26d8d4c..4b3e457 100644 --- a/src/strategy-engine.js +++ b/src/strategy-engine.js @@ -612,14 +612,15 @@ function strategyAdept() { } } - // 4. Debuffs — Imperil on 2+ mobs or bosses; Weaken on high-threat - if (CFG.autoDebuff && STATE.mp > 0.20) { - if (hasReadySpell('Imperil') && (anyRareMonster() || STATE.monsters.length >= 2)) { + // 4. Debuffs — conservative: Imperil on bosses/rares or 5+ mobs + // Weaken only on high-threat or bosses. Estoc handles <5. + if (CFG.autoDebuff && STATE.mp > 0.35) { + if (hasReadySpell('Imperil') && (anyRareMonster() || STATE.monsters.length >= 5)) { const b = findStrongestMonster(); if (b >= 0 && !checkMonsterDebuff(b, 'imperil')) return { type: 'spell', name: 'Imperil', target: b, _reason: 'imperil' }; } - if (hasReadySpell('Weaken') && (anyRareMonster() || hasHighThreat(80) || STATE.monsters.length >= 3)) { + if (hasReadySpell('Weaken') && (anyRareMonster() || hasHighThreat(THREAT_PX))) { const b = findDangerousMonster(); if (b >= 0 && !checkMonsterDebuff(b, 'weaken')) return { type: 'spell', name: 'Weaken', target: b, _reason: 'weaken' }; @@ -772,18 +773,18 @@ function strategyVeteran() { } } - // 4. Debuffs — Imperil on any 2+ mobs or bosses; Weaken on high-threat enemies - // On IWBTH, non-boss elites hit hard — debuffs are worth the MP cost - if (CFG.autoDebuff && STATE.mp > 0.20) { - // Imperil: reduce physical mitigation by 25-50% (stacks with Penetrated Armor) - // Use on any tanky enemy when facing 2+ monsters or a rare - if (hasReadySpell('Imperil') && (anyRareMonster() || STATE.monsters.length >= 2)) { + // 4. Debuffs — conservative: Imperil only on bosses/rares or 5+ mobs (Grindfest) + // Weaken only on high-threat (SP >85%) or bosses. Estoc already applies + // Penetrated Armor natively, so Imperil on 2-mob waves is wasteful. + if (CFG.autoDebuff && STATE.mp > 0.35) { + // Imperil: bosses only, or 5+ mobs in Grindfest (Estoc handles <5) + if (hasReadySpell('Imperil') && (anyRareMonster() || STATE.monsters.length >= 5)) { const b = findStrongestMonster(); if (b >= 0 && !checkMonsterDebuff(b, 'imperil')) return { type: 'spell', name: 'Imperil', target: b, _reason: 'imperil' }; } - // Weaken: reduce incoming damage by 50% — use on high-threat or 3+ mobs - if (hasReadySpell('Weaken') && (anyRareMonster() || hasHighThreat(80) || STATE.monsters.length >= 3)) { + // Weaken: only on monsters about to use special attacks (high SP) or bosses + if (hasReadySpell('Weaken') && (anyRareMonster() || hasHighThreat(THREAT_PX))) { const b = findDangerousMonster(); if (b >= 0 && !checkMonsterDebuff(b, 'weaken')) return { type: 'spell', name: 'Weaken', target: b, _reason: 'weaken' };