From 2c53524e79bf8b00eb69d177fda2e75874ca17ea Mon Sep 17 00:00:00 2001 From: aeon0 Date: Sat, 11 Dec 2021 12:38:46 +0100 Subject: [PATCH] Set misc_gold=0 in case stash is full of gold (#260) * Set misc_gold=0 in case stash is full of gold * fix config * fix imports --- src/bot.py | 5 +++-- src/char/__init__.py | 2 -- src/item/item_finder.py | 14 ++++++++------ src/item/pickit.py | 2 +- src/town/town_manager.py | 4 ++-- src/ui/ui_manager.py | 11 ++++++----- src/utils/graphic_debugger.py | 2 +- 7 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/bot.py b/src/bot.py index b5474bf..5a8b8d0 100644 --- a/src/bot.py +++ b/src/bot.py @@ -21,7 +21,8 @@ from pather import Pather, Location from npc_manager import NpcManager from health_manager import HealthManager from death_manager import DeathManager -from char import Sorceress, Hammerdin +from char.sorceress import Sorceress +from char.hammerdin import Hammerdin from run import Pindle, ShenkEld, Trav from town import TownManager, A3, A4, A5 @@ -32,7 +33,7 @@ class Bot: self._game_stats = game_stats self._config = Config() self._template_finder = TemplateFinder(self._screen) - self._item_finder = ItemFinder() + self._item_finder = ItemFinder(self._config) self._ui_manager = UiManager(self._screen, self._template_finder) self._belt_manager = BeltManager(self._screen, self._template_finder) self._pather = Pather(self._screen, self._template_finder) diff --git a/src/char/__init__.py b/src/char/__init__.py index 2a9f6ef..6caa67d 100644 --- a/src/char/__init__.py +++ b/src/char/__init__.py @@ -1,3 +1 @@ from .i_char import IChar -from .hammerdin import Hammerdin -from .sorceress import Sorceress diff --git a/src/item/item_finder.py b/src/item/item_finder.py index a861d6f..1a603f0 100644 --- a/src/item/item_finder.py +++ b/src/item/item_finder.py @@ -25,8 +25,7 @@ class Item: roi: List[int] = None class ItemFinder: - def __init__(self): - config = Config() + def __init__(self, config: Config): self._item_cropper = ItemCropper() # color range for each type of item # hsv ranges in opencv h: [0-180], s: [0-255], v: [0, 255] @@ -40,10 +39,10 @@ class ItemFinder: "runes": [np.array([21, 251, 190]), np.array([22, 255, 255])] } + self._items_to_pick = config.items self._folder_name = "items" self._min_score = 0.86 # load all templates - self._config = config self._templates = {} for filename in os.listdir(f'assets/{self._folder_name}'): filename = filename.lower() @@ -53,7 +52,7 @@ class ItemFinder: blacklist_item = item_name.startswith("bl__") # these items will be searched for regardless of pickit setting (e.g. for runes to avoid mixup) force_search = item_name.startswith("rune_") - if blacklist_item or ((item_name in config.items and self._config.items[item_name]) or force_search): + if blacklist_item or ((item_name in config.items and config.items[item_name]) or force_search): data = cv2.imread(f"assets/{self._folder_name}/" + filename) filtered_template = np.zeros(data.shape, np.uint8) for key in self._template_color_ranges: @@ -69,6 +68,9 @@ class ItemFinder: template.blacklist = True self._templates[item_name] = template + def update_items_to_pick(self, config: Config): + self._items_to_pick = config.items + def search(self, inp_img: np.ndarray) -> List[Item]: img = inp_img[:,:,:] start = time.time() @@ -118,7 +120,7 @@ class ItemFinder: item.roi = [max_loc[0] + x, max_loc[1] + y, template.data.shape[1], template.data.shape[0]] center_abs = (item.center[0] - (inp_img.shape[1] // 2), item.center[1] - (inp_img.shape[0] // 2)) item.dist = math.dist(center_abs, (0, 0)) - if item is not None and self._config.items[item.name]: + if item is not None and self._items_to_pick[item.name]: item_list.append(item) elapsed = time.time() - start # print(f"Item Search: {elapsed}") @@ -131,7 +133,7 @@ if __name__ == "__main__": from config import Config config = Config() screen = Screen(config.general["monitor"]) - item_finder = ItemFinder() + item_finder = ItemFinder(config) while 1: # img = cv2.imread("") img = screen.grab().copy() diff --git a/src/item/pickit.py b/src/item/pickit.py index 1953974..c2a4dd3 100644 --- a/src/item/pickit.py +++ b/src/item/pickit.py @@ -167,7 +167,7 @@ if __name__ == "__main__": belt_manager = BeltManager(screen, t_finder) belt_manager._pot_needs = {"rejuv": 0, "health": 2, "mana": 2} pather = Pather(screen, t_finder) - item_finder = ItemFinder() + item_finder = ItemFinder(config) char = Hammerdin(config.hammerdin, config.char, screen, t_finder, ui_manager, pather) pickit = PickIt(screen, item_finder, ui_manager, belt_manager, game_states) print(pickit.pick_up_items(char)) diff --git a/src/town/town_manager.py b/src/town/town_manager.py index 956137c..1c3b882 100644 --- a/src/town/town_manager.py +++ b/src/town/town_manager.py @@ -11,10 +11,10 @@ from utils.misc import wait class TownManager: def __init__(self, template_finder: TemplateFinder, ui_manager: UiManager, a3: A3, a4: A4, a5: A5): + self._config = Config() self._template_finder = template_finder self._ui_manager = ui_manager - self._item_finder = ItemFinder() - self._config = Config() + self._item_finder = ItemFinder(self._config) self._acts: dict[Location, IAct] = { Location.A3_TOWN_START: a3, Location.A4_TOWN_START: a4, diff --git a/src/ui/ui_manager.py b/src/ui/ui_manager.py index 119d239..271fa81 100644 --- a/src/ui/ui_manager.py +++ b/src/ui/ui_manager.py @@ -323,11 +323,12 @@ class UiManager(): if self._curr_stash["gold"] > 3: inventory_full_gold = self._template_finder.search("INVENTORY_FULL_GOLD", self._screen.grab(), roi=self._config.ui_roi["inventory_gold"], threshold=0.98) if inventory_full_gold.valid: - # TODO: Instead of quiting turn of gold pickup in pickit or itemfinder - Logger.error("All stash tabs and character are full of gold, quitting") + msg = "All stash tabs and character are full of gold, turn of gold pickup" + Logger.info(msg) if self._config.general["custom_discord_hook"]: - send_discord(f"{self._config.general['name']} all stash is full of gold, quitting", self._config.general["custom_discord_hook"]) - os._exit(1) + send_discord(f"{self._config.general['name']}: {msg}", self._config.general["custom_discord_hook"]) + self._config.items["misc_gold"] = 0 + item_finder.update_items_to_pick(self._config) else: Logger.info("All tabs are full but character is not. Continuing.") self._curr_stash["gold"] = 3 @@ -532,6 +533,6 @@ if __name__ == "__main__": config = Config() screen = Screen(config.general["monitor"]) template_finder = TemplateFinder(screen) - item_finder = ItemFinder() + item_finder = ItemFinder(config) ui_manager = UiManager(screen, template_finder) ui_manager.stash_all_items(1, item_finder) diff --git a/src/utils/graphic_debugger.py b/src/utils/graphic_debugger.py index 3e875da..2560edd 100644 --- a/src/utils/graphic_debugger.py +++ b/src/utils/graphic_debugger.py @@ -10,7 +10,7 @@ from template_finder import TemplateFinder def run_graphic_debugger(): config = Config() screen = Screen(config.general["monitor"]) - item_finder = ItemFinder() + item_finder = ItemFinder(config) template_finder = TemplateFinder(screen) search_templates = ["A5_TOWN_0", "A5_TOWN_1", "A5_TOWN_2", "A5_TOWN_3"] while 1: