Commit Graph
1029 Commits
Author SHA1 Message Date
alex e54bb64d03 Add phased Linux port plan documentation 2026-05-26 08:19:07 +02:00
alex 179eac8b80 Document .env workflow and recent stability/safety fixes 2026-05-25 20:14:55 +02:00
alex b7a7280964 Fix XP status math edge-cases causing 'Failed to log exp' 2026-05-25 19:49:15 +02:00
alex 909aa88977 Make XP OCR parsing robust to casing and common OCR typos 2026-05-25 19:46:51 +02:00
alex 254c167cbe Reduce XP logging warning spam and keep run stable 2026-05-25 19:45:27 +02:00
alex b3fd60c26d Add sell safety for shields and log sold item names 2026-05-25 19:43:46 +02:00
alex 55def980cd Make repair flow best-effort and harden Discord send fallback 2026-05-25 19:23:09 +02:00
alex 265326a471 Stop tracking personal .env file 2026-05-25 17:17:58 +02:00
alex af6ab38939 Add untracked .env overrides with documented template 2026-05-25 17:15:58 +02:00
alex 5ee0061936 Add Discord embed unit tests for safe send behavior 2026-05-25 17:13:15 +02:00
alex 0bd8e7e7bc Add A5->A4 repair fallback and harden Discord embed send 2026-05-25 17:03:16 +02:00
alex 25c5810778 Handle missing OCR deps without crashing XP logging 2026-05-25 15:18:45 +02:00
alex f20ac02720 Add tesserocr wheel fallback to Windows installer 2026-05-25 15:16:09 +02:00
alex c96fcdf545 Improve dependency checker with concrete remediation steps 2026-05-25 15:13:37 +02:00
alex b77d62144a Add requirements.txt package validation to dependency checker 2026-05-25 15:11:58 +02:00
alex e573a28e8a Add Windows dependency health-check script and launcher 2026-05-25 15:10:23 +02:00
alex d79f472c33 Add robust Larzuk repair interaction fallback with logging 2026-05-25 15:07:17 +02:00
alex 3bf1c3d539 Fix town marker check in start_game by passing current frame 2026-05-25 15:04:45 +02:00
alex a691d4bdfc Harden game creation, tome parsing, and A5 repair menu flow 2026-05-25 15:03:19 +02:00
alex b84b745dbd Accept 'page up' alias for hotkey mapping 2026-05-25 14:56:11 +02:00
alex a70302f44d Change default auto settings hotkey to page up 2026-05-25 14:52:29 +02:00
alex 0b1af05841 Avoid unsafe force-kill for bot/controller shutdown 2026-05-25 14:46:11 +02:00
alex d96cf544bf Fix rare-for-gold override when pickit cache is used 2026-05-25 14:41:36 +02:00
alex fc3ac30431 Persist stats snapshot continuously for crash resilience 2026-05-25 14:36:11 +02:00
alex a39acf510d Fix pytest setup and handle missing tesserocr in test env 2026-05-25 14:35:13 +02:00
alex c9ffcf1e4f Add Discord status updates every N runs with config option 2026-05-25 14:30:33 +02:00
alex 0ccf8ae5ea Add structured run/item logging and per-area item stats 2026-05-25 14:28:52 +02:00
alex d4e1758d97 Make pick_gold override BNIP gold threshold 2026-05-25 14:25:37 +02:00
alex 40d46bb592 Add simple pick_gold config toggle for ground gold 2026-05-25 14:22:35 +02:00
alex c5519ff290 Add config toggle to pick and sell rares for gold 2026-05-25 14:18:57 +02:00
alex dd45386579 Improve config docs and harden discord+difficulty parsing 2026-05-25 14:10:54 +02:00
alex 54f0e3ebcc Update docs and params defaults 2026-05-25 13:52:39 +02:00
alex 7eb961476e Fix Discord webhook init and add local config defaults/ignores 2026-05-25 13:51:50 +02:00
alex d44acf8bf2 Add CI launch smoke test for built executables 2026-05-25 13:47:09 +02:00
alex f597a0108c Fix cooldown pacing for Blizzard and FoH casts 2026-05-25 11:14:52 +02:00
alexandClaude Sonnet 4.6 af06d8aff4 Fix show_belt key, post-attack wait, and pickit variable scope
- config/params.ini: show_belt k->n matches the actual D2R keybind so
  the bot can now correctly read and manage belt potion inventory.
  pickit_screenshots=1 enables per-run loot scan evidence.
- blizz_sorc.py: kill_pindle() now waits 1.5-2.0s (was ~0.33s) after
  the attack loop before teleporting to the loot area.  Blizzard has an
  ~1.8s fall duration, so the old wait left enemies alive when the sorc
  arrived.  Also adds _cast_static() at the start to reduce pack HP
  immediately.
- pickit.py: rename loop var i->ground_item (fixes potential NameError
  when items list is empty) and improve tele-fail warning message.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-05-24 20:46:00 +02:00
alexandClaude Sonnet 4.6 9ee102a0f1 Fix charged teleport not firing in traverse_nodes_fixed
The TELE_ACTIVE template only matches native teleport's icon. Charged
teleport (from a staff/item) shows a different icon with a blue charge
indicator, so is_right_skill_selected(["TELE_ACTIVE"]) returns False
and char.move() falls back to walking.

Walking a path calibrated for teleport drops the sorc in the wrong
game-world position, so blizzard casts land south of Pindle ("below
targets") and the sorc is exposed to the full minion pack.

Fix: for can_teleport_with_charges chars, call select_tp() once then
pass force_tp=True to each char.move() hop. force_tp bypasses the
template check and re-arms the teleport hotkey before each right-click,
so charges are actually consumed per hop. If charges deplete mid-path
char.move() right-clicks with no effect and the remaining hops degrade
to standing still rather than walking into monsters.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-05-24 20:09:11 +02:00
alexandClaude Sonnet 4.6 5e320f0eef Fix charges-sorc walking into Pindle's minion pack (death)
pindle.py: route can_teleport_with_charges chars through
traverse_nodes_fixed for the Pindle approach instead of traverse_nodes.
traverse_nodes (node-based) falls back to walking for charges chars
because pre_move does nothing for them — so the sorc was slow-walking
through the entire minion pack before the fight, arriving at near-zero HP.

pather.py: traverse_nodes_fixed now calls char.select_tp() before
pre_move when using charge-based teleport, so char.move() sees
teleport on the right-skill slot and uses charges for each step.
When charges deplete mid-path it falls back to walking gracefully.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-05-24 19:54:15 +02:00
alexandClaude Sonnet 4.6 2634619b18 Fix window-detection race condition and None monitor range crash
- misc.py: catch psutil.NoSuchProcess in WindowSpec.match() — a process
  can exit between EnumWindows enumerating it and us calling .name(),
  which was crashing the window-detection thread and leaving
  monitor_x_range/monitor_y_range as None
- screen.py: guard convert_screen_to_monitor against None ranges so
  template matching doesn't throw TypeError before the D2R window is
  first located; logs a warning and returns unclamped coords instead
- main.py: switch BeautifulTable to STYLE_DEFAULT (ASCII only) to avoid
  UnicodeEncodeError on cp1252 terminals; add try/except fallback

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-05-24 19:42:40 +02:00
alexandClaude Sonnet 4.6 dc224bec5c Fix CTA spam, traverse_nodes_fixed crash, and add skill preflight/setter
- config: cta_available=0 (user has no CTA weapon; was causing 5 failed
  weapon-swap attempts per run)
- pather: traverse_nodes_fixed now allows can_teleport_with_charges chars
  through instead of raising ValueError; when charges deplete mid-path
  char.move() falls back to walking gracefully
- utils: add skill_preflight.py (visual hotkey verification, all blizz_sorc
  skills use side=right) and skill_hotkey_setter.py (automated picker binding
  with step-by-step logging)
- test: add test_skill_preflight.py (3 passing tests)
- assets: add sorc skill icon templates for preflight matching
- tools: add capture_sorc_skill_icons.py and set_sorc_skill_hotkeys.py
- key_detector: extend VK map with numpad/F-key/symbol codes; add
  validate_key_bindings() and parse_key_file(); fix char_name lookup

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-05-24 19:26:00 +02:00
alex a77e87e138 Improve Botty launch and runtime recovery 2026-05-24 18:14:23 +02:00
alex 080b7d1679 Set Botty to run Pindle with blizz sorc 2026-05-24 17:53:29 +02:00
alexandClaude Sonnet 4.6 d4fec70950 feat: add character selector (blizz sorc / fohdin / hammerdin) to F6 UI
The run-selector window now also shows a character section with radio
buttons for the three supported builds. Selecting a char updates
Config().char["type"] in-memory alongside the run selection; both take
effect on the next game.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-05-24 17:52:45 +02:00
alexandClaude Sonnet 4.6 d3dbf2bf9c fix: disable auto-login by default, require explicit auto_login=1
Auto-launch of D2R and bnet credential injection are now gated behind
an explicit `auto_login=0` flag in params.ini. Setting it to 1 restores
the previous behaviour. Credentials stored in bnet_name/bnet_pass are
never appended to launch options while auto_login=0.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-05-24 17:45:23 +02:00
alexandClaude Sonnet 4.6 887a97c93b feat: add F6 hotkey to select boss/farm runs at runtime
Adds a tkinter run-selector window accessible from the botty console via
the new select_runs_key hotkey (default F6). Users can check/uncheck any
of the 11 supported boss/farm runs; the selection updates Config in-memory
and takes effect on the next game without restarting botty.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-05-24 17:42:10 +02:00
alexandClaude Sonnet 4.6 d6c8d8d5f7 fix: replace custom tesserocr wheel with conda-forge package
The custom tesserocr-2.5.2 wheel was compiled on a specific machine
against DLL versions that do not match a fresh conda-forge installation.
This caused persistent ImportError: DLL load failed regardless of PATH
or LoadLibraryExW approach.

conda-forge's tesserocr package is compiled against the exact same
conda-forge tesseract/leptonica binaries, so all DLL dependencies
are automatically satisfied within the conda environment — no manual
DLL path manipulation needed.

Changes:
- environment.yml: add tesserocr + tesseract as conda-forge packages,
  remove leptonica pin (no longer needed), remove custom wheel from pip
- install.bat: replace wheel force-reinstall with pip uninstall cleanup
- src/*.py: simplify DLL fix to os.add_dll_directory only

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-05-24 14:49:00 +02:00
alexandClaude Sonnet 4.6 e1c18faf26 fix: use conda run instead of direct python for DLL loading
Every approach to manually replicating conda's DLL environment from
Python code or batch PATH manipulation has failed. conda run activates
the environment exactly like "conda activate botty" — setting PATH,
running activate.d scripts, and properly resolving all transitive DLL
dependencies for tesseract51.dll.

run_botty.bat now derives conda.exe from the botty python.exe path
(two levels up: envs/botty -> envs -> miniforge3 -> Scripts/conda.exe)
and uses "conda run -n botty --no-capture-output python src/main.py".

install.bat smoke test now uses "%CONDA_EXE% run -n botty python -c ..."
which already has CONDA_EXE set from the install step.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-05-24 14:37:14 +02:00
alexandClaude Sonnet 4.6 bdd6247342 fix: use LoadLibraryExW(0x1000) to preload tesseract51.dll
os.add_dll_directory alone is not enough — LOAD_LIBRARY_SEARCH_USER_DIRS
does not propagate to transitive deps of deps when loaded automatically
by the OS (e.g. tesseract51.dll's deps like mingw runtimes, leptonica).

LoadLibraryExW with LOAD_LIBRARY_SEARCH_DEFAULT_DIRS (0x1000) explicitly
propagates user DLL dir search to the entire transitive dep chain, so
leptonica, libgcc, libstdc++, zlib etc. are all found in Library\bin
and Library\mingw-w64\bin without conda activate.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-05-24 14:30:12 +02:00
alexandClaude Sonnet 4.6 77ad97022e fix: remove ctypes.WinDLL preload — use only os.add_dll_directory
ctypes.WinDLL uses LoadLibraryW which does NOT search user DLL dirs
registered via os.add_dll_directory/AddDllDirectory. It was throwing
FileNotFoundError and blocking the import before tesserocr was ever tried.

Python 3.8+ loads .pyd files with LOAD_LIBRARY_SEARCH_USER_DIRS which
DOES search user-registered dirs for the pyd and all its transitive DLL
dependencies. os.add_dll_directory(Library\bin) alone is sufficient.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-05-24 14:19:18 +02:00
alexandClaude Sonnet 4.6 d9383cc164 feat: add update.bat for git pull workflow
Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-05-24 14:12:31 +02:00