// ═══════════════════════════════════════════════════════════════════════ // PAGE DETECTOR — detect current page and player level // ═══════════════════════════════════════════════════════════════════════ function detectPage() { // Battle page detection by DOM elements (most reliable) if (document.getElementById('textlog') || document.getElementById('riddlemaster') || document.getElementById('pane_vitals') || document.getElementById('battle_root')) { return 'battle'; } // URL-based page detection const url = window.location.href || ''; const pages = { 'ss=ch': 'character', 'ss=eq': 'equipshop', 'ss=is': 'itemshop', 'ss=am': 'armory', 'ss=ar': 'arena', 'ss=gr': 'grindfest', 'ss=iw': 'itemworld', 'ss=ml': 'monsterlab', 'ss=sh': 'shrine', 'ss=mm': 'mooglemail', 'ss=tr': 'training', 'ss=rb': 'ring', 'ss=re': 'repair', 'ss=up': 'upgrade', 'ss=en': 'enchant', 'ss=sv': 'salvage', 'ss=rf': 'reforge', 'ss=sf': 'soulfuse', 'ss=ab': 'abilities', 'ss=ml': 'monster', 'ss=it': 'invitems', 'ss=se': 'settings', 'ss=ss': 'spiritshop', 'ss=mk': 'market', 'ss=lt': 'lottery', 'ss=la': 'lastarena', }; for (const [param, page] of Object.entries(pages)) { if (url.includes(param)) return page; } return 'bazaar'; } function isBattlePage() { return !!(document.getElementById('textlog') || document.getElementById('riddlemaster') || document.getElementById('pane_vitals')); } function detectLevel() { const container = document.querySelector('#level_readout > div'); if (!container) { try { const s = parseInt(localStorage[SP + 'playerLevel']); if (s > 0) STATE.level = s; } catch (e) {} return; } // Battle page format: innerText = "Normal Lv.10" const text = (container.innerText || container.textContent || '').trim(); const textMatch = text.match(/(\w+)\s+Lv\.?\s*(\d+)/); if (textMatch) { STATE.difficulty = textMatch[1]; STATE.level = parseInt(textMatch[2]) || 1; updateTier(); return; } // CSS-font rendering (overworld page): "Nightmare Lv.52" const cssText = readCSSText(container); const cssMatch = cssText.match(/(\w+)\s+lv\.\s*(\d+)/i); if (cssMatch) { STATE.difficulty = cssMatch[1].charAt(0).toUpperCase() + cssMatch[1].slice(1); cacheDifficulty(); } // CSS-digit rendering for level number const digits = readCSSDigits(container); if (digits !== null && digits > 0) { STATE.level = digits; updateTier(); } if (STATE.level > 1) { try { localStorage[SP + 'playerLevel'] = STATE.level; } catch (e) {} } } function updateTier() { const lv = STATE.level || 1; STATE.tier = lv >= 300 ? 'master' : lv >= 150 ? 'veteran' : lv >= 50 ? 'adept' : 'novice'; }