;********************************************************************************
;ÀÌÆÄÀÏÀº ¿¹Á¦ ÆÄÀÏÀ» ¸¸µé±â À§ÇØ¼­
;¿ø·¡ ½ÇÁ¦ µ¿ÀÛµÇ´Â ½ºÅ©¸³Æ®¿¡¼­ 
;°¡»óÁ¶ÀÌ½ºÆ½À» ÀÌ¿ëÇÏ¿© Å°º¸µå¸¦ ÀÔ·ÂÇÏ´Â ºÎºÐ¸¸ ³²±â°í ±â´ÉÀ» Á¦°Å ÇÏ¿´½À´Ï´Ù.
;Á¶ÀÌ½ºÆ½º¯¼ö ¹× ÇÔ¼ö´Â ´ëºÎºÐ joy¸¦ Á¢µÎ¾î·Î ½ÃÀÛÇÏ¿© ÀÛ¼ºÇÏ¿´½À´Ï´Ù.
;°øºÎ¿ëµµ·Î¸¸ »ç¿ëÇÏ¼¼¿ä
;********************************************************************************
;
;
; AutoHotkey Version: 1.x
; Language:       English
; Platform:       Win9x/NT
; Author:         A.N.Other <myemail@nowhere.com>
;
; Script Function:
;	Template script (you can customize this template by editing "ShellNew\Template.ahk" in your Windows folder)
;
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
SetTitleMatchMode, 2
SendMode play  ; Recommended for new scripts due to its superior speed and reliability.
SetKeyDelay, 0, 50, Play
SetControlDelay, 30
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
;ÀÌ¹ÌÁö´Â À©µµ¿ì ³»¿¡¼­ Ã£°í, ¸¶¿ì½ºÅ¬¸¯Àº ÀüÃ¼È­¸éÀ¸·Î.
CoordMode Pixel, Relative  ; Interprets the coordinates below as relative to the screen rather than the active window.

Gui, Add, GroupBox, x6 y47 w120 h50 , status
Gui, Add, Text, x16 y67 w100 h20 , 
;Generated using SmartGUI Creator 4.0
;Gui, Show, x370 y238 h105 w134, New GUI Window

;Á¶ÀÌ½ºÆ½ ÃÊ±âÈ­
;gosub joyInit
joyInit()

; ctrl+L ´©¸£¸é ÀÚµ¿½ÃÀÛ
^l::
ifWinActive, GameWindowTitle ;°ÔÀÓÃ¢ÀÌ È°¼ºÈ­»óÅÂ¿¡¼­¸¸ µ¿ÀÛ
{
	keepRunning := true
	adjview :=A_TickCount - 600000 ;300000
	heal :=A_TickCount - 10000
	buff10 :=A_TickCount - 540000
	buff30 :=A_TickCount - 910000
	scool :=A_TickCount - 540000
	stoggle :=true
	
	;pKeyUp()
	Loop
	{
		;soundbeep
		;sleep 1000

		;keepRunningº¯¼ö°¡ trueÀÎ µ¿¾È ÀÚµ¿»ç³É ÀÛµ¿
		if not keepRunning 
			break
		;¸÷ Å¸°ÙÀ» ÀâÀ¸¸é
		if (target() = 1)
			attack() ;¸÷ °ø°Ý
	}
}
return

; PauseÅ° ´©¸£¸é ÀÚµ¿ ³¡
Pause::
	;;tooltip, %keepRunning%
	keepRunning := false
	cSend("{esc}")
return

; win+Z ´©¸£¸é Å»Ãâ
#z::
autoQuit()
return

; win+X Å×½ºÆ®¿ë ´ÜÃàÅ°
#x::
;cSend("{f12}")
;cSend("^{f12}")

;sleep 1000
;cClickDrag(1, 600, 350, 650, 350)

;autoQuit()
;msgBox %joysize%_%hjoy%

;joyButton(30,1)
;joyButton(31,1)
;joyButton(32,1)
;setJoyState()
;sleep 3000
;joyButton(10,0)
;setJoyState()
;resetJoyState()
soundbeep
return

;Á¶ÀÌ½ºÆ½¹æ½Ä ÃÊ±âÈ­
joyInit:
	;»ó¼öÁ¤ÀÇ
	GENERIC_READ:=0x80000000
	GENERIC_WRITE:=0x40000000
	GENERIC_ALL:=0x10000000
	FILE_SHARE_READ:=1
	FILE_SHARE_WRITE:=2
	OPEN_EXISTING:=3
	FILE_ANY_ACCESS:=0
	FILE_READ_DATA:=1
	FILE_WRITE_DATA:=2
	;ÄÁÆ®·Ñ ÄÚµå
	/*
	CTL_CODE ´Â ´ÙÀ½°ú °°ÀÌ µÇ¾î ÀÖ½À´Ï´Ù.
	#define CTL_CODE( DeviceType, Function, Method, Access ) ( \
	((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
	)
	¸¸µé¾îÁö´Â 32bit °ªÀÔ´Ï´Ù.
	*/
	FILE_DEVICE_UNKNOWN:=0x00000022
	FILE_DEVICE_PORTJOY:=FILE_DEVICE_UNKNOWN
	FUNCTION_INDEX:=0x0
	METHOD_BUFFERED:=0
	IOCTL_PPORTJOY_SET_STATE:=(FILE_DEVICE_PORTJOY<<16) | (FILE_ANY_ACCESS<<14) | (FUNCTION_INDEX<<2) | METHOD_BUFFERED
	;MsgBox ÄÁÆ®·ÑÅ©µå´Â %IOCTL_PPORTJOY_SET_STATE%

	;Á¶ÀÌ½ºÆ½ ÇÚµé
	; ¿¹Á¦ cÄÚµå => CreateFile(DevName,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
	hjoy := Dllcall("CreateFile", Str,"\\.\PPJoyIOCTL1", UInt,GENERIC_WRITE, UInt,FILE_SHARE_WRITE, uint,0, UInt,OPEN_EXISTING, UInt,0, UInt,0)
	if ( hjoy <= 0)
		msgBox Á¶ÀÌ½ºÆ½ ÇÚµéÀ» ¾òÁö¸øÇÔ ¸®ÅÏ°ª : %hjoy%

	;Á¶ÀÌ½ºÆ½ »óÅÂ ±¸Á¶Ã¼
	PPJOY_AXIS_MIN:=1
	PPJOY_AXIS_MAX:=32767
	PPJOY_AXIS_MID:=(PPJOY_AXIS_MIN+PPJOY_AXIS_MAX)/2
	JOYSTICK_STATE_V1:=0x53544143

	joysize:=VarSetCapacity(joystate, (4 + 1+8*4 + 1+32*1) ) ;ÇØ´õ4 + Ãà¼ö1 + Ãà¼ö*4¹ÙÀÌÆ® + ¹öÆ°¼ö + ¹öÆ°¼ö*1¹ÙÀÌÆ®
	JOYSTICK_STATE_V1:=0x53544143
	NumPut(JOYSTICK_STATE_V1, joystate, 0, 4) ;ÇØ´õ
	NumPut(8, joystate, 4, 1) ;Ãà¼ö 8
	loop 8
		NumPut(PPJOY_AXIS_MID, joystate, 4+1+(A_Index-1)*4, 4) ;1Ãà 0ºÎÅÍ
	NumPut(32, joystate, 4+1+8*4, 1) ;¹öÆ°¼ö 32
	loop 32
		NumPut(0, joystate, 4+1+8*4+1+(A_Index-1), 1) ;1¹ø ¹öÆ° 0ºÎÅÍ
	
	;ÃÊ±âÈ­¿ë ½ºÆ®·°Ã³ º¹»çÇÒÁÙ ¸ô¶ó¼­ ÇÑ°³´õ¸¸µë
	VarSetCapacity(resetjoystate, (4 + 1+8*4 + 1+32*1) ) ;ÇØ´õ4 + Ãà¼ö1 + Ãà¼ö*4¹ÙÀÌÆ® + ¹öÆ°¼ö + ¹öÆ°¼ö*1¹ÙÀÌÆ®
	NumPut(JOYSTICK_STATE_V1, resetjoystate, 0, 4) ;ÇØ´õ
	NumPut(8, resetjoystate, 4, 1) ;Ãà¼ö 8
	loop 8
		NumPut(PPJOY_AXIS_MID, resetjoystate, 4+1+(A_Index-1)*4, 4) ;1Ãà 0ºÎÅÍ
	NumPut(32, resetjoystate, 4+1+8*4, 1) ;¹öÆ°¼ö 32
	loop 32
		NumPut(0, resetjoystate, 4+1+8*4+1+(A_Index-1), 1) ;1¹ø ¹öÆ° 0ºÎÅÍ 31,32¹öÆ°Àº ¾ÈµÇ³× ¤Ñ,.¤Ñ
	;½ºÆ®·°Ã³ º¹»ç ¸ð¸£°Ú´Ù ¤Ð.¤Ð
	;resetjoystate := joystate ;±âº»»óÅÂ ÀúÀå
	;loop joysize
	;	NumPut( NumGet(joystate,A_index,1), resetjoystate, A_Index,1)
return

setJoyState:
	dummy:=0
	r:=dllCall("DeviceIoControl", uint,hjoy, uint,IOCTL_PPORTJOY_SET_STATE, uint,&joystate, uint,joysize, uint,0, uint,0, uint,&dummy, uint,0)
	if !r
	{
		err:=dllCall("GetLastError")
		MsgBox set¿¡·¯%err%
	}
return

resetJoyState:
	dummy:=0
	r:=dllCall("DeviceIoControl", uint,hjoy, uint,IOCTL_PPORTJOY_SET_STATE, uint,&resetjoystate, uint,joysize, uint,0, uint,0, uint,&dummy, uint,0)
	if !r
	{
		err:=dllCall("GetLastError")
		MsgBox reset¿¡·¯%err%
	}
return

joyInit()
{
	gosub joyInit
}
setJoyState() ;Á¶ÀÌ½ºÆ½ »óÅÂ º¯°æ
{
	gosub setJoyState
}
resetJoyState() ;ÃÊ±â»óÅÂ·Î º¯°æ
{
	gosub resetJoyState
}
clearJoyState() ;ÇÁ·Î±×·¥ÀÇ Á¶ÀÛ ±¸Á¶Ã¼ ÃÊ±â»óÅÂ·Î º¯°æ
{
	global joystate
	global PPJOY_AXIS_MID
	;global resetjoystate
	;joystate:=resetjoystate
	loop 8
		NumPut(PPJOY_AXIS_MID, joystate, 4+1+(A_Index-1)*4, 4) ;1Ãà 0ºÎÅÍ
	loop 32
		NumPut(0, joystate, 4+1+8*4+1+(A_Index-1), 1) ;1¹ø ¹öÆ° 0ºÎÅÍ
}
joyAxis(index, val)
{
	global joystate
	global PPJOY_AXIS_MIN
	global PPJOY_AXIS_MAX
	global PPJOY_AXIS_MID
	
	if val < 0
		val := PPJOY_AXIS_MIN
	else if val = 0
		val := PPJOY_AXIS_MID
	else
		val := PPJOY_AXIS_MAX
	
	NumPut(val, joystate, 4+1+(index-1)*4, 4) ;1Ãà 0ºÎÅÍ
}
joyButton(bindex, val)
{
	global joystate
	NumPut(val, joystate, 4+1+8*4+1+(bindex-1), 1) ;1¹ø ¹öÆ° 0ºÎÅÍ
}
joyMove(x,y)
{
}
joyClickMove(btn,x1,y1,x2,y2)
{
}
;joySend(sss)´Â sss¹®ÀÚ¿­ °ªÀ» °Ë»çÇÏ¿© Á¶ÀÌ½ºÆ½ ±¸Á¶Ã¼¿¡ °ªÀ» ÇÒ´çÇÑ´Ù.
;
joySend(sss)
{
	;msgBox joysend_%sss%
	clearJoyState()
	sss2 := sss
	if (SubStr(sss2, 1, 1) = "^")
	{
		joyButton(8,1)
		sss2 := SubStr(sss2, 2)
	}
	else if(SubStr(sss2, 1, 1) = "!")
	{
		joyButton(9,1)
		sss2 := SubStr(sss2, 2)
	}
	else if(SubStr(sss2, 1, 1) = "+")
	{
		joyButton(10,1)
		sss2 := SubStr(sss2, 2)
	}
	
	if (sss2 = "{esc}")
		joyButton(6,1)
	else if (sss2 = "{tab}")
		joyButton(7,1)
	else if (sss2 = "{f1}")
		joyButton(11,1)
	else if (sss2 = "{f2}")
		joyButton(12,1)
	else if (sss2 = "{f3}")
		joyButton(13,1)
	else if (sss2 = "{f4}")
		joyButton(14,1)
	else if (sss2 = "{f5}")
		joyButton(15,1)
	else if (sss2 = "{f6}")
		joyButton(16,1)
	else if (sss2 = "{f7}")
		joyButton(17,1)
	else if (sss2 = "{f8}")
		joyButton(18,1)
	else if (sss2 = "{f9}")
		joyButton(19,1)
	else if (sss2 = "{f10}")
		joyButton(20,1)
	else if (sss2 = "{f11}")
		joyButton(21,1)
	else if (sss2 = "{f12}")
		joyButton(22,1)
	else if (sss2 = "z")
		joyButton(23,1)
		
	winActivate, GameWindowTitle
	setJoyState()
	sleep 100
	resetJoyState()	
}
;Á¶ÀÌ½ºÆ½¹æ½Ä ³¡

;¿ìÈ¸¹æ½Ä=autohotkeyÀÇ send()ÇÔ¼ö°¡ ¸ÔÈ÷Áö ¾ÊÀ¸¹Ç·Î °¡»óÁ¶ÀÌ½ºÆ½À¸·Î ¿ìÈ¸ÇÏ¿© Å°º¸µå ÀÔ·Â Ã³¸®
cSend(sss)
{
	global keepRunning
	if not keepRunning
	{
		return
	}
	
	;Á¶ÀÌ½ºÆ½À¸·ÎÃ³¸®
	joySend(sss)
	return
}

;¿ÀÅäÇÖÅ°ÀÇ ±âº»ÇÔ¼ö°¡ ¾ÈµÉ ¶§ ¸¶¿ì½º Å¬¸¯½ÅÈ£¸¦ Program Manager¸¦ È£ÃâÇÏ¿© ¿ìÈ¸ÇÏ¿© °ÔÀÓÀ¸·Î ¸¶¿ì½º ½ÅÈ£¸¦ º¸³À´Ï´Ù.
cClickDrag(btn, x1, y1, x2, y2)
{
	CoordMode, Mouse, Screen
	winActivate, Program Manager
	sleep 90
	WinGetPos, X, Y, Width, Height, GameWindowTitle
	if (btn = 0)
	{
		MouseClickDrag, left, X+x1,  Y+y1, X+x2, Y+y2
	}
	else ;1ÀÌ¸é ¿ìÅ¬¸¯
	{
		MouseClickDrag, right, X+x1,  Y+y1, X+x2, Y+y2
		;soundbeep
	}
}
;¿ìÈ¸¹æ½Ä ³¡

RemoveToolTip:
	SetTimer, RemoveToolTip, Off
	ToolTip
return

;¸÷ÀÌ ³Ê¹« °­ÇØ¼­ ¹°¾àÀ¸·Î hpÈ¸º¹ÀÌ ¾ÈµÇ°í ÀÏÁ¤¼öÄ¡ ÀÌÇÏÀÏ¶§ °ÔÀÓÀ» ³¡³À´Ï´Ù.
autoQuit()
{
	;¿ìÈ¸
	cSend("!z")
	sleep 1000
	cClickDrag(0, 500, 400, 500, 400)
	sleep 500
	cClickDrag(0, 440, 240, 440, 240)
	
	keepRunning := false
}

;ÇÃ·¹ÀÌ¾î Ä³¸¯ÅÍÀÇ HP¸¦ °Ë»çÇÏ¿© ¹°¾àÀ» ¸Ô½À´Ï´Ù.
autoHP()
{
	;PixelSearch, FoundX, FoundY, 132, 73, 135, 76, 0x080C18, 3, Fast
	PixelSearch, FoundX, FoundY, 10, 71, 210, 72, 0x000000, 3, Fast
	if ErrorLevel = 0 
	{
		pro := (FoundX - 10) * 100 / 200
		;tooltip, ÇÇ¾à¸ÔÀÚ%FoundX%_%FoundY%_%pro%pro		
		if ( pro < 80 )
		{
			cClickDrag(0, 30, 30, 30, 30) ;Ä³¸¯Âï°í
			sleep 150
			;¿ìÈ¸
			cSend("{f7}")
			cSend("{f8}")
		}
		return pro
	}
	return 100 ;¸øÃ£À¸¸é 100%
}

;ÇÃ·¹ÀÌ¾î Ä³¸¯ÅÍÀÇ MP¸¦ °Ë»çÇÏ¿© ¹°¾àÀ» ¸Ô½À´Ï´Ù.
autoMP()
{
	;PixelSearch, FoundX, FoundY, 132, 83, 135, 89, 0x211410, 3, Fast
	PixelSearch, FoundX, FoundY, 10, 83, 210, 84, 0x000000, 3, Fast
	if ErrorLevel = 0 
	{
		pro := (FoundX - 10) * 100 / 200
		;tooltip, ¿¥¾à¸ÔÀÚ%FoundX%_%FoundY%_%pro%pro		
		if ( pro < 55 )
		{
			;¿ìÈ¸
			cSend("{f11}")			
		}
		return pro
	}
	return 100 ;¸øÃ£À¸¸é 100%
}

searchMob()
{
	global keepRunning

	;¸÷HP ¹Ù¸¦ °Ë»ö
	ImageSearch, FoundX, FoundY, 150, 50, 800, 440, *40 ¸÷¹Ù3.bmp
	;if false ;ErrorLevel = 0 
	if ErrorLevel = 0 
	{	
		sx := FoundX+20
		sy := FoundY+1
		
		;¸÷Å¬¸¯
		cClickDrag(0, sx, sy, sx, sy)
		sleep 100
		
		;¸÷Ã£¾Æ¼­ 1¸®ÅÏ
		return 1
	}
	;¸÷ ¸øÃ£¾Æ¼­ 0¸®ÅÏ
	return 0
}

;¸÷ °ø°Ý
attack()
{
	;¸÷À» °ø°ÝÇÏ´Â ·çÆ¾ÀÔ´Ï´Ù.
	;°³·«ÀûÀÎ ºÎºÐ¸¸ ³²±â°í ³»¿ëÀ» Áö¿ü½À´Ï´Ù.

	global keepRunning
	global adjview
	global heal
	global scool
	global stoggle
	atime :=A_TickCount
	ctime :=A_TickCount


	;Å¸°ÙÀÌ ¾øÀ¸¸é ¸ÕÀúÀâ°í 
	mhp := mobHP()
	if(mhp=4)
		return ;·çÇª¿¡¼­ Å¸°ÙÀâÀ½	

	;Á×À»¶§±îÁö°ø°Ý
	Loop 100
	{
		;¿ìÈ¸ , f2, f3Àº ½ºÅ³ ´ÜÃàÅ° ·Î ¸÷À» Ä£´Ù
		cSend("{f2}") 
		sleep 850
		cSend("{f3}")
		sleep 850

		;Ä³¸¯ÇÇ°¡ 30%ÀÌÇÏ¸é ÀÚµ¿Å»Ãâ		
		if (autoHP() < 30)
			autoQuit()
		
		mhp := mobHP()
		;tooltip, mhp:%mhp%¾Øa_index:%a_index%
		if (mhp=1) ;¸÷»§ÇÇ(Á×À¸)¸é ·çÇÁÅ»Ãâ
		{
			;;tooltip, ¸÷»§ÇÇ
			;soundbeep
	
			;¿ìÈ¸
			cSend("{f10}") ;ÇÑ´ëÄ¡ÀÚ
			sleep 300
						
			crntHP :=autoHP()
			;¸¶¹ý»ç
			if (job1 and crntHP < 85 and A_TickCount - corpsehp > 60000 ) ;ÇÇ°¡ 85%ÀÌÇÏÀÌ°í ÄðÅ¸ÀÓ ³¡³µÀ»¶§
			{
				cSend("{f6}") ; ¸¶¹ý»ç ÇÇÃ¼¿ì±â ½ºÅ³ ´ÜÃàÅ° f6
				corpsehp := A_TickCount
				sleep 900
			}
			else
				traytip, %xxx%_%corpsehp%	

			autoMP() ;mpÆ÷¼Ç ¸Ô´Â´Ù
			return
		}
		if (mhp=4) ;³ëÅ¸°Ù ·çÇÁÅ»Ãâ
		{
			;msgbox, ³ëÅ¸°Ù1
			;tooltip, ³ëÅ¸°Ù1
			return		
		}
		if not keepRunning ;esc½Ã °ø°Ý¸ØÃã
		{
			;tooltip, esc´­·Á_ÁßÁöÇÔ
			return
		}
	}	
}

;È­¸é È¸Àü
turn()
{
	;¸÷À» Ã£À»¶§ Áö±Ý È­¸é¿¡ ¾øÀ¸¸é
	;Á¦ÀÚ¸®¿¡¼­ È¸ÀüÇÏ¸é¼­ Ã£´Â ·çÆ¾
	;³»¿ëÀ» Áö¿ü½À´Ï´Ù.
}

;¸÷ Å¸°ÙÆÃ ÇÏ±â
target()
{
	;¸÷Ã£´Â ·çÆ¾
	;È­¸é»ó ÀÌ¹ÌÁö °Ë»öÀ¸·Î Ã£½À´Ï´Ù.
	;³»¿ëÀ» Áö¿ü½À´Ï´Ù.
}

;°ø°ÝÇØµµ µÇ´Â ¸÷ÀÎÁö ÀÌ¸§°ú ¸öÀÇ HP°Ë»ç
checkmob()
{
	checkS =¸÷ÀÌ¸§1, ¸÷ÀÌ¸§2, ¸÷ÀÌ¸§3, ¸÷ÀÌ¸§4
	StringSplit, checkA , checkS, `,

	;°ø°ÝÇÏ¸é ¾ÈµÇ´Â ¸÷ÀÇ ÀÌ¸§À» È­¸é»ó ÀÌ¹ÌÁö·Î °Ë»ç
	loop, %checkA0% 
	{
		checkN := checkA%a_index%
		ImageSearch, FoundX, FoundY, 500, 0, 700, 45, *10 %checkN%.bmp
		;;tooltip, %checkN%_err%ErrorLevel%
		if ErrorLevel = 0 ;¹ß°ß
		{
			;soundbeep
			return 1
		}
	}
		
	;Á×Àº¸÷ Ã¼Å© = »§ÇÇ
	;´Ù¸¥»ç¶÷ÀÌ Àâ´Â ¸÷ÀÎÁö Ã¼Å© = ÇÇÁß°£
	if (mobHP() == 3) ;¸¸ÇÇ¸÷ÀÌ¹Ç·Î °ø°ÝÇØµµ ÁÁ´Ù
		return 0
	if (mobHP() == 2) ;
		return 2
	;soundbeep
	return 1
}

mobHP()
{
	;¸÷ÀÇ ³²Àº HP¸¦ °Ë»çÇÏ´Â ·çÆ¾
	;È­¸é»ó ÀÌ¹ÌÁö °Ë»öÀ¸·Î Ã£½À´Ï´Ù.
	;³»¿ëÀ» Áö¿ü½À´Ï´Ù.
}
