Files
GT7-Scripts/bnowakow/PanAmerican1 V0.981 dpad and x.AHK
Bartek Dobrowolski-Nowakowski 07743bbf25 add newer versions
2022-04-15 19:06:10 +02:00

672 lines
16 KiB
AutoHotkey

#NoEnv
#MaxHotkeysPerInterval 99000000
#HotkeyInterval 99000000
#KeyHistory 0
#Include Lib\Gdip.ahk
;#include Lib\AHK-ViGEm-Bus.ahk
ListLines Off
Process, Priority, , A
SetBatchLines, -1
SetKeyDelay, -1, -1
SetMouseDelay, -1
SetDefaultMouseSpeed, 0
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
DetectHiddenWindows, On
#Persistent
; --------- Controls
accel := "Enter"
turnLeft := "Left"
turnRight := "Right"
brake := "Up"
nitros := "Down"
; RUF pink 0x583375
; --------- Constants
; Time at turn in seconds and Stablizing control
t := 220000
intensity := 230
delay := 160
init_delay := 10000
MenuDirect := "Right"
Menu_loops := 6
menu_s := 1
box_size := 3
color_check1 := 0xBBE044
color_check2 := 0xBBE044
color_2_delay := 1500
color_tyre_overheat := 0xD42304
tyres_overheating := false
tyreX := 166
tyreY := 364
; resolution parameters and pixel search locations
ps_win_width := 640
ps_win_height := 360
pix1x := 458
pix1y := 114
pix2x := 607
pix2y := 319
tolerance := 20
bm_delay := 100
box_size := 2
ps_load_time1 := 14000
ps_load_time2 := 7000
ps_load_time3 := 8400
/*
; Create a new controller controller
controller := new ViGEmDS4()
controller.SubscribeFeedback(Func("OnFeedback"))
OnFeedback(largeMotor, smallMotor, lightbarColor){
;OutputDebug % "AHK| Feedback received - LargeMotor: " largeMotor ", SmallMotor: " smallMotor ", LightBarColor: " lightbarColor
}
*/
; ---------- Gui Setup -------------
Gui, -MaximizeBox
Gui, 2: -MaximizeBox
Gui, 2: -MinimizeBox
Gui, Color, c282a36, c6272a4
Gui, Add, Button, x15 y10 w70 default, Start
Gui, Add, Button, x15 y40 w70 default gVariableWindow, Variables
Gui, Add, Button, x15 y70 w70 default gGetColo_p, Stuck Leaderboard
Gui, Add, Button, x110 y70 w70 default gGetColo_g, Stuck Replay
Gui, Add, Button, x110 y10 w70 default gMenuTest, MenuTest
Gui, Add, DropDownList, w50 Choose1 vMenuDirect, Right|Left
Gui, Add, Edit, vMenu_loops w20 x165 y39, 6
Gui, Font, ce8dfe3 s9 w550 Bold
Gui, Add, Radio, Group x15 y115 altsubmit Checked gPSystem vSysCheck, PS5
Gui, Add, Radio, x70 y115 altsubmit gPSystem, PS4
;Gui, Add, Radio, Group x15 y130 altsubmit Checked gMenuSel vMenuCheck, Pixel
;Gui, Add, Radio, x70 y120 altsubmit gMenuSel, Timing
Gui, Add, Button, x70 y135 w70 default gReset, Reset
Gui, Font, ce8dfe3 s9 w550 Bold
;--------- Gui 2 Setup --------------
Gui, 2: Color, c535770, c6272a4
Gui, 2: Font, c11f s9 Bold
Gui, 2: Add, Text,, Turn Length (time miliseconds)
Gui, 2: Add, Edit, w70 vA, %t%
Gui, 2: Add, Text,, Turn Intensity
Gui, 2: Add, Edit, w40 vB, %intensity%
Gui, 2: Add, Text,, Turn Delay
Gui, 2: Add, Edit, w40 vC, %delay%
Gui, 2: Add, Text, x100 y90, Color 2 Delay
Gui, 2: Add, Edit, x100 y110 w40 vD, %color_2_delay%
Gui, 2: Add, Button, x20 y170 gSaveVars, Save
Gui, 2: Add, Button, x100 y170 gVarDef, Defaults
Gui, Show,w220 h170, GT7 Pan American AFK
return
VariableWindow:
Gui, 2: Show, w220 h205, Variables
return
SaveVars:
Gui, 2:Submit
GuiControlGet, t, 2:, A
GuiControlGet, intensity, 2:, B
GuiControlGet, delay, 2:, C
GuiControlGet, color_2_delay, 2:, D
return
VarDef:
t = 220000
intensity = 220
delay := 140
GuiControl, 2:, A, %t%
GuiControl, 2:, B, %intensity%
GuiControl, 2:, C, %delay%
GuiControl, 2:, D, %color_2_delay%
return
ButtonStart:
Gui, Submit, NoHide
id := ""
SetKeyDelay, 10
Process, priority, , High
gosub, GrabRemotePlay
if (id = "")
return
gosub, PauseLoop
CoordMode, Pixel, Screen
CoordMode, ToolTip, Screen
sleep 1000
gosub, AFKLoop
; ---------- Gui Setup End-------------
AFKLoop:
loop{
;gosub, Menu
gosub, PressX
DllCall("Sleep", "UInt", 10000) ; This is dependent on load time, probably different for ps4 version
gosub, Race
/*
if (tyres_overheating) {
break
}
*/
gosub, Menu
}
return
PressX:
; Just for menuing, does not hold X down
ControlSend,, {%accel% down}, ahk_id %id%
DllCall("Sleep", "UInt", 200)
ControlSend,, {%accel% up}, ahk_id %id%
return
PressO:
; Just for menuing, does not hold O down
ControlSend,, {Esc down}, ahk_id %id%
DllCall("Sleep", "UInt", 200)
ControlSend,, {Esc up}, ahk_id %id%
return
PressRight:
; For turning
ControlSend,, {%turnRight% down}, ahk_id %id%
Sleep, 50
ControlSend,, {%turnRight% up}, ahk_id %id%
return
; given time t in miliseconds, turn right for that long, with intensity being how much the turn button is held for
TurnRight:
t0 := A_TickCount
tf := t0+t
loop {
ControlSend,, {%turnRight% down}, ahk_id %id%
DllCall("Sleep", "UInt", intensity)
ControlSend,, {%turnRight% up}, ahk_id %id%
DllCall("Sleep", "UInt", delay)
} until tyres_overheating || A_TickCount > tf
return
TurnLeft:
t0 := A_TickCount
tf := t0+t
loop {
ControlSend,, {%turnLeft% down}, ahk_id %id%
DllCall("Sleep", "UInt", intensity)
ControlSend,, {%turnLeft% up}, ahk_id %id%
DllCall("Sleep", "UInt", delay)
} until tyres_overheating || A_TickCount > tf
return
CheckTyresOverheating:
tc := BitGrab(tyreX, tyreY, box_size)
for i, c in tc
{
td := Distance(c, color_tyre_overheat)
if (td < tolerance ){
tyres_overheating := true
break
}
}
return
RetryRace:
Gosub, PauseLoop
Sleep 500
tyres_overheating := false
controller.Buttons.Options.SetState(true)
Sleep 500
controller.Buttons.Options.SetState(false)
Sleep, 500
WinActivate, ahk_id %id%
Sleep, 500
ControlSend,, {Right down}, ahk_id %id%
Sleep, 200
ControlSend,, {Right up}, ahk_id %id%
Goto, AFKLoop
return
Race:
; Hold Acceleration and manage turning
ControlSend,, {%accel% down}, ahk_id %id%
ControlSend,, {%nitros% down}, ahk_id %id%
DllCall("Sleep", "UInt", 8200)
;SetTimer, CheckTyresOverheating, 1000
gosub TurnRight
/*
; This section detects the end of the race. Can be used to be faster/more accurate at the ending but good timing takes less computer resources
Screen: 218, 359 (less often used)
Window: 222, 357 (default)
Client: 214, 326 (recommended)
Color: 3F1757 (Red=3F Green=17 Blue=57)
Screen: 247, 65 (less often used)
Window: -129, -376 (default)
Client: -129, -376 (recommended)
Color: FD3C37 (Red=FD Green=3C Blue=37)
Screen: 210, 64 (less often used)
Window: 210, 64 (default)
Client: 202, 33 (recommended)
Color: 5091E9 (Red=50 Green=91 Blue=E9)
Screen: 261, 39 (less often used)
Window: 261, 39 (default)
Client: 253, 8 (recommended)
Color: A774A9 (Red=A7 Green=74 Blue=A9)
Screen: 263, 74 (less often used)
Window: 263, 74 (default)
Client: 255, 43 (recommended)
Color: FF3632 (Red=FF Green=36 Blue=32)
*/
loop {
/*
if (tyres_overheating) {
Goto, RetryRace
return
}
*/
break_point := false
c1 := BitGrab(pix1x, pix1y, box_size)
for i, c in c1
{
d1 := Distance(c, color_check1)
if (d1 < tolerance ){
break_point := true
break
}
}
if (break_point)
break
ControlSend,, {%turnRight% down}, ahk_id %id%
Sleep, 140
ControlSend,, {%turnRight% up}, ahk_id %id%
Sleep, 200
/*
PixelSearch, x, y, pix1x-10, pix1y-10, pix1x+10, pix1y+10, %color_check1%, 32, Fast RGB
If (ErrorLevel != 0) {
ControlSend,, {%turnRight% down}, ahk_id %id%
Sleep, 140
ControlSend,, {%turnRight% up}, ahk_id %id%
Sleep, 200
}
*/
}
;ToolTip, Found color 1, 100, 100, Screen
ControlSend,, {%accel% up}, ahk_id %id%
ControlSend,, {%nitros% up}, ahk_id %id%
return
Menu:
if (menu_s = 1){
gosub, Menu_pixel
}
if (menu_s = 2){
gosub, Menu_time
}
return
Menu_pixel:
;ToolTip, Menuing, 100, 100, Screen
loop {
break_point := false
c2 := BitGrab(pix2x, pix2y, box_size)
for i, c in c2
{
d2 := Distance(c, color_check2)
if (d2 < tolerance ){
break_point := true
break
}
}
if (break_point)
break
gosub, PressX
sleep %color_2_delay%
sleep, %bm_delay%
}
;ToolTip, Found color 2, 100, 100, Screen
Sleep, 200
ControlSend,, {Esc down}, ahk_id %id%
Sleep, 200
ControlSend,, {Esc up}, ahk_id %id%
Sleep, 200
ControlSend,, {Right down}, ahk_id %id%
Sleep, 200
ControlSend,, {Right up}, ahk_id %id%
Sleep, 500
gosub, PressX
Sleep, %ps_load_time1%
gosub, PressX
Sleep, 1000
ControlSend,, {Esc down}, ahk_id %id%
Sleep, 200
ControlSend,, {Esc up}, ahk_id %id%
loop, 2 {
gosub, PressX
Sleep, 500
}
Sleep, %ps_load_time2%
ControlSend,, {Down down}, ahk_id %id%
Sleep, 200
ControlSend,, {Down up}, ahk_id %id%
Sleep, 500
loop, %menu_loops% {
ControlSend,, {%MenuDirect% down}, ahk_id %id%
Sleep, 50
ControlSend,, {%MenuDirect% up}, ahk_id %id%
Sleep, 200
}
loop, 2{
gosub, PressX
Sleep, 1200
}
Sleep, %ps_load_time3%
loop, 2{
gosub, PressX
Sleep, 1000
}
return
Menu_time:
loop, 9{
gosub, PressX
Sleep, 1700
}
Sleep, 2000
ControlSend,, {Right down}, ahk_id %id%
Sleep, 200
ControlSend,, {Right up}, ahk_id %id%
Sleep, 500
gosub, PressX
Sleep, %ps_load_time1%
gosub, PressX
Sleep, 1000
ControlSend,, {Esc down}, ahk_id %id%
Sleep, 200
ControlSend,, {Esc up}, ahk_id %id%
loop, 2 {
gosub, PressX
Sleep, 500
}
Sleep, %ps_load_time2%
ControlSend,, {Down down}, ahk_id %id%
Sleep, 200
ControlSend,, {Down up}, ahk_id %id%
Sleep, 500
loop, %menu_loops% {
ControlSend,, {%MenuDirect% down}, ahk_id %id%
Sleep, 100
ControlSend,, {%MenuDirect% up}, ahk_id %id%
Sleep, 400
}
loop, 2{
gosub, PressX
Sleep, 2000
}
Sleep, %ps_load_time3%
gosub, PressX
Sleep, 2000
return
;; General Functions for AHK
PixelTuning:
x_ratio := ps_win_width/640
y_ratio := ps_win_height/360
pix1x := Floor(pix1x*x_ratio)
pix1y := Floor(pix1y*y_ratio)
pix2x := Floor(pix2x*x_ratio)
pix2y := Floor(pix2y*y_ratio)
tyreX := Floor(tyreX*x_ratio)
tyreY := Floor(tyreY*y_ratio)
return
GrabRemotePlay:
WinGet, remotePlay_id, List, ahk_exe RemotePlay.exe
if (remotePlay_id = 0)
{
MsgBox, PS4 Remote Play not found
return
}
Loop, %remotePlay_id%
{
id := remotePlay_id%A_Index%
WinGetTitle, title, % "ahk_id " id
If InStr(title, "PS Remote Play")
break
}
WinGetClass, remotePlay_class, ahk_id %id%
WinMove, ahk_id %id%,, 0, 0, 640, 360
ControlFocus,, ahk_class %remotePlay_class%
WinActivate, ahk_id %id%
GetClientSize(id, ps_win_width, ps_win_height)
gosub, PixelTuning
return
RPwind:
WinGet, remotePlay_id, List, ahk_exe RemotePlay.exe
if (remotePlay_id = 0)
{
MsgBox, PS4 Remote Play not found
return
}
Loop, %remotePlay_id%
{
id := remotePlay_id%A_Index%
WinGetTitle, title, % "ahk_id " id
If InStr(title, "PS Remote Play")
break
}
WinGetClass, remotePlay_class, ahk_id %id%
WinMove, ahk_id %id%,, -700, -400, 640, 360
ControlFocus,, ahk_class %remotePlay_class%
WinActivate, ahk_id %id%
return
PixelColorSimple(pc_x, pc_y)
{
WinGet, remotePlay_id, List, ahk_exe RemotePlay.exe
if (remotePlay_id = 0)
{
MsgBox, PS4 Remote Play not found
return
}
if remotePlay_id
{
pc_wID := remotePlay_id[0]
pc_hDC := DllCall("GetDC", "UInt", pc_wID)
pc_fmtI := A_FormatInteger
SetFormat, IntegerFast, Hex
pc_c := DllCall("GetPixel", "UInt", pc_hDC, "Int", pc_x, "Int", pc_y, "UInt")
pc_c := pc_c >> 16 & 0xff | pc_c & 0xff00 | (pc_c & 0xff) << 16
pc_c .= ""
SetFormat, IntegerFast, %pc_fmtI%
DllCall("ReleaseDC", "UInt", pc_wID, "UInt", pc_hDC)
return pc_c
}
}
GetClientSize(hWnd, ByRef w := "", ByRef h := "")
{
VarSetCapacity(rect, 16)
DllCall("GetClientRect", "ptr", hWnd, "ptr", &rect)
w := NumGet(rect, 8, "int")
h := NumGet(rect, 12, "int")
}
Distance(c1, c2)
{ ; function by [VxE], return value range = [0, 441.67295593006372]
return Sqrt((((c1>>16)-(c2>>16))**2)+(((c1>>8&255)-(c2>>8&255))**2)+(((c1&255)-(c1&255))**2))
}
ConvertARGB(ARGB, Convert := 0)
{
SetFormat, IntegerFast, Hex
RGB += ARGB
RGB := RGB & 0x00FFFFFF
if (Convert)
RGB := (RGB & 0xFF000000) | ((RGB & 0xFF0000) >> 16) | (RGB & 0x00FF00) | ((RGB & 0x0000FF) << 16)
return RGB
}
MenuTest:
MsgBox, This will test the number of Left/Right presses at the championship selection menu. `nTry this if you have not finished all cafe menus. `nPress OK to test
gosub, GrabRemotePlay
Gui, Submit, NoHide
loop, %menu_loops% {
ControlSend,, {%MenuDirect% down}, ahk_id %id%
Sleep, 200
ControlSend,, {%MenuDirect% up}, ahk_id %id%
Sleep, 200
}
*/
/*this section was used to test resoltuion specs
/*
gosub, GrabRemotePlay
GetClientSize(id, ps_win_width, ps_win_height)
gosub, PixelTuning
MsgBox, Width %ps_win_width% Height %ps_win_height% pix1 %pix1x%
*/
return
BitGrab(x, y, b)
{
HWND := WinExist("PS Remote Play")
pToken := Gdip_Startup()
pBitmap := Gdip_BitmapFromHWND2(hwnd)
pixs := []
for i in range(-1*b, b+1){
for j in range(-1*b, b+1){
pixel := Gdip_GetPixel(pBitmap,x+i,y+j)
rgb := ConvertARGB( pixel )
pixs.Push(rgb)
}
}
Gdip_DisposeImage(pBitmap)
Gdip_Shutdown(pToken)
return pixs
}
Gdip_BitmapFromHWND2(hwnd)
{
WinGetPos,,, Width, Height, ahk_id %hwnd%
hbm := CreateDIBSection(Width, Height), hdc := CreateCompatibleDC(), obm := SelectObject(hdc, hbm)
RegExMatch(A_OsVersion, "\d+", Version)
PrintWindow(hwnd, hdc, Version >= 8 ? 2 : 0)
pBitmap := Gdip_CreateBitmapFromHBITMAP(hbm)
SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc)
return pBitmap
}
GetColo_p:
gosub, GrabRemotePlay
color_check1 := PixelColorSimple(pix1x, pix1y)
return
GetColo_g:
gosub, GrabRemotePlay
color_check2 := PixelColorSimple(pix2x, pix2y)
return
PSystem:
Gui, Submit, NoHide
if (SysCheck = 1){
ps_load_time1 := 14000
ps_load_time2 := 7000
ps_load_time3 := 8400
}
if (SysCheck = 2){
ps_load_time1 := 41500
ps_load_time2 := 12000
ps_load_time3 := 40000
}
return
MenuSel:
Gui, Submit, NoHide
if (MenuCheck = 1){
menu_s := 1
}
if (MenuCheck = 2){
menu_s := 2s
}
return
Reset:
gosub, PauseLoop
Reload
Sleep 1000
return
PauseLoop:
ControlSend,, {%accel% up}, ahk_id %id%
ControlSend,, {%nitros% up}, ahk_id %id%
ControlSend,, {%turnLeft% up}, ahk_id %id%
ControlSend,, {%turnRight% up}, ahk_id %id%
return
range(start, stop:="", step:=1) {
static range := { _NewEnum: Func("_RangeNewEnum") }
if !step
throw "range(): Parameter 'step' must not be 0 or blank"
if (stop == "")
stop := start, start := 0
; Formula: r[i] := start + step*i ; r = range object, i = 0-based index
; For a postive 'step', the constraints are i >= 0 and r[i] < stop
; For a negative 'step', the constraints are i >= 0 and r[i] > stop
; No result is returned if r[0] does not meet the value constraint
if (step > 0 ? start < stop : start > stop) ;// start == start + step*0
return { base: range, start: start, stop: stop, step: step }
}
_RangeNewEnum(r) {
static enum := { "Next": Func("_RangeEnumNext") }
return { base: enum, r: r, i: 0 }
}
_RangeEnumNext(enum, ByRef k, ByRef v:="") {
stop := enum.r.stop, step := enum.r.step
, k := enum.r.start + step*enum.i
if (ret := step > 0 ? k < stop : k > stop)
enum.i += 1
return ret
}
GuiClose:
gosub, PauseLoop
ExitApp
^Esc::ExitApp
/*
Pink RUF color"
which is the standart first one to buy if you want to buy car manufactur color (for me german GT7 i think its same for everyone)
0xFA559F
i have put that into Color check 1 and 2 works since 5 cycles - so maybe put them in with like (not tested)
(i think the first option that gets shown to buy a new color is the easiest to explain for people to buy except for colors the car exists in anyways (venom green)
here is the Hex Code for Porsche "Sternrubin" Ruby or Starruby depending on language:
0xBA3A64
*/