v0.14.25 - Stalling: refresh buffs when 1 enemy remains (gives skill CDs time)

- New stalling logic: when exactly 1 normal enemy remains (not rare,
  not high threat), refresh any buff below 15 turns instead of attacking
- This naturally delays the killing blow by 1 turn, letting Rending Blow
  and Shatter Strike cooldowns tick down before the round ends
- Result: next round starts with skills ready + higher buff uptime
- Edge case: one-tapping the last enemy would end the round with skills
  still on cooldown — now avoided
This commit is contained in:
GaboGG 2026-07-28 09:36:58 -04:00
parent 7c714eb589
commit 3618198081
5 changed files with 48 additions and 6 deletions

View file

@ -1,7 +1,7 @@
// ==UserScript==
// @name HV Unified
// @namespace hvunified
// @version 0.14.24
// @version 0.14.25
// @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.24';
const VERSION = '0.14.25';
const CFG = {
// — Battle automation
@ -1644,6 +1644,20 @@ function strategyVeteran() {
if (ch) return ch;
}
// ── Stalling: when 1 normal enemy remains, prefer buff refreshes over killing
// This gives weapon skill cooldowns time to tick down before next round.
if (STATE.monsters && STATE.monsters.length === 1 && !anyRareMonster() && !hasHighThreat(THREAT_PX)) {
for (const b of BUFF_PRIORITY) {
const dur = buffDuration(b.icon);
if (dur === 0 || dur < 15) {
if (b.icon === 'regen' && STATE.hp >= CFG.cureRegenHP) continue;
if (hasReadySpell(b.spell) && STATE.mp > 0.15) {
return { type: 'spell', name: b.spell, selfTarget: true, _reason: 'stall' };
}
}
}
}
const t = hasHighThreat(THREAT_PX) ? findDangerousMonster() : (STATE.monsters.length > 2 ? findOptimalDominoTarget() : findWeakestMonster());
if (t >= 0 && STATE.monsters[t] && STATE.monsters[t].hasAttribute('onclick'))
return { type: 'attack', target: t, _reason: hasHighThreat(THREAT_PX) ? 'threat' : 'fallback' };

View file

@ -1,7 +1,7 @@
// ==UserScript==
// @name HV Unified
// @namespace hvunified
// @version 0.14.24
// @version 0.14.25
// @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.24';
const VERSION = '0.14.25';
const CFG = {
// — Battle automation
@ -1644,6 +1644,20 @@ function strategyVeteran() {
if (ch) return ch;
}
// ── Stalling: when 1 normal enemy remains, prefer buff refreshes over killing
// This gives weapon skill cooldowns time to tick down before next round.
if (STATE.monsters && STATE.monsters.length === 1 && !anyRareMonster() && !hasHighThreat(THREAT_PX)) {
for (const b of BUFF_PRIORITY) {
const dur = buffDuration(b.icon);
if (dur === 0 || dur < 15) {
if (b.icon === 'regen' && STATE.hp >= CFG.cureRegenHP) continue;
if (hasReadySpell(b.spell) && STATE.mp > 0.15) {
return { type: 'spell', name: b.spell, selfTarget: true, _reason: 'stall' };
}
}
}
}
const t = hasHighThreat(THREAT_PX) ? findDangerousMonster() : (STATE.monsters.length > 2 ? findOptimalDominoTarget() : findWeakestMonster());
if (t >= 0 && STATE.monsters[t] && STATE.monsters[t].hasAttribute('onclick'))
return { type: 'attack', target: t, _reason: hasHighThreat(THREAT_PX) ? 'threat' : 'fallback' };

View file

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

View file

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

View file

@ -918,6 +918,20 @@ function strategyVeteran() {
if (ch) return ch;
}
// ── Stalling: when 1 normal enemy remains, prefer buff refreshes over killing
// This gives weapon skill cooldowns time to tick down before next round.
if (STATE.monsters && STATE.monsters.length === 1 && !anyRareMonster() && !hasHighThreat(THREAT_PX)) {
for (const b of BUFF_PRIORITY) {
const dur = buffDuration(b.icon);
if (dur === 0 || dur < 15) {
if (b.icon === 'regen' && STATE.hp >= CFG.cureRegenHP) continue;
if (hasReadySpell(b.spell) && STATE.mp > 0.15) {
return { type: 'spell', name: b.spell, selfTarget: true, _reason: 'stall' };
}
}
}
}
const t = hasHighThreat(THREAT_PX) ? findDangerousMonster() : (STATE.monsters.length > 2 ? findOptimalDominoTarget() : findWeakestMonster());
if (t >= 0 && STATE.monsters[t] && STATE.monsters[t].hasAttribute('onclick'))
return { type: 'attack', target: t, _reason: hasHighThreat(THREAT_PX) ? 'threat' : 'fallback' };