- 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)
31 KiB
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 3819–9710)
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 1144–1164)
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 8609–9667)
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/storedsalvage: selects items where salvage_value > sell_pricepurchase_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
equipmentShopAutoProtectis enabled, auto-submits a protect action
Bazaar Filter System (Line 9090-9104)
- Applies
equipmentShopBazaarFiltersto hide non-valuable equipment - Also shows items where
salvage_value > purchase_price(profitable to buy and salvage) - Hidden items get
hvut-eqp-hiddenclass; 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 (Crude–Average):
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
- Quality 1-3 (Crude–Average):
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 dialog1: auto-check confirm checkbox2: skip confirmation entirely
Screen-Specific Modifications ($armory.modify, Line 8978-9042)
- organize: Adds note input fields (for
@price, $noteforum 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.integrateloads 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 4806–4828)
- 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 4832–5371)
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']) gethvut-none-itemclass - 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_typeandreward_slotfor each offering request
Result Tracking
Offering Requests (Line 5083-5371):
- Each offering creates an AJAX request with:
iid,count, optionalreward_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 5485–6867)
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 2174–2413, 6869–8498)
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):
- Fetches MoogleMail token if not cached
- Removes any existing attachments
- Attaches items via
attach_addAPI (Promise.all for concurrency) - Sets CoD if applicable
- For persistent CoD (Isekai → Persistent): opens persistent MoogleMail, attaches credits, sets CoD there
- Sends message
- 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):
- Credits (
_mm.credits): Amount input with pre-set buttons (10k, 100k, 500k, 1m, etc.) - Equipment (
_mm.equip): List of all equipment with checkboxes, search by name/EID, protected-item warning - 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 4467–4671)
Queue Management
Data Model (Line 4470-4488):
_tr.json(stored ashvut_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_timefrom server-rendered JavaScript - Shows current training name + level in bottom bar
- Countdown timer with
HH:MM:SSformat
Queue System (Lines 4491-4659):
- Plan Training: Select skill + target level, shows calculated credit cost
- Set: Saves
next_name/next_level/next_idto storage - When current training completes (or on page load if idle):
- Fetches training page
- Checks if
next_name's current level <next_level - If yes: auto-submits
start_train=<id>form - 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.trshows current training status in compact format- Links to training page
- Auto-loads when timer expires
7. EQUIPMENT MANAGEMENT
Upgrade Queue (_mo.upgrade, Lines 9669–9704)
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_valuefrom estimated materials × market prices - Compares with
sell_priceorpurchase_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
$featuredflag)
8. ITEM WORLD (Line 8594–8600)
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 8517–8604)
Compact View
All battle modes (Arena, Ring of Blood, Tower, GrindFest, Item World) use $battle.init():
Layout System:
- Wraps main pane in
hvut-bt-outerclass - 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 947–1142)
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 serverhv: 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.searchforencounter=<key> - On e-hentai: scrapes the event pane for the encounter link
- On HV pages: checks
- 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-warnclass 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 3280–3337)
Location: Top bar, shows current difficulty (Normal/Hard/Nightmare/Hell/Nintendo/IWBTH/PFUDOR)
Mechanism:
- Hover reveals dropdown with all 7 difficulties
- Selecting triggers:
- Fetch settings page
- Extract form data
- Modify
difflevel - POST updated form
- Update local
_player.difficulty - Persist to
hvut_ch_style
State: Persists chosen difficulty in ch_style.difficulty storage
Persona & Equipment Set Selector ($persona, Lines 3340–3594)
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:
- Fetch
?s=Character&ss=chwithpersona_set=<N> - Parse persona form for all persona names/IDs
- Check if current matches stored
Equip Set Switching:
- Fetch
?s=Character&ss=eqwithequip_set=<N> - Detect active set by finding
_on.pngimage - 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_stylefor 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 3030–3277)
Complete replacement of the game's #navbar:
- Hidden via
#navbar { display: none; } - Custom
#hvut-topflexbox 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 3597–3816)
#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 2772–2820)
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-coloron 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 1950–2171)
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
filteris empty
Market Integration Points:
- Market Page (
_mk): Shows HVUT prices in extra column, highlighting mismatched orders - Item Price Editor:
$price.edit()opens popup with "Bid"/"Ask" buttons to fetch market prices - Equipment Salvage Calc: Uses material prices from
$price.get('Materials')to value salvage - Monster Lab Gift Summary: Uses
$price.value()to estimate gift credit value - Monster Lab Upgrade Cost: Uses crystal prices to show upgrade costs
- Modify Page: Shows total upgrade cost using material prices
- Crystal Pack: On Monster Food market page, calculates aggregate crystal pack bid/ask
Price Editor Popup (Line 2045-2088):
- Textarea with
name @ priceformat - 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
$xxxand_xxxobjects are const-declared singletons - Lazy initialization: Most modules have
init()called only when their page matches - AJAX queue: Central
$ajaxmanages concurrency (max 4) and rate limiting (300ms interval) - Filter DSL: The
$equip.filtersystem 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