Muy bien, este capítulo tratará sobre la modificación de eventos ya existentes. Esto es para poder familiarizarte con la estructura de un evento además ¿Quién mejor maestro que el juego mismo? Ya que si en un cap x vez un evento interesante como el de “Transportación” que hace Nergal ó las batallas predeterminadas, solo desensambla su evento y revisa como se hace.
¿Qué aprenderás? Bueno, lo que se espera que aprendas es:
-Ensamblar eventos
-Desensamblar eventos
-Modificar eventos existentes
No aprenderás a hacer eventos desde cero por la sencilla razón de que no se me antoja xD no, es porque primero hay que saber la estructura de los eventos para poder hacer los propios.
Requerimientos:
-Event Assembler (Obvio para el Des/ensamblaje de eventos )
-Nightmare/Nightmare 2.0 (Informativo) y sus módulos
-Documento de Texto (cualquier programa que haga documentos en .txt, en este tutorial se usará el MS Bloc de Notas)
-Emulador (Para probar los cambios, VBA de preferencia)
-ROM 1235 - Fire Emblem (U)
-Net Frameworks 3.5 o superior (Para que se ejecute el programa)
¡Comencemos con esto ya!
Lo primero es ver el programa en sí y todas sus partes:
Text:
Aquí seleccionas el documento de texto donde Ensamblaras/Desensamblaras los eventos.
ROM:
Aquí selecciona el ROM 1235 - Fire Emblem (U) a editar y el que recibirá los eventos.
The Game:
Esta parte es importante pues le indica al programa que juego estas modificando, como ya dije me basaré en el FE7 pero es casi lo mismo para los otros dos (FE6/FE8).
Disassembling options:
Tiene dos campos y son muy útiles puesto que te sirven para determinar qué vas a desensamblar.
Offset: Aquí se coloca el puntero de donde se encuentra el evento.
Length: Aquí determinas la longitud del evento. Se usa para los Eventos WorldMap.
Disassembly mode:
Posee tres botones de radio y determina la forma en la que se desensamblará el evento.
Whole length: El evento se desensamblará hasta la longitud que se le asigno en Length.
To end code: El evento será desensamblado cuando llegue al final de código.
Whole chapter: De desensamblará todo el evento del capítulo.
Add end guards:
Casilla verificadora para… solo déjalo marcado y ya.
Botón Reload raws:
Un botón que se usa para cuando modifiques un Raw y quieras volver a cargarlos.
Botón Assemble:
Se usa para ensamblar los eventos en la ROM.
Botón Dissassemble:
Se usa para desensamblar los eventos en la ROM.
Botón Exit:
Cierra el programa. xD
Esto es todo el programa y la verdad es que es bastante simple sin embargo sus efectos son espectaculares, el programa en si casi no será usado pues lo único que hace es ensamblar/desensamblar eventos y nada más, no los crea. Para crearlos usaremos un simple editor de texto, en mi caso, el MS Bloc de Notas tan sencillo y útil pero ya basta de tanta palabrería y desensamblemos un evento.
Desensamblando Eventos:
Para desensamblar un evento necesitaremos el offset del evento, el Length (si es Evento WorldMap) y el documento de texto. Para obtener el offset, que es lo más importante, haremos uso del módulo FE7 Event References, una vez abierto tendremos esto:
Desplegamos la lista y buscamos el puntero del evento a desensamblar, yo desensamblaré el evento del Prólogo, para eso, necesito buscar el 0x06 Eventos Prologo y abajo del encabezado aparece el offset 0x8CA0720 aquí hare un paréntesis “()” xD
Los offset de GBA esta formados por 4 bytes, el caso de este es 08 CA 07 20 pero la verdad es que este offset solo es de 3 bytes y el cuarto es agregado el cual es 08 entonces solo usaremos el offset “real” que sería CA0720 omitiendo el 08, aclarado eso continuemos.
Ya que tenemos el offset del evento solo hay que colocarlo en su lugar (que es la caja Offset del Disassembling options), llenamos las cajas de Text y ROM y viene una decisión importante, la forma del des ensamblaje, para obtener todo el contenido del evento usaremos la opción Whole chapter. Una vez todo en orden solo se necesita pulsar el botón Dissassemble y esperar a que el evento sea desensamblado.
Si aparece el texto:
“Finish
No error or warnings.
Please continue being awesome. ”
Significa que todo ha salido bien y que el evento ha sido desensamblado correctamente. Ahora solo hay que ver que se ha generado en el documento de texto. Busca el documento de texto y ábrelo.
¿Pero qué demonios es esto? Si, ¡Bienvenido al Infierno! Esta parte será la más extensa, dolorosa, frustrante y divertida de los eventos aquí demostraras si en verdad quieres crear un Hack espectacular o solo otro del montón. Errores, aciertos, accidentes, exploraciones, jaquecas y demás te esperan a partir de este punto si te sientes capaz de hacerlo pues sigue leyendo si no solo pulsa Alt + F4.
Como estoy editando el evento del prologo pues puedo hacer que no sea Lyn el personaje que aparezca, lo mismo va para los enemigos pero no puedo agregar más. O sea que solo se puede trabajar con 3 unidades, moverlas, cambiarles el arma, cambiar los textos o suprimirlos. La verdad no se puede hacer mucho pero así aprenderás ya que aquí podrás ver la sintaxis de un evento.
Pero para comprender más, hablare un poco de cada línea que aquí se muestra:
Código: Seleccionar todo
////////////////////////////////////////////////////
// //
// Disassembled with Nintenlord's Event Assembler //
// Version: 9.1.4270.36371 //
// Game: FE7 //
// File: FE7x - El Regreso de Lord Nergal.GBA //
// Offset: $CA0720 //
// //
////////////////////////////////////////////////////
Código: Seleccionar todo
ORG $CA0540 // Offset que contiene la sección del evento.
TurnBasedEvents: //Etiqueta principal que contiene los eventos de Turno.
TURN 0x0 BeginningScene [1,0] 0x0 0x0
//TURN = Código
// 0x0 = Identificador del evento
//BeginningScene = Etiqueta del evento
//[1,0] = Turno de inicio , Turno de finalización
//0x0 = Momento del turno (Jugador, enemigo ó NPC)
//0x0 = Condiciones extras
TURN 0x0 label12 [1,0] 0x0 0x0
TURN 0x0 label13 [2,0] 0x8 0x0
TURN 0x0 label14 [4,0] 0x8 0x0
CHARASM // Fin de la etiqueta principal (TurnBasedEvents)
//The next line is for re-assembling purposes. Do not delete!
MESSAGE Original ending offset is $CA0584 and the new ending offset is CURRENTOFFSET
Código: Seleccionar todo
ORG $CA05C8 // offset
CharacterBasedEvents: //Etiqueta principal que contiene los eventos de personaje
CHARASM// Fin de la etiqueta principal. (CharacterBasedEvents)
Código: Seleccionar todo
LocationBasedEvents: // Etiqueta principal que contiene los eventos de zona
LOCA 0x3 [3,2] 0xF
//LOCA = Código
//0x3 = Identificador del evento
//[3,2] = Coordenadas X,Y estas coordenadas son contadas desde la esquina superior izquierda del mapa, y se comienza desde 0,1,2,3…n. “X” son coordenadas horizontales y “Y” son coordenadas verticales.
//0xF = Comando a utilizar
CHARASM //Fin de la etiqueta principal (LocationBasedEvents)
Código: Seleccionar todo
ORG $CA06D4// offset
MiscBasedEvents: // Etiqueta principal de eventos Varios
AFEV 0x14 label15 0xC
//AFEV = Código
// 0x14 = Identificador del evento.
// label15 = Etiqueta del evento.
// 0xC = Indicador del evento enlazado a este.
AFEV 0x15 label16 0xD
AFEV 0x16 label17 0xE
AFEV 0x17 label18 0xF
AFEV 0x18 label19 0x10
AFEV 0x0 label20 0x65
CHARASM // Fin de la etiqueta principal. (MiscBasedEvents)
Código: Seleccionar todo
PointerList:
POIN TurnBasedEvents
POIN CharacterBasedEvents
POIN LocationBasedEvents
POIN MiscBasedEvents
POIN TrapsEliwoodMode TrapsHectorMode
POIN EnemyUnitsENM EnemyUnitsENM EnemyUnitsENM EnemyUnitsENM
POIN AllyUnitsENM AllyUnitsENM AllyUnitsENM AllyUnitsENM
POIN BeginningScene EndingScene
Código: Seleccionar todo
ORG $CA71A8// Offset
TrapsEliwoodMode: // Etiqueta principal de Ballestas Modo Eliwood
ENDTRAP// Fin de etiqueta principal de Ballestas Modo Eliwood (TrapsEliwoodMode)
Código: Seleccionar todo
ORG $CA730A // offset
TrapsHectorMode: // Etiqueta principal de Ballestas Modo Hector
ENDTRAP// Fin de la etiqueta principal de Ballestas Modo Hector
Código: Seleccionar todo
ORG $CA749C //offset
label20: //Etiqueta que contiene el evento asignado en MiscBasedEvents.
_0x87// Código experimental (No se sabe que hace)
STAL 30 // Pausa entre la transición de un suceso.
ASMC 0x7A455 //Una hermosa subrutina ASM
STAL 10 //Pausa
ASMC 0x13FA5 //Una linda subrutina
STAL 80// Pausa
ASMC 0x6CCB9//Una linda subrutina
IFAT 0x1 0x7A47D // Código condicional
ASMC 0x20479//Una linda subrutina
ENIF 0x1 //Fin de la condición
ASMC 0xB2F95//Una linda subrutina
ENDA //Fin de la etiqueta label20
Código: Seleccionar todo
ORG $CA79FC// offset
label21: //Etiqueta
MOMA 0x0 // Código de movimiento manual.
Código: Seleccionar todo
ORG $CA7A10 //offset
label22: // Etiqueta
BLDT 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 1b 0b 0b 0b 0b 0b 0b 0b 0
BLDT 0b 0b 0b 1b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 1b 0b 0b 0b 0b 0
BLDT 0b 0b 1b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 1b 0b 0b 0b 0b 0
BLDT
Código: Seleccionar todo
ORG $CA7A30// offset
label23: // Etiqueta
BLDT 0b 1b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 1b 0b 0b 0b 0b 0b 0b 0b 0
BLDT 0b 0b 0b 1b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 1b 0b 0b 0b 0b 0
BLDT 1b 0b 0b 1b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 1b 1b 1b 0b 0b 0b 0b 0
BLDT
Igual que el de arriba, pero este es de Batta, que extraño que Lyn siempre es golpeada por Batta en su turno y luego evade y milagrosamente con un 1% de critico ataca a Batta y siempre será Golpe Critico, si dijiste que eres el tipo/a mas suertudo/a del mundo pues te equivocas ya que todo fue planeado para que Lyn siempre gane. Has vivido engañado/a xD
Código: Seleccionar todo
BeginningScene: //Etiqueta Principal de Eventos de Inicio
CMOF //Ubicación de cámara.
LOU1 EnemyUnitsENM //Carga de unidades
ENUN// Pausa entre códigos
ASMC 0x7A939 0x7A9D5 //Las hermosas subrutinas.
Código: Seleccionar todo
ORG $CA7A60 //offset
FADUCG 2 //Transición de escena
SHOWMAP// Muestra el mapa
TEXTCG 0x813 0x1 //Texto con un CG (Un fondo negro)
FADICG 0 //Transición de escena
HIDEMAP //Oculta el mapa
SHCG 0x0 //Cortes de escena
MUS1 0x3F //Música a tocar
FADUCG 2 //Transición de escena
SHOWMAP //Mostrar mapa
STAL 60 // Pausa
TEXTCG 0x814 0x1 //Texto en CG (Lyn con un tazón)
CGSTAL 16 // Pausa
FADI 4 // Transición de escena
HIDEMAP // Ocultar mapa
ASMC 0x7A95D //Otra hermosa subrutina
STAL 32 //Pausa
BACG 0x0 //Fondo de pantalla (Adentro del Ger de Lyn)
FADU 4 // Transición de escena
SHOWMAP // Muestra el mapa
TEX1 0x815 // Diálogos entre personajes
REBU //Remueve la burbuja de texto
MUEN 4 //Restaura música
REMA // Fin de texto
STAL 32 // Pausa
LOU1 AllyUnitsENM // Carga de unidades
ENUN // Pausa
STAL 64 //Pausa
MOVE 0x3 [14,9] // Mueve unidades (Lyn sale del Ger)
ENUN // Pausa
REPA 0x3 // Reaparece unidades (Lyn aparece)
FADI 16 // Transición de escena
HIDEMAP// Oculta mapa
BACG 0x0 //Muestra fondo de pantalla (Interior del Ger de Lyn)
FADU 16 // Transición de escena
SHOWMAP // Muestra mapa
MUS1 0x32 // Cambia música
TEX1 0x816 // Muestra texto entre personajes
REMA // Fin del texto
LOU1 AllyUnitsENM // Carga unidades
ENUN //Pausa
LOEV 0xCD 0x51 [14,9] // Carga unidad (Aparece Táctico Mark)
ENDA // Fin de la etiqueta
Código: Seleccionar todo
label12: // Etiqueta
SHOWMAP //Muestra mapa
MOVE 0xCD [14,7] //Mueve a Mark
ENUN // Pausa
TEX1 0x817 // Muestra texto
REMA // Fin del texto
IFTT 0x32 //Condición de Tutorial
_0x8A // Código Experimental
STAL 8 // Pausa
TEX6 0x5 [0,0] 0x818 // Texto en cuadro (como las instrucciones del tutorial)
_ASM0x42 0x83181 //Hermosa subrutina
ENIF 0x32 //Fin de la condición
MOVE 0xCD label21 // Movimiento manual
ENUN // Pausa
DISA 0xCD // Desaparecer unidades (Mark sale del mapa)
_IFTT2 0x1 0x63 //Condición del tutorial
ENUT 0x6 //Marcador de ID
_0xA3 // Código Experimental (Quita el comando FIN)
_0xA4 0x71 // Código Experimental
ENIF 0x63 //Fin de la condición
ENDA //Fin de la etiqueta
Código: Seleccionar todo
ORG $CA7CDC
label14:
_IFTT2 0x1 0x63
_0x8A
_0xA2 label23
ENIF 0x63
ENDA
ORG $CA8154
label15:
_0x8A
_0xA1 0x0
TEX1 0x81E
REMA
_0xA3
ENDA
label16:
_0x8A
_0xA1 0x0
_0xA3
ENDA
label17:
_0x8A
_0xA1 0x0
_0xA3
ENDA
label18:
_0x8A
_0xA1 0x0
TEX1 0x82E
REMA
_0xA3
ENDA
label19:
_0x8A
_0xA1 0x0
_0xA3
ENDA
Código: Seleccionar todo
EndingScene: //Etiqueta principal de Eventos Finales
_0xA3 //Experimental
MUS1 0x38 //Cambia música
TEX1 0x833 // Muestra texto
REMA // Fin del texto
MUEN 6 // Restaura la música
FADICG 3 //Transición de escena
HIDEMAP // Oculta mapa
ASMC 0x7A939 0x7A8B9 0x7A9D5 //Las bellas subrutinas
ORG $CA821C // offset
STAL 30 // pausa
MUS1 0x3AB // Música
FADUCG 2 //Transición de escena
SHOWMAP // Muestra mapa
STAL 60 // Pausa
TEXTCG 0x834 0x1 // Texto en CG (Fondo negro)
MUEN 4 // Restaura música
FADI 16 // Transición de escena
HIDEMAP // Oculta mapa
ASMC 0x7A95D //Una linda subrutina
BACG 0x0 // Fondo de pantalla (Ger de Lyn)
MUS1 0x3F // Música
FADU 16 // Transición de escena
SHOWMAP //Muestra mapa
TEX1 0x835 // Muestra textos
MUEN 2 // Restaura música
STAL 32 // Pausa
MUS3 0x51 0x4 //Cambia música
MORETEXT 0x836 // Muestra texto consecutivo
MUEN 2 //Restaura música
STAL 32 // Pausa
MUS1 0x3F // Cambia música
MORETEXT 0x837 //Texto consecutivo
STAL 64 // Pausa
MORETEXT 0x838 // Texto consecutivo
IFTT 0x33 //Condición de Tutorial
FADI 4 // Transición
HIDEMAP // Oculta Mapa
BACG 0x5B // Muestra CG
FADU 4 // Transición
SHOWMAP // Muestra mapa
STAL 8 // Pausa
TEX6 0x5 [0,0] 0x839 // Texto en cuadro
_ASM0x42 0x83181 // Una hermosa subrutina
ELSE 0x34 // condición
ENIF 0x33 // Fin de la condición
FADI 4 // Transición
HIDEMAP //Oculta mapa
BACG 0x5B // Muestra CG
ENIF 0x34 // Fin de condición
MNCH 0x1 // Cambio de capitulo (Ir al capitulo 1)
STAL 1 // Pausa
_0x1 //Experimental
ENDA // Fin de evento
Código: Seleccionar todo
ORG $CC5B50
AllyUnitsENM: // Etiqueta principal de unidades aliadas
UNIT 0x3 0x2 0x0 0x8 [14,9] [13,7] [0x1,0x6B,0x6B,0x0] [0x0,0x0,0x0,0x0]
//UNIT = Código
// 0x3 = Unidad (En este caso Lyn)
//0x2 = Clase (Lord Lyn)
//0x0 = Liderazgo (inservible)
//0x8 = Nivel
//[14,9] = Coordenadas de carga [XX,YY]
//[13,7] = Coordenadas de inicio [XX,YY]
//[0x1,0x6B,0x6B,0x0] = Items (solo 4)
//[0x0,0x0,0x0,0x0] = Inteligencia Artificial (Solo enemigos y NPC)
UNIT// Fin de la etiqueta.
Ahí se encuentran los datos, solo recuerda que no puedes agregar mas unidades, solo modificar la que esta. Despliega la lista y solo coloca el hex donde corresponde. Claro esta que si haces eso tienes que modificar 2 códigos más si no habrá un error fatal.
Código: Seleccionar todo
UNIT 0x1 0x1 0x0 0x8 [14,9] [13,7] [0x1,0x9,0x3B,0x0] [0x0,0x0,0x0,0x0]//Eliwood
Esta línea hace que Lyn se mueva en la escena de inicio cuando sale a ver a los bandidos, el problema es que como Eliwood está en lugar de Lyn, cuando la memoria lee los datos que dicen “…mueve a Lyn a [14,9]” pero Lyn no existe ya que Eliwood la sustituye, por eso se produce el error. Para corregirlo solo sustituye la línea por esta: MOVE 0x1 [14,9]
Luego busca esta línea: REPA 0x3
Esto hace que Lyn reaparezca luego de regresar al Ger (en la escena de inicio), pasa lo mismo, la memoria lee “…reaparece a Lyn” pero Lyn nunca fue cargada si no que Eliwood. Corrige el error colocando esta línea: REPA 0x1
Código: Seleccionar todo
EnemyUnitsENM: //Etiqueta de las unidades enemigas.
UNIT 0x87 0x39 0x0 0x14 [3,2] [3,2] [0x1F,0x0,0x0,0x0] [0x3,0x3,0x9,0x20] //Batta
UNIT 0x88 0x39 0x87 0xC [2,6] [2,6] [0x1F,0x0,0x0,0x0] [0x0,0x0,0x9,0x0] // Forajido
UNIT //Fin de la etiqueta
Bien, esto son todos los evento que hay en Prologo, una vez que hemos visto y modificado todo, solo falta volver a ensamblar el evento. ¿Cómo hacerlo?
Asegurate que tengas el documento de texto (*****.txt) y la ROM en la misma carpeta donde esta el Event Assembler, llena los campos del Text y ROM y solo pulsa el botón Assemble.
Creo que ahora tendrás mas dudas que antes… xD Por el momento no hemos creado un evento desde cero pero ahora tienes la idea de cómo te quedará, no te desanimes ya que los eventos determinarán si tu Hack quedará en la historia o solo será olvidado. Recuerda que usando eventos no hay limite en lo que puedas hacer (claro, cosas reales).
Si quieres aprender que significan los códigos de algunos eventos (ya que en el Prologo no esta no la mitad de los códigos existentes o.O) pues revisa el documento llamado Event assembler language.txt se encuentra en la misma carpeta donde esta el Event Assembler, por desgracia para los de habla hispana (si estas leyendo este tutorial eres hispano xD) el documento esta en ingles, pero un buen traductor soluciona eso. Cuando revises un evento (que hayas desensamblado) y veas un código que no sabes que hace, entonces, búscalo (Ctrl + B en el Bloc de Notas) y así sabrás su utilidad. En teoría, ese documento (Event assembler language.txt) es un excelente tutorial, salvo por el problema que… No te dice donde colocar los códigos, a que etiqueta corresponden o la sintaxis consecutiva de cada uno.
En el próximo capítulo ya hablare de cómo crear un evento desde cero y por ende la creación de eventos 100% personalizados. Esto solo acaba de empezar.