Mahjong Dojo

El cartucho está en japonés y la pantalla que dice por qué has ganado también. Esto lo pasa al inglés sin tocar una sola instrucción del juego —y de paso le pone el tutorial que nunca tuvo: veinte pantallas en el modo attract, con las treinta y cuatro fichas dibujadas, enganchadas con un solo jp.

Konami · © Konami 1984 · Cartucho RC-707, 32 KB · Parche IPS, extraoficial · Solo inglés

TRABAJO EN CURSO: este parche no está terminado. Se juega de principio a fin y todas sus pantallas se han visto corriendo, pero se publica así a propósito: el logo del título todavía está flojo, el tutorial no puede escribir ni una cifra y el rótulo de dificultad va apretado en tres letras. La lista entera de lo que falta está en Lo que falta; léela antes de juzgar una captura.

El parche en cifras

12.103bytes cambiados
46bloques tocados
0bytes cambiados fuera de ellos
12.511bytes de parche IPS
20pantallas de tutorial
34fichas dibujadas en él

Lo que costó hacerlo

La banda cian que no se veía en el parche, sino en la pantalla

La ROM salía byte a byte como se pedía y la pantalla de recuento estaba mal: una banda cian repitiendo «LT» cruzaba la pantalla de lado a lado. Ninguna comprobación del proyecto la cazó, porque ninguna miraba la pantalla.

La celda 0x0DF parecía libre por la regla que usábamos —es la fila del medio de una ficha, y ésas no se dibujan en el tercio central—. Y lo es, salvo que el recuento la usa veinticuatro veces en la fila 8 como el borde de arriba de una rejilla de cajas. Allí no se ve:

original : patron FF 00 00 00 00 00 00 00   color 10
           una raya, tinta negra sobre fondo transparente
parche   : patron 00 8E 84 84 84 84 84 E4   color 17
           el digrafo LT, negro sobre CIAN

El arreglo fue mudar ese dígrafo a la celda 0x0FA, que ningún volcado dibuja en ese tercio. Y el arreglo de verdad fue make pantallas, que compara las pantallas del cartucho original con las del parcheado celda a celda: si una celda dibuja el mismo número de celda en las dos, antes no se veía y ahora sí, hay una letra dentro del mobiliario.

El texto vive en el hueco que dejan las fichas

Cada ficha se dibuja con seis caracteres, dos de ancho por tres de alto, y las hileras caen a caballo de dos tercios de pantalla. En el tercio de en medio la fila del medio de cada ficha no se dibuja nunca, y ahí es justo donde el cartucho escribe sus rótulos: de los 97 caracteres que usa la barra, 56 son el par central de alguna ficha.

Eso deja 49 celdas para el inglés. Y el inglés necesita más sitio que la katakana.

Dos letras por celda, y por eso los textos se generan

Con letras de 8x8 la caja de mensajes se queda en siete caracteres por línea y no cabe lo que dice el japonés. Con una fuente de 3x7 y dos letras por celda pasa a catorce, y el menú de seis a doce: entonces sí entra «CALL TSUMO / PON CHI KAN».

El precio es que una celda cuesta por cada PAR DISTINTO de letras, no por letra. Cambiar una palabra rehace el reparto entero, así que los textos se escriben en el generador y se regeneran; editarlos a mano en el parche es la forma segura de romperlo. La cuenta actual: 49 pares distintos para 49 celdas, con cero de margen.

El tutorial cuesta un solo salto

El estado 14 del cartucho —el rótulo del final— acaba con un jp a la rutina que devuelve al estado 0. Ese salto, y sólo ése, es el enganche: el tutorial se mete en medio y todo lo demás sale gratis.

El reloj es el del cartucho: el estado 14 va restando de 0xE004 uno de cada cuatro cuadros y salta cuando llega a cero, así que basta con recargarlo y volver para que nos llame otra vez, 6,4 segundos después. El contador de diapositiva es el submodo, que entra a cero solo. Y se abandona al pulsar una tecla sin una línea escrita para ello, porque la puerta del teclado ya está abierta en ese estado: medido, la tecla 1 en la diapositiva 2 lleva al título en 0,08 segundos.

Las fichas que faltaban: los números de celda no son sagrados

En la pantalla del tutorial faltaban dieciséis de las treinta y cuatro fichas: los siete honores, porque sus celdas de siempre son justo las que ocupa el alfabeto del parche, y los círculos 3 a 9, que ahí no traen dibujo ninguno. Un tutorial de un juego de fichas que no enseña las fichas no vale.

La salida fue que el número de celda de una ficha no es sagrado: se carga el dibujo en cualquier hueco y se pide por el número nuevo. Contando las que esa pantalla no dibuja jamás quedaban libres dos tramos, y ahí van. Tres cabos que costaron una prueba cada uno: los dibujos se sacan de la ROM original y no del bloque ya parcheado; se cargan en un solo tercio y los reparte la rutina del propio cartucho, 864 bytes en vez de 2.592; y eso tarda 1,66 segundos medidos, así que el borrado de pantalla va antes de la carga o se ve el rótulo anterior con las fichas ya pisadas.

Las fichas que ya estaban, estaban del revés; y el hueco cortaba las hileras

Las veinte fichas con las que venía la pantalla eran las del rival, giradas 180 grados: el kanji arriba, la sombra en la esquina de arriba a la izquierda y tres filas negras por debajo. Al lado de los honores, cargados derechos, parecían recortadas. Medido: las seis celdas de SOU1 y de PIN1 son, byte a byte, la rotación de las del bloque del jugador. El tutorial carga ahora ese bloque tal cual y copia 126 celdas por la VRAM: 54 bytes de código y ninguno de datos.

Y al enderezarlas apareció un fallo de agosto: el hueco vacío son las celdas 0xFA-0xFF y su fila de abajo, FE FF, son los códigos de control del intérprete de listas. Toda ficha detrás de un hueco perdía su fila de abajo. El generador pinta el hueco en negro y rechaza esos dos bytes como dato, con un test que muerde.

El cartel de la mano nula borraba lo que borraba el japonés

Cuando la mano acaba sin ganador sale un cartel, y antes de dibujarlo el cartucho borra las celdas que va a tapar. Esas celdas estaban elegidas para el japonés: en inglés los rótulos ocupan otras, así que quedaban a la vista una «D» pegada a EAST 1, una «A» suelta encima de la caja y un DORA colgando debajo.

Con el borrado bueno el bloque pasa a 40 bytes y su hueco son 39, así que se reubica en la zona libre y se reapunta el ld hl que lo carga.

Y una letra A que no estaba, que sólo se vio al dibujarla

La primera prueba del tutorial salió con cuadrados verdes donde iban las aes. La celda 0x030 en esa pantalla no es la A: es el verde del interior de la caja del final, y el bloque de la pantalla lo restaura desde la ROM.

No se arregla en ese bloque, porque ese verde sí se ve, durante los 64 cuadros que tarda el muro de fichas en taparlo. El tutorial carga su propia A. Leer el código no lo habría cazado.

Todas las imágenes de aquí son capturas de la ROM parcheada. Y ninguna se ha hecho a mano: un guion arranca la ROM en openMSX sin pintar nada, vuelca la memoria de vídeo y el PNG se monta desde el volcado. Son tres pasadas: el demo, que se juega solo y no pulsa una tecla; las pantallas que el demo no enseña, forzadas llamando a las rutinas que las pintan; y el tutorial entero, retratado diapositiva a diapositiva mientras sale por sí mismo. Se rehacen con make capturas.

Lo que cambia, pantalla a pantalla

A la izquierda de cada pie está en qué situación se hizo la captura. Las que el demo no enseña se fuerzan llamando a la rutina que las pinta.

El título. Sólo AMACHUA era japonés —la transcripción de «amateur»—, así que lo que cambia de verdad es el logotipo: los cuatro kanji 麻雀道場 dejan sitio a MAHJONG DOJO en el mismo lienzo de 144x24 píxeles. Y el menú gana una cuarta línea, 4-key TUTORIAL, que arranca el tutorial sin esperar al demo
El título. Sólo AMACHUA era japonés —la transcripción de «amateur»—, así que lo que cambia de verdad es el logotipo: los cuatro kanji 麻雀道場 dejan sitio a MAHJONG DOJO en el mismo lienzo de 144x24 píxeles. Y el menú gana una cuarta línea, 4-key TUTORIAL, que arranca el tutorial sin esperar al demo
La barra de la mesa, con el reparto empezando: EAST 1, los dos indicadores de DORA y URA, el contador de HONBA, STICK para los palos de riichi y SEM (semiprofesional) en rojo a la derecha
La barra de la mesa, con el reparto empezando: EAST 1, los dos indicadores de DORA y URA, el contador de HONBA, STICK para los palos de riichi y SEM (semiprofesional) en rojo a la derecha
La pantalla de recuento, que es la que hay que leer para saber por qué has ganado: DEALER, FU 30, HAN 7, PAYS 6000, SCORE 18000, la lista de jugadas con sus han a la derecha y la mano separada en figuras abajo, cada una con sus fu
La pantalla de recuento, que es la que hay que leer para saber por qué has ganado: DEALER, FU 30, HAN 7, PAYS 6000, SCORE 18000, la lista de jugadas con sus han a la derecha y la mano separada en figuras abajo, cada una con sus fu
La caja de mensajes y el menú de llamadas, los dos con dos letras por celda: CALL KAN OR DISCARD ONE, y WIN / RIICHI / PON / CHI / KAN en el panel cian. Con letras de 8x8 la caja sólo daba para siete caracteres por línea
La caja de mensajes y el menú de llamadas, los dos con dos letras por celda: CALL KAN OR DISCARD ONE, y WIN / RIICHI / PON / CHI / KAN en el panel cian. Con letras de 8x8 la caja sólo daba para siete caracteres por línea
CALL TSUMO PON CHI KAN, forzado: es lo que el japonés dice en cuatro sílabas y en 8x8 no cabía de ninguna manera
CALL TSUMO PON CHI KAN, forzado: es lo que el japonés dice en cuatro sílabas y en 8x8 no cabía de ninguna manera
NOT ALLOWED, forzado. Sale al cantar con la mano incompleta, al pedir un riichi que no vale y al hacer una llamada que no cuadra: los tres piden el mismo dibujo
NOT ALLOWED, forzado. Sale al cantar con la mano incompleta, al pedir un riichi que no vale y al hacer una llamada que no cuadra: los tres piden el mismo dibujo
FURITEN HAND, forzado. Uno de los tres avisos que acompañan al castigo, elegidos por los tres bits bajos de 0xE1AC
FURITEN HAND, forzado. Uno de los tres avisos que acompañan al castigo, elegidos por los tres bits bajos de 0xE1AC
NO YAKU HAND con PENALTY HAND debajo, forzados en ese orden porque es como salen en el juego: cantar sin jugada cuesta 12.000 si reparte el jugador y 8.000 si no
NO YAKU HAND con PENALTY HAND debajo, forzados en ese orden porque es como salen en el juego: cantar sin jugada cuesta 12.000 si reparte el jugador y 8.000 si no
DRAW / GAME, el cartel de la mano sin ganador, forzado. Es el que borraba las celdas equivocadas y dejaba letras sueltas alrededor; aquí ya con el borrado rehecho
DRAW / GAME, el cartel de la mano sin ganador, forzado. Es el que borraba las celdas equivocadas y dejaba letras sueltas alrededor; aquí ya con el borrado rehecho
END, el rótulo del final de la partida. Los dieciocho caracteres del 終局 dan exactamente para tres letras de 16x24, con una celda en blanco entre cada par
END, el rótulo del final de la partida. Los dieciocho caracteres del 終局 dan exactamente para tres letras de 16x24, con una celda en blanco entre cada par

El tutorial, las veinte pantallas

Salen solas al acabar el ciclo del demo —o al momento, con la tecla 4 en el título—, 6,4 segundos cada una, y se abandonan en cuanto se pulsa otra tecla. Aquí están en su orden.

HOW TO PLAY: dos jugadores, tú y el ordenador
HOW TO PLAY: dos jugadores, tú y el ordenador
THE TILES: los tres palos enteros, veintisiete fichas
THE TILES: los tres palos enteros, veintisiete fichas
WINDS AND DRAGONS: los siete honores, cada uno con su nombre al lado
WINDS AND DRAGONS: los siete honores, cada uno con su nombre al lado
YOUR HAND: trece fichas, robas una y tiras otra
YOUR HAND: trece fichas, robas una y tiras otra
THE TABLE: su mano boca abajo, lo tirado y la tuya
THE TABLE: su mano boca abajo, lo tirado y la tuya
THE GOAL: cuatro figuras y una pareja
THE GOAL: cuatro figuras y una pareja
A RUN, con el contraejemplo de los vientos
A RUN, con el contraejemplo de los vientos
A TRIPLET: hasta un viento o un dragón valen
A TRIPLET: hasta un viento o un dragón valen
THE PAIR, con el dragón blanco, que es una ficha en blanco
THE PAIR, con el dragón blanco, que es una ficha en blanco
TURN BY TURN
TURN BY TURN
CALLING: pon, chi y kan dibujados
CALLING: pon, chi y kan dibujados
RIICHI: la mano de trece y la ficha que espera
RIICHI: la mano de trece y la ficha que espera
TO WIN: tsumo y ron
TO WIN: tsumo y ron
THE MENU: qué hace cada una de las cinco entradas y cuándo se pide
THE MENU: qué hace cada una de las cinco entradas y cuándo se pide
BE CAREFUL: el río que te deja en furiten
BE CAREFUL: el río que te deja en furiten
THE HAND ENDS: alguien canta, o se acaban los descartes
THE HAND ENDS: alguien canta, o se acaban los descartes
THE COUNT
THE COUNT
THE SCORE: el indicador de dora y el siguiente
THE SCORE: el indicador de dora y el siguiente
WHAT YOU JUST SAW: lo que acaba de jugar el demo
WHAT YOU JUST SAW: lo que acaba de jugar el demo
Y las teclas, que es por donde se empieza
Y las teclas, que es por donde se empieza