누가 써달라 해서 써보는 매크로 공략(?) 입니다. (공략 탭으로 가도 되겠습니까?ㅋㅋ)

파이썬으로 처음부터 끝까지 손수 만들었습니다.

줄수가 중요한건 아니지만 약 1070줄 정도 입니다.


사용한 라이브러리

from ppadb.client import Client as AdbClient
from PIL import Image
import pyautogui
import time
import win32gui
import win32ui
import win32con
import random
import sys
import os

대충 이렇게 사용했습니다.

먼저, 실행은 어떤원리로 되는가

for /F "skip=%line% delims=" %%i in (Port_list.txt) do cd Data\ &BluearcaMacro.exe %%i %devnum%&goto nextline
:nextline
pause

2. Start.bat 중 일부입니다.

배럭을 입력받으면 port_list에 적은 포트와 배럭 숫자를 argument로 사용하여 main_multy_kor.py(매크로 실행파일)를 실행합니다.

따라서 main_multy_kor.py를 각 배럭에 맞게 실행 가능합니다.


백그라운드 이미지 서치 기반

def background_screenshot(hwnd, width, height):
    ....
    ....
    return im

이라는 함수를 하나 만들었습니다.

이 함수를 이용하면 각 배럭에 알맞는 스크린샷을 백그라운드에서도 찍을 수 있습니다. 

따라서 찍힌 사진을 기반으로 다음 매크로를 실행할지 말지를 결정하면 되는 것입니다.

while 1:
    randsleep(0.1,0.15)
    scr_img = background_screenshot(bluestackhw, 960, 572)
    clickhere = pyautogui.locate(img_accountsetting, scr_img, confidence=0.8)
    if clickhere is not None:
        randsleep(0.1, 0.3)
        clickd(641, 289, 644,311)
        print("OK")
        break

계정설정을 누르는 부분입니다.

계정설정이 나올때까지 while을 돌려 스샷을 계속 찍다가 위 사진이 발견되면 매크로가 진행되는 방식입니다.

(아마 이 부분에서 메모리 누수가 좀 있는 것 같은데 전문가가 아니라 방법이 안떠오를 뿐)


랜덤좌표

def clickd(x1, y1, x2, y2):
    newy1 = y1 - 32
    newy2 = y2 - 32
    x = random.randint(x1, x2)
    y = random.randint(newy1, newy2)
    cmd = "input touchscreen tap " + str(x) + " " + str(y) # adb로 클릭을 하기 때문에 명령어의 형태로 스트링을 만들었습니다.
    adbdevice.shell(cmd)

함수의 내부입니다.

클릭할 부분의 사각형 좌표를 받아와서 그 중 랜덤한 위치를 클릭합니다.


랜덤딜레이

def randsleep(x,y):
    dx = x * 1000
    dy = y * 1000
    timed = random.randint(dx,dy) / 1000
    time.sleep(timed)

이니셜라이징

def init():
    x0, y0, x1, y1 = win32gui.GetWindowRect(bluestackhw)
    win32gui.MoveWindow(bluestackhw, x0, y0, 992, 572, True)
    print("reset")
    print("waiting...")

블택창의 크기를 조절합니다.

원래 이 부분에서 게스트 초기화가 이루어져야 했으나, 한섭은 불가능했으므로 빠져있습니다.

----------------------------------------------------

위 함수들을 제가 상황에 맞게 직접 만든 것이고,

def resetmara():
    ....

이라는 함수로 리세마라가 돌아가게 됩니다.

resetmara() 안에는 이렇게 구성되어 있습니다.

메인함수

if __name__ == "__main__":
    while 1:
        print("###############################")
        print("# 대상 디바이스 번호 : " + sys.argv[2])
        print("# 리세 횟수 : " + str(cycle))
        print("###############################")
        cycle = cycle + 1
        resetmara()
        while 1:
            print("계속하시겠습니까? (y / n) : ")
            a = input()
            if a == 'y':
                break
            else:
                continue

그렇습니다.


앞으로 리세매크로를 더이상 수정할 생각은 없습니다.

저도 무츠키 부분이 막히는게 아쉽긴 하지만, 그 부분 수정할려면 그 부분까지 리세를 해야해서 고치기 꺼려지는 부분이 있습니다.


제작자의 후기(?)

제가 만든 프로그램을 이렇게 많이 배포되고 사용되어진 것은 처음입니다.

비록 모든 컴퓨터에서 돌아갈 만큼 완성도가 높진 않았지만 단지 많은 사람들이 써주고 관심을 가져준다는 것 자체만으로도 감사했습니다.

이게임에 매크로를 적용할 부분이 있을지 모르겠으나, 다음에 기회가 된다면 또 들고 오겠습니다.

https://github.com/Dark-Lemon7z/BlueArchive