ARCADE FOREVER

Mini-tuto modificación module de RL para carga automática de Virtual Controller

« Older   Newer »
  Share  
view post Posted on 25/8/2023, 17:05     +1   +1   -1
Avatar

V.I.P.

Group:
Member
Posts:
753
Reputation:
+102

Status:


Bueno, ahí va un mini-tuto 'simple' de cómo modificar un MODULE de RocketLauncher para que haga un poco lo que queramos.

Intención: Automatizar la carga del keymaper VirtualController a través del module en cualquier sistema del RocketLauncher, ya que no tiene soporte para él. Quiero un perfil general para el sistema y perfil único por ROM seleccionables.

Pegas: Este 'puñetero' Keyamaper, que por cierto considero de lo mejor que hay y no sé si discontinuado, está un poco limitado para trastear con él, no permite carga de perfiles cuando está ya cargado, ejecutándose, por lo que hay que cerrarlo a lo bruto, para lo que usaremos el NirCMD. También tiene otra pega, que es que no permite espacios en el nombre del perfil cuando lo lanzamos desde un comando (no sé si esto es un bug)

Lo primero, gracias como siempre a Pegafun por sus tutos, este el que nos toca repasar:
https://arcadeforever.forumfree.it/?t=75938831

Primero, hay que definir dos variables una para cargar perfil del sistema (o no) y otra para el de ROM, también añadimos otra con el camino al VirtualControlle.exe que nos facilitará las cosas para lanzarlo. Modifico el module del sistema Sony Playstation 2 en el que uso el module PSX2 (MVersion := "2.2.1", MCRC := "1E4F5067"). Comenzamos con el archivo PCSX2.ISD, tras ver sus tripas y lo que ocurre en RocketLauncher al configurarlo, añado tras la selección 'AspectRatio' en global del sistema, la variable para carga del perfil de sistema y el camino al VirtualController.exe:

MOD-1-ISD


CODE
<KEY name="VirtualControllerSYS" required="false" nullable="true">
<KEYTYPE>Boolean</KEYTYPE>
<DESCRIPTION>Carga Virtual Controller con perfil Sistema, todos los juegos. Requiere NirCMD.</DESCRIPTION>
</KEY>
<KEY name="VirtualPath" required="false" nullable="true">
<KEYTYPE>FolderPath</KEYTYPE>
<FULLROW>true</FULLROW>
<DESCRIPTION>Carpeta del Virtual Controller. Dentro debe estar la carpeta 'Binds' con los perfiles que cargaremos. Ojo!! perfiles con mismo nombre del sistema o ROM, con los espacios sustituidos por '_', para perfil general del sistema completo o perfil para una ROM. El perfil ROM prevalece sobre el de sistema.</DESCRIPTION>
</KEY>

Esto nos aparece luego así al configurar el module:

PCSX2-Sistema


Así de simple hemos añadido la variable 'VirtualControllerSYS' y 'VirtualPath' que podremos modificar en la configuración del módulo.
Añado segunda modificación en el archivo ISD del perfil, en la sección ROM, la variable para carga del perfil ROM ('VirtualControllerROM'):

MOD-2-ISD


CODE
<KEY name="VirtualControllerROM" required="false" nullable="true">
<KEYTYPE>Boolean</KEYTYPE>
<DESCRIPTION>Carga Virtual Controller con perfil ROM. Prevalece sobre el de sistema</DESCRIPTION>
</KEY>

Quedando al configurarlo en la ROM:

PCSX2-ROM


Ya tenemos las variables hechas, pasamos a modificar el AHK, de nuevo con un poco de ingenieria inversa, vemos que las variables que hemos creado hay que leerlas al principio del AHK, de un archivo INI, para lo que añado finalmente tras varios intentos:

MOD-1-AHK


CODE
;--------------------------------------------------------MOD1----------------------------------------------------------------------------
;Variables de las selecciones nuevas añadidas en el ISD que se leen del PCSX2.INI
VirtualControllerSYS := moduleIni.Read("Settings", "VirtualControllerSYS","false",,1) ;Variable perfil SISTEMA, por defecto false.
VirtualControllerROM := moduleIni.Read(romName . "|Settings", "VirtualControllerROM","false",,1) ;Variable perfil ROM, por defecto false.
VirtualPath := moduleIni.Read("Settings", "VirtualPath",,,1)  ; Variable con carpeta del VirtualController.exe.
;----------------------------------------------------------------------------------------------------------------------------------------

Ahora viene el meollo de la cuestión, cómo hacer que el módulo haga lo que queremos con todo esto, segunda modificación en el AHK también al principio, antes de que se cargue el emulador, evidentemente:

MOD-2-AHK


CODE
; ---------------------------------------------------------MOD2---------------------------------------------------------------------
; Si activamos la opción VirtualControllerSYS desde el RocketLauncer, cargamos el Virtual Controller con el perfil para el sistema,
; así podemos configurarlo para todos los juegos con un único perfil. Si activamos en la ROM peril ROM, cargamos exclusivo para ROM.
; OJO, VIRTUAL CONTROLLER NO ADMITE ESPACIOS EN LOS NOMBRES DE PERFILES AL LANZARLO. SE SUSTITUYEN LOS ESPACIOS POR EL CARACTER '_'
; TANTO EN ROMS COMO EN SISTEMA, TENERLO EN CUENTA AL CREAR LOS PERFILES EN LA CARPETA 'Binds' DENTRO DEL VIRTUAL CONTROLLER.
; Cerramos tambien primero Virtual Controller por si está lanzado, ya que no admite cambios de perfil estando ejecutado,
; hay que cerrarlo y volver a abrirlo para ello.
; ----------------------------------------------------------------------------------------------------------------------------------
NircmdExe := "Nircmd.exe"
If (VirtualControllerSYS = "true") {
       StringReplace, NewBindName, systemName, %A_Space%, _, All   ;Sustituye espacios de la variable por '_'
       RLLog.Info("Virtual Controller, Nombre Perfil Sistema = " . NewBindName)  ;Log para ver el nombre generado
}
;Si activados ambos perfiles, al estar el tratamiento de la ROM detrás, prevalece este sobre el de sistema ya que lo sobreescribe.
If (VirtualControllerROM = "true") {
       StringReplace, NewBindName, romName, %A_Space%, _, All      ;Sustituye espacios de la variable por '_'
       RLLog.Info("Virtual Controller, Nombre Perfil ROM = " . NewBindName)   ;Log para ver el nombre generado
}
If (VirtualControllerSYS = "true") or (VirtualControllerROM = "true") {
       VirtualExe := "VirtualController.exe"
       Run(NircmdExe . " killprocess " . """" . VirtualExe . """")
;        Sleep, 200         ; 200ms de pausa, aumentar si aparecen pegas cerrar/abrir el virtual.  
       Run(VirtualExe . " /loadcontrols " . NewBindName . ".bnd" . " /capture /minimized", VirtualPath,, VirtualPID)
}

Más o menos está ya comentado en el código, lo de los espacios en blanco, ha sido mirar en la ayuda del AutoHotKey y no he tardado ni 5 minutos, hay dos versiones, la 2.0 no funciona, pues la 'vieja' sí lo hace (log para ver lo que nos genera). El 'Sleep', retardo, lo metí por si acaso no se puede cerrar y abrir seguido el Virtual Controller, no he tenido ninguna pega, por eso el punto y coma delante que lo anula.

Finalmente tras el cierre del emulador hay que cerrar también el Virtual Controller, tercera modificación en el AHK:

MOD-3-AHK


CODE
; --------------------------------------------MOD3---------------------------------------------------
; Tras cerrar emulador, matamos el proceso del Virtual Controller con el Nricmd, comando enviado:
; Nircmd.exe killprocess "VirtualController.exe"         (de ahí tanta comilla, 4 definen 1)
; ---------------------------------------------------------------------------------------------------
Run(NircmdExe . " killprocess " . """" . VirtualExe . """")


Y listo, a mi me funciona perfectamente, pudiendo crear perfil para el sistema o ROM concreta. Lo que me ha parecido más complicado ha sido evitar los espacios en blanco, por ello he dejado los perfiles dentro de la carpeta 'Binds' del virtual Controller, ya que si usamos un camino que tenga espacios en blanco, me da que la cagaremos.
Tampoco he subido los archivos ya hechos, para que si os interesa, lo hagáis y veáis que no es para tanto, sólo tenéis que copiar el código a añadir de aquí y/o modificarlo según vuestras necesidades.
Por cierto, mucho Log para hacer estas cosas, ya que se va un poco a ciegas, activarlo en el global-general settings del RL, y no olvidéis quitarlo luego ya que ralentiza bastante la carga. Adjunto también un par de capturas de logs cargando con perfil de sistema sólo activado, y perfil sistema y ROM, en el que prevalece este último, esos son los nombres sin espacios que se generan y que deben tener los perfiles dentro de la carpeta ´Binds' del Virtual Controller para que funcione su carga.

Log-perfil-sistema



Log-2-perfiles-activados



Edited by Morera - 26/8/2023, 12:35
 
Top
view post Posted on 29/8/2023, 18:49     +1   +1   -1
Avatar

V.I.P.

Group:
Usuarios AFFA
Posts:
215
Reputation:
+6

Status:


RunWait is better than Sleep, cause will wait until Target is closed.

If (VirtualControllerSYS = "true") or (VirtualControllerROM = "true") {
VirtualExe := "VirtualController.exe"
RunWait(NircmdExe . " killprocess " . """" . VirtualExe . """")
Run(VirtualExe . " /loadcontrols " . NewBindName . ".bnd" . " /capture /minimized", VirtualPath,, VirtualPID)
 
Top
view post Posted on 29/8/2023, 23:15     +1   -1
Avatar

V.I.P.

Group:
Member
Posts:
753
Reputation:
+102

Status:


Es un test más que nada para que la gente vea que no es tan complicado modificarlos, y cuando pruebas estas cosas, el Sleep es el recurso rápido que en este caso ni necesité como comento, luego hay que afinar si es necesario. Personalmente es algo que uso bastante para ver qué pasa a los 5Sg, a los 10 con otra opción, a los 15 con una tercera, etc, para luego ir puliendo, evitas mucha edición y prueba.
Al final he quitado el cierre con el NirCMD del Virtual Controller ya que el AutoHotKey lo cierra bien, sin esperas ni comprobaciones, aunque como me falle una sola vez, vuelvo a él por experiencia.

CODE
; ---------------------------------------------------------MOD2---------------------------------------------------------------------
; Si activamos la opción VirtualControllerSYS desde el RocketLauncer, cargamos el Virtual Controller con el perfil para el sistema,
; así podemos configurarlo para todos los juegos con un único perfil. Si activamos en la ROM peril ROM, cargamos exclusivo para ROM.
; OJO, VIRTUAL CONTROLLER NO ADMITE ESPACIOS EN LOS NOMBRES DE PERFILES AL LANZARLO. SE SUSTITUYEN LOS ESPACIOS POR EL CARACTER '_'
; TANTO EN ROMS COMO EN SISTEMA, TENERLO EN CUENTA AL CREAR LOS PERFILES EN LA CARPETA 'Binds' DENTRO DEL VIRTUAL CONTROLLER.
; Cerramos tambien primero Virtual Controller por si está lanzado, ya que no admite cambios de perfil estando ejecutado,
; hay que cerrarlo y volver a abrirlo para ello.
; ----------------------------------------------------------------------------------------------------------------------------------
If (VirtualControllerSYS = "true") {
       StringReplace, NewBindName, systemName, %A_Space%, _, All   ;Sustituye espacios de la variable por '_'
       RLLog.Info("Virtual Controller, Nombre Perfil Sistema = " . NewBindName)        ; Deja en log nombre perfil sistema
}

;Si activados ambos perfiles, al estar el tratamiento de la ROM detrás, prevalece este sobre el de sistema ya que lo sobreescribe.

If (VirtualControllerROM = "true") {
       StringReplace, NewBindName, romName, %A_Space%, _, All      ;Sustituye espacios de la variable por '_'
       RLLog.Info("Virtual Controller, Nombre Perfil ROM = " . NewBindName)        ;Deja en log nombre perfil ROM
}

If (VirtualControllerSYS = "true") or (VirtualControllerROM = "true") {
       VirtualExe := "VirtualController.exe"
       WinClose, Virtual Controller        ;Orden de cierre por si está cargado, no se comprueba nada ya que no hay pegas
       Run(VirtualExe . " /loadcontrols " . NewBindName . ".bnd" . " /capture /minimized", VirtualPath,, VirtualPID)
}


El último cierre sin comprobar nada al no dar problema.

CODE
; --------------------------------------------MOD3---------------------------------------------------
; Tras cerrar emulador, damos orden de cierre al Virtual Controller, no se comprueba nada
; ya que no da pegas el AutoHotKey como al principio que tampoco se comprueba nada.
; ---------------------------------------------------------------------------------------------------
WinClose, Virtual Controller


Creo que este mod se puede meter en cualquier module sin problema, aunque el Virtual Controller es para sistemas un poco locos de control como juegos de PC o la PS2, en este tengo controlada 'la cámara' con el mismo Joystick cuando mantengo una tecla del CPO pulsada o no, incluso limitada la velocidad de movimiento, todo con el CPO de la maca.
 
Top
2 replies since 25/8/2023, 17:05   107 views
  Share