Author Id: 27515 Author Name: G0LD_ZTHVARD0X! Post Content: Escuela de Romhacking GBC Bienvenidos a mi escuela de Romhacking GBC, donde mis amados alumnos aprenderan a Romhackear GBC con todo el amor y afecto de su maestro (?) Asi que empezaremos con la lista de alumnos inscritos: Lista de Alumnos Inscritos [MENTION=25635]WiZaRD[/MENTION] [MENTION=27566]Lake[/MENTION] @4ldr3d0 [MENTION=27250]Zero D.[/MENTION] [MENTION=27794]Soloo993[/MENTION] [MENTION=15014]Cheve_X[/MENTION] [s]elgatitonegrolamepantallas[/s] Bien, ahora pasaremos a lo que les interesa, las clases, y las tareas se detallan mas abajo. [spoiler=Clases][spoiler=1. Introduccion Al Sistema Hexadecimal]1- ¿Qué significan los símbolos “%”, “$”, “0x” y “x” entes de los números? R: Son los prefijos que permiten al lector saber a qué sistema numérico pertenece tal número. Binario =% Hexadecimal = $, 0x, x 2- ¿Que es un bit? Un bit es un dígito del sistema de numeración binario. Solo se usan dos dígitos, el 1 y el 0. Se puede imaginar un bit, como una bombilla que puede estar en uno de los siguientes dos estados: Apagado = 0[IMG]http://upload.wikimedia.org/wikipedia/commons/4/49/Bulbgraph_Off.png[/IMG] ó Encendido = 1 [IMG]http://upload.wikimedia.org/wikipedia/commons/6/60/Bulbgraph.png[/IMG] Estos valores pueden ser convertidos al decimal y hexadecimal A. Byte en Binario: %00000000 Byte en Decimal: 0 Byte en Hexadecimal:$00 B. Byte en Binario: %00000001 Byte en Decimal: 1 Byte en Hexadecimal:$01 C. Byte en Binario: %00000010 Byte en Decimal:2 Byte en Hexadecimal:$02 D. Byte en Binario: %00000011 Byte en Decimal:3 Byte en Hexadecimal:$03 E. Byte en Binario: %00001010 Byte en Decimal:10 Byte en Hexadecimal:$0A F. Byte en Binario: %1011010 Byte en Decimal:90 Byte en Hexadecimal:$5A G. Byte en Binario: %10111101 Byte en Decimal:189 Byte en Hexadecimal:$BD H. Byte in binary form: %11111111 3- ¿Que es un byte? Un Byte es grupo de 8 bits que forman una unidad de información. He aquí algunos ejemplos para entender mejor el comprtamiento del byte: A. Byte en Binario: %00000000 Byte en Decimal: 0 Byte en Hexadecimal:$00 B. Byte en Binario: %00000001 Byte en Decimal: 1 Byte en Hexadecimal:$01 C. Byte en Binario: %00000010 Byte en Decimal: 2 Byte en Hexadecimal:$02 D. Byte en Binario: %00000011 Byte en Decimal: 3 Byte en Hexadecimal:$03 E. Byte en Binario: %00001010 Byte en Decimal: 10 Byte en Hexadecimal:$0A F. Byte en Binario: %1011010 Byte en Decimal:90 Byte en Hexadecimal:$5A G. Byte en Binario: %10111101 Byte en Decimal:189 Byte en Hexadecimal:$BD 4: ¿Qué es un Offset? Un offset se refiere a una ubicación específica en la memoria. En términos coloquiales, es la dirección del byte. Se puede entender mejor si tomamos de ejemplo un librero con algunos libros. Cuando necesitamos un libro en específico, el offset nos indicara sobre que repisa y a qué altura esta su localización. Cuando una ROM de Game Boy o un archivo RAM se abre con un editor hexadecimal, contendrá toneladas de bytes hexadecimales en orden. El primer byte se localiza en el offset $0, el segundo byte en el offset $01, el tercer byte en el offset $02 y así sucesivamente hasta el fin de los tiempos. Los offsets se escriben normalmente en un formato que es bastante sencillo que consiste en el signo “$” seguido del número Hex, pero existe otro formato que usa el Game Boy de forma nativa: A. Offset en Decimal: 46679 Offset en primer Hexadecimal: $B657 Offset en segundo Hexadecimal: 02:57B6 B. Offset en Decimal: 132157 Offset en primer Hexadecimal: $2043D Offset en segundo Hexadecimal: 08:3D04 C. Offset en Decimal: 924076 Offset en primer Hexadecimal: $E19AC Offset en segundo Hexadecimal: 38:AC19 D. Offset en Decimal: 1420579 Offset en primer Hexadecimal: $15AD23 Offset en segundo Hexadecimal: 56:23AD El segundo formato se entenderá más claramente una vez que se comprenda el concepto de Bank, Point y Repoint. Los offsets son cruciales para modificar un juego mediante un programa hexadecimal, ya que se necesitan para saber donde se encuentran los datos a modificar. 5- ¿Qué es un Bank? Bank o Banco en español, se refiere a la manera en que se reparten los datos dentro de un ROM del Game Boy. Se dividen en secciones que de $4000 bytes, esto quiere decir que: Bank $00: $0000 - $3FFF Bank $01: $4000 - $7FFF Bank $02: $8000 - $BFFF Bank $03: $C000 - $FFFF Bank $04: $10000 - $13FFF ... Bank $2B: $AC000 - $AFFFF Bank $2C: $B0000 - $B3FFF Bank $2D: $B4000 - $B7FFF Bank $2E: $B8000 - $BBFFF Bank $2F: $BC000 - $BFFFF ... En el primer banco, el $0000 está incluido en el cálculo de los $4000 bytes por banco, por esta razón, el segundo banco comienza en el $4000 y así sucesivamente. El número del banco está determinado por su posición relativa; al primer banco se le asigna el $00, al segundo el $01, etc. Al decimo primero, entonces, se le asignaría el $0A. El número de banco se puede calcular fácilmente si dividimos un offset entre $4000 en la calculadora de Windows (automáticamente hará el redondeo). Ciertos bancos están reservados para funciones específicas; un ejemplo de esto son los juegos de segunda generación, en donde el segundo banco se utiliza principalmente para almacenar datos de las paletas (colores). Para ver los detalles sobre bancos de la ROM de Pokemon Gold puedes consultar este enlace: [url]http://datacrystal.romhacking.net/wiki/Pok%C3%A9mon_Gold:ROM_map[/url] Volviendo al ejemplo del librero, podemos decir que las repisas del librero es el equivalente a los Bancos de la ROM, esto con el fin de tener nuestros datos mejor organizados. 6- ¿Qué es un Point? Un point o puntero es un dato dentro de la ROM que le dice a la misma ROM donde buscar otro dato. Los datos pueden ser texto, gráficos o comandos. Coloquialmente se puede decir “apuntar”. Por ejemplo, en nuestro librero, imaginemos a un pointer como si tuviéramos un montón de libros de color negro y el pointer señalara un libro en específico marcándolo con un color rojo para su fácil localización, así cada vez que necesitamos cierta información, nuestro librero sabe en qué “libro” buscar. 7.- ¿Qué es el Repoint, y que tan necesario es? El repoint, o repunteo es cuando editamos algún point para que “apunte” a otra ubicación diferente en la ROM, esto debido a que se está agregando nueva información al juego. El repoint es un concepto básico del Rom Haking; es necesario dominarlo para hacer avanzar en los aspectos más creativos y técnicos de nuestro Hack, ya que con el podemos ampliar el texto, ampliar eventos existentes o crear nuevos, hacer nuevos scripts, etc. Prácticamente se puede hacer de todo aprendiendo a repuntear. Si en nuestro librero (ROM) necesitamos crecer un libro (Datos) de tamaño, pero no cabe en lugar en donde estaba, podemos moverlo a otra repisa (Banco) con mas espacio libre, pero debemos decirle al juego la nueva ubicaci ón para que sepa dónde buscar ;) 8.- ¿Cuál es la diferencia entre un pointer de 2 bytes y un pointer de 3 bytes? Los dos tipos de pointers que se utilizan en los juegos de Game Boy tienen el mismo propósito, el de “apuntar” hacia la ubicación de datos, su única diferencia es que el pointer de 3 bytes tiene un byte adicional que indica la localización del banco. Esto significa que los pointers de 2 bytes siempre apuntan a una ubicación dentrodel mismo banco en que se encuentra y los pointers de 3-bytes pueden apuntar a cualquier lugar del ROM. Un ejemplo de un 3-Bytes point son los sprites de los pokemon y entrenadores, que pueden localizarse en cualquier lugar de la ROM. Operacion de Calculo de Punteros Vamonos al calculo de punteros, lo que necesitas es: - Calculadora de windows - Haber pasado la primaria - Un editor hex (Mejor si es Gold Finger) Antes de hallar el Puntero que necesites, necesitas saber esta formula: Offset / 4000 = Banco Para hallar el puntero deseado necesitas usar la siguiente formula: [Offset - (Banco * 4000)] + 4000 = Puntero permutado El puntero permutado es nada mas y nada menos que el Puntero, solo que sus bytes estan al reves. Puede parecer confuso, pero poner en practica todo esto puede resultar mas facil de entender. EJEMPLO Muy bien, abramos nuestro editor hex y vayamos a offset AD6AC, no dire como lo se porque no es tema de este tutorial, pero este offset es el comienzo del mapa de Mahogany Town en Pokemon Silver. En fin. Vayamos a offset AD6AC y averiguemos cual es su puntero de 3-bytes. Abrimos inicio y buscamos la calculadora de windows. Una vez ahi da click en "ver" y luego en "programador". La calculadora deberia mostrarse asi: [IMG]http://img23.imageshack.us/img23/142/sinttulovr.png[/IMG] ¿Ves la columna donde dice "Hexa Dec Oct Bin"? Da click en "Hexa" y vamos a aplicar la formula: AD6AC / 4000 = 2B. El Banco de este offset es 2B [AD6AC - (2B * 4000)] + 4000 [AD6AC - AC000] + 4000 16AC + 4000 56AC 56AC es el Puntero Permutado AC56 es el Puntero Asi que el pointer de offset AD6AC es AC56. ¿Cual es su Puntero de 3-bytes? Recordemos que el 3byte pointer es [pointer]. Como el Bank es 2B, entonces el 3byte pointer para offset AD6AC es 2B:AC56. ¿Cual es su Puntero de 2-bytes? El 2byte pointer es nada mas y nada menos que el pointer en si mismo. En otras palabras, el 2byte pointer para offset AD6AC es AC56. ¿Como comprobamos que esto es correcto? Bueno, como queriamos hallar el puntero de 3-bytes desde un principio usemos nuestro Hex editor. Abramos el ROM con el hex editor y vayamos a "Search". Una vez ahi marca "Hex" (si estas usando i.Hex. Esto depende del hex editor que uses) y escribe "2BAC56". Si lo hiciste bien deberias llegar a offset 94F07. Muy bien, que es lo que dicen los 3 bytes desde 94F07 hasta 94F09? Esos 3 bytes dicen "2B AC 56". Si cambias estos valores el juego no podra cargar mahogany y lo habras arruinado al menos que pongas esos valores de nuevo porque el juego no sabria localizar donde esta Mahogany. Cuando hagas ROM hacking usando Hex editing es esencial que sepas esto, porque dependiendo de lo que necesites hackear, vas a tener que hacer uso de ya sea 2byte pointers o 3byte pointers casi siempre, asi que antes de aventurarte a hacer hex editing asegurate de dominar esto bien, que no es tan dificil y puede ser mas provechoso que utilizar un millon de tools para hackear.[/SPOILER] [spoiler=Clase 2]Bienvenidos sean de nuevo mis pupilos (?), el dia de hoy aprenderan algo que les sera de vital importancia para trabajar en GBC...se trata de... El Repunteo y busqueda de punteros Bien, como asumo que hemos aprendido sobre que es un puntero, banco, repunteo, etc, esto no deberia de ser dificil, el repunteo lo aplicamos unicamente cuando vamos a escribir datos mas grandes que los originales, siendo esto casi obligatorio, ya que esto es como nuestro pan diario para quienes romhackeamos GBC. Con el repunteo podran traducir textos que no se pueden traducir con poketext, y no solo traduciras, sino podras usar los caractreres que quieras (no para excederse, que hay un limite de caracteres que dependen de lo que traduces, por ejemplo, los nombres de los tipos solo admiten 8 caracteres, los nombres de los pokemon admiten 10, los movimientos 12, etc), bien primero necesitamos las siguientes herramientas *Gold Finger con tabla de caracteres (busquen en mi megapack de herramientas si no lo tienes) * A-Point * (Opcional) Free Space Finder (FSF) Paso 1: Primero debemos de pensar que texto deseamos traducir o cambiar, por ejemplo yo cambiare el de la pantalla de espera (los textos continuar, nuevo juego, etc.) que el poketext no carga (los vagos usan poketext,los pro como yo no (?)) Podriamos solo poner todo traducido sin repuntear, pero recuerda que las palabras en español son mas largas que el ingles, y no queremos echar a perder el rom por sobreescribir datos. Paso 2 Ahora debemos de buscar el texto en gold finger, abrimos el rom y luego cargamos la tabla, para ello ya con el ROM abierto le damos a file>open table>table file 1 y localizaremos el archivo "Table File Esp" que esta dentro de la carpeta de Gold Finger, y ahora usaremos la funcion "search", con la cual podremos buscar los bytes que queramos, se accede a esta funcion presionando F7 .Ahora nos desplegara una ventana para escribir, pero para escribir con el teclado y no escribir el byte entero solo presiona CTRL+TAB, y donde antes decia HEX ahora dira "CHAR", ahora escribimos el texto a buscar, ojo que el rom es sensible a las mayusculas y minusculas, como busco el texto de la pantalla de espera escribire "CONTINUE", recordando que el ROM es sensible a las mayusculas y minusculas, ya escrito el texto le damos search y nos llevara al offset que contenga esos bytes. Si no encontraste el texto que querias dale clic a "search again" y el rom volvera a buscar, si quieres saber si es el texto correcto mira la parte derecha del programa, ahi se muestran los textos, veremos que me aparecio CONTINUE&NEW GAME&OPTIONS&MISTERY GIFT&, ahora ya hemos ubicado el texto a traducir. [IMG]http://i756.photobucket.com/albums/xx206/GOLD_251/paso1_zps1a504ff6.png[/IMG] Paso 3 Ahora con a-point buscaremos el puntero del texto, antiguo, ahora al obtener el puntero necesitaremos SOLO los ultimos 2 bytes, ya que ese texto es un puntero de 2 bytes, la mayoria de textos de este tipo son señalados por punteros de 2 bytes (osea no pueden ubicarse en cualquier parte, no deben de salir del banco donde se encuentran), ahora copiamos esos bytes y de nuevo con la funcion busqueda pegamos esos bytes, y al darle search el rom buscara esos bytes en el rom. Consejo: para saber si encontraste el puntero correcto, debes tener en cuenta que los punteros SIEMPRE estan antes del texto que señalan, osea normalmente estan unos 5 o 10 bytes antes, a excepcion de algunos casos donde esta en otro banco debido a que es señalado por medio de una rutina ASM. [IMG]http://i756.photobucket.com/albums/xx206/GOLD_251/paso2_zpsef115384.png[/IMG] Si deseas saber si es el correcto, cambia los bytes a 00 00, guarda, y al abrir tu rom en vez de ese texto veras simbolos extraños, o colgarse el juego, no te asustes si los ves, es que borraste el puntero, si sigue el texto original repite el proceso porque no era el puntero correcto. Paso 4 Ahora como sabemos que el nuevo lugar para nuestro texto no debe de salirse del banco, buscamos espacio libre en ese banco, (los espacios vacios son un monton de 00 seguidos" pueden usar gold finger, o FSF para ubicar el espacio vacio, recordando que NO DEBE SALIRSE DEL BANCO, luego de ubicar el nuevo lugar, escribimos el nuevo texto, volviendo a usar el ctrl+tab para escribir con el teclado. [IMG]http://i756.photobucket.com/albums/xx206/GOLD_251/paso3_zpse3ba0e68.png[/IMG] Consejo: Para los textos que se escriben mediante tabla CHAR debes de separar cada palabra por el byte "50", y en el modo de texto veras el signo "&", quedando asi por ejemplo: pokedex&pokemon&bolsa, etc, Paso 5 Ahora Repuntearemos, usando el a-point obtenemos el puntero donde escribiste el texto, recuerda que SOLO necesitas los ultimos 2 bytes, ahora vamos a la offset donde esta el puntero, y reemplazamos los 2 bytes antigos, por el nuevo puntero, si todo salio bien deberia de verse asi: [IMG]http://i756.photobucket.com/albums/xx206/GOLD_251/pokemonicesilver_01_zpseeb24bf7.png[/IMG] Ahora solo guardan cambios, inician el ROM, vayan al sitio que modificaron y deberia de verse correctamente el texto. Bien, ahora ya hemos repunteado y buscado el puntero, el proceso suele ser dificil, pero es divertido, no sale siempre a la primera, pero tampoco fallaran mucho para obtener el resultado deseado. Bien, es todo por hoy, espero que hayan entendido bien esta clase, que es vital para hackear GBC.[/spoiler][/spoiler] Y ahora las tareas: [spoiler=tareas][spoiler=Tarea Clase 1] Para esta clase aplicaremos el criterio anterior de calculo de punteros, osea usando esta base AD6AC / 4000 = 2B. El Banco de este offset es 2B [AD6AC - (2B * 4000)] + 4000 [AD6AC - AC000] + 4000 16AC + 4000 56AC 56AC es el Puntero Permutado AC56 es el Puntero La tarea sera calcular los punteros de 3-bytes de las siguientes 5 offsets: 1. $68FCF 2. $1E4000 3. $7550 4. $F78F4 5. $1A9 Para estar seguro que usaron la formula deben dejar el procedimiento, tienen una semana para entregar la tarea[/spoiler] [spoiler=Tarea Clase 2] La tarea es simple, deberan de cambiar el texto de la seleccion de nombre del prota al inicio del juego, al iniciar dice: NEW NAME GOLD HIRO TAYLOR MATT Ustedes deberan repuntear y cambiar el texto al siguiente: Nuevo N. Armando Cecilio Juanito (Tu nick)(no debe pasar de 7 letras) Tienen una semana para entregarla, cualquier duda mandenme un mensaje de visita (MP porfavor No)[/spoiler] Toda tarea deben de enviarmela por MP. j