[Chino] Tutorial del juego Capítulo 4: Cambie las palabras de la imagen a palabras del sistema

El cartel original: Cry&Pequeña Herida Vistas: 2656 Respuestas: 5 Publicado en: 2011-12-18 07:09:07
Este es un contenido complementario, pero también es muy importante y debe memorizarse cuidadosamente -----
Los caracteres de la imagen son para dibujar caracteres en las imágenes, mientras que los caracteres del sistema son para llamar a las fuentes que vienen con el teléfono, que básicamente se pueden distinguir por la apariencia. Después de que el texto de este tipo de juego se traduzca directamente al chino, todo el juego mostrará "口口口口口口" (en blanco). Para los juegos que utilizan sus propios caracteres gráficos, los métodos de traducción al chino incluyen la chinaización matricial y la modificación de los caracteres del sistema. La localización de matriz de puntos tiene sus limitaciones, como demasiado texto, índices de matriz de puntos en archivos de clase, etc., y solo es aplicable a algunos juegos. Más se modifican a palabras del sistema. La modificación requiere que tenga cierta comprensión del lenguaje Java, por lo que antes de leer este tutorial, si no conoce Java, se recomienda descargar y aprender JAVA Beginners para comprender JAVA (debe ser descomprimido). Herramientas de preparación lateral S40: MC, MobyExplorer,
Descompilación de Mocha
Editor de código de bytes 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 los juegos Java que utilizan fuentes de imágenes, los juegos del fabricante de juegos DigitalChocolate son los más simples. Generalmente, el juego DigitalChocolate está modificado. El juego del Chocolate es una introducción al aprendizaje. El método de modificación del juego de este fabricante es una fórmula fija y no es muy complicado. Tomemos como ejemplo " My Pet Shop My Pet Store". Después de descomprimir el juego, use la descompilación de Mocha para descompilar los archivos de clase que contiene y examínelos brevemente para encontrar los siguientes métodos: ¿público? (Imagen de imagen, DataInputStreamdatainputstream, fuente de fuente, int?, int?) {} Descubrimos que está en i. En clase, por lo general, los archivos de este método están en archivos de clase de 3 a 4K. Por lo tanto, dé prioridad a abrir archivos de 3 a 4K para explorarlos y los encontrará rápidamente. public i (imagen de imagen, DataInputStreamdataInputStream, fuente de fuente, inti1, int j1) {int k; int i2; int j2; char ch; if (image! = null) (omitido...) Lo que tenemos que hacer es agregar image = null arriba de if (image! = null). No lo pienses en i. Agregarlo en Java no funcionará. Debido a confusión o razones de herramientas, básicamente el archivo Java descompilado no se puede volver a compilar en un archivo de clase. El propósito se puede lograr modificando el código de bytes. Primero cree nuevas carpetas "1" y "2", y coloque i. Ingrese la clase, abra el software Disassembler2Jasmin y encontrará dos cuadros de direcciones. Complete el primero, E:/1/i. Complete el segundo campo de clase, E:/2/Haga clic en "Desconectar" en la tecla programable izquierda y cambie i. La clase se descompila en código de bytes, lo que generará i. archivo j. Abra i con el editor de texto. j, que es el llamado bytecode, que se encuentra al principio: invokespecial java/lang/Object/ () Vaload_1ifnull Label216 Lo que tenemos que hacer es agregar aconst_null
astore_1 antes de aload_1 y finalmente: invokespecial java/lang/Object/() Vaconst_nullastore_1aload_1ifnull Label216 Bien, guarda los cambios, ahora pon i. j vuelve a compilar en i. clase, abra Jasmin, hay dos cuadros de direcciones. Complete el primero, E:/2/i. j Complete el segundo, E:/2/Haga clic en "Compilar" en la tecla programable izquierda. Una vez que la compilación sea exitosa, será auditada previamente. El archivo de clase compilado debe pasar la verificación del auditor antes de que pueda volver a empaquetarse en el software para su uso. Abra el Preverificador del auditor, complete ambos cuadros de ruta con E:/2/ y comience a auditar. Comprobemos si se ha agregado correctamente, usando la i modificada y revisada en la carpeta Mocha Reverse 2. clase, ver si image=null se agrega a la línea de código if (image! = null)? Bueno, si la adición tiene éxito, simplemente reemplace la i original. clase, vuelva a empaquetar, instale y ejecute el juego para ver el efecto. La fuente se ve así antes de la modificación: La fuente se ve así después de la modificación: Mire, la fuente ha cambiado y es la misma que la fuente del sistema del teléfono móvil. Además de las herramientas anteriores, también puede utilizar el editor de código de bytes BytecodeEditor para realizar modificaciones sin descompilar, lo cual es cada vez más rápido. Software que se puede utilizar para ver y modificar el grupo constante, campos, métodos, etc. de una clase y modificar directamente el código de bytes. El proceso consiste en abrir el software: buscar y abrir i. clase--método-"init", ¿ves un código familiar? invokespecial java/lang/Object/() Vaload_1ifnull Label216 Edite y agregue aconst_null
astore_1 y luego guárdelo y revíselo, lo cual es mucho más conveniente. -------------El proceso de operación básico es así, ¿por qué necesitas modificarlo así? Hablemos del principio a continuación. En yo. Vemos este método en 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: Muchos juegos utilizan el método público void a (Gráficos, cadenas de cadenas, int i1, int j1, int k1...) para dibujar cadenas. En la sección if, vemos el método setClip para cortar imágenes. El principio del método setClip es mostrar solo una parte del contenido en la pantalla para que se muestre el contenido de la imagen ubicada exactamente en esa parte. drawImage es un método utilizado para dibujar imágenes específicas. Es fácil imaginar que el método if se utiliza para mostrar palabras con imágenes. gráficos. establecerFuente(a); int j2 = gráficos. getColor();si (a){......gráficos. establecerColor(b); gráficos. drawString(cadena, i1, j1 - 1, k1); gráficos. drawString(cadena, i1 - 1, j1, k1); gráficos. drawString(cadena, i1 + 1, j1, k1); gráficos. drawString(cadena, i1, j1 + 1, k1);} gráficos. establecerColor(a); gráficos. drawString(cadena, i1, j1, k1); gráficos. setColor(j2);} Nota: La parte debajo de if es la parte clave. Hemos visto el método drawString para dibujar cadenas, por lo que sabemos que lo que tenemos que hacer es hacer que este método no ejecute la parte dentro de if, sino que vaya directamente a la parte de la palabra del sistema a continuación. (Suplemento: si las declaraciones de divergencia condicional se convierten en diferentes procesos de acuerdo con diferentes condiciones. Luego mire al principio si (a! = null), vemos que se juzga juzgando la variable a. ¿Y dónde se define esta variable? Anteriormente hablamos sobre el método público c (Imagen de imagen, DataInputStreamdatainputstream, Fuente de fuente, int i, int j), también podríamos cortar y echar un vistazo. public i (Imagen de imagen, DataInputStreamdataInputStream, fuente, int i1, int j1) {int k; int i2; int j2; char if (imagen! = nulo) {a = imagen;b = j1; a=j1! = -1; } Nota: Puede ver que este método involucra la variable a, y la responsabilidad de esta variable es determinar si la cantidad de imágenes es nula. Luego vi a = font en else; esta oración significa asignar la cantidad de fuente a (variable de fuente), lo que puede entenderse como asignar la fuente del sistema a a. Así que esperamos intentar que este método siempre se ejecute else, de modo que podamos agregar image = null antes de if (image! = null); De esta forma, el valor de la imagen es nulo al principio y se ejecutará la parte en else. En el código de bytes: aload_1ifnull Label216 corresponde a if (imagen! = null). (Debido a la herramienta, es más difícil modificar la posición en el teléfono móvil que en la computadora). aload_1 es cargar el primer (1) objeto al que hace referencia la variable local y empujarlo a la pila. La primera variable local corresponde a la imagen en la primera posición del nombre del método. Agregue image=null aquí para crear una cantidad nula para la imagen. aconst_nullastore_1 Si quieres saber más sobre el principio, puedes echar un vistazo a Java Bytecode Revealed. Cabe señalar que el "1" en astore_1 se basa en el if anterior (imagen! = nulo). Vemos que la tercera línea es aload_1, aquí es 1, entonces astore_1 también debe ser 1. A su vez, si es aload_2, entonces debería ser astore_2 y así sucesivamente. aconst_null
astore_1 Este segmento de código es relativamente mecánico, por lo que puedes recordarlo. Los juegos producidos por Digital Chocolate son relativamente fijos y todo aquel que quiera localizar sus juegos debería modificarlos de esta manera. Las modificaciones del juego de DC son básicamente la base de muchas modificaciones del juego. Por lo tanto, se recomienda que todos lo dominen a fondo. Los juegos de otros fabricantes no son tan fáciles, e incluso los juegos del mismo fabricante pueden tener diferentes métodos de modificación. Lo que se necesita es aprendizaje y práctica continuos, acumular experiencia y profundizar la comprensión de Java.

-------------------Versión china del texto del juego Digital Chocolate. Después de cambiar con éxito los caracteres de la imagen a caracteres del sistema, puede convertir el texto en chino directamente. Los archivos de idioma son básicamente l0_0, l0_1, l0_2 y así sucesivamente. En "Mi tienda de mascotas", generalmente elija chino l0_0 (inglés). Utilice el complemento en la carpeta SUMEA en la herramienta informática Halo para abrirlo y modificarlo directamente. En el teléfono móvil, debes utilizar hexadecimal. Abra l0_0 en hexadecimal. 00 00 3c 75 representa el número total de bytes 15477, 00 00 01 6c representa el número total de bytes iniciales 364, 00 00 05 b8, 00 00 05 c1... representa el byte inicial del campo. ¿Cuál es el byte de inicio del campo? Tecla programable izquierda - Editar - Vaya a la dirección, ingrese la dirección 0x5b8 o el decimal 1464. Después de la confirmación, encontrará que va al byte número 00 06 en inglés. Luego ingrese el segundo 0x5c1 para ir al 00 02 de Ok a continuación. Cada byte inicial corresponde a su vez a los siguientes campos. Para decirlo sin rodeos, 5b8 es el número total de bytes antes de 00 06. El número de bytes cambiará cuando lo localicemos y es necesario modificarlos, lo cual es bastante complicado y problemático.
responder 🤍 0 📤 compartir recolectar
¡Demasiado profundo!
Techo…………
Esto es lo que se llama difícil…
Arriba es apenas aceptable, esto realmente no lo entiendo.
Si lo abres con BE, dentro solo habrá invokespecial java/lang/Object/()V y no habrá nada más después, ¿qué hacer?
— Todas las respuestas cargadas —

Deja una respuesta