War in Middle Earth

Araubi pidió tres cosas en el foro y salieron seis. 1.396 bytes en 130 sitios, cada uno comprobado contra los bytes que espera antes de escribir: nada se desplaza, y el montaje falla si cambia un solo byte fuera de la tabla. El código nuevo vive dentro del motor de altavoz del ZX que esta conversión trajo entero y no llama nadie, las 19 cadenas que terminan de traducir el juego caben sin mover una sola letra de sitio, y el mapa entero viene repintado: 122 de los 128 dibujos de 8×8, hechos en un PNG y convertidos en parche por la propia herramienta.

Melbourne House / Dro Soft · 1989 · Cinta MSX1 · 62.261 bytes · 1.396 bytes cambiados, 0 desplazados · Parche IPS, extraoficial

Aquí no hay ni una captura de pantalla. No pueden haberla: el juego resube la pantalla al VDP sin parar, y dos fotos del mismo estado separadas tres segundos ya salen con el 37 % de los píxeles distintos. Lo que se ve está dibujado desde el búfer de pantalla del ZX Spectrum que el juego lleva en RAM, volcado en un instante fijo y pintado con la tabla de color del propio cartucho. El control: dos pasadas del mismo estado dan una imagen idéntica al píxel, así que lo que cambia entre «sin» y «con» lo cambia el parche.

El parche en cifras

1.396bytes cambiados
130sitios tocados
0bytes desplazados
0bytes fuera de la tabla
137bytes de código nuevo
376bytes de texto nuevo
122/128tiles del mapa repintados
1.718bytes de parche IPS
87comprobaciones en verde

Las seis cosas que hace

1 · Las unidades enemigas se ven

El mapa guarda un bit de «aquí hay alguien» por casilla, y RECENTRA_EL_MAPA (0x7FAC) lo vuelve a sembrar unidad a unidad. Pero su bucle para en la unidad 0x78, que es justo donde empieza el bando enemigo: las enemigas no se siembran, y por eso no se dibujan. Esa era la niebla de guerra del juego, y era un descuido con forma de cp 078h.

Un byte, en 0x7FD1: el tope pasa a 0x00 y el bucle recorre las 256 ranuras. Medido: 136 unidades enemigas se siembran donde antes se sembraban cero.

2 · Cada apartado enseña su número

La ficha lista seis cualidades —Valioso, Hábil, Duro, Bravo, Enérgico y Decidido— como adverbio más adjetivo («es muy bravo»), nunca como cifra, y con eso no se pueden comparar dos unidades.

Una rutina nueva de 76 bytes lee los seis valores de 0xC000-0xC300 y los escribe en la columna 20 de cada línea. La engancha un trampolín de tres bytes en 0x708A, donde la ficha hacía ld hl,0x5FBD justo antes de pintarse. Comprobado contra la RAM: coinciden los seis.

3 · El plazo del Anillo, al lado del anillo

Esta petición estaba mal leída la primera vez. No es el contador 0xC300 del portador: es una cuenta atrás de meses. El reloj del juego baja uno el operando de 0x8333 —que 0x7F4F deja en 255 al empezar—, saca el mensaje «El Anillo corrompe al que lo usa.» y hace jp z,DERROTA.

Ese número es, literalmente, lo que te queda, y el juego no lo enseña en ningún sitio. El anillo de la ficha es el carácter 0x5F en 0x7C46; las tres columnas de su izquierda estaban libres, y ahí va ahora.

4 · Las enemigas llevan el Ojo de Sauron

Con el cambio 1 las enemigas salían… con tu casco, que es media solución: las ves, pero no sabes cuáles son. Y la rutina que dibuja sólo mira el byte del mapa, así que no puede saber de qué bando es una unidad.

El bit 5 de ese byte estaba libre —medido: cero usos en las 13.260 casillas—, y ahí va ahora la marca de bando. El icono son cuatro tiles nuevos al final de la tabla de 0x9E00, en los índices 111 a 114, que estaban a cero.

5 · El texto termina de traducirse

La conversión de Animagic dejó los topónimos del mapa en inglés y tres nombres de raza truncados: «Brujo», «Elf» y «Hum». Cambian 19 cadenas —diez sitios del mapa, un nombre de unidad, las tres razas, los cuatro adjetivos de la ficha y su última línea— y no se mueve un byte.

El registro de un sitio lleva el tamaño de su cartel (ancho<<4 | filas) y el texto lo rellena entero, así que el nombre nuevo tiene que medir lo mismo: Cavada + Grande llena el cartel de 7×2 donde iba Michel /Delving. Los nombres de raza viven en dos listas que se recorren contando bits de fin, así que dentro de una lista una cadena sí puede cambiar de largo: «Brujo » → «Mago» libera dos bytes y sale dos veces en cada lista, los cuatro justos que necesitan «Elf» → «Elfo» y «Hum» → «Hombre».

6 · El mapa, repintado entero

Los 128 dibujos de 8×8 del mapa se sacan a un PNG a tamaño real, se repintan con un editor cualquiera y 122 de los 128 vuelven a la cinta convertidos en entradas del parche, con su orig y su nuevo del mismo largo, igual que las escritas a mano. Los seis que no cambian es porque el dibujo que vuelve es idéntico al que había.

Y ahí salió que el lienzo mentía: cada tile lleva pegado un atributo del Spectrum, pero el juego no lo manda a la pantalla, lo traduce antes ATRIBUTO_A_COLOR (0x049F) con dos tablas de ocho colores del MSX. Así que sólo se pueden pintar doce de los quince colores del MSX, y la herramienta avisa y sustituye si se cuela uno imposible. El texto va ahora sobre el mismo khaki de los marcos: un byte en 0x763F.

Y una trampa que costó una pasada entera

La tabla de cuadros de dos por dos de 0x77B5 tiene seis entradas a cero y parecen sitio de sobra. No lo son: PINTA_LO_DE_ENCIMA elige entrada con un and 00fh sobre el nibble bajo del terreno, así que los índices 0x00-0x0F ya tienen dueño.

Poner el Ojo en el hueco 0x03 se lo puso a las 447 casillas de terreno de tipo 3. La salida fue no usar índice: apuntar HL a una lista propia de cuatro códigos y entrar en el estampador ya pasada su aritmética, en 0x7720.

La misma casilla, sin el parche y con él

Cada pareja es la misma partida, la misma casilla y el mismo instante, cargando la cinta original y cargando la parcheada. Las de «ahora» están volcadas de la cinta parcheada de hoy, con el mapa ya repintado.

SIN PARCHE, casilla 036N/096E — tres huestes de Sauron estan ahi mismo y no se dibuja ninguna. Esa era la niebla de guerra
SIN PARCHE, casilla 036N/096E — tres huestes de Sauron estan ahi mismo y no se dibuja ninguna. Esa era la niebla de guerra
EL PRIMER PARCHE — las enemigas ya salian, pero con el casco de las tuyas. Se ven y no se distinguen. Doce celdas de caracter cambian, y ni un atributo de color
EL PRIMER PARCHE — las enemigas ya salian, pero con el casco de las tuyas. Se ven y no se distinguen. Doce celdas de caracter cambian, y ni un atributo de color
EL OJO DE SAURON — las tres huestes lo llevan y los dos aliados de la esquina siguen con su casco. Todavia con los dibujos de la cinta
EL OJO DE SAURON — las tres huestes lo llevan y los dos aliados de la esquina siguen con su casco. Todavia con los dibujos de la cinta
AHORA — la misma casilla y el mismo instante, con el mapa repintado. Frente a la cinta original cambian 735 de las 768 celdas de caracter y 560 atributos: el mapa es otro
AHORA — la misma casilla y el mismo instante, con el mapa repintado. Frente a la cinta original cambian 735 de las 768 celdas de caracter y 560 atributos: el mapa es otro
SIN PARCHE — la ficha de Gandalf:
SIN PARCHE — la ficha de Gandalf: "Es muy Habil". Muy... cuanto
CON PARCHE — la misma ficha con su numero en cada linea: Energico 158, Decidido 192, Firme 010, Virtuoso 008, Valiente 010, Fuerte 006. Y la ultima linea, entera:
CON PARCHE — la misma ficha con su numero en cada linea: Energico 158, Decidido 192, Firme 010, Virtuoso 008, Valiente 010, Fuerte 006. Y la ultima linea, entera: "Aliado a la Comunidad"
SIN PARCHE — la ficha de Frodo, el portador. El anillo dice quien lo lleva, y nada mas
SIN PARCHE — la ficha de Frodo, el portador. El anillo dice quien lo lleva, y nada mas
CON PARCHE — 255, pegado al anillo: los meses que quedan antes de sucumbir. Cada mes baja uno; a cero, la pantalla de Sauron
CON PARCHE — 255, pegado al anillo: los meses que quedan antes de sucumbir. Cada mes baja uno; a cero, la pantalla de Sauron
EL ICONO ALIADO, ampliado y leido de la cinta ya parcheada: los tiles 81 a 84 de la tabla de 0x9E00, repintados como un escudo
EL ICONO ALIADO, ampliado y leido de la cinta ya parcheada: los tiles 81 a 84 de la tabla de 0x9E00, repintados como un escudo
EL OJO, tambien de la cinta parcheada: los tiles 111 a 114, que estaban a cero. Ahora en rojo oscuro, que es un color que el atributo del Spectrum si puede pedir
EL OJO, tambien de la cinta parcheada: los tiles 111 a 114, que estaban a cero. Ahora en rojo oscuro, que es un color que el atributo del Spectrum si puede pedir
SIN PARCHE — el cartel dice
SIN PARCHE — el cartel dice "Dale" y la ficha "Formacion de 005 Hum", "Hum:caracter:" y "No Valioso". La conversion se quedo a medias
CON PARCHE, la misma casilla y la misma unidad —
CON PARCHE, la misma casilla y la misma unidad — "Valle", "Formacion de 005 Hombres", "Hombre:caracter:" y "No Virtuoso". Y el texto sobre el khaki de los marcos, que es un solo byte
SIN PARCHE — el cartel de dos filas:
SIN PARCHE — el cartel de dos filas: "Michel" arriba, "Delving" abajo, siete columnas por dos filas
CON PARCHE —
CON PARCHE — "Cavada" y "Grande" en el mismo cartel de 7x2, que es lo que obliga a rellenar con espacios. Y la Comarca repintada debajo
LOS 128 TILES DEL MAPA tal y como vienen en la cinta, dibujados byte a byte y con los colores del MSX -que no son los del Spectrum, aunque el atributo si lo sea-
LOS 128 TILES DEL MAPA tal y como vienen en la cinta, dibujados byte a byte y con los colores del MSX -que no son los del Spectrum, aunque el atributo si lo sea-
LOS MISMOS, REPINTADOS: 122 de los 128 entran en el parche. El magenta es hueco vacio
LOS MISMOS, REPINTADOS: 122 de los 128 entran en el parche. El magenta es hueco vacio
EL MAPA ENTERO, dibujado desde la cinta: las 128 x 100 casillas con los tiles originales. No es un pantallazo ni un mosaico de pantallazos, es el motor de dibujo del juego repetido casilla a casilla
EL MAPA ENTERO, dibujado desde la cinta: las 128 x 100 casillas con los tiles originales. No es un pantallazo ni un mosaico de pantallazos, es el motor de dibujo del juego repetido casilla a casilla · verlo a tamaño real (2048 × 1600)
EL MISMO, CON EL PARCHE. El mapa comprimido sale de la cinta (0x16ED bytes de parejas cuenta/valor en 0xCC00) y los dibujos, del lienzo repintado. Aqui no hay ninguna unidad: es la Tierra Media recien empezada la partida
EL MISMO, CON EL PARCHE. El mapa comprimido sale de la cinta (0x16ED bytes de parejas cuenta/valor en 0xCC00) y los dibujos, del lienzo repintado. Aqui no hay ninguna unidad: es la Tierra Media recien empezada la partida · verlo a tamaño real (2048 × 1600)