From 438d788823c24e72043e0759cd768fbe60db82e5 Mon Sep 17 00:00:00 2001 From: bogdanterzea <49044962+bogdanterzea@users.noreply.github.com> Date: Thu, 31 Oct 2024 08:48:34 +0200 Subject: [PATCH 1/3] Create multiple skelets for accept and ban functionality --- accept_select_ban/accept-backup.png | Bin 0 -> 1370 bytes accept_select_ban/accept-button.png | Bin 0 -> 2618 bytes accept_select_ban/accept_sellect_ban.py | 120 ++++++++++++++++++ accept_select_ban/backup.py | 157 ++++++++++++++++++++++++ accept_select_ban/backupSecond.py | 120 ++++++++++++++++++ accept_select_ban/flash-icon.png | Bin 0 -> 3412 bytes accept_select_ban/play-button.png | Bin 0 -> 1293 bytes accept_select_ban/sample-accepted.png | Bin 0 -> 3438 bytes accept_select_ban/search-bar.png | Bin 0 -> 1849 bytes 9 files changed, 397 insertions(+) create mode 100644 accept_select_ban/accept-backup.png create mode 100644 accept_select_ban/accept-button.png create mode 100644 accept_select_ban/accept_sellect_ban.py create mode 100644 accept_select_ban/backup.py create mode 100644 accept_select_ban/backupSecond.py create mode 100644 accept_select_ban/flash-icon.png create mode 100644 accept_select_ban/play-button.png create mode 100644 accept_select_ban/sample-accepted.png create mode 100644 accept_select_ban/search-bar.png diff --git a/accept_select_ban/accept-backup.png b/accept_select_ban/accept-backup.png new file mode 100644 index 0000000000000000000000000000000000000000..5008e4b56170435967c01012406d6da51f2c2003 GIT binary patch literal 1370 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 literal 0 HcmV?d00001 diff --git a/accept_select_ban/accept_sellect_ban.py b/accept_select_ban/accept_sellect_ban.py new file mode 100644 index 0000000..c0775d3 --- /dev/null +++ b/accept_select_ban/accept_sellect_ban.py @@ -0,0 +1,120 @@ +import time +import ctypes +import pygetwindow as gw +from python_imagesearch.imagesearch import imagesearch_loop, imagesearch + +# Constants for Windows API +MOUSEEVENTF_MOVE = 0x0001 +MOUSEEVENTF_ABSOLUTE = 0x8000 +MOUSEEVENTF_LEFTDOWN = 0x0002 +MOUSEEVENTF_LEFTUP = 0x0004 + +screen_width = ctypes.windll.user32.GetSystemMetrics(0) +screen_height = ctypes.windll.user32.GetSystemMetrics(1) + +# User-Defined Champion and Ban Choices +primary_champion_img = './champion1.png' +backup_champion_img = './champion2.png' +primary_ban_img = './ban1.png' +backup_ban_img = './ban2.png' + +def focusWindow(title="League of Legends"): + windows = gw.getWindowsWithTitle(title) + if windows: + league_window = windows[0] + hwnd = league_window._hWnd + ctypes.windll.user32.SetForegroundWindow(hwnd) + time.sleep(0.1) + return True + else: + print("League of Legends window not found.") + return False + +def move_and_click(x, y): + abs_x = int(x * 65536 / screen_width) + abs_y = int(y * 65536 / screen_height) + + focusWindow() + ctypes.windll.user32.mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, abs_x, abs_y, 0, 0) + time.sleep(0.1) + + ctypes.windll.user32.mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) + time.sleep(0.05) + ctypes.windll.user32.mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) + print(f"Clicked at position: ({x}, {y})") + +def selectChampion(primary_img, backup_img): + pos = imagesearch(primary_img, 0.8) + if pos[0] != -1: + print("Primary champion found!") + move_and_click(pos[0] + 30, pos[1] + 30) + else: + pos = imagesearch(backup_img, 0.8) + if pos[0] != -1: + print("Primary champion banned, selecting backup champion.") + move_and_click(pos[0] + 30, pos[1] + 30) + else: + print("No champions available for selection.") + +def banChampion(primary_ban, backup_ban): + pos = imagesearch(primary_ban, 0.8) + if pos[0] != -1: + print("Primary ban target found!") + move_and_click(pos[0] + 30, pos[1] + 30) + else: + pos = imagesearch(backup_ban, 0.8) + if pos[0] != -1: + print("Primary ban target already banned, selecting backup ban.") + move_and_click(pos[0] + 30, pos[1] + 30) + else: + print("No ban options available.") + +def checkChampionSelection(): + flashIMG = imagesearch(championSelectionImg_flash) + searchIMG = imagesearch(championSelectionImg_search) + + if not searchIMG[0] == -1 or not flashIMG[0] == -1: + return True + else: + return False + +def championSelectionPhase(): + if checkChampionSelection(): + print("Champion Selection Phase...") + selectChampion(primary_champion_img, backup_champion_img) + +def banPhase(): + print("Ban Phase...") + banChampion(primary_ban_img, backup_ban_img) + +def main(): + print("Running...") + run = True + + while run is True: + checkGameAvailable() + time.sleep(1) + + while True: + cancelled = checkGameCancelled() + if cancelled is True: + print("Game cancelled, waiting...") + break + + if checkChampionSelection(): + print("Starting champion selection...") + championSelectionPhase() + time.sleep(1) # Delay to allow selection to process + + if checkBanPhase(): + print("Starting ban selection...") + banPhase() + time.sleep(1) # Delay to allow ban to process + + time.sleep(1) + +if __name__ == "__main__": + try: + main() + except Exception as e: + print(f"Error occurred: {e}") diff --git a/accept_select_ban/backup.py b/accept_select_ban/backup.py new file mode 100644 index 0000000..d96e40a --- /dev/null +++ b/accept_select_ban/backup.py @@ -0,0 +1,157 @@ +import time +import ctypes +import pygetwindow as gw +from python_imagesearch.imagesearch import imagesearch, imagesearch_loop + +# Constants for Windows API +MOUSEEVENTF_MOVE = 0x0001 +MOUSEEVENTF_ABSOLUTE = 0x8000 +MOUSEEVENTF_LEFTDOWN = 0x0002 +MOUSEEVENTF_LEFTUP = 0x0004 + +screen_width = ctypes.windll.user32.GetSystemMetrics(0) +screen_height = ctypes.windll.user32.GetSystemMetrics(1) + +# Prompt user for input to select champions and bans +def get_champion_and_ban_choices(): + print("Enter champions for picking (primary and 2 backups):") + champions = [input("Primary champion: "), input("First backup: "), input("Second backup: ")] + + print("Enter champions for banning (primary and 2 backups):") + bans = [input("Primary ban: "), input("First backup ban: "), input("Second backup ban: ")] + + return champions, bans + +def focusWindow(title="League of Legends"): + windows = gw.getWindowsWithTitle(title) + if windows: + league_window = windows[0] + hwnd = league_window._hWnd + ctypes.windll.user32.SetForegroundWindow(hwnd) + time.sleep(0.1) + return True + else: + print("League of Legends window not found.") + return False + +def move_and_click(x, y): + abs_x = int(x * 65536 / screen_width) + abs_y = int(y * 65536 / screen_height) + + focusWindow() + ctypes.windll.user32.mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, abs_x, abs_y, 0, 0) + time.sleep(0.1) + + ctypes.windll.user32.mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) + time.sleep(0.05) + ctypes.windll.user32.mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) + print(f"Clicked at position: ({x}, {y})") + +def search_and_select(champion_name, click_pos, gray_check_img): + # Click on the search bar and enter the champion's name + move_and_click(click_pos[0], click_pos[1]) # Click search bar + time.sleep(0.1) + # Code to clear the search bar (send Backspace key multiple times) can be added here + + print(f"Attempting to select {champion_name}...") + # Enter the champion name (You would replace this part with keyboard input commands to type champion_name) + + # Check if the ban/pick button is gray (unavailable) + gray_check = imagesearch(gray_check_img, 0.8) + if gray_check[0] == -1: + print(f"{champion_name} is available! Locking in.") + # Code to click the 'ban/pick' button goes here + return True + else: + print(f"{champion_name} is unavailable.") + return False + +def ban_champion(ban_choices, search_pos, gray_check_img): + print("Ban Phase...") + for ban in ban_choices: + if search_and_select(ban, search_pos, gray_check_img): + return True + print("No ban choices available.") + return False + +def pick_champion(champion_choices, search_pos, gray_check_img): + print("Pick Phase...") + for champion in champion_choices: + if search_and_select(champion, search_pos, gray_check_img): + return True + print("No champion choices available.") + return False + +def check_ban_phase(ban_phase_img): + pos = imagesearch(ban_phase_img, 0.8) + return pos[0] != -1 + +def check_pick_phase(pick_phase_img): + pos = imagesearch(pick_phase_img, 0.8) + return pos[0] != -1 + +# def main(): +# # Get champions and bans from user input +# champions, bans = get_champion_and_ban_choices() + +# # Position for clicking the search bar (to be customized as per screen) +# search_pos = (500, 300) # Placeholder coordinates, update as needed +# gray_check_img = './gray-check.png' # Placeholder for gray check image + +# # Images for phase detection +# ban_phase_img = './ban-phase.png' +# pick_phase_img = './pick-phase.png' + +# print("Running...") + +# # Wait for the ban phase +# while not check_ban_phase(ban_phase_img): +# print("Waiting for ban phase...") +# time.sleep(1) + +# # Execute the ban phase +# if not ban_champion(bans, search_pos, gray_check_img): +# print("Failed to ban any champions.") + +# # Wait for the pick phase +# while not check_pick_phase(pick_phase_img): +# print("Waiting for pick phase...") +# time.sleep(1) + +# # Execute the pick phase +# if not pick_champion(champions, search_pos, gray_check_img): +# print("Failed to pick any champions.") + +# print("Champion selected. Closing script.") + +def main(): + print("Running...") + run = True + + while run is True: + checkGameAvailable() + time.sleep(1) + + while True: + cancelled = checkGameCancelled() + if cancelled is True: + print("Game cancelled, waiting...") + break + + if checkChampionSelection(): + print("Starting champion selection...") + championSelectionPhase() + time.sleep(1) # Delay to allow selection to process + + if checkBanPhase(): + print("Starting ban selection...") + banPhase() + time.sleep(1) # Delay to allow ban to process + + time.sleep(1) + +if __name__ == "__main__": + try: + main() + except Exception as e: + print(f"Error occurred: {e}") diff --git a/accept_select_ban/backupSecond.py b/accept_select_ban/backupSecond.py new file mode 100644 index 0000000..c0775d3 --- /dev/null +++ b/accept_select_ban/backupSecond.py @@ -0,0 +1,120 @@ +import time +import ctypes +import pygetwindow as gw +from python_imagesearch.imagesearch import imagesearch_loop, imagesearch + +# Constants for Windows API +MOUSEEVENTF_MOVE = 0x0001 +MOUSEEVENTF_ABSOLUTE = 0x8000 +MOUSEEVENTF_LEFTDOWN = 0x0002 +MOUSEEVENTF_LEFTUP = 0x0004 + +screen_width = ctypes.windll.user32.GetSystemMetrics(0) +screen_height = ctypes.windll.user32.GetSystemMetrics(1) + +# User-Defined Champion and Ban Choices +primary_champion_img = './champion1.png' +backup_champion_img = './champion2.png' +primary_ban_img = './ban1.png' +backup_ban_img = './ban2.png' + +def focusWindow(title="League of Legends"): + windows = gw.getWindowsWithTitle(title) + if windows: + league_window = windows[0] + hwnd = league_window._hWnd + ctypes.windll.user32.SetForegroundWindow(hwnd) + time.sleep(0.1) + return True + else: + print("League of Legends window not found.") + return False + +def move_and_click(x, y): + abs_x = int(x * 65536 / screen_width) + abs_y = int(y * 65536 / screen_height) + + focusWindow() + ctypes.windll.user32.mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, abs_x, abs_y, 0, 0) + time.sleep(0.1) + + ctypes.windll.user32.mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) + time.sleep(0.05) + ctypes.windll.user32.mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) + print(f"Clicked at position: ({x}, {y})") + +def selectChampion(primary_img, backup_img): + pos = imagesearch(primary_img, 0.8) + if pos[0] != -1: + print("Primary champion found!") + move_and_click(pos[0] + 30, pos[1] + 30) + else: + pos = imagesearch(backup_img, 0.8) + if pos[0] != -1: + print("Primary champion banned, selecting backup champion.") + move_and_click(pos[0] + 30, pos[1] + 30) + else: + print("No champions available for selection.") + +def banChampion(primary_ban, backup_ban): + pos = imagesearch(primary_ban, 0.8) + if pos[0] != -1: + print("Primary ban target found!") + move_and_click(pos[0] + 30, pos[1] + 30) + else: + pos = imagesearch(backup_ban, 0.8) + if pos[0] != -1: + print("Primary ban target already banned, selecting backup ban.") + move_and_click(pos[0] + 30, pos[1] + 30) + else: + print("No ban options available.") + +def checkChampionSelection(): + flashIMG = imagesearch(championSelectionImg_flash) + searchIMG = imagesearch(championSelectionImg_search) + + if not searchIMG[0] == -1 or not flashIMG[0] == -1: + return True + else: + return False + +def championSelectionPhase(): + if checkChampionSelection(): + print("Champion Selection Phase...") + selectChampion(primary_champion_img, backup_champion_img) + +def banPhase(): + print("Ban Phase...") + banChampion(primary_ban_img, backup_ban_img) + +def main(): + print("Running...") + run = True + + while run is True: + checkGameAvailable() + time.sleep(1) + + while True: + cancelled = checkGameCancelled() + if cancelled is True: + print("Game cancelled, waiting...") + break + + if checkChampionSelection(): + print("Starting champion selection...") + championSelectionPhase() + time.sleep(1) # Delay to allow selection to process + + if checkBanPhase(): + print("Starting ban selection...") + banPhase() + time.sleep(1) # Delay to allow ban to process + + time.sleep(1) + +if __name__ == "__main__": + try: + main() + except Exception as e: + print(f"Error occurred: {e}") diff --git a/accept_select_ban/flash-icon.png b/accept_select_ban/flash-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f60ee29caec20c29bbe431fdb2383a86646d1ef5 GIT binary patch literal 3412 zcmV-a4Xg5rP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGmbN~PnbOGLGA9w%&4CzTkK~z{rU6@;J zT-SMp*O@c-D=$Ne6e&uSsk=mnVk)T-ZN-W0#Icpg3EJF@B<(|s1}F-&5A9P?^rd}q zkpe}F7H!%-q)7@mfs-IjW5kgnIf7$ZvM!Nzp-76P$RS0}49U6Ax%As-Xdvho4tVBV z_E~%V>tFxBWlc>zFVJD1>Z1(OLCfZH7hkb#^FCT1fUtfJJ9XZ?qa%NOkdcNKD2{- z+pB7EFP7!R=9!|Dgh3_E@31TYC>)W;hf?_gRjL)mVwUELdv$NNPj?$>{qa9l_2s`T z>JR>=q?MHxET$AsXJtntW_keeEm#NuwG1r`=2QJQm@-(_0QUb!X+_$3v~wO}K67}y zm(33=8c!*m&#QZQSaS~?`uevYHiC1v?W?+O*f8sg05C0kWMuTO z)=NurUb5=XU@V)|P@Wg#lxL zrHKHiI`sqsUy{CfPI~J3U@jsXQZj1;AgX!5&fEzp!ixpYzyG66{nu;jx^Qzt7q4xq zT16MUvr=saTFZ5X0p=?mwKP7GP?UT74o5V7t)an@FbfNHLKXlA5x)aa7Jow=5TJ<< zF%jA^!nJrXozEzdOY6pUNB{cWx_)}8u5bK9N&o!qk}h7a$&K4`(bdwXt2f`8k%zua zIBnZzF&5#q)sqeDy}5=8Yi-%FBqW5?AhSF~5&#OBP{B$90EQ_8EJ54`$fEIMr1)y* znJ5#*Q$3oQj_S3aH8ofAbaS<>tI&RDqpiNN9ZC-5l1_aIw66TjM>^GW5U>m$y~#b%VFj)$K;;0s{H=avwi$x zLMCl)IjR9NFveAk(SXQo0~$rZlX%XhcgSo!>)aO*dIolKdv)bPLs#CJC-zSg_g&h5 zs2{rP`p$n`P`TKWS>yY#w)m)|R9^-iHPx)Olt@LRDu+{>TV(a8xF*SD1I zO6pVRru6kc{i5=H-DFH$FFb!t*^J3V*o#Hf#->MiC7FrLf{~*Kv#{p`VA6ekfkqqa zjSiq}OoDmk0nvkieXceE7Rw;&lMyr#ksn5q(T@?HI@V7L+e>P0{80UaWz|-Gpsr*= z>E2y>BH7e4zjaWjCXT5)mtkSp0x{P%V%*PB+PyH8!a2GuAQFvys4 z!+jkG2+ui+t=X}$2ETXBxKd)R30D>pOw~? z=-C}SH}SbIsaz`S`jzWyWAirU!z4tQMfdfj^e10Ct?`qSiuDlc^%XVBC8c)`E7_e< zh!hV1?SYA5B4Pjypr3>LU}{f9!(-f}P~!8XE9O>tP5FM59`V#Jy`kjrgleU?6z%;4 z>5J&xb%m`hl_;9mXCITDn_64nP&^jXuEAdY%Rj!tf=1=|H5T)pVqGoeNM$=559(We zYpVmuj07R;LiA}0^T3FuWEy6|De|4AB|&LyJQSCmJV@58DHP4fDc@)12e5@?J?%ClVu+ryaIrb zrp^tkzWlzTh%BDtr9>J#ufUF}$n+%)-|nT&n8rX)!_qg=!5<;WsJ!}$?%kc%Uw`9W zEnx}q1VxwiHmO$@l{tmCv?&9Fl!4<2`sJ5)sULaND+L5k7E$92;-GYl<_H5S-*0JOgG-0fgccQV7cK5Y) zW^$*_OdV5cxky*x$`9PpQmy5wTxsHW$O0xU(|>%x(C0qeQr~bwn@bCd_vA?T0oX~X z)v_p>4c&XcqQ$w#diY?K3901$dzb*R>$1M}{RjHx%^CCtGq7juJAyz*2g7=HYD{Ne zJfq`B4r%}1AxyHawNgnQfIQe(!a&bFNvA-y57`FLc7v85Lbyzq=*`ogY-nj_8AqPh zNj%nV~Zh@sQ#;ZVYgrI+N8)FFd6#+7!dc*#04X z<;4>QcX0oMf1T#GF}lsiavG~D%xoaqlw#?@PQ|wzl<(1rT0!S{Q>uZP}A9`yYmZ50fh1;v#g$^t-tvCh@Sm879XZLkD1mZf|e{@y!;al)AuAy z*r)>CBvLZcQbg6Dg*6?a0ZewMGV zH!tbY{IcqeCM>%8-RDyJv)|8Y_fAW#N<*zGb7fv(9@+-Db7)0&^riLmvz`u)yBgW+ zDnr^kVWJR)nurS_%?==+v<=}Uf%zF>GUjeiYqPk4ZakGXYP#^o1>Jb}hSHfF8MjG8 zPq`WGR=y{!FTdQQk4)0ElUYLaicQkboaG}}K0ao~!J`!0T<|&M0H+}Y%way~lAUgo zZ4*aejIaLf3SsKnPCZb&30?aIn=!(WOmiJoPtVk7&|RIJ`W@!5^oyUp89bXo5YL=F zp)`hP2{#V)z#^&a)f9H-SrFh`N&e0u+*#gm)ozsJQ~x|XtBuT>HL1FYNz(fVkPR58 z%@u~(Tit&9hO*sR9XWAQM@~Miv17;8m!}7g(n`dWdb~;l&B$akdhzogW94a93;)Kk zTkog7RgK2a)oQ*?CSC>1ZM5b9rV{A2FinQtm6oZ`WjfNUSA<@f!Z7rAuhvj` zi58)%@|vf)J5?PzHHCOh8{X8T*|*fc>nu%FN+JJUJUoIju`v69ZB9YYe-@pXyMCQ}%xv?%k)JUpv#T`Qp6x;8nT2W& z7;pRXGd)EK|W@(CkEUUbBrh!)yjO*4tW}akX$;n!kk`P&zl+nokq5 zOGJ2<-z2NBvksugcZ?e|ffZ)=84I#5xMQ}Y)&V~B5}*sve^aX~1r6^W;yQ~6_0xbI zZ-3$9l0J1WkwG2DbBrme7vEv~UuC&ERDO~S$WAZ-r>o5nBz zRQUClmTuveqB^*(v?a~81?6(pFPJC?fa2Xzt+R2v_2X4q zN*udURtN*60|O)h_Ahe&W1c=0Y##UQ$5D+i+;36Y=VcS-)*73{x~tlHEcj1{G)dQu zVHb$#5=ps2R#DuwNSfa-vLl92>bCCj`vL&TBL!v8WZ7r-UeVrTwgwI*P3xluPHTFT zSSCtYq1A|yZGjkLYI?^Am8Gctzx*~#Negeaac5dwV`D6Fi4PP3k)~T|1Hzc7@tE^~ qTEZty*)rG6+aDATvt!;7ll~9J`iOBN7T})%0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1foeqK~zXfwUzr% zlV=pi&-32;Uiw~2uUdMcExjNV62+D;*4rBJBbiM#q#!28B+3L_!$X!7{-&1u&vQOEr{asl;fdBr_#qY6yak>Aw+o?d$wo zS5qG6HC0biYN5yAv0zhUbQq*9hXLDtK zdu4K`Fmv^TVH~#B;nrF``_Ya}DuoS30AsY47Z`y92d#A(uZ~MZkJ)DZ2EqZvG2Y--Hx7 zn{M7IoO!V_xx6?f^9F%IG=4tC#?YcEpC8oK_(F|NZ_w=zR}p|f3VJVi7k_NJR*;T# zB3X&IxSy?_dGh`2htp}5=NN>FQ%r_Nv$=FBSd-o5clkpV>HZG@?pE+5pn1T1d8Piw zCKKyHim5ww@VEQZFV;52Bc5|>S9pW2BGen zs}BMS7Nh zA$$~?Q_wOHxV{m&au3;jv{Cxy+xNCtPY!muC7uPukhhJ8hF9aejq%nu)cQi6K%^q+ z-T>-g8by;-GrpsCXiCHIeE7THEyHt2uIbG*KP!xH-s%^4kz*KIQ1!-?C#EggvELi4 zniOd5g;mex3F1%O(Q3Uu#}xVm3J?n?KK*3XAt>c;-$xH z@s6b47~GYLjC%$kGYaWEbmpKf1<5QN%|XxUz&DSh3(H7#cwFL>uP4{8osxJ7?-<+< zaz~=(k2L5~0^uf?uQKW007#EP<^**0(b+tak{W`{l=J#V{J~4g;^ic1>-Ox!uTGnc zl0be;rFUfB@6n}1400000NkvXXu0mjf Dcei(C literal 0 HcmV?d00001 diff --git a/accept_select_ban/sample-accepted.png b/accept_select_ban/sample-accepted.png new file mode 100644 index 0000000000000000000000000000000000000000..13d162677ac624eed58d590714c037585bd497d5 GIT binary patch literal 3438 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 nB-exh??dvrmdlxz2L Date: Sun, 3 Nov 2024 11:33:17 +0200 Subject: [PATCH 2/3] Remove extra solutions Implement initial skelet of the solution --- accept_select_ban/accept_sellect_ban.py | 231 ++++++++++++++++++------ accept_select_ban/backup.py | 157 ---------------- accept_select_ban/backupSecond.py | 120 ------------ 3 files changed, 180 insertions(+), 328 deletions(-) delete mode 100644 accept_select_ban/backup.py delete mode 100644 accept_select_ban/backupSecond.py diff --git a/accept_select_ban/accept_sellect_ban.py b/accept_select_ban/accept_sellect_ban.py index c0775d3..fc0aeea 100644 --- a/accept_select_ban/accept_sellect_ban.py +++ b/accept_select_ban/accept_sellect_ban.py @@ -1,6 +1,8 @@ import time import ctypes +import pyautogui import pygetwindow as gw + from python_imagesearch.imagesearch import imagesearch_loop, imagesearch # Constants for Windows API @@ -12,25 +14,31 @@ screen_width = ctypes.windll.user32.GetSystemMetrics(0) screen_height = ctypes.windll.user32.GetSystemMetrics(1) -# User-Defined Champion and Ban Choices -primary_champion_img = './champion1.png' -backup_champion_img = './champion2.png' -primary_ban_img = './ban1.png' -backup_ban_img = './ban2.png' +TIMELAPSE = 1 + +# championPickButton = './pick-button.png' +# championBanPhase = './ban-phase.png' TO DO +acceptButtonImgFirst = './accept-backup.png' +acceptedButtonImg = './sample-accepted.png' +championSelectionImg_flash = './flash-icon.png' +championSelectionImg_search = './search-bar.png' +playButtonImg = './play-button.png' def focusWindow(title="League of Legends"): windows = gw.getWindowsWithTitle(title) if windows: league_window = windows[0] - hwnd = league_window._hWnd - ctypes.windll.user32.SetForegroundWindow(hwnd) + league_window.minimize() + time.sleep(0.1) + league_window.restore() time.sleep(0.1) return True else: print("League of Legends window not found.") return False -def move_and_click(x, y): +def move_and_click(x, y):\ + # Calculate absolute x and y for Windows abs_x = int(x * 65536 / screen_width) abs_y = int(y * 65536 / screen_height) @@ -41,33 +49,33 @@ def move_and_click(x, y): ctypes.windll.user32.mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) time.sleep(0.05) ctypes.windll.user32.mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) - print(f"Clicked at position: ({x}, {y})") + time.sleep(0.05) + ctypes.windll.user32.mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) + time.sleep(0.05) + ctypes.windll.user32.mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) + # Performing double click just to be sure. -def selectChampion(primary_img, backup_img): - pos = imagesearch(primary_img, 0.8) - if pos[0] != -1: - print("Primary champion found!") - move_and_click(pos[0] + 30, pos[1] + 30) - else: - pos = imagesearch(backup_img, 0.8) - if pos[0] != -1: - print("Primary champion banned, selecting backup champion.") - move_and_click(pos[0] + 30, pos[1] + 30) - else: - print("No champions available for selection.") + print(f"Double clicked at position: ({x}, {y})") -def banChampion(primary_ban, backup_ban): - pos = imagesearch(primary_ban, 0.8) - if pos[0] != -1: - print("Primary ban target found!") - move_and_click(pos[0] + 30, pos[1] + 30) - else: - pos = imagesearch(backup_ban, 0.8) - if pos[0] != -1: - print("Primary ban target already banned, selecting backup ban.") +def get_champion_and_ban_choices(): + print("Enter champions for picking (primary and 2 backups):") + champions = [input("Primary champion: "), input("First backup: "), input("Second backup: ")] + + print("Enter champions for banning (primary and 2 backups):") + bans = [input("Primary ban: "), input("First backup ban: "), input("Second backup ban: ")] + + return champions, bans + +def checkGameAvailable(): + while True: + pos = imagesearch(acceptButtonImgFirst, 0.8) + + if not pos[0] == -1: + time.sleep(0.5) move_and_click(pos[0] + 30, pos[1] + 30) - else: - print("No ban options available.") + print("Game accepted!") + break + time.sleep(TIMELAPSE) def checkChampionSelection(): flashIMG = imagesearch(championSelectionImg_flash) @@ -77,23 +85,133 @@ def checkChampionSelection(): return True else: return False + +def checkChampionBanning(): + banIMG = imagesearch(championBanPhase) + + if not banIMG[0] == -1: + return True + else: + return False + +def checkGameCancelled(): + accepted = imagesearch(acceptedButtonImg) + play = imagesearch(playButtonImg) + + if accepted[0] == -1 and not play[0] == -1: + return True + else: + return False + +# TO DO - check this function------------------------------ +def checkChampionPick(): + accepted = imagesearch(acceptedButtonImg) + play = imagesearch(playButtonImg) + + if accepted[0] == -1 and not play[0] == -1: + return True + else: + return False + +def selectMainChampion(champions): + search_pos = imagesearch(championSelectionImg_search) + if search_pos[0] == -1: + print("Search bar not found.") + return False + + move_and_click(search_pos[0] + 30, search_pos[1] + 30) + time.sleep(0.1) + + pyautogui.hotkey('ctrl', 'a') + time.sleep(0.1) + pyautogui.press('backspace') + time.sleep(0.1) -def championSelectionPhase(): - if checkChampionSelection(): - print("Champion Selection Phase...") - selectChampion(primary_champion_img, backup_champion_img) + primary_champion = champions[0] + pyautogui.write(primary_champion, interval=0.1) + time.sleep(0.1) + + # TO DO - CHECK IF IT IS THE RIGHT POSITION + move_and_click(search_pos[0] - 400, search_pos[1] + 200) + print(f"Selected champion: {primary_champion}") + + return True + +def banChampion(bans): + for champion in bans: + # Locate and click the search bar to focus + search_pos = imagesearch(championSelectionImg_search) + if search_pos[0] == -1: + print("Search bar not found.") + return False + + move_and_click(search_pos[0] + 30, search_pos[1] + 30) + time.sleep(0.1) + + pyautogui.hotkey('ctrl', 'a') + time.sleep(0.1) + pyautogui.press('backspace') + time.sleep(0.1) -def banPhase(): - print("Ban Phase...") - banChampion(primary_ban_img, backup_ban_img) + pyautogui.write(champion, interval=0.1) + print(f"Attempting to ban champion: {champion}") + time.sleep(0.5) + + ban_button_pos = imagesearch('ban-button.png') # TO GET ASSETS + if ban_button_pos[0] != -1: + move_and_click(ban_button_pos[0] + 30, ban_button_pos[1] + 30) + print(f"Banned champion: {champion}") + return True + else: + print(f"{champion} not available for banning, trying next...") + + print("No champions available to ban from the list.") + return False + +def pickChampion(champions): + for champion in champions: + search_pos = imagesearch(championSelectionImg_search) + if search_pos[0] == -1: + print("Search bar not found.") + return False + + move_and_click(search_pos[0] + 30, search_pos[1] + 30) + time.sleep(0.1) + + pyautogui.hotkey('ctrl', 'a') + time.sleep(0.1) + pyautogui.press('backspace') + time.sleep(0.1) + + pyautogui.write(champion, interval=0.1) + print(f"Attempting to pick champion: {champion}") + time.sleep(0.5) # Delay to allow image recognition + + pick_button_pos = imagesearch('pick-button.png') + if pick_button_pos[0] != -1: + move_and_click(pick_button_pos[0] + 30, pick_button_pos[1] + 30) + print(f"Picked champion: {champion}") + return True + else: + print(f"{champion} not available for picking, trying next...") + + # If no champion was picked, click the fallback position + print("No champions available to pick from the list, using default position.") + move_and_click(search_pos[0] + 400, search_pos[1] - 200) + return False def main(): print("Running...") run = True while run is True: + champions, bans = get_champion_and_ban_choices() + + print(champions) + print(bans) + checkGameAvailable() - time.sleep(1) + time.sleep(TIMELAPSE) while True: cancelled = checkGameCancelled() @@ -101,17 +219,28 @@ def main(): print("Game cancelled, waiting...") break - if checkChampionSelection(): - print("Starting champion selection...") - championSelectionPhase() - time.sleep(1) # Delay to allow selection to process - - if checkBanPhase(): - print("Starting ban selection...") - banPhase() - time.sleep(1) # Delay to allow ban to process - - time.sleep(1) + csResult = checkChampionSelection() + if csResult is True: + print("Selecting Champion...") + selectMainChampion(champions) + time.sleep(TIMELAPSE) + break + + cbResult = checkChampionBanning() + if cbResult is True: + print("Ban champion phase...") + banChampion(bans) + time.sleep(TIMELAPSE) + break + + cpResult = checkChampionPick() + if cpResult is True: + print("Picking champion...") + pickChampion(champions) + time.sleep(TIMELAPSE) + break + + time.sleep(TIMELAPSE) if __name__ == "__main__": try: diff --git a/accept_select_ban/backup.py b/accept_select_ban/backup.py deleted file mode 100644 index d96e40a..0000000 --- a/accept_select_ban/backup.py +++ /dev/null @@ -1,157 +0,0 @@ -import time -import ctypes -import pygetwindow as gw -from python_imagesearch.imagesearch import imagesearch, imagesearch_loop - -# Constants for Windows API -MOUSEEVENTF_MOVE = 0x0001 -MOUSEEVENTF_ABSOLUTE = 0x8000 -MOUSEEVENTF_LEFTDOWN = 0x0002 -MOUSEEVENTF_LEFTUP = 0x0004 - -screen_width = ctypes.windll.user32.GetSystemMetrics(0) -screen_height = ctypes.windll.user32.GetSystemMetrics(1) - -# Prompt user for input to select champions and bans -def get_champion_and_ban_choices(): - print("Enter champions for picking (primary and 2 backups):") - champions = [input("Primary champion: "), input("First backup: "), input("Second backup: ")] - - print("Enter champions for banning (primary and 2 backups):") - bans = [input("Primary ban: "), input("First backup ban: "), input("Second backup ban: ")] - - return champions, bans - -def focusWindow(title="League of Legends"): - windows = gw.getWindowsWithTitle(title) - if windows: - league_window = windows[0] - hwnd = league_window._hWnd - ctypes.windll.user32.SetForegroundWindow(hwnd) - time.sleep(0.1) - return True - else: - print("League of Legends window not found.") - return False - -def move_and_click(x, y): - abs_x = int(x * 65536 / screen_width) - abs_y = int(y * 65536 / screen_height) - - focusWindow() - ctypes.windll.user32.mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, abs_x, abs_y, 0, 0) - time.sleep(0.1) - - ctypes.windll.user32.mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) - time.sleep(0.05) - ctypes.windll.user32.mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) - print(f"Clicked at position: ({x}, {y})") - -def search_and_select(champion_name, click_pos, gray_check_img): - # Click on the search bar and enter the champion's name - move_and_click(click_pos[0], click_pos[1]) # Click search bar - time.sleep(0.1) - # Code to clear the search bar (send Backspace key multiple times) can be added here - - print(f"Attempting to select {champion_name}...") - # Enter the champion name (You would replace this part with keyboard input commands to type champion_name) - - # Check if the ban/pick button is gray (unavailable) - gray_check = imagesearch(gray_check_img, 0.8) - if gray_check[0] == -1: - print(f"{champion_name} is available! Locking in.") - # Code to click the 'ban/pick' button goes here - return True - else: - print(f"{champion_name} is unavailable.") - return False - -def ban_champion(ban_choices, search_pos, gray_check_img): - print("Ban Phase...") - for ban in ban_choices: - if search_and_select(ban, search_pos, gray_check_img): - return True - print("No ban choices available.") - return False - -def pick_champion(champion_choices, search_pos, gray_check_img): - print("Pick Phase...") - for champion in champion_choices: - if search_and_select(champion, search_pos, gray_check_img): - return True - print("No champion choices available.") - return False - -def check_ban_phase(ban_phase_img): - pos = imagesearch(ban_phase_img, 0.8) - return pos[0] != -1 - -def check_pick_phase(pick_phase_img): - pos = imagesearch(pick_phase_img, 0.8) - return pos[0] != -1 - -# def main(): -# # Get champions and bans from user input -# champions, bans = get_champion_and_ban_choices() - -# # Position for clicking the search bar (to be customized as per screen) -# search_pos = (500, 300) # Placeholder coordinates, update as needed -# gray_check_img = './gray-check.png' # Placeholder for gray check image - -# # Images for phase detection -# ban_phase_img = './ban-phase.png' -# pick_phase_img = './pick-phase.png' - -# print("Running...") - -# # Wait for the ban phase -# while not check_ban_phase(ban_phase_img): -# print("Waiting for ban phase...") -# time.sleep(1) - -# # Execute the ban phase -# if not ban_champion(bans, search_pos, gray_check_img): -# print("Failed to ban any champions.") - -# # Wait for the pick phase -# while not check_pick_phase(pick_phase_img): -# print("Waiting for pick phase...") -# time.sleep(1) - -# # Execute the pick phase -# if not pick_champion(champions, search_pos, gray_check_img): -# print("Failed to pick any champions.") - -# print("Champion selected. Closing script.") - -def main(): - print("Running...") - run = True - - while run is True: - checkGameAvailable() - time.sleep(1) - - while True: - cancelled = checkGameCancelled() - if cancelled is True: - print("Game cancelled, waiting...") - break - - if checkChampionSelection(): - print("Starting champion selection...") - championSelectionPhase() - time.sleep(1) # Delay to allow selection to process - - if checkBanPhase(): - print("Starting ban selection...") - banPhase() - time.sleep(1) # Delay to allow ban to process - - time.sleep(1) - -if __name__ == "__main__": - try: - main() - except Exception as e: - print(f"Error occurred: {e}") diff --git a/accept_select_ban/backupSecond.py b/accept_select_ban/backupSecond.py deleted file mode 100644 index c0775d3..0000000 --- a/accept_select_ban/backupSecond.py +++ /dev/null @@ -1,120 +0,0 @@ -import time -import ctypes -import pygetwindow as gw -from python_imagesearch.imagesearch import imagesearch_loop, imagesearch - -# Constants for Windows API -MOUSEEVENTF_MOVE = 0x0001 -MOUSEEVENTF_ABSOLUTE = 0x8000 -MOUSEEVENTF_LEFTDOWN = 0x0002 -MOUSEEVENTF_LEFTUP = 0x0004 - -screen_width = ctypes.windll.user32.GetSystemMetrics(0) -screen_height = ctypes.windll.user32.GetSystemMetrics(1) - -# User-Defined Champion and Ban Choices -primary_champion_img = './champion1.png' -backup_champion_img = './champion2.png' -primary_ban_img = './ban1.png' -backup_ban_img = './ban2.png' - -def focusWindow(title="League of Legends"): - windows = gw.getWindowsWithTitle(title) - if windows: - league_window = windows[0] - hwnd = league_window._hWnd - ctypes.windll.user32.SetForegroundWindow(hwnd) - time.sleep(0.1) - return True - else: - print("League of Legends window not found.") - return False - -def move_and_click(x, y): - abs_x = int(x * 65536 / screen_width) - abs_y = int(y * 65536 / screen_height) - - focusWindow() - ctypes.windll.user32.mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, abs_x, abs_y, 0, 0) - time.sleep(0.1) - - ctypes.windll.user32.mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) - time.sleep(0.05) - ctypes.windll.user32.mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) - print(f"Clicked at position: ({x}, {y})") - -def selectChampion(primary_img, backup_img): - pos = imagesearch(primary_img, 0.8) - if pos[0] != -1: - print("Primary champion found!") - move_and_click(pos[0] + 30, pos[1] + 30) - else: - pos = imagesearch(backup_img, 0.8) - if pos[0] != -1: - print("Primary champion banned, selecting backup champion.") - move_and_click(pos[0] + 30, pos[1] + 30) - else: - print("No champions available for selection.") - -def banChampion(primary_ban, backup_ban): - pos = imagesearch(primary_ban, 0.8) - if pos[0] != -1: - print("Primary ban target found!") - move_and_click(pos[0] + 30, pos[1] + 30) - else: - pos = imagesearch(backup_ban, 0.8) - if pos[0] != -1: - print("Primary ban target already banned, selecting backup ban.") - move_and_click(pos[0] + 30, pos[1] + 30) - else: - print("No ban options available.") - -def checkChampionSelection(): - flashIMG = imagesearch(championSelectionImg_flash) - searchIMG = imagesearch(championSelectionImg_search) - - if not searchIMG[0] == -1 or not flashIMG[0] == -1: - return True - else: - return False - -def championSelectionPhase(): - if checkChampionSelection(): - print("Champion Selection Phase...") - selectChampion(primary_champion_img, backup_champion_img) - -def banPhase(): - print("Ban Phase...") - banChampion(primary_ban_img, backup_ban_img) - -def main(): - print("Running...") - run = True - - while run is True: - checkGameAvailable() - time.sleep(1) - - while True: - cancelled = checkGameCancelled() - if cancelled is True: - print("Game cancelled, waiting...") - break - - if checkChampionSelection(): - print("Starting champion selection...") - championSelectionPhase() - time.sleep(1) # Delay to allow selection to process - - if checkBanPhase(): - print("Starting ban selection...") - banPhase() - time.sleep(1) # Delay to allow ban to process - - time.sleep(1) - -if __name__ == "__main__": - try: - main() - except Exception as e: - print(f"Error occurred: {e}") From 1d5dd742d0ad1e62e30315dd90aa2031d2853eba Mon Sep 17 00:00:00 2001 From: bogdanterzea <49044962+bogdanterzea@users.noreply.github.com> Date: Sun, 3 Nov 2024 22:38:20 +0200 Subject: [PATCH 3/3] Add new assets and add new functions --- accept_select_ban/accept_sellect_ban.py | 66 ++++++++++-------- accept_select_ban/ban-phase-button.png | Bin 0 -> 3341 bytes accept_select_ban/ban-phase-title.png | Bin 0 -> 16013 bytes .../ban-phase-unavailable-button.png | Bin 0 -> 2009 bytes accept_select_ban/lock-in-phase-button.png | Bin 0 -> 2599 bytes accept_select_ban/lock-in-phase-title.png | Bin 0 -> 19296 bytes .../lock-in-phase-unavailable-button.png | Bin 0 -> 2698 bytes accept_select_ban/prepare-for-battle.png | Bin 0 -> 23299 bytes 8 files changed, 38 insertions(+), 28 deletions(-) create mode 100644 accept_select_ban/ban-phase-button.png create mode 100644 accept_select_ban/ban-phase-title.png create mode 100644 accept_select_ban/ban-phase-unavailable-button.png create mode 100644 accept_select_ban/lock-in-phase-button.png create mode 100644 accept_select_ban/lock-in-phase-title.png create mode 100644 accept_select_ban/lock-in-phase-unavailable-button.png create mode 100644 accept_select_ban/prepare-for-battle.png diff --git a/accept_select_ban/accept_sellect_ban.py b/accept_select_ban/accept_sellect_ban.py index fc0aeea..c2e03d0 100644 --- a/accept_select_ban/accept_sellect_ban.py +++ b/accept_select_ban/accept_sellect_ban.py @@ -1,7 +1,6 @@ import time import ctypes import pyautogui -import pygetwindow as gw from python_imagesearch.imagesearch import imagesearch_loop, imagesearch @@ -16,14 +15,22 @@ TIMELAPSE = 1 -# championPickButton = './pick-button.png' -# championBanPhase = './ban-phase.png' TO DO acceptButtonImgFirst = './accept-backup.png' acceptedButtonImg = './sample-accepted.png' championSelectionImg_flash = './flash-icon.png' championSelectionImg_search = './search-bar.png' playButtonImg = './play-button.png' +banPhaseTitle = "./ban-phase-title.png" +banPhaseButton = "./ban-phase-button.png" +banPhaseUnavailableButton = "./ban-phase-unavailable-button.png" + +lockInphaseTitle = "./lock-in-phase-title.png" +lockInphaseButton = "./lock-in-phase-button.png" +lockInphaseUnavailableButton = "./lock-in-phase-unavailable-button.png" + +gameReadyText = "./prepare-for-battle.png" + def focusWindow(title="League of Legends"): windows = gw.getWindowsWithTitle(title) if windows: @@ -67,6 +74,8 @@ def get_champion_and_ban_choices(): return champions, bans def checkGameAvailable(): + print("Check if game is available...") + while True: pos = imagesearch(acceptButtonImgFirst, 0.8) @@ -74,7 +83,7 @@ def checkGameAvailable(): time.sleep(0.5) move_and_click(pos[0] + 30, pos[1] + 30) print("Game accepted!") - break + return True time.sleep(TIMELAPSE) def checkChampionSelection(): @@ -87,7 +96,7 @@ def checkChampionSelection(): return False def checkChampionBanning(): - banIMG = imagesearch(championBanPhase) + banIMG = imagesearch(banPhaseTitle) if not banIMG[0] == -1: return True @@ -102,13 +111,11 @@ def checkGameCancelled(): return True else: return False - -# TO DO - check this function------------------------------ + def checkChampionPick(): - accepted = imagesearch(acceptedButtonImg) - play = imagesearch(playButtonImg) + lockInTitleImage = imagesearch(lockInphaseTitle) - if accepted[0] == -1 and not play[0] == -1: + if not lockInTitleImage[0] == -1: return True else: return False @@ -131,12 +138,16 @@ def selectMainChampion(champions): pyautogui.write(primary_champion, interval=0.1) time.sleep(0.1) - # TO DO - CHECK IF IT IS THE RIGHT POSITION - move_and_click(search_pos[0] - 400, search_pos[1] + 200) + move_and_click(search_pos[0] , search_pos[1] + 90) print(f"Selected champion: {primary_champion}") return True +def detectGameStart(): + print("Checking if game has started...") + game_start_pos = imagesearch(gameReadyText) + return game_start_pos is not None + def banChampion(bans): for champion in bans: # Locate and click the search bar to focus @@ -195,46 +206,45 @@ def pickChampion(champions): else: print(f"{champion} not available for picking, trying next...") - # If no champion was picked, click the fallback position print("No champions available to pick from the list, using default position.") move_and_click(search_pos[0] + 400, search_pos[1] - 200) return False def main(): print("Running...") + + champions, bans = get_champion_and_ban_choices() run = True - while run is True: - champions, bans = get_champion_and_ban_choices() + print(champions) + print(bans) - print(champions) - print(bans) + while run is True: +# to improve this loop and maybe find new assets for the cancel and start phase checkGameAvailable() time.sleep(TIMELAPSE) while True: - cancelled = checkGameCancelled() - if cancelled is True: + # if detectGameStart(): + # print("Game has started. Exiting script.") + # return + + if checkGameCancelled(): print("Game cancelled, waiting...") break - - csResult = checkChampionSelection() - if csResult is True: + + if checkChampionSelection(): print("Selecting Champion...") selectMainChampion(champions) time.sleep(TIMELAPSE) - break - cbResult = checkChampionBanning() - if cbResult is True: + elif checkChampionBanning(): print("Ban champion phase...") banChampion(bans) time.sleep(TIMELAPSE) - break - cpResult = checkChampionPick() - if cpResult is True: + elif checkChampionPick(): print("Picking champion...") pickChampion(champions) time.sleep(TIMELAPSE) diff --git a/accept_select_ban/ban-phase-button.png b/accept_select_ban/ban-phase-button.png new file mode 100644 index 0000000000000000000000000000000000000000..d63854eb4244e235da46f0db2b6cb227af3e95aa GIT binary patch literal 3341 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 X|0M9a8qxJF00000NkvXXu0mjfq%n0; literal 0 HcmV?d00001 diff --git a/accept_select_ban/ban-phase-title.png b/accept_select_ban/ban-phase-title.png new file mode 100644 index 0000000000000000000000000000000000000000..d61d162c36790f07b02ab8c506ab59c815891494 GIT binary patch literal 16013 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 Hu0mjfdJ@=m literal 0 HcmV?d00001 diff --git a/accept_select_ban/ban-phase-unavailable-button.png b/accept_select_ban/ban-phase-unavailable-button.png new file mode 100644 index 0000000000000000000000000000000000000000..be45ffd8ffe3409a40e94fa3a3f75474c85b318b GIT binary patch literal 2009 zcmV;~2PXK5P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2X0A3K~!i%?VI~= z6Gsro=bnDsNgR_jC4rQXLQ+~qNS-dq9#n#P18R7C*=jZ`J80M?^=U7s_+av}sngC17l^eXZw z5=eYn=w&JNs+&JdLCI%-hq(3E3@>$Q7i!GZA=Ym~v1BoGdKHV2@~5Jqm!VflLfyST z&r4m}i8?$H;6;F?^)hTFi=bD8GzhtrFeGF8;n(k`>>W-zljEf>?L-ZSbzTHmTuFl8 zFsfeV#G<(h|CaqVubNwk^HP^~Q&mNHm02qD8jchPGlmy_y!bJ%uvy*M=A|y}rYhFG zxh>{ZI3w{I2`-qWs^A?Nuy>H9_$n`T=>$wH@+!i^7r?ZxB9lp*KDhS51mCk+URmR% zE}cLvV=_TrrB~FNn{k9_WESYqGd|2)0G>YI;H55|LVXl3u!6VVk?P3ey6We4CHxp)$E%bux7FJUqkuDb>&NBJHm8rfZ5>e5MA&xakSJnbZy0uW_u$FO8uPw@-wUCzyAUh5PTkr` zp$953j`Nt`Qy((jp!bUVDB#`TH9brt!SuaZ_G!yy3nrTrx4Ji(p@ArT{>fPsD+>Ai z9!mt|@$upO6hUE<=`1D}S@bS@u8U!)a~q2iib-qLy}cp}pJSs#%xjy$T1hZr#GW32 z@29@7cQ|{}T_n6uhW2D5oOQy8M)il4_{uta!AkG$$ji>19jnU{DU|7$aHO+2=6UH% zmeq$b6neexUPE3uzw{I{MhgtXVBXmbY^@)%il&2#Cslp5SN4D2e!xrh2+_pWDvgd5 zS8-Tc7kT)5a{q;v9m`DVf5F$JFV+f>Fozn8@ znOSCc&^EVsSUatuoN2zy+WIz|zg`4+EK3~7Dk@%(W`Kq#7lS@M^RO;V3TsBEL=)|= ze`LBUhep?#nKnD1(}bzGJ&!${U6oS1*Gez~ln^p#lE`<2039fjpVc z@APQV|3N@KHM<;V`@x;r9hS=Dnu>uZqbNkth=iayOk50Q)kWU+s*qzbufj9piP5uy zUUnktd~RWx9Ykf>8o_TA_9+{soUUo-EAXOTob9wP+d)HKQN%SDGtBUW81zZ|qOBmc zy)5F|nNHLN{X>|m7tT=|g9O{y++l<5#3^1g0cC_}WMbPYxI8(IrP_$E zZzk9$eOV+RWYrBDoT53s&1p_VAI^T9NM~hRr=T-6G8wmaGAC}w2x|p4Gpec%L!-yp zmsAvt?4ybIaP1Jnfvg{8(Xkjf7Sed7Joutc#wncKwe!2OIT7b}+YS?SHL|@fN^c-$ zT|9FNhR09X71*nsy@?V{mW#`)kihjo(d7}oH12iZ7ql|BwwiSkE%oPe9d8oOn@{Nr z#w-mzYwEKPAsh{Z#bz;TsU1i^x?T*sEt$?>#`qN19rc+`qakv>j&b8<1QWci!tE1l z)bLqloVl_(F4pKjBA`ea9fRoc7(0l>5!#6#Eq=NXjwqKa>_O(-;bmS`kuk7zAw`$^rfdRokXM%9FEc00000NkvXXu0mjf@=>(4 literal 0 HcmV?d00001 diff --git a/accept_select_ban/lock-in-phase-button.png b/accept_select_ban/lock-in-phase-button.png new file mode 100644 index 0000000000000000000000000000000000000000..7e607441695dd160bf43523c3f308e07593c4416 GIT binary patch literal 2599 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 JPDHLkV1hrF2~Yq4 literal 0 HcmV?d00001 diff --git a/accept_select_ban/lock-in-phase-title.png b/accept_select_ban/lock-in-phase-title.png new file mode 100644 index 0000000000000000000000000000000000000000..5b98eeb8c436b617f7c17a15a5eff88cb97681de GIT binary patch literal 19296 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

Hh2V>5(w|?BQS)90UT^>rSo$-!GJS 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Ⓢ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 S4S^H@0000