From fa9f7b2f3eba4e260b011c5cd3aae144b4b6fc0d Mon Sep 17 00:00:00 2001 From: Mitchell Gleed Date: Thu, 11 Nov 2021 17:51:52 -0500 Subject: [PATCH] Add merc_chicken param and add highlighted variation of save&exit button (#11) * typo fix * add merc chicken param, add highlighted save/exit button * update readme * remove files from other branch * remove debug images, adjust gitignore * fixed requested changes, revert 1 old logger change --- .gitignore | 1 + README.md | 3 +- assets/templates/save_and_exit.png | Bin 9286 -> 0 bytes assets/templates/save_and_exit_highlight.png | Bin 0 -> 10381 bytes .../templates/save_and_exit_no_highlight.png | Bin 0 -> 10510 bytes params.ini | 1 + src/config.py | 1 + src/health_manager.py | 29 +++++++++++------- src/pickit.py | 4 +-- src/template_finder.py | 13 ++++++-- src/ui_manager.py | 3 +- 11 files changed, 36 insertions(+), 19 deletions(-) delete mode 100644 assets/templates/save_and_exit.png create mode 100644 assets/templates/save_and_exit_highlight.png create mode 100644 assets/templates/save_and_exit_no_highlight.png diff --git a/.gitignore b/.gitignore index afe293f..4a8292e 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ run.onefile-build/ generated/ botty_v*/ custom.ini +*info_*.png diff --git a/README.md b/README.md index 79c2784..41ad3ca 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,8 @@ num_loot_columns | Number of columns in inventory used for loot (from left!). Re take_health_potion | Health percentage when healing potion will be used take_mana_potion | Mana percentage when mana potion will be used. Currently belt managment is not very clever and it is safest to only pick up health pots and make sure mana reg is enough for pindle to not need mana pots. heal_merc | Merc health percentage when giving healing potion to merc -chicken | Health percentage when chicken (leaving game) +chicken | Will chicken (leave game) when player health percentage drops below set value, range 0 to 1. Set to 0 to not chicken. +merc_chicken | Will chicken (leave game) when merc health percentage drops below set value, range 0 to 1. Set to 0 to not chicken. show_items | Hotkey for "show items" inventory_screen | Hotkey to open up inventory stand_still | Hotkey for "stand still". Note this can not be the default shift key as it would interfere with the merc healing routine. diff --git a/assets/templates/save_and_exit.png b/assets/templates/save_and_exit.png deleted file mode 100644 index e68792c37ffccb527425ee180660eb5eff248164..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9286 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 Q761SM07*qoM6N<$f{V2EN&o-= literal 0 HcmV?d00001 diff --git a/params.ini b/params.ini index 50c7a91..6ccce44 100644 --- a/params.ini +++ b/params.ini @@ -29,6 +29,7 @@ take_health_potion=0.8 take_mana_potion=0.6 heal_merc=0.5 chicken=0.2 +merc_chicken=0 show_items=alt inventory_screen=i ; note: stand_still can not be the default "shift" as it would interfere with merc healing diff --git a/src/config.py b/src/config.py index 76be933..dfdb479 100644 --- a/src/config.py +++ b/src/config.py @@ -48,6 +48,7 @@ class Config: "take_mana_potion": float(self._select_val("char", "take_mana_potion")), "heal_merc": float(self._select_val("char", "heal_merc")), "chicken": float(self._select_val("char", "chicken")), + "merc_chicken": float(self._select_val("char", "merc_chicken")), "tp": self._select_val("char", "tp"), "show_belt": self._select_val("char", "show_belt"), "potion1": self._select_val("char", "potion1"), diff --git a/src/health_manager.py b/src/health_manager.py index 10d3e01..348ebfa 100644 --- a/src/health_manager.py +++ b/src/health_manager.py @@ -77,6 +77,17 @@ class HealthManager: merc_health_percentage = (float(np.sum(health_tresh)) / health_tresh.size) * (1/255.0) return merc_health_percentage + def _do_chicken(self, img, run_thread): + cv2.imwrite("info_debug_chicken.png", img) + # clean up key presses that might be pressed in the run_thread + keyboard.release(self._config.char["stand_still"]) + keyboard.release(self._config.char["show_items"]) + time.sleep(0.01) + self._ui_manager.save_and_exit() + self._did_chicken = True + kill_thread(run_thread) + self._do_monitor = False + def start_monitor(self, run_thread: Thread): Logger.debug("Start health monitoring") self._do_monitor = True @@ -95,16 +106,8 @@ class HealthManager: self._last_health = time.time() # give the chicken a 4 sec delay to give time for a healing pot and avoid endless loop of chicken elif health_percentage < self._config.char["chicken"] and (time.time() - start) > 4: - Logger.warning("Trying to chicken!") - cv2.imwrite("info_debug_chicken.png", img) - # clean up key presses that might be pressed in the run_thread - keyboard.release(self._config.char["stand_still"]) - keyboard.release(self._config.char["show_items"]) - time.sleep(0.01) - self._ui_manager.save_and_exit() - self._did_chicken = True - kill_thread(run_thread) - self._do_monitor = False + Logger.warning(f"Trying to chicken, player HP {(health_percentage*100):.1f}%!") + self._do_chicken(img, run_thread) break # check mana mana_percentage = self.get_mana(img) @@ -117,7 +120,11 @@ class HealthManager: if merc_alive: merc_health_percentage = self.get_merc_health(img) last_drink = time.time() - self._last_merc_healh - if merc_health_percentage < self._config.char["heal_merc"] and last_drink > 5.0: + if merc_health_percentage < self._config.char["merc_chicken"]: + Logger.warning(f"Trying to chicken, merc HP {(merc_health_percentage*100):.1f}%!") + self._do_chicken(img, run_thread) + break + elif merc_health_percentage < self._config.char["heal_merc"] and last_drink > 5.0: self._drink_poition(img, "health", merc=True) self._last_merc_healh = time.time() Logger.debug("Stop health monitoring") diff --git a/src/pickit.py b/src/pickit.py index 52f662f..6d12554 100644 --- a/src/pickit.py +++ b/src/pickit.py @@ -50,9 +50,7 @@ class PickIt: # no need to stash potions, scrolls, or gold if (("potion" not in closest_item.name) and ("tp_scroll" != closest_item.name) and ("misc_gold" not in closest_item.name)): found_items = True - Logger.info(f"** Looted {closest_item.name}") - else: - Logger.info(f"Picking up {closest_item.name}") + Logger.info(f"Picking up {closest_item.name}") mouse.move(x_m, y_m) time.sleep(0.1) mouse.click(button="left") diff --git a/src/template_finder.py b/src/template_finder.py index f9cf8ec..43258f0 100644 --- a/src/template_finder.py +++ b/src/template_finder.py @@ -80,7 +80,8 @@ class TemplateFinder: "PLAY_BTN": [load_template("assets/templates/play_btn.png", 1.0), 1.0], "PLAY_BTN_GRAY": [load_template("assets/templates/play_btn_gray.png", 1.0), 1.0], "HELL_BTN": [load_template("assets/templates/hell_btn.png", 1.0), 1.0], - "SAVE_AND_EXIT": [load_template("assets/templates/save_and_exit.png", 1.0), 1.0], + "SAVE_AND_EXIT_NO_HIGHLIGHT": [load_template("assets/templates/save_and_exit_no_highlight.png", 1.0), 1.0], + "SAVE_AND_EXIT_HIGHLIGHT": [load_template("assets/templates/save_and_exit_highlight.png", 1.0), 1.0], "SERVER_ISSUES": [load_template("assets/templates/server_issues.png", 1.0), 1.0], "WAYPOINT_MENU": [load_template("assets/templates/waypoint_menu.png", 1.0), 1.0], "MERC": [load_template("assets/templates/merc.png", 1.0), 1.0], @@ -161,7 +162,7 @@ class TemplateFinder: return True, ref_point return False, None - def search_and_wait(self, ref: str, roi: List[float] = None, time_out: float = None, threshold: float = 0.7) -> Tuple[bool, Tuple[float, float]]: + def search_and_wait(self, ref: Union[str, List[str]], roi: List[float] = None, time_out: float = None, threshold: float = 0.7) -> Tuple[bool, Tuple[float, float]]: """ Helper function that will loop and keep searching for a template :param ref: Key of template which has been loaded beforehand @@ -173,7 +174,13 @@ class TemplateFinder: while 1: img = self._screen.grab() is_loading_black_roi = np.average(img[:, 0:self._config.ui_roi["loading_left_black"][2]]) < 1.0 - success, pos = self.search(ref, img, roi=roi, threshold=threshold) + + if type(ref) is str: + ref = [ref] + for x in ref: + success, pos = self.search(x, img, roi=roi, threshold=threshold) + if success: + break if not is_loading_black_roi and success: return True, pos if time_out is not None and (time.time() - start) > time_out: diff --git a/src/ui_manager.py b/src/ui_manager.py index f985595..becf46f 100644 --- a/src/ui_manager.py +++ b/src/ui_manager.py @@ -136,13 +136,14 @@ class UiManager(): keyboard.send("esc") wait(0.1) exit_btn_pos = (self._config.ui_pos["save_and_exit_x"], self._config.ui_pos["save_and_exit_y"]) - found, _ = self._template_finder.search_and_wait("SAVE_AND_EXIT", roi=self._config.ui_roi["save_and_exit"], time_out=7) + found, _ = self._template_finder.search_and_wait(["SAVE_AND_EXIT_NO_HIGHLIGHT","SAVE_AND_EXIT_HIGHLIGHT"], roi=self._config.ui_roi["save_and_exit"], time_out=7) if found: x_m, y_m = self._screen.convert_screen_to_monitor(exit_btn_pos) mouse.move(x_m, y_m, randomize=12) wait(0.1) mouse.click(button="left") return True + return False def start_hell_game(self) -> bool: