Avatar
Avatar

Jesús Alonso Abad

@kencho

Burgos

“Apasionado de los videojuegos (desarrollarlos), intentando abrirme paso en la industria poco a poco.”

Mensajes 2735 Seguidores 70 Sigue a 64
Últimos logros desbloqueados
2 logros
desbloqueados
  • Jesús Alonso Abad, 24/07/2017 @kencho, Principiante Offline
    El anuario ya está en mi poder :D
    3
  • Jesús Alonso Abad, 15/06/2017 @kencho, Principiante Offline
    Pep y Sopas en las noticias de Anaitena 3! :O
    3
  • Jesús Alonso Abad, 23/05/2017 @kencho, Principiante Offline
    Si no atiendo mucho es porque estoy obsesionado con Zelda:BotW

    Puta

    Obra

    Maestra
    6
  • Jesús Alonso Abad, 23/05/2017 @kencho, Principiante Offline
    ¡Tengo mi Mes Mini en mis manos! ¡¡Al fin!! :D
    2
  • Jesús Alonso Abad, 27/02/2017 @kencho, Principiante Offline
    TLoZ: Art&Artifacts. El artbook más rebonito que he visto. Ha hecho llorar mi corazón con la nostalgia y sudar mi brazo con el peso XD
    0
    • kencho, 27/02/2017
      @diegodcsantos, puedes respirar tranquilo. De BotW vienen unas pocas páginas, al final, muy bien delimitadas y con artworks ya vistos bastantes veces (pero preciosos igualmente)
    • diegodcsantos, 27/02/2017
      @kencho
      No he tenido tiempo de abrirlo, creo que voy a esperar al viernes, que va a ser un día especial jajaja.
      Gracias por la información en cualquier caso :)
  • Jesús Alonso Abad, 25/02/2017 @kencho, Principiante Offline
    Legend of Zelda: Art & Artifacts en camino. ¿Habrán incluído spoilers de Breath of the Wild? Tengo miedo de abrirlo cuando llegue :O
    1
    3 Comentarios
  • Jesús Alonso Abad, 27/01/2017 @kencho, Principiante Offline
    Trailer de Double Dragon 4: https://youtu.be/jJM21W2ACPU
    0
  • Jesús Alonso Abad, 21/01/2017 @kencho, Principiante Offline
    Ok, actualizada la web de Double Dragon 4. Puto HYPE.
    0
  • Jesús Alonso Abad, 19/01/2017 @kencho, Principiante Offline
    Tentáculus Rift: https://youtu.be/b8ERaueJt5s
    5
  • Jesús Alonso Abad, 16/01/2017 @kencho, Principiante Offline
    Misterio resuelto sobre el juego de SNK :?
    https://goo.gl/RTGwlu
    3
  • Jesús Alonso Abad, 02/01/2017 @kencho, Principiante Offline
    Terminé 2016 terminando los hacks que tenía en mente. No fue un año tirado a la basura como game-dev XD
    https://goo.gl/hbBz5a
    4
    • kencho, 02/01/2017
      Estuvo cerca, pero me alegro de haber hecho algo (y aprendido mucho) como desarrollador de juegos :) ¡A ver si en 2017 cae algo más serio!

      PD: Ahí va el parche, sin la ROM, que aún no tengo muy clara la legalidad de enlazar ROMs... Pero vamos, que no es difícil de encontrar :P
  • Jesús Alonso Abad, 27/12/2016 @kencho, Principiante Offline

    Hacking the Dragons (3)

    (Continúa desde la parte 2)

    Siguiendo con el tema del bloqueo, está el problema de que en este juego el bloqueo está temporizado. Cuando pasamos a modo defensivo, es por un tiempo determinado, y para colmo no tenemos un feedback que nos indique cuándo vamos a bajar la guardia. Así que vamos a parchearlo para que la guardia se mantenga mientras pulsemos el botón, al estilo de Mortal Kombat o Soul Calibur.

    Identificar el temporizador
    La intuición (y la lógica) nos dice que este temporizador tiene que ser algo específico de cada personaje, y por tanto, estará en su segmento de memoria. Vamos a ver qué pasa cuando pulsamos el bloqueo.

    ¿Lo habéis visto? ¿Esos números que cambian rápidamente en 7e:nn17? Por lo que he podido sacar, ese byte se utiliza temporalmente para distintas cosas, según la acción del personaje. Lo que está más o menos claro es que cuando llega a 10h (16, en decimal), deja de bloquear. Por tanto, tenemos que buscar en qué punto del programa lee este valor, cuando éste tiene un valor de 10h. Añadimos un breakpoint en bsnes para vigilar nn17 (en mi caso, 1117), poniendo como condición que el valor sea 10 y sea una lectura (R).

    Debería detenerse en 05af05:

    05af05 lda $17 [001117] …

    Como siempre, habría que ver algunas instrucciones posteriores o anteriores para ver lo que hace (ya que se podría leer de ahí un 10 en varios puntos para otras cosas), pero en este caso hemos tenido suerte. Veamos las tres instrucciones a partir de esta:

    lda $17
    cmp #$10
    bcc aeb3

    La primera carga en el registro A el valor en D+17 (ahora debería ser 10). La segunda, compara A con 10; si A < 10 pone los flags Z=0 y C=0, si A=10, Z=1 y C=1, y si A > 10, Z=0 y C=1. La tercera instrucción saltará a 05aeb3 si C=1, es decir, si A es mayor o igual a 10. Hemos localizado la comprobación de salida del bloqueo.

    Cambiar la condición
    En vez de salir cuando termine el temporizador queremos salir cuando dejemos de pulsar el bloqueo. Del capítulo anterior sabemos que en el desplazamiento 46, cuando el bloqueo (B) está pulsado, se activa el tercer bit, 4. Luego cualquier valor que tenga este valor activo nos dirá que el bloqueo está pulsado (4, 5, 6, 7, 12…). Ahora viene el problema del espacio. Las tres instrucciones originales usan exactamente 7 bytes (2+2+3), y nosotros no podemos excedernos de ese tamaño sin tener problemas. Con la primera instrucción no hay problemas, ya que hay que reemplazar el 17 por el 46 para que lea A de otro byte. Para la comparación, en vez de usar CMP, usaremos AND, que aplica una máscara al registro A, y además pondrá el flag Z=0 si A tenía el bit indicado a 0 (en otras palabras, A=0 y Z=0 si no está pulsado el bloqueo). Esta instrucción son otros dos bytes. Todo bien por ahora. Por suerte, para el salto lo único que cambia es la condición de salto, que ahora es sólo si Z=0 (instrucción BNE), luego siguen siendo 3 bytes. Luego nuestro nuevo código es:

    lda $46
    and #$04
    bne aeb3

    o en no$sns:

    lda 46
    and #04
    bne aeb3

    Lo cambiamos y probamos que en efecto el bloqueo ahora se activa sólo al mantener pulsado el botón.

    Modificar la rom y crear el parche
    Como en la parte anterior, con el editor hexadecimal y la ayuda de Lunar Address, vamos a la posición correspondiente; la primera instrucción está en 05af05 pero no es necesario cambiar ni el opcode de la primera ni el parámetro de la tercera. Luego reemplazamos los 4 bytes a partir de 05af06 por los valores de las nuevas instrucciones: 46 29 04 D0. Guardamos y si queremos, creamos un parche aparte con Lunar IPS.



    En la próxima entrada haremos algo igual de sencillo, pero luego se complicará un poco más ;)
    3
  • Jesús Alonso Abad, 26/12/2016 @kencho, Principiante Offline

    Hacking the Dragons (2)

    (Continúa desde la parte 1)

    Uno de los problemas de los controles de este juego es que los bloqueos sólo se pueden realizar si el botón de bloqueo se pulsa fuera de otras acciones como un puñetazo, etc. Esto hace casi imposible que inmediatamente después de lanzar un golpe, pases a un estado defensivo. Vamos a solucionar eso.

    Localizar el segmento de RAM del personaje
    La SNES tiene un área de RAM de trabajo (WRAM) en las direcciones comprendidas entre 7E:0000 y 7F:FFFF. Es aquí donde el juego almacena los datos de las entidades del juego (entre otras cosas), como son los personajes, enemigos, armas… Para los personajes utiliza segmentos de 256 bytes, con la forma 7E:nn00 y 7E:nnFF. Mi consejo antes de empezar es limpiar la pantalla de enemigos (¡sin avanzar por el escenario!) para poder probar cosas a gusto. Hay que ir inspeccionando en el mapa de memoria cada uno de estos segmentos para ver si cambian cuando (y sólo cuando) nosotros hacemos algo como dar un puñetazo o saltar. Atentos, porque estos segmentos cambian de sitio según los necesita el juego cuando crea una nueva entidad. Por ejemplo, en un emulador estoy inspeccionando 7E:0Cxx y en otro 7E:11xx. Lo único que interesa son los desplazamientos dentro de estos segmentos.

    Una vez localizado este segmento, podréis ver que los bytes del 7E:nn44 al 7E:nn48 cambian cuando se pulsa algo en el mando. Las direcciones 44 y 45 son una copia de las lecturas directas del mando. De ellas dos, se copia en 46 el estado de los 4 botones de la SNES A, B, X e Y (cada bit es un botón). 47 es una copia interna de 46, y 48 usa los mismos bits que 46, pero sólo de los que se han pulsado en este frame. Esto lo he sacado a base de observar y un poco de ingeniería inversa. Con saber que el 46 tiene el bit con valor 04 cuando está pulsado el bloqueo (B), y que el 48 lo tiene cuando se acaba de pulsar, es suficiente para lo que queremos.

    Localizar el código que comprueba esta pulsación
    Lo que haremos será ver qué hace una lectura de el byte 7E:nn48 cuando éste valga 04. En bsnes, añadiremos un breakpoint inspeccionando esa dirección (en mi caso, 1148, sin el 7e del principio; la razón es un poco larga aquí), indicando como valor 4 y marcando la casilla R. En cuanto pulsemos el botón B hará una parada en el primer punto que lo inspeccione. Debería tener esta pinta:
    059edf lda $48 [001148] A:1101 ... D:1100 …
    El primer valor es la dirección de la instrucción que ha hecho la lectura, 059edf. Después viene la instrucción desensamblada, lda $48. [001148] es la dirección sobre la que se acaba de trabajar (hay que sumar el 7e0000 para tener la dirección real). Después, el valor actual del registro A (a donde se leerá el valor de 7e1148) y el D (que define el desplazamiento en la zeropage). Básicamente esta instrucción, lda $48, lo que hace es cargar en el registro A lo que haya en D+48.
    Se hace varias veces por frame, así que tendremos que ver cuál es la que nos interesa. Si en el debugger pulsamos a step, avanzará una instrucción. En el primer caso será and #$02, que hace un AND lógico entre el parámetro, 02, y el registro A, 1104. No nos interesa, así que damos a run para ir al siguiente breakpoint, y a step para ver qué valor está buscando, hasta que busque un 04.
    059f4f lda $48 [001148] A:1100 ...
    059f51 and #$04 A:1104 …
    Luego aquí lee el valor en 7E:nn48 para ver si en este frame se ha pulsado el botón de bloqueo. Como lo que nos interesa es que detecte si está pulsado, y no sólo si se acaba de pulsar, tenemos que cambiar el parámetro de 059f4f para que lea el 46 en lugar del 48. Desde no$sns, en el panel de desensamblado, vamos a la dirección 059f4f (botón derecho > Goto…) y editamos la instrucción (botón derecho > Change instruction) para cambiar de lda 48 a lda 46

    Ahora podemos ver que si para el momento en que acabemos de dar un golpe, tenemos pulsado el bloqueo, pasa directamente a ese estado.

    Aplicar en la rom
    Ahora sólo queda modificar definitivamente la rom. Abrimos la rom con un editor hexadecimal. Usando Lunar Address autodetectamos el tipo de rom y escribimos en la dirección SNES el valor 059f4f y nos dirá la posición en el fichero (en mi caso, 029f4f). Vamos a esa dirección en el editor hexadecimal y deberíamos encontrar A5 48 (el opcode LDA, y su parámetro, 48). Modificamos ese 48 por el 46 (se pueden ver los nuevos bytes en no$sns, a la izquierda de la instrucción), y guardamos con otro nombre la rom. Esa es nuestra rom parcheada.

    Crear el parche
    Ahora con Lunar IPS creamos el parche, primero cargando la rom original y después la modificada. Ahora podemos parchear la original con este parche, sin necesidad de aplicar todos los demás cambios que hagamos.



    Ha sido un poco espeso hoy. Más en el siguiente ;)
    3
  • Jesús Alonso Abad, 26/12/2016 @kencho, Principiante Offline

    Hacking the Dragons (1)

    ¡Muy buenas! ¡Cuánto tiempo!

    En esta miniserie os voy a contar un poco sobre mis peripecias parcheando/hackeando el Return of Double Dragon, de Super Famicom.

    El juego y el por qué
    El Return of Double Dragon (el japonés, más completo que Super Double Dragon) es para mí uno de los mejores beat ‘em ups que he jugado en SNES. Sin embargo, seguro que al poco rato de jugar ya descubriréis que tiene algunas carencias muy graves, sobre todo en la respuesta de los controles, a menudo frustrantes.

    Así que como ni la difunta Technos, ni la actual propietaria Arc System Works, van a parchearlo, pues no queda otra que hacerlo uno mismo.

    Las herramientas
    bsnes-plus v073+3a
    Tiene un excelente gestor de breakpoints que nos permitirá pausar la emulación cuando una cierta línea de código o, especialmente, una zona de memoria se lea o escriba. Por desgracia no se puede modificar el código al vuelo (al menos, no cómodamente), así que toca usar también otro emulador, el…
    no$sns v1.6
    Es más tosco que bsnes, pero permite cambiar el código desensamblado del juego al vuelo y trae una excelente documentación técnica.
    HxD
    Ninguno de los dos emuladores aplica los cambios sobre la rom real, así que habrá que hacer los cambios parcheándola con un editor hexadecimal.
    Lunar Address
    Las direcciones del código en la memoria de la consola/emulador no son las mismas que en la rom. Con esta herramienta se pueden convertir fácilmente para saber qué hay que parchear para aplicar los cambios.
    LibreOffice, Excel y/o boli+papel
    Va a tocar tomar bastantes notas, así que mejor tenerlo un poco organizado todo (recomiendo las hojas de cálculo, por eso de poder mover las cosas de sitio o cambiarlas si no son lo que en un principio habíais pensado)

    no$sns
    Al cargar aquí la rom, se pueden ver cuatro paneles en la ventana (de arriba a abajo y de izquierda a derecha): código desensamblado, mapa de memoria, registros y pila (stack). Se abrirá también una ventana con la vista del juego (el juego sólo avanza si esta ventana tiene el foco).

    En el panel del código desensamblado podremos hacer algunas modificaciones en el código de una forma más cómoda (dentro de lo que cabe, teniendo en cuenta que es ensamblador de un procesador 65816). En las opciones de depuración (Options > Debugger setup), os recomiendo cambiar el primer valor, Disassembler Syntax, a Native 65XX Style, por coherencia con bsnes y la documentación que hay online. Esta es la notación que usaré yo también.

    Cuando los cambios tengan que ser de otro tipo, como alterar algún valor de la RAM a pelo, lo haremos desde el panel del mapa de memoria.

    bsnes
    Lo primero que habrá que hacer para trabajar una vez cargada la rom es abrir el depurador: Tools > Debugger… Se abrirá una ventana con el depurador, desde la que podremos abrir otras herramientas. Yo uso el mapa de memoria (Tools > Memory editor...) y el editor de breakpoints (Tools > Breakpoint editor).

    El mapa de memoria es similar al de no$sns y otros cientos de herramientas para infinidad de sistemas. No tiene mayor pérdida.

    El editor de breakpoints es lo que realmente me enamoró de esta herramienta. Nos dá la opción de definir posiciones individuales o intervalos de memoria y establecer condiciones para interrumpir la emulación. por cada bloque de memoria podemos indicar si queremos que pare al hacer una lectura (R), una escritura (W), o cuando ese punto se ejecute (X). Además podemos filtrar las lecturas y escrituras indicando un valor específico (por ejemplo, si sólo queremos que pare en el frame 2 de una animación, y no en todos).

    Otros enlaces de interés
    Personalmente me ha resultado bastante útil esta referencia de instrucciones del procesador 65816, en combinación con la que trae la ayuda de no$sns.

    También podremos usar Lunar IPS para crear y aplicar parches a las roms.



    Creo que con esto es suficiente por hoy. Más en el siguiente capítulo, ya con algo de mandanga ;)
    4
    • plissken, 27/12/2016
      Lógicamente no me he enterado de nada... pero me alegra verte por aqui de nuevo! Te he republicado para que más gente pueda disfrutar de tu Vodoo digital. Un saludo :)
    • kencho, 27/12/2016
      ¡Gracias @plissken! Es complicadete, pero la verdad es que se aprende bastante sobre cómo se hacen/hacían los juegos por dentro. Y sobre todo, aprendes a admirar lo costoso que era. Es fascinante... a su manera XD
  • Jesús Alonso Abad, 09/12/2016 @kencho, Principiante Offline
    Joder, cómo echo esto de menos :(
    3
    5 Comentarios
    • geno, 09/12/2016
      Como dice @plissken todo sigue igual. Menos por esa estúpida niebla que vuelve a la gente del revés.


      P: D: nos debes un juego
    • kencho, 10/12/2016
      @plissken, @yayo, habrá que seguirle. A ver qué me puede recomendar para el brillo del parquet.

      @geno, me lo debo a mí también. Con algunos otros que están empezados y no acabados. Tengo la terrible manía de meterme en mil proyectos y luego no ser capaz de acabar más que el 1% :(
  • Jesús Alonso Abad, 11/07/2016 @kencho, Principiante Offline
    ¡Feliz cumpleaños (un día tarde), Ninja Raiden!
    5
  • Jesús Alonso Abad, 08/06/2016 @kencho, Principiante Offline
    Lo de las filtraciones es tan mainstream que llamar "leak" a un lanzamiento no anunciado es frívolo y postureo.
    3
  • Jesús Alonso Abad, 23/04/2016 @kencho, Principiante Offline
    Gameloft ha cerrado su estudio de Valencia.
    2
    • kencho, 23/04/2016
      No soy precisamente fan de esa casa, pero lo siento por los afectados.
  • 1
  • Jesús Alonso Abad, 25/01/2016 @kencho, Principiante Offline
    Estos de Platinum son unos cachondos.
    http://giphy.com/gifs/l0NwCOOJIoR1gP9Cw
    2
  • Jesús Alonso Abad, 14/12/2015 @kencho, Principiante Offline
    Me ha gustado el blog "Raspberry Pi y tú: una historia de amor retro (Parte 1)" de @firfurcio. Te recomiendo que lo leas aquí.
    1
  • Jesús Alonso Abad, 08/12/2015 @kencho, Principiante Offline
    Es un buen momento para las tollinas en PC. GGXrd, beta de SFV, Humble Bundle...
    2
    5 Comentarios
    • abe, 10/12/2015
      No si el KoF 13 tiene pleno soporte de mandos, el de 360 va sin tocar nada, me refiero a los viejos y los del navegador

      Por cierto me acabo de dar cuenta de que no esta el windjammers. CRIMEN
    • ronin, 11/12/2015
      Lo de que falte el Windjammers clama al cielo. También duele que no estén los Super Sidekicks!
  • Jesús Alonso Abad, 28/10/2015 @kencho, Principiante Offline
    Tienes edad de estar jubilado y te marcas esta ilustración*. Te llamas Noriyoshi Ohrai. RIP :(
    4
    4 Comentarios
    • kencho, 28/10/2015
      @oldtaku, échale un ojo a sus trabajos por Google, porque las de los demás MGS también son canela en rama. Me jode haberme enterado de su existencia a raíz de su muerte; para mí habría sido todo un regalo haber podido apreciarlo en vida.
    • oldtaku, 29/10/2015
      Ya somos dos.
  • Jesús Alonso Abad, 26/10/2015 @kencho, Principiante Offline
    Hacía tiempo que no me movía por niveles de abstracción tan bajos. OpenGL, te amodio.
    0
    • kencho, 26/10/2015
      PD: Qué malo es no tocar esas cosas después de tantos años. Los motores prefabricados me han acomodado demasiado.
  • Jesús Alonso Abad, 14/10/2015 @kencho, Principiante Offline
    Por cierto, mucho personaje histórico y tal, pero llevamos 6+ épocas/lugares en Assassin's Creed, y aún no he visto a Jordi Hurtado.
    7
    4 Comentarios
  • Jesús Alonso Abad, 13/10/2015 @kencho, Principiante Offline
    El Humble Bundle de Capcom tiene su aquel.
    1
    6 Comentarios
    • kencho, 14/10/2015
      @abe
      Jajaja, igual un poco literalmente sí me lo había tomado. A mí es que la Capcom que me gustaba era la de los 90s y primeros de los 2000s, pero ahí su presencia en PC era anecdótica. Los de ahora, que sí salen en PC (la mayoría), me causan bastante indiferencia. Pero ver ahí Strider y USF4 me ha gustado bastante :)
    • darkcooledge, 16/10/2015
      Y ese Dragon's Dogma que por fin vamos a tener en PC ^_^
      Qué pena que no vaya a poder entrar en el bundle.
  • Jesús Alonso Abad, 07/10/2015 @kencho, Principiante Offline
    Si eres brasileño en el mundo de Street Fighter, tienes un serio problema con la electricidad.
    4
  • Jesús Alonso Abad, 04/10/2015 @kencho, Principiante Offline
    Me ha gustado el blog "El Director" de @yayo. Te recomiendo que lo leas aquí.
    1
  • Jesús Alonso Abad, 04/10/2015 @kencho, Principiante Offline
    Derek Yu (Spelunky) habla de su idea de un TMNT de NES: http://goo.gl/bUIMRc
    Ahora que lo has leído lo quieres tanto como yo.
    2
  • Republicado por kencho
    Petete_torete, 04/10/2015 @petete_torete, Principiante Online
    Estamos en el aire nenitas!
    https://www.kickstarter.com/projects/anotherepicadventure/another-epic-adventure
    Difundid la palabra porfavore
    1
  • Cargar mas actividad
Loader
Arriba