From 6f6c663b439211c1b6efab7be768b9dd09cc5382 Mon Sep 17 00:00:00 2001 From: Randi Date: Tue, 24 Mar 2026 22:51:06 -0400 Subject: [PATCH] Added eldritch routine to firelock. Also made minor adjustments to a3 error finding stash to reduce error rate. --- assets/templates/a3_stash_left.png | Bin 5168 -> 0 bytes assets/templates/a3_stash_right.png | Bin 2981 -> 3011 bytes src/bot.py | 8 ++++---- src/char/warlock/fire_lock.py | 19 +++++++++++++++++++ src/char/warlock/warlock.py | 23 +++++++++++------------ src/town/a3.py | 6 +++--- 6 files changed, 37 insertions(+), 19 deletions(-) delete mode 100644 assets/templates/a3_stash_left.png diff --git a/assets/templates/a3_stash_left.png b/assets/templates/a3_stash_left.png deleted file mode 100644 index f354aa492114717840a95ef33ad7de0214d082ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5168 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 diff --git a/assets/templates/a3_stash_right.png b/assets/templates/a3_stash_right.png index a00b65f86854fbdfa57b705ca46196ee1c4fb3ab..a8537b0e5176e35fccbcaab940e0f26632cb5ffd 100644 GIT binary patch delta 2549 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 diff --git a/src/bot.py b/src/bot.py index d25c9a7..c55812f 100644 --- a/src/bot.py +++ b/src/bot.py @@ -68,13 +68,13 @@ class Bot: case "hammerdin" | "paladin": self._char: IChar = Hammerdin(Config().hammerdin, self._pather, self._pickit) #pickit added for diablo case "fohdin": - self._char: IChar = FoHdin(Config().fohdin, self._pather, self._pickit) #pickit added for diablo + self._char: IChar = FoHdin(Config().fohdin, self._pather) case "abyss_lock" | "warlock": - self._char: IChar = AbyssLock(Config().abyss_lock, self._pather, self._pickit) + self._char: IChar = AbyssLock(Config().abyss_lock, self._pather) case "fire_lock": - self._char: IChar = FireLock(Config().fire_lock, self._pather, self._pickit) + self._char: IChar = FireLock(Config().fire_lock, self._pather) case "echo_lock": - self._char: IChar = EchoLock(Config().echo_lock, self._pather, self._pickit) + self._char: IChar = EchoLock(Config().echo_lock, self._pather) case "amazon" | "javazon": self._char: IChar = Javazon(Config().javazon, self._pather) case "trapsin": diff --git a/src/char/warlock/fire_lock.py b/src/char/warlock/fire_lock.py index 1a05d2a..abde8cd 100644 --- a/src/char/warlock/fire_lock.py +++ b/src/char/warlock/fire_lock.py @@ -101,6 +101,25 @@ class FireLock(Warlock): self._pather.traverse_nodes((Location.A5_PINDLE_SAFE_DIST, Location.A5_PINDLE_END), self, timeout=1.0, do_pre_move=False) return True + def kill_eldritch(self) -> bool: + if self.capabilities.can_teleport_natively: + self._pather.traverse_nodes_fixed([(675, 30)], self) + start = time.time() + self._cast_ring_of_fire() + self._cast_deathmark_combo((0,-10)) + while (time.time() - start) < Config().char["atk_len_eldritch"]: + self._cast_chaos_combo((0, -10)) + else: + eldritch_pos_abs = convert_screen_to_abs(Config().path["eldritch_end"][0]) + cast_pos_abs = [eldritch_pos_abs[0] * 0.80, eldritch_pos_abs[1] * 0.80] + start = time.time() + self._cast_deathmark_combo(cast_pos_abs) + while (time.time() - start) < Config().char["atk_len_eldritch"]: + self._cast_chaos_combo(cast_pos_abs) + x_m, y_m = convert_abs_to_monitor([eldritch_pos_abs[0], eldritch_pos_abs[1]]) + self.move((x_m, y_m), force_move=True) + return True + def kill_council(self) -> bool: self._cast_ring_of_fire() self._cast_deathmark_combo((-325, -180)) diff --git a/src/char/warlock/warlock.py b/src/char/warlock/warlock.py index 0b2868d..e3f11f7 100644 --- a/src/char/warlock/warlock.py +++ b/src/char/warlock/warlock.py @@ -10,14 +10,11 @@ from config import Config from utils.misc import wait from screen import convert_abs_to_screen, convert_abs_to_monitor from pather import Pather, Location -#import cv2 #for Diablo -from item.pickit import PickIt #for Diablo class Warlock(IChar): - def __init__(self, skill_hotkeys: dict, pather: Pather, pickit: PickIt): + def __init__(self, skill_hotkeys: dict, pather: Pather): super().__init__(skill_hotkeys) self._pather = pather - self._pickit = pickit self._picked_up_items = False self._last_click_cast = 0 self._action_frame = 9 @@ -36,14 +33,21 @@ class Warlock(IChar): wait(0.04) mouse.click(button="right") wait(casting_delay) + if self._skill_hotkeys["summon_demon_2"]: + keyboard.send(self._skill_hotkeys["summon_demon_2"]) + wait(0.04) + mouse.click(button="right") + wait(self._cast_duration) def cast_town_buffs(self, curr_loc: Location): #Determine where to move mouse for summoning/consume based on location. cast_pos_monitor = None if curr_loc == Location.A3_TOWN_START: - cast_pos_monitor = convert_abs_to_monitor((260,120)) + cast_pos_monitor = convert_abs_to_monitor((500,170)) + elif curr_loc == Location.A4_TOWN_START: + cast_pos_monitor = convert_abs_to_monitor((500,170)) elif curr_loc == Location.A5_TOWN_START: - cast_pos_monitor = convert_abs_to_monitor((-340,-60)) + cast_pos_monitor = convert_abs_to_monitor((-450,-60)) else: Logger.warning(f"Unimplemented town location {curr_loc} and skipping town buffs") return @@ -60,12 +64,7 @@ class Warlock(IChar): wait(0.08) #extra wait to ensure summon is active mouse.click(button="right") wait(self._cast_duration) - if self._skill_hotkeys["summon_demon_2"]: - keyboard.send(self._skill_hotkeys["summon_demon_2"]) - wait(0.04) - mouse.click(button="right") - wait(self._cast_duration) - + def _cast_deathmark(self, cast_pos_abs: tuple[float, float]): if self._skill_hotkeys["deathmark"]: keyboard.send(self._skill_hotkeys["deathmark"]) diff --git a/src/town/a3.py b/src/town/a3.py index bfaf42e..e011618 100644 --- a/src/town/a3.py +++ b/src/town/a3.py @@ -43,14 +43,14 @@ class A3(IAct): found = is_visible(ScreenObjects.GoldBtnInventory, img) found |= is_visible(ScreenObjects.GoldBtnStash, img) return found - if not self._char.select_by_template(["A3_STASH_LEFT","A3_STASH_RIGHT"], stash_is_open_func, timeout=4.0, telekinesis=True): + if not self._char.select_by_template(["A3_STASH","A3_STASH_RIGHT"], stash_is_open_func, timeout=4.0, telekinesis=True): Logger.warning("Failed to find A3 stash. Could be blocked by merc, moving down.") - mon_pos = convert_abs_to_monitor((0,100)) + mon_pos = convert_abs_to_monitor((50,150)) mouse.move(*mon_pos) wait(0.08) mouse.click("left") wait(1) #Wait to move to new position - if not self._char.select_by_template(["A3_STASH_LEFT","A3_STASH_RIGHT"], stash_is_open_func, timeout=4.0, telekinesis=True): + if not self._char.select_by_template(["A3_STASH","A3_STASH_RIGHT"], stash_is_open_func, timeout=4.0, telekinesis=True): Logger.warning("Failed to find A3 stash after move.") return False return Location.A3_STASH_WP