Página 1 de 3

Fix a emulador Gens

Publicado: 03/08/18 16:37
por SaturnAR
Un cliente me mencionó que uno de mis productos no estaba funcionando correctamente con el emulador Gens. Convencido de que el error era del emulador y no de mi producto, me dispuse a revisar lo que me mencionaba. El síntoma era claro: no andan las diagonales de los joysticks USB, donde se usa el POV para dicha función (POV = Point Of View y es la típica cruceta digital que tenemos en la Genesis por ejemplo... contraria a la palanca analógica).

Efectivamente, no funcionaban las diagonales. Sólo las 4 direcciones principales (arriba, derecha, abajo, izquierda). En el Mortal Kombat estaba claro que no se podía saltar ni hacia adelante ni hacia atrás. Sólo hacia arriba. En el Sonic 3D Blast! no podía moverme en diagonal, etc.

Me dispuse entonces a ver el emulador, y como estaba el código fuente disponible... me decidí a corregir el problema, que de paso, ví mencionado infinidad de veces a lo largo de los años. Por ej:
en el FAQ del mismísimo Gens: http://www.gens.me/faq.shtml
Q : I can't get diagonals using my joypad, or diagonals have stopped working how do I fix it?

A : Several people have reported this problem and it seems to be a Gens.cfg problem. Quit Gens, find and delete your Gens.cfg file. Now restart Gens and set your joypads up again, hopefully you should now be able to get diagonals.
Totalmente erróneo. Eso no soluciona el problema. El problema está en el código del emulador.

Otro link: https://forum.rpg.net/showthread.php?53 ... oller-work

Otro más (y no jodo más): https://forums.emulator-zone.com/showthread.php?t=3410

ETC.

Entonces, mirando el código me encontré con el error:

Código original de la función int Check_Key_Pressed(unsigned int key) del archivo G_dinput.cpp):

Código: Seleccionar todo

				switch(key & 0xF)
				{
					case 1:
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == 0) return(1); break;

					case 2:
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == 9000) return(1); break;

					case 3:
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == 18000) return(1); break;

					case 4:
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == 27000) return(1); break;
				}
Lo que claramente sólo contemplaba las cuatro direcciones principales, pero no las diagonales...
Luego de modificar el código y mejorar un poco los valores numéricos por etiquetas, quedó:

Código: Seleccionar todo

				switch(key & 0xF)
				{
					case 1:
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == JOY_POVFORWARD_POVLEFT) return(1);
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == JOY_POVFORWARD) return(1);
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == JOY_POVFORWARD_POVRIGHT) return(1);
						break;
					case 2:
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == JOY_POVFORWARD_POVRIGHT) return(1);
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == JOY_POVRIGHT) return(1);
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == JOY_POVBACKWARD_POVRIGHT) return(1);
						break;

					case 3:
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == JOY_POVBACKWARD_POVRIGHT) return(1);
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == JOY_POVBACKWARD) return(1);
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == JOY_POVBACKWARD_POVLEFT) return(1);
						break;

					case 4:
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == JOY_POVBACKWARD_POVLEFT) return(1);
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == JOY_POVLEFT) return(1);
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == JOY_POVFORWARD_POVLEFT) return(1);
						break;
				}
Contemplando las diagonales... los valores fueron agregados y definidos en G_dinput.h

Código: Seleccionar todo

#define JOY_POVFORWARD 0
#define JOY_POVFORWARD_POVRIGHT 4500
#define JOY_POVRIGHT 9000
#define JOY_POVBACKWARD_POVRIGHT 13500
#define JOY_POVBACKWARD 18000
#define JOY_POVBACKWARD_POVLEFT 22500
#define JOY_POVLEFT 27000
#define JOY_POVFORWARD_POVLEFT 31500
Y recompilando el código, solucionado el problema que hace más de una década arrastraba este emulador.

Última release pública (2.14):
http://www.gens.me/downloads.shtml

Les dejo el link de descarga a la nueva versión compilada, con el fix (2.14.1):
https://mega.nz/#!fcoyWKCL!fdaUuDZmeiqE ... -uhWf9Zfo0

Re: Fix a emulador Gens

Publicado: 03/08/18 16:41
por julian_pincha
Ah sos un crack SaturnAR, te pasaste.

Re: Fix a emulador Gens

Publicado: 03/08/18 16:45
por Rodri3
Genio!
Estaba buscando a ver si tenían el código fuente publicado en un github o similar, para avisar de esto.
Encontré el sourceforge y vi que ya subiste el cambio para todo el mundo :P

Re: Fix a emulador Gens

Publicado: 03/08/18 17:01
por Diego
Excelente!

Re: Fix a emulador Gens

Publicado: 03/08/18 17:10
por ferhound
Increible :O Aguante SEGA ;_;

Re: Fix a emulador Gens

Publicado: 03/08/18 17:24
por Hikaru
Gracias man.

Con el kega tengo el mismo problema.

Re: Fix a emulador Gens

Publicado: 03/08/18 17:34
por SaturnAR
Gracias! Imagen
Hikaru escribió:Gracias man.

Con el kega tengo el mismo problema.
El Kega usa este código de base... pero leí que no pasaba...

Después miro si hay repo del kega y modifico el código si me lo permiten... en el otro no se podía hacer fork ni más... por no ser colaborador solo pude publicar un parche

Re: Fix a emulador Gens

Publicado: 03/08/18 17:49
por Alexei
Yo solucione ese problema usando Fusion, el mejor emulador de Genesis a mi gusto.

Re: Fix a emulador Gens

Publicado: 03/08/18 17:56
por Hikaru
SaturnAR escribió:
03/08/18 17:34

El Kega usa este código de base... pero leí que no pasaba...

Después miro si hay repo del kega y modifico el código si me lo permiten... en el otro no se podía hacer fork ni más... por no ser colaborador solo pude publicar un parche
Probé con varios mandos y diferentes os, siempre lo mismo, imposible jugar decentemente a los de pelea.

Re: Fix a emulador Gens

Publicado: 03/08/18 19:31
por Console Wars
Guau, un golazo y un orgullo que un miembro del foro haya solucionado un problema que tenia tanto tiempo!