- New module: modules/tga_converter.py
- Reads Truevision TGA format from game cache
- Converts to PNG with proper color handling (BGR->RGB)
- Auto-detects cache folder location
- Batch conversion support
- Handles alpha channels
- New dialog: ui/tga_converter_dialog.py
- Visual interface for TGA conversion
- Shows list of cached .tga files
- Progress tracking during conversion
- One-click convert all
- Added to Tools → Computer Vision → TGA Icon Converter (Ctrl+T)
This is much more efficient than extracting icons from screenshots!
The game already has the icons in cache as .tga files.
Changed default locations:
- Screenshots: Documents/Entropia Universe/Screenshots
- Icons: Documents/Entropia Universe/Icons
This provides better organization and easier access for users.
All directories are created automatically if they don't exist.
- Add Directories group to General tab
- Settings for screenshots directory
- Settings for extracted icons directory
- Browse buttons for both directories
- Values saved to QSettings
- New module: modules/inventory_scanner.py
- Detects inventory and item details windows
- Extracts item icons from inventory grid
- Reads item stats from details panel
- Parses weapon, armor, and common stats
- Handles scrolling (planned for future)
- New dialog: ui/inventory_scanner_dialog.py
- Visual interface for scanning
- Shows extracted icons in grid view
- Displays item stats in table
- Saves results to JSON
- Background worker for non-blocking scans
- Updated main_window.py:
- Added Tools → Computer Vision → Inventory Scanner (Ctrl+I)
- Integrated with existing GameVisionAI
This allows users to extract item data from Entropia Universe
for gear management and loadout configuration.
- Create new ui/settings_dialog.py with tabbed interface
- Tabs: General, Screenshot Hotkeys, Computer Vision, Advanced
- Remove old SettingsDialog from main_window.py
- Update on_settings() to use new comprehensive dialog
- Screenshot hotkey settings now in Settings (Ctrl+,)
- Computer Vision settings now in Settings dialog
- Remove persistent mss.mss() instance from AutoScreenshot
- Use context manager 'with mss.mss() as sct:' for each capture
- Fixes '_thread._local' object has no attribute 'srcdc' error
- Allows screenshots to work from hotkey callbacks in background threads
SQLite's TIMESTAMP type causes auto-conversion issues when data is in ISO format
- Changed all TIMESTAMP columns to TEXT in schema.sql
- Disabled detect_types in database.py to prevent auto-conversion
- This stores datetime as ISO strings without parsing issues
- Convert sqlite3.Row to list before accessing by index
- Add detailed debug logging for troubleshooting
- Fix fromisoformat error by checking for None values
- Add try/except around each row to skip bad data
- Changed from dict-style access (proj['type']) to index access (proj[0])
- Added try/except around each row processing to skip bad rows
- Added detailed error logging with traceback
- Handle cases where row has fewer columns than expected
- Add '-- Select a template --' as first item in combo box
- Block signals while refreshing to prevent unwanted callbacks
- Select newly created template automatically
- Fix index check to skip placeholder (index > 0 instead of >= 0)
- Add enable/disable based on whether templates exist
- Rewrote screenshot_hotkey.py to use Qt QShortcut as primary method
- Qt shortcuts work reliably when app is focused (no admin needed)
- Added optional 'keyboard' library for global hotkeys (requires admin)
- Updated main_window.py to pass parent window to hotkey manager
- Shows clear status: global vs Qt-only mode
- Users can now press F12 etc when app is focused
- Use pynput format <f12>, <shift>+<f12> etc for hotkey parsing
- Initialize screenshot hotkeys AFTER UI setup (fixes log_output error)
- Clean up hotkey display in help text (remove angle brackets)
- Add modules/screenshot_hotkey.py with global hotkey listener using pynput
- Default hotkeys: F12=Full, Shift+F12=Region, Ctrl+F12=Loot, Alt+F12=HUD
- Integrate into main_window.py with Settings dialog
- Hotkeys work globally (even when game is focused)
- Add Tools → Screenshot Hotkeys menu (Ctrl+Shift+S)
- Shows status message when screenshot is captured
Based on PyImageSearch article: https://pyimagesearch.com/2022/03/14/improving-text-detection-speed-with-opencv-and-gpus/
- Add opencv_text_detector.py using EAST model with CUDA support
- OCRProcessor now uses PaddleOCR first, falls back to OpenCV
- OpenCV text detection: ~97 FPS on GPU vs ~23 FPS on CPU (4x faster)
- No heavy dependencies (PyTorch/PaddlePaddle) required for OpenCV mode
- Auto-downloads EAST model on first use
- Add early torch import before PyQt6 imports in main_window.py
- This prevents the c10.dll initialization error on Windows
- Solution 3 from user research: import torch before PyQt
- Add fix_pytorch.bat for Windows users to repair PyTorch installation
- Add verify_vision.py to check and auto-fix vision dependencies
- Make torch import optional in game_vision_ai.py to prevent crashes
- Provides graceful fallback if PyTorch fails to load
- Code was calling db.fetchall() and db.fetchone() but these methods didn't exist
- Add helper methods that execute query and return results
- Fixes template loading and other database operations
- Fix recursion error in GalleryDialog by blocking signals during session filter updates
- Fix missing 'avatar_name' field in SetupWizard by registering the field properly
- Both dialogs should now work without errors
- Check evade type for 'target Evaded' or 'target Dodged'
- Count weapon cost on those events (you fired but missed)
- Armor decay still only counted on actual damage taken
- Fixes: weapon cost now accurate for all shots including misses
- Changed from 0.0005 to 0.00025 PED per damage (0.025 PEC)
- Based on user feedback: 504 damage should give ~0.14 PED decay
- Removed complex fallback logic, using simple accurate formula
- Formula: damage * 0.00025 = armor decay in PED
- log_info() needs log_output which is created in setup_ui()
- Move _load_settings() call to after UI initialization
- Fixes 'MainWindow' object has no attribute 'log_output' error
- Add QSettings import from PyQt6.QtCore
- Add _load_settings() method to load player name on startup
- Add _save_settings() method to save player name when settings change
- Settings stored in Lemontropia/Suite registry/file
- Player name now persists between app launches
- Use formula: Decay (PED) = damage * 0.0005 (approx 0.05 PEC per damage)
- This matches EU armor decay formula better than flat cost per hit
- 1966 damage would give ~0.98 PED decay (not 22 PED)
- Falls back to cost_per_hit if armor stats not available
- Add comma (,) to character class in PATTERN_LOOT_EN and PATTERN_LOOT_SV
- Add comma (,) to PATTERN_LOOT_NO_VALUE_EN and PATTERN_LOOT_NO_VALUE_SV
- Fixes items with commas in their names not being tracked
- Save weapon_cost_total, armor_cost_total, healing_cost_total to decay_events
- This ensures core profit calculation matches HUD display
- Insert decay events before calling end_session
- Log the saved costs for verification
- Set hud.session_active = False when paused
- Set hud.session_active = True when resumed
- Update HUD status label to show paused state (orange)
- Prevents loot/costs from being tracked during breaks
- Remove separate update_kills() call from on_loot handler
- Let update_loot() handle kill counting internally
- Only increment kills when >2 second gap since last loot
- Add is_new_kill flag to track new mobs vs multi-item drops
- Add debug logging for kill counting
- Replace signal/slot approach with QTimer-based batched updates
- Add _refresh_pending flag and _request_refresh() method
- Refresh timer runs at 10Hz (100ms) on main thread
- Prevents race conditions and thread safety issues
- All update methods now just set the pending flag
- Remove dynamic color changes from _refresh_display
- Use fixed colors set during widget creation
- Just update text values in _refresh_display
- Prevents 'Could not parse stylesheet' errors
- Add refresh_needed signal to HUDOverlay
- Connect signal to _refresh_display with QueuedConnection
- Update all update methods to emit signal instead of calling _refresh_display directly
- This ensures all GUI operations (setStyleSheet, setText) happen on main thread
- Fixes crash caused by GUI operations from LogWatcher thread
- Initialize _session_costs and _session_display in __init__ (was causing crashes)
- Add [EVENT], [HUD], [DEBUG], [ERROR] prefix logging to all event handlers
- Add traceback logging for better debugging
- Add debug logging to all HUD update methods
- Log session_active state in HUD methods