add newer versions

This commit is contained in:
Bartek Dobrowolski-Nowakowski
2022-04-15 19:06:10 +02:00
parent e0a219a727
commit 07743bbf25
519 changed files with 82346 additions and 0 deletions

View File

@@ -0,0 +1,329 @@
#NoEnv
#MaxHotkeysPerInterval 99000000
#HotkeyInterval 99000000
#KeyHistory 0
#Include Lib\Gdip.ahk
#Include Lib\AHK-ViGEm-Bus.ahk
#Include Lib\__utility__.ahk
#Include Lib\__controller_functions__.ahk
#Include Mod\Mods.ahk
#Include Race.ahk
hModule := DllCall("LoadLibrary", "Str", A_LineFile "\..\Lib\SuperSleep.dll", "Ptr")
SuperSleep := DllCall("GetProcAddress", "Ptr", DllCall("GetModuleHandle", "Str", A_LineFile "\..\Lib\SuperSleep.dll", "Ptr"), "AStr", "super_sleep", "Ptr")
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
; --------- Constants
; Time at turn in seconds and Stablizing control
Global t := 210000
Global debug_mode := 1
intensity := 230
delay := 300
init_delay := 10000
MenuDirect := "Right"
Menu_loops := 6
menu_s := 1
global color_check1 := 0xBBE044
color_check2 := 0xBBE044
color_2_delay := 400
global box_size := 2
global tolerance := 20
; resolution parameters and pixel search locations
ps_win_width := 640
ps_win_height := 360
global pix1x := 458
global pix1y := 114
global pix2x := 607
global pix2y := 319
bm_delay := 100
box_size := 2
ps_load_time1 := 12000
ps_load_time2 := 6000
ps_load_time3 := 9000
; Create a new controller controller
Global 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 gCheckHairpin, Stuck Leaderboard
Gui, Add, Button, x110 y70 w70 default gGetColo_g, Stuck Replay
Gui, Add, Button, x110 y10 w70 default gModWindow, Mods
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, x125 y115 altsubmit gPSystem, PS4 Pro
;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, Add, Button, default gMouseColor, Color Picker
Gui, Font, ce8dfe3 s9 w550 Bold
loop, Files, % A_ScriptDir "\Races\*.ahk*"
{
SplitPath, A_LoopFileName,,,, FileName
List .= FileName "|"
}
List := RTrim(List, "|")
List := StrReplace(List, "|", "||",, 1) ; make first item default
Gui, Add, DropDownList, vRaceChoice, % List
Gui, Show
;--------- 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, 2: Add, Checkbox, x100 y150 Checked vdebug_mode gDebugging, Debug Mode
Gui, Show, AutoSize, GT7AHK
return
Debugging:
MsgBox, %debug_mode%
return
VariableWindow:
Gui, 2: Show, w220 h205, Variables
return
ModWindow:
Gui, 3: Show, AutoSize, Mod List
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 := 210000
intensity := 230
delay := 300
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-------------
; ---------- AFK Loop -----------------
AFKLoop:
loop{
Press_X()
gosub, Race
/*
if (tyres_overheating) {
break
}
*/
gosub, Menu
}
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
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% {
controller.Dpad.SetState(MenuDirect)
Sleep, 125
controller.Dpad.SetState("None")
Sleep, 200
}
return
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 := 12000
ps_load_time2 := 6000
ps_load_time3 := 8400
}
if (SysCheck = 2){
ps_load_time1 := 37000
ps_load_time2 := 12000
ps_load_time3 := 32000
}
if (SysCheck = 3){
ps_load_time1 := 37000
ps_load_time2 := 12000
ps_load_time3 := 32000
}
return
Reset:
gosub, PauseLoop
Reload
Sleep 1000
return
PauseLoop:
controller.Buttons.Cross.SetState(false)
controller.Buttons.Square.SetState(false)
controller.Buttons.Triangle.SetState(false)
controller.Buttons.Circle.SetState(false)
controller.Buttons.L1.SetState(false)
controller.Buttons.L2.SetState(false)
controller.Axes.L2.SetState(0)
controller.Buttons.R1.SetState(false)
controller.Buttons.R2.SetState(false)
controller.Axes.R2.SetState(0)
controller.Buttons.RS.SetState(false)
controller.Axes.RX.SetState(50)
controller.Axes.RY.SetState(50)
controller.Buttons.LS.SetState(false)
controller.Axes.LX.SetState(50)
controller.Axes.LY.SetState(50)
controller.Dpad.SetState("None")
return
MouseHelp:
coord=relative
sleep, 1000
CoordMode, ToolTip, %coord%
CoordMode, Pixel, %coord%
CoordMode, Mouse, %coord%
CoordMode, Caret, %coord%
CoordMode, Menu, %coord%
return
Refresh:
MouseGetPos, x, y
PixelGetColor, cBGR, %x%, %y%,, Alt RGB
WinGetPos,,, w, h, A
ToolTip,Location: %x% x %y%`nRGB: %cBGR%`nWindow Size: %w% x %h%
return
MouseColor:
gosub, MouseHelp
SetTimer, Refresh, 75
return
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
*/

View File

@@ -0,0 +1,211 @@
#include %A_LineFile%\..\CLR.ahk
; Static class, holds ViGEm Client instance
class ViGEmWrapper {
static asm := 0
static client := 0
Init(){
if (this.client == 0){
this.asm := CLR_LoadLibrary(A_LineFile "\..\ViGEmWrapper.dll")
}
}
CreateInstance(cls){
return this.asm.CreateInstance(cls)
}
}
; Base class for ViGEm "Targets" (Controller types - eg xb360 / ds4) to inherit from
class ViGEmTarget {
target := 0
helperClass := ""
controllerClass := ""
__New(){
;~ this.asm := CLR_LoadLibrary(A_LineFile "\..\ViGEmWrapper.dll")
ViGEmWrapper.Init()
this.Instance := ViGEmWrapper.CreateInstance(this.helperClass)
if (this.Instance.OkCheck() != "OK"){
msgbox ViGEmWrapper.dll failed to load!
ExitApp
}
}
SendReport(){
this.Instance.SendReport()
}
SubscribeFeedback(callback){
this.Instance.SubscribeFeedback(callback)
}
}
; DS4 (DualShock 4 for Playstation 4)
class ViGEmDS4 extends ViGEmTarget {
helperClass := "ViGEmWrapper.Ds4"
__New(){
static buttons := {Square: 16, Cross: 32, Circle: 64, Triangle: 128, L1: 256, R1: 512, L2: 1024, R2: 2048
, Share: 4096, Options: 8192, LS: 16384, RS: 32768 }
static specialButtons := {Ps: 1, TouchPad: 2}
static axes := {LX: 2, LY: 3, RX: 4, RY: 5, LT: 0, RT: 1}
this.Buttons := {}
for name, id in buttons {
this.Buttons[name] := new this._ButtonHelper(this, id)
}
for name, id in specialButtons {
this.Buttons[name] := new this._SpecialButtonHelper(this, id)
}
this.Axes := {}
for name, id in axes {
this.Axes[name] := new this._AxisHelper(this, id)
}
this.Dpad := new this._DpadHelper(this)
base.__New()
}
class _ButtonHelper {
__New(parent, id){
this._Parent := parent
this._Id := id
}
SetState(state){
this._Parent.Instance.SetButtonState(this._Id, state)
this._Parent.Instance.SendReport()
return this._Parent
}
}
class _SpecialButtonHelper {
__New(parent, id){
this._Parent := parent
this._Id := id
}
SetState(state){
this._Parent.Instance.SetSpecialButtonState(this._Id, state)
this._Parent.Instance.SendReport()
return this._Parent
}
}
class _AxisHelper {
__New(parent, id){
this._Parent := parent
this._Id := id
}
SetState(state){
this._Parent.Instance.SetAxisState(this._Id, this.ConvertAxis(state))
this._Parent.Instance.SendReport()
return this._Parent
}
ConvertAxis(state){
return round(state * 2.55)
}
}
class _DpadHelper {
__New(parent){
this._Parent := parent
this._Id := id
}
SetState(state){
static dPadDirections := {Up: 0, UpRight: 1, Right: 2, DownRight: 3, Down: 4, DownLeft: 5, Left: 6, UpLeft: 7, None: 8}
this._Parent.Instance.SetDpadState(dPadDirections[state])
this._Parent.Instance.SendReport()
return this._Parent
}
}
}
; Xb360
class ViGEmXb360 extends ViGEmTarget {
helperClass := "ViGEmWrapper.Xb360"
__New(){
static buttons := {A: 4096, B: 8192, X: 16384, Y: 32768, LB: 256, RB: 512, LS: 64, RS: 128, Back: 32, Start: 16, Xbox: 1024}
static axes := {LX: 2, LY: 3, RX: 4, RY: 5, LT: 0, RT: 1}
this.Buttons := {}
for name, id in buttons {
this.Buttons[name] := new this._ButtonHelper(this, id)
}
this.Axes := {}
for name, id in axes {
this.Axes[name] := new this._AxisHelper(this, id)
}
this.Dpad := new this._DpadHelper(this)
base.__New()
}
class _ButtonHelper {
__New(parent, id){
this._Parent := parent
this._Id := id
}
SetState(state){
this._Parent.Instance.SetButtonState(this._Id, state)
this._Parent.Instance.SendReport()
return this._Parent
}
}
class _AxisHelper {
__New(parent, id){
this._Parent := parent
this._id := id
}
SetState(state){
this._Parent.Instance.SetAxisState(this._Id, this.ConvertAxis(state))
this._Parent.Instance.SendReport()
}
ConvertAxis(state){
value := round((state * 655.36) - 32768)
if (value == 32768)
return 32767
return value
}
}
class _DpadHelper {
_DpadStates := {1:0, 8:0, 2:0, 4:0} ; Up, Right, Down, Left
__New(parent){
this._Parent := parent
}
SetState(state){
static dpadDirections := { None: {1:0, 8:0, 2:0, 4:0}
, Up: {1:1, 8:0, 2:0, 4:0}
, UpRight: {1:1, 8:1, 2:0, 4:0}
, Right: {1:0, 8:1, 2:0, 4:0}
, DownRight: {1:0, 8:1, 2:1, 4:0}
, Down: {1:0, 8:0, 2:1, 4:0}
, DownLeft: {1:0, 8:0, 2:1, 4:1}
, Left: {1:0, 8:0, 2:0, 4:1}
, UpLeft: {1:1, 8:0, 2:0, 4:1}}
newStates := dpadDirections[state]
for id, newState in newStates {
oldState := this._DpadStates[id]
if (oldState != newState){
this._DpadStates[id] := newState
this._Parent.Instance.SetButtonState(id, newState)
}
this._Parent.SendReport()
}
}
}
}

View File

@@ -0,0 +1,151 @@
; ==========================================================
; .NET Framework Interop
; https://autohotkey.com/boards/viewtopic.php?t=4633
; ==========================================================
;
; Author: Lexikos
; Version: 1.2
; Requires: AutoHotkey_L v1.0.96+
;
CLR_LoadLibrary(AssemblyName, AppDomain=0)
{
if !AppDomain
AppDomain := CLR_GetDefaultDomain()
e := ComObjError(0)
Loop 1 {
if assembly := AppDomain.Load_2(AssemblyName)
break
static null := ComObject(13,0)
args := ComObjArray(0xC, 1), args[0] := AssemblyName
typeofAssembly := AppDomain.GetType().Assembly.GetType()
if assembly := typeofAssembly.InvokeMember_3("LoadWithPartialName", 0x158, null, null, args)
break
if assembly := typeofAssembly.InvokeMember_3("LoadFrom", 0x158, null, null, args)
break
}
ComObjError(e)
return assembly
}
CLR_CreateObject(Assembly, TypeName, Args*)
{
if !(argCount := Args.MaxIndex())
return Assembly.CreateInstance_2(TypeName, true)
vargs := ComObjArray(0xC, argCount)
Loop % argCount
vargs[A_Index-1] := Args[A_Index]
static Array_Empty := ComObjArray(0xC,0), null := ComObject(13,0)
return Assembly.CreateInstance_3(TypeName, true, 0, null, vargs, null, Array_Empty)
}
CLR_CompileC#(Code, References="", AppDomain=0, FileName="", CompilerOptions="")
{
return CLR_CompileAssembly(Code, References, "System", "Microsoft.CSharp.CSharpCodeProvider", AppDomain, FileName, CompilerOptions)
}
CLR_CompileVB(Code, References="", AppDomain=0, FileName="", CompilerOptions="")
{
return CLR_CompileAssembly(Code, References, "System", "Microsoft.VisualBasic.VBCodeProvider", AppDomain, FileName, CompilerOptions)
}
CLR_StartDomain(ByRef AppDomain, BaseDirectory="")
{
static null := ComObject(13,0)
args := ComObjArray(0xC, 5), args[0] := "", args[2] := BaseDirectory, args[4] := ComObject(0xB,false)
AppDomain := CLR_GetDefaultDomain().GetType().InvokeMember_3("CreateDomain", 0x158, null, null, args)
return A_LastError >= 0
}
CLR_StopDomain(ByRef AppDomain)
{ ; ICorRuntimeHost::UnloadDomain
DllCall("SetLastError", "uint", hr := DllCall(NumGet(NumGet(0+RtHst:=CLR_Start())+20*A_PtrSize), "ptr", RtHst, "ptr", ComObjValue(AppDomain))), AppDomain := ""
return hr >= 0
}
; NOTE: IT IS NOT NECESSARY TO CALL THIS FUNCTION unless you need to load a specific version.
CLR_Start(Version="") ; returns ICorRuntimeHost*
{
static RtHst := 0
; The simple method gives no control over versioning, and seems to load .NET v2 even when v4 is present:
; return RtHst ? RtHst : (RtHst:=COM_CreateObject("CLRMetaData.CorRuntimeHost","{CB2F6722-AB3A-11D2-9C40-00C04FA30A3E}"), DllCall(NumGet(NumGet(RtHst+0)+40),"uint",RtHst))
if RtHst
return RtHst
EnvGet SystemRoot, SystemRoot
if Version =
Loop % SystemRoot "\Microsoft.NET\Framework" (A_PtrSize=8?"64":"") "\*", 2
if (FileExist(A_LoopFileFullPath "\mscorlib.dll") && A_LoopFileName > Version)
Version := A_LoopFileName
if DllCall("mscoree\CorBindToRuntimeEx", "wstr", Version, "ptr", 0, "uint", 0
, "ptr", CLR_GUID(CLSID_CorRuntimeHost, "{CB2F6723-AB3A-11D2-9C40-00C04FA30A3E}")
, "ptr", CLR_GUID(IID_ICorRuntimeHost, "{CB2F6722-AB3A-11D2-9C40-00C04FA30A3E}")
, "ptr*", RtHst) >= 0
DllCall(NumGet(NumGet(RtHst+0)+10*A_PtrSize), "ptr", RtHst) ; Start
return RtHst
}
;
; INTERNAL FUNCTIONS
;
CLR_GetDefaultDomain()
{
static defaultDomain := 0
if !defaultDomain
{ ; ICorRuntimeHost::GetDefaultDomain
if DllCall(NumGet(NumGet(0+RtHst:=CLR_Start())+13*A_PtrSize), "ptr", RtHst, "ptr*", p:=0) >= 0
defaultDomain := ComObject(p), ObjRelease(p)
}
return defaultDomain
}
CLR_CompileAssembly(Code, References, ProviderAssembly, ProviderType, AppDomain=0, FileName="", CompilerOptions="")
{
if !AppDomain
AppDomain := CLR_GetDefaultDomain()
if !(asmProvider := CLR_LoadLibrary(ProviderAssembly, AppDomain))
|| !(codeProvider := asmProvider.CreateInstance(ProviderType))
|| !(codeCompiler := codeProvider.CreateCompiler())
return 0
if !(asmSystem := (ProviderAssembly="System") ? asmProvider : CLR_LoadLibrary("System", AppDomain))
return 0
; Convert | delimited list of references into an array.
StringSplit, Refs, References, |, %A_Space%%A_Tab%
aRefs := ComObjArray(8, Refs0)
Loop % Refs0
aRefs[A_Index-1] := Refs%A_Index%
; Set parameters for compiler.
prms := CLR_CreateObject(asmSystem, "System.CodeDom.Compiler.CompilerParameters", aRefs)
, prms.OutputAssembly := FileName
, prms.GenerateInMemory := FileName=""
, prms.GenerateExecutable := SubStr(FileName,-3)=".exe"
, prms.CompilerOptions := CompilerOptions
, prms.IncludeDebugInformation := true
; Compile!
compilerRes := codeCompiler.CompileAssemblyFromSource(prms, Code)
if error_count := (errors := compilerRes.Errors).Count
{
error_text := ""
Loop % error_count
error_text .= ((e := errors.Item[A_Index-1]).IsWarning ? "Warning " : "Error ") . e.ErrorNumber " on line " e.Line ": " e.ErrorText "`n`n"
MsgBox, 16, Compilation Failed, %error_text%
return 0
}
; Success. Return Assembly object or path.
return compilerRes[FileName="" ? "CompiledAssembly" : "PathToAssembly"]
}
CLR_GUID(ByRef GUID, sGUID)
{
VarSetCapacity(GUID, 16, 0)
return DllCall("ole32\CLSIDFromString", "wstr", sGUID, "ptr", &GUID) >= 0 ? &GUID : ""
}

View File

@@ -0,0 +1,175 @@
/**********************************************
* Controller methods for simplicity *
***********************************************/
*/
GoTo EndControllerFunctionsDef
;;;;;;;;;;;; Turning functions
;;;;;;;;;;;; For holding the stick in a specific position for a period of time
;;;;;;;;;;;; Note no other button may be pressed or released when these functions are ran
; Set the time you want to turn for in miliseconds and how hard (50, 100), 100 being the most, 50 being neutral
Turn_Right(sleept, inten){
t := sleept
controller.Axes.LX.SetState(inten)
gosub, Turn
controller.Axes.LX.SetState(50)
}
; Set the time you want to turn for in miliseconds and how hard (0, 50), 0 being the most
Turn_Left(sleept, inten){
t := sleept
controller.Axes.LX.SetState(inten)
gosub, Turn
controller.Axes.LX.SetState(50)
}
;;;;;;;;;;;; Simple button press functions
;;;;;;;;;;;; You can pass a delay amount or leave it blank
;;;;;;;;;;;; Longer delays hold the button longer
; Press X button
Press_X(delay:=200){
controller.Buttons.Cross.SetState(true)
DllCall("Sleep", "UInt", delay)
controller.Buttons.Cross.SetState(false)
return
}
; Press O button
Press_O(delay:=200){
controller.Buttons.Circle.SetState(true)
DllCall("Sleep", "UInt", delay)
controller.Buttons.Circle.SetState(false)
return
}
; Press Triangle button
Press_Triangle(delay:=200){
controller.Buttons.Triangle.SetState(true)
DllCall("Sleep", "UInt", delay)
controller.Buttons.Triangle.SetState(false)
return
}
; Press Square button
Press_Square(delay:=200){
controller.Buttons.Square.SetState(true)
DllCall("Sleep", "UInt", delay)
controller.Buttons.Square.SetState(false)
return
}
; Press R1 button
Press_L1(delay:=200){
controller.Buttons.L1.SetState(true)
DllCall("Sleep", "UInt", delay)
controller.Buttons.L1.SetState(false)
return
}
; Press R1 button
Press_R1(delay:=200){
controller.Buttons.R1.SetState(true)
DllCall("Sleep", "UInt", delay)
controller.Buttons.R1.SetState(false)
return
}
; Press Right on D-pad
Press_Right(delay:=200){
controller.Dpad.SetState("Right")
DllCall("Sleep", "UInt", delay)
controller.Dpad.SetState("None")
return
}
; Press Left on D-pad
Press_Left(delay:=200){
controller.Dpad.SetState("Left")
DllCall("Sleep", "UInt", delay)
controller.Dpad.SetState("None")
return
}
; Press Up on D-pad
Press_Up(delay:=200){
controller.Dpad.SetState("Up")
DllCall("Sleep", "UInt", delay)
controller.Dpad.SetState("None")
return
}
; Press Down on D-pad
Press_Down(delay:=200){
controller.Dpad.SetState("Down")
DllCall("Sleep", "UInt", delay)
controller.Dpad.SetState("None")
return
}
;;;;;;;;;;; Other functions specific to GT7
; Turn on nitrous
Nitrous_On(){
controller.Buttons.RS.SetState(true)
}
; Turn off nitrous
Nitrous_Off(){
controller.Buttons.RS.SetState(false)
}
Accel_On(control:=100){
controller.Buttons.R2.SetState(true)
controller.Axes.RT.SetState(control)
}
Accel_Off(){
controller.Buttons.R2.SetState(false)
controller.Axes.RT.SetState(0)
}
Brake_On(control:=100){
controller.Buttons.L2.SetState(true)
controller.Axes.LT.SetState(control)
}
Brake_Off(){
controller.Buttons.L2.SetState(false)
controller.Axes.LT.SetState(0)
}
; given time t in miliseconds, turn right for that long, with intensity being how much the turn button is held for
Turn:
t0 := A_TickCount
tf := t0+t
loop {
Sleep(100)
} until A_TickCount > tf
return
PressX:
; Just for menuing, does not hold X down
controller.Buttons.Cross.SetState(true)
DllCall("Sleep", "UInt", 200)
controller.Buttons.Cross.SetState(false)
return
PressO:
; Just for menuing, does not hold O down
controller.Buttons.Circle.SetState(true)
DllCall("Sleep", "UInt", 200)
controller.Buttons.Circle.SetState(false)
return
PressRight:
; For turning
controller.Dpad.SetState("Right")
Sleep, 50
controller.Dpad.SetState("None")
return
EndControllerFunctionsDef:

View File

@@ -0,0 +1,136 @@
/**********************************************
* Only place functions here, no sub routines *
***********************************************/
; Grabs the colors of the pixels (x-b, y-b) to (x+b, y+b)
; returns the array of colors
*/
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
}
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
}
Sleep(ms=1)
{
global timeBeginPeriodHasAlreadyBeenCalled
if (timeBeginPeriodHasAlreadyBeenCalled != 1)
{
DllCall("Winmm.dll\timeBeginPeriod", UInt, 1)
timeBeginPeriodHasAlreadyBeenCalled := 1
}
DllCall("Sleep", UInt, ms)
}
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
}
ToolTipper(msg, x := 100, y := 100)
{
if (debug_mode = 1)
ToolTip, %msg%, x, y, Screen
return
}

View File

@@ -0,0 +1,84 @@
__enableChampionshipMenuing_mod__ := 0
GoTo EndChampionshipMenuingDef
Menu:
;ToolTip, Menuing, 100, 100, Screen
if(__enableChampionshipMenuing_mod__ = 0){
return
}
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
Press_X()
sleep, %color_2_delay%
sleep, %bm_delay%
}
;ToolTip, Found color 2, 100, 100, Screen
Sleep, 100
Press_O()
Sleep, 100
Press_Right()
Sleep, 100
Press_X()
Sleep, %ps_load_time1%
Press_X()
Sleep, 1000
Press_O()
loop, 2
{
Press_X()
Sleep, 100
}
Sleep, %ps_load_time2%
;Conduct Maintenance here.
CheckForOilChange := Mod(A_Index, 29)
CheckForMaintenance := Mod(A_Index, 107)
;ToolTipper("CheckForOilChange " CheckForOilChange "`nCheckForMaintenance " CheckForMaintenance, 300, 100)
ifEqual, CheckForOilChange, 0
{
gosub, DoOilChange
}
ifEqual, CheckForMaintenance, 0
{
gosub, DoMaintenance
}
Press_Down()
Sleep, 50
loop, %menu_loops%
{
controller.Dpad.SetState(MenuDirect)
Sleep, 50
controller.Dpad.SetState("None")
Sleep, 50
}
loop, 2
{
Press_X()
Sleep, 500
}
Sleep, %ps_load_time3%
loop, 2{
gosub, PressX
Sleep, 500
}
return
EndChampionshipMenuingDef:

View File

@@ -0,0 +1,35 @@
__enableCheckStuck_mod__ := 0
GoTo EndCheckStuckDef
CheckStuck:
if (__enableCheckStuck_mod__ = 0){
return
}
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
Unstuck:
if (__enableCheckStuck_mod__ = 0){
return
}
controller.Buttons.RS.SetState(false)
Sleep 200
Turn_Left(4000, 0)
tyres_overheating := false
controller.Buttons.RS.SetState(true)
ToolTip, Unstuck done - hope it worked., 100, 100, Screen
return
EndCheckStuckDef:

View File

@@ -0,0 +1,59 @@
__enableTurn_mod__ := 0
;Color: C95A51 (Red=C9 Green=5A Blue=51)
; Class TurnContainer
; Simple container for constants
; Store the starting points to look for a turn on the minimap
; You can also store the end points
class TurnContainer
{
__New(startX, startY, endX := 0, endY := 0)
{
this.startX := startX
this.startY := startY
this.endX := endX
this.endY := endY
}
}
; below isn't used yet
TurnTolerance := 10
GoTo EndTurnDef
CheckTurn(x,y, b_size := 2)
{
color_player := 0xDE6E70
if (__enableTurn_mod__ = 0){
return
}
turn_complete := false
loop {
tc := BitGrab(x, y, b_size)
for i, c in tc
{
td := Distance(c, color_player)
;ToolTipper("Turn" td)
if (td < 20 ){
turn_complete := true
break
}
}
;Sleep(50)
} until turn_complete = true
;ToolTipper("Turn Found")
return
}
ResetTurn:
turn_complete := false
return
EndTurnDef:

View File

@@ -0,0 +1,47 @@
__enableCheckTyres_mod__ := 0
color_tyre_overheat := 0xD42304
tyres_overheating := false
tyreX := 166
tyreY := 364
GoTo EndCheckTyresDef
CheckTyresOverheating:
if (__enableCheckTyres_mod__ = 0){
return
}
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:
if (__enableCheckTyres_mod__ = 0){
return
}
Gosub, PauseLoop
Sleep 500
tyres_overheating := false
controller.Buttons.Options.SetState(true)
Sleep 200
controller.Buttons.Options.SetState(false)
Sleep, 500
controller.Dpad.SetState("Right")
Sleep, 200
controller.Dpad.SetState("None")
Goto, AFKLoop
return
EndCheckTyresDef:

View File

@@ -0,0 +1,46 @@
__enableChicane_mod__ := 0
;Screen: 506, 69 (less often used)
;Color: C95A51 (Red=C9 Green=5A Blue=51)
;Screen: 588, 88 (less often used)
color_player := 0xDE6E70
Chicane_complete := false
ChicaneX := 588
ChicaneY := 88
ChicaneTolerance := 10
GoTo EndChicaneDef
CheckChicane:
if (__enableChicane_mod__ = 0){
return
}
tc := BitGrab(ChicaneX, ChicaneY,2)
for i, c in tc
{
td := Distance(c, color_player)
if (td < 9 ){
Chicane_complete := true
ToolTip, Chicane Found, 100, 100, Screen
break
}
}
return
ResetChicane:
Chicane_complete := false
return
EndChicaneDef:

View File

@@ -0,0 +1,48 @@
__enableHairpin_mod__ := 0
;Screen: 506, 69 (less often used)
;Color: C95A51 (Red=C9 Green=5A Blue=51)
;Screen: 588, 88 (less often used)
color_player := 0xDE6E70
hairpin_complete := false
hairpinX := 506
hairpinY := 72
hairpinCount := 0
hairpinTolerance := 10
GoTo EndHairpinDef
CheckHairpin:
if (__enableHairpin_mod__ = 0){
return
}
tc := BitGrab(hairpinX, hairpinY,2)
for i, c in tc
{
td := Distance(c, color_player)
if (td < 9 ){
hairpin_complete := true
hairpinCount += 1
ToolTip, Hairpin Found current state: %hairpinCount%, 100, 100, Screen
break
}
}
return
ResetHairpin:
hairpinCount := 0
return
EndHairpinDef:

View File

@@ -0,0 +1,153 @@
__enableMaintenance_mod__ := 0
GoTo EndMaintenceDef
;This will do only an oil change. will leave user at race menu to resume.
GtAutoNav:
return
DoOilChange:
if (__enableCheckTyres_mod__ = 0){
return
}
Sleep, 1000
Press_O()
Sleep, 2800
loop, 2 {
Press_Right(140)
Sleep, 200
}
Press_Down()
Sleep, 200
loop, 2 {
Press_X()
Sleep, 1000
}
Sleep, 2000
Press_Down(140)
Sleep, 200
loop, 2 {
Press_X()
Sleep, 500
}
Sleep, 7000
Press_X()
Sleep, 500
Press_O()
Sleep, 200
Sleep, 3000
Press_Up(140)
Sleep, 200
Press_Left()
Sleep, 500
Press_Left()
Sleep, 500
Press_X()
Sleep, 4800
return
;This will do complete maintenance on the car including oil, engine and body. will leave user at race menu to resume.
DoMaintenance:
if (__enableCheckTyres_mod__ = 0){
return
}
Sleep, 1000
controller.Buttons.Circle.SetState(true)
Sleep, 200
controller.Buttons.Circle.SetState(false)
Sleep, 2800
loop, 2 {
controller.Dpad.SetState("Right")
Sleep, 140
controller.Dpad.SetState("None")
Sleep, 200
}
controller.Dpad.SetState("Down")
Sleep, 200
controller.Dpad.SetState("None")
Sleep, 200
loop, 2 {
gosub, PressX
Sleep, 1000
}
Sleep, 2000
controller.Dpad.SetState("Down")
Sleep, 140
controller.Dpad.SetState("None")
Sleep, 200
loop, 2 {
gosub, PressX
Sleep, 500
}
Sleep, 7000
gosub, PressX
Sleep, 500
controller.Dpad.SetState("Down")
Sleep, 140
controller.Dpad.SetState("None")
Sleep, 200
controller.Dpad.SetState("Down")
Sleep, 140
controller.Dpad.SetState("None")
Sleep, 200
loop, 2 {
gosub, PressX
Sleep, 500
}
Sleep, 7000
gosub, PressX
Sleep, 500
controller.Dpad.SetState("Down")
Sleep, 140
controller.Dpad.SetState("None")
Sleep, 200
controller.Dpad.SetState("Down")
Sleep, 140
controller.Dpad.SetState("None")
Sleep, 200
controller.Dpad.SetState("Down")
Sleep, 140
controller.Dpad.SetState("None")
Sleep, 200
loop, 2 {
gosub, PressX
Sleep, 500
}
Sleep, 8500
gosub, PressX
Sleep, 500
controller.Buttons.Circle.SetState(true)
Sleep, 200
controller.Buttons.Circle.SetState(false)
Sleep, 200
Sleep, 3000
controller.Dpad.SetState("Up")
Sleep, 140
controller.Dpad.SetState("None")
Sleep, 200
controller.Dpad.SetState("Left")
Sleep, 200
controller.Dpad.SetState("None")
Sleep, 500
controller.Dpad.SetState("Left")
Sleep, 200
controller.Dpad.SetState("None")
Sleep, 500
gosub, PressX
Sleep, 4800
return
EndMaintenceDef:

View File

@@ -0,0 +1,99 @@
/************************************************
Rules for adding a mod
Your mod file should only be included here
In your mod file, make a flag variable such as
__enable<modName>_mod__ := 0
and put the following at the beggining of each subroutine of your mod file
if (__enable<modName>_mod__ = 0){
return
}
This will allow users to disable and enable the mod
If your mod is dependent on another mod and there is an error while running,
try switching the order around on the #Include
Add the mod's name and variable name to the _mod objects below
*************************************************
*/
#Include Mod\Maintenance.ahk
#Include Mod\ChampionshipMenuing.ahk
#Include Mod\CheckTyres.ahk
#Include Mod\CheckStuck.ahk
#Include Mod\Hairpin.ahk
#Include Mod\Chicane.ahk
#Include Mod\CheckTurn.ahk
_mod_names :=
( LTrim Join
[
"Championship Menus",
"Check Tyres",
"Maintenance",
"Check Stuck",
"Post Hairpin",
"Chicane",
"Check Turns",
"Debug Mode"
]
)
_mod_vars =
( LTrim Join|
__enableChampionshipMenuing_mod__
__enableCheckTyres_mod__
__enableMaintenance_mod__
__enableCheckStuck_mod__
__enableHairpin_mod__
__enableChicane_mod__
__enableTurn_mod__
debug_mode
)
; Load mod settings
Loop, Parse, _mod_vars, |
{
IniRead, %A_LoopField%, config.ini, Mods, %A_LoopField%, 0
}
; Mods Gui Setup
Gui, 3: -MaximizeBox
Gui, 3: -MinimizeBox
Gui, 3: Color, c535770, c6272a4
Gui, 3: Font, c11f s9 Bold
;Gui, 3: Add, GroupBox, w200 h100, Mod List
Loop, Parse, _mod_vars, |
{
if ( %A_LoopField% = 1){
Gui, 3: Add, Checkbox, Checked v%A_LoopField%, % _mod_names[A_Index]
}
else {
Gui, 3: Add, Checkbox, v%A_LoopField%, % _mod_names[A_Index]
}
}
Gui, 3: Add, Button, gSaveMods, Save
GoTo EndModsDef
; End of Gui Setup
SaveMods:
Gui, 3:Submit
Loop, Parse, _mod_vars, |
{
IniWrite, % %A_LoopField%, config.ini, Mods, % A_LoopField
}
return
EndModsDef:

View File

@@ -0,0 +1,20 @@
#Include Races\PanAm.ahk
#Include Races\Tokyo.ahk
GoTo EndRaceDef
Race:
Switch RaceChoice
{
case "PanAm":
Race_PANAM()
return
case "Tokyo":
Race_Tokyo()
return
}
return
EndRaceDef:

View File

@@ -0,0 +1,126 @@
GoTo EndRace_PANAM_Def
Race_PANAM()
{
; Turn Containers are in the CheckTurn.ahk
turn1 := new TurnContainer(629, 109, 630, 95)
turn2 := new TurnContainer(539, 44, 511, 52)
turn3 := new TurnContainer(490, 89, 502, 111)
lap_marker := new TurnContainer(560, 112)
race_start_delay := 17400 ; this is for PS5. It may vary for PS4.
CheckForOilChange := Mod(30 - A_Index, 30)
SetFormat, IntegerFast, d
CheckForMaintenance := Mod(180 - A_Index, 180)
SetFormat, IntegerFast, d
if (__enableCheckTyres_mod__ != 0){
ToolTipper("Oil: " CheckForOilChange " race(s) remaining`nEngine: " CheckForMaintenance " race(s) remaining", 250, 45)
}
t_ExpectedRaceTime := 210000
t_RaceStartTime := A_TickCount
t_RaceFinishTime := t_RaceStartTime + t_ExpectedRaceTime
ToolTip, t_ExpectedRaceTime = %t_ExpectedRaceTime%`nt_RaceStartTime = %t_RaceStartTime%`nt_RaceFinishTime = %t_RaceFinishTime%, 100, 100, screen
race_complete := false
; Press X to start the race
;Tooltip
gosub, PressX
; Hold Acceleration and manage turning
Nitrous_On()
Accel_On(100)
;SetTimer, CheckTyresOverheating, 1000
; Retry race if time is taking more than 5.5 mins
; (assume something went wrong with race)
;SetTimer, RetryRace, 330000
Sleep (race_start_delay)
Turn_Right(4000, 68) /* before turn 1, to avoid queue of cars */
Loop {
; Turn 1
Tooltip
CheckTurn(turn1.startX, turn1.startY)
Tooltip, Turn 1 start found, 100, 100, screen
controller.Axes.LX.SetState(10)
CheckTurn(turn1.endX, turn1.endY)
Tooltip, Turn 1 end found, 100, 100, screen
Nitrous_On()
controller.Axes.LX.SetState(75)
sleep(1500)
controller.Axes.LX.SetState(65)
sleep(5000)
; Turn 2
CheckTurn(turn2.startX, turn2.startY)
Tooltip, Turn 2 start found, 100, 100, screen
controller.Axes.LX.SetState(20)
CheckTurn(turn2.endX, turn2.endY)
Tooltip, Turn 2 end found, 100, 100, screen
controller.Axes.LX.SetState(75)
sleep(2000)
controller.Axes.LX.SetState(65)
sleep(500)
; Turn 3
CheckTurn(turn3.startX, turn3.startY)
Nitrous_Off()
Tooltip, Turn 3 start found, 100, 100, screen
controller.Axes.LX.SetState(0)
CheckTurn(turn3.endX, turn3.endY)
Nitrous_On()
Tooltip, Turn 3 end found, 100, 100, screen
controller.Axes.LX.SetState(75)
sleep(2000)
controller.Axes.LX.SetState(65)
sleep(2000)
CheckTurn(lap_marker.startX, lap_marker.startY)
Tooltip, Lap Complete, 100, 100, screen
sleep(5000)
} until A_TickCount > t_racefinishtime
ToolTip, Out of Loop, 100, 100, screen
loop {
;ToolTip, Racing, 100, 100, Screen
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
controller.Dpad.SetState("Right")
Sleep, 50
controller.Dpad.SetState("None")
Sleep, 100
}
ToolTipper("Race End")
gosub, PauseLoop
Sleep, 500
return
}
Race_PANAM_Complete() {
race_complete := true
return
}
EndRace_PANAM_Def:

View File

@@ -0,0 +1,94 @@
GoTo EndRace_Tokyo_Def
Race_Tokyo()
{
SetTimer, CheckTyresOverheating, 1000
;;;;;;;;;;;;;;;;;;;;;; LAP 1 to 12 ;;;;;;;;;;;;;;;;;;;;;;
;ToolTip, TEMPLATE, 100, 100, Screen
ToolTip, Accel_On(100), 100, 100, Screen
Accel_On(100)
Nitrous_On()
loop, 15{
Press_X(delay:=200)
Press_Up(delay:=200)
}
Sleep, 12000
loop{
ToolTip, Looking for chicane, 100, 100, Screen
loop {
gosub, CheckChicane
if( Chicane_complete = true)
break
Sleep(100)
}
Sleep(1550)
Nitrous_Off()
Accel_Off()
Turn_Left(1500,15)
ToolTip, Nitrous Accel_On, 100, 100, Screen
Accel_On(100)
Nitrous_On()
gosub, ResetChicane
Sleep(30000)
ToolTip, Looking for hairpin, 100, 100, Screen
loop
{
gosub, CheckHairpin
/*
if (tyres_overheating)
{
ToolTip, Running Unstuck Routine - fingers crossed, 100, 100, Screen
Goto, Unstuck
return
}
*/
;Turn_Left(300, 30)
if( hairpinCount = 1 )
break
Sleep(100)
}
Sleep(1000)
Turn_Left(3000, 25)
Turn_Left(1000, 40)
Sleep(4000)
Turn_Left(1000, 20)
loop
{
gosub, CheckHairpin
/*
if (tyres_overheating)
{
ToolTip, Running Unstuck Routine - fingers crossed, 100, 100, Screen
Goto, Unstuck
return
}
*/
Press_X(delay:=200)
Press_Up(delay:=200)
;Turn_Left(300, 30)
if( hairpinCount = 2 ){
gosub, ResetHairpin
break
}
Sleep(100)
}
Turn_Right(6000, 85)
Turn_Right(15000, 75)
Sleep, 20000
}
}
EndRace_Tokyo_Def: