v0.14.5 - Conservative debuffs: Imperil only on bosses/rares or 5+ mobs

- Imperil no longer casts on every 2-mob wave (Estoc's native Penetrated
  Armor handles armor-breaking for <5 targets)
- Imperil threshold raised from MP>20% to MP>35%
- Imperil now only fires on bosses/rares OR 5+ monster waves (Grindfest)
- Weaken now only on high-threat (SP>85%) or bosses, not every 3-mob wave
- Formerly: Imperil on 2+ mobs, Weaken on 3+ mobs — drained MP fast
This commit is contained in:
GaboGG 2026-07-27 14:46:39 -04:00
parent 0a41f9d7c5
commit 9af0237754
5 changed files with 45 additions and 42 deletions

View file

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

View file

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

View file

@ -2,7 +2,7 @@
// CONFIG — default settings // CONFIG — default settings
// ═══════════════════════════════════════════════════════════════════════ // ═══════════════════════════════════════════════════════════════════════
const VERSION = '0.14.4'; const VERSION = '0.14.5';
const CFG = { const CFG = {
// — Battle automation // — Battle automation

View file

@ -1,7 +1,7 @@
// ==UserScript== // ==UserScript==
// @name HV Unified // @name HV Unified
// @namespace hvunified // @namespace hvunified
// @version 0.14.4 // @version 0.14.5
// @description HV Unified — battle automation, guidance, and UI enhancements for HentaiVerse // @description HV Unified — battle automation, guidance, and UI enhancements for HentaiVerse
// @author GaboGG + Hermes // @author GaboGG + Hermes
// @match *://*.hentaiverse.org/* // @match *://*.hentaiverse.org/*

View file

@ -612,14 +612,15 @@ function strategyAdept() {
} }
} }
// 4. Debuffs — Imperil on 2+ mobs or bosses; Weaken on high-threat // 4. Debuffs — conservative: Imperil on bosses/rares or 5+ mobs
if (CFG.autoDebuff && STATE.mp > 0.20) { // Weaken only on high-threat or bosses. Estoc handles <5.
if (hasReadySpell('Imperil') && (anyRareMonster() || STATE.monsters.length >= 2)) { if (CFG.autoDebuff && STATE.mp > 0.35) {
if (hasReadySpell('Imperil') && (anyRareMonster() || STATE.monsters.length >= 5)) {
const b = findStrongestMonster(); const b = findStrongestMonster();
if (b >= 0 && !checkMonsterDebuff(b, 'imperil')) if (b >= 0 && !checkMonsterDebuff(b, 'imperil'))
return { type: 'spell', name: 'Imperil', target: b, _reason: '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(); const b = findDangerousMonster();
if (b >= 0 && !checkMonsterDebuff(b, 'weaken')) if (b >= 0 && !checkMonsterDebuff(b, 'weaken'))
return { type: 'spell', name: 'Weaken', target: b, _reason: '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 // 4. Debuffs — conservative: Imperil only on bosses/rares or 5+ mobs (Grindfest)
// On IWBTH, non-boss elites hit hard — debuffs are worth the MP cost // Weaken only on high-threat (SP >85%) or bosses. Estoc already applies
if (CFG.autoDebuff && STATE.mp > 0.20) { // Penetrated Armor natively, so Imperil on 2-mob waves is wasteful.
// Imperil: reduce physical mitigation by 25-50% (stacks with Penetrated Armor) if (CFG.autoDebuff && STATE.mp > 0.35) {
// Use on any tanky enemy when facing 2+ monsters or a rare // Imperil: bosses only, or 5+ mobs in Grindfest (Estoc handles <5)
if (hasReadySpell('Imperil') && (anyRareMonster() || STATE.monsters.length >= 2)) { if (hasReadySpell('Imperil') && (anyRareMonster() || STATE.monsters.length >= 5)) {
const b = findStrongestMonster(); const b = findStrongestMonster();
if (b >= 0 && !checkMonsterDebuff(b, 'imperil')) if (b >= 0 && !checkMonsterDebuff(b, 'imperil'))
return { type: 'spell', name: 'Imperil', target: b, _reason: 'imperil' }; return { type: 'spell', name: 'Imperil', target: b, _reason: 'imperil' };
} }
// Weaken: reduce incoming damage by 50% — use on high-threat or 3+ mobs // Weaken: only on monsters about to use special attacks (high SP) or bosses
if (hasReadySpell('Weaken') && (anyRareMonster() || hasHighThreat(80) || STATE.monsters.length >= 3)) { if (hasReadySpell('Weaken') && (anyRareMonster() || hasHighThreat(THREAT_PX))) {
const b = findDangerousMonster(); const b = findDangerousMonster();
if (b >= 0 && !checkMonsterDebuff(b, 'weaken')) if (b >= 0 && !checkMonsterDebuff(b, 'weaken'))
return { type: 'spell', name: 'Weaken', target: b, _reason: 'weaken' }; return { type: 'spell', name: 'Weaken', target: b, _reason: 'weaken' };