Tilemap

De ROMHackingWiki

Imagem:Editar.gif Este artigo é somente um esboço e seu conteúdo ainda pode ser melhorado. Você pode ajudar a ROMHackingWiki melhorando-o.
Imagem:makako_mor.gif Este é um artigo intermediário sobre o ROMHacking, leia-o com bastante atenção!

Alteração de imagens, muitas vezes, não se limita a apenas alterar os tiles no editor gráfico de sua preferência. Muitas vezes, o mesmo gráfico é usado várias vezes em uma mesma imagem, como forma de economia de bytes, e a simples alteração dele pode causar uma repetição dele em vários trechos do jogo. Para contornar esse problema, apenas a alteração consciente dos tilemaps.

Tabela de conteúdo

O que são?

Tilemaps são exatamente o que o nome sugere - mapas de tiles. Seria como uma referência, de como os tiles devem ser 'montados' na tela. Vamos usar o exemplo de um NES, para deixar a explicação mais clara. A tela do NES é uma matriz, de 256x224 (NTSC). O que isso quer dizer? Que cabem 256 pixels de altura por 224 pixels de largura. Como cada tile possui 8 pixels de altura por 8 pixels de largura, podemos dividir as medidas da tela pelas medidas de um tile para saber quantos tiles cabem na tela. A resposta que temos é - 32x28. Ou seja, Tilemaps são basicamente informações de como esses espaços devem ser preenchidos. Caso você, Romhacker, consiga desvendar o que o jogo pretende colocar nesses espaços, você conseguirá também, alterar isso.

Aplicações no ROMHacking

O uso de tilemaps é constante em edição de gráficos que se repetem ao longo da ROM, ou de gráficos que, após uma edição, ficam maiores que os originais, requerindo um deslocamento de outro tile para a seleção atual. Em alguns casos, onde os tilemaps são usados para acabar com o problema de repetição de letras (como será explicado mais adiante), ele pode ser facilmente manuseado perante a criação de uma tabela de caracteres.

Identificando a ocorrência de Tilemaps

Figura 01
Figura 02
Figura 03
FIgura 04

Para identificar, e consequentemente, alterar os tilemaps, é preciso basicamente, duas coisas:

  • Que os gráficos estejam visíveis na ROM;
  • Que o ROMhacker saiba utilizar a busca hexadecimal de seu editor hexadecimal.

Dependendo do caso, um outro pré-requisito que pode ajudá-lo é saber fazer a criação de uma tabela sem o uso de softwares, pois a tabela pode estar fora de ordem.

Para facilitar no aprendizado, usaremos o exemplo do jogo "Kabuki - Quantum Fighter", de NES, ensinando passo-a-passo como alterar o crachá do personagem Scott, coisa que, sem Tilemap, seria impossível. Primeiramente, vamos ver o crachá in-game. Veja a Figura 01.

Após alguma busca no nosso editor gráfico de preferência, encontramos o crachá localizado no offset #0003D210. Usaremos o Tile Layer Pro só como referência de editor. Veja a Figura 02.

Bom, vamos alterar o crachá como faríamos com qualquer outro gráfico, certo? Para traduzir NAME para NOME, só precisaremos alterar o tile contendo A para O, então, mãos à obra! Veja a Figura 03.

Vamos conferir o que ocorre in-game quando fazemos isso. Veja a Figura 04.

Sex: Mole ?! Oge ?! Como isso veio parar aqui ?! A resposta é simples. Aquele A que vimos no Tile Layer Pro não servia como referência só para a palavra NAME. Ele também era usado para formar as palavras AGE e MALE. Alterando a letra A no editor gráfico causa esse efeito na ROM. Ou seja, para editar esse crachá, não bastará apenas termos conhecimento em edição gráfica. É aí que entra o conhecimento em Tilemaps. Como driblamos esse problema, aparentemente sem solução?! É mais fácil do que imaginamos.

Se o seu caso for semelhante ao da foto, com letras repetidas, mas cada uma ocupando um tile, você pode ir direto ao Primeiro método, que será o mais simples. Se você cair no mesmo caso do exemplo, mas não quiser usar uma tabela, por achar que vai consumir tempo demais, você pode tentar fazer o trabalho todo manualmente, através de seu Editor Hexadecimal. Aí, vá direto ao Segundo método.

Primeiro método - Fontes repetidas (usando uma tabela)

Figura 05
Figura 06
Figura 07
Figura 08

Bom, fazendo uma busca relativa na ROM, achamos que a sua tabela de caracteres corresponde a A=8A. Sabendo isso, vamos voltar ao Tile Layer Pro e procurar a fonte do jogo. O porque de estarmos fazendo isso será explicado logo adiante.

Olhe a Figura 05. Repare bem as marcações que fiz ao lado do Tile Layer Pro. As marcações do lado direito equivalem ao primeiro byte, e as marcações abaixo equivalem ao segundo byte. Seguindo essa lógica, se você olhar para a posição 8A, verá que ela está exatamente sobre a letra A. Uma vez que conseguimos fazer o valor das marcações bater com o valor de tabela achado na busca relativa, a Pattern Table estará completamente centralizada na tela. O que é esse papo de Pattern Table? É mais ou menos o seguinte:

Os consoles conseguem carregar um número certo de tiles por vez na memória. Normalmente, eles pegam blocos de tiles, conhecidos como Pattern Tables. Essas Pattern Tables ficam carregadas na memória enquanto RAM enquanto o jogo precisa delas. Quando ele não precisa mais, elas são substituídas por outras. No caso do Kabuki, toda vez que ele precisa escrever um texto, ele carrega a Pattern Table da figura na memória RAM do vídeogame, e tomando como referência os valores como A=8A e B=8B (e assim por diante), ele consegue escrever o texto que quiser na tela. Como usaremos isso para determinar Tilemaps? Bom, o fato é que Tilemaps também são montados com base em uma Pattern Table. E precisamos saber o offset que ela começa para podermos usar essa informação em nosso favor. Para fazer isso, usamos a Pattern Table da fonte do jogo, uma das únicas que é possível ter certeza que estamos visualizando corretamente, e depois só ir apertando Page Up e Page Down até acharmos a Pattern Table que nos interessa. Se fizermos isso, acharemos a seguinte:

Apertando Page Up apenas uma vez, já conseguimos achar a Pattern Table que desejávamos. Ela está mostrada na Figura 06. Fazendo as marcações ao lado, podemos facilmente achar os valores Hexa de TODAS AS LETRAS usadas no crachá. Lembrando que E1=A, e que ele deverá ser alterado novamente para que consigamos ver a imagem como era originalmente. Outro detalhe interessante é que a Pattern Table que contém o crachá possui os 4 primeiros tiles com as cores da paleta. Se fosse necessário editar a paleta, poderíamos usá-los como referência.

A partir daqui, nosso trabalho com o editor gráfico estará terminado. O resto será feito no Editor Hexadecimal. No nosso caso, podemos montar uma tabela de caracteres que facilitará nosso trabalho. Ela ficará como exibido na Figura 07.

Carregando essa tabela no seu editor Hexadecimal, e realizando uma busca comum por NAME, você encontrará exatamente onde está os textos referentes ao crachá, como observado na Figura 08. Você também encontrará as outras informações do crachá. O jeito é alterar manualmente ali, e conferir o resultado. Se a alteração tiver sido concluída com êxito, parabéns, você entendeu o processo de criação de uma tabela para te ajudar a alterar Tilemaps!

Algumas últimas considerações podem ser feitas sobre a Figura 08. Percebe como as palavras Age e Sex estão alinhadas, com duas linhas entre uma e outra?! No jogo, elas não aparecem exatamente uma sobre a outra?! Isso ocorre, pois, como já foi discutido anteriormente, cabem exatos 32 tiles de largura na tela, e o editor comporta 16 valores de tiles por linha. Outra coisa: percebe os valores logo abaixo de NAME, acima de SCOTT, e por aí vai? Eles não são exibidos no editor hexa por não estarem na tabela, mas se você acompanhou o processo até agora, poderá afirmar que esses valores são referentes à foto do crachá de Scott. Os valores acima de NAME provavelmente se referem aos tiles usados para montar a imagem da águia.

Segundo método - Fontes repetidas (sem uso de tabela)

A idéia da edição sem o uso de uma tabela é exatamente igual à idéia da edição utilizando uma tabela, porém, depende mais da capacidade de memorização, de pensamento rápido, e da necessidade de se fazer uma edição on-the-fly sem gastar tempo criando tabelas e etc. Para ilustrar o método, recorreremos às figuras e alguns métodos do exemplo anterior.

Vimos que tentar fazer uma busca relativa pelo conteúdo de uma imagem nem sempre pode apresentar resultados favoráveis (como ocorreu ao buscar NAME no crachá, nunca acharíamos a Pattern Table correta usando a busca relativa, uma vez que, nesta Pattern Table em especial, os caracteres não estão ordenados). Portanto, devemos repetir os procedimentos de centralização da Pattern Table, e de localização da Pattern Table em questão. Uma vez que obtivermos na tela o conteúdo da Figura 06 (com a exceção do tile E1, onde deveria estar um A ao invés de um O), podemos passar às novidades.

O que ocorre nesse método é que, tendo o Tile Layer Pro aberto apenas como referência, podemos ir direto no editor hexadecimal e já fazer uma busca convencional por E0 E1 E2 E3, e o resultado da busca muito provavelmente será o local de ocorrência de NAME no crachá do Scott! Alterando o tile E1 de A para O, já poderemos conferir se a ocorrência encontrada é a que havíamos imaginado.

O que ocorre é que, apenas fazendo isso, ainda ocorre o problema de OGE e MOLE. Mas isso não deve ser problema, pois já sabemos o local onde eles estão (algumas linhas abaixo da ocorrência de NAME), e já sabemos quais os bytes devemos alterar. Dessa forma, logo abaixo de E0 E1 E2 E3 devemos encontrar E1 FD E3 (que será alterado para EA E4 E1 E4 E3 - para liberar mais espaço, jogue a idade mais para a frente utilizando espaços em branco, designados por qualquer byte completamente preto, seja ele 00 ou 7D) e E2 E1 EF E3. Se você acompanhou o método até agora, percebeu que fizemos todas as modificações sem precisar carregar uma tabela nova, e basta testar essas alterações para ver se teve sucesso nesse método!

Caso esse método não tenha funcionado, não desanime. Ele é análogo ao primeiro método, então, tente o primeiro mais uma ou duas vezes, e depois retorne a este! Este método é apenas um pouco mais prático e rápido, mas o resultado final é o mesmo!

Terceiro método - Logotipos de jogos

Figura 09
Figura 10
Figura 11
Figura 12
Figura 13

Após a apresentação dos dois primeiros métodos, não só tivemos uma noção bem ampla e abrangente da manipulação de Tilemaps, como também tivemos alguns exemplos de aplicações. Porém, alguém desavisado pode olhar para esses exemplos e subestimar o verdadeiro poder dos Tilemaps. Este terceiro método é bastante parecido com os dois primeiros, sendo que envolve a idéia básica dos dois com alguns complementos - uma tabela não nos será útil agora (levando em conta que não estaremos lidando com caracteres), portanto, a prática do segundo método será fundamental para que o terceiro método seja executado com sucesso. Além disso, usaremos bytes que antes eram inutilizados (como a sequência de bytes pretos da Figura 06, linha 7) para montarmos figuras maiores do que as originais.

Para tal, usaremos como exemplo o jogo "The 3-D Battles of the World Runner", cuja tela título possui um grande logotipo, com muitas coisas escritas, mas que não podem ser codificadas em uma tabela (por não seguirem uma regra de 1 byte - 1 caracter). Aqui poderemos ver realmente como a alteração de um tilemap pode aumentar, e muito, a qualidade de uma tradução, especialmente de uma tela título, tornando a tradução instantaneamente mais atraente.

Em primeiro lugar, vamos conferir a Figura 09. Eu já usei as técnicas de centralização de Pattern Table e encontrei a que contém a tela título. No caso, basta ir até o offset 00014810H. Podemos tirar duas conclusões interessantes desta imagem. A primeira é que a tela título está completamente desorganizada, o que nos dará um trabalho absurdo para alterar, se formos utilizar os métodos anteriores. A segunda conclusão é que aqueles bytes pretos à esquerda de World poderão nos ser úteis.

Embora possamos mapear toda a tela título, então deslocá-la convenientemente para o canto, remapeá-la na ROM (trocar os bytes antigos pelos bytes novos) e então editá-la graficamente, isso daria um trabalho que não é compensatório. Ao invés disso, podemos simplesmente alterar a tela título utilizando as técnicas de manipulaçao de quadro do próprio Tile Layer Pro, e se faltar espaço, preenchermos os bytes vazios com coisas de nosso interesse.

Vamos então, brincar um pouco com essa tela. Primeiramente, vamos mapear a tela título. Recorrendo à Figura 09, iremos ao editor hexadecimal e procuraremos pela string 34 35 36 37 38 39 3A 3B, e veremos se algo será encontrado. Touché, no offset 00014513H, temos a tela título, de acordo com a Figura 10. Veja que logo após o 3F temos um 70, o que é completamente compreensível, se checarmos nossa Pattern Table de referência. Veja também que, sempre que o jogo deseja preencher um trecho da tela com espaços pretos, ele utiliza o byte 20. Isso nos leva a crer que poderemos mexer naqueles bytes que se encontravam à esquerda de World sem problemas. E é o que faremos agora. Uma vez que você entendar a forma de manipulação desses bytes, verá que poderá usá-los para encaixar logotipos editados maiores do que os originais.

Para tal, colocarei um logotipo aleatório em uma posição aleatória dessa Pattern Table, e remapearei o Tilemap para exibir apenas ele. Veja o logotipo alterado (e o consequente mapeamento dele) na Figura 11. Qualquer semelhança não é mera coincidência. Para aprender a inserir logotipos personalizados em seu jogo, leia algum artigo sobre Edição Gráfica usando o Tile Molester (recomendado).

Se rodarmos o jogo agora, veremos que a tela título estará toda deformada. O que fazer para corrigir isso? Usar a Pattern Table de referência e alterar os valores hex. Veja na Figura 12 como o editor hex ficará após toda a alteração dos Tilemaps, e finalmente, o resultado final na Figura 13. Como você pode perceber, as possibilidades de alteração de logotipos e gráficos por Tilemaps são praticamente infinitas. Eu escolhi uma imagem de gozação só para fins demonstrativos, mas você pode fazer o que quiser com a ROM, basta fuçar bastante nela!

Finalizando

A edição de tilemaps é extremamente útil, com o seu uso otimizamos a tradução das imagens, aumentando a qualidade do resultado final.

Ferramentas pessoais