Toolasha

Toolasha - Enhanced tools for Milky Way Idle.

Αυτές είναι εκδόσεις αυτού του κώδικα όπου ο κώδικας έχει ενημερωθεί. Προβολή όλων των εκδόσεων.

  • v0.4.962 24/01/2026

    Fix critical memory leaks from accumulating event listeners

    Problem Analysis (from user performance profiling):

    • Memory heap snapshot showed 20,018 PerformanceEventTiming objects (+2.7 MB)
    • 24,997 leaked Function objects (+769 KB) - all from Toolasha
    • 6,798 detached SVG elements not garbage collected
    • Performance degraded 6x after character switching (291ms vs 49ms for injectMaxProduceable)
    • 2.48 second browser freezes from queued debounced callbacks

    Root Causes Identified:

    1. isSwitching flag not reset in finally block (feature-registry.js)

      • Prevented cleanup during rapid character switches
      • Flag only reset on error OR after async reinit completed
      • Caused features to skip disable() and accumulate listeners
    2. DataManager event listeners never removed (7 files affected)

      • Features used anonymous arrow functions: () => {...}
      • dataManager.off() could not remove anonymous functions
      • Each character switch added duplicate listeners
      • After 5 switches: 5x items_updated + 5x action_completed firing
    3. PerformanceEventTiming accumulation

      • Result of excessive events from issue #2
      • Browser performance monitoring overwhelmed
    4. Detached SVG retention

      • Event listeners holding references to removed DOM elements
      • Prevented garbage collection of inventory badge icons

    Files Modified:

    1. src/core/feature-registry.js

      • Moved isSwitching = false to finally block
      • Ensures flag always resets, even on successful cleanup
      • Prevents guard from blocking subsequent character switches
    2. src/features/actions/max-produceable.js

      • Added itemsUpdatedHandler and actionCompletedHandler properties
      • Store function references in initialize()
      • Call dataManager.off() in disable() with stored references
    3. src/features/actions/gathering-stats.js

      • Added itemsUpdatedHandler and actionCompletedHandler properties
      • Store function references in initialize()
      • Call dataManager.off() in disable() with stored references
    4. src/features/inventory/inventory-sort.js

      • Added itemsUpdatedHandler property
      • Store function reference in initialize()
      • Call dataManager.off() in disable() with stored reference
    5. src/features/inventory/inventory-badge-prices.js

      • Added itemsUpdatedHandler property
      • Store function reference in initialize()
      • Call dataManager.off() in disable() with stored reference
    6. src/features/tasks/task-icons.js

      • Added characterSwitchingHandler property
      • Store function reference in initialize()
      • Added disable() method to call dataManager.off() then cleanup()
    7. src/features/notifications/empty-queue-notification.js

      • Added characterSwitchingHandler property
      • Store function reference in initialize()
      • Call dataManager.off() in disable() with stored reference

    Technical Implementation Pattern:

    class Feature {
        constructor() {
            this.eventHandler = null; // Store reference
        }
    
        initialize() {
            // Store function reference (NOT anonymous)
            this.eventHandler = () => { this.update(); };
            dataManager.on('event_name', this.eventHandler);
        }
    
        disable() {
            // Remove using stored reference
            if (this.eventHandler) {
                dataManager.off('event_name', this.eventHandler);
                this.eventHandler = null;
            }
        }
    }
    

    Expected Results:

    • No listener accumulation during character switching
    • Clean memory cleanup after each character switch
    • Performance remains constant regardless of switch count
    • PerformanceEventTiming objects no longer accumulate
    • Function objects properly garbage collected
    • SVG elements released from memory when removed from DOM

    Testing Recommendation: User should test by switching characters 5+ times and monitoring:

    1. Chrome DevTools Memory heap snapshots (before/after comparison)
    2. Performance profiling during gameplay
    3. Browser responsiveness after multiple switches
    4. Task Manager memory usage over extended play session
  • v0.4.962 24/01/2026

    Fix transmutation percentages disappearing on item click

    Problem:

    • Transmutation percentages in Item Dictionary "Transmuted From" section disappeared when clicking items
    • React re-renders clicked items, destroying child elements including our injected percentage spans

    Root Cause Analysis:

    • Initial approach watched ItemDictionary_title element being added to DOM
    • React only changes title text content when switching items, doesn't re-add element
    • Observer never fired when switching between items
    • Percentages were injected inside Item_name element, got destroyed by React on click

    Solution:

    1. Watch ItemDictionary_item elements being added (fires when switching items)
    2. Position percentage spans as siblings to item boxes (outside React's control)
    3. Use absolute positioning to display percentages to the right of items
    4. Added HRID name cache (Map) for O(1) lookups instead of O(n) scans
    5. Always remove/re-inject rates to handle React re-renders

    Technical Changes:

    • src/features/dictionary/transmute-rates.js:
      • Added nameToHridCache Map for performance
      • Changed observer from ItemDictionary_title to ItemDictionary_item
      • Moved percentage span from inside name element to parent container
      • Applied absolute positioning (right: 0, vertically centered)
      • Set parent container to position: relative
      • Added debounce timeout for multiple item additions
      • Clear cache on disable

    Result:

    • Percentages appear to the right of each item (matching "Transmutes Into" section)
    • Percentages persist when clicking items in the list
    • Percentages update correctly when switching dictionary entries
    • Fast O(1) HRID lookups after initial cache build
  • v0.4.962 24/01/2026

    Add race condition guards to prevent memory leak during character switches

    • Add guard flags (isSwitching, reinitScheduled) to prevent overlapping switches
    • Await all disable() calls to ensure cleanup completes before reinit
    • Add console logging to track switch lifecycle and detect rapid switching
    • Proper flag reset in finally block to prevent stuck switches

    This addresses potential memory leaks when rapidly switching between characters. The race condition could cause features to initialize multiple times without proper cleanup, leading to duplicate event listeners and memory growth.

    Needs user feedback to confirm if this resolves reported memory leak issues.

  • v0.4.962 24/01/2026

    v0.4.962 - Fix inventory badge prices and consolidate calculation

    • Fixed inventory stack value badges showing per-item price instead of stack total
    • Consolidated duplicate price calculation code (~400 lines) into badge manager
    • Store both per-item prices (askPrice/bidPrice) and stack totals (askValue/bidValue)
    • inventory-badge-prices uses per-item prices for left/right badges
    • inventory-sort uses stack totals for top-right badge and sorting
    • Prices now calculated once per DOM change instead of twice
    • Eliminated race conditions between badge rendering features
  • v0.4.961 24/01/2026

    Add transmutation rate percentages and networth quantity formatting

    New Features:

    • Item Dictionary: Display transmutation success rates in "Transmuted From (Alchemy)" section
      • Shows percentage after each source item name
      • Toggle between total probability (base rate × drop rate) and conditional probability (drop rate only)
      • Customizable color (default: white) matching "Transmutes Into" section
      • 2 decimal place precision (1 decimal for whole numbers)
    • Networth: Add KMB formatting to item quantities
      • Applied to inventory breakdown and ability book counts
      • Uses formatKMB (1.0B, 38.8K, etc.) for better readability

    Settings:

    • UI Enhancements → "Show transmutation success rates" (default: enabled)
    • UI Enhancements → "Include base success rate in transmutation percentages" (default: enabled)
    • Color Customization → "Transmutation Rates" (default: #ffffff)

    Files:

    • src/features/dictionary/transmute-rates.js (new)
    • src/features/settings/settings-config.js
    • src/core/config.js
    • src/core/feature-registry.js
    • src/features/networth/networth-display.js

    🤖 Generated with Claude Code

    Co-Authored-By: Claude Sonnet 4.5 [email protected]

  • v0.4.960 24/01/2026

    Add action panel pin feature with shared sort manager (v0.4.960)

    • Implemented pin icons on all action panels (gathering and production)
    • Pins persist across sessions via IndexedDB storage
    • Pinned actions always sort to top, override hide negative profit setting
    • Created shared action-panel-sort.js to centralize sorting logic
    • Fixed race condition where max-produceable and gathering-stats were competing with separate sort timers
    • Performance improvement: one debounced sort instead of two racing sorts

    🤖 Generated with Claude Code

    Co-Authored-By: Claude Sonnet 4.5 [email protected]

  • v0.4.959 23/01/2026

    v0.4.959 - Remove debug logging from Net Worth display

    • Removed console.log statements from networth-display.js
    • Removed MutationObserver debug code
    • Clean console output for Net Worth updates
  • v0.4.958 22/01/2026

    Fix Steam party member consumables export

    • Add battleData field to dataManager to store new_battle WebSocket data
    • Listen for new_battle message and store in RAM on Steam
    • Update getBattleData() to read from dataManager.battleData on Steam
    • Clear battleData on character switch
    • Fixes issue where party member consumables show empty on Steam
  • v0.4.958 22/01/2026

    Fix party mode export returning wrong player's data

    • Track which slot contains user's data (yourSlotIndex) in party mode
    • Export correct slot instead of always slot 1 when in single-player format
    • Use correct player name from matching slot
    • Fixes issue where party members not in slot 1 get blank/wrong data exported
  • v0.4.958 22/01/2026

    🐛 fix: include Wisdom Tea in XP calculations

    Merge pull request #3 from vidonnus/fix/wisdom-tea-xp

    🐛 fix: include Wisdom Tea in XP calculations

  • v0.4.958 22/01/2026

    🐛 fix: display actual equipped wisdom item names instead of hardcoded label

    Merge pull request #4 from vidonnus/fix/wisdom-item-display

    🐛 fix: display actual equipped wisdom item names instead of hardcoded labels

  • v0.4.958 22/01/2026

    💄 style: fix stopwatch emoji spacing in time displays

    Merge pull request #5 from vidonnus/fix/stopwatch-emoji-spacing

    💄 fix: stopwatch emoji spacing in time displays

  • v0.4.958 22/01/2026

    🐛 fix: apply gourmet tea bonus to items/hr for brewing/cooking

    Merge pull request #6 from vidonnus/fix/gourmet-tea-items-per-hour

    🐛 fix: apply gourmet tea bonus to items/hr for brewing/cooking

  • v0.4.958 22/01/2026

    🐛 fix: update skill XP percentage display in real-time

    Merge pull request #7 from vidonnus/fix/skill-xp-percentage-realtime-update

    🐛 fix: update skill XP percentage display in real-time

  • v0.4.958 22/01/2026

    Filter out player messages from dungeon tracker chat parsing

    Fixed false positives where players talking about dungeon stats in chat were being parsed as actual system messages.

    Changes:

    • Added player message filter to both DOM scanning functions
    • Regex /^[^[]+:/ detects player messages (username: [timestamp]...)
    • System messages start with [timestamp] directly

    This prevents tracking player chat like "qu: [0m 9s] [Average: 16m 22s]" as real dungeon completion messages.

    Also includes alchemy profit fixes from earlier:

    • Added achievement efficiency buff support
    • Fixed efficiency breakdown display

    🤖 Generated with Claude Code

    Co-Authored-By: Claude Sonnet 4.5 [email protected]

    Enhance dungeon tracker player message filter

    • Add dual-layer filtering: DOM element check + regex fallback
    • Check for ChatMessage_username child element first
    • Fallback to /^[^[]+:/ regex pattern
    • Applied to both scanExistingChatMessages and backfillFromChatHistory
    • Prevents player messages from being counted as dungeon runs

    🐛 fix: correct marketplace listing order by matching quantities

    • Extract filled/total quantity from table rows
    • Use quantity info to precisely match listings with same price
    • Prevents listing data from appearing in wrong order
    • Maintains backward compatibility with fallback matching

    Merge pull request #8 from vidonnus/fix/marketplace-listing-order

    🐛 fix: correct marketplace listing order by matching quantities

  • v0.4.958 22/01/2026

    Fix Steam combat sim export returning empty data

    • Add localStorage fallback when dataManager.characterData is null
    • Directly decompress character data from localStorage.getItem('character')
    • Fixes issue where export shows level 1 and naked on Steam
    • Prevents stale data when switching characters
  • v0.4.958 21/01/2026

    Enhance dungeon tracker player message filter

    • Add dual-layer filtering: DOM element check + regex fallback
    • Check for ChatMessage_username child element first
    • Fallback to /^[^[]+:/ regex pattern
    • Applied to both scanExistingChatMessages and backfillFromChatHistory
    • Prevents player messages from being counted as dungeon runs
  • v0.4.958 21/01/2026

    Filter out player messages from dungeon tracker chat parsing

    Fixed false positives where players talking about dungeon stats in chat were being parsed as actual system messages.

    Changes:

    • Added player message filter to both DOM scanning functions
    • Regex /^[^[]+:/ detects player messages (username: [timestamp]...)
    • System messages start with [timestamp] directly

    This prevents tracking player chat like "qu: [0m 9s] [Average: 16m 22s]" as real dungeon completion messages.

    Also includes alchemy profit fixes from earlier:

    • Added achievement efficiency buff support
    • Fixed efficiency breakdown display

    🤖 Generated with Claude Code

    Co-Authored-By: Claude Sonnet 4.5 [email protected]

  • v0.4.958 20/01/2026

    Fix enhancement bonus calculation - correct HRID format for slot multipliers

    Fixed critical bug where enhancement slot multipliers were not being applied correctly:

    • Changed SLOT_MULTIPLIERS keys from /equipment_types/* to /item_locations/*
    • Equipment map uses item_locations format, causing lookup failures
    • Accessories now correctly apply 5× multiplier (previously defaulted to 1×)

    Example fix:

    • Before: Philosopher's Necklace +4 = 4% × (1 + 0.092 × 1) = 4.368% ≈ 4.4%
    • After: Philosopher's Necklace +4 = 4% × (1 + 0.092 × 5) = 5.84% ✓

    Affects all equipment stat calculations:

    • Speed bonuses (skilling, action)
    • Efficiency bonuses
    • Rare find bonuses
    • Essence find bonuses

    🤖 Generated with Claude Code

    Co-Authored-By: Claude Sonnet 4.5 [email protected]

  • v0.4.957 20/01/2026

    Fix combat task sorting for boss monsters

    Boss monsters were not being included in the sortIndex map, causing them to default to sortIndex 999 and sort to the end of the task list.

    Changes:

    • data-manager.js: Updated buildMonsterSortIndexMap() to extract monsters from both randomSpawnInfo.spawns AND fightInfo.bossSpawns
    • Boss monsters (e.g., Chronofrost Sorcerer) now correctly sort by their zone's sortIndex (e.g., Sorcerer's Tower = 37)

    Result: All combat task monsters (regular and boss) now sort by zone progression order.

    🤖 Generated with Claude Code

    Co-Authored-By: Claude Sonnet 4.5 [email protected]

  • v0.4.957 20/01/2026

    Implement zone-based sorting for combat tasks

    Combat tasks now sort by zone progression order instead of alphabetically.

    Changes:

    • data-manager.js: Added monsterSortIndexMap to track monster → zone sortIndex
    • data-manager.js: Added buildMonsterSortIndexMap() to extract sortIndex from game data
    • data-manager.js: Added getMonsterSortIndex() and getMonsterHridFromName() helpers
    • task-sorter.js: Updated getTaskOrder() to fetch monster sortIndex for combat tasks
    • task-sorter.js: Updated compareTaskCards() to sort combat by zone progression
    • task-sorter.js: Added extractMonsterName() to parse monster names from task strings

    Implementation:

    • Reads combat zone sortIndex from actionDetailMap (1-55 for non-dungeon zones)
    • Multi-zone monsters use earliest zone's sortIndex
    • Task names parsed as "[Monster Name]Z[number]" (no space before Z)
    • Unknown monsters default to sortIndex 999 (sorted to end)

    Result: Combat tasks now sort by game progression (Fly → Jerry → ... → Infernal Abyss) Non-combat tasks remain alphabetically sorted.

    🤖 Generated with Claude Code

    Co-Authored-By: Claude Sonnet 4.5 [email protected]

  • v0.4.956 20/01/2026

    Add task detection and taskSpeed calculation to dataManager

    • Store characterQuests from init_character_data
    • Add getActiveTaskActionHrids() - returns array of task action HRIDs
    • Add isTaskAction() - checks if action is currently a task
    • Add getTaskSpeedBonus() - calculates taskSpeed from trinket slot
    • Handles enhancement bonuses with 5x trinket multiplier
    • Ready for integration into speed calculations

    v0.4.956: Add task speed bonus support

    • Integrate taskSpeed from task badges into action time calculations
    • Task speed applies multiplicatively (after equipment speed)
    • Add task detection: dataManager.isTaskAction() checks characterQuests
    • Add getTaskSpeedBonus() with enhancement scaling (trinket 5x multiplier)
    • Display task speed in separate section showing multiplicative effect
    • Update action-calculator to accept actionHrid for task detection
    • Update quick-input-buttons and action-time-display to pass actionHrid
    • Fixed enhancement calculation (noncombatEnhancementBonuses already has slot multiplier)

    Calculation: Base → Equipment Speed → Task Speed (multiplicative) Example: 8.00s → 6.72s (19% equip) → 5.77s (16.5% task)

  • v0.4.955 20/01/2026

    Add dual-path data access for Steam in milkonomy-export

    • Apply same Steam/Tampermonkey detection as combat-sim-export
    • Tampermonkey: Use GM storage (existing behavior)
    • Steam: Use dataManager.characterData from RAM
    • Fixes 'X No Data' error for Milkonomy export on Steam
  • v0.4.955 20/01/2026

    Fix duplicate setCurrentProfile call overwriting profile cache

    • Remove setCurrentProfile from combat-score.js
    • websocket.js already handles profile caching with proper characterID extraction
    • Prevents raw profile data from overwriting formatted cache entry
    • Fixes 'Profile not found' error on Steam
  • v0.4.955 20/01/2026

    Add dual-path data access for Steam users in combat-sim-export

    • Detect Tampermonkey vs Steam via GM_info check
    • Tampermonkey: Use GM storage (existing behavior, no changes)
    • Steam: Use dataManager RAM storage for characterData and clientData
    • Import dataManager for Steam compatibility
    • No impact to browser users
  • v0.4.955 20/01/2026

    Fix missing setCurrentProfile import

    • Add setCurrentProfile to imports from profile-cache.js
    • Fixes ReferenceError that prevented combat score panel from rendering
    • Export buttons now appear correctly
  • v0.4.955 20/01/2026

    Fix Steam user profile exports - store character ID instead of null

    • Store actual character ID when profile opens (not null)
    • Allows export function to find profile in memory cache
    • Fixes 'X No Data' error for Steam users viewing other profiles
    • Version bump to 0.4.955
  • v0.4.954 20/01/2026

    Fix Steam user profile exports with memory-based caching

    • Add profile-cache.js module to store profiles in memory (works on Steam)
    • Store profile data when profile_shared WebSocket message received
    • Check memory cache as fallback when GM storage unavailable
    • Clear cache when profile closes to prevent stale data
    • Fixes 'X No Data' error for Steam users viewing other players
    • Version bump to 0.4.954
  • v0.4.954 20/01/2026

    Fix combat sim clipboard export format for Player 1 import field

    • Changed Combat Sim Export button to export single-player format
    • Added name field, removed zone/simulationTime from single-player exports
    • Fixed ability levels to use numbers instead of strings
    • Removed duplicate Export to Clipboard button from profile page
    • Single-player format now works when pasted into Combat Sim "Player 1 import" field

    🤖 Generated with Claude Code

    Co-Authored-By: Claude Sonnet 4.5 [email protected]

  • v0.4.953 20/01/2026

    v0.4.953 - Fix profit display colors and processing detection

    • Revenue labels now use COLOR_TOOLTIP_PROFIT (green)
    • Costs labels now use COLOR_TOOLTIP_LOSS (red)
    • Fixed template literal bugs in Net Profit color
    • Fixed Processing Tea detection to exclude non-processing crafts
    • Fixed collapsible sections auto-collapsing (stopPropagation)
    • Left-aligned all collapsible section content
    • Added X actions breakdown feature for profit displays
  • v0.4.952 19/01/2026

    Fix action queue stats showing wrong action during party interrupts

    Issue: When party leader pauses/resumes combat, the DOM updates instantly but WebSocket cache is stale. This caused action time display to match against queued actions instead of current action, showing wrong stats (e.g., '276 queued' from Crafting when actually doing party combat).

    Root cause: Code used .find() to search ALL cached actions (current + queue), which could match queued actions when DOM showed current action name.

    Fix: Only check cachedActions0. If DOM doesn't match current action, display nothing until cache updates.

    Prevents race condition between DOM update and WebSocket update.

  • v0.4.952 19/01/2026

    Fix enhancement protection items not being used

    CRITICAL BUG FIX: Protection items like Black Bear Fluff were never being added to protection options, causing the simulator to use the expensive base item as protection instead.

    Root cause: Code treated protectionItemHrids as array of arrays, but game data shows it's a flat array of strings. Array.isArray() check on string values always returned false, skipping all protection items.

    Fix: Directly spread protectionItemHrids into options array.

    Example impact:

    • Before: Black Bear Shoes +16 used 1220.5x Black Bear Shoes as protect
    • After: Will use Black Bear Fluff (WAY cheaper)

    v0.4.952

  • v0.4.951 19/01/2026

    Add Top Order Age column to My Listings

    • Shows estimated age of top competing order for each listing
    • Uses shared cache from estimated-listing-age module
    • Handles race condition with setTimeout delay
    • Supports non-enhanceable items (enhancement level 0)
    • Only active when market_showTopOrderAge setting enabled
    • Displays ~elapsed time format (e.g., ~3h 45m)
    • Shows 'N/A' when order book data unavailable
    • Shows 'None' when no competing orders exist

    v0.4.951

  • v0.4.950 18/01/2026

    v0.4.950 - Fix tea efficiency: Apply skill level buffs to effective player level

    • Added parseTeaSkillLevelBonus() to tea-parser.js
    • Fixed alchemy-profit.js, action-calculator.js, profit-calculator.js, gathering-profit.js
    • Tea skill level bonuses (e.g., +8 Cheesesmithing) now boost effective level
    • Restores correct total efficiency (60.3% vs broken 51.3%)
    • Fixes level efficiency calculation for all production and gathering skills
  • v0.4.947 18/01/2026

    v0.4.948: Enhanced alchemy profit calculator with detailed modifier breakdowns

    • Added comprehensive modifier breakdowns showing all sources:
      • Success Rate: base rate + tea bonus (Catalytic Tea 5% ratio boost)
      • Efficiency: level + house + tea + equipment + community buff (Production Efficiency)
      • Action Speed: equipment + tea bonuses
      • Rare Find: equipment + achievement bonuses
      • Essence Find: equipment bonuses
    • Fixed essence drop rate extraction by matching items via HRID instead of index position
    • Implemented Rare Find bonus application to rare drops with full calculation visibility
    • Split revenue display into Normal Drops, Essence Drops, and Rare Drops sections
    • Added collapsible sections for all modifier details with state preservation across updates
    • Added Production Efficiency community buff support (14% base + 0.3% per level)

    🤖 Generated with Claude Code

    Co-Authored-By: Claude Sonnet 4.5 [email protected]

  • v0.4.946 17/01/2026

    Make trade history character-specific

    • Add character ID suffix to storage key (tradeHistory_{characterId})
    • Load/save data separately for each character
    • Handle character switches by clearing old data and reloading new
    • Prevents trade history from being shared across characters

    Fix reversed buy price color logic

    • Current price HIGHER than last buy → RED (worse deal now)
    • Current price LOWER than last buy → GREEN (better deal now)
    • Sell logic was already correct

    Fix sell price color logic to match buy logic

    Both colors now indicate current market opportunity:

    • BUY: Current ask HIGHER → RED (worse), LOWER → GREEN (better)
    • SELL: Current bid HIGHER → GREEN (better), LOWER → RED (worse)

    Colors show whether NOW is a good time to trade compared to your last price

  • v0.4.946 17/01/2026

    Fix trade history color comparison to use current top orders

    • Extract ask/bid prices from DOM instead of 24-hour API averages
    • Properly compare against visible market prices (82K/52K not 640K/620K)
    • Add parsePrice() helper to handle K/M/B suffixes
    • Colors now correctly show grey when prices match current market
  • v0.4.946 17/01/2026

    Add personal trade history feature (v0.4.946)

    • Track buy/sell prices when market orders complete
    • Display last traded prices when viewing items in marketplace
    • Store history in IndexedDB (character-specific)
    • Position display above item icon without overlay
    • WebSocket hook for market_listings_updated events
    • New setting: market_tradeHistory (default: true)
  • v0.4.945 17/01/2026

    Fix config settings not loading with character data (v0.4.944)

    Root cause: Race condition where config.initialize() ran before character data loaded, resulting in empty settingsMap. Features checking getSetting() received false, causing them to skip initialization.

    Impact: ALL features that check config.getSetting() failed to initialize, including Estimated Listing Age, network alerts, and others.

    Changes:

    • main.js: Added config.loadSettings() and config.applyColorSettings() in character_initialized handler before feature initialization
    • Matches existing pattern from character_switched handler in feature-registry

    Flow:

    1. config.initialize() runs early (loads defaults, characterId undefined)
    2. character_initialized fires when character data available
    3. config.loadSettings() reloads settings with character-specific data
    4. config.applyColorSettings() applies user color customizations
    5. Features initialize with correct user settings

    Result: Features now properly initialize with user settings on both initial load and character switch.

    v0.4.945: Fix reactive colors & Milkonomy export

    • Fix config API bug: Changed config.on() to config.onSettingChange()

      • Fixed 5 files using non-existent config.on() method
      • ability-book-calculator, inventory-sort, house-cost-display, task-profit-display, combat-score
    • Implement reactive Script Accent Color for all features

      • All 10 features using COLOR_ACCENT now update immediately when color changes
      • No page refresh required for color customization
      • Added setupSettingListener() and refresh() methods to all affected features
    • Fix Milkonomy export ownership check

      • Simplified logic: reject any external profile ID
      • Added defensive storage clearing to prevent stale data blocking exports
      • Now works correctly when exporting your own profile
    • Market data refactoring (Phase 2)

      • Centralized price access in utils/market-data.js
      • Eliminated ~200 lines of duplicated pricing mode logic
      • Fixed console spam with input validation and warning deduplication
  • v0.4.943 17/01/2026

    Fix settings tab disappearing on character switch (v0.4.943)

    Root cause: Duplicate event listener accumulation causing race conditions and timing mismatches between cleanup and re-initialization.

    Changes:

    • settings-ui.js: Added characterSwitchHandler property to prevent duplicate listeners
    • settings-ui.js: Switched from 'character_switching' to 'character_initialized' event
    • settings-ui.js: Created handleCharacterSwitch() method with 500ms stabilization delay
    • settings-ui.js: Split cleanup into cleanupDOM() (character switch) and cleanup() (full shutdown)
    • feature-registry.js: Removed redundant settingsUI.initialize() call (now self-managed)

    Pattern: Follows action-time-display.js proven working pattern for character switch handling.

    Result: Settings tab now persists correctly through multiple character switches.

  • v0.4.942 17/01/2026

    v0.4.942 - Fix material limit calculation for crafting and alchemy actions

    • Fixed material limit showing efficiency-multiplied totals instead of actual attempts
    • Added action type check to separate alchemy (primaryItemHash) from crafting logic
    • Crafting now correctly calculates limits based on input items + upgrade items
    • Alchemy now correctly uses primaryItemHash for item-specific decompose/coinify
    • Material limit now shows max attempts possible, not total items produced
    • Time calculations updated to handle attempts vs items correctly
  • v0.4.941 17/01/2026

    v0.4.941 - Fix dungeon tracker UI persistence on character selection screen

    • Added MutationObserver to detect 'Select Character' heading
    • Hides dungeon UI when returning to character selection screen
    • Added offUpdate() method to dungeon-tracker.js for proper callback cleanup
    • Improved listener lifecycle management to prevent memory leaks
    • Stores callback/handler references for proper unregistration
  • v0.4.940 17/01/2026

    v0.4.940 - Character switch fixes and console cleanup

    Fixes:

    • Settings UI observer now restarts after character switch
    • Storage flushAll() now actually saves pending data
    • Flush storage before character switch cleanup
    • Non-blocking feature re-initialization with requestIdleCallback

    Cleanup:

    • Removed unnecessary console.log statements (kept errors/warnings)
    • Cleaned up initialization, cleanup, and progress logging
    • Improved code readability by removing verbose announcements
  • v0.4.939 17/01/2026

    v0.4.939 - Version bump before settings/performance fixes

    Clean baseline before implementing:

    • Fix 1: Settings UI observer restart after character switch
    • Fix 2: Storage flushAll() to actually save pending data
    • Fix 3: Flush storage before character switch cleanup
    • Fix 4: Non-blocking re-initialization with requestIdleCallback
  • v0.4.938 17/01/2026

    v0.4.938 - Swap inventory badge positions

    UI Changes:

    • Ask price badges now on LEFT (instant-buy - primary price)
    • Bid price badges now on RIGHT (instant-sell - secondary price)

    Added:

    • FEATURES.txt - Comprehensive feature list

    🤖 Generated with Claude Code

  • v0.4.937 17/01/2026

    v0.4.937 - Rolling averages, settings fixes, combat exclusions

    Bug Fixes:

    • Fixed actions to level calculator treating attempts as outputs (efficiency bug)
    • Fixed dungeon chat rolling averages resetting on new messages (persistent counter)
    • Fixed quick input buttons appearing on combat tiles (exclude combat actions)
    • Fixed inventory badge price settings descriptions (per-item vs stack, Ask/Bid terminology)

    Features:

    • Dungeon chat now shows cumulative rolling averages (each message = avg up to that point)
    • Corrected market terminology: Ask (instant-buy), Bid (instant-sell)

    🤖 Generated with Claude Code

  • v0.4.936 16/01/2026

    v0.4.936 - Fix tooltip prices for enhanced items

    • Fixed tooltip price display to show enhancement-level specific prices
    • Previously showed base item (+0) price for all enhancement levels
    • Now correctly shows market price for +1 to +20 enhanced items
    • Shows 'No market data' when enhanced item has no market listings

    Changes:

    • Reordered enhancement level extraction before price fetch
    • Changed marketAPI.getPrice() to use actual enhancement level
    • Updated version to 0.4.936 in package.json, main.js, and userscript-header.txt
  • v0.4.935 16/01/2026

    v0.4.935 - Fix Enhancement Tracker visibility detection

    • Fixed class name detection: EnhancingPanel_enhancingPanel (not SkillActionDetail_enhancingComponent)
    • Fixed boolean coercion bug in setting check (showOnlyOnEnhancingScreen !== true)
    • Added polling to detect both screen navigation and setting changes (500ms interval)
    • Removed debounce for immediate panel detection
    • Integrated formatPercentage utility from modularization work
  • v0.4.934 16/01/2026

    v0.4.934 - Character switch fixes and hybrid dungeon average calculation

    • Fixed character switch cleanup and re-initialization

      • Dungeon tracker properly cleans up WebSocket handlers, UI, and state
      • All features re-initialize after character switch with reloaded config
      • Dungeon UI now appears immediately when switching back to character in dungeon
    • Fixed settings disappearing on character switch

      • Config settings now reload before feature re-initialization
    • Implemented hybrid average calculation for dungeon chat annotations

      • Averages now appear immediately from visible chat messages (in-memory)
      • Automatically aligns with backfilled data when backfill is done
      • No automatic saving - respects manual backfill workflow
  • v0.4.933 16/01/2026

    Fix task dungeon icons with dynamic sizing and right-to-left layout

    • Fixed dungeon icon detection using correct game data structure
    • Added dynamic icon sizing: 30%/25%/20% based on total icon count (1-5)
    • Implemented right-to-left layout: Monster always on right, dungeons to its left
    • Added countDungeonsForMonster() to determine icon count before positioning
    • Updated addIconOverlay() to accept width parameter
    • Version bump to 0.4.933

Προβολή όλων των εκδόσεων κώδικα