Registrarse

[Investigacion] Bridge entre Nintendo DS y Pokemon Showdown

Mostazanik

No compila.
Hola gente bonita, espero que esten bien, les comento un poco una hipotesis que hice hace unos dias (y que he estado trabajando).

En teoria, si la NDS tiene compatibilidad con red, entonces es, en papel, posible conectarla con el backend de Pokemon Showdown y hacer un cliente; Si, estoy super consciente que la NDS no puede ni en carretilla establecer un websocket sin que te revienten el ARM7 y el ARM9, estamos de acuerdo, pero... ¿Y si la NDS hablara por TCP con un client que SI pueda gestionar Websockets?

La idea es sencilla, levantar un backend bridge/proxy entre Pokemon Showdown y la Nintendo DS, un intermediario que hable binario a la NDS y gestione la sesion tal como espera Pokemon Showdown.

Bueno, la verdad es que llevo unos dias esquemando un posible bridge, tanto el protocolo de comunicacion como arquitectura del mismo, les dejo el diagrama en PlantUML de lo que llevo, el protocolo no esta completo, pero creo que con lo que llevo se entiende un pelin a que quiero llegar xD.

¿Que opinan? Miren, no soy muy constante con estas cosas, no quiero prometer nada, pero de ser posible voy a tratar de actualizar esta "¿investigacion?" desarrollo/cosa los sabados.
 

Manurocker95

Doctorando en Ingeniería Biomédica & Game Dev
Miembro insignia
Hola gente bonita, espero que esten bien, les comento un poco una hipotesis que hice hace unos dias (y que he estado trabajando).

En teoria, si la NDS tiene compatibilidad con red, entonces es, en papel, posible conectarla con el backend de Pokemon Showdown y hacer un cliente; Si, estoy super consciente que la NDS no puede ni en carretilla establecer un websocket sin que te revienten el ARM7 y el ARM9, estamos de acuerdo, pero... ¿Y si la NDS hablara por TCP con un client que SI pueda gestionar Websockets?

La idea es sencilla, levantar un backend bridge/proxy entre Pokemon Showdown y la Nintendo DS, un intermediario que hable binario a la NDS y gestione la sesion tal como espera Pokemon Showdown.

Bueno, la verdad es que llevo unos dias esquemando un posible bridge, tanto el protocolo de comunicacion como arquitectura del mismo, les dejo el diagrama en PlantUML de lo que llevo, el protocolo no esta completo, pero creo que con lo que llevo se entiende un pelin a que quiero llegar xD.

¿Que opinan? Miren, no soy muy constante con estas cosas, no quiero prometer nada, pero de ser posible voy a tratar de actualizar esta "¿investigacion?" desarrollo/cosa los sabados.
Si quieres hacer algo así yo tiraría más por Nintendo 3DS que sí puede gestionar requests y envíos fácilmente.
 

Micael_Alighieri

Emperador Kaktiácero
Redactor/a
Miembro de honor
Si quieres hacer algo así yo tiraría más por Nintendo 3DS que sí puede gestionar requests y envíos fácilmente.
De hecho, NDS también es una consola más antigua, yo también apostaría por 3DS, y visto lo viva que está la scene en ella, tendría mucho más éxito (lo probaría hasta yo).
 

Mostazanik

No compila.
De hecho, NDS también es una consola más antigua, yo también apostaría por 3DS, y visto lo viva que está la scene en ella, tendría mucho más éxito (lo probaría hasta yo).
Ciertamente, estoy completamente de acuerdo, pero... realmente si quisiera hacer algo realmente usable estaria apuntando a mercados como Android y no tanto al homebrew per se, ademas, salendo para NDS vanilla va a terminar en la 3DS, Wii U y en un emu random igualmente.

Ademas, no es tanto por comodidad, como si porque la NDS siempre me gusto como consola, esa libertad que me daba el R4 de chico y ver los juegos que se hacian me hace ilusion, se que no es el sweet spot, pero si funciona, podria ser divertido.
 

Mostazanik

No compila.
Update 1:

Bueno, luego de pushear una semana con el bridge, pude establecer comunicacion con el dataset de Pokemon Showdown, tuve que hacer un "protocolo" (?) de comunicacion entre la NDS y el bridge tomando en concideracion que un JSON facilmente puede pesar sus bueno megabytes, de momento solo estoy enviando algunos strings, el heartbeat al server y metadatos del host principal del juego (en mi caso, para evitar baneos y cosas raras, un container feo que monte de showdown).

Por el lado del bridge, el mismo es un runtime que hice en NIM, es un lenguaje de programacion no muy estandar, pero se me hizo perfecto para el proyecto, es ligero al ser compilado a C y se puede pegar con chicle al container de showndown sin que consuma mucho mas, se puede mappear cuantos jugadores admite el bridge (decidi poner un limite de jugadores en caso de que tenga alguna condicion de carrera media rara se pueda mitigar).

Habemus screenshot, pero no es nada bonito o "flexeable" aun.
emu_tests.png
1776316924487.png
 

Micael_Alighieri

Emperador Kaktiácero
Redactor/a
Miembro de honor
Me disculpo si no llego a usar el lenguaje más adecuado, o si no consigo entenderlo del todo y digo algo fuera de lugar, ¡pero habrá que intentarlo!

A juzgar por la imagen, deduzco que has acertado de lleno al evitar usar un JSON completo en esta etapa del desarrollo. Entiendo también que la memoria de la NDS está muy limitada, y de hecho, es posible que tengas que desarrollar un protocolo binario propio con IDs en lugar de tirar de literales de cadena.
 

Mostazanik

No compila.
Update final:

Cabros, ya no es investigacion xD objetivamente se puede, tengo resultados estables, osea, no he implementado combate porque, aunque es EL punto, el tema era ver si era posible comunicar Showdown con NDS, y si, es posible :D

Creo que ya estamos en esa etapa en la que me estoy planteando pasarlo a proyecto formal en lugar de solo una investigacion, como sea, no quiero cerrar el proyecto porque creo que si alguien quiere estudiar el codigo o hacer algo custom con ello, me alegraria bastante.

Les dejo el repo tanto del bridge como el client del proyecto, NO SON USABLES per ser, son una tech demo de comunicaciones:
Cliente: mostazaniikkkk/PKSD-Client: Cliente de Pokemon Showdown para Nintendo DS
Bridge: mostazaniikkkk/PKSD-Bridge: Puente entre ROM de NDS y los servidores de Showdown

Para compilar el proyecto necesitan tener Docker instalado, en el caso del bridge deben hacer doble click en "pipeline.bat" y ya les sube el backend como repositorio, mientras que para compilar necesitan correr build.bat, modificar el archivo ini de la carpeta sav con el endpoint de su bridge y luego generar el sav con el script de Python que esta en la misma carpeta, dejan el sav en el mismo folder de la ROM con el mismo nombre y listo, tech demo corriendo (en teoria, como cualquier backend QA pueden haber problemas como firewalls y cosillas).

Eso gente bonita, yo creo que voy a trabajar en mi fangame un ratito (no este proyecto) y cuando me aburra empiezo a trabajar con el client de Showdown, no como experimento raro, sino ya como juego.
 
Arriba