Commit Graph
1140 Commits
Author SHA1 Message Date
alexandClaude Fable 5 a05a13be67 fix: on_init save+exit recovery when stranded mid-town with no visible marker
Co-Authored-By: Claude Fable 5 <[email protected]>
2026-06-10 13:34:43 +02:00
alexandClaude Fable 5 a06e46df09 fix: track physical act across failed cross-act NPC trips; prefer A4 Jamella retry
- town_manager.identify: return the reached A5 location when Cain fails
  after successful travel (returning False made bot.py fall back to the
  pre-travel act and run wrong-act pathing all maintenance long)
- town_manager.resurrect: leave last_known_loc breadcrumb when the A4
  revive fails after travel; bot.py consumes it to re-anchor
- bot.py: alternate vendor retry prefers A4 Jamella (static, reliable)
  over A1; Malah wanders and is the main A5 vendor failure

Co-Authored-By: Claude Fable 5 <[email protected]>
2026-06-10 13:31:32 +02:00
alexandClaude Fable 5 8a58b44866 fix: substring match in OCR char-name row scan (rows include level/class text)
Co-Authored-By: Claude Fable 5 <[email protected]>
2026-06-10 13:26:22 +02:00
alexandClaude Fable 5 d99e3461fe fix: seal layout-check retry via pentagram; never skip hammers on unbound aura
- diablo.py _layoutcheck: ambiguous/lost layout check now loops back to
  the pentagram and retries the approach once before aborting the run;
  template checks bumped from single-frame 0.1s to 0.5s
- hammerdin.py _cast_hammers: an unbound aura (e.g. conviction in
  kill_diablo on a non-Infinity build) silently cast NOTHING, so Diablo
  was never attacked with the damage aura. Fall back to concentration
  and always cast hammers.

Co-Authored-By: Claude Fable 5 <[email protected]>
2026-06-10 13:24:50 +02:00
alexandClaude Fable 5 a695252614 fix: select configured char_name before saving char template
First encounter at char select blindly saved whichever character was
highlighted, locking in a wrong character for the whole session. Now,
when char_name is configured, select it via OCR first and warn if the
saved template name does not match.

Co-Authored-By: Claude Fable 5 <[email protected]>
2026-06-10 13:09:26 +02:00
alexandClaude Fable 5 7ef62161ca fix: spawn-act tracking, alternate-act vendor retry, broader CS entrance templates
- bot.py: track _spawn_act at game start as act-of-record when mid-town
  marker detection fails; _verify_town_location(assumed) fallback chain
  assumed_act -> spawn_act -> A5; pass previous location at every
  retry/fallback site instead of blind defaults
- bot.py: buy_consumables alternate-act retry ladder (A5 Malah unless
  already in A5, then A1 Akara) gated on confirmed go_to_act travel
- diablo.py/vizier.py: widen CS entrance template set (DIA_CS_ENTRANCE_*
  node-603 variants) and lower threshold 0.8 -> 0.75
- start_bot_detached.bat: detached launcher with per-launch console log

Co-Authored-By: Claude Fable 5 <[email protected]>
2026-06-10 13:06:15 +02:00
alexandClaude Fable 5 6301490cc4 fix: act-state verification, NPC dialogue confirm wait, stats integrity
Root causes from the 2026-06-09 session (51 games, 45 failed):

- Act desync: add TownManager.detect_current_act() and
  Bot._verify_town_location(); every maintenance/end-run retry and
  fallback now verifies the physical act instead of hardcoding town
  starts. open_wp/go_to_act self-heal act mismatches. Never run A1
  pathing when travel to A1 failed.
- NPC dialogue: poll action buttons up to 2.5s after click instead of
  a single-frame check (premature retry click was closing the dialog).
- Stats integrity: log_end_game skips duplicate calls (phantom 0s
  "successful" games were resetting the consecutive-fail breaker);
  clear stale failure reason at game start; set chicken flag before
  bot.stop() so chickens are no longer labeled "Bot stopped".
- Repair: prefer in-act Larzuk over cross-act Halbu trip (Halbu
  detection failed 100% last session and desynced the act state).

Documented as Bugs 9-12 in CLAUDE.md.

Co-Authored-By: Claude Fable 5 <[email protected]>
2026-06-10 08:23:10 +02:00
alexandClaude Sonnet 4.6 83951db876 fix: resolve NPC name tag template mismatch causing open_npc_menu timeouts
NPC body templates find Akara/Malah correctly but the name tag templates
score ~0.28, below the 0.35 threshold, causing 20s spinning when the NPC
is detected but the hover confirmation never passes.

Three targeted changes in open_npc_menu():
- Use a 240x140px ROI directly above the hover cursor for name tag search
  instead of the full screen, containing false-positive risk
- Lower name tag threshold from 0.35 to 0.26 so Akara at ~0.28 now passes
- Check ScreenObjects.NPCDialogue after click as primary confirmation;
  this is UI-state based and immune to stale template images
- Reduce per-NPC search timeout from 20s to 8s for faster failure recovery

Also lower max_maintenance_time_s from 120 to 60 to cap total stuck time.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-06-08 19:09:11 +02:00
alexandClaude Sonnet 4.6 793d7ed967 feat: resilient town loop, step tracking, per-run disable, maintenance timeout
Reliability
- All run approach() methods now set approach_fail_step before every return False;
  bot.py _run_wrapper reads it and includes [step: X] in Discord/log failure reasons
- on_maintenance() sets _maintenance_step before each town step (heal, identify,
  buy_consumables, stash_items, repair, resurrect_merc, gamble) for the same coverage
- on_init() logs startup line: char=X | difficulty=Y | routes=[...] each game

Per-run disable (bot runs as long as possible)
- GameStats tracks per-run failure counts across Bot instances (previously reset each game)
- After disable_run_after_failures consecutive failures a run is disabled for the session;
  game-level consecutive-fail counter resets so the bot continues on remaining routes
- game_controller no longer quits on max_consecutive_fails if active routes remain;
  only exits when all routes are disabled

Maintenance timeout (params.ini: max_maintenance_time_s=120)
- Hard 120 s wall on the entire town maintenance loop; checked between each major step
  and before every retry (buy_consumables, stash, repair, resurrect_merc, gamble)
- On timeout: error screenshot + Discord, then trigger end_game → save-and-exit → rejoin

Bug fixes
- Win11 mouse overshoot: mouse_move() uses SetCursorPos + zero-delta MOUSEEVENTF_MOVE
- _curr_loc = True propagation: TownManager.identify() now returns the act Location enum
- DAMAGED KeyError in pickit: added ItemQualityKeyword.Damaged.value to NTIP_ALIAS_QUALITY_MAP
- A4 WP interaction range: force-move character to WP stone before select_by_template
- NPC click blocked by equipped-area guard: open_npc_menu() closes inventory if open

Docs
- Added CLAUDE.md: AI working guide with step tables, bug history, debugging tips

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-06-08 18:44:45 +02:00
alex 5fbac05e4e Stabilize Diablo verification and potion handling 2026-06-07 20:17:04 +02:00
alex 594d633787 Fix D2R window sizing and input targeting 2026-06-07 19:00:15 +02:00
alex 9f45539210 feat: capture missing screen verification evidence 2026-06-07 18:42:43 +02:00
alex 83539ed9c3 fix: require stable screen verification 2026-06-07 18:37:58 +02:00
alex f1d6c6bd1c ci: align validation environment with Windows 11 2026-06-07 18:31:10 +02:00
alex 86e3cccbc9 feat: detect Windows profile for install and input 2026-06-07 18:26:16 +02:00
alex d0ecf3afdc ci: run full Botty validation 2026-06-07 18:19:24 +02:00
alex 8ccdca7946 fix: restore validation suite 2026-06-07 18:17:44 +02:00
alex 7bd9d01023 docs: note Diablo template logging helper 2026-06-07 17:53:37 +02:00
alex 45fa775a2e fix: verify Diablo waypoint recovery 2026-06-07 17:52:55 +02:00
alexandClaude Sonnet 4.6 b781dd56b1 fix: save-and-exit on looping NPC click failure instead of continuing
open_npc_menu timeout reduced 35s → 20s and now saves a screenshot when
it gives up. buy_consumables and stash failures after their retry now
trigger end_game (save & exit) instead of silently continuing with a bad
location, preventing the bot from running the next game in a broken state.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-06-07 16:17:54 +02:00
alexandClaude Sonnet 4.6 fda747a1bf feat: restart bot process instead of killing D2R when stuck
When restart_d2r_when_stuck is enabled, spawn a fresh Python process
(same main.py) and exit immediately rather than killing and relaunching
D2R. The new bot detects D2R is already running and skips launching it,
preserving the game session. D2R is only killed on deliberate exits
(safe_exit) and the initial auto_login launch.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-06-07 16:13:18 +02:00
alexandClaude Sonnet 4.6 5254b7ee75 fix: identify() returned boolean True instead of Location, breaking post-Cain town routing
After using Cain to identify items, self._curr_loc was set to True (boolean)
instead of the actual location. Every subsequent get_act_from_location(True)
returned None, causing buy_consumables and stash to bail immediately and
fall back to A1 even when the character was physically in A5.

Now returns curr_loc when identification succeeds in the current act, or
new_loc (the A5 WP location) when the A5 Cain fallback is used — so the
bot correctly routes to Malah and the A5 stash instead of navigating back
to Akara.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-06-07 16:13:11 +02:00
alexandClaude Opus 4.8 f705091991 Send error message + screenshot to Discord on run failures
Adds Messenger.send_error across the Discord (red embed with screenshot attached)
and generic (text-only) APIs. Bot._save_error_screenshot now also pushes the
failure to the configured messenger after saving the screenshot to disk, so each
approach/battle/exception failure is reviewable in Discord with the visual.

Gated by new config discord_log_errors ([general], default 1) and the
[discord_events] error toggle. Both optional/backward-compatible. Verified wiring
and the suppression path via a stubbed messenger.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-06-07 15:55:41 +02:00
alexandClaude Opus 4.8 8cf152cfb4 Stop bot cleanly when all routes are disabled
When every run has been auto-disabled there are no routes left to run, so save a
session report and shut down via safe_exit() instead of calling restart_or_exit
(which would needlessly restart D2R into empty games when restart_d2r_when_stuck
is enabled).

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-06-07 15:52:22 +02:00
alexandClaude Opus 4.8 af43051b22 Auto-disable runs after repeated failures + save error screenshots
Recovery: each run now has its own consecutive-failure counter. After
disable_run_after_failures (default 5) consecutive failures, that single run is
disabled for the rest of the session and the bot keeps doing the other runs
instead of stopping. A success resets the counter. If every run is disabled the
bot stops for investigation. Disable is in-memory only (restart re-enables).

Diagnostics: on every run failure (approach, battle, or exception) the bot saves
a timestamped screenshot to log/screenshots/error/ named with the run, reason,
and game/run counters so logs and visuals can be cross-referenced. Gated by the
new error_screenshots config (falls back to info_screenshots). The error/ dir is
routed through log rotation.

Adds config keys error_screenshots and disable_run_after_failures (both optional,
backward compatible) and docs/recovery_and_error_logging.md. Verified bot startup,
config parsing, Bot construction, the disable/reset logic, and screenshot writing.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-06-07 15:49:44 +02:00
alexandClaude Sonnet 4.6 a611765e42 Add comprehensive failure logging to all town acts and run approach methods
Every silent return False in a1-a5 town act files (resurrect, heal, identify,
open_wp, open_trade_menu, open_stash, open_trade_and_repair_menu, gamble) now
emits Logger.error with the specific step that failed (traverse, NPC menu open,
button press, panel visibility). Also adds Logger.error to all run approach()
methods (arcane, shenk_eld, trav, andariel, countess, mephisto, baal, pindle,
nihlathak) for open_wp, use_wp, go_to_act, and traverse failures. Fixes a4.py
open_trade_menu to use LeftPanel check instead of unreliable GoldBtnVendor.
town_manager fallback go_to_act calls (resurrect, identify, open_stash, gamble,
stash, heal) now log when they fail.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-06-07 15:44:24 +02:00
alexandClaude Sonnet 4.6 21e63fc423 fix: detect and log WP failures in approach/go_to_act
Problems:
1. use_wp() fired immediately after open_wp() — WP panel animation
   still playing, WaypointTabs template not yet visible → silent fail
2. vizier.py + diablo.py ignored use_wp() return value → approach()
   returned a truthy Location even when the WP was never used, causing
   battle() to run from the wrong map location
3. go_to_act() also ignored use_wp() return value

Fixes:
- waypoint.use_wp(): retry WaypointTabs detection up to 4x (1.6s total)
  before giving up; log each retry + the target WP and act being switched
- vizier/diablo approach(): check use_wp() return, return False on failure
- town_manager.go_to_act(): check use_wp() return, log + return False

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-06-07 15:35:11 +02:00
alexandClaude Sonnet 4.6 02d113ea0c fix: replace GoldBtnVendor check with LeftPanel in open_trade_menu
GoldBtnVendor (small gold coin template in a tight ROI) was failing even
when the vendor window was fully open. Replace with wait_until_visible(
LeftPanel, timeout=3.0) which checks for the panel close-X in the header
— the same reliable check used by wait_for_left_inventory/left_inventory_ready.

Fixes: A5 (Malah) and A1 (Akara) buy_consumables failing every run.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-06-07 10:42:27 +02:00
alexandClaude Sonnet 4.6 17c97a61b1 chore: gitignore runtime price data files
Add auto-generated price files to .gitignore and remove them from
tracking. These are updated at runtime by the price tracker and
should not be versioned.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-06-07 10:38:24 +02:00
alexandClaude Sonnet 4.6 307b021352 fix: 1282px window coords, NPC detection robustness, TP window re-detect
- screen.py: default monitor_roi width 1280 -> 1282 (actual window size)
- diablo.py: re-detect window position before TP in CS run (2 places)
- npc_manager.py: adjust Akara ROI/poses for 1282px; lower NPC name tag
  threshold 0.5->0.35 for more reliable hover detection; add NPCDialogue
  visibility wait + per-threshold debug logging in press_npc_btn
- a1.py: add wait(0.5, 0.8) after trade button before GoldBtnVendor check;
  guard open_trade_and_repair_menu on NPC menu result; add Logger.info
  throughout open_trade_menu, heal, open_trade_and_repair_menu
- a5.py: same wait + logging pattern for Malah open_trade_menu

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-06-07 10:37:35 +02:00
alexandClaude Sonnet 4.6 3410a82895 feat: log Windows version, mouse mode, and OCR backend at startup
Adds _log_platform_info() called from startup_checks(). On each bot
start the log now shows:
  - Windows 10/11 + build number (Win11 = build >= 22000)
  - Mouse input mode: relative (Win11) or absolute (Win10)
  - OCR backend: tesserocr (primary) or pytesseract fallback or ERROR

Win11 (build 26200) confirmed working: mouse in relative mode,
tesserocr 5.2.0 with hover/ground botty models loading correctly.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-06-06 22:14:38 +02:00
alexandClaude Sonnet 4.6 35fa4ba442 merge: town_manager.py — combine debug logging + set_panel_check_paused
Resolved 7 conflicts by keeping both local (Logger.info diagnostics in
buy_consumables and repair) and remote (set_panel_check_paused health-check
suppression during vendor/repair panels). All paths now log + pause correctly.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-06-06 22:07:24 +02:00
alexandClaude Sonnet 4.6 e729dc0c0e fix: 1282px coords, TP window re-detect, town_manager debug logging
- game.ini: adjust ROIs/positions for 1282x720 window (gold_btn_stash,
  left_inventory, panel_header, npc_dialogue, inventory_tabs, skill_bar)
- i_char.py: re-detect window position before casting TP to fix template drift
- town_manager.py: add Logger.info/error throughout buy_consumables and repair
  for easier diagnosis of vendor interaction failures

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-06-06 22:06:00 +02:00
FiskenPoul 7e39119f33 fix: robust cooperative shutdown and stability improvements for Windows 10
- Implementation of centralized cooperative shutdown mechanism (C10) to replace dangerous thread killing.
- Consolidation of all timing signatures through jittered wait() for anti-cheat stealth (C1).
- Enhanced HealthManager reactivity with smart mana potion fallback and premature panel-closing protection.
- Refactored waypoint stealth logic to simulate human-like mis-aim instead of area-breaking misclicks.
- Implementation of stateless 'garbage item' filtering in PickIt to eliminate ghost item loops and OCR artifacts.
- Optimization of inventory management to automatically stash protected items that cannot be sold.
- Suppression of individual game failure notifications on Discord; alerts now trigger on 5+ consecutive fails.
2026-06-06 19:34:06 +02:00
FiskenPoul d69f066da5 fix: robust cooperative shutdown and stability improvements for Windows 10
- Implementation of centralized cooperative shutdown mechanism (C10) to replace dangerous thread killing.
- Consolidation of all timing signatures through jittered wait() for anti-cheat stealth (C1).
- Enhanced HealthManager reactivity with smart mana potion fallback and premature panel-closing protection.
- Refactored waypoint stealth logic to simulate human-like mis-aim instead of area-breaking misclicks.
- Implementation of stateless 'garbage item' filtering in PickIt to eliminate ghost item loops and OCR artifacts.
- Optimization of inventory management to automatically stash protected items that cannot be sold.
- Suppression of individual game failure notifications on Discord; alerts now trigger on 5+ consecutive fails.
2026-06-06 19:32:18 +02:00
alexandClaude Sonnet 4.6 88bd369bd0 merge: resolve params.ini conflict — keep transmute_every_x_game=2000
Alex's value (2000) preserved over FiskenPoul's (200) for transmute cadence.
stash_destination=0,1,2,3 accepted from remote (matches fill_shared_stash_first=0).

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-06-06 18:01:32 +02:00
alexandClaude Sonnet 4.6 dc48a05d61 restore: params.ini to pre-merge (7dcbb52) + common.py/pickit.py fixes
- params.ini: restore Alex's settings (auto_login, webhooks, hotkeys,
  run order, casting_frames, potion thresholds, override_capabilities, etc.)
- common.py: increase wait_for_left_inventory timeout 5s → 10s for stability
- pickit.py: re-detect window position before pickup to fix template drift

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-06-06 18:00:29 +02:00
FiskenPoul 6f4d6880e4 fix: remove duplicate auto_downgrade_threshold in params.ini 2026-06-06 11:29:17 +02:00
FiskenPoul 97f4e55643 fix: comprehensive stability, stealth, and logic improvements
- Stability: Replaced unsafe kill_thread() with cooperative_shutdown() in GraphicDebugger.
- Stealth: Integrated jittered wait() and human-like typing variation in win_input.py.
- Robustness: Switched to absolute paths for template loading and log rotation anchoring.
- Bugfix: Resolved AttributeError: 'ScreenObjects' has no attribute 'MercPanelText'.
- Logic: Implemented thread-safe state in DeathManager and re-indexed PickedUpResult enum.
- Pickup: Added failure blacklisting for unreachable items to prevent infinite loops.
- Stash: Fixed gold stashing to correctly respect fill_shared_stash_first=0 (personal first).
- Config: Updated settings validation to allow common D2R variations (Gamma, VSync, etc.).
2026-06-06 11:24:20 +02:00
alexandClaude Sonnet 4.6 a91e128a1e docs: restore params.ini documentation lost in merge conflict resolution
The FiskenPoul merge (95f520e) resolved conflicts by dropping three comment
blocks that documented Hammerdin-specific tuning guidance:

- Hammerdin difficulty guide near the 'difficulty' setting (Normal/NM/Hell
  gear targets, chicken-rate advice)
- Hammerdin attack-length reference table near atk_len_* values (per-boss
  HP ranges, Conviction interaction, CS seal boss breakdown)
- auto_downgrade_threshold parameter and its description (the feature is
  parsed by config.py but not yet active; restored with a note)

No logic changes — comments and one dormant config key only.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-06-06 09:09:03 +02:00
alex 01a0351530 fix: apply 4 priority reliability fixes from codex analysis
- nihlathak: verify waypoint load with template check, add grayscale fallback for layout detection, guard traverse_nodes_fixed return
- npc_manager: press_npc_btn now returns bool with threshold retry (0.85->0.78) + grayscale fallback
- town/a1,a4,a5: check press_npc_btn return and verify GoldBtnVendor before proceeding
- char/i_char: expand stash waypoint close to A1_TOWN_0, add lower-threshold retry for stash in a1/a5
- char/i_char: add _weapon_switch helper that resets _active_skill cache, fix CTA switch-back validation, fix switch_sucess typo
2026-06-06 01:28:41 +02:00
alex 5ac00d16d0 Add Win10/Win11 auto-detection for mouse input mode
- win_input.py: detect OS build via platform.win32_ver(), use
  MOUSEEVENTF_ABSOLUTE only on Win10 (build < 22000)
- install.bat: detect and display Windows version on install
2026-06-05 22:51:54 +02:00
FiskenPoul 4db549cd85 Track tesserocr_source dependency 2026-06-05 22:36:10 +02:00
FiskenPoul 95f520e968 Resolve merge conflicts, keeping local Win10 specific changes 2026-06-05 21:47:11 +02:00
alex 7dcbb5284b fix: improve potion management by filling belt from inventory and adjusting consumable handling 2026-06-05 21:39:15 +02:00
alexandClaude Sonnet 4.6 dc61367a6e fix: guard fill_up_belt_from_inventory against None img from failed open_inventory
personal.open_inventory() returns None when the inventory cannot be opened
(e.g. after a failed vendor interaction leaves the UI in a bad state). The
previous code passed that None straight into common.get_slot_pos_and_img()
which tried to index it, crashing the bot thread with:
  TypeError: 'NoneType' object is not subscriptable

Also wraps the shift-click loop in try/finally so keyboard.release("shift")
is guaranteed even if an exception fires mid-loop (prevents stuck Shift key).

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-06-05 20:47:11 +02:00
alexandClaude Sonnet 4.6 6c8da72bf4 fix: weapon swap verification, health pot selling, town healing, pickup drought alert
- i_char.py: rewrite _pre_buff_cta() to verify each weapon switch via BC
  skill-bar template; detects wrong slot on game start (leftover from
  interrupted buff cycle), retries failed switches once, logs clearly
  when stuck on CTA slot to prevent dying with wrong weapon in combat

- personal.py: protect needed consumables from sell/drop in inspect_items;
  check get_needs() before marking a pot for discard — if the belt needs
  that pot type, skip it so fill_up_belt_from_inventory can restock later

- bot.py: add fill_up_belt_from_inventory + update_pot_needs after
  buy_consumables so inventory pots reach the belt even when out of gold;
  add town-heal loop at start of on_maintenance to drink health/rejuv pots
  until HP >= 95% before the next run (health manager is paused in town)

- game_stats.py: add rolling 10-game pickup health check; warns in log and
  sends Discord alert when zero item pickups occur across 10 games while
  chickens or merc deaths are present

- params.ini: fix show_belt=n -> show_belt=k (belt key was wrong, causing
  1.5s wasted recovery attempt every first game in a session)

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-06-05 16:36:07 +02:00
alex 77f2092572 Refactor bot behavior on TP failure, enhance item processing logic, and improve game stats logging
- Updated bot behavior to end the game when no TP charges are left, instead of attempting to walk back to town.
- Refined item processing logic in `processing_helpers.py` to use identity checks for item comparisons and improved item removal methods.
- Enhanced game stats logging to include failure reasons and send Discord notifications for failed games.
- Improved health management logic to trigger chicken behavior based on health percentage after rapid rejuvination.
- Added error handling for item pickup failures in `pickit.py` to blacklist items that cannot be picked up.
- Introduced walking fallback nodes for Countess, Andariel, Mephisto, and Baal runs in `pather.py`.
- Implemented path data validation in run scripts for Countess, Andariel, Mephisto, and Baal to ensure paths are correctly defined.
- Enhanced item identification and stash processes in `diablo.py` with retry logic for failures.
- Updated town management to handle identification failures gracefully and log appropriate warnings.
- Improved character selection logic to provide clearer logging messages.
- Modified game restart logic to launch the game via PowerShell for better session handling.
- Added documentation for recording paths for the Countess run and created a PowerShell script for scheduled task management.
2026-06-05 14:58:50 +02:00
alex 6d42216fd1 fix: add missing mouse.right-click after _select_skill for CTA buffs 2026-06-04 20:43:20 +02:00
alex d1502a008a fix: guard on_maintenance against _curr_loc=False crash 2026-06-04 20:41:19 +02:00