🕹 PROYECTO: Restrictor automático integrado con RetroBat + MAME
🎯 Objetivo
-
Juegos 4-way → posición 4 (rombo)
-
Juegos de lucha (lista específica) → posición 8 (octógono)
-
Todo lo demás → posición 0 (cuadrado)
-
Compatible con botón manual
-
Compatible con control por serie
-
Sin romper RetroBat ni tu
.batde pantallas
🧠 Arquitectura final correcta
NO tocamos el XML para meter comandos raros.
La solución profesional fue:
👉 Mantener el <command> original
👉 Integrar el restrictor dentro del .bat que ya lanza MAME
Esto evita problemas con &, && y procesos de Windows.
🛠 1️⃣ Instalación de Python
Descargar
Ir a:
https://www.python.org/downloads/
Muy importante
Marcar la casilla:
☑ Add Python to PATH
Luego instalar.
Verificar instalación
Abrir CMD:
python --version
Debe devolver algo como:
Python 3.x.x
🛠 2️⃣ Instalar pyserial
En CMD:
pip install pyserial
Si falla:
python -m pip install pyserial
🛠 3️⃣ Crear el plugin restrictor
Ruta:
C:\RetroBat\plugins\restrictor.py
Crear con VS Code o bloc de notas.
Contenido:
import serial
import sys
import time
import os
COM_PORT = "COM5" # ← Cambiar por tu puerto
BAUDRATE = 115200
lista_4 = [
"nrallyx", "alibaba", "alphaf", "amidar", "armwrest", "armoredcar", "barrier",
"blasto", "blockade", "btime", "carjmbre", "chameleo", "chinhero", "commando",
"comotion", "congob", "copsnrob", "crash", "ckong", "crush", "diamondrun",
"digdug", "digdug2", "digger", "disco", "dorunrun", "dominos", "dommy",
"dkong", "dkong3", "dkongjr", "dorodon", "drmicro", "drgnbstr", "dremshpr", "elevator",
"eyes", "qbertfh", "firetrap", "40love", "frogger", "galpanic", "gundealr",
"guzzler", "hardhat", "headon", "headon2", "heiankyo", "hexa", "hustle",
"invinco", "ironhors", "jrpacman", "jjack", "jungler", "karatedo", "karianx",
"kicker", "kungfum", "ladybug", "lvgirl94", "lasso", "lockon", "locomotn",
"logicpro", "logicpro2", "lupin3", "mjsikaku", "meikyu", "mikie","mineswpr",
"mmonkey", "mmonster", "mtrap", "mrdo", "docastle", "dowild", "mrgoemon",
"mrjong", "mrtnt", "mspacman", "mystston", "natodef", "naughtyb", "netwars",
"olibochu", "pacnpal", "pacplus", "pairs", "pengo", "pepper2", "perestro",
"pettanp", "pignewt", "higemaru", "popflame", "popeye", "pulsar", "punchout",
"qbert", "qbertqub", "qix", "radarscp", "raiders5", "rallyx", "rampage",
"reikaids", "robby", "rocnrope", "rthunder", "route16", "samurai", "scregg",
"sidetrac", "sindbadm", "solarfox", "schaser", "spacepan", "spacezap", "spectar",
"streakng", "sinvaders", "superpac", "spnchout", "sqix", "swat", "tactcian",
"tankbatt", "tapper", "targ", "taxidriv", "telmahjn", "mrflea","elecyoyo",
"thief", "timber", "timelimt", "tomahawk", "todruaga", "toypop", "trankgun",
"tripunch", "tutankhm", "vanvan", "volfied", "vsgongf", "waijockey", "warpwarp",
"wiping", "wndrmomo", "yamyam", "zerozone", "zigzag", "zookeep"
]
lista_8 = [
"sf2", "sf2ce", "sf2hf",
"ssf2", "mk", "mk2", "mk3", "umk3",
"kof94", "kof95", "kof96", "kof97",
"kof98", "kof99",
"samsho", "samsho2"
]
def enviar(valor):
try:
with serial.Serial(COM_PORT, BAUDRATE, timeout=1) as ser:
time.sleep(1.2)
ser.write(valor.encode())
except:
pass
if __name__ == "__main__":
if len(sys.argv) < 2:
sys.exit(0)
rom_path = sys.argv[1]
rom = os.path.splitext(os.path.basename(rom_path))[0].lower()
if rom in lista_4:
enviar("4")
elif rom in lista_8:
enviar("8")
else:
enviar("0")
🛠 4️⃣ Probar manualmente
En:
C:\RetroBat\plugins
Ejecutar:
python restrictor.py pacman
Debe ir a 4.
python restrictor.py sf2
Debe ir a 8.
python restrictor.py metalslug
Debe ir a 0.
Si funciona → integración lista.
🛠 5️⃣ Integración correcta en RetroBat
NO modificar el XML.
Mantener:
<command>"C:\RetroBat\plugins\launch_mame_direct.bat" %ROM%</command>
Editar el archivo:
C:\RetroBat\plugins\launch_mame_direct.bat
Al principio del archivo añadir:
python "C:\RetroBat\plugins\restrictor.py" %1
Debe quedar así:
@echo off python "C:\RetroBat\plugins\restrictor.py" %1 REM --- aquí sigue tu código original --- ...
No borrar nada más.
🎮 Flujo final de funcionamiento
Cuando seleccionas un juego:
1️⃣ RetroBat ejecuta launch_mame_direct.bat
2️⃣ El .bat ejecuta restrictor.py
3️⃣ Python envía "4", "8" o "0" por serie
4️⃣ El Arduino mueve el motor
5️⃣ Luego el .bat lanza MAME
6️⃣ El juego arranca con el restrictor ya colocado
Pantallas siguen funcionando. Nada se rompe. Sistema estable.
🧠 Lógica final aplicada
| Tipo de juego | Posición |
|---|---|
| Lista 4-way | 4 (rombo) |
| Lista lucha | 8 (octógono) |
| Resto | 0 (cuadrado) |
SrRubio
Discussions
Become a Hackaday.io Member
Create an account to leave a comment. Already have an account? Log In.