Mi proyecto de tunear una rom de Mame

Holas,

Este proyecto es viejuno y el motivo que me llevó a hacerlo era modificar una ROM del juego The New Zealand Story en Mame para dejarla a mi gusto, así a lo bruto y sin pensar que a parte de no tener ni idea de como hacerlo ni del tiempo que me iba a llevar me metí de lleno.

El motivo de que lo publique aquí es gracias al compañero @Troopa Jr que me comentó que le gustaría leerlo :) :)

No tengo capturas de pantalla del proceso, pero sí que lo documenté.

Estos son los principales problemas que me encontré:
  • Está todo en ensamblador Z80.
  • La ROM elegida hace un chequeo CRC en el arranque para comprobar la integridad de las memorias.
  • Buscar lo que quería cambiar y adaptarlo a mi gusto.

Ahora los comento por partes para que veáis cómo conseguí solucionarlo todo:
Ensamblador Z80
La programación de estos juegos está hecha en ensamblador Z80 (de Zilog 80), del cual no tenía (ni tengo) la menor idea de programarlo. Esto no me impidió tener que aprender a usarlo por el metodo prueba/error hasta tener una muy ligera noción de como se realizan las llamadas a funciones, variables, etc...

Hasta me compré un libro de Z80 [fumando]

Protección de la ROM
Parece una tontería y habrá juegos que no hagan este chequeo, pero me llevó 3-4 meses de darle duro al debugger que viene con el mame hasta encontrar donde hace esta comprobación y saltármela. Sin este paso, no se puede hacer nada ya que la ROM muestra un error.

Por lo visto, cuando arrancas el juego carga una parte de código en memoria y luego se pone a realizar un chequeo CRC de cada una de las memorias para comprobar que ninguna esté alterada. El procedimiento es el siguiente:
  • Leer la firma CRC de la memoria
  • Comparar el resultado con lo que tiene para que en caso de que no coincida mostrar el error y parar la carga del juego

La función de ROM Check comienza en la posición 0x0c88 de la memoria y se encuentra en el fichero b53-24.1

Para evitar el chequeo, hay que hacer un bypass de la función para que no haga la comprobación. El bypass consiste en un JUMP a la posición 0x0CB4 y hay que hacerlo desde el principio, ya que el flag Z ya está cargado al inicio y la comprobación tiene que devolver un flag Z para ser correcta

Pongo todo el código que hay que cambiar con las posición de memoria, llamada en EnsambladorZ80, equivalencia en hexadecimal y una breve explicación de lo que hace la línea en cuestión.

La función cambiada queda así:

POSICION | ASM     | HEX      | Descripción
0x0C88   | JP 0C84 | C3 B4 0C | Saltar a la posición 0x0C84 que devuelve el flag Z que ya estaba cargado previamante

De esta manera, como tiene el flag Z cargado, al saltar al RET Z que se encuentra en la posición 0x0C84 se salta el check con éxito.

Pero la protección no queda anulada del todo, porque el ROM CHECK tiene un amigo llamado SUB CHECK XD

Al igual que con el ROM CHECK, cuando se modifica algo que es ejecutado por el proceso SUBCPU hace una comprobación de que está todo correcto. Hay que hacer otro bypass.

El chequeo lo hace en la posición 0x068A. Hay que cambiar el comando en dicha posición por:
POSICION | ASM     | HEX      | Descripción
0x068A8  | RET Z   | C8       | Como en ese momento está cargado el flag Z, con devolvero el suficiente



Bueno, ahora que ya tenía todo listo para poder modificar la ROM a mi gusto, le hice un cambio que cuando era pequeño habría supuesto mi perdición como persona..... FREE TO PLAY!!! [poraki]

¿Pero si en el mame las partidas son gratis? pues si, pero así me ahorro el tener que pulsar la tecla de meter créditos... vago que es uno :)

Vamos con ello:

FREE TO PLAY!!
La premisa era que si siempre tenemos 9 créditos nunca tendremos que añadirlos y por ende nunca se acabarán. ¿Fácil verdad? los coj... perdón, costó un poquito

El número de créditos lo guarda en $EF01. Cuando se mete un crédito incrementa el valor hasta un máximo de 9

Cuando se gasta un crédito se llama a la función que hay en 0x0164 que hace los siguiente:
POSICION | ASM            | HEX      | Descripción
0x0164   | ld (hl), $00   | 36 00    | Mete el valor 00 en la posición $EF17
0x0166   | ld hl, $EF01   | 21 01 EF | Mete la dirección $EF01 en hl
0x0169   | add a, (hl)    | 86       | Suma el número de créditos que hay en $EF01 a 'a'.
                                       El resultado es el número de créditos - 1 (FF + 01 = 00)
0x016A   | ld (hl), a     | 77       | mete el valor de a con los créditos actualizados en $EF01



Para inicializar los créditos a 9, se hace creando una función intermedia. Dicha función es llamada desde el principio de la carga del programa sub.

Además, en la posición del fichero 0x05AF se ha metido a piñón el número 9 que serán los créditos que tendremos siempre.

Estos son los cambios que hay que hacer:
POSICION | ASM        | HEX      | Descripción
0x000F   | call $00A8 | CD A8 00 | Llamar la función que está en $00A8 (Iniciar créditos a 0)


Por este otro:
POSICION | ASM        | HEX      | Descripción
0x000F   | call $0582 | CD 85 05 | Llamar la nueva función que hemos creado en $0582


En la posición 0x0582 hay un bloque sin usar lo suficientemente grande como para meter la siguiente función:
POSICION | ASM           | HEX      | Descripción
0x0582   | ld a, ($05AF) | 3A AF 05 | En 0x05AF hemos metido el valor 9, que no se cambia nunca.
                                      Metemos el valor en 'a'
0x0585   | ld ($EF01), a | 32 01 EF | Mete el valor de 'a' en $EF01
0x0588   | call $00A8    | CD A8 00 | Llamar a la función que hay en $00A8, que es la misma a la que
                                      llamaba 0x000F originalmente y así seguir con la carga del juego


Ahora ya tenemos nada más arrancar la máquina 9 créditos, eso que nos ahorramos pero cada vez que juguemos se nos van a ir acabando y llegará un momento que tendremos que añadir más (eso implica pulsar el botón de créditos... mu cansao)

Bien, pues esta es la solución!!
POSICION | ASM           | HEX      | Descripción
0x0164   | ld a, ($05AF) | 3A AF 05 | En 0x05AF hemos metido el valor 9, que no se cambia nunca.
                                      Metemos el valor en 'a'
0x0167   | ld ($EF01), a | 32 01 EF | Mete el valor de 'a' en $EF01
0x016A   | ret           | C9       | Salir de la función con los créditos puestos a 9




¿Ha quedado friki verdad? pues me quedan más cosas por hacer (vidas extra, tiempo infinito, cambiar de arma con una pulsación de botón, invulnerabilidad...) pero en el fondo sería más de los mismo, buscar donde se produce el cambio con el debugger y tunearlo para que haga lo que quiera.

Espero que os haya gustado el tostón ASM/hexadecimal y si continúo con ello lo iré poniendo por aquí.

P.D. no me hagáis preguntas sobre ensamblador porque de verdad que no tengo ni puñetera idea y todo lo que aprendí fue a base de meterle tiempo y probar..


salu2 [beer]
Si dices que no tenías ni idea de ensamblador, te has pegado una gran currada para llegar a donde has llegado. Y encima te ha quedado una explicación muy buena.

Muchas gracias por compartirlo.

Saludos.
Imagen

currazo que te has metido
tomo nota de la idea para proximos proyectos
de veras, que un diez de nota
Sin palabras lo tuyo, cuando alguien busca un objectivo al final lo consigue.
muchas gracias! [ayay]

así da gusto postear cosas :) tengo alguna cosilla más, pero ya es de arduino, DMX... si lo encuentro y recuerdo como funcionaba lo pongo en el sub que toque.

Ahora me ha dado el gusanillo de tunear el mame otra vez [360º]
Vaya huevazos los tuyos, ponerte a programar en ensamblador :O :)
Tiene mucho mérito llegar hasta ahí, sin conocimientos previos de ensamblador, aunque por lo que comentas eso ya está medio arreglado . [beer]

En su momento hice algo similar para modificar la ROM de una placa jamma original.

Recomendaciones:
Lo primero es echarle un vistazo el fuente del mame donde viene información importante como el mapa de memoria y funciones del juego, configuración de dips switchs, funciones ocultas, diferencias entre versiones de roms, etc

Concretamente para el TNZS es este:
https://github.com/mamedev/mame/blob/ma ... s/tnzs.cpp

Una posible mejora es mapear tus cambios a posiciones de los dips de manera que se puedan activar a voluntad tanto en hardware físico como en el mame. Aquí tienes cómo funcionan y cómo entender esa parte de los fuentes de mame.

https://wiki.mamedev.org/index.php/DIP_Switches_in_MAME

Y como mejora final, cuando acabes de hacer las modificaciones, calculas el checksum y restableces el control de CRC. Aunque eso ya son palabras mayores. :Ð

Suerte y al lío!
Gracias, la verdad que ahora veo el código en ensamblador y me suena a chino. Ayer le eché un vistazo al libraco que me compré en su día y no me enteré de nada [buuuaaaa]

Gracias @Mil por las recomendaciones

Lo primero es echarle un vistazo el fuente del mame donde viene información importante como el mapa de memoria y funciones del juego, configuración de dips switchs, funciones ocultas, diferencias entre versiones de roms, etc

He mirado un poco por encima el fichero que enlazas y tampoco es que controle de C++, pero algo sí que me ha parecido entender. Lo miraré con más detenimiento, no sé si me lo dará la cabeza para entenderlo [+risas]

Una posible mejora es mapear tus cambios a posiciones de los dips de manera que se puedan activar a voluntad tanto en hardware físico como en el mame. Aquí tienes cómo funcionan y cómo entender esa parte de los fuentes de mame.

Por lo que ví después de pegarme la matada con todo el rollo, desde los dip switches se puede hacer todo lo que yo quería modificar. Pero mi objetivo era modificar la ROM de forma que la tenga tuneada a mi gusto... por así decirlo es hacer un New Zealand Story "Rainbow" (como el street fighter rainbow, que es una ida de olla)


Lo de calcular el checksum y metérselo para que lo calcule bien ya si eso para cuando sea mayor [sati]
mdgairaud escribió:Holas,

Este proyecto es viejuno y el motivo que me llevó a hacerlo era modificar una ROM del juego The New Zealand Story en Mame para dejarla a mi gusto, así a lo bruto y sin pensar que a parte de no tener ni idea de como hacerlo ni del tiempo que me iba a llevar me metí de lleno.

El motivo de que lo publique aquí es gracias al compañero @Troopa Jr que me comentó que le gustaría leerlo :) :)

No tengo capturas de pantalla del proceso, pero sí que lo documenté.

Estos son los principales problemas que me encontré:
  • Está todo en ensamblador Z80.
  • La ROM elegida hace un chequeo CRC en el arranque para comprobar la integridad de las memorias.
  • Buscar lo que quería cambiar y adaptarlo a mi gusto.

Ahora los comento por partes para que veáis cómo conseguí solucionarlo todo:
Ensamblador Z80
La programación de estos juegos está hecha en ensamblador Z80 (de Zilog 80), del cual no tenía (ni tengo) la menor idea de programarlo. Esto no me impidió tener que aprender a usarlo por el metodo prueba/error hasta tener una muy ligera noción de como se realizan las llamadas a funciones, variables, etc...

Hasta me compré un libro de Z80 [fumando]

Protección de la ROM
Parece una tontería y habrá juegos que no hagan este chequeo, pero me llevó 3-4 meses de darle duro al debugger que viene con el mame hasta encontrar donde hace esta comprobación y saltármela. Sin este paso, no se puede hacer nada ya que la ROM muestra un error.

Por lo visto, cuando arrancas el juego carga una parte de código en memoria y luego se pone a realizar un chequeo CRC de cada una de las memorias para comprobar que ninguna esté alterada. El procedimiento es el siguiente:
  • Leer la firma CRC de la memoria
  • Comparar el resultado con lo que tiene para que en caso de que no coincida mostrar el error y parar la carga del juego

La función de ROM Check comienza en la posición 0x0c88 de la memoria y se encuentra en el fichero b53-24.1

Para evitar el chequeo, hay que hacer un bypass de la función para que no haga la comprobación. El bypass consiste en un JUMP a la posición 0x0CB4 y hay que hacerlo desde el principio, ya que el flag Z ya está cargado al inicio y la comprobación tiene que devolver un flag Z para ser correcta

Pongo todo el código que hay que cambiar con las posición de memoria, llamada en EnsambladorZ80, equivalencia en hexadecimal y una breve explicación de lo que hace la línea en cuestión.

La función cambiada queda así:

POSICION | ASM     | HEX      | Descripción
0x0C88   | JP 0C84 | C3 B4 0C | Saltar a la posición 0x0C84 que devuelve el flag Z que ya estaba cargado previamante

De esta manera, como tiene el flag Z cargado, al saltar al RET Z que se encuentra en la posición 0x0C84 se salta el check con éxito.

Pero la protección no queda anulada del todo, porque el ROM CHECK tiene un amigo llamado SUB CHECK XD

Al igual que con el ROM CHECK, cuando se modifica algo que es ejecutado por el proceso SUBCPU hace una comprobación de que está todo correcto. Hay que hacer otro bypass.

El chequeo lo hace en la posición 0x068A. Hay que cambiar el comando en dicha posición por:
POSICION | ASM     | HEX      | Descripción
0x068A8  | RET Z   | C8       | Como en ese momento está cargado el flag Z, con devolvero el suficiente



Bueno, ahora que ya tenía todo listo para poder modificar la ROM a mi gusto, le hice un cambio que cuando era pequeño habría supuesto mi perdición como persona..... FREE TO PLAY!!! [poraki]

¿Pero si en el mame las partidas son gratis? pues si, pero así me ahorro el tener que pulsar la tecla de meter créditos... vago que es uno :)

Vamos con ello:

FREE TO PLAY!!
La premisa era que si siempre tenemos 9 créditos nunca tendremos que añadirlos y por ende nunca se acabarán. ¿Fácil verdad? los coj... perdón, costó un poquito

El número de créditos lo guarda en $EF01. Cuando se mete un crédito incrementa el valor hasta un máximo de 9

Cuando se gasta un crédito se llama a la función que hay en 0x0164 que hace los siguiente:
POSICION | ASM            | HEX      | Descripción
0x0164   | ld (hl), $00   | 36 00    | Mete el valor 00 en la posición $EF17
0x0166   | ld hl, $EF01   | 21 01 EF | Mete la dirección $EF01 en hl
0x0169   | add a, (hl)    | 86       | Suma el número de créditos que hay en $EF01 a 'a'.
                                       El resultado es el número de créditos - 1 (FF + 01 = 00)
0x016A   | ld (hl), a     | 77       | mete el valor de a con los créditos actualizados en $EF01



Para inicializar los créditos a 9, se hace creando una función intermedia. Dicha función es llamada desde el principio de la carga del programa sub.

Además, en la posición del fichero 0x05AF se ha metido a piñón el número 9 que serán los créditos que tendremos siempre.

Estos son los cambios que hay que hacer:
POSICION | ASM        | HEX      | Descripción
0x000F   | call $00A8 | CD A8 00 | Llamar la función que está en $00A8 (Iniciar créditos a 0)


Por este otro:
POSICION | ASM        | HEX      | Descripción
0x000F   | call $0582 | CD 85 05 | Llamar la nueva función que hemos creado en $0582


En la posición 0x0582 hay un bloque sin usar lo suficientemente grande como para meter la siguiente función:
POSICION | ASM           | HEX      | Descripción
0x0582   | ld a, ($05AF) | 3A AF 05 | En 0x05AF hemos metido el valor 9, que no se cambia nunca.
                                      Metemos el valor en 'a'
0x0585   | ld ($EF01), a | 32 01 EF | Mete el valor de 'a' en $EF01
0x0588   | call $00A8    | CD A8 00 | Llamar a la función que hay en $00A8, que es la misma a la que
                                      llamaba 0x000F originalmente y así seguir con la carga del juego


Ahora ya tenemos nada más arrancar la máquina 9 créditos, eso que nos ahorramos pero cada vez que juguemos se nos van a ir acabando y llegará un momento que tendremos que añadir más (eso implica pulsar el botón de créditos... mu cansao)

Bien, pues esta es la solución!!
POSICION | ASM           | HEX      | Descripción
0x0164   | ld a, ($05AF) | 3A AF 05 | En 0x05AF hemos metido el valor 9, que no se cambia nunca.
                                      Metemos el valor en 'a'
0x0167   | ld ($EF01), a | 32 01 EF | Mete el valor de 'a' en $EF01
0x016A   | ret           | C9       | Salir de la función con los créditos puestos a 9




¿Ha quedado friki verdad? pues me quedan más cosas por hacer (vidas extra, tiempo infinito, cambiar de arma con una pulsación de botón, invulnerabilidad...) pero en el fondo sería más de los mismo, buscar donde se produce el cambio con el debugger y tunearlo para que haga lo que quiera.

Espero que os haya gustado el tostón ASM/hexadecimal y si continúo con ello lo iré poniendo por aquí.

P.D. no me hagáis preguntas sobre ensamblador porque de verdad que no tengo ni puñetera idea y todo lo que aprendí fue a base de meterle tiempo y probar..


salu2 [beer]


compi, lo encuentro muy interesante y me gustaría cacharrearlo...

¿Qué libro te compraste para aprender sobre el z80?
¿Sabes donde hay algún tutorial sobre el manejo del debug del mame? Los cambios se podrían hacer desde el mismo debug?
Por ejemplo, para hacer en algún jueguecillo algún cambio sencillo como cambiar algún texto, se podría hacer desde el propio debug o habría que usar algún otro programa?

Mucha gracias
Me suscribo a tu hilo, me he quedao asombrao de lo que has conseguido sin saber del tema empezando desde cero, y encima lo estás haciendo para mi juego favorito.
Lo que más me ha gustado es la forma tan sencilla y precisa de explicarlo, de forma que conforme he ido leyendo iba enterándome de todo. Muy didáctico e interesante.
¡Mi enhorabuena!
KorteX escribió:Lo que más me ha gustado es la forma tan sencilla y precisa de explicarlo, de forma que conforme he ido leyendo iba enterándome de todo. Muy didáctico e interesante.
¡Mi enhorabuena!


Jolín, pues yo es que soy muy torpe porque no me he enterado de nada... No sé qué programa para hacer los cambios, etc o si lo hace con el mismo debug del ejecutable del mame...
Holas, hacía tiempo que no entraba en EOL y no he visto que el hilo iba a ser interesante [360º] .

Es cierto que no me he explayado con los programas usados ni con el debug de Mame, esto lo hice hace 3-4 años y únicamente tenía apuntado todo lo que cambié.


Por partes (y por lo que recuerdo):

Herramienta Debug: Desde el debug de Mame no se puede cambiar nada, como mucho puedes mirar las llamadas en memoria (funciones), contenido de una posición en memoria (vidas extra, puntuación...) y lo más importante, el código en ensamblador para ver como funciona el juego.
Puedes poner breakpoint:
  • Por posición: Marcas una posición de memoria y si el Mame pasa por ahí se para
  • Por valor: Es una variante de la anterior que únicamente se para si se cumple una condición que normalmente suele ser un valor, por ejemplo: para en la posición 0x5000 si tiene un valor de 0A (siempre hay que pensar en hexadecimal)
Búsqueda de valores: Puedes hacer un escaneado de la memoria para que te haga un listado de direcciones de memoria con el valor indicado. Por ejemplo, queremos buscar todas las direcciones que tengan 05 como valor. Nos mostrará un listado que por algún motivo no podemos copiar en el portapapeles y verlo en notepad++ o excel para tratarlo más comodamente.

No recuerdo ahora mismo más funcionalidades, pero si que era potentillo aunque podría tener alguna cosa más. [beer]


Editar los ficheros: Es supersencillo, solo tienes que descomprimir el fichero .zip que tiene la ROM y editar los ficheros con un editor hexadecimal, no recuerdo el que utilicé ¿¿hexeditor?? no sé... Conviene hacer copias de los originales y de cada cambio que hagas, una especie de repositorio. Hay que tener en cuenta que todo está en hexadecimal y no puedes añadir comentarios como cuando programas con IDE moderno.
Una vez editados los ficheros, los comprimes de nuevo con el nombre correcto de la ROM (y siempre en formato zip) y lo abres con el mame.


Libro: El que pillé es este Programming the Z-80 - Rodnay Zaks aunque a mi me costó 10-12€, es un libro viejo pero el Z80 también es viejo! XD


El libro lo pillé después de saltarme la protección del juego, es decir, cuando ya me manejaba bien con el ensamblador, debug del mame y editor hexadecimal. Vamos que fue casi más por capricho que por necesidad.

Yo tenía siempre una pestaña en el navegador abierta con todos los comandos y funciones del Z80, así podía hacer la función en papel usando nomenclatura normal (jp, ret, cp...) y luego "traducirla" a ensamblador mirando en una tabla la equivalencia con el opcode correspondiente.

Por ejemplo:
http://www.z80.info/z80oplist.txt
http://map.grauw.nl/resources/z80instr.php , esta última aunque ponga MSX no importa ya que también estaban basados en Z80


y creo que nada mas... la verdad que a raíz de abrir este hilo me ha entrado el gusanillo de cacharrear otra vez [chulito]

P.D. la página que provocó que me metiera en este fregao era esta: http://umlautllama.com/projects/gamehacks/, que tiene varios hacks del pacman modificando la rom a lo bruto.
mdgairaud escribió:Holas, hacía tiempo que no entraba en EOL y no he visto que el hilo iba a ser interesante [360º] .

Es cierto que no me he explayado con los programas usados ni con el debug de Mame, esto lo hice hace 3-4 años y únicamente tenía apuntado todo lo que cambié.


Por partes (y por lo que recuerdo):

Herramienta Debug: Desde el debug de Mame no se puede cambiar nada, como mucho puedes mirar las llamadas en memoria (funciones), contenido de una posición en memoria (vidas extra, puntuación...) y lo más importante, el código en ensamblador para ver como funciona el juego.
Puedes poner breakpoint:
  • Por posición: Marcas una posición de memoria y si el Mame pasa por ahí se para
  • Por valor: Es una variante de la anterior que únicamente se para si se cumple una condición que normalmente suele ser un valor, por ejemplo: para en la posición 0x5000 si tiene un valor de 0A (siempre hay que pensar en hexadecimal)
Búsqueda de valores: Puedes hacer un escaneado de la memoria para que te haga un listado de direcciones de memoria con el valor indicado. Por ejemplo, queremos buscar todas las direcciones que tengan 05 como valor. Nos mostrará un listado que por algún motivo no podemos copiar en el portapapeles y verlo en notepad++ o excel para tratarlo más comodamente.

No recuerdo ahora mismo más funcionalidades, pero si que era potentillo aunque podría tener alguna cosa más. [beer]


Editar los ficheros: Es supersencillo, solo tienes que descomprimir el fichero .zip que tiene la ROM y editar los ficheros con un editor hexadecimal, no recuerdo el que utilicé ¿¿hexeditor?? no sé... Conviene hacer copias de los originales y de cada cambio que hagas, una especie de repositorio. Hay que tener en cuenta que todo está en hexadecimal y no puedes añadir comentarios como cuando programas con IDE moderno.
Una vez editados los ficheros, los comprimes de nuevo con el nombre correcto de la ROM (y siempre en formato zip) y lo abres con el mame.


Libro: El que pillé es este Programming the Z-80 - Rodnay Zaks aunque a mi me costó 10-12€, es un libro viejo pero el Z80 también es viejo! XD


El libro lo pillé después de saltarme la protección del juego, es decir, cuando ya me manejaba bien con el ensamblador, debug del mame y editor hexadecimal. Vamos que fue casi más por capricho que por necesidad.

Yo tenía siempre una pestaña en el navegador abierta con todos los comandos y funciones del Z80, así podía hacer la función en papel usando nomenclatura normal (jp, ret, cp...) y luego "traducirla" a ensamblador mirando en una tabla la equivalencia con el opcode correspondiente.

Por ejemplo:
http://www.z80.info/z80oplist.txt
http://map.grauw.nl/resources/z80instr.php , esta última aunque ponga MSX no importa ya que también estaban basados en Z80


y creo que nada mas... la verdad que a raíz de abrir este hilo me ha entrado el gusanillo de cacharrear otra vez [chulito]

P.D. la página que provocó que me metiera en este fregao era esta: http://umlautllama.com/projects/gamehacks/, que tiene varios hacks del pacman modificando la rom a lo bruto.


Muchas gracias compi. Voy a intentar hacer alguna cosilla simple como intentar cambiar los textos en algún jueguecillo a ver y le echaré un vistazo al libro que comentas y a los links.

Thanks
empardopo escribió:Muchas gracias compi. Voy a intentar hacer alguna cosilla simple como intentar cambiar los textos en algún jueguecillo a ver y le echaré un vistazo al libro que comentas y a los links.

Thanks

[beer]
Hola antes que nada muy bueno con lo que hiciste
Tengo una pregunta será posible hacer que algo no suceda en el juego
Por ej el el juego roc'n rope el terodactido que pasa en lanzarte superior de las pantallas en el juego original que yo jugaba de chico empezaba a tirar piedras en pantalla 17 pero en el mame empieza a tirarlas en la pantalla 6 y es bastante desagradable jugar cuando te están tirando piedras será posible modificar eso desde ya muchas gracias 0
Sindor escribió:Hola antes que nada muy bueno con lo que hiciste
Tengo una pregunta será posible hacer que algo no suceda en el juego
Por ej el el juego roc'n rope el terodactido que pasa en lanzarte superior de las pantallas en el juego original que yo jugaba de chico empezaba a tirar piedras en pantalla 17 pero en el mame empieza a tirarlas en la pantalla 6 y es bastante desagradable jugar cuando te están tirando piedras será posible modificar eso desde ya muchas gracias 0


No conozco el juego, pero mame tecnicamente emula fiel a la maquina, asi q si ves una diferencia de dificultad la tienes q ajustar en el menu de servicio del juego
16 respuestas