hv-unified/references/HVUT_4.2.3_analysis.md
GaboGG 402db6bb2f Initial commit: HV Unified v0.11.0 structure
- 23 source files in src/ (build via scripts/build.sh)
- Forum-sourced player knowledge in references/
- DESIGN.md with architecture and corrections
- References to existing scripts (Monsterbation, jpx, HV Utils)
2026-07-20 19:30:26 -04:00

31 KiB
Raw Permalink Blame History

HV Utils 4.2.3 — Deep Structural Analysis

Source: /home/gabogg/Downloads/HVUT_4.2.3.txt
Lines: 9,710 (416 KB)
Author: sssss2
Date: 2026-06-21
Sections: 19 page-specific modules + 10 core shared modules


1. PAGE DETECTION

HV Utils uses a multi-layered detection system:

Primary: URL Query Parsing (Line 212)

const _query = Object.fromEntries(location.search.slice(1).split('&')
  .map((q) => { const [k, v = ''] = q.split('=', 2);
    return [decodeURIComponent(k), decodeURIComponent(v)];
  }));

This parses Hentaiverse's ?s=X&ss=Y&screen=Z&filter=W format into _query.s, _query.ss, _query.screen, _query.filter.

Server Detection (Line 213-217)

const _server = {
  name: location.pathname.includes('/isekai/') ? 'isekai' : 'persistent',
  season: $id('world_text')?.textContent.match(/\d+ Season \d+/)?.[0] || '1',
};

Also sets _server.persistent / _server.isekai for boolean checks.

Page Dispatch Architecture (Lines 38199710)

The script uses a chain of if/else if blocks testing _query.s, _query.ss, and DOM elements:

Section Condition Module Line
Character s=Character, ss=ch _ch 3819
Equipment s=Character, ss=eq _eq 3922
Abilities s=Character, ss=ab _ab 4096
Training s=Character, ss=tr _tr 4467
Item Inventory s=Character, ss=it _it 4675
Settings s=Character, ss=se _se 4703
Item Shop s=Bazaar, ss=is _is 4806
The Shrine s=Bazaar, ss=ss _ss 4832
The Market s=Bazaar, ss=mk _mk 5373
Monster Lab s=Bazaar, ss=ml _ml 5485
MoogleMail s=Bazaar, ss=mm _mm 6869
Lottery s=Bazaar, ss=lt/la _lt 8499
Battle → Arena s=Battle, ss=ar _ar 8560
Battle → RoB s=Battle, ss=rb _ar 8570
Battle → Tower s=Battle, ss=tw 8580
Battle → GrindFest s=Battle, ss=gr 8587
Battle → Item World s=Battle, ss=iw 8594
Armory (Equip Shop) s=Bazaar, ss=am $armory 8609
Modify (single equip) s=Bazaar, ss=am, screen=modify _mo 9669

No-Navbar Early Exit (Lines 11441164)

Before any page dispatch, the script checks $id('navbar'). If absent, it handles:

  • Battle pages: Activates RE timer in battle mode
  • e-hentai.org gallery: Activates RE timer in gallery mode
  • Riddle Master: Commented out Then return — none of the page modules execute.

2. INVENTORY/SHOP AUTOMATION

Equipment Shop ($armory, Lines 86099667)

Architecture: A self-contained module on ?s=Bazaar&ss=am pages with sub-modules:

Sidebar Buttons (Line 8752-8801)

  • Select All — toggles all non-protected, non-filtered checkboxes
  • Tradeables / Pinned — bulk selection by status
  • Equip Code — generate forum BBcode for selected equipment
  • Sell / Salvage / Purchase & Salvage — with smart selection:
    • sell: selects items where sell_price ≥ salvage_value, excluding protected/locked/stored
    • salvage: selects items where salvage_value > sell_price
    • purchase_salvage: selects items profitable to buy+salvage
  • Bazaar Filters / Protect Filters — toggle between show-all and hide-based-on-filters

Protection System (Line 9073-9089)

  • The protect() method checks: eq.info.protected || eq.info.pinned || $equip.filter.equip($config.settings.equipmentShopProtectFilters, eq)
  • Protected equipment is moved to a special <tbody> at the top labeled "Protected Equipment"
  • Their checkboxes are disabled from "Select All"
  • If equipmentShopAutoProtect is enabled, auto-submits a protect action

Bazaar Filter System (Line 9090-9104)

  • Applies equipmentShopBazaarFilters to hide non-valuable equipment
  • Also shows items where salvage_value > purchase_price (profitable to buy and salvage)
  • Hidden items get hvut-eqp-hidden class; category headers auto-hide when all children hidden

Salvage Value Calculation ($armory.calc, Line 8852-8938)

  • calc.materials(eq): Estimates salvage materials based on quality, material type, core type, and rare status:
    • Quality 1-3 (CrudeAverage): Scrap [type] = min(10, ceil(sell_price / 100))
    • Quality 4 (Superior): Low-Grade [type] × (1 on persistent, 3 on isekai)
    • Quality 5 (Exquisite): Mid-Grade [type]
    • Quality 6 (Magnificent): High-Grade [type]
    • Quality 7+ (Legendary/Peerless): adds [Quality] [Weapon/Staff/Armor] Core (×5 if rare)
    • Rare items: adds Energy Cell
  • calc.value(materials): Multiplies by item prices (with optional 1% market fee deduction)
  • Shows "C" (sell price) and "V" (salvage value) columns, highlighting profitable salvage in green

Submit Confirm (Line 9184-9194)

Three modes based on equipmentShopConfirm:

  • 0: default browser confirm dialog
  • 1: auto-check confirm checkbox
  • 2: skip confirmation entirely

Screen-Specific Modifications ($armory.modify, Line 8978-9042)

  • organize: Adds note input fields (for @price, $note forum code annotations)
  • modify: Shows upgrade/IW levels
  • purchase: Shows purchase price and salvage value side-by-side; applies bazaar filter
  • sell: Loads salvage page to get salvage values; protects valuable items
  • salvage: Loads sell page to get sell prices; protects valuable items

All-In-One Integration (Line 8940-8975)

  • $armory.integrate loads ALL equipment categories (1H, 2H, Staff, Shield, Cloth, Light, Heavy) into a single unified table
  • Adds an "All" tab to the filter bar
  • Each category loads asynchronously via AJAX

Item Shop (_is, Lines 48064828)

  • Minimal: just adds hvut-item-{type} CSS class to each row for color coding
  • Types: Consumable, Artifact, Trophy, Token, Crystal, MonsterFood, Material, Collectable

3. SHRINE (_ss, Lines 48325371)

Bulk Offering Queue

Per-Item Controls (Line 5029-5081):

  • Each item row gets:
    • A number input for offer count
    • An "Offer" button
    • For trophies: "All" button (offers max = floor(stock / bulk))
    • Displays bulk grouping info (e.g., " / 1000")

Trophy Value System (Line 5050-5068):

  • Trophies have tier-based values (1000c for T2, 2000c for T3, 4000c for T4, 5000c for T5)
  • Auto-calculates upgrade paths: combining lower-tier trophies into higher tiers increases value
  • Shows upgraded trophy tier and value

Item Hiding (Line 5070-5072):

  • Items matching shrineHideItems (default: ['Figurine', 'Peerless Voucher']) get hvut-none-item class
  • Toggle button to show/hide these filtered items

Reward Selection (Line 4911-4948):

  • Intercepts reward selection buttons, adds visual highlight on selected reward
  • Tracks reward_type and reward_slot for each offering request

Result Tracking

Offering Requests (Line 5083-5371):

  • Each offering creates an AJAX request with: iid, count, optional reward_type/reward_slot
  • Results parsed from server response messages
  • Equipment rewards filtered through shrineFilters (default: Peerless, Legendary, Magnificent, Exquisite)
  • Results displayed in a toggleable table showing per-item breakdowns:
    • Percentage and count for each reward type
    • Equipment names shown for quality-filtered items
    • Grouped categories (Pouches, Charms, High-Grade Materials, Bindings, Crystals, PABs)

Shrine Log (Line 4889-4889):

  • Persistent log of all offering results
  • Reset button to clear log

4. MONSTER LAB (_ml, Lines 54856867)

Monster List Display

Sort System (Line 5660-5685):

  • Sorts by: index, name, class, PL, wins, kills, gains, gifts, morale, hunger
  • Configurable default via monsterLabDefaultSort
  • Click column headers to sort; clicking again reverses order

Per-Monster Tracking (Line 5741-5836):

  • _ml.mobs[] array stores: name, class, PL, wins, kills, PA values, ER values, CT values, morale, hunger, gifts log
  • _ml.log[] persisted to storage with: date, PL, wins, kills, PA/ER/CT arrays, 49-element gift array

Morale/Hunger Display (Line 5791-5803):

  • Parses the pixel-width of bar images: hunger = width * 200, morale = width * 200
  • Shows numeric value overlay on each bar

Feed System

Feed Actions (Line 5877-5909):

  • Click morale bar: Feeds drugs (increases morale)
  • Click hunger bar: Feeds food (increases hunger)
  • Click wins/kills: Updates monster stats (fetches the monster page)
  • After feeding, auto-updates: PL, wins, kills, PAs, ERs, CTs, morale, hunger bars

Bulk Feed (Line 5889-5891):

  • "Update Wins/Kills" button feeds ALL monsters
  • feedall(stat, value, food) — conditional bulk feeding

Gift Tracking

Gift Summary (Line 5921-5976):

  • Parses message box for gift notifications: "X brought you a gift!" + "Received N× Item"
  • Computes total gifts and estimated credit value using $price.value()
  • Shows per-material breakdown in a summary panel

Monster Log (Line 5996-6023):

  • Per-monster log showing all 49 tracked material types
  • Shows: days since first log, total gifts, total value, daily average
  • Formatted in two-column layout
  • Materials tracked: 12 grade materials + Phazon + Shade Fragment + Repurposed Actuator + Defense Matrix + 33 Bindings + World Seed

Crystal/Pill Feeder (Monster Upgrader, Lines 6037-6867)

Upgrade Table (Line 6096-6135):

  • Spreadsheet-style grid: rows = monsters, columns = stats
  • Primary Attributes (PA): STR, DEX, AGI, END, INT, WIS → use Vigor/Finesse/Swiftness/Fortitude/Cunning/Knowledge crystals
  • Elemental Resistances (ER): FIRE, COLD, ELEC, WIND, HOLY, DARK → use Flames/Frost/Lightning/Tempest/Devotion/Corruption crystals
  • Chaos Tokens (CT): 12 stats → use Chaos Tokens

Bulk Operations:

  • Increase/Decrease all monsters' stats at once
  • Equalize (set all to highest value)
  • Per-stat buttons for each crystal type
  • Right-click to decrease, left-click to increase

Crystal Stock Tracking:

  • Loads item inventory to show available crystals
  • Shows per-crystal usage and remaining stock

Power Level Calculator (Lines ~6700-6867)

  • Complex PL simulation with PA/ER/CT values
  • Input fields for custom values with slider-like controls
  • Shows PL changes per stat

5. MOOGLEMAIL ($mail + _mm, Lines 21742413, 68698498)

Send Engine ($mail)

Queue System (Line 2179-2305):

  • $mail.queue[]: Array of mail chunks
  • $mail.current: Index of current mail being processed
  • $mail.ready: Semaphore preventing concurrent sends
  • Auto-chains: when one mail completes, the next automatically starts

Chunking (Line 2306-2386):

  • Splits large attachments into chunks of 10 items each
  • Auto-generates subject from first item name
  • Calculates CoD totals with optional deduction
  • Adds attachment text to body

Send Process (Line 2186-2305):

  1. Fetches MoogleMail token if not cached
  2. Removes any existing attachments
  3. Attaches items via attach_add API (Promise.all for concurrency)
  4. Sets CoD if applicable
  5. For persistent CoD (Isekai → Persistent): opens persistent MoogleMail, attaches credits, sets CoD there
  6. Sends message
  7. On completion: advances to next queue item, or redirects to Sent folder

Error Handling (Line 2387-2398):

  • Checks server response for error messages
  • On error: logs and discards the draft

Write UI (_mm.write, Lines 6889-7089)

Compose Interface:

  • To: with datalist autocomplete from user list
  • Subject: auto-filled from first attachment
  • Body: textarea
  • CoD Deduction field
  • Persistent CoD checkbox (Isekai only)

Attachment Panels (three tabs):

  1. Credits (_mm.credits): Amount input with pre-set buttons (10k, 100k, 500k, 1m, etc.)
  2. Equipment (_mm.equip): List of all equipment with checkboxes, search by name/EID, protected-item warning
  3. Items (_mm.item): Filter by group (Consumables, Materials, Trophies, Crystals, Figures), search by name, bulk count/check

Item Attachment (Lines 7092-7169):

  • Search: type partial item names, separated by commas
  • Each item row: checkbox, count input, price input, auto-calculated CoD
  • "CALC" button: previews attachment text
  • "ATTACH from TEXT": parses free-form text like 100 x Health Potion @ 10
  • "SEND" button on each row for single-item quick send
  • "SEND ALL" to send everything checked

User List (Line 7020-7049):

  • Persisted list of recipients
  • Auto-adds on send
  • Deduplication on save
  • Editable via popup

6. TRAINING (_tr, Lines 44674671)

Queue Management

Data Model (Line 4470-4488):

  • _tr.json (stored as hvut_tr_notif): { current_name, current_level, current_end, next_name, next_level, next_id, error }
  • Training data: id, base cost, linear cost increment, exponential factor for all 15 trainable skills

Progress Tracking (Line 4548-4559):

  • Reads end_time from server-rendered JavaScript
  • Shows current training name + level in bottom bar
  • Countdown timer with HH:MM:SS format

Queue System (Lines 4491-4659):

  • Plan Training: Select skill + target level, shows calculated credit cost
  • Set: Saves next_name/next_level/next_id to storage
  • When current training completes (or on page load if idle):
    1. Fetches training page
    2. Checks if next_name's current level < next_level
    3. If yes: auto-submits start_train=<id> form
    4. If no: shows "Training completed!"
  • Cancel: Clears the notification JSON
  • Reset Planning: Clears both current and next

Cost Calculation (Line 4611-4628):

  • Formula: Σ pow(base + linear × level, 1 + exp × level) for each level from current to target
  • Uses the real game formulas for each training type
  • Shows spent credits per training and total spent

Bottom Bar Integration (Line 3647-3721):

  • _bottom.tr shows current training status in compact format
  • Links to training page
  • Auto-loads when timer expires

7. EQUIPMENT MANAGEMENT

Upgrade Queue (_mo.upgrade, Lines 96699704)

On the single-equipment Modify page:

  • Parses the upgrade materials table
  • Calculates total cost using $price.value(mats) + credits
  • Shows clickable total cost button → opens price editor

Salvage/Repair/Rebuild (via $armory, Lines 8609-9667)

Salvage vs Sell Comparison:

  • Calculates salvage_value from estimated materials × market prices
  • Compares with sell_price or purchase_price
  • Highlights profitable salvage in green (hvut-eqp-profit)
  • "Purchase & Salvage" action filters for profitable arbitrage

Batch Operations:

  • $armory.submit.confirm('sell', ...) / $armory.submit.confirm('salvage', ...)
  • Gets the real submit button from the page, submits multi-equip form

Reforge/Soulfuse

  • Not directly implemented as separate features
  • The Armory page covers all screens (organize, modify, repair, soulbind, purchase, sell, salvage)

Equipment Data ($armory.equipdata, Line 8621)

  • Stored as hvut_equipdata (persistent) / hvuti_equipdata (isekai)
  • Contains per-EID: price (for forum code), note (for forum code $featured flag)

8. ITEM WORLD (Line 85948600)

The IW implementation is relatively minimal:

  • Renders equipment list table with $equip.list.table()
  • Moves the equipment blurb to the action area
  • Initializes the battle panel ($battle.init()) for the equip select outer div
  • No PXP simulator is present in this version (4.2.3). The script relies on the game's built-in IW interface.

Note: There is an EXP Simulator on the Character page (_ch.exp, Line 3823-3901) which uses the same exponential formula as the game.


9. ARENA/BATTLE MODES (Lines 85178604)

Compact View

All battle modes (Arena, Ring of Blood, Tower, GrindFest, Item World) use $battle.init():

Layout System:

  • Wraps main pane in hvut-bt-outer class
  • Adds a 600px side panel (#hvut-bt-div) on the left or right (configurable)
  • Compact mode (hvut-bt-on): reduces main pane to 620px, side panel slides in
  • Toggle button: "Details" / "Collapse"

Equipment Panel (.hvut-bt-equip):

  • Shows equipped gear from current equip set
  • Per-equip row: name (link), condition% / energy%, repair button
  • Condition ≤ threshold (default 20%) shown in warning color
  • Hover on repair shows per-material breakdown for that equip

Item Inventory Panel (.hvut-bt-items):

  • Shows configured items from equipPanelItemInventory
  • Format: name (stock / threshold)
  • Warning if stock < threshold
  • Click item name to buy from Item Shop

Repair All Panel:

  • Calculates total materials needed
  • Checks item inventory; if insufficient, offers to buy from Item Shop (Scraps, Energy Cell)
  • Non-purchasable items (Infusions, Shards) trigger alert to buy from Market

Arena-Specific

  • Splits colspan=2 rows for proper compact layout
  • Re-parents arena_list into arena_outer div

Ring of Blood

  • Same split_colspan treatment
  • Includes arena_tokens in the outer

10. RE TIMER ($re, Lines 9471142)

Detection Mechanisms

Mode Detection (Line 953):

$re.type = (!location.hostname.includes('hentaiverse.org') || _server.isekai) ? 'eh'
  : $id('navbar') ? 'hv'
  : $id('battle_top') ? 'ba'
  : false;
  • eh: e-hentai.org gallery or Isekai server
  • hv: Normal Hentaiverse pages (has navbar)
  • ba: Battle pages (has battle_top)
  • false: Unknown/unsupported

Key Management

  • Stored as hvut_re (cross-profile, not namespaced): { date, key, count, clear }
  • 30-minute timer: Random Encounter refreshes every 30 minutes
  • Auto-detection:
    • On HV pages: checks location.search for encounter=<key>
    • On e-hentai: scrapes the event pane for the encounter link
  • Daily reset: If the stored date is from a different UTC day, auto-resets

Notification

  • Countdown display: Shows MM:SS [count] while timer active
  • "Ready": When timer expires, button shows "Ready [count]"
  • "Expired": If an encounter was generated but not cleared
  • Beep: Audio notification at [0.2, 500, 0.5] (volume, Hz, seconds) when timer expires — configurable, with test button
  • Warning highlight: hvut-warn class when an uncleared encounter exists

Engagement

  • Click RE button: Engages if ready/uncleared (or Ctrl+Click to force engage)
  • Battle mode: Shows RE status, click loads new key
  • Gallery mode: Opens in new tab (configurable alt.hentaiverse.org)
  • Gallery detection: Scrapes e-hentai.org news.php for the encounter key

11. DIFFICULTY/PERSONA/SET SELECTOR

Difficulty Changer ($dfct, Lines 32803337)

Location: Top bar, shows current difficulty (Normal/Hard/Nightmare/Hell/Nintendo/IWBTH/PFUDOR)

Mechanism:

  • Hover reveals dropdown with all 7 difficulties
  • Selecting triggers:
    1. Fetch settings page
    2. Extract form data
    3. Modify difflevel
    4. POST updated form
    5. Update local _player.difficulty
    6. Persist to hvut_ch_style

State: Persists chosen difficulty in ch_style.difficulty storage

Persona & Equipment Set Selector ($persona, Lines 33403594)

Location: Top bar, shows "Persona" by default, then current set name

Data Model:

$persona.json = {
  pset: current_persona_number,
  plen: total_personas,
  pname: current_persona_name,
  eset: current_equip_set_number,
  elen: total_equip_sets,
  ename: current_set_name,
  [pset]: { name: "...", [eset]: { name: "..." }, ... }
}

Persona Switching:

  1. Fetch ?s=Character&ss=ch with persona_set=<N>
  2. Parse persona form for all persona names/IDs
  3. Check if current matches stored

Equip Set Switching:

  1. Fetch ?s=Character&ss=eq with equip_set=<N>
  2. Detect active set by finding _on.png image
  3. Save equip config to $config.set('equipset', ...) — array of { slot, category, name, customname, eid, key }

Auto-reload: After persona/set change, reloads current page if on Equipment, Abilities, Items, or Settings tabs

Stats Parsing:

  • Parses the stats pane to determine:
    • Fighting Style (Staff/Dualwield/Niten/Two-Handed/One-Handed/Unarmed)
    • Best spell type (highest affinity)
    • Proficiency factor
    • Magic score
  • Saves to ch_style for external use (e.g., monsterbation)

Warnings:

  • Shows red warning bar for: repair needed, attribute check, exhausted stamina
  • Stamina warning for: Exhausted, accuracy penalty, or below warnLowStamina

12. UI SYSTEM

Top Navigation Bar (Lines 30303277)

Complete replacement of the game's #navbar:

  • Hidden via #navbar { display: none; }
  • Custom #hvut-top flexbox bar with:
    • MENU dropdown (or individual section dropdowns if integration disabled): Character, Bazaar, Battle, Armory categories in organized columns
    • Quick links: Configurable 2-letter link buttons (CH, EQ, AB, TR, IT, SE, IS, SS, MK, ML, MM, etc.)
    • Stamina display with dropdown for restorative items
    • Level display with EXP progress bar
    • Difficulty dropdown
    • Persona/Equip Set dropdown
    • RE Timer display
    • Server indicator with switch link
    • Settings gear icon

Bottom Bar (Lines 35973816)

#hvut-bottom below the main pane:

  • Credits display (C:)
  • Equipment Inventory capacity (E: usage/capacity) with warnings near limit
  • Training status with countdown
  • Lottery displays for Weapon and Armor lotteries:
    • Shows current equipment + time until next drawing
    • Red highlight when drawing is imminent
    • Pops up alert when qualifying equipment appears (checked against lotteryFilters)

Color Coding System (Lines 27722820)

CSS Custom Properties on :root:

Font Colors:

  • --color-font-default: #5C0D11 (dark red-brown)
  • --color-font-light: #9B4E03 (orange-brown)
  • --color-font-highlight: #c00 (red)
  • --color-font-warn: #e00 (bright red)
  • --color-font-bonus: #03c (blue)
  • --color-font-invalid: #666 (gray)
  • --color-font-invert: #fff (white)

Background Colors:

  • --color-bg-default: #EDEBDF (parchment) — main background
  • --color-bg-back: #E3E0D1 — secondary background
  • --color-bg-light: #fff — light highlight
  • --color-bg-alpha: #fff9 — translucent overlay
  • --color-bg-invert: #5C0D11 — inverted (dark)
  • --color-bg-h1: #edb — header background

Equipment Quality Colors:

  • Peerless: #fbb (pink), Legendary: #fd8 (gold), Magnificent: #bdf (light blue), Exquisite: #ce9 (green), Superior: #ccc (gray)
  • Applied as hvut-equip-{Quality} class + background-color on rows

Item Type Colors:

  • Consumable: #00B000 (green), Artifact: #0000FF (blue), Trophy: #461B7E (purple), Token: #254117 (dark green), Crystal: #BA05B4 (magenta), MonsterFood: #489EFF (light blue), Material: #FF0000 (red), Collectable: #0000FF (blue)
  • Applied as hvut-item-{Type} class on rows

Warning System:

  • .hvut-warn: Red text (#e00)
  • .hvut-warn2: Inverted (dark bg, white text)
  • .hvut-bonus: Blue text (#03c)

Side Panel System

  • .hvut-side: Absolute-positioned 100px wide flex column
  • Used on: Shrine (.hvut-ss-side), Monster Lab (.hvut-ml-side), Market (.hvut-mk-side), Armory (.hvut-am-side)
  • Contains action buttons grouped with optional margins

13. STORAGE STRUCTURES

Primary Storage: GM_getValue / GM_setValue (TGM/Greasemonkey)

All keys prefixed with hvut_ (persistent) or hvuti_ (isekai):

Key Type Description
hvut_settings Object All user settings
hvut_prices Object Item price mappings (name → credits)
hvut_persona Object Persona/equip set state
hvut_ch_style Object Character style (difficulty, FS, spell type, prof factor)
hvut_equipset Array Current equip set slots
hvut_equipdata Object Equipment notes/prices (per EID)
hvut_ml_log Array Monster Lab log
hvut_ss_log Object Shrine log
hvut_mm_userlist Array MoogleMail recipient list
hvut_ab_level Object Ability levels
hvut_se_settings Object Saved settings presets
hvut_tr_level Object Training levels

Secondary Storage: localStorage (backup for critical data)

The $config.ls_savelist (line 222) defines which keys also get localStorage backup:

  • ch_style, persona, prices, equipset

Cross-Profile Storage (no prefix)

Key Type Description
hvut_re Object Random Encounter state ({ date, key, count, clear })
hvut_tr_notif Object Training notification state
hvut_lt_notif Object Lottery notification state

Migration System ($config.migration, Lines 402-511)

  • Detects old localStorage-based data (pre-4.x)
  • Upgrades: equipdata, prices, protection filters, bazaar filters, monster lab log, equip sets, shrine log
  • Cleans up old localStorage keys after migration
  • Version-specific migrations for 4.2 and 4.22

14. KEY FUNCTION NAMES AND PURPOSES

Core Shared Modules

Module Line Purpose
$config 220 Configuration system: get/set/del/validate/migrate
$ajax 837 Rate-limited AJAX queue (300ms interval, max 4 concurrent)
$re 947 Random Encounter timer and notification
$equip 1227 Equipment parsing, sorting, filtering, namecode generation
$item 1810 Item inventory loading, counting, shop buying
$price 1950 Item price management, market integration
$mail 2174 MoogleMail send queue engine
$battle 2416 Battle side panel (equipment, items, repair)
$dfct 3280 Difficulty changer
$persona 3340 Persona/equip set changer

Page-Specific Modules

Module Line Page
_ch 3820 Character: EXP simulator, stats parsing
_eq 3923 Equipment: popups, charms, mage stats, equip code
_ab 4097 Abilities: slotbar parsing, tree parsing, ability simulator
_tr 4468 Training: queue planning, cost calculation, auto-start
_it 4676 Item Inventory: type coloring
_se 4704 Settings: preset save/load
_is 4807 Item Shop: type coloring
_ss 4833 Shrine: bulk offering, reward tracking, trophy system
_mk 5374 Market: price display, order checking, crystal pack
_ml 5486 Monster Lab: list, feeding, upgrades, PLC
_mm 6870 MoogleMail: compose UI, item/equip/credits attach
_lt 8500 Lottery: notification toggle, golden ticket confirm
_ar 8560 Arena/RoB: layout adjustment
$armory 8611 Equipment Shop: unified list, protect/bazaar filters, salvage calc
_mo 9670 Modify (single equip): upgrade cost display

Key Utility Functions

Function Line Purpose
$id / $qs / $qsa / $xpath 191-194 DOM selectors
$doc 195 HTML string → Document
$element 196 Element builder with attributes, events, children
$input 197 Form input builder (text/checkbox/select/number)
time_format 198 ms → HH:MM:SS / HH:MM / MM:SS
date_format 199 Unix timestamp → YY-MM-DD HH:MM
parse_count 200 "1,234" → 1234
parse_price 201 "10m"/"500k" → number
split2 202 "key:value" → ["key", "value"]
scrollIntoView 203 Scroll parent to show child
confirm_event 204 Add confirmation to onclick handlers
toggle_button 205 Toggle button text based on CSS class
play_beep 206 Web Audio API beep
popup 207 Modal overlay
popup_text 208 Modal with textarea
get_message 209 Parse server message box
$equip.filter.test 1609 Filter expression evaluator (&&, ||, !, $Quality+, $pab=, $prefix, $level)
$equip.namecode 1696 Forum BBcode name decorator
$equip.parse.name 1300 Name regex parser (quality, prefix, type, slot, suffix)
$equip.parse.elem 1397 DOM element → equipment object
$equip.parse.dynjs 1361 dynjs_equip data → equipment object

15. MARKET INTEGRATION

Price System ($price, Lines 19502171)

Storage: hvut_prices — object mapping item names to credit values

Item Groups (Lines 1953-1971):

  • Consumables: Health/Mana/Spirit Draughts/Potions/Elixirs, Energy Drinks, Caffeinated Candy, Infusions, Scrolls, Flower Vases, Bubble-Gum
  • Materials: Grade materials, Scraps, Energy Cells, Phazon, Shade Fragment, Repurposed Actuator, Defense Matrix Modulator, Bindings (33 types), Weapon/Staff/Armor Cores, Shards
  • Trophies: All 12 trophies
  • Crystals: All 12 crystal types
  • Figures: All 27 figurine types

Isekai Filtering (Line 1982-1989):

  • Removes: Last Elixir, Energy Drink, Caffeinated Candy, Bindings, Crystals, Figures
  • These items don't exist on Isekai server

Market Data Fetching (Line 2101-2149):

$price.parse_market(filter, doc)
  • Parses the market item list table (#market_itemlist table)
  • Extracts: item name, item ID, your stock, market bid, market ask, market stock
  • Caches in $price.market[name] = { itemid, stock, bid, ask, market_stock }
  • Filter names: co (consumables), ma (materials), tr (trophies), ar (artifacts), fi (figures), mo (monster food)

Market Price Update (Line 2125-2149):

  • $price.update_market(filter, key, save): Fetches current market data, extracts prices for specified key (bid/ask)
  • Fetches all filters at once if filter is empty

Market Integration Points:

  1. Market Page (_mk): Shows HVUT prices in extra column, highlighting mismatched orders
  2. Item Price Editor: $price.edit() opens popup with "Bid"/"Ask" buttons to fetch market prices
  3. Equipment Salvage Calc: Uses material prices from $price.get('Materials') to value salvage
  4. Monster Lab Gift Summary: Uses $price.value() to estimate gift credit value
  5. Monster Lab Upgrade Cost: Uses crystal prices to show upgrade costs
  6. Modify Page: Shows total upgrade cost using material prices
  7. Crystal Pack: On Monster Food market page, calculates aggregate crystal pack bid/ask

Price Editor Popup (Line 2045-2088):

  • Textarea with name @ price format
  • Save: Validates and saves
  • Bid/Ask: Fetches market prices for specified key, replaces values
  • Edit All Items: Switches to full price list

Default Prices (Line 1972-1976):

  • Peerless Weapon/Staff/Armor Cores: 500,000 credits

ARCHITECTURE SUMMARY

Module Dependencies

$config (storage, settings)
  ↓
$ajax (network, 300ms/4conn rate limit)
  ↓
$equip (equipment parsing/filtering) ← $item (inventory) → $price (market)
  ↓                              ↓
$re (RE timer)    $battle (side panel)    $mail (MM send)
  ↓
Page modules (_ch, _eq, _ab, _tr, _it, _se, _is, _ss, _mk, _ml, _mm, _lt, _ar, $armory, _mo)
  ↓
_top (top bar) + _bottom (bottom bar) — always active, uses _player and specific modules

Design Patterns

  • Singleton modules: All $xxx and _xxx objects are const-declared singletons
  • Lazy initialization: Most modules have init() called only when their page matches
  • AJAX queue: Central $ajax manages concurrency (max 4) and rate limiting (300ms interval)
  • Filter DSL: The $equip.filter system implements a custom boolean expression evaluator for equipment matching
  • CSS variables: All theming uses CSS custom properties, making re-skinning trivial
  • Storage namespacing: Persistent (hvut_) and Isekai (hvuti_) have separate storage namespaces
  • Migration system: Automatic data migration when version numbers don't match