Commit graph

113 commits

Author SHA1 Message Date
GaboGG
751d001ba3 v0.17.6 - jpx chain: never press M while jpx is active (toggle-off guard)
Fixes the race where our synthetic M landed while jpx was mid-round
(active=true) and disabled the chain. Now jpxTriggerAuto skips if
jpxLastActive===true, and the initial press waits for jpx's first state
event. NOTE: ajaxRound must stay OFF for chaining to work — jpx's AJAX
round advance dispatches a synthetic DOMContentLoaded that resets its
own isActiveBattle flag.
2026-08-04 17:15:42 -04:00
GaboGG
5012d5f74f v0.17.5 - jpx bridge: verify M keybind lands + log mob count
Adds a probe after dispatching the synthetic M keydown: compares jpx's
active state before/after 700ms and logs  registered or  keybind miss.
This distinguishes 'M not reaching jpx' from 'jpx not chaining'.
2026-08-04 17:06:50 -04:00
GaboGG
4d29215e71 v0.17.4 - jpx chain: wait for next-round monsters before pressing M
The chain was pressing M at round-END (continue button up, no monsters),
so jpx read it as 'advance' and never started auto-play on the next round.
Now: on jpx inactive, poll up to 8s until the next round's monsters spawn,
THEN trigger M. Manual M worked because user pressed it after round load.
2026-08-04 16:03:56 -04:00
GaboGG
6a7d5a435b v0.17.3 - Declare jpxChainRetryCount (fix ReferenceError crash on battle init) 2026-08-04 16:00:19 -04:00
GaboGG
30bade19bd v0.17.2 - Fix chainState ref, lazy jpx detection, diag visibility
- Fix: chainState/chain used renamed var (jpxChainEnabled vs jpxChainStarted)
- Fix: jpxChainStart lazy-retries (10x/600ms) since jpx creates #ctrl-widget lazily
- Remove duplicate jpxChainStart definition
- HV.diag() now reports scripts.jpx + jpxBridge state for field diagnosis
2026-08-04 15:59:08 -04:00
GaboGG
68b44e022a v0.17.1 - jpx bridge v2: listen to jpx state events
- Listen for jpx_ctrlWidget_update (detail.active) — jpx's own state signal
- Re-trigger M when jpx reports inactive + monsters present + not battle over
- Fallback 2s poll in case the event is missed on page reload
- Cooldown guard (2.5s) to avoid double-trigger
- Stops on maxRounds / low HP / battle finish
2026-08-04 15:56:16 -04:00
GaboGG
5941b1d236 v0.17.0 - jpx round-chaining bridge
- New src/jpx-bridge.js: re-triggers jpx auto-battle (M key) after each
  round completes, chaining single-round auto-battler into continuous play
- Config: autoChainJpx (default on), chainMinHP 0.25, chainMaxRounds 0
- Safety: stops below chainMinHP, at maxRounds, or when jpx absent
- Settings panel: jpx Bridge section
- API: HV.chain(on), HV.chainState()
- Works by dispatching synthetic 'm' keydown (jpx reads e.key, not isTrusted)
- Never re-implements battle logic — jpx executes, we bridge rounds
2026-08-04 15:53:25 -04:00
GaboGG
20068df55c v0.16.3 - Fix ',' toggle double-flip desync (settings key now opens AND closes) 2026-08-04 15:08:41 -04:00
GaboGG
de9605609e v0.16.2 - Fix ',' settings key to work on any page; robust MB/HVUT detection 2026-08-04 14:59:09 -04:00
GaboGG
24c47edece v0.16.1 - Add HV.diag() integration diagnostics + error trap 2026-08-04 14:52:13 -04:00
GaboGG
f2fc00965e v0.16.0 - Complement community scripts (AGY refactor)
REMOVED (owned by MB/HVUT):
- RE timer (HVUtils has one)
- Battle keybinds Q/H/C (Monsterbation owns battle keys; kept , for settings)
- Hover-attack battle UI hooks (Monsterbation)
- Battle logger (Monsterbation combat log)
- Spirit/potion/scroll auto-use in battle (Monsterbation)
- Armory bulk sell/salvage/shrine UI + Keep Top 10% button (HVUtils bulk tools)

RESOLVED:
- Q keybind collision: yielded to Monsterbation
- DOM double-injection: removed duplicate overlays
- Storage: hvunified_ namespace isolated from HVUT GM_* storage

KEPT (gaps community doesn't cover):
- Gear analysis/scoring (equipped vs store, 19-category advisory)
- Strategy guidance as advisory layer (HV.advice/HV.action)
- Guidance/abilities/difficulty advisor
- window.HV public API bridge
2026-08-04 14:03:34 -04:00
GaboGG
589ed7e34c v0.15.4 - Elemental Strikes parsed + scored per wiki (Void Strike, etc.)
From EHWiki Detailed_Equip_Characteristics + Equipment_Basics:
- Elemental strikes are 'X Strike (Y%)' lines (Void/Fire/Cold/Elec/
  Wind/Holy/Dark), separate hit for ~50% of physical damage, max 2
  strikes + Void Strike
- Ethereal weapons deal Void damage (+523 Void Damage), prefixes:
  Ethereal→Void, Fiery→Fire, Arctic→Cold, Shocking→Elec,
  Tempestuous→Wind, Hallowed→Holy, Demonic→Dark
- Weapon procs by type: Piercing→Penetrated Armor (Estoc/Rapier),
  Crushing→Stun (Mace/Club), Slashing→Bleeding Wound (Longsword/
  Katana/Shortsword/Axe/Wakizashi)

Parser now captures:
- stats['Strike <Elem>'] = chance% (e.g. 'Strike Void': 50)
- stats['Weapon Damage'] for Void too (+523 Void Damage)

Scorer adds expected strike damage (chance/100 × 0.5 × weapon dmg)
weighted same as base damage. Type bonuses updated to match real
procs (Stun 1.15x > Bleeding 1.10x, Rapier 1.20x like Estoc 1.25x).

So your lottery Peerless Ethereal Rapier (+523 Void, Void Strike 50%)
now scores properly. Note: re-scrape after update for Strike fields.
2026-08-03 16:04:37 -04:00
GaboGG
f993014a46 v0.15.3 - Scorer now accounts for weapon damage, elemental damage, and procs
Parser fix: parseEquipHTML now captures the direct-child divs of the
tooltip that were previously skipped:
  - Proc lines: 'Penetrated Armor: 21.7% chance' -> stats['Proc Penetrated Armor']
  - Base damage: '+708 Piercing Damage' -> stats['Weapon Damage']
  - Elemental lines: '+25 Fire Damage' / '+30 Elec Strike' -> stats['Elemental Fire']

Scorer (gearScoreWeapon + analyze_gear.py):
  - Weapon Damage x 0.30 (base damage matters)
  - Elemental damage x 0.25 per element
  - Proc bonuses by type: CC procs (stun/freeze) x0.45, armor break
    x0.35, DoT x0.25, generic x0.15
  - All multiplied by the same quality multiplier afterward

So an elemental weapon with a strike proc now gets its due — the
short-margin stat winner may no longer win once damage+proc count.
Note: re-scrape the armory/store after updating so the new fields
get captured (old entries lack Weapon Damage/Proc keys).
2026-08-03 16:00:59 -04:00
GaboGG
b069d42fc8 v0.15.2 - Gate spirit stance auto-enable behind CFG.autoSpirit (default OFF)
The 7+ mob burst toggle (step 0d) ignored CFG.autoSpirit and always
fired. It enabled spirit, then other priority steps (debuffs, buffs,
items) intercepted before the weapon skill fired, wasting the toggle
cycle and OC. Also the off-toggle didn't always fire.

Now: autoSpirit=false (default) → no auto-enable at all. Manual
spirit toggle only. The settings panel toggle ('Auto Spirit Stance')
already existed — it now actually gates the behavior.
2026-08-03 10:07:53 -04:00
GaboGG
b59da5544a v0.15.1 - Keep Top 10% (min 5) instead of fixed 5
- keepCount = max(5, ceil(categorySize * 0.10))
- Small categories still keep minimum 5; large ones scale up
  (e.g. 40 items in a category → keep 5, 80 → keep 8, 120 → keep 12)
2026-07-31 14:28:17 -04:00
GaboGG
1c14e9b2a4 v0.15.0 - Keep Top 5 smart-selector for sell/salvage screens
New button on Sell and Salvage tabs: ' Keep Top 5 / Select Sell/Salvage Rest'

- Groups every un-equipped, unlocked, unpinned item into 19 categories:
  1H, 2H, Staff, Shield + 5 armor slots (Head/Body/Hands/Legs/Feet)
  × armor type (Cloth/Light/Heavy)
- Scores items using the same gear-analysis weights (quality mult,
  weapon type bonus, PMit/Evade/STR etc.)
- Keeps the 5 highest-scoring items per category unchecked
- Checks everything else for selling or salvaging
- Console logs per-category breakdown (e.g. '🗂 Light Head: 12 items
  → keep 5 (top 161/149/141/138/131), select 7')

Bump: 0.14.41 → 0.15.0
2026-07-31 14:24:25 -04:00
GaboGG
e935e34ae1 v0.14.41 - Fix gear slot detection: 'gi' was matching inside 'leggings'
Root cause: gearDetectSlot used substring matching. The Body keyword
'gi' (for gi/jacket) appears inside the word 'leggings' (l-e-g-g-i-n-g-s),
so EVERY leggings item was classified as Body:
  - Legs slot showed '(no data)' — its equipped item was mis-detected
  - Body slot showed leggings items as top candidates (176 score)

Fix: word-boundary regex match (\bgi\b) so 'gi' only matches as a
standalone word. Also protects against 'cap' in 'capacity' etc.
2026-07-31 10:59:17 -04:00
GaboGG
641363b5b0 v0.14.40 - Gear panel: armor/weapon filters + fix level detection
- Added filter dropdowns to the panel: Armor (Light/Heavy/Cloth/All)
  and Weapon (2H/Estoc/Longsword/Great Mace/Club/Axe/Scythe).
  Persisted in localStorage. Default: Light armor, 2H weapons.
  Filters exclude non-matching items from armory/buy candidates
  (equipped item always shown regardless).
- Fixed gearPlayerLevel(): now reads STATE.level first (battle
  parser caches it), then the hv-cfg-btn label (Lv195), then
  level_readout. Previously fell back to 155 when the level readout
  used CSS fonts — this excluded the Lv171 equipped Estoc from
  candidates, causing 'vs ?' in the upgrade line.
- Upgrade line now always shows a real number (scores equipped
  directly if it missed candidates).

Also scrapes correctly on equipment pages: clicking Analyze there
refreshes equipped slots from dynjs_equip store.
2026-07-31 10:50:18 -04:00
GaboGG
7442d7c512 v0.14.39 - Call enhanceGearAnalysis on equipshop pages (ss=eq)
Bug: init.js only called enhanceGearAnalysis() when STATE.page ===
'armory'. The equipment page (ss=eq) maps to STATE.page ===
'equipshop' in page-detector.js, so the button never rendered.

Fix: added the equipshop case.
2026-07-31 10:45:17 -04:00
GaboGG
2f711db66c v0.14.38 - Gear analysis on equipment pages too (ss=eq)
- enhanceGearAnalysis now also fires on Character > Equipment pages
  (id=eqsb), not just Bazaar (equiplist)
- On equipment pages only the Analyze button shows (Rescan hidden —
  no store/inventory data to rescan there, but the localStorage DB
  is still accessible for the comparison)
- Clicking Analyze on ss=eq rescrapes equipped slots + opens panel
  with stored/purchasable comparisons from localStorage
2026-07-31 10:42:39 -04:00
GaboGG
b2e96c6191 v0.14.37 - Fix gear panel: buttons were submitting the armory form
Root cause: both buttons were inserted inside the armory <form>.
HTML <button> defaults to type=submit — clicking submitted the form,
the page reloaded, and the panel (which renders 300ms later) was
destroyed. The split-second flash was the panel before the reload.

Fix: type='button' on both buttons. Panel now stays up.
2026-07-31 09:02:16 -04:00
GaboGG
f3561bb435 v0.14.36 - Add diagnostic logs to gear panel (click, build, render) 2026-07-31 08:57:28 -04:00
GaboGG
217e0cd162 v0.14.35 - Fix gear panel not showing + remove Daily Activities
- Gear panel: wrapped autoScrapeGear() and buildGearPanel() in try/catch.
  An exception during scrape (new store-scan loop) killed the onclick
  handler before the panel was scheduled — panel never appeared.
- Removed renderProgressPanel() call (Daily Activities window) per user
  request — not used.
2026-07-31 07:14:52 -04:00
GaboGG
03cbccf703 v0.14.34 - Fix difficulty comparison case bug
Bug: difficulties.indexOf(difficulty.toUpperCase()) — the array has
'Nintendo' (mixed case) but toUpperCase() gives 'NINTENDO' which
doesn't match, so currentIdx = -1 and -1 < suggestedIdx always true.
The suggestion kept firing even when already on Nintendo.
(IWBTH worked by luck since uppercase == itself.)

Fix: case-insensitive findIndex comparison on both sides.
2026-07-31 07:09:30 -04:00
GaboGG
166539e845 v0.14.33 - In-game gear analysis module
New src/gear-analysis.js — ports analyze_gear.py scoring to JS:
- gearScoreArmor() / gearScoreWeapon() — same weights as Python
- gearDetectSlot() / gearIsTwoHandWeapon() / gearUsable()
- analyzeGear() — scores equipped vs armory vs buy per slot

UI on Armory pages (above equiplist):
- 🔍 Analyze Gear — rescrapes current page, shows per-slot panel
  with top 4 candidates, scores, prices, and upgrade highlights
- 🔄 Clear Buy + Rescan — wipes stale buy data, rescrapes, analyzes

scrapeBuyPage() now also scavenges the full dynjs_eqstore for items
not visible in the current filter tab — one Purchase visit captures
the entire store (429+ items), no need to click through tabs.

Console API: HV.analyzeGear(), HV.gearPanel(), HV.clearBuy()
2026-07-31 07:07:38 -04:00
GaboGG
6ac31faa1f v0.14.32 - Veteran suggestion: IWBTH → Nintendo
- guidance.js now suggests Nintendo (4x) instead of IWBTH (5x) for
  the Veteran tier (150-300). You're dropping down to clear arenas
  while the current gear catches up.
- Updated the reason text to '10x EXP. Better drops than Hell, while
  still comfortable.'
2026-07-29 12:41:15 -04:00
GaboGG
3ec8932b86 v0.14.31 - Skip debuffs during spirit burst (flag >= 1) to prevent toggle loops
Bug: spirit toggle ON → Imperil intercepts → toggle OFF → never fires skill.
The 3-state flag for spirit burst worked, but debuffs (Imperil at step 6)
came before weapon skills (step 11) in the priority chain. Each time the
flag advanced past 1, Imperil fired instead of Rending Blow, consuming
the turn and causing spirit to toggle off without ever using the skill.

Fix: debuffs now check _spiritForSkill === 0 before firing. When spirit
burst is pending (flag >= 1), skip Imperil/Weaken so the weapon skills
section fires uninterrupted.
2026-07-29 12:35:50 -04:00
GaboGG
2d6042df64 v0.14.30 - Ignore high threat when 2 or fewer enemies
- Step 0e (emergency weapon skills): requires STATE.monsters.length >= 3.
  With 1-2 enemies, basic attack and tank the hits — better to farm OC.
- Step 11 (normal weapon skills): isHighThreat trigger also requires >= 3.
  If OC >= 60 naturally, skills still fire regardless of enemy count.
- Great Cleave on rares still works at lower OC since rares are worth
  killing fast regardless of group size.
2026-07-28 10:43:07 -04:00
GaboGG
782a094691 v0.14.29 - Fix Rending Blow positioning + remove hp guard on OC build
- Rending Blow now uses findOptimalDominoTarget() which scores monsters
  by how many alive neighbors are within 2 slots left/right. This
  ensures RB hits max targets instead of wasting half the AoE on
  edge monsters (previously used findDangerousMonster which ignores
  positioning).
- Removed STATE.hp > 0.40 guard from step 2c OC-building check. When
  Spark of Life procs, hp=0 in the DOM but the player is still alive.
  The old guard blocked OC building in this state, causing Imperil
  to fire instead of basic attacking to build OC.
2026-07-28 10:40:16 -04:00
GaboGG
e48ef78121 v0.14.28 - OC-building priority: skip debuffs/buffs when AoE ready but OC low
New step 2c: when 5+ monsters, Rending Blow is ready, and OC < 60,
skip Imperil/Absorb/buff loops and basic attack to build OC.

In your log, RB was ready (sk:RRGR) from turn 1 at OC=20, but the
script spent 20 turns on Imperil x3 + Absorb (999!) + Curx3 +
items before finally firing RB at turn 21 when monsters were at
100+ SP. Now it basic-attacks aggressively to hit OC=60 faster,
then fires RB as soon as threshold is reached.
2026-07-28 10:36:34 -04:00
GaboGG
206c682d9e v0.14.27 - Enhanced logging: alive/dead markers, skill readiness, item counts
Log line now shows:
- spBars: 0:29A 1:28A 2:59A 3:52A 4:34A 5:43A 6:29A
  (A=alive onclick, D=dead/no onclick — so you know which SP bars
   are actionable vs leftover from dead mobs)
- sk: RC CC RC (R=Rending Blow Ready/C=Cooldown, S=Shatter, G=Great Cleave)
  — first char of skill name + R/C for ready/cooldown
- h5 s3 m4 (heal=5, spirit=3, mana=4 — item counts per type)
  — so you can see consumable status at a glance
2026-07-28 10:16:31 -04:00
GaboGG
ff728fe68f v0.14.26 - Fix threat threshold (70%->80%) + stalling on single enemy
- Threat threshold raised from 70% (84px) to 80% (96px) — stops
  wasting OC on Rending Blow when enemies are at 89 SP (31 points
  from actually specialing). In the log, RB fired at OC=50 on 89SP
  mobs which wasn't an emergency.
- Single-monster stalling now triggers regardless of enemy SP level.
  Previously blocked by !hasHighThreat — if the last enemy had high
  SP, stalling was skipped and the script killed immediately, wasting
  the stall opportunity for skill cooldown recovery.
2026-07-28 10:14:08 -04:00
GaboGG
3618198081 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
2026-07-28 09:36:58 -04:00
GaboGG
7c714eb589 v0.14.24 - Fix spirit burst toggle-off (was stuck ON after Rending Blow killed <7 mobs)
- The toggle-off (state 2 -> OFF) was inside the monsters.length >= 7 check
- If Rending Blow killed enough enemies to drop below 7, the else block
  reset _spiritForSkill = 0 without toggling spirit off, leaving it ON
- Now toggle-off guard runs independently of monster count
- Also resets flag if spirit gets toggled externally
2026-07-28 09:19:22 -04:00
GaboGG
f42e44db34 v0.14.23 - OC conservation: save weapon skills for 3+ mob groups
- Raised heal threshold from 60%@7+ to 65%@5+ (earlier healing in big groups)
- Cure threshold also dynamic: 65% when 5+ mobs, normal otherwise
- Secondary weapon skill dump restricted to 3+ enemies (no OC waste on cleanup)
- Great Cleave already limited to rares — kept as-is
- Simulation confirmed +7 rounds deeper (R30->R37 avg) from OC conservation
- Source: agy_oc_output.txt
2026-07-28 09:12:01 -04:00
GaboGG
93c0f85acd v0.14.22 - Survival-first priority chain (simulation-backed, 10/10 survival)
AGY built a full 60-round arena simulator (hv-battle-sim.py) using
the user's actual gear/stats and ran 10 iterations:

  Original: 0/10 survived (0%)
  Improved: 10/10 survived (100%)

Critical changes from simulation findings:
  - Health items + Cure moved to TOP of priority chain (before skills)
  - Dynamic HP threshold: 60% when 7+ mobs, normal threshold otherwise
  - SP threshold raised from 55% to 60% for Spark safety buffer
  - Mana maintenance raised to prevent spell lockout
  - AoE crowd control prioritized for 4+ mobs

Full report in agy_sim_output.txt
2026-07-28 06:19:02 -04:00
GaboGG
229d81b86c v0.14.21 - Show purchasable (buy) items in gearSummary
- logGearSummary() now shows 3 sources: 🟢 equipped, 📦 stored, 🛒 purchasable
- Highlights buy items NOT already in armory inventory
- Summary: Gear DB: 746 total (7 🟢 equipped, 305 📦 stored, 434 🛒 purchasable)
- Works with manual HV.scrapeGear() call on Purchase page
2026-07-27 20:54:16 -04:00
GaboGG
5286f66b3e v0.14.20 - Fix Purchase page scraper: const dynjs_eqstore + screen=purchase
- Bug 1: Purchase tab URL is 'screen=purchase', not 'screen=buy'
- Bug 2: dynjs_eqstore is declared with 'const', not 'var', so it doesn't
  create a window property. getHVEquipStore() now also checks bare names
  which works with @grant none and the IIFE scope chain
- Fixed price parsing: purchase table has 2 td cells (label + price),
  previously required >3 cells so prices were always empty
- Names with 🔺 prefix are cleaned before storage
2026-07-27 20:48:27 -04:00
GaboGG
f2e8ce536a v0.14.19 - Add Bazaar Buy page scraper + 3-source analysis
- scrapeBuyPage() scrapes equipment for sale from Bazaar Buy tab
  (URL: ss=am&screen=buy or ss=bi), marks as source='buy'
- Stores merge with existing: buy items don't overwrite equipped/armory
- Auto-detect routing handles buy page URL patterns
- analyze_gear.py updated with 3-source output:
  🟢 Equipped = currently worn
  📦 Stored = in armory inventory
  🛒 For Sale = purchasable from Bazaar
- Shows level limits (Lv155 + 15 = Lv170 cap), prices where available
- Re-scrape after visiting Buy tab to include market items
2026-07-27 20:38:09 -04:00
GaboGG
94ab29a82c v0.14.18 - Spirit Stance burst toggle for 7+ mob Rending Blow
- When 7+ enemies and OC >= 60: toggles Spirit Stance ON before casting
  Rending Blow, then toggles OFF after one skill
- Uses 3-state flag: press1=toggleON, press2=castSkill, press3=toggleOFF
- Only triggers on normal (non-panic) Rending Blow — step 0e emergency
  skill still fires without spirit to avoid delay
- Resets on battle init and when conditions change
2026-07-27 20:14:21 -04:00
GaboGG
f2f296274c v0.14.17 - Faster weapon skills: lower skillOC to 60, threat to 70%, single-monster emergency
- skillOC default lowered from 75 to 60 — with 300ms Q debounce, it took
  ~6 presses to go from 50 to 70 OC (too slow against IWBTH enemies)
- Threat threshold lowered from 85% (102px) to 70% (84px) — triggers
  earlier when monsters have high SP bars
- Added single-monster emergency: if ANY enemy >90% SP, fire skills
  even without 2+ monsters (catches the lone special attacker)
- Step 0d high-threat check now fires for solitary imminent threats too
2026-07-27 20:05:47 -04:00
GaboGG
4aff813f01 v0.14.16 - Armory scraper now scavenges full store for all items
- Previously only scraped items visible in the current filter tab
  (had to visit each tab: New, Two-Handed, Light, Heavy, etc.)
- Now also scans the full dynjs_equip store for ALL items in your
  account (305 total) — every filter tab's worth of data at once
- Category guessed from tooltip type (Cloth, Light, Heavy, Weapon, etc.)
- One visit to the Armory page + HV.scrapeGear() = complete inventory
2026-07-27 15:58:02 -04:00
GaboGG
d95409026f v0.14.15 - Retry gear scrape until dynjs_equip store loads
- equip-UID.js loads asynchonously after document-end, so dynjs_equip
  might not exist when init() first runs
- Now retries up to 10 times (500ms apart, 5 seconds total) waiting for
  the store to populate before scraping
- Added HV.gearStore() to check whether the store is loaded
- If store never loads, falls back to name/ID scrape without stats
2026-07-27 15:51:22 -04:00
GaboGG
329e9403b4 v0.14.14 - V2 gear scraper: reads from HV in-memory JS store (no hovers)
- Previously: tried equips.set() + 300ms delays + popup_box polling
  which was fragile, async, and often saved stats to wrong slots
- Now: reads window.dynjs_equip / dynjs_eqstore which contains ALL
  item data pre-loaded on page load (name, quality, full tooltip HTML)
- Uses DOMParser to parse the embedded .eq HTML into structured stats
  (type, level, condition, burden, ADB, mit, attributes, etc.)
- Zero hover, zero delays, zero popup_box interaction — instant stats
- Works on Character Equipment page AND Armory pages simultaneously
- Removed triggerAllTooltips() and captureAllTooltips() — obsolete
2026-07-27 15:46:36 -04:00
GaboGG
28457202ba v0.14.13 - Clean scrape flow: basic data on page load, stats via captureAllTooltips
- scrapeCharacterEquip() now only reads names/IDs from DOM slots (no tooltip
  popup reading — that was attaching wrong stats to wrong slots)
- captureAllTooltips() now calls logGearSummary() instead of autoScrapeGear()
  so the tooltip stats aren't wiped by a re-scrape
- Workflow: visit Character Equipment page, then run HV.captureTooltips()
  to populate full stats with 300ms hover delay per item
2026-07-27 15:35:30 -04:00
GaboGG
ce09755fa8 v0.14.12 - Add captureAllTooltips() with async hover-to-popup delay
- captureAllTooltips() iterates each equipment slot, calls equips.set()
  to trigger the tooltip popup, waits 300ms for the DOM to update,
  then reads and saves the full stat block from #popup_box
- Catches 'Popup Box' default text vs real tooltip
- Saves stats directly to localStorage gear DB
- Exposed as HV.captureTooltips() for console use
- For best results: visit Character Equipment page, run HV.captureTooltips()
2026-07-27 15:31:06 -04:00
GaboGG
c632c13818 v0.14.11 - Fix DOM selector: onmouseover is on inner div, not .eqb parent
- .eqb parent has onclick and structure, but the onmouseover with
  equips.set() and the item name text are on a CHILD div within .eqb
- Fixed scrapeCharacterEquip() and triggerAllTooltips() to query
  :scope > div[onmouseover] inside each .eqb slot
- Fixed debugScrapeGear() diagnostic to show inner div content
2026-07-27 15:28:58 -04:00
GaboGG
992c6acc38 v0.14.10 - Add debugScrapeGear() diagnostic + HV.gearDebug()
- New debugScrapeGear() function checks DOM structure:
  - Whether #eqsb exists and its slot count
  - Whether #equiplist exists
  - Whether #popup_box exists and its content
  - Whether equips global is available
- Exposed as HV.gearDebug() for console use
2026-07-27 15:16:03 -04:00
GaboGG
a7a304f5d4 v0.14.9 - Rewrite gear scraper with correct DOM selectors
- Character Equipment page (?s=Character&ss=eq): reads #eqsb > .eqb
  divs with onmouseover='equips.set(ID,...)' for item names and IDs
- triggerAllTooltips() calls equips.set() for each item to populate
  the #popup_box tooltip, then parses full stat blocks (ADB, damage,
  mitigation, attributes, burden, interference, condition)
- Armory Organize page: reads #equiplist table rows with
  onmouseover='hover_equip(ID)' and checkbox values
- Reads right-side #equipinfo preview for condition and stats
- Modify detail page: reads full stat tables
2026-07-27 15:12:28 -04:00
GaboGG
6167df57b4 v0.14.8 - Expose gear API via HV.gear() / HV.gearSummary()
- Added to window.HV public API: gear(), gearSummary(), scrapeGear()
- Now accessible from console as HV.gear(), HV.gearSummary()
- Also keep getGearDB() and logGearSummary() directly available
2026-07-27 15:05:52 -04:00