From 36d3c2e9131b8f4ba011c19e8bedc52c97200b7b Mon Sep 17 00:00:00 2001 From: RB-Development <35841825+RB-Development@users.noreply.github.com> Date: Fri, 4 Feb 2022 20:12:56 +0100 Subject: [PATCH] Gambling by @RB-Development (#445) This branch will detect if stash is full of gold. Afterwards the gambling functionality (currently only in act 4 implemented) will be called. The bot will gamble for specific items (determined in params.ini) until no gold is left. He will check for properties specified in pickit.ini and sell not matching items. Supported items are: ring, amulet, circlet, coronet, talon Leverages recent advanced pickit PR. --- README.md | 1 + assets/gamble/amulet.png | Bin 0 -> 3396 bytes assets/gamble/circlet.png | Bin 0 -> 11823 bytes assets/gamble/coronet.png | Bin 0 -> 12125 bytes assets/gamble/no_gold.png | Bin 0 -> 1039 bytes assets/gamble/refresh.png | Bin 0 -> 2215 bytes assets/gamble/refresh_text.png | Bin 0 -> 1259 bytes assets/gamble/ring.png | Bin 0 -> 2948 bytes assets/gamble/talon.png | Bin 0 -> 8266 bytes assets/npc/action_btn/gamble.png | Bin 0 -> 1241 bytes assets/npc/action_btn/gamble_blue.png | Bin 0 -> 1320 bytes config/params.ini | 2 + src/bot.py | 13 ++ src/config.py | 3 +- src/gamble.py | 0 src/npc_manager.py | 4 + src/template_finder.py | 7 +- src/town/a4.py | 8 ++ src/town/i_act.py | 2 + src/town/town_manager.py | 14 +- src/ui/ui_manager.py | 179 ++++++++++++++++++++------ 21 files changed, 186 insertions(+), 47 deletions(-) create mode 100644 assets/gamble/amulet.png create mode 100644 assets/gamble/circlet.png create mode 100644 assets/gamble/coronet.png create mode 100644 assets/gamble/no_gold.png create mode 100644 assets/gamble/refresh.png create mode 100644 assets/gamble/refresh_text.png create mode 100644 assets/gamble/ring.png create mode 100644 assets/gamble/talon.png create mode 100644 assets/npc/action_btn/gamble.png create mode 100644 assets/npc/action_btn/gamble_blue.png create mode 100644 src/gamble.py diff --git a/README.md b/README.md index ad1b6b8..3280fd2 100644 --- a/README.md +++ b/README.md @@ -127,6 +127,7 @@ run_shenk=0 | id_items | Will identify items at cain before stashing them. Cain must be rescued for this to work.| | open_chests | Open up chests in some places. E.g. on dead ends of arcane. Note: currently bad runtime. | | fill_shared_stash_first | Fill stash tabs starting from right to left, filling personal stash last | +| gamble_items | List of items to gamble when stash fills with gold. Leave blank to disable. Supported items currently include circlet, ring, coronet, talon, amulet ### Builds | [sorceress] | Descriptions | diff --git a/assets/gamble/amulet.png b/assets/gamble/amulet.png new file mode 100644 index 0000000000000000000000000000000000000000..af5dc69aee52ef6a0db9da562b40886ebd88820d GIT binary patch literal 3396 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 literal 0 HcmV?d00001 diff --git a/assets/gamble/no_gold.png b/assets/gamble/no_gold.png new file mode 100644 index 0000000000000000000000000000000000000000..600666d04d5a09e99090b4c92fa2127fafd4ab50 GIT binary patch literal 1039 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'?ew=2GD3oPCb6a znacFE!hNih$^i3lsd#vJ*mkz1t+nN5e;;l)`+Hln&Dh@F-q=XlQ`!f#-quilU}Iw= z67sSwO(3{_t=nj!(<{rRBFBAKQ33!OGjogYxt$t)DjC<7=<3WtuZHb6Z(h&N{!aan zQ^erUr&n_7mLwQO&)1W-lsU(QO`tIF-W1}Pd zm!Q`i@`D2_D=VChhJ$b4{@c~rVX7|VNet~c&ef`bRhhAHTqz>q(3P$(vt_I<685MZ zsPH$FP65TS19cG}VN|JUbtxX^Kc7GU^_QQ~=HbI1{(A8OSgO7idKREBX!NRl!A-PO zeFCfmH0V)XeQG&}29*S6tgWu%!+)w#<(CteX&K(^c#iAj=MMEA%(ti14)y>j^8_E?68olR0=0tm? zv^dsY@zlnjq5R^B>(AA7?8O zkI}CjztQuhEA1NgxO-w^+^Ri8ixBI{)YQGny9PRdXahy))L5@pjbLPhm!~|eDo2rV ztxPI`L%Jae8Zd!=bfgSun1hCxg9EB^$Og+ z=Q`TiG6~U{QEww%8|cib4IYR7zTV1LKQ>pCiY{L)nP}=BC4l@lY)^l^S;h<~KBjn6X z1rQ7_x_|#W3KAwbsI*Jlpg%o$%He#1{$!ACVOt*n{88Pt^Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D01|XXSaefwW^{L9 za%BKVa%E+1b7*gLUR4MM000D^NklsP{~$OEik%VBNogv1eoSc)PA$uTCli1L020R>GWK@p&ae*lRl1zkEoDUyOefC3?e z5JCvS@614yCeqRD+?g|HzVn@L&i3di&{3#W7&D3mDh%>OB__%eWprrcC^agxx>g-Y zjZWf7%qSKaGs{HFJdW@*#8Dw5aX5>`iuhtNV^~trF25^oIx+r~MbFoq$t(HfxUHg4%@}wiagfW?DEpNT^$i}u> z9^v}&(ZfQ7D=gLHc8=Rv3+pO^UB<*{&<{4AXDdr;St`b74<*>zdc3^!32L!AKmb}r z!$U7P(4rO_hk4q^u}*uLv9~hBBB7laB)v}i7$7Xt(qWPHPpvN_s{0Q*Z~-IQ5P6^zWlT0S_##`Vg+;+;vL5nasmSVl zhozE}3WSOzq+X7aQ)^!xUHmvp^pPVsPoMtUi`YRAj6h!nI&Q4^B#G(O?4irtNuLSO zaqxEj{14!O1z$bT!vgDJuqz4>7$y&o9GZKim`~fqi$C>LE91-(TLh&YeYKX~IC$Va zCkccR_SagsZvCCw+-RPJMH`L!Gz0@WmB*kaCLDA_iGv~&=p?}Wf7aJriCmQ;5zK`P zKT`35`po+JH>)e3ISQjNC}FME3di|y)XFJXG_k7nwq|DDayYAr?dACH-ScQ&aq+&{ z^e3jH)zy{H zn|l`9t=FjI!2{bO02NJ7ow|DUx8BNdrKp$le#UBL=*pE}XJ^-4twXMy>b%Y?rve}= za?yH`*S(zZgmv;au7*t76U$p$kBpAv6JIx>6+*5&o&X>DQt!*{nH^Ze&uc_007lhuk|v9fXxR=7L0 zabjUecVE3DEl9f-sr6F#E)dJbAS6vqo^T>L0m?k9GpFDA?nVUO9L^xXNMP>et67rK z{<6fRNlYc%4*Jt(;!OT?)H9l+6x97ePz64HPnExkSOo1`mFP#5Eybmm(};?cE2S;? zN9KLJF^6&~H#(tl$q@xUcqIWLLQ5#&f-NhZJ54O4jE~Lv?&M-(T+XlL+*j-5*#Pa5 efPhSszJCEpL1@y2S+WrT0000 bool: return True def can_buy_pots(self) -> bool: return True def can_identify(self) -> bool: return True + def can_gamble(self) -> bool: return True def can_heal(self) -> bool: return True def can_stash(self) -> bool: return True def can_trade_and_repair(self) -> bool: return True @@ -53,6 +54,13 @@ class A4(IAct): self._npc_manager.press_npc_btn(Npc.CAIN, "identify") return Location.A4_TYRAEL_STASH return False + + def gamble (self, curr_loc: Location) -> Union[Location, bool]: + if not self._pather.traverse_nodes((curr_loc, Location.A4_JAMELLA), self._char, force_move=True): return False + if self._npc_manager.open_npc_menu(Npc.JAMELLA): + self._npc_manager.press_npc_btn(Npc.JAMELLA, "gamble") + return Location.A4_JAMELLA + return False def open_trade_menu(self, curr_loc: Location) -> Union[Location, bool]: if not self._pather.traverse_nodes((curr_loc, Location.A4_JAMELLA), self._char, force_move=True): return False diff --git a/src/town/i_act.py b/src/town/i_act.py index 0153cb5..fed5b8a 100644 --- a/src/town/i_act.py +++ b/src/town/i_act.py @@ -22,6 +22,7 @@ class IAct: def can_trade_and_repair(self) -> bool: return False # Is merc resurrection implemented for this Town? def can_identify(self) -> bool: return False + def can_gamble (self) -> bool: return False # If any of the above functions return True for the Town, the respective method must be implemented def open_trade_menu(self, curr_loc: Location) -> Union[Location, bool]: return False def heal(self, curr_loc: Location) -> Union[Location, bool]: return False @@ -29,3 +30,4 @@ class IAct: def open_stash(self, curr_loc: Location) -> Union[Location, bool]: return False def open_trade_and_repair_menu(self, curr_loc: Location) -> Union[Location, bool]: return False def identify(self, curr_loc: Location) -> Union[Location, bool]: return False + def gamble (self, curr_loc: Location) -> Union[Location, bool]: return False diff --git a/src/town/town_manager.py b/src/town/town_manager.py index 25f9e6c..1279748 100644 --- a/src/town/town_manager.py +++ b/src/town/town_manager.py @@ -125,8 +125,18 @@ class TownManager: new_loc = self.go_to_act(5, curr_loc) if not new_loc: return False return self._acts[Location.A5_TOWN_START].identify(new_loc) + + def gamble (self, curr_loc: Location) -> Union[Location, bool]: + curr_act = TownManager.get_act_from_location(curr_loc) + if curr_act is None: return False + # check if we can Identify in current act + if self._acts[curr_act].can_gamble(): + return self._acts[curr_act].gamble(curr_loc) + new_loc = self.go_to_act(4, curr_loc) + if not new_loc: return False + return self._acts[Location.A4_TOWN_START].gamble(new_loc) - def stash(self, curr_loc: Location) -> Union[Location, bool]: + def stash(self, curr_loc: Location, gamble=False) -> Union[Location, bool]: curr_act = TownManager.get_act_from_location(curr_loc) if curr_act is None: return False # check if we can stash in current act @@ -134,7 +144,7 @@ class TownManager: new_loc = self._acts[curr_act].open_stash(curr_loc) if not new_loc: return False wait(1.0) - self._ui_manager.stash_all_items(self._config.char["num_loot_columns"], self._item_finder) + self._ui_manager.stash_all_items(self._config.char["num_loot_columns"], self._item_finder, gamble) return new_loc new_loc = self.go_to_act(5, curr_loc) if not new_loc: return False diff --git a/src/ui/ui_manager.py b/src/ui/ui_manager.py index ef94524..9fb5a82 100644 --- a/src/ui/ui_manager.py +++ b/src/ui/ui_manager.py @@ -28,6 +28,8 @@ class UiManager(): self._messenger = Messenger() self._game_stats = game_stats self._screen = screen + self._gold_full = False + self._gambling_round = 1 self._curr_stash = { "items": 3 if self._config.char["fill_shared_stash_first"] else 0, "gold": 0 @@ -240,14 +242,14 @@ class UiManager(): center_pos = (int(slot[0] + (slot_width // 2)), int(slot[1] + (slot_height // 2))) return center_pos, slot_img - def _inventory_has_items(self, img, num_loot_columns: int) -> bool: + def _inventory_has_items(self, img, num_loot_columns: int, num_ignore_columns=0) -> bool: """ Check if Inventory has any items :param img: Img from screen.grab() with inventory open :param num_loot_columns: Number of columns to check from left :return: Bool if inventory still has items or not """ - for column, row in itertools.product(range(num_loot_columns), range(4)): + for column, row in itertools.product(range(num_ignore_columns, num_loot_columns), range(4)): _, slot_img = self.get_slot_pos_and_img(self._config, img, column, row) if self._slot_has_item(slot_img): return True @@ -372,7 +374,7 @@ class UiManager(): mouse.click(button="left") wait(0.3, 0.4) - def stash_all_items(self, num_loot_columns: int, item_finder: ItemFinder): + def stash_all_items(self, num_loot_columns: int, item_finder: ItemFinder, gamble = False): """ Stashing all items in inventory. Stash UI must be open when calling the function. :param num_loot_columns: Number of columns used for loot from left @@ -387,41 +389,51 @@ class UiManager(): Logger.error("Could not determine to be in stash menu. Continue...") return Logger.debug("Found inventory gold btn") - # stash gold - if self._config.char["stash_gold"]: - inventory_no_gold = self._template_finder.search("INVENTORY_NO_GOLD", self._screen.grab(), roi=self._config.ui_roi["inventory_gold"], threshold=0.83) - if inventory_no_gold.valid: - Logger.debug("Skipping gold stashing") - else: - Logger.debug("Stashing gold") - self._move_to_stash_tab(min(3, self._curr_stash["gold"])) - mouse.move(*gold_btn.center, randomize=4) - wait(0.1, 0.15) - mouse.press(button="left") - wait(0.25, 0.35) - mouse.release(button="left") - wait(0.4, 0.6) - keyboard.send("enter") #if stash already full of gold just nothing happens -> gold stays on char -> no popup window - wait(1.0, 1.2) - # move cursor away from button to interfere with screen grab - mouse.move(-120, 0, absolute=False, randomize=15) + if not gamble: + # stash gold + if self._config.char["stash_gold"]: inventory_no_gold = self._template_finder.search("INVENTORY_NO_GOLD", self._screen.grab(), roi=self._config.ui_roi["inventory_gold"], threshold=0.83) - if not inventory_no_gold.valid: - Logger.info("Stash tab is full of gold, selecting next stash tab.") - self._curr_stash["gold"] += 1 - if self._config.general["info_screenshots"]: - cv2.imwrite("./info_screenshots/info_gold_stash_full_" + time.strftime("%Y%m%d_%H%M%S") + ".png", self._screen.grab()) - if self._curr_stash["gold"] > 3: - # turn off gold pickup - self._config.turn_off_goldpickup() - # inform user about it - Logger.info("All stash tabs and character are full of gold, turn of gold pickup") - if self._config.general["custom_message_hook"]: - self._messenger.send_gold() - else: - # move to next stash - wait(0.5, 0.6) - return self.stash_all_items(num_loot_columns, item_finder) + if inventory_no_gold.valid: + Logger.debug("Skipping gold stashing") + else: + Logger.debug("Stashing gold") + self._move_to_stash_tab(min(3, self._curr_stash["gold"])) + mouse.move(*gold_btn.center, randomize=4) + wait(0.1, 0.15) + mouse.press(button="left") + wait(0.25, 0.35) + mouse.release(button="left") + wait(0.4, 0.6) + keyboard.send("enter") #if stash already full of gold just nothing happens -> gold stays on char -> no popup window + wait(1.0, 1.2) + # move cursor away from button to interfere with screen grab + mouse.move(-120, 0, absolute=False, randomize=15) + inventory_no_gold = self._template_finder.search("INVENTORY_NO_GOLD", self._screen.grab(), roi=self._config.ui_roi["inventory_gold"], threshold=0.83) + if not inventory_no_gold.valid: + Logger.info("Stash tab is full of gold, selecting next stash tab.") + self._curr_stash["gold"] += 1 + if self._config.general["info_screenshots"]: + cv2.imwrite("./info_screenshots/info_gold_stash_full_" + time.strftime("%Y%m%d_%H%M%S") + ".png", self._screen.grab()) + if self._curr_stash["gold"] > 3: + #decide if gold pickup should be disabled or gambling is active + if (self._config.char["gamble_items"]): + self._gold_full = True + else: + # turn off gold pickup + self._config.char["stash_gold"] = False + self._config.items["misc_gold"].pickit_type = 0 + item_finder.update_items_to_pick(self._config) + # inform user about it + msg = "All stash tabs and character are full of gold, turn of gold pickup" + Logger.info(msg) + if self._config.general["custom_message_hook"]: + self._messenger.send(msg=f"{self._config.general['name']}: {msg}") + else: + # move to next stash + wait(0.5, 0.6) + return self.stash_all_items(num_loot_columns, item_finder) + else: + self.transfer_shared_to_private_gold (self._gambling_round) # stash stuff self._move_to_stash_tab(self._curr_stash["items"]) center_m = self._screen.convert_abs_to_monitor((0, 0)) @@ -502,6 +514,34 @@ class UiManager(): wait(0.4, 0.5) keyboard.send("esc") + def transfer_shared_to_private_gold (self, count: int): + for x in range (3): + self._move_to_stash_tab (count) + stash_gold_btn = self._template_finder.search("INVENTORY_GOLD_BTN", self._screen.grab(), roi=self._config.ui_roi["gold_btn_stash"], threshold=0.83) + if stash_gold_btn.valid: + x,y = self._screen.convert_screen_to_monitor(stash_gold_btn.center) + mouse.move(x, y, randomize=4) + wait (0.4, 0.5) + mouse.press(button="left") + wait (0.1, 0.15) + mouse.release(button="left") + wait (0.1, 0.15) + keyboard.send ("Enter") + wait (0.1, 0.15) + self._move_to_stash_tab (0) + inventory_gold_btn = self._template_finder.search("INVENTORY_GOLD_BTN", self._screen.grab(), roi=self._config.ui_roi["gold_btn"], threshold=0.83) + if inventory_gold_btn.valid: + x,y = self._screen.convert_screen_to_monitor(inventory_gold_btn.center) + mouse.move(x, y, randomize=4) + wait (0.4, 0.5) + mouse.press(button="left") + wait (0.1, 0.15) + mouse.release(button="left") + wait (0.1, 0.15) + keyboard.send ("Enter") + wait (0.1, 0.15) + self._gambling_round += 1 + def should_stash(self, num_loot_columns: int): """ Check if there are items that need to be stashed in the inventory @@ -596,6 +636,69 @@ class UiManager(): use_grayscale=True) return template_match.valid + def gambling_needed(self) -> bool: + return self._gold_full + + def set__gold_full (self, bool: bool): + self._gold_full = bool + self._gambling_round = 1 + + def gamble(self, item_finder: ItemFinder): + gold = True + gamble_on = True + if self._config.char["num_loot_columns"]%2==0: + ignore_columns = self._config.char["num_loot_columns"]-1 + else: + ignore_columns = self._config.char["num_loot_columns"]-2 + template_match = self._template_finder.search_and_wait("REFRESH", threshold=0.79, time_out=4) + if template_match.valid: + #Gambling window is open. Starting to spent some coins + while (gamble_on and gold): + if (self._inventory_has_items (self._screen.grab(),self._config.char["num_loot_columns"], ignore_columns) and self._inventory_has_items (self._screen.grab(),2)): + gamble_on = False + self.close_vendor_screen () + break + for item in self._config.char["gamble_items"]: + template_match_item = self._template_finder.search (item.upper(), self._screen.grab(), roi=self._config.ui_roi["vendor_stash"], normalize_monitor=True) + while not template_match_item.valid: + #Refresh gambling screen + template_match = self._template_finder.search ("REFRESH", self._screen.grab(), normalize_monitor=True) + if (template_match.valid): + mouse.move(*template_match.center, randomize=12, delay_factor=[1.0, 1.5]) + wait(0.1, 0.15) + mouse.click(button="left") + wait(0.1, 0.15) + template_match_item = self._template_finder.search (item.upper(), self._screen.grab(), roi=self._config.ui_roi["vendor_stash"], normalize_monitor=True) + #item found in gambling menu + mouse.move(*template_match_item.center, randomize=12, delay_factor=[1.0, 1.5]) + wait(0.1, 0.15) + mouse.click(button="right") + wait(0.1, 0.15) + template_match = self._template_finder.search ("no_gold".upper(), self._screen.grab(), threshold= 0.90) + #check if gold is av + if template_match.valid: + gold = False + self.close_vendor_screen () + break + for column, row in itertools.product(range(self._config.char["num_loot_columns"]), range(4)): + img = self._screen.grab() + slot_pos, slot_img = self.get_slot_pos_and_img(self._config, img, column, row) + if self._slot_has_item(slot_img): + x_m, y_m = self._screen.convert_screen_to_monitor(slot_pos) + mouse.move(x_m, y_m, randomize=10, delay_factor=[1.0, 1.3]) + # check item again and discard it or stash it + wait(1.2, 1.4) + hovered_item = self._screen.grab() + if not self._keep_item(item_finder, hovered_item): + keyboard.send('ctrl', do_release=False) + wait(0.1, 0.15) + mouse.click (button="left") + wait(0.1, 0.15) + keyboard.send('ctrl', do_press=False) + #Stashing needed + else: + Logger.warning("gambling failed") + def enable_no_pickup(self) -> bool: """ Checks the best match between enabled and disabled an retrys if already set. @@ -658,4 +761,4 @@ if __name__ == "__main__": template_finder = TemplateFinder(screen) item_finder = ItemFinder() ui_manager = UiManager(screen, template_finder, game_stats) - ui_manager.stash_all_items(5, item_finder) + ui_manager.gamble (item_finder) \ No newline at end of file