Página 1 de 1

Necesito ayuda con Bot PDoA

Publicado: 26 May 2011, 08:11
por ToXic
Hola brothers, necesito de su ayuda, a ver si me pueden dar una mano/tirarme alguna idea.

Les dejo el codigo, asi es mas facil explicar que necesito.
(El codigo lo escribi yo, asi que seguro esta lleno de errores y de seguro se puede optimizar mucho mas... tengan en cuenta que recien estoy en primer año y aprendiendo C...)

Código: Seleccionar todo

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("AutoBot PDoA By ToXic", 251, 147, 260, 159)
$Group1 = GUICtrlCreateGroup("AutoCaminar", 0, 0, 249, 121)
$Label1 = GUICtrlCreateLabel("Izquierda", 8, 24, 47, 17)
$Label2 = GUICtrlCreateLabel("Derecha", 8, 48, 45, 17)
$Label3 = GUICtrlCreateLabel("Arriba", 8, 72, 31, 17)
$Label4 = GUICtrlCreateLabel("Abajo", 8, 96, 31, 17)
$Input1 = GUICtrlCreateInput("", 56, 24, 49, 21)
$Input2 = GUICtrlCreateInput("", 56, 48, 49, 21)
$Input3 = GUICtrlCreateInput("", 56, 72, 49, 21)
$Input4 = GUICtrlCreateInput("", 56, 96, 49, 21)
$Label5 = GUICtrlCreateLabel("Secuencia", 144, 32, 64, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$Radio1 = GUICtrlCreateRadio("Derecha - Izquierda", 120, 48, 113, 17)
$Radio2 = GUICtrlCreateRadio("Arriba - Abajo", 120, 64, 113, 17)
$Radio3 = GUICtrlCreateRadio("Izq - Arri - Der - Abaj", 120, 80, 113, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Label6 = GUICtrlCreateLabel("", 24, 128, 193, 17)
GUICtrlSetColor(-1, 0x008000)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

EndSwitch

If WinWaitActive ("Pokemon:") == 1 Then

 if GUICtrlRead ($Radio1) == 1 then
	If $input1 > 0 then
		for $i = 0 to $Input1 Step 1
		 send ("{LEFT}")
	    Next
	 EndIf
	 if $Input2 > 0 Then
		 for $i=0 to $Input2 Step 1
			 Send("{RIGHT}")
		 Next
	 EndIf
 EndIf
 if GUICtrlRead ($Radio2) == 1 then
	If $input3 > 0 then
		for $i = 0 to $Input3 Step 1
		 send ("{UP}")
	    Next
	 EndIf
	 if $Input4 > 0 Then
		 for $i=0 to $Input4 Step 1
			 Send("{DOWN}")
		 Next
	 EndIf
 EndIf
 if GUICtrlRead ($Radio3) == 1 then
	If $input1 > 0 then
		for $i = 0 to $Input1 Step 1
		 send ("{LEFT}")
	    Next
	EndIf

	If $input3 > 0 then
		for $i = 0 to $Input3 Step 1
		 send ("{UP}")
	    Next
	EndIf

	 if $Input2 > 0 Then
		 for $i=0 to $Input2 Step 1
			 Send("{RIGHT}")
		 Next
	 EndIf

	 if $Input4 > 0 Then
		 for $i=0 to $Input4 Step 1
			 Send("{DOWN}")
		 Next
	 EndIf
  EndIf
 EndIf
#cs
if WinWaitActive("Charmander ") == 1 Then
MouseClick("LEFT",127,177,1)
EndIf
#ce
WEnd
Bien, hasta ahi masomenos hace lo que quiero, que camine... masomenos bien camina en el juego...
Ahora lo que quiero es que autocancele o autoataque en las batallas!!!!
Como podran ver en la parte comentada intente hacer algo con MouseClick y WinWaitActive, pero no funciona bien, hace click en cualquier lado y encima queda trabado xD)...

Les dejo dos img de los datos que me tiran las ventanas...
Imagen
(Click en la img para agrandar)

Imagen
(Click en la img para agrandar)

Bueno, no se si es muy complicado lo que pido, pero si alguno sabe el camino, que me tire una pista... ah, es la primera vez que programo con Autoit, piedad... jajajaja

Desde ya gracias, voy a aguardar su rta!!!!


PD: el juego se llama Pokemon: Den of Ages.

Re: Necesito ayuda con Bot PDoA

Publicado: 26 May 2011, 08:57
por ToXic
ya enontre el problema que se me trababa el mouse, el MoseClick era el problema, es mucho mejor con ControlClick... un pequeño pasito mas, aunque no hace click donde quiero... sera pq no toma la ventana del juego y toma toda la pantalla para hacer click en esas coord??? aunk igual le haya puesto el WinWait? o no tiene nada que ver...
Otra cosa, camino camino, aparece batalla, cancelo(manual) y el tipo no vuelve a caminar automaticamente... el error esta en el cod? o en el winwaitactive??? deberia usar otro?
Otra cosa, puedo poner un input dentro del Winwaitactive, para en ese input poner el nombre del bicho (que es el nombre de la ventana cuando va a una lucha) de esta forma solo cambiar el nombre por el bicho principal???
y mas complicado aun, puedo obtener de alguna forma cual va a ser el nombre de la ventana sin tener que poner el input???

Gracias!!!

Re: Necesito ayuda con Bot PDoA

Publicado: 26 May 2011, 19:52
por ToXic
Bueno, cambie algo... le puse que se active con una tecla (F4) y le cree una funcion, asi lo sacaba del while anterior y cree otro y ahi puse la funcion...

Código: Seleccionar todo

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

EndSwitch
If _IsPressed("73")then _ACT()
sleep(100)
WEnd

Func _ACT()
while(1)
WinWaitActive ("Pokemon:")
 if GUICtrlRead ($Radio1) == 1 then
	If $input1 > 0 then
		for $i = 0 to $Input1 Step 1
		 send ("{LEFT}")
		 Sleep(100)
		 if _IsPressed("73") then Return
	    Next
	 EndIf
	 if $Input2 > 0 Then
		 for $i=0 to $Input2 Step 1
			 Send("{RIGHT}")
			 Sleep(100)
			 if _IsPressed("73") then Return
		 Next
	 EndIf
 EndIf
 if GUICtrlRead ($Radio2) == 1 then
	If $input3 > 0 then
		for $i = 0 to $Input3 Step 1
		 send ("{UP}")
		 Sleep(100)
		 if _IsPressed("73") then Return
	    Next
	 EndIf
	 if $Input4 > 0 Then
		 for $i=0 to $Input4 Step 1
			 Send("{DOWN}")
			 Sleep(100)
			 if _IsPressed("73") then Return
		 Next
	 EndIf
 EndIf
 if GUICtrlRead ($Radio3) == 1 then
	If $input1 > 0 then
		for $i = 0 to $Input1 Step 1
		 send ("{LEFT}")
		 Sleep(100)
		 if _IsPressed("73") then Return
	    Next
	EndIf

	If $input3 > 0 then
		for $i = 0 to $Input3 Step 1
		 send ("{UP}")
		 Sleep(100)
		 if _IsPressed("73") then Return
	    Next
	EndIf

	 if $Input2 > 0 Then
		 for $i=0 to $Input2 Step 1
			 Send("{RIGHT}")
			 Sleep(100)
			 if _IsPressed("73") then Return
		 Next
	 EndIf

	 if $Input4 > 0 Then
		 for $i=0 to $Input4 Step 1
			 Send("{DOWN}")
			 Sleep(100)
			 if _IsPressed("73") then Return
		 Next
	 EndIf
 EndIf

WEnd
#cs
if WinWaitActive("Charmander ") == 1 Then
ControlClick("LEFT",135,526,1)
EndIf
#ce
EndFunc
Me vino la duda si el juego me registraba todos los sends, asi que le mande sleep despues de los sends, aunque estoy probando... creo que son un poco bajo los valores del sleep...
Si vieron el codigo notaran que puse if _IsPressed("73") then Return, para terminar el loop y que vuelva al principio... asi funciona, pero no queda linda, me parecen un monton de lineas al pedo... y seguramente haya mas... pero si lo ponia debajo del while no me funcionaba, si lo ponia a lo ultimo tampoco... es de la unica forma que me funciono!!!
aun tengo problemas con los winwaitactive, no se si son buenos para usar en este caso o si existe algo mejor...
bueno voy a ver si me inspiro un poco mas :smt033 !