Os caracteres das imagens servem para desenhar personagens nas imagens, enquanto os caracteres do sistema servem para chamar as fontes que acompanham o telefone, que basicamente podem ser distinguidas da aparência. Depois que o texto desse tipo de jogo for traduzido diretamente para o chinês, todo o jogo exibirá "口口口口口口" (em branco). Para jogos que usam seus próprios caracteres de imagem, os métodos de tradução para o chinês incluem a chinesização da matriz e a modificação dos caracteres do sistema. A localização matricial tem suas limitações, como muito texto, índices matriciais em arquivos de classe, etc., e só é aplicável a alguns jogos. Mais são modificados para palavras do sistema. A modificação requer que você tenha um certo conhecimento da linguagem Java, portanto, antes de ler este tutorial, se você não conhece Java, é recomendável baixar e aprender JAVA Iniciantes para entender JAVA (precisa para ser descompactado). Ferramentas de preparação lateral S40: MC, MobyExplorer,
Descompilação Mocha
Editor de bytecode BE
jasmin(/ur l)
(url=http://down2.s60net.com:8118/res/201112/10/17938831/paojiao_94825.jar?) auditor anterior ( /url)
(url=http://down2.s60net.com:8118/res/20118/15/89301505/paojiao_89300.jar?) Disass embler2Jasmin
Entre os jogos Java que usam fontes de imagem, os jogos do fabricante de jogos DigitalChocolate são os mais simples. Geralmente, o jogo DigitalChocolate é modificado. O jogo Chocolate é uma introdução ao aprendizado. O método de modificação do jogo deste fabricante é uma fórmula fixa e não muito complicada. Veja " My Pet Shop My Pet Store" como exemplo. Depois de descompactar o jogo, use a descompilação Mocha para descompilar os arquivos de classe nele e navegue brevemente por eles para encontrar os seguintes métodos: public? (Imagem da imagem, DataInputStreamdatainputstream, Font font, int?, int?) {} Descobrimos que está em i. Em classe, de modo geral, os arquivos deste método estão em arquivos de classe de 3 a 4K. Portanto, dê prioridade à abertura de arquivos de 3 a 4K para navegação, e você os encontrará rapidamente. public i (imagem, DataInputStreamdataInputStream, fonte Font, inti1, int j1) {int k; int i2; interno j2; char; if (image! = null) (omitido...) O que temos que fazer é adicionar image = null acima de if (image! = null). Não pense nisso em mim. Adicioná-lo em java não funcionará. Devido a confusão ou motivos de ferramenta, basicamente o arquivo Java descompilado não pode ser compilado novamente em um arquivo de classe. O objetivo pode ser alcançado modificando o bytecode. Primeiro crie novas pastas "1" e "2" e coloque i. Coloque a classe, abra o software Disassembler2Jasmin e há duas caixas de endereço. Preencha o primeiro, E:/1/i. Preencha o segundo campo da classe, E:/2/Clique em "Unshell" na tecla esquerda e altere i. A classe é descompilada em bytecode, que irá gerar i. arquivo j. Abra eu com editor de texto. j, que é o chamado bytecode, encontrado no início: invocaespecial java/lang/Object/
astore_1 antes de aload_1 e finalmente: invocaespecial java/lang/Object/
astore_1 e depois salve e revise, o que é muito mais conveniente. -------------O processo de operação básico é assim, por que você precisa modificá-lo assim? Vamos falar sobre o princípio abaixo. Em eu. Vemos este método em java: public void a (Graphics graphics, String string, int i1, int j1, int k1) {if (a! = null) {... graphics. setClip(i5, j5, k5 - i5, i6 - j5); gráficos. drawImage(a, i1 - (a[i4] & 255), j1 - a[i4] - b2, 20);}i1 += b1 + c;}gráficos. setClip(i2,k2,i3,j3); return;} Nota: Muitos jogos usam o método public void a (Graphics graphics, String string, int i1, int j1, int k1...) para desenhar strings. Na seção if, vemos o método setClip para cortar imagens. O princípio do método setClip é exibir apenas uma parte do conteúdo na tela para que o conteúdo da imagem localizada exatamente naquela parte seja exibido. drawImage é um método usado para desenhar imagens específicas. É fácil imaginar que o método if é usado para exibir palavras ilustradas. gráficos. setFonte(a); int j2 = gráficos. getColor();if (a){......gráficos. setColor(b); gráficos. drawString(string, i1, j1 - 1, k1); gráficos. drawString(string, i1 - 1, j1, k1); gráficos. drawString(string, i1 + 1, j1, k1); gráficos. drawString(string, i1, j1 + 1, k1);} gráficos. setColor(a); gráficos. drawString(string, i1, j1, k1); gráficos. setColor(j2);} Nota: A parte abaixo do if é a parte chave. Vimos o método drawString para desenhar strings, então sabemos que o que precisamos fazer é fazer com que esse método não execute a parte dentro do if, mas vá diretamente para a parte da palavra do sistema abaixo. (Suplemento: Se as declarações de divergência condicional são convertidas em processos diferentes de acordo com condições diferentes. Então olhe para o início se (a! = nulo), vemos que ele é julgado julgando a variável a. E onde essa variável é definida? Anteriormente falamos sobre o método public c (Image image, DataInputStreamdatainputstream, Font font, int i, int j), podemos também cortar e dar uma olhada. public i (Image image, DataInputStreamdataInputStream, fonte da fonte, int i1, int j1) {int int i2; int char ch;b = j1; a = j1! = -1; } Nota: Você pode ver que este método envolve a variável a, e a responsabilidade desta variável é determinar se a quantidade de imagens é nula. Então eu vi a = font em else; esta frase significa atribuir a quantidade da fonte a a (variável de fonte), o que pode ser entendido como atribuir a fonte do sistema a a. Portanto, esperamos tentar fazer com que esse método sempre execute o contrário, para que possamos adicionar image = null antes de if (image ! = null); Desta forma, o valor da imagem é nulo no início, e a parte do else será executada. No bytecode: aload_1ifnull Label216 corresponde a if (image! = null). (Por causa da ferramenta, é mais difícil modificar o posicionamento no celular do que no computador.) aload_1 é carregar o primeiro (1) objeto referenciado pela variável local e colocá-lo na pilha. A primeira variável local corresponde à imagem na primeira posição do nome do método. Adicione image=null aqui para criar um valor nulo para a imagem. aconst_nullastore_1 Se você quiser saber mais sobre o princípio, dê uma olhada em Java Bytecode Revealed. Deve-se notar que o "1" em astore_1 é baseado no if anterior (imagem! = null). Vemos que a terceira linha é aload_1, aqui é 1, então astore_1 também deve ser 1. Por sua vez, se for aload_2, então deve ser astore_2 e assim por diante. aconst_null
astore_1 Este segmento de código é relativamente mecânico, então você pode lembrá-lo. Os jogos produzidos pela Digital Chocolate são relativamente fixos e todos que desejam localizar seus jogos devem modificá-los desta forma. As modificações do jogo da DC são basicamente a base para muitas modificações do jogo. Portanto, é recomendável que todos o dominem completamente. Jogos de outros fabricantes não são tão fáceis e mesmo jogos do mesmo fabricante podem ter métodos de modificação diferentes. O que é necessário é aprendizado e prática contínuos, acumulando experiência e aprofundando a compreensão de Java.
-------------------Versão chinesa do texto do jogo Digital Chocolate. Depois de transformar com sucesso os caracteres da imagem em caracteres do sistema, você pode transformar o texto em chinês diretamente. Os arquivos de idioma são basicamente l0_0, l0_1, l0_2 e assim por diante. Em "My Pet Store", geralmente escolha Chinês l0_0 (Inglês). Use o plug-in na pasta SUMEA na ferramenta de computador Halo para abri-lo e modificá-lo diretamente. No celular, você precisa usar hexadecimal. Abra l0_0 em hexadecimal. 00 00 3c 75 representa o número total de bytes 15477, 00 00 01 6c representa o número total de bytes iniciais 364, 00 00 05 b8, 00 00 05 c1... representa o byte inicial do campo. Qual é o byte inicial do campo? Tecla esquerda - Editar - Vá até o endereço, digite o endereço 0x5b8 ou decimal 1464. Após a confirmação, você descobrirá que vai para o byte número 00 06 do inglês. Em seguida, insira o segundo 0x5c1 para ir para 00 02 de Ok abaixo. Cada byte inicial corresponde aos seguintes campos, por sua vez. Para ser franco, 5b8 é o número total de bytes antes de 00 06. O número de bytes mudará quando o localizarmos e eles precisam ser modificados, o que é bastante complicado e problemático.