same old story with megaupload
here is the ahk source that you can compile, and uploading.com link is added to previous post:
/**
* FPLaunch MOD Version 1.295 WIP 4
Check FPLaunch Manual at http://www.hyperspin-fe.com/forum/showthread.php?t=10935
CODE MAP
This is short list of all sections and functions in this script
so that you can find and customize them quickly
GET PARAMATERS AND SET HOTKEYS
- reads input parameters from command line
GET AND CHECK PATHS
- gets settings from ini files
- calculates window coordinates
- hides taskbar, cursor and desktop
RUN SYSTEM
FUTURE PINBALL
VISUAL PINBALL
- commands for launching vp and fp
KILL COMMANDS
- this is where all the procedures are
Procedures:
CloseProcess: kills process - not used
rosve: rosve support for B2S active backglasses
rosveClose: kills B2S backglass
bigboss: bigboss support for different exe, sound levels and hdrender off
bigbossClose: returns sound and hdrender settings
SlamitBigScore: big boss slamit bigscore support
CloseSlam: close slamit pinball
PauseFP: fp pausing - executed on exit key
PauseVP: vp pausing - executed on exit key
ShowFP: close player and show editor - executed on alt-f4
ShowVP: close player and show editor - executed on alt-f4
SetSaveFPNeeded: set flag to save fp table on exit
CloseFP: closes fp
CloseVP: closes vp
CreateLoadScreen: loading screen loop with slider, closes nag messages
CreateBlackScreen: does print screen of fp table and shows it on the screen
CreatePauseScreen: shows blue PAUSED image
CreateExitScreen: creates exiting in 321 screens
ExitScreen: exit screen loop, draws pause or exit screens and exits from fp/vp
ExitScript: kills all gui's, activates hyperpin
REST OF SCRIPT
- scripts for enabling/disabling cursor and reading ini files
CaptureScreen - scripts for screen capture
HISTORY
1.295 wip 2
+ add sleep after printscreen
+ add sleep during winactivate of vpinball, dmd and backglass
+ put winactivate outside of loading screen
+ enable other exe names
+ read logical and phyisical key state
+ win activate of secondary fp window (backglass) - doesn't help
+ put version in usage - double click on fplaunch.exe to get version
+ bigboss additions (more exe files, sound mods ...)
+ support for slamit pinball
1.295 wip 3
+ winactivates removed (you have to set exe to nt4sp5 comp mode)
+ fix runtime error on close (you have to set exe to comp mode)
+ fix dmd not visible behind playfield (set exe to comp mode)
+ fps drop - same drop comes from loose of focus so it's not script related
+ shorter time for esc screens
+ win activate on nag screens brings them to focus and closes them
1.295 wip 4
+ fix dmd not visible behind playfield
+ put all rosve and bigboss code to functions
+ write a code map
+ winactivate of fp after pause and printscreen
+ fix winactivate on z screen buffer message (msg stays in back)
+ fgi keys mapped to enter for slamit bigscore pinball
if you don't use slamit you can remove them
TO DO:
- fix slow down after close (when vp is still closing)
- fix late printscreen in fp
- while loading esc should be quick kill and exit not pause
- save printscreen-a under name taken from description
- fp auto positioning
- new images with new text
- show instructions and flyer on pause
* Modified by dumpster.monkey (samwyze) & blur
* Based on original FPLaunch 1.2 by BadBoyBill
* Includes modified pause code from ManoWars Nuevo FPLaunch 1.2
* Includes exit png's based on jpg's from BBB's 'exit feature' thread
* Includes support for Pause on Exit by blur
* Esc and then 1 or Enter exits, Esc and then Esc again takes you back to the game
* Includes support for Pause in FP by blur
* For pause to work in FP you have to assign right mouse button to pause in FP
* Includes support for saving FP table position (scrolllock) on exit by blur
* VP nag screen removal by blur
* B2S backglass exe support by rosve
* different exe, sound level and hdrender flag support by bigboss
* slamit bigscore pinball support by bigboss
*
* All images are to be placed in %HyperPinDir%\Media\HyperPin\Images
*
* These settings are automatically added to your settings.ini
* file in the %HyperPinDir%\Settings folder on first start:
* [FPLaunch]
* exitScriptKey = q & s
* exitEmulatorKey = Esc
* toggleCursorKey = t
* pauseVPinball = p
* hideCursor = true
* hideDesktop = true
* hideTaskbar = true
* useExitScreen = true
* usePauseKey = true
* useLoadScreen = true
* fadespeed = 25
* useExitAsPause = true
* exitEmulatorKey2 = 1
* exitEmulatorKey3 = Enter
* pauseFPKey = RButton
* saveFPTables = true
*
* NOTE: This is a wip and is by no means complete or optimized
* Feel free to disect, mod, clean, optimize, distribute or delete!
*
* Autohotkey script by BadBoyBill
[email protected]
* CursorHide by Lazlo
*
* If you are reading this and do not have autohotkey you can get it
* @ http://www.autohotkey.com/download/
* If you would like to modify this script and share it thats OK, but
* see if your modification is something that we would like to add
* to the official version.
*
* Refer to the autohotkey documentation for the keyoboard keylist
*
* If this script does not support your favorite emulator
* then please request support @ http://www.hyperspin-fe.com/forum
*
* Supports Future Pinball and Visual Pinball
*
*/
#SingleInstance force ;Prevent multiple instances
#InstallKeybdHook
SetTitleMatchMode 2 ;Use relaxed title matching
#InstallMouseHook
;#UseHook ; this one breaks long press functionality for gamepad button mapped to Esc!!!
#KeyHistory 500
#MaxThreadsPerHotkey 1
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
DetectHiddenWindows on
;*******************************************************************************
;* EDIT BELOW THIS POINT AT YOUR OWN RISK *
;*******************************************************************************
;------------------------------------------------------------------------------;
; GET PARAMATERS AND SET HOTKEYS ;
;------------------------------------------------------------------------------;
;CHECKING FOR 2 PARAMS, IF NOT THEN EXIT
if 0 < 2
{
MsgBox FPLaunch v. 1.295 WIP 4`nUsage: FPLaunch.ahk/exe "System Name" "Rom Name"
ExitApp
}
systemName = %1%
tableName = %2%
hyperini = %A_ScriptDir%\Settings\Settings.ini
picDir = %A_ScriptDir%\Media\HyperPin\Images\
;------------------------------------------------------------------------------;
; GET AND CHECK PATHS ;
;------------------------------------------------------------------------------;
GoSub, CheckINI
IniRead, iniEmuPath, %hyperini%, %systemName%, Path
emuPath := GetFullName(iniEmuPath)
IniRead, iniTablePath, %hyperini%, %systemName%, Table_Path
tablePath := GetFullName(iniTablePath)
IniRead, executable, %hyperini%, %systemName%, Exe
iniKeys = exitScriptKey,exitEmulatorKey,hideCursor,toggleCursorKey,hideDesktop,hideTaskbar
,useExitScreen,usePauseKey,pauseVPinball,useLoadScreen,fadespeed
,useExitAsPause,exitEmulatorKey2,exitEmulatorKey3,pauseFPKey,saveFPTables
Loop, parse, iniKeys, `,
{
IniRead, %A_LoopField%, %hyperini%, FPLaunch, %A_LoopField%
}
romExtension =
GoSub, CheckPaths
loadspeed := fadespeed * 10
Hotkey, %exitScriptKey%, ExitScript
; we use loading screeen dimensions for all screens
;If (useLoadScreen = "true") {
ProgBar = 0
gui, 99:add,picture,hwndloadpic, %A_ScriptDir%\Media\HyperPin\Images\Loading.png
controlgetpos,,,wLoad,hLoad,,ahk_id %loadpic%
gui, 99:destroy
wLoad := Round(wLoad*A_ScreenWidth/1280)
xLoad := Round(A_ScreenWidth/2-(wLoad/2))
hLoad := Round(hLoad*A_ScreenHeight/800)
yLoad := Round(A_ScreenHeight/2-(hLoad/2))
wLoadProgress := Round(20*A_ScreenWidth/1280)
xLoadProgress := Round(145*A_ScreenWidth/1280)
hLoadProgress := Round(194*A_ScreenHeight/800)
yLoadProgress := Round(288*A_ScreenHeight/800)
;}
;If (usePauseKey = "true") {
Paused = 0
; PausePic =
; gui, 98:add,picture,hwndpausepic, %picDir%\Media\HyperPin\Images\Pause.png
; controlgetpos,,,wPause,hPause,,ahk_id %pausepic%
; gui, 98:destroy
; wPause := Round(wPause*A_ScreenWidth/1280)
; xPause := Round(A_ScreenWidth/2-(wPause/2))
; hPause := Round(hPause*A_ScreenHeight/800)
; yPause := Round(A_ScreenHeight/2-(hPause/2))
;}
;If (useExitScreen = "true") {
Exiting = 0
; Exit =
; gui, 97:add,picture,hwndexitpic, %A_ScriptDir%\Media\HyperPin\Images\Exit_1.png
; controlgetpos,,,wExit,hExit,,ahk_id %exitpic%
; gui, 97:destroy
; wExit := Round(wExit*A_ScreenWidth/1280)
; xExit := Round(A_ScreenWidth/2-(wExit/2))
; hExit := Round(hExit*A_ScreenHeight/800)
; yExit := Round(A_ScreenHeight/2-(hExit/2))
;}
if (hideCursor = "true")
{
MouseMove %A_ScreenWidth%, %A_ScreenHeight%
Hotkey, %toggleCursorKey%, ToggleCursor
SystemCursor("Off")
}
if (hideTaskbar = "true")
{
WinHide, ahk_class Shell_TrayWnd
WinHide, Start ahk_class Button
}
if (hideDesktop = "true")
{
Gui, Color, 000000
Gui +AlwaysOnTop -Caption +ToolWindow
Gui, Show, x0 y0 W%A_ScreenWidth% H%A_ScreenHeight%, BlackScreen
}
WinClose, cmd.exe
;------------------------------------------------------------------------------;
; RUN SYSTEM ;
;------------------------------------------------------------------------------;
;**********************************FUTURE PINBALL***********************************
if (systemName = "Future Pinball") {
if(tableName = "BigScore") { ; bigboss slamit bigscore support
#IfWinActive ahk_class SlamIt Pinball - Big Score
; Remap some keys (this has to be here, not in procedure):
; enter to down arrow for plunger
; 1 to s for start, 5 to 1 for insert coin
; magnasave, flyer, genre or instructions to enter for menus
; change it to what you have on your cab and recompile
; or remove it if you don't use slamit pinball
RControl::Enter
LControl::Enter
f::Enter
g::Enter
i::Enter
Enter::down
5::1
1::s
#IfWinActive
GoSub SlamitBigScore
} else {
if (useExitScreen = "true")
; fp needs $ or it will not get the key
; * enables any modifier to be pressed with the key (shift, ctrl, alt)
Hotkey, $*%exitEmulatorKey%, ExitScreen
else if (useExitAsPause = "true")
Hotkey, $*%exitEmulatorKey%, PauseFP
else
Hotkey, $*%exitEmulatorKey%, CloseFP
if (usePauseKey = "true") {
Hotkey, $*%pauseVPinball%, PauseFP
;Hotkey, $*Pause, PauseFP
}
Hotkey, $!F4, ShowFP
if (saveFPTables = "true") {
Hotkey, $ScrollLock, SetSaveFPNeeded
Run, "%emuPath%\%executable%" /open "%tablePath%\%tableName%.fpt" /play /arcaderender,,Min UseErrorLevel
} else
Run, "%emuPath%\%executable%" /open "%tablePath%\%tableName%.fpt" /play /Exit /arcaderender,,Min UseErrorLevel
If (useLoadScreen = "true") ;Draw the loading Gui with wrapped Progress bar
Gosub CreateLoadScreen
Else {
WinWait, ahk_class FuturePinball
WinHide, ahk_class FuturePinball
}
WinWait, ahk_class FuturePinballOpenGL
WinActivate, ahk_class FuturePinballOpenGL
WinWaitActive, ahk_class FuturePinballOpenGL
Gui, destroy
WinWait, ahk_class FuturePinballOpenGLSecondary,,1
WinActivate, ahk_class FuturePinballOpenGLSecondary
WinWaitActive, ahk_class FuturePinballOpenGLSecondary,,1
WinActivate, ahk_class FuturePinballOpenGL
Process, WaitClose, %executable%
}
}
;**********************************VISUAL PINBALL***********************************
else if (systemName = "Visual Pinball")
{
GoSub bigboss ; bigboss support for different exe, sound levels and hdrender off
GoSub rosve ; rosve support for B2S active backglasses
Run, "%emuPath%\%executable%" /play -"%tablePath%%tableName%.vpt",, Min UseErrorLevel ;Run Minimized
;was the best way I could hide the vp editor and play loading screens as WinHide didn't seem to find them
If (useExitScreen = "true") ; * breaks long press functionality for gamepad button mapped to Esc so it had to be removed
Hotkey, %exitEmulatorKey%, ExitScreen
Else If (useExitAsPause = "true")
Hotkey, *%exitEmulatorKey%, PauseVP
Else
Hotkey, *%exitEmulatorKey%, CloseVP
If (usePauseKey = "true") {
Hotkey, $*%pauseVPinball%, PauseVP
;Hotkey, $*Pause, PauseVP
}
Hotkey, $!F4, ShowVP
If (useLoadScreen = "true") ;Draw the loading Gui with wrapped Progress bar
Gosub CreateLoadScreen
Else {
WinWait, ahk_class VPinball
WinHide, ahk_class VPinball
}
WinWaitActive, ahk_class VPPlayer ;Wait for vp to be Ready before killing Gui blackScreen
Gui, Destroy
;bring dmd on top of playfield
DetectHiddenWindows off ;don't detect dmd if it is hidden
WinActivate, ahk_class MAME
WinWaitActive, ahk_class MAME
Click 10, 10
WinWaitActive, ahk_class MAME
Sleep 100
DetectHiddenWindows on
WinActivate, ahk_class VPPlayer
WinWaitActive, ahk_class VPPlayer
MouseMove A_ScreenWidth//2, A_ScreenHeight//2
Click
Process, WaitClose, %executable%
}
else
{
MsgBox,48,Error,%systemName% is an invalid System Name or %executable% isnt supported yet,6
}
;------------------------------------------------------------------------------;
; WHEN EMULATOR FINISHES OR IF LAUNCH EXE FAILS ;
;------------------------------------------------------------------------------;
;************PROBABLY DO NOT NEED TO EDIT THIS AREA*************
if (ErrorLevel = "ERROR")
{
MsgBox,48,Error,Failed to run executable check your paths,6
}
Goto ExitScript ; Exits script and returns to frontend
;------------------------------------------------------------------------------;
; KILL COMMANDS ;
;------------------------------------------------------------------------------;
;************PROBABLY DO NOT NEED TO EDIT THIS AREA*************
CloseProcess:
Hotkey, %exitScriptKey%, Off
Process, Close, %executable%
Process, WaitClose, %executable%
return
; rosve support for B2S active backglasses
rosve:
;--------------------------------------------------------------
;------ check if an active backglass shall be started -----
;--------------------------------------------------------------
StringRight, ending, tableName, 3
if (ending = "B2S")
{
Run, %tablePath%%tableName%.exe, %tablePath%
sleep 200
}
return
rosveClose:
; rosve
; --------------------------------------------------------------
; --- Close the animated backglass -----------------------
; --------------------------------------------------------------
if (ending = "B2S")
{
WinKill, Form1
}
return
; bigboss support for different exe, sound levels and hdrender off
bigboss:
; bigboss
; Array examples: http://www.autohotkey.com/docs/misc/Arrays.htm
; Read config file for vp9.08 tables
vp908count = 0
; This loop retrieves each line from the file, one at a time.
Loop, Read, %A_ScriptDir%\Settings\vp908tables.txt
{
vp908count += 1 ; Keep track of how many items are in the array.
vp908array%vp908count% := A_LoopReadLine ; Store this line in the next array element.
}
; Check if table is in the vp908tables array.
Loop %vp908count%
{
; The following line uses the := operator to retrieve an array element:
element := vp908array%A_Index% ; A_Index is a built-in variable.
if(tableName = element)
{
TableIndex = %A_Index%
vpExeIndex = %TableIndex%
vpExeIndex += 1
executable := vp908array%vpExeIndex%
break
}
}
; Read config file for disable HD rendering tables since this is a global setting now.
HDRenderOffCount = 0
HDRenderOffChanged = 0
; This loop retrieves each line from the file, 1 at a time.
Loop, Read, %A_ScriptDir%\Settings\hdrenderofftables.txt
{
HDRenderOffCount += 1 ; Keep track of how many items are in the array.
HDRenderOffArray%HDRenderOffCount% := A_LoopReadLine ; Store this line in the next array element.
}
; Check if table is in the no hdrender array and write the VP hardwarerender key to off.
Loop %HDRenderOffCount%
{
; The following line uses the := operator to retrieve an array element:
element := HDRenderOffArray%A_Index% ; A_Index is a built-in variable.
if(tableName = element)
{
HDRenderOffChanged = 1
RegWrite, REG_DWORD, HKEY_CURRENT_USER, Software\Visual Pinball\Player, HardwareRender, 0
break
}
}
; Read config for sound volume hard codes
SoundModCount = 0
SoundChangeAmount = 0
Loop, Read, %A_ScriptDir%\Settings\soundmodtables.txt
{
SoundModCount += 1
SoundModCountArray%SoundModCount% := A_LoopReadLine
}
; Check if table is in the vp908tables array.
Loop %SoundModCount%
{
; The following line uses the := operator to retrieve an array element:
TableIndex = %A_Index%
SoundIndex = %TableIndex%
SoundIndex += 1
TheTable := SoundModCountArray%TableIndex%
TheSoundAmount := SoundModCountArray%SoundIndex%
if(tableName = TheTable)
{
; Set the new sound change amount. Should be a + or - number otherwise it needs a , SoundSet, absoluteamt
; SoundSet: http://www.autohotkey.com/docs/commands/SoundSet.htm
; SoundGet: http://www.autohotkey.com/docs/commands/SoundGet.htm
;SoundSet, %TheSoundAmount%
Send {Volume_Down %TheSoundAmount%}
break
}
}
return
bigbossClose:
; bigboss
; Restore hdrender original value
if (HDRenderOffChanged)
RegWrite, REG_DWORD, HKEY_CURRENT_USER, Software\Visual Pinball\Player, HardwareRender, 1
; Restore master volume original value
if (TheSoundAmount)
Send {Volume_Up %TheSoundAmount%}
return
; big boss slamit bigscore support
SlamitBigScore:
Hotkey, $%exitEmulatorKey%, CloseSlam
;setworkingdir, "..\SlamIt\BigScore.exe"
Run, "..\slamit\go.bat", "..\SlamIt"
WinWait, ahk_class SlamIt Pinball - Big Score
Gui, destroy
Process, WaitClose, BigScore.exe
goto ExitScript
return
CloseSlam:
WinClose, ahk_class SlamIt Pinball - Big Score
goto ExitScript
return
PauseFP:
if (Paused = 0) {
Paused = 1
WinActivate, ahk_class FuturePinballOpenGL
WinWaitActive, ahk_class FuturePinballOpenGL
Send {%pauseFPKey%}
WinWaitActive, ahk_class FuturePinballOpenGL
Gosub CreateBlackScreen
Gosub CreatePauseScreen
Hotkey, $%exitEmulatorKey2%, CloseFP
Hotkey, $%exitEmulatorKey2%, On
Hotkey, $%exitEmulatorKey3%, CloseFP
Hotkey, $%exitEmulatorKey3%, On
} else {
Paused = 0
Gui 1: Destroy
Gui 5: Destroy
WinActivate, ahk_class FuturePinballOpenGL
WinWaitActive, ahk_class FuturePinballOpenGL
Send {%pauseFPKey%}
Hotkey, $%exitEmulatorKey2%, Off
Hotkey, $%exitEmulatorKey3%, Off
}
return
PauseVP:
If (Paused = 0) {
Paused = 1
Gosub CreatePauseScreen
Hotkey, $%exitEmulatorKey2%, CloseVP
Hotkey, $%exitEmulatorKey2%, On
Hotkey, $%exitEmulatorKey3%, CloseVP
Hotkey, $%exitEmulatorKey3%, On
} Else {
Paused = 0
Gui, Destroy
WinActivate, ahk_class VPPlayer
Hotkey, $%exitEmulatorKey2%, Off
Hotkey, $%exitEmulatorKey3%, Off
}
return
ShowFP:
if (Paused = 1)
Gosub PauseFP
WinActivate, ahk_class FuturePinballOpenGL
WinWaitActive, ahk_class FuturePinballOpenGL
Send {Esc}
WinWaitClose, ahk_class FuturePinballOpenGL
WinShow, ahk_class FuturePinball
WinRestore, ahk_class FuturePinball
WinActivate, ahk_class FuturePinball
WinWaitActive, ahk_class FuturePinball
SystemCursor("On")
WinShow, ahk_class Shell_TrayWnd
WinShow, Start ahk_class Button
Suspend, On
MouseMove 200,200
WinWait, ahk_class FuturePinballOpenGL
Suspend, Off
SystemCursor("Off")
WinHide, ahk_class Shell_TrayWnd
WinHide, Start ahk_class Button
WinHide, ahk_class FuturePinball
WinMinimize, ahk_class FuturePinball
WinActivate, ahk_class FuturePinballOpenGL
WinWaitActive, ahk_class FuturePinballOpenGL
return
ShowVP:
if (Paused = 1)
Gosub PauseVP
WinActivate, ahk_class VPPlayer
WinWaitActive, ahk_class VPPlayer
WinClose, ahk_class VPPlayer
WinWaitClose, ahk_class VPPlayer
WinShow, ahk_class VPinball
WinRestore, ahk_class VPinball
WinActivate, ahk_class VPinball
WinWaitActive, ahk_class VPinball
SystemCursor("On")
WinShow ahk_class Shell_TrayWnd
WinShow Start ahk_class Button
Suspend, On
MouseMove 200,200
WinWait, ahk_class VPPlayer
Suspend, Off
SystemCursor("Off")
WinHide, ahk_class Shell_TrayWnd
WinHide, Start ahk_class Button
WinHide, ahk_class VPinball
WinMinimize, ahk_class VPinball
WinWaitActive, ahk_class VPPlayer
;WinActivate, ahk_class TBackglass
;WinActivate, ahk_class MAME
;WinActivate, ahk_class VPPlayer
return
SetSaveFPNeeded:
saveFPNeeded = true
Send {ScrollLock}
return
CloseFP:
;close all gui's except black screen (gui 5)
Loop, 4
Gui, %A_Index%: Destroy
;hide and minimize fp editor
WinHide, ahk_class FuturePinball
WinMinimize, ahk_class FuturePinball
;Future Pinball must be closed this way instead of killing process
;or it wil not save your last game information.i.e score/credtis
WinActivate, ahk_class FuturePinballOpenGL
WinWaitActive, ahk_class FuturePinballOpenGL
Send {Esc}
WinWaitClose, ahk_class FuturePinballOpenGL
;saving fp table position, black screen hides fp window
if (saveFPTables = "true") and (saveFPNeeded = "true") {
;WinRestore, ahk_class FuturePinball
WinActivate, ahk_class FuturePinball
WinWaitActive, ahk_class FuturePinball
WinMenuSelectItem, ahk_class FuturePinball,,File,Save
Sleep, 1000
}
WinClose, ahk_class FuturePinball
GoSub, ExitScript
return
CloseVP:
Hotkey, %exitScriptKey%, Off
GoSub rosveClose
;Visual Pinball must be closed this way instead of killing process
;or it wil not save your last game information.i.e score/credtis
;DetectHiddenWindows, on ;Or next line will not work
Loop, 4
Gui, %A_Index%: Destroy
;This line fixes where the VP Window flashes real quick
;when closing the window for a cleaner exit
WinHide, ahk_class VPinball
WinMinimize, ahk_class VPinball
WinClose, ahk_class VPinball
GoSub bigbossClose
GoSub, ExitScript
return
CreateLoadScreen:
SetTitleMatchMode 2 ;Use relaxed title matching
Gui, Destroy ; kill Gui blackScreen
Gui, Color, EEAA99
Gui, Margin, 0, 0
Gui, Add, Picture, h%hLoad% w%wLoad% vLoadPic, %picDir%loading.png
Gui, Add, Progress, x%xLoadProgress% y%yLoadProgress% w%wLoadProgress% h%hLoadProgress% -smooth 0x8 c0C32A5 vLoading vertical BackgroundFFFFFF
Gui +AlwaysOnTop -Caption +Lastfound
Gui, Show, AutoSize Center, loadScreen
WinSet, TransColor, EEAA99
Loop {
Sleep %loadspeed%
;ProgBar += 1
;If ProgBar = %loadspeed%
;{
GuiControl,, Loading, +1
; ProgBar = 0
;}
; nag screens removal
ifWinExist, Please
{
WinActivate, Please
IfWinActive, Please
{
Send {Tab}
Send {Space}
Send {Enter}
}
} else ifWinExist, Game Info
{
WinActivate, Game Info
IfWinActive, Game Info
{
Send {Enter}
Send {Enter}
}
} else ifWinExist, Notice
{
WinActivate, Notice
IfWinActive, Notice
{
Send {Enter}
Send {Enter}
}
} else ifWinExist, VBScript
{
WinActivate, VBScript
IfWinActive, VBScript
{
Send {Enter}
}
} else ifWinExist, Error
{
; we have some error and we want to see it so we don't send Enter
;Send {Enter}
Gui, Destroy
WinActivate, Error
WinWaitActive, Error
SystemCursor("On")
WinWaitClose, Error
WinClose, ahk_class VPinball
WinClose, ahk_class FuturePinball
Process, WaitClose, %executable%
ExitApp
}
if (systemName = "Visual Pinball") {
IfWinExist, Visual Pinball Player,, DMD ;Check if visual pinball is Ready
{
IfWinActive, Visual Pinball Player,, DMD ;Check if visual pinball is Ready
{
Break
}
}
} else {
IfWinExist, ahk_class FuturePinballOpenGL ;Check if visual pinball is Ready
{
IfWinActive, ahk_class FuturePinballOpenGL ;Check if visual pinball is Ready
{
Break
}
}
}
}
Gui, Destroy ; Vic
Return
CreateBlackScreen:
CaptureScreen(3)
;Sleep 100
WinActivate, ahk_class FuturePinballOpenGL
WinWaitActive, ahk_class FuturePinballOpenGL,,2
Gui 5: Destroy
Gui 5: Color, 000000
Gui 5: Margin, 0, 0
Gui 5: Add, Picture, W%A_ScreenWidth% H%A_ScreenHeight% vScreenPic, screen.bmp
Gui 5: +AlwaysOnTop -Caption +ToolWindow
Gui 5: Show, x0 y0 W%A_ScreenWidth% H%A_ScreenHeight%, BlackScreen
Return
CreatePauseScreen:
Gui, Destroy
Gui, Color, EEAA99
Gui, Margin, 0, 0
Gui, Add, Picture, h%hLoad% w%wLoad% vPausePic, %picDir%pause.png
Gui +AlwaysOnTop -Caption +Lastfound
Gui, Show, AutoSize Center, pauseScreen
WinSet, TransColor, EEAA99
;Gui, Show
Return
CreateExitScreen:
Gui, Destroy
Loop, 4
{
ExitPic = Exit_%A_Index%.png
Gui %A_Index%: Destroy
Gui %A_Index%: Color, EEAA99
Gui %A_Index%: Margin, 0, 0
Gui %A_Index%: Add, Picture, w%wLoad% h%hLoad%, %picDir%%ExitPic%
Gui %A_Index%: +AlwaysOnTop -Caption +Lastfound
Gui %A_Index%: Show, AutoSize Center Hide
WinSet, TransColor, EEAA99
}
Return
ExitScreen:
if (Exiting = 0) {
Exiting = 1
LoopVal = 0
;Gosub CreateExitScreen ; check if we need this - nope
Loop {
;Sleep, 10 ; check if we need this - nope
state = 0
; check for logical and physical state of the key
GetKeyState, statel, %exitEmulatorKey%
if statel = D
state = 1
GetKeyState, statep, %exitEmulatorKey%, P
if statep = D
state = 1
if (state) {
if (loopVal = 10) {
if (Paused = 1) {
if (systemName = "Future Pinball")
GoSub PauseFP
else
GoSub PauseVP
}
Gosub CreateExitScreen
if (systemName = "Future Pinball")
GoSub CreateBlackScreen
Gui, 3:Show
} else if loopVal = 25
Gui, 2:Show
else if loopVal = 40
Gui, 1:Show
Sleep, %fadespeed%
if (loopVal = 60) {
if (systemName = "Visual Pinball")
GoSub, CloseVP
else if (systemName = "Future Pinball")
GoSub, CloseFP
break
}
} else {
Exiting = 0
if (LoopVal < 10 && useExitAsPause = "true") {
if (systemName = "Visual Pinball")
GoSub, PauseVP
else if (systemName = "Future Pinball")
GoSub, PauseFP
} else {
Loop, 5
Gui, %A_Index%: Destroy
WinActivate, Visual Pinball Player,, DMD
WinActivate, ahk_class FuturePinballOpenGL
}
Transvalue = 0
LoopVal = 0
break
}
LoopVal += 1
}
}
Return
ExitScript:
Loop, 5
Gui, %A_Index%: Destroy
Process, Exist, HyperPin.exe
PID := errorLevel
;no need to show taskbar on exit, it can only cause problems
;it was already commented in 1.10
;if (hideTaskbar = "true") {
;WinShow ahk_class Shell_TrayWnd
;WinShow Start ahk_class Button
;}
if (PID) {
WinActivate, ahk_pid %PID%
;WinWaitActive, ahk_pid %PID%
}
if (hideCursor = "true")
SystemCursor("On")
;to debug script uncomment the pause
;Pause
ExitApp
OnExit, ExitScript
return
;------------------------------------------------------------------------------;
; REST OF SCRIPT ;
;------------------------------------------------------------------------------;
;************PROBABLY DO NOT NEED TO EDIT THIS AREA*************
SystemCursor(OnOff=1) ; INIT = "I","Init"; OFF = 0,"Off"; TOGGLE = -1,"T","Toggle"; ON = others
{
static AndMask, XorMask, $, h_cursor
,c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13 ; system cursors
, b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13 ; blank cursors
, h1,h2,h3,h4,h5,h6,h7,h8,h9,h10,h11,h12,h13 ; handles of default cursors
if (OnOff = "Init" or OnOff = "I" or $ = "") ; init when requested or at first call
{
$ = h ; active default cursors
VarSetCapacity( h_cursor,4444, 1 )
VarSetCapacity( AndMask, 32*4, 0xFF )
VarSetCapacity( XorMask, 32*4, 0 )
system_cursors = 32512,32513,32514,32515,32516,32642,32643,32644,32645,32646,32648,32649,32650
StringSplit c, system_cursors, `,
Loop %c0%
{
h_cursor := DllCall( "LoadCursor", "uint",0, "uint",c%A_Index% )
h%A_Index% := DllCall( "CopyImage", "uint",h_cursor, "uint",2, "int",0, "int",0, "uint",0 )
b%A_Index% := DllCall("CreateCursor","uint",0, "int",0, "int",0
, "int",32, "int",32, "uint",&AndMask, "uint",&XorMask )
}
}
if (OnOff = 0 or OnOff = "Off" or $ = "h" and (OnOff < 0 or OnOff = "Toggle" or OnOff = "T"))
$ = b ; use blank cursors
else
$ = h ; use the saved cursors
Loop %c0%
{
h_cursor := DllCall( "CopyImage", "uint",%$%%A_Index%, "uint",2, "int",0, "int",0, "uint",0 )
DllCall( "SetSystemCursor", "uint",h_cursor, "uint",c%A_Index% )
}
}
ToggleCursor:
SystemCursor("Toggle")
WinShow ahk_class Shell_TrayWnd
WinShow Start ahk_class Button
return
IniRead(Filename, Section, Key, Default = "") {
FileRead, text, *t %Filename%
text = `n%text%`n
StringTrimLeft, text, text, InStr(text, "`n[" . Section . "]`n")
Loop, 8 {
sp := sp . " "
StringReplace, text, text, %Key%%sp%=, %Key%=
If ErrorLevel
Break
}
start := InStr(text, "`n" . Key . "=")
If !start
Return, Default
start += StrLen(Key) + 2
StringMid, Value, text, start, InStr(text, "`n", false, start) - start
Return, Value
}
;Get Full Path from Relative Path
GetFullName( fn ) {
static buf, i
if !i
i := VarSetCapacity(buf, 512)
DllCall("GetFullPathNameA", "str", fn, "uint", 512, "str", buf, "str*", 0)
return buf
}
CheckINI:
IfNotExist, %A_ScriptDir%\HyperPin.exe
{
MsgBox,48,Error, Must be in same directory as HyperPin.exe,6
Goto ExitScript
}
IfNotExist, %A_ScriptDir%\Settings\Settings.ini
{
MsgBox,48,Error,Cannot Find %A_ScriptDir%\Settings\Settings.ini,6
Goto ExitScript
}
return
CheckPaths:
romFound =
StringRight, emuPathBackSlash, EmuPath, 1
StringRight, tablePathBackSlash, TablePath, 1
If (emuPathBackSlash != "\" || tablePathBackSlash != "\")
{
MsgBox,48,Error, Make sure your paths contains a backslash on the end ,6
Goto ExitScript
}
If (executable = "")
{
MsgBox,48,Error, Missing executable in Settings.ini ,6
Goto ExitScript
}
If (tablePath = "")
{
MsgBox,48,Error, Missing rom path in Settings.ini ,6
Goto ExitScript
}
If (emuPath = "")
{
MsgBox,48,Error, Missing emulator path in Settings.ini ,6
Goto ExitScript
}
If (exitScriptKey = "ERROR") or (useExitAsPause = "ERROR") or (exitEmulatorKey3 = "ERROR")
Gosub addIni
IfNotExist, %EmuPath%%Executable%
{
MsgBox,48,Error,Cannot Find %EmuPath%%Executable%,6
Goto ExitScript
}
return
addIni:
IniWrite, q & s, %hyperini%, FPLaunch, exitScriptKey
IniWrite, Esc, %hyperini%, FPLaunch, exitEmulatorKey
IniWrite, t, %hyperini%, FPLaunch, toggleCursorKey
IniWrite, p, %hyperini%, FPLaunch, pauseVPinball
IniWrite, true, %hyperini%, FPLaunch, hideCursor
IniWrite, true, %hyperini%, FPLaunch, hideDesktop
IniWrite, true, %hyperini%, FPLaunch, hideTaskbar
IniWrite, false, %hyperini%, FPLaunch, useExitScreen
IniWrite, true, %hyperini%, FPLaunch, usePauseKey
IniWrite, true, %hyperini%, FPLaunch, useLoadScreen
IniWrite, 25, %hyperini%, FPLaunch, fadespeed
IniWrite, true, %hyperini%, FPLaunch, useExitAsPause
IniWrite, 1, %hyperini%, FPLaunch, exitEmulatorKey2
IniWrite, Enter, %hyperini%, FPLaunch, exitEmulatorKey3
IniWrite, RButton, %hyperini%, FPLaunch, pauseFPKey
IniWrite, true, %hyperini%, FPLaunch, saveFPTables
exitScriptKey = q & s
exitEmulatorKey = Esc
toggleCursorKey = t
pauseVPinball = p
hideCursor = true
hideDesktop = true
hideTaskbar = true
useExitScreen = true
usePauseKey = true
useLoadScreen = true
fadespeed = 25
useExitAsPause = true
exitEmulatorKey2 = 1
exitEmulatorKey3 = Enter
pauseFPKey = RButton
saveFPTables = true
return
/* CaptureScreen(aRect, bCursor, sFileTo, nQuality)
By Sean - Taken from Forum page: http://www.autohotkey.com/forum/topic18146.html
1) If the optional parameter bCursor is True, captures the cursor too.
2) If the optional parameter sFileTo is 0, set the image to Clipboard.
If it is omitted or "", saves to screen.bmp in the script folder,
otherwise to sFileTo which can be BMP/JPG/PNG/GIF/TIF.
3) The optional parameter nQuality is applicable only when sFileTo is JPG. Set it to the desired quality level of the resulting JPG, an integer between 0 - 100.
4) If aRect is 0/1/2/3, captures the entire desktop/active window/active client area/active monitor.
5) aRect can be comma delimited sequence of coordinates, e.g., "Left, Top, Right, Bottom" or "Left, Top, Right, Bottom, Width_Zoomed, Height_Zoomed".
In this case, only that portion of the rectangle will be captured. Additionally, in the latter case, zoomed to the new width/height, Width_Zoomed/Height_Zoomed.
Example:
CaptureScreen(0)
CaptureScreen(1)
CaptureScreen(2)
CaptureScreen(3)
CaptureScreen("100, 100, 200, 200")
CaptureScreen("100, 100, 200, 200, 400, 400") ; Zoomed
*/
/* Convert(sFileFr, sFileTo, nQuality)
Convert("C:\image.bmp", "C:\image.jpg")
Convert("C:\image.bmp", "C:\image.jpg", 95)
Convert(0, "C:\clip.png") ; Save the bitmap in the clipboard to sFileTo if sFileFr is "" or 0.
*/
CaptureScreen(aRect = 0, bCursor = False, sFile = "", nQuality = "")
{
If !aRect
{
SysGet, nL, 76
SysGet, nT, 77
SysGet, nW, 78
SysGet, nH, 79
}
Else If aRect = 1
WinGetPos, nL, nT, nW, nH, A
Else If aRect = 2
{
WinGet, hWnd, ID, A
VarSetCapacity(rt, 16, 0)
DllCall("GetClientRect" , "Uint", hWnd, "Uint", &rt)
DllCall("ClientToScreen", "Uint", hWnd, "Uint", &rt)
nL := NumGet(rt, 0, "int")
nT := NumGet(rt, 4, "int")
nW := NumGet(rt, 8)
nH := NumGet(rt,12)
}
Else If aRect = 3
{
VarSetCapacity(mi, 40, 0)
DllCall("GetCursorPos", "int64P", pt)
DllCall("GetMonitorInfo", "Uint", DllCall("MonitorFromPoint", "int64", pt, "Uint", 2), "Uint", NumPut(40,mi)-4)
nL := NumGet(mi, 4, "int")
nT := NumGet(mi, 8, "int")
nW := NumGet(mi,12, "int") - nL
nH := NumGet(mi,16, "int") - nT
}
Else
{
StringSplit, rt, aRect, `,, %A_Space%%A_Tab%
nL := rt1
nT := rt2
nW := rt3 - rt1
nH := rt4 - rt2
znW := rt5
znH := rt6
}
mDC := DllCall("CreateCompatibleDC", "Uint", 0)
hBM := CreateDIBSection(mDC, nW, nH)
oBM := DllCall("SelectObject", "Uint", mDC, "Uint", hBM)
hDC := DllCall("GetDC", "Uint", 0)
DllCall("BitBlt", "Uint", mDC, "int", 0, "int", 0, "int", nW, "int", nH, "Uint", hDC, "int", nL, "int", nT, "Uint", 0x40000000 | 0x00CC0020)
DllCall("ReleaseDC", "Uint", 0, "Uint", hDC)
If bCursor
CaptureCursor(mDC, nL, nT)
DllCall("SelectObject", "Uint", mDC, "Uint", oBM)
DllCall("DeleteDC", "Uint", mDC)
If znW && znH
hBM := Zoomer(hBM, nW, nH, znW, znH)
If sFile = 0
SetClipboardData(hBM)
Else Convert(hBM, sFile, nQuality), DllCall("DeleteObject", "Uint", hBM)
}
CaptureCursor(hDC, nL, nT)
{
VarSetCapacity(mi, 20, 0), mi := Chr(20)
DllCall("GetCursorInfo", "Uint", &mi)
bShow := NumGet(mi, 4)
hCursor := NumGet(mi, 8)
xCursor := NumGet(mi,12)
yCursor := NumGet(mi,16)
If bShow && hCursor:=DllCall("CopyIcon", "Uint", hCursor)
{
VarSetCapacity(ni, 20, 0)
DllCall("GetIconInfo", "Uint", hCursor, "Uint", ∋)
bIcon := NumGet(ni, 0)
xHotspot := NumGet(ni, 4)
yHotspot := NumGet(ni, 8)
hBMMask := NumGet(ni,12)
hBMColor := NumGet(ni,16)
DllCall("DrawIcon", "Uint", hDC, "int", xCursor - xHotspot - nL, "int", yCursor - yHotspot - nT, "Uint", hCursor)
DllCall("DestroyIcon", "Uint", hCursor)
If hBMMask
DllCall("DeleteObject", "Uint", hBMMask)
If hBMColor
DllCall("DeleteObject", "Uint", hBMColor)
}
}
Zoomer(hBM, nW, nH, znW, znH)
{
mDC1 := DllCall("CreateCompatibleDC", "Uint", 0)
mDC2 := DllCall("CreateCompatibleDC", "Uint", 0)
zhBM := CreateDIBSection(mDC2, znW, znH)
oBM1 := DllCall("SelectObject", "Uint", mDC1, "Uint", hBM)
oBM2 := DllCall("SelectObject", "Uint", mDC2, "Uint", zhBM)
DllCall("SetStretchBltMode", "Uint", mDC2, "int", 4)
DllCall("StretchBlt", "Uint", mDC2, "int", 0, "int", 0, "int", znW, "int", znH, "Uint", mDC1, "int", 0, "int", 0, "int", nW, "int", nH, "Uint", 0x00CC0020)
DllCall("SelectObject", "Uint", mDC1, "Uint", oBM1)
DllCall("SelectObject", "Uint", mDC2, "Uint", oBM2)
DllCall("DeleteDC", "Uint", mDC1)
DllCall("DeleteDC", "Uint", mDC2)
DllCall("DeleteObject", "Uint", hBM)
Return zhBM
}
Convert(sFileFr = "", sFileTo = "", nQuality = "")
{
If sFileTo =
sFileTo := A_ScriptDir . "\screen.bmp"
SplitPath, sFileTo, , sDirTo, sExtTo, sNameTo
If Not hGdiPlus := DllCall("LoadLibrary", "str", "gdiplus.dll")
Return sFileFr+0 ? SaveHBITMAPToFile(sFileFr, sDirTo . "\" . sNameTo . ".bmp") : ""
VarSetCapacity(si, 16, 0), si := Chr(1)
DllCall("gdiplus\GdiplusStartup", "UintP", pToken, "Uint", &si, "Uint", 0)
If !sFileFr
{
DllCall("OpenClipboard", "Uint", 0)
If DllCall("IsClipboardFormatAvailable", "Uint", 2) && (hBM:=DllCall("GetClipboardData", "Uint", 2))
DllCall("gdiplus\GdipCreateBitmapFromHBITMAP", "Uint", hBM, "Uint", 0, "UintP", pImage)
DllCall("CloseClipboard")
}
Else If sFileFr Is Integer
DllCall("gdiplus\GdipCreateBitmapFromHBITMAP", "Uint", sFileFr, "Uint", 0, "UintP", pImage)
Else DllCall("gdiplus\GdipLoadImageFromFile", "Uint", Unicode4Ansi(wFileFr,sFileFr), "UintP", pImage)
DllCall("gdiplus\GdipGetImageEncodersSize", "UintP", nCount, "UintP", nSize)
VarSetCapacity(ci,nSize,0)
DllCall("gdiplus\GdipGetImageEncoders", "Uint", nCount, "Uint", nSize, "Uint", &ci)
Loop, % nCount
If InStr(Ansi4Unicode(NumGet(ci,76*(A_Index-1)+44)), "." . sExtTo)
{
pCodec := &ci+76*(A_Index-1)
Break
}
If InStr(".JPG.JPEG.JPE.JFIF", "." . sExtTo) && nQuality<>"" && pImage && pCodec
{
DllCall("gdiplus\GdipGetEncoderParameterListSize", "Uint", pImage, "Uint", pCodec, "UintP", nSize)
VarSetCapacity(pi,nSize,0)
DllCall("gdiplus\GdipGetEncoderParameterList", "Uint", pImage, "Uint", pCodec, "Uint", nSize, "Uint", π)
Loop, % NumGet(pi)
If NumGet(pi,28*(A_Index-1)+20)=1 && NumGet(pi,28*(A_Index-1)+24)=6
{
pParam := π+28*(A_Index-1)
NumPut(nQuality,NumGet(NumPut(4,NumPut(1,pParam+0)+20)))
Break
}
}
If pImage
pCodec ? DllCall("gdiplus\GdipSaveImageToFile", "Uint", pImage, "Uint", Unicode4Ansi(wFileTo,sFileTo), "Uint", pCodec, "Uint", pParam) : DllCall("gdiplus\GdipCreateHBITMAPFromBitmap", "Uint", pImage, "UintP", hBitmap, "Uint", 0) . SetClipboardData(hBitmap), DllCall("gdiplus\GdipDisposeImage", "Uint", pImage)
DllCall("gdiplus\GdiplusShutdown" , "Uint", pToken)
DllCall("FreeLibrary", "Uint", hGdiPlus)
}
CreateDIBSection(hDC, nW, nH, bpp = 32, ByRef pBits = "")
{
NumPut(VarSetCapacity(bi, 40, 0), bi)
NumPut(nW, bi, 4)
NumPut(nH, bi, 8)
NumPut(bpp, NumPut(1, bi, 12, "UShort"), 0, "Ushort")
NumPut(0, bi,16)
Return DllCall("gdi32\CreateDIBSection", "Uint", hDC, "Uint", &bi, "Uint", 0, "UintP", pBits, "Uint", 0, "Uint", 0)
}
SaveHBITMAPToFile(hBitmap, sFile)
{
DllCall("GetObject", "Uint", hBitmap, "int", VarSetCapacity(oi,84,0), "Uint", &oi)
hFile:= DllCall("CreateFile", "Uint", &sFile, "Uint", 0x40000000, "Uint", 0, "Uint", 0, "Uint", 2, "Uint", 0, "Uint", 0)
DllCall("WriteFile", "Uint", hFile, "int64P", 0x4D42|14+40+NumGet(oi,44)<<16, "Uint", 6, "UintP", 0, "Uint", 0)
DllCall("WriteFile", "Uint", hFile, "int64P", 54<<32, "Uint", 8, "UintP", 0, "Uint", 0)
DllCall("WriteFile", "Uint", hFile, "Uint", &oi+24, "Uint", 40, "UintP", 0, "Uint", 0)
DllCall("WriteFile", "Uint", hFile, "Uint", NumGet(oi,20), "Uint", NumGet(oi,44), "UintP", 0, "Uint", 0)
DllCall("CloseHandle", "Uint", hFile)
}
SetClipboardData(hBitmap)
{
DllCall("GetObject", "Uint", hBitmap, "int", VarSetCapacity(oi,84,0), "Uint", &oi)
hDIB := DllCall("GlobalAlloc", "Uint", 2, "Uint", 40+NumGet(oi,44))
pDIB := DllCall("GlobalLock", "Uint", hDIB)
DllCall("RtlMoveMemory", "Uint", pDIB, "Uint", &oi+24, "Uint", 40)
DllCall("RtlMoveMemory", "Uint", pDIB+40, "Uint", NumGet(oi,20), "Uint", NumGet(oi,44))
DllCall("GlobalUnlock", "Uint", hDIB)
DllCall("DeleteObject", "Uint", hBitmap)
DllCall("OpenClipboard", "Uint", 0)
DllCall("EmptyClipboard")
DllCall("SetClipboardData", "Uint", 8, "Uint", hDIB)
DllCall("CloseClipboard")
}
Unicode4Ansi(ByRef wString, sString)
{
nSize := DllCall("MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", 0, "int", 0)
VarSetCapacity(wString, nSize * 2)
DllCall("MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", &wString, "int", nSize)
Return &wString
}
Ansi4Unicode(pString)
{
nSize := DllCall("WideCharToMultiByte", "Uint", 0, "Uint", 0, "Uint", pString, "int", -1, "Uint", 0, "int", 0, "Uint", 0, "Uint", 0)
VarSetCapacity(sString, nSize)
DllCall("WideCharToMultiByte", "Uint", 0, "Uint", 0, "Uint", pString, "int", -1, "str", sString, "int", nSize, "Uint", 0, "Uint", 0)
Return sString
}