Jump to content

FPLaunch MOD: Pause and Loading screens...


samwyze

Recommended Posts

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
}

Edited by blur
Link to comment
Share on other sites

I would like all the people that had problems with Esc key and they had to use e instead - to try to use Esc again and check if this version fixes Esc for them also!

I know i had two problems with Esc when i used it with xpadder or joy2key:

1. Esc key would come to VP and invoke exit to editor or resume menu

2. Long press on exit button (which is mapped to Esc) would not be detected - so i would get flashing pause screen

They are both fixed now.

You could all try it now and see if this fix helps. As I remember some people with IPAC, Pinball Wizard and with some other controllers with xpadder/joy2key had this problem.

This will not solve joy8 problem with PBW - so it is still good not to use button 8 on PBW but some other button for exit.

Edited by blur
Link to comment
Share on other sites

Hi blur so i have unmapped exit from e back to Esc (Esc is code 27 right?) and now short press for pause is bust again here on win 7.

Short press works ok in future pinball but not Vp!.

This is a shame as i have a noname encoder and have to use keytweak to change entries in the registry for mapping.

This works fine except if using vp outside hyperpin i then need to alt tab out to kill it.

Link to comment
Share on other sites

Some more feedback,

with wip4 when launching a vp table i now have the "rendering table" animation stealing focus from the table and have to hit pause twice to give focus to the table.

popped wip3 back in and this is fixed again.

As i said i am on win 7 so this may be the reason?.

Link to comment
Share on other sites

I have issues with WIP 3 and WIP 4 1295 and B2S tables. I am using 182.50 drivers in Win xp 32bit.

FPlaunch works great except when launching B2S tables. It looses focus when launch and I have to press my Exit button, which is mapped to Esc key to regain focus.

Here is my FPlaunch config

[FPLaunch]

exitScriptKey = q & s

exitEmulatorKey = Esc

toggleCursorKey = t

pauseVPinball = g

hideCursor = true

hideDesktop = true

hideTaskbar = true

useExitScreen = true

usePauseKey = true

useLoadScreen = true

fadespeed = 15

UseExitAsPause = true

exitEmulatorKey2= 1

exitEmulatorKey3= Enter

pauseFPKey = RButton

saveFPTables = true

Link to comment
Share on other sites

Tnx guys, I will be under the sea or on the sea most of the time so that's why I won't be accessible.

(You can check my home page www.submania.hr for more info :))

In the meantime while I'm still here rocky and bent do you have loading screen that won't go away even though pinball is fully loaded in the back? And you press esc twice so you get pause and then back to game?

I've checked code. I don't put focus on vp if you use loading screen. I never did. I wait for vp to become active cause to me this is a sign that application is fully loaded and loading screen can be closed.

This is the code:

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
	}
}

If you don't get focus - that is an old known problem of vp - it won't put itself into focus if you don't use nt4sp5 compatibility mod. Do you have comp. mod set on vpinball.exe?

Edited by blur
Link to comment
Share on other sites

Blur, when I press escape I get the pause screen if I press again I go back to game. However if I press and hold the esc key I never see the exiting screens 3, 2, 1. Am I missing something? To exit when on pause I press the 1 key and it goes back to hyperpin. I am using your new version. I have all the pictures from your earlier version.

Thanks,

Lonnie

Link to comment
Share on other sites

Tnx guys, I will be under the sea or on the sea most of the time so that's why I won't be accessible.

(You can check my home page www.submania.hr for more info :))

In the meantime while I'm still here rocky and bent do you have loading screen that won't go away even though pinball is fully loaded in the back? And you press esc twice so you get pause and then back to game?

I've checked code. I don't put focus on vp if you use loading screen. I never did. I wait for vp to become active cause to me this is a sign that application is fully loaded and loading screen can be closed.

This is the code:

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
	}
}

If you don't get focus - that is an old known problem of vp - it won't put itself into focus if you don't use nt4sp5 compatibility mod. Do you have comp. mod set on vpinball.exe?

Yep vp is already in compatability mode for nt4 sp5 ( was wondering if this would fix the dmd issue other are getting?)

And yes vp loads ok in the background is just does not gain focus.

Link to comment
Share on other sites

@rockyrocket

Try this:

if (systemName = "Visual Pinball") {
IfWinExist, Visual Pinball Player,, DMD
{
	IfWinActive, Visual Pinball Player,, DMD
	{
	 [color="Lime"]WinMaximize, Visual Pinball Player
                WinHide, HyperPin[/color]
                Break
	}
}

@blur: well, found my pincab under a pile of cr@p in the back of the shed. Managed to get my last version of FPLaunch off, this one has moved quite far since I last looked. When you're back, and if you can be bothered, you might want to have a look at it as it was using gdi+ to draw the overlays. Never really got to grasps with the gdi+ routines though, so it could probably be optimised quite a bit, and of course I only had routines for VP as I don't use FP.

Edited by samwyze
hi to blur
Link to comment
Share on other sites

Just realised that blur is away for a while, so I'm going to have a crack at merging my last fplaunch, with blurs current, but I have a few questions for you guys.

1: Does anyone use their own (custom) images for the pause/load/exit overlays? I see in its latest incarnation, blur only gets the dimensions of the pause image and uses those to resize all. The reason I took dimensions from each was so that anyone could replace any image and still have a working script. If no one uses custom images, or plans to, then I'll leave it how blur has it.

2: If you're not going to use custom images, does anyone mind if I use a standard system font instead of the modified one used by hyperpin? If no one cares then all the images can be drawn on fly, rather than loaded from files. This should result in better display, images will be antialaised and won't suffer loss of quality from having to be resized.

3: Any other features that people want, that aren't in the todo list included with blurs latest release?

4: I currently use an exit menu, similar to the one in the hyperpin table selection, so pressing esc brings up a menu to return to game or esc to hyperpin, would people use this?

5: Do people use a seperate pause key, or tap esc to pause or both? (I have my 'service' key mapped to pause but never use it with my exit menu)

Maybe we should do a poll with what methods of pause/exit are preferred, instead of offering the choices and just go with the majority? Any suggestions or ideas?

Edited by samwyze
Link to comment
Share on other sites

Forgot to ask... Does anyone know if blur got the name of the font used within hyperpin?

Oh, and been catching up on the thread to make sense of blurs latest script - WOW, this has come a LONG way, hope I still have something to offer - I'll have to freshen up my ahk skills!

@rockyrocket: ME TOO!!

Link to comment
Share on other sites

Hey sam. Its me from big blue ;)

font name is bauhaus i think

but i have another idea that will make pause more hyperpinish and all custom images useless - on pause (short press) it would be great to show instructions.swf file from hyperpin and on the bottom hyperpin grahics for using left and right flippers for browsing flyer and then of course on flipper buttons go to flyer images and on esc go back to game and on 1 or enter exit from table

glad to see you back

feel free to jump in

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...