POKE de invulnerabilidad para Gaurodan

Foro dedicado a la programación en todo tipo de sistemas clásicos.
Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 54 veces
Contactar:

POKE de invulnerabilidad para Gaurodan

Mensajepor mcleod_ideafix » 02 Ago 2013, 13:12

Para los torpes como yo que no paso del capítulo IV, allá va el poke de invulnerabilidad para Gaurodan:

Abre gaurodan.exe en un editor hexadecimal, por ejemplo, HxD. Vete al offset 2C88. A partir de esa posición, rellena con el valor 90 (hex) desde la posición 2C88 hasta la 2C8F inclusive. Graba la nueva versión del EXE y juega con ella. A partir de ese momento, Gaurodan tendrá sólamente una barrita de energía, pero esa barrita no decrecerá :D

La verdad es que me divierto más buscando estas cosas que jugando al juego en sí, pero ahora por lo menos podré verlo entero y disfrutarlo, en lugar de frustrarme :)

Es curioso que en este juego, parece ser que todas las variables usadas son reales de precisión doble. Incluso algo tan anodino como una barra de energía que decrece de 10 a 0 está guardada como un valor de 64 bits en formato de doble precisión (???). Para manejar estas variables, el programa hace uso extensivo de los registros SSE, concretamente, la parte baja del registro XMM0. Puede que sea por aquello que dijo Locomalito de que este juego es su examen personal para ver qué tal le va cogiendo el tranquillo al nuevo Game Studio
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

Avatar de Usuario
Alki
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 524
Registrado: 05 Jul 2006, 10:24
Gracias dadas: 3 veces
Gracias recibidas: 2 veces

Re: POKE de invulnerabilidad para Gaurodan

Mensajepor Alki » 02 Ago 2013, 13:40

que bueno... ya nos contarás como encuentras estas cosas en un mar de codigo hexadecimal...

Avatar de Usuario
Ivanzx
Amiga 1200
Amiga 1200
Mensajes: 1620
Registrado: 05 Abr 2007, 19:39
Gracias recibidas: 22 veces
Contactar:

Re: POKE de invulnerabilidad para Gaurodan

Mensajepor Ivanzx » 02 Ago 2013, 13:45

Por un momento pensé que habías convertido el Gaurodan a Spectrum, Mcleod!! :)

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 54 veces
Contactar:

Re: POKE de invulnerabilidad para Gaurodan

Mensajepor mcleod_ideafix » 02 Ago 2013, 14:08

El POKE anterior tiene un defectillo, y es que cuando termina el juego y va a calcular la puntuación final, tiene que ir quitando las barras de energía a medida que la puntuación aumenta, hasta que la barra de energía se queda a 0. El problema es que... nunca se queda a 0, así que la puntuación final sube y sube sin parar.

Así que para que esa parte la haga bien y podamos disfrutar de la secuencia final del juego, hay que restituir los valores "pokeados" a los originales, pero cuando el programa aún está en memoria.

Para ello, teneis que echar mano de algún editor pero de memoria, que permita "engancharse" a un proceso. Por ejemplo, el Art Money. En la dirección de memoria 00403889 (hexadecimal) y siguientes encontrareis los 90 90 90... que pusisteis antes. "Pokead" en memoria encima de esos valores 90 y poned en su lugar estos:
F2 0F 11 0D 30 60 6F 00

Es altamente recomendable que mientras se hace el pokeo, el juego se pause con la tecla ESC, para que la porción de código que está siendo toqueteada no se ejecute sin querer. Luego se resume el juego y se observa como la barra de energía termina por consumirse, dando paso a la secuencia final del juego :)

-- Actualizado 02 Ago 2013, 14:13 --

Alki escribió:que bueno... ya nos contarás como encuentras estas cosas en un mar de codigo hexadecimal...

Han sido casi 10 años impartiendo la asignatura de Técnicas de Programación en Bajo Nivel en la Ingeniería Informática... algo se me ha quedado de desensamblar código, poner puntos de ruptura, interpretar un volcado de pila buscando argumentos de una función, etc ;)
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

Avatar de Usuario
jrodriguezv
MSX Turbo R
MSX Turbo R
Mensajes: 325
Registrado: 02 Jun 2012, 18:21
Sistema Favorito: Amstrad CPC
primer_sistema: Amstrad CPC
consola_favorita: Sega Genesis/Megadrive
Ubicación: Madrid

Re: POKE de invulnerabilidad para Gaurodan

Mensajepor jrodriguezv » 02 Ago 2013, 14:22

¿Y para la versión de Linux? :twisted:

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 54 veces
Contactar:

Re: POKE de invulnerabilidad para Gaurodan

Mensajepor mcleod_ideafix » 02 Ago 2013, 14:29

jrodriguezv escribió:¿Y para la versión de Linux? :twisted:

Sorry... no tengo instalado Linux... :roll: Déjame que mire, a ver si el código generado es más o menos el mismo... mmmmm. No: para nada es el mismo. Probablemente esté usando GCC como backend, y eso genera un código muy diferente de loq ue estoy viendo en la versión de Windows.
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

Avatar de Usuario
jrodriguezv
MSX Turbo R
MSX Turbo R
Mensajes: 325
Registrado: 02 Jun 2012, 18:21
Sistema Favorito: Amstrad CPC
primer_sistema: Amstrad CPC
consola_favorita: Sega Genesis/Megadrive
Ubicación: Madrid

Re: POKE de invulnerabilidad para Gaurodan

Mensajepor jrodriguezv » 02 Ago 2013, 15:44

Gracias por mirarlo. Siempre puedo ejecutarlo con Wine.

Avatar de Usuario
mentalthink
Amiga 2500
Amiga 2500
Mensajes: 2840
Registrado: 11 Abr 2010, 15:06
Gracias dadas: 45 veces
Gracias recibidas: 14 veces

Re: POKE de invulnerabilidad para Gaurodan

Mensajepor mentalthink » 03 Ago 2013, 01:00

Menos mal que la Época dorada no te pillo mayorcico, si no más de uno te hubiese tenido enfilao

Una cosilla sobre los programas estos, o sea tu cuando haces eso, tú ves el código en C++, no?¿, o al menos en ASM y de ahí vas sacando la historia, lo que me ha gustao que has comentao la manera o sea fijandote en la barra, yo nunca he hecho eso de pokear y pensaba que era buscando alguna posición de memoria que daba alguién o algo raro, pero es interesante que mirando fallos en las interfaces se puedan sacar vidas infinitas o más bien "tronchar" programas...

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 54 veces
Contactar:

Re: POKE de invulnerabilidad para Gaurodan

Mensajepor mcleod_ideafix » 03 Ago 2013, 01:18

mentalthink escribió:Una cosilla sobre los programas estos, o sea tu cuando haces eso, tú ves el código en C++, no?¿, o al menos en ASM

Se ve en ensamblador.

mentalthink escribió:y de ahí vas sacando la historia, lo que me ha gustao que has comentao la manera o sea fijandote en la barra

Tú sabes... todo está codificado con un número dentro del programa. Lo habitual es que si en un juego tienes 3 vidas, pues este codificado con ese valor. La barra de vitalidad del Gaurodan no es un gráfico de bloque que se consuma pixel a pixel como en otros juegos, sino que tiene 10 divisiones perfectamente diferenciadas, así que era lógico suponer que tenía que buscar el valor 10. Hay veces que la cosa no es tan simple... una barra de energía que se decrementa por píxeles... o un gráfico que va convirtiéndose de persona humana a esqueleto cada vez que te van quitando energía... Ahí tienes que pensar en qué es lo que tenía en mente el programador... ¿un valor que se decrementa de 255 a 0? ¿de 100 a 0? (lo de decrementarse es porque computacionalmente hablando es más eficiente comparar con 0 que comparar con cualquier otro valor) Otras veces lo que haces es mirar qué más pasa cuando te toca un enemigo o un proyectil, además de quitarte energía (suena un efecto de sonido concreto, o la pantalla parpadea un instante para indicar la colisión, etc) y lo que hago es buscar qué parte del código hace algo como eso. Esa parte del código habrá sido llamada desde la rutina que detectó la colisión y restó energía. Voy deshaciendo la pila de llamadas hasta ver algo que se parece a una secuencia de instrucciones que toma un valor, lo decrementa, lo vuelve a guardad, y compara el valor actualizado con 0.

La gracia del asunto es que en este programa, parece ser que todas las variables son double (real de 64 bits). Hasta una información tan simple como es un contador de 10 a 0 para la vitalidad se guarda con 64 bits en formato de doble precisión. Creo que Locomalito aún no le ha cogido el truco al Game Studio y puede que en algún sitio necesitara una variable real, y no supiera como hacer que esa variable en concreto fuera real, y las hizo todas reales :D En otros programas de Locomalito, él ha usado variables enteras. Es la primera vez que veo algo así.

De esto me di cuenta al mirar lo que se guardaba en AppData, en settings.ini creo que es, que vi que todos los valores se guardaban con números con decimales. Eso me "mosqueó" un poco, y entonces a la hora de buscar el valor de "energía" probé a buscar un float o un double, en lugar de un entero.

Luego al comprobar el desensamblado, vi que no solamente eran doubles, sino que además el código hacía bastante uso de las instrucciones SSE para cargar, actualizar y guardar los datos. El código es en realidad bastante "feo" (el que genera el compilador, quiero decir). Todas las actualizaciones de ESA variable en concreto, la de la energía, se realizan en una única función cuyo cometido parece ser ese. Esa función es llamada desde otra, pero no directamente, sino que esa otra función "llamante" por así decirlo, tiene como uno de sus parámetros un valor que es un índice a una tabla de direcciones de funciones. Se calcula la dirección de la función a llamar según el contenido de la entrada de dicha tabla, y se llama. En concreto, esta función que actualiza la barra de vitalidad es la función de número 69h

El POKE no es elegante, por lo que he comentado antes que pasa cuando acabas el juego, pero sí es el más rápido que pude sacar. Un POKE elegante de verdad es aquel que neutraliza la llamada a la rutina que realiza la detección de colisiones, ya que permitiría por ejemplo recolectar energía cogiendo corazones (con mi POKE los corazones no te dan energía ni nada), y haría que Gaurodan se paseara por la pantalla como si fuera transparente a las balas, en lugar de chillar cada vez que le dan (aunque su energía no decremente). Llegué a ver trazas de esa rutina pero francamente, ya casi me daba igual :D
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

jepalza

Re: POKE de invulnerabilidad para Gaurodan

Mensajepor jepalza » 04 Ago 2013, 07:53

mcleod_ideafix escribió:La verdad es que me divierto más buscando estas cosas que jugando al juego en sí, pero ahora por lo menos podré verlo entero y disfrutarlo, en lugar de frustrarme :)

Ya "semos" dos. Nunca he publicado trucos o "pokes", pero es algo que hago mucho, por que, como tú bien dices, soy un torpe en los juegos. >|
(no solo busco trucos a juegos, tambien a algunas cosillas de productividad, como un editor de textos del año de la polka, del 91,antiguo shareware, que me encanta, pero "estaba" limitado a solo 30 salvados de ficheros :twisted: )


Volver a “Programación”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados