피싱마스터 매크로 만들기



안녕하세요 :)


이번 포스팅은 피싱마스터 모바일 게임

매크로만들기에 관한 포스팅을 하겠습니다.


피싱마스터 모바일 게임은 낚시 게임으로

낚시의 캐스팅, 챔질, 릴링의 요소가 잘갖추어진 

게임으로 실제 낚시형태와 유사한듯합니다.



포스팅순서는 피싱마스터 게임에대한 간략한 소개와

비활성 이미지서치에대한 포스팅을 하도록 하겠습니다.


시작하기전 당부의 말씀을 드리면 본 포스팅은 프로그램 배포는 하지않습니다.

제작방법을 알려드리는 포스팅 이며 제작방법에 대한 강의나 스크립트 의뢰는 가능합니다 :D


피싱마스터 매크로 만들기 피싱마스터 매크로 만들기

피싱마스터 매크로 만들기 피싱마스터 매크로 만들기


피싱마스터 모바일 게임 



게임빌에서 개발한 모바일 낚시 게임으로 , 에너지를 소모하여 플레이 할 수 있습니다.

에너지는 일정시간이후 회복이 되거나, 캐시 구매를 통해 얻을수 있는 스타로 구매할 수 있습니다.


기본 조작은 낚시대를 물가로 던지는 캐스팅과, 낚아올리는 챔질, 물고기를 끌고오는 릴링으로

구성되어 있으며 물고기의 상태에 따라 게이지등 공략에 약간의 차이가 있습니다.


낚시 게임이지만 특유의 그래픽적인 요소도 잘 살려낸 게임 입니다.

각 캐릭터마다 다양한 코스튬을 장착 할 수 있으며 다양한 미끼를 사용할 수 있습니다.



피싱마스터 매크로 만들기 피싱마스터 매크로 만들기


피싱마스터 매크로 만들기 피싱마스터 매크로 만들기

피싱 마스터 매크로 제작 - 매크로 제작 방법은 ?


전체 소스를 공개하기에는 무리가 있어 

제작방법에 대한 안내의 포스팅으로 진행하겠습니다.


아래는 피싱마스터 매크로를 제작할때 사용한 비활성 이미지서치 함수와에 대한

안내가 있으니 직접 제작해보실 분들은 관련 함수를 참고하시면 좋을듯합니다.



오토핫키 스크립트 작성법이나 다른 스크립트 제작의뢰도 같이 받고있습니다.

이메일 : cai6452@naver.com


피싱마스터 매크로 만들기 피싱마스터 매크로 만들기

피싱마스터 매크로 - 스크립트 제작방법



물론 이미지서치는 굳이 비활성 이미지서치를 사용할 필요는 없습니다.

활성 ImageSearch 명령어로도 충분히 제작이 가능하며 

오히려 더 쉽게 코드를 작성 할 수 있습니다.


* Gdip ImageSearch를 사용하기 위해서는 Gdip 라이브러리가 필요합니다.


1.    먼저 반복구문의 형태를 구성해야 합니다. 

Loop 문으로 할건지, Settimer 로 할건지 Goto 로 할건지 정한이후

반복구문안에 이미지서치 함수를 사용하여 조건문을 구성합니다.


2.    이미지서치 성공의 경우 ControlClick 혹은 MouseClick 명령어를 사용해서 

클릭이벤트를 발생 합니다. 끊김이나 오류없는 반복을 위해서는 예외로 나타날수있는

팝업 메세지나 문구에대한 이미지 반응도 염두하여 코드를 작성해야 합니다.



Gdip_ImageSearch(pBitmapHaystack,pBitmapNeedle,ByRef OutputList=""

,OuterX1=0,OuterY1=0,OuterX2=0,OuterY2=0,Variation=0,Trans=""

,SearchDirection=1,Instances=1,LineDelim="`n",CoordDelim=",") {


    ; Some validations that can be done before proceeding any further

    If !( pBitmapHaystack && pBitmapNeedle )

        Return -1001

    If Variation not between 0 and 255

        return -1002

    If ( ( OuterX1 < 0 ) || ( OuterY1 < 0 ) )

        return -1003

    If SearchDirection not between 1 and 8

        SearchDirection := 1

    If ( Instances < 0 )

        Instances := 0


    ; Getting the dimensions and locking the bits [haystack]

    Gdip_GetImageDimensions(pBitmapHaystack,hWidth,hHeight)

    ; Last parameter being 1 says the LockMode flag is "READ only"

    If Gdip_LockBits(pBitmapHaystack,0,0,hWidth,hHeight,hStride,hScan,hBitmapData,1)

    OR !(hWidth := NumGet(hBitmapData,0))

    OR !(hHeight := NumGet(hBitmapData,4))

        Return -1004


    ; Careful! From this point on, we must do the following before returning:

    ; - unlock haystack bits


    ; Getting the dimensions and locking the bits [needle]

    Gdip_GetImageDimensions(pBitmapNeedle,nWidth,nHeight)

    ; If Trans is correctly specified, create a backup of the original needle bitmap

    ; and modify the current one, setting the desired color as transparent.

    ; Also, since a copy is created, we must remember to dispose the new bitmap later.

    ; This whole thing has to be done before locking the bits.

    If Trans between 0 and 0xFFFFFF

    {

        pOriginalBmpNeedle := pBitmapNeedle

        pBitmapNeedle := Gdip_CloneBitmapArea(pOriginalBmpNeedle,0,0,nWidth,nHeight)

        Gdip_SetBitmapTransColor(pBitmapNeedle,Trans)

        DumpCurrentNeedle := true

    }


    ; Careful! From this point on, we must do the following before returning:

    ; - unlock haystack bits

    ; - dispose current needle bitmap (if necessary)


    If Gdip_LockBits(pBitmapNeedle,0,0,nWidth,nHeight,nStride,nScan,nBitmapData)

    OR !(nWidth := NumGet(nBitmapData,0))

    OR !(nHeight := NumGet(nBitmapData,4))

    {

        If ( DumpCurrentNeedle )

            Gdip_DisposeImage(pBitmapNeedle)

        Gdip_UnlockBits(pBitmapHaystack,hBitmapData)

        Return -1005

    }

    

    ; Careful! From this point on, we must do the following before returning:

    ; - unlock haystack bits

    ; - unlock needle bits

    ; - dispose current needle bitmap (if necessary)


    ; Adjust the search box. "OuterX2,OuterY2" will be the last pixel evaluated

    ; as possibly matching with the needle's first pixel. So, we must avoid going

    ; beyond this maximum final coordinate.

    OuterX2 := ( !OuterX2 ? hWidth-nWidth+1 : OuterX2-nWidth+1 )

    OuterY2 := ( !OuterY2 ? hHeight-nHeight+1 : OuterY2-nHeight+1 )


    OutputCount := Gdip_MultiLockedBitsSearch(hStride,hScan,hWidth,hHeight

    ,nStride,nScan,nWidth,nHeight,OutputList,OuterX1,OuterY1,OuterX2,OuterY2

    ,Variation,SearchDirection,Instances,LineDelim,CoordDelim)


    Gdip_UnlockBits(pBitmapHaystack,hBitmapData)

    Gdip_UnlockBits(pBitmapNeedle,nBitmapData)

    If ( DumpCurrentNeedle )

        Gdip_DisposeImage(pBitmapNeedle)


    Return OutputCount

}



피싱마스터 매크로 만들기 피싱마스터매크로 매크로 피싱마스터

Posted by Khan64
,

메이플 거짓말탐지기 매크로 만들기




안녕하세요 :)


이번 포스팅에선 메이플 스토리 거짓말탐지기에

관한 매크로를 만들어 보았습니다.


포스팅 순서는 코드 작성 방식에 관한 간략한 내용과

코드작성후 촬영한 영상, 방해요소에 대한 순서로

작성 하도록 하겠습니다.



시작하기 전 당부의 말씀을 드리면 본 포스팅은 프로그램을 판매하거나 배포하지 않습니다.




메이플 거짓말탐지기 매크로 만들기



메이플에서 자동사냥 플레이어를 막기위해 도입된 시스템으로 그 역할은 어느정도는 잘 수행하고 있는것 같습니다. 패턴인식이나, 이미지서치, ocr 같은 방응형 프로그램으로는 직접풀기에는 어려움이 있기도 하구요.


키보드 자체에도 녹화 매크로기능이 있는 것부터 ,관련 유틸까지 매크로를 구하는데 어려움이 없어, 사용하는 유저들이 많지만 이러한 외부적인 요소 때문에 직접 해제는 어렵더라도 알림정도로 사용하려는 분들이 꽤 많은듯 합니다.


창을 여러개 띄어둔이후에 'Errorlevel = 1' 을 이용해 알림만 받아서 사용하는 방법이나,

카카오톡과 같은 SNS를 이용해서 알림을 전송받고 해제하도록 사용하시는 분들도 있을겁니다.  

이번 포스팅 에서는 해당 이미지를 촬영하고, SNS로 전송, 답변을 받기까지 작성해보았습니다.



메이플 거짓말 탐지기 알리미




메이플 거짓말탐지기 매크로 만들기




서치이후에 찾아낸 좌표의 변수를 기억하고 해당 좌표부터 일정영역까지 

외부 캠 어플리케이션을 이용해서 촬영하도록 하였습니다. 

촬영이후에는 카카오톡으로 촬영한 gif 파일을 보내었습니다.


여기서 한가지 예상하지 못했던점은, 한글을 전송한이후에 Clipboard 에 저장한 단어를 

붙여넣기(Ctrl+v/Shift+Insert)로 보낼 수가 없었습니다.


때문에 입력받은 한글을 한글 자모 개별로 키 입력을 하도록 코드를 작성해야 했습니다.

입력받은 문장을 우선 한글자씩 뽑아낸뒤 초성과 중성, 종성으로 분리하도록 진행하였습니다.

여기서 주의해야 하는점은 초성과 종성은 배당번호가 겹받침 때문에 다른코드가 나오게됩니다.


때문에 종성의 경우 한번더 변환되도록 코드를 작성해야 합니다. 

실제로 한글에서 사용가능한 모든 글자수는 11172 자로서 한글<>유니코드 변환공식을 보면


[{(초성)×588}+{(중성)×28}+(종성)]+44032


추출할 한글 유니코드값에서 44032를 빼준이후에 28로 나눈 나머지가

바로 한번더 변환과정을 거쳐야할 종성코드가 되겠습니다.





초성 ㄱ, ㄴ, ㄷ, ㄹ, ㅁ, ㅂ, ㅅ, ㅇ, ㅈ, ㅊ, ㅋ, ㅌ, ㅍ, ㅎ, ㄲ, ㄸ, ㅃ, ㅆ, ㅉ
중성 ㅏ, ㅑ, ㅓ,ㅕ, ㅗ, ㅛ, ㅜ, ㅠ, ㅡ, ㅣ, ㅐ, ㅒ, ㅔ, ㅖ, ㅘ, ㅙ, ㅚ, ㅝ, ㅞ, ㅟ, ㅢ 
종성 ㄱ, ㄴ, ㄷ, ㄹ, ㅁ, ㅂ, ㅅ, ㅇ, ㅈ, ㅊ, ㅋ, ㅌ, ㅍ, ㅎ, ㄲ, ㄳ, ㄵ, ㄶ, ㄺ, ㄻ, ㄼ, ㄽ, ㄾ, ㄿ, ㅀ, ㅄ, 


19×21(초+중) + 19×21×27(초+중+종) = 11172 입니다.



메이플 거짓말 탐지기 매크로 만들기



위와 같은 방식으로 한글을 전송받지 않고도 편법으로 조금더 쉬운방법은 있습니다.

한글의 경우 합성자모 (ㄻ , ㅙ ...) 와 같은것때문에 키보드와 서로 대응되지 않습니다.


실제 'ㄱ' 을 Clipboard 에 저장한이후 

한영키를 번갈아가며 누르면서 Sendinput, %Clipboard% 명령어를 내보내면 ㄱ 만 나오는대신에


' r ' 를 Clipbaoard 에 저장한 이후 

한영키를 번갈아가며 누르면서 Sendinput, %Clipboard% 명령어를 내보내면 r , ㄱ 두가지가 나오는것을 확인할 수 있습니다. 



여기서 조금 살펴보면 영어로 입력을 받았을경우 별다른 과정없이 한영키 입력하나로

한글로 바로 대응시켜 입력을 보낼수 있는것을 알 수 있습니다.





현재 한글입력인지 영어 입력인지 확인하는 함수.

HanEnCheck()

IfEqual, hWnd,, WinGet, hWnd, ID, A 

DefaultIMEWnd  := DllCall( "imm32\ImmGetDefaultIMEWnd", "UInt", hWnd) 

DetectSaved = %A_DetectHiddenWindows% 

DetectHiddenWindows, On 

SendMessage, 0x283, 5, 0,, ehl_id %DefaultIMEWnd% 

IfNotEqual, A_DetectHiddenWindows, %DetectSaved%, DetectHiddenWindows, %DetectSaved% 

Return  ErrorLevel 

}



메이플스토리 메이플 메이플매크로 거짓말탐지기 거탐 알리미 알림이 거탐알리미 거탐알림이

메이플거탐 메이플 거탐 메이플 거탐매크로 거탐매크로알리미 탐지기알리미 탐지기 알림이

탐지기알림이 거짓말 탐지기거탐매크로 거탐거탐거탐매크로 거탐 매크로 거탐매크로



Posted by Khan64
,

오토핫키 명령어 속도체크 하는법





안녕하세요.


오늘은 오토핫키에서 사용하는 명령어의 속도를

측정할 수 있는 스크립트를 작성해보도록 하겠습니다.


프로그래밍을 하다가 특정블록이나 함수등

성능 측정을 해야 하는 경우가 종종 있는데,

그 측정도구로 사용 할 수 있습니다.






오토핫키 명령어 속도체크 하는법



QueryPerformanceCounter , QueryPerformanceFrequency



스크립트 코드는 간단하게 사용 할 수 있습니다.

눈에띄는 것으로는 크게 두가지가 보이는데. 각 함수의 의미를 살펴보면


QPF 는 CPU가 초당 몇번의 카운팅을 하는지 알아볼 수 있고

QPC 는 현재 얼만큼 카운팅 되었는지 알수 있습니다.


추출한 두값을 이용해 차이값을 계산한후 QPF로 나누어 준다면

원하는 명령어를 동작하는데 걸린 시간값을 추출 할 수 있습니다.




# 오토핫키 # 명령어 # 속도체크 # 하는법

Posted by Khan64
,