Etiqueta: Ifcaro web

Parche para la versión de PlayStation 1 de Rayman para agregar caracteres

Todo comenzó cuando buscando parches de traducciones para juegos de PS1 descubrí que existía una traducción al español del Rayman 1. Me la descargué y cuando fui a probarla vi que faltaban los caracteres acentuados y la ñ. A mí personalmente no me molesta que las palabras no estén acentuadas pero que no esté la ñ sí que me chirria. Observé también en la web de la traducción que solicitaban ayuda para eliminar el selector de idioma y como hacía mucho tiempo que no trabajaba en ningún proyecto me propuse echarle un vistazo.

Traducción original

Me descargo el plugin https://github.com/lab313ru/ghidra_psx_ldr para el ghidra y con la ayuda de emuladores descubro fácil que función es la que muestra el selector de idioma. Al resultarme tan sencillo me quedé con ganas de más y me puse a investigar como poder meter, aunque sea la letra ñ. También me puse en contacto con SuiKaze Raider para comentarle que había realizado el parche de selección de idioma y para pedir algo de información sobre el formato de los ficheros de recursos del juego.

SuiKaze Raider me comenta que existen 3 tamaños de letra, la pequeña que es la más utilizada, la mediana y la grande que es la que menos se utiliza. Y me comenta su idea de eliminar la fuente grande y utilizar ese hueco para crear los caracteres extra. De primeras intento buscar una solución más sencilla y reemplazar solo algunos caracteres de los que ya existen, pero no hay suficientes para la ñ y las vocales acentuadas.

Fuentes mediana y grande

Fuente pequeña

Después de un análisis más profundo conseguí extraer las texturas y con una información clave que me pasó SuiKaze Raider, extraje la información de los sprites correspondientes a los distintos caracteres. Lo que si pude comprobar es que en la textura de la fuente pequeña había mucho espacio entre las letras y que se podían juntar sin que esto afecte al resultado dejando espacio para meter los nuevos caracteres. Aun con esto, todavía falta parchear el programa para poder relacionar de alguna forma los textos con los sprites nuevos.

Visor de texturas

Debido a que la asociación de caracteres con sus correspondientes sprites está metida a pelo en el código, realizar un parche no es tan sencillo como el de eliminar el selector de idioma. Empiezo a meter recortes en el código para mostrar nuevos sprites y lo consigo, aunque de una forma un poco inestable.

Una vez conseguido, me dispongo a desarrollar una aplicación para poder gestionar las texturas, los sprites y sus propiedades de forma más directa y así no perder tiempo editando manualmente los ficheros binarios. El resultado de este trabajo lo puedes encontrar en https://github.com/ifcaro/RAY.

Editor de sprites

Con la ayuda de esta aplicación pude continuar en el parcheo del ejecutable para el tema de la asociación de caracteres con sprites. Después de pensar formas de realizar este parche llego a la conclusión de que va a ser necesario eliminar la fuente grande. Y empiezo a trabajar en la siguiente solución.

Como las fuentes están en la tabla de sprites en el siguiente orden: pequeña, grande, mediana. Decido eliminar la grande y mover un poco hacia arriba la mediana dejando un poco de espacio después de la pequeña y de la mediana para añadir ahí los caracteres nuevos. También modifico en el código una de las condiciones para agregar una asociación secuencial de bytes con sprites en los huecos que he dejado.

Editor de textos

Aunque creo que con este parche se pierde uno de los sprites originales, a cambio nos permite añadir hasta un máximo teórico de 23 sprites nuevos. Con esto se confirma la posibilidad de hacer una traducción con acentos y sobre todo con ñ aunque a cambio perdemos la fuente grande.

DESCRIPCION DEL PARCHE

En resumen, los parches aplicados al final son los siguientes:

EXE

0x0000ec04
0x0000ec08
0x0000ec54
0x0000ec58
0x80131404
0x80131408
0x80131454
0x80131458
1c 80 04 3c
94 66 84 34
1c 80 04 3c
94 66 84 34
Parche para mover el literal OK
0x0001f4480x80141c4830 15 21 24Ancho letra pequeña
0x0001f4680x80141c68d4 15 21 24Ancho letra mediana
0x000206500x80142e5001 00 07 34Forzar la fuente media si se quiere pintar la grande
0x00021e9c
0x00021ea0
0x00021eb8
0x8014469c
0x801446a0
0x801446b8
1c 80 04 3c
54 66 84 34
00 00 00 00
Mover el literal de GO!
0x0002c2980x8014ea98b1 ff 85 24Agregar caracteres
0x0002c3540x8014eb5419 00 42 24Mover fuente media
0x0003b93c
0x0003b940
0x8015e13c
0x8015e140
1c 80 04 3c
74 66 84 34
Mover literal PERFECT
0x0005a8880x8017D08800 00 00 00Eliminar el selector de idioma
0x0009ed300x801c1530….Nueva ubicación para los anchos de las fuentes
0xa3e540x801c6654 Nueva ubicación para el literal GO
0xa3e740x801c6674 Nueva ubicación para el literal PERFECT
0xa3e940x801c6694 Nueva ubicación para el literal OK
Parches aplicados en el ejecutable del juego

RAY.XXX

En la tabla de sprites, se eliminan los que corresponden a la fuente grande y se mueven los de la fuente mediana hacia arriba dejando hueco después de cada fuente para los caracteres que se necesitan añadir.

Actualmente, el equipo de Tomb Raider Translations Spain esta trabajando en la creación de una fuente multiidioma para, haciendo uso de este parche, realizar una traducción en varios idiomas de Rayman 1.

Ifcaro’s Tetris versión Web

Como hace mucho tiempo que no actualizo la página y parece que no estoy haciendo nada (la verdad es que no estoy haciendo gran cosa en tema de proyectos personales) he pensado voy a coger el código fuente del tetris que hice en 2008 y lo voy a compilar con emscripten para hacer una versión web.

Primer problema, parece que no tengo guardado el código fuente original en ningún sitio así que me pongo a buscar como loco restos del desarrollo. Pensaba que estaba construido como el código del iRPGM que se podía compilar tanto para pc como para ps3 y que estaría guardado en la misma carpeta pero ni rastro.

Cuando ya iba a abandonar el proyecto encuentro en una carpeta con desarrollos de ps3 un código fuente del tetris de ps2 que había sido ligeramente modificado en un intento de hacerlo compilar para la ps3. Solamente tenía el código de la lógica del juego. Si quería hacer un port tendría que reescribir toda la parte de graficos, sonido e input.

Después de pensar un poco si me merecía la pena todo ese trabajo decido ponerme a ello. Me descargo la última versión de SDL y me dispongo a crear un proyecto de Visual Studio con un código base para una aplicación SDL para Windows. Cuando ya funciona el código de ejemplo comienzo a portar el código que recuperé del tetris original y a reescribir las partes que faltan utilizando SDL.

Una vez tengo una versión básica del dibujado y el input necesito recopilar los recursos (imágenes y sonidos) y al igual que perdí el código fuente original tampoco tengo los assets. Decido ‘hackear’ la versión de PC para extraer la imagen de fondo y descubro que esta no fue hecha en C sino en BlitzBasic (en aquella época yo aún no sabía C jaja). Después de intentar varios métodos al final consigo extraer el png original de la imagen de fondo. Los sonidos los extraigo de la versión de PS2 y la fuente la rehago utilizando un generador de fuentes para BMFont. Con esto ya tengo todo lo que necesito para completar la versión de tetris en SDL.

Mientras pruebo el funcionamiento observo que la jugabilidad no es que sea muy buena de modo que decido intentar mejorarla un poco antes de pasar a construir la versión web con emscripten.

Finalmente comienzo con el proyecto inicial que era compilar una versión wasm del tetris mediante el compilador emscripten. Es cierto que la primera vez que compile el proyecto no tenía aun soporte para sonido, eso lo deje para lo último. Indicando al compilador em++ que tiene que utilizar SDL me compila una versión que funciona regular. Esto se debe a que el juego tiene algunos bucles a la hora de esperar respuesta del usuario y eso es incompatible con la forma de funcionar de emscripten así que hago algunos arreglillos para eliminar estos bucles y reemplazarlos por una funcionalidad similar.

A la hora de meter los efectos de sonido me decido por la librería SDL_mixer que se supone que te facilita la vida para estas tareas. En la versión PC todo fue bien, pero a la hora de compilar con emscripten no hay manera de que compile en Windows así que me toca abrirme una máquina virtual con Linux para compilar el SDL_mixer. Además, para no subir un mp3 a la web decido utilizar un formato tipo ‘tracker’ que en PC no me supone ningún problema, pero no para la versión web como descubrí después.

Perdí bastante tiempo intentando compilar una versión de SDL_mixer con soporte para trackers y cuando al final lo consigo resulta que los sonidos se oyen bien pero la música en formato tracker se oye fatal (por eso supongo que venía deshabilitado por defecto) así que decido buscar por internet alguna librería en javascript para reproducir este formato de música. Utilizando una clase wrapper en javascript para comunicar el programa en C con la librería externa consigo al fin reproducir música con éxito.

Con esto doy por finalizada la versión web del tetris aunque aún se podrían mejorar muchas cosas.

Qubix para PlayStation

ImagenSiempre he querido programar un juego de PSX. Hace años hice un sencillo tetris para la PS2 y tiempo después comencé a portar un motor para juegos rpg que estaba haciendo a la PS3 aunque se quedó sin terminar.

Pero para la PlayStation 1 no había hecho nada, así que me propuse portar algún juego sencillo. Los candidatos eran Qubix y otro juego que tengo terminado pero no he publicado por vaguería.

El elegido fue Qubix porque es bastante sencillo y a la vez hace uso del 3d, el otro juego es un puzzle en 2d con muchos niveles mientras que en este juego solo hay que conseguir mejores puntuaciones.

Una vez decidido, comencé a preparar el entorno de desarrollo. Descargué el SDK de PSXDEV.net. Instalé una máquina virtual con Windows 2000 aunque no era necesario pero no quería tener problemas de compatibilidad ni tener que modificar el SO principal. Aun así, trabajaba con el Eclipse en el SO principal, accediendo al código fuente mediante carpetas compartidas. La máquina virtual solo se utilizaba para compilar y para utilizar Photoshop 3 para crear las imágenes TIM.

Como no tengo ninguna forma de ejecutar software en la PSX sin grabarlo en un CD (mi PSX no tiene puerto paralelo), he utilizado un emulador durante el desarrollo para acabar testeándolo en mi PSX, PSP y PS3. Junto con el emulador hay un pequeño programa que se queda escuchando por un puerto la orden de lanzarlo. De este modo, puedo compilar y lanzar el programa de forma automatizada de la forma más parecida posible a utilizar PS2LINK en la PS2 por el cable de red.

Imagen

El juego consiste en girar un cubo que tiene cada cara de un color y una lista de colores que van apareciendo por cada movimiento incorrecto. Si el color que está mirando a cámara es el mismo que el primero de la lista este se elimina. El objetivo es realizar el mayor número de movimientos sin que se llene la cola.

He creado 3 paquetes diferentes.

QUBIX.ISO – Imagen ISO para grabar en CD o ejecutar en un emulador de PSX.
Qubix.zip – Formato EBOOT.PBP para ejecutar en una PSP
Qubix.pkg – Formato PKG para ejecutar en una PS3

Lista de proyectos de Exponent Games

A continuación os describo los proyectos en los que he participado bajo el nombre de Exponent Games.

Reversadosdiciembre 2012 – Actualidad
Imagen
Reversados es un reversi multijugador para Android que permite a jugadores de todo el mundo jugar entre ellos de forma directa a traves de un nick o de forma aleatoria.

Ademas, está orientado a partidas relajadas ya que establece un tiempo de espera máximo de una semana por movimiento.

DESCARGA: Google Play Store

Qubix abril 2014 – Actualidad
Imagen

Juego de memoria para Android que consiste en memorizar los colores de las caras de un cubo para eliminar una serie de colores que van apareciendo.

DESCARGA: Google Play Store

Además de estos proyectos estoy trabajando en unos cuantos mas pero no están terminados todavía. Según los vaya publicando ire actualizando la lista.

Experimento con la muerte

Imagen

Experimento con la muerte es una aventura conversacional creada por mi amigo Diego y programada por mi en C.

Al principio funcionaba mediante scripts y permitia crear nuevas aventuras utilizando el mismo exe. Pero finalmente introduje la historia dentro del codigo de modo que ahora es un unico juego.

ImagenImagenImagen

El juego es bastante dificil debido a que las opciones son muy limitadas y es dificil saber que tienes que escribir si no has hecho tu el juego 

Descarga:

El Planeta Desconocido

Imagen
El Planeta Desconocido es un proyecto de videojuego que quedó en una especie de demo. Inspirado en The Journeyman Project y programado en QBasic en un 286 alla por el 2001 es uno de mis primeros programas, y como tal, tiene numerosos fallos de diseño y de programacion.

ImagenImagenImagen
Imagenes del juego corregido

Durante todo este tiempo siempre he querido hacer un port o algo util de este programa. Habiendo hecho hasta un port en c que no llegué a publicar porque le falta el sonido.

ImagenImagenImagen
Imagenes de la version escrita en c

Finalmente cogí el código original escrito en QBasic, arregle los problemas mas importantes, lo recompilé y lo podeis descargar al final del post junto con un dosbox para poder emularlo en sistemas operativos actuales.

 

Video del juego en dosbox (creo que de antes de corregir los fallos) [/center]

Tambien he visto que existe un compilador de QBasic para win32/64 pero debido a que uso diferentes modos de video segun la escena la ventana cambia continuamente de tamaño.

Descarga:

Al fin algo nuevo

Después de haber dejado esto abandonado unos meses, ayer decidí avanzar un poquito con esto y me puse a ver como andaba el tema, porque ya no me acordaba.

Vi que la ultima vez había liado una buena intentando dibujar usando OpenGL, había tocado tantas cosas y funcionaba peor que la versión original que tiraba de .NET para dibujar. Así que, decidí borrar toda la parte del OpenGL y reescribirlo todo pero usando esta vez SDL.

Una vez preparado todo, fue bastante fácil adaptar el código, aunque me dio algunos problemillas con las transparencias. Pero en general, va mucho mas rápido que las otras dos opciones que elegí anteriormente.

Después de haberme quitado este problema de encima, que ya me tenia cansado de estar ahí atascando, me he puesto hace un rato con los eventos. La verdad es que tenia bastante trabajo hecho desde la ultima vez, así que solo he tenido que reparar un par de fallos y (aparentemente) funciona bien la parte de los eventos en el editor (solo esta creado el evento Mostrar texto…). Así que me puse escribir el código para guardar esta información en los archivos de mapa.

Después de comprobar que guardaba y cargaba bien los datos, cierro el proyecto del editor y abro el del juego y empiezo a hacer el código para cargar y administrar la información de los eventos, esta vez en C.

Después de un ratito pegándome con los punteros para cargar las listas de eventos (con lo fácil que son las listas en .NET), hago que compare la posición del evento con la posición del personaje y muestro un pequeño texto de depuración.

Aquí dejo el vídeo resultante:

En desarrollo un nuevo editor usando OpenGL

El ya obsoleto editor de mapas era bastante lento dibujando y ya si intentábamos usar un mapa grande ya era desesperante. Por eso me propuse hacer un nuevo editor tirando de DirectX o OpenGL.

Después de informarme, comencé a desarrollarlo experimentalmente y los resultados han sido bastante buenos. Este nuevo editor es muchísimo mas rápido dibujando si lo comparamos con el anterior pero por el momento tiene un punto débil. Cuando intentamos desplazarlo usando la barra de desplazamiento va un poco a tirones.

Aun no se me ha ocurrido ningún modo de optimizar esa parte, pero merece la pena por todo lo demás (rapidez dibujando, transparencias…). A ver si hay suerte y se me ocurre un modo de que vaya eso también rápido, porque me da cosa que vaya tan mal con lo bien que va lo demás.

De momento estoy portando las funcionalidades que ya existían del otro editor y después me pondré con los eventos, de los que ya avance un poquito hace unos días.