Antes de empezar hay que aclarar que la palabra “eventos” se refiere a las personas, warps (entradas y salidas), señalamientos y localización de scripts de gatillo, ya que se puede confundir propiamente con agregar nuevos scripts a un mapa y no es asi.
Cada mapa en el juego se compone de un Primary Mapheader, que de este a su vez se deriva un Secondary Mapheader. El Primary Mapheader o Cabezal Primario define el Tileset, el spriteset, la música, el tipo de mapa (exterior o interior) y la tabla de pesca, mientras que el Secondary Mapheader o Cabezal Secundario define la localización del mapa, su tamaño, los bordes, las conexiones de mapa y el Script Header y el Event Header. Nosotros en este tutorial nos enfocaremos plenamente al Event Header.
Como ya se dijo en un principio el Event Header controla los eventos que ocurren dentro de un mapa, tales como el número de personas, dato que es importante saber si uno quiere agregar nuevos personajes a un mapa sin eliminar los existentes. También podemos modificar los Warps, o lo que es lo mismo, las entradas y salidas del mapa, por si queremos hacer algún patio trasero en una casa o agregar una cámara extra a una cueva.
Para conocer el Map Header de un mapa sugiero que usen Megamap ya que cuenta con una pestaña dedicada únicamente a esta característica.
Para nuestro tutorial usaremos como ejemplo la planta baja de nuestra casa en New Bark Town, la cual se ve así junto a su Cabezal Secundario.
Como podremos notar, el mapa se compone de lo siguiente:
3-Warps
4-Singpost (Letreros)
0-Triggers
3-People
Lo que nos interesa del map header, es la localización de los eventos, por eso en nuestra calculadora de offsets (Apoint) vamos a convertir el pointer a offset usando el Byte del Bank y los 2-Bytes del Event. Por lo tanto 60895B se convierten a 0x181B89.
Abrimos nuestro Rom en esa dirección con nuestro editor Hex.
Para saber que significan cada uno de los datos seguiremos la siguiente estructura:
00 00 [Number of warps] [Warp data][Number of triggers] [Trigger data][Number of signposts] [Signpost data][Number of people] [People data]
Cada Warp se compone de 5-Bytes que indican su ubicación en (Y y X) y a que mapa te llevan. Warp-To significa el numero del Warp dentro del mapa, ya que a cada warp se le asigna un numero en el juego para identificarlo.
Primero hay que aclarar que para que un Trigger funcione el mapa debe estar incluido en una tabla especial localizado en 0x94000. Number se refiere al Trigger (o estado) en que se encuentra un mapa para poder ser activado. Por ejemplo, si ponemos un Trigger en Number 0 y el mapa se encuentra en “0”, al pisar el Tile se activara automáticamente nuestro Trigger (como el que evita que salgamos de New Bark sin un pokemon), pero como el mapa sigue en “0”, cada vez que pisemos ese Tile se activara el Script de manera indefinida. Para eso se usa un comando dentro de los scripts que pone al mapa en “Trigger 1”, para asi evitar que se siga activando el script (como cuando recibes tu primer pokemon y puedes dejar New Bark). X-Y Position definen la posición dentro del mapa y Script pointer es el pointer donde se almacena el script que se activa al pisar el Tile.
Los Signposts no son mas que los letreros que vemos a la entrada de los pueblos o casas o en algunos elementos decorativos como libreros o TV. Otra función que cumplen es la de los ítems ocultos que hay en rutas y cuevas. El byte de Function se refiere a de que lado del letrero pueden ser leidos.
■ Funcion:
00 = Puede ser leído de todas las direcciones.
01 = Solo puede ser leído por debajo
02 = Solo puede ser leído por arriba
03 = Solo puede ser leído por derecha
04 = Solo puede ser leído por izquierda
05 = Si el Bit de la “BitTable1” esta activado el pointer se interpreta.
Script pointer to [2byte pointer to script]
06 = Si el Bit de la “BitTable1” NO esta activado el pointer se interpreta.
Script pointer to [2byte pointer to script]
07 = Si el Bit de la “BitTable1” esta activado se da un Item.
Script pointer to [Item no.]
08 = No hay acciones.
Script pointer to [??]
People Data:
[Picture] [Y from top+4] [X from left+4] [0-4 for regular, 6-9 for static facing][Movement][Clock-/Time setting (2byte)][Range of sight for trainers][2byte pointer to script][Flag. of BitTable1 (Hidden if set)(FFFF for none)(2byte)]
Las personas se componen de 13 Bytes y aunque parecen complejas, poco a poco iremos decifrando cada uno de sus bytes.
■Picture: Se refiere al Sprite o Overworld.
■Y-X setting: Define la poscion del sprite, recordando que se toma de la parte superior izquierda y se le suma +4.
■Facing setting: Define hacia que lado esta mirando el sprite.
Esta es una lista de movimientos facilitada por Mateo:
[SPOILER="Facing List"]
0 - Down
1 - Up
2 - Left
4 - Right
5 - Left/Right
6 - Down
7 - Up
8 - Left
9 - Right
10 - Look Around
12 - Person dances, disappears, and game crashes
18 - Faces down, then left when you enter map
20 - Walks off the screen in a zig-zag
21 - Big Snorlax Action
22 - Stand there and move (Used for Pokemon)
26 - Autocling *You cannot walk through the person like pikachu, so you can get stuck*
29 - Invisible, Causes Earthquakes
32 - Big Onix
35 - Person clings on top, and acts like grass animation
39 - Person is invisible, but still there
52 - Person goes nuts facing up and down
54 - Person can be walked on. No script + left
71 - Same as 54, but they are green
106 - Same as 35, but no auto cling + brown
116 - Same as 35, but below player
132 - Same as 35, but no auto cling + normal
146 - Invisible + Snorlax Size
■ Movement setting: numero de casillas que puede avanzar un sprite que se mueve.
■ Clock/Time setting:
Si el 1er. Byte <> FF, se trata de un ajuste de reloj.
Si el 1er. Byte = FF , se trata de un ajuste de tiempo.
■ Clock setting:
2do. Byte < Hora Actual < 1er.byte – El sprite permacera oculto mientras no sea la hora actual.
■ Time setting:
2do. byte debe sere 01, 02 o 04. 01 para mostrar por las mañanas, 02 para mostrar al medio dia y 04 para la noche.
Hay un maximo de 14 personas por mapa.
■ Color|Function setting:
Este Byte es un poco dificl dominarlo mediante hex, ya que se divide en 2 partes de 4 bits cada una.
Los primeros 4 bits definen el color:
00 = color estandard (de la tabla de Overworlds)
<> 00 = color de la paleta de sprites.
La segunda mitad de 4 bits determina la funcion:
00 = Script Regular : El pointer del Script te lleva a un Script
01 = Dar Item : El pointer del Script sigue esta estructura:
[Item no.][Amount]
Los eventos de este tipo deben de tener un Flag asignado o si no te pueden regular un item una y otra vez!
02 = Trainer: El pointer del Script sigue esta estructura:
[Flag (2byte)][Trainer group][Trainer][2byte pointer to Text when seen]
[2byte pointer to text when trainer beaten][2byte pointer to script when lost (0000=Blackout)][2byte pointer to script if won/talked to again]
El Flag le dice al juego si has peleado con ese trainer o no. Para ver los Flags, deberas consultar este link o estr otro.
03 = No hace nada
04 = No hace nada
05 = No hace nada
06 = No hace nada
■Range of sight setting: Cuando se trata de entrenadores, es el numero de casillas que te pueden ver para retarte a pelear.
■Flag setting: El primer byte define el flag que al estar activado hace que nuestro sprite desaparesca, muy util si queremos bloquear entradas o caminos hasta que cierto evento se cumpla. El segundo byte debe ser 06 o 07 para que funcione. FF FF si no queremos que el Sprite se esconda.[/SPOILER]
Una vez explicado cada uno de estos aspectos, procedemos a volver a nuestro editor Hexadecimal y comprobar los datos o simplemente saber hasta dónde es que vamos a copiar la información para repuntearla.
Comenzamos en 0x181B89 y después de los doble 00 (00 00) hay un 03 que indica el numero de warps y como cada warp se compone de 5 bytes avanzamos 15 espacios. Después nos encontramos con un 00 que pertenece a los Triggers, como no hay triggers en el mapa el juego interpreta que ahí terminan los datos, así que el siguiente byte es el de los Singpost. 04 es el número de Singpost y como cada uno se compone de 5-Bytes avanzamos 20 espacios. El siguiente byte es 04, curioso… se supone que solo hay 3 Sprites dentro de la planta baja de tu casa, pero si revisas bien, veras que hay dos sprites encimados, por eso el “04”. Como cada Persona se compone de 13-bytes, avanzamos 52 espacios y vemos que los datos terminan en 0x181BE5.
Seleccionamos y copiamos de 0x181B89 a 0x181BE5 y lo pegamos en un espacio en blanco dentro de ese mismo banco. En mi caso será en 0x182670. Escribimos el pointer de la nueva ubicación porque lo necesitaremos posteriormente = [607066]
Como esta nueva ubicación nos permite agregar más datos, comenzaremos agregando otro warp a manera de puerta trasera y otra persona, como una mascota o algo asi. Tengan mucho cuidado de que siempre que agregan nuevos eventos, tener seleccionado y copiado los eventos posteriores, es decir, si voy a agregar más warps, SELECCIONO y COPIO los Singpost, Triggers y People para que no se pierda información del mapa.
Esta puerta trasera estará entre la escalera y el televisor, por lo que su ubicación será 07 en X y 00 en Y, recordando que va primero el byte de la Y y que el primer espacio siempre se cuenta como “0”; Este Warp nos llevara al “Warp 0”, del mapa 0A 06 que corresponde al Mart de Violet City. Los datos a agregar son 00 07 00 0A 06
Es momento de definir a la mascota o persona. La “Picture” será la 86, la cual corresponde a un Gengar; lo pondremos en la silla inferior derecha, junto a mama, la cual esta localizada en 07 en X y 04 en Y, sin embargo recuerden que hay que sumarle 4 a cada byte e invertir el orden de X-Y por Y-X, por lo que quedaría como 08 0B. Como quiero que mire hacia abajo uso 06 en el “facing”. Para Movement uso 00 por que no quiero que se mueva, sin embargo, podemos usar 22 para que haga los movimientos de un pokemon. En Clock/Time setting uso FF FF. Para Color/Function uso 00. Como no es un entrenador con el cual haya que pelear, en Range of sight pongo 00. En Pointer tengo que elegir 2 bytes para el nuevo script, algo que al hablarle diga “Odish!” o algo similar, pero para este ejemplo usare AA AA. Ojo: recuerden que esto NO es un pointer real. En Flag ponemos FF. Al final los datos del personaje o la mascota quedan de la siguiente manera: 86 08 0B 06 00 FF FF 00 00 AA AA FF FF
Agregamos todo en la sección correspondiente, teniendo cuidado de no sobrescribir datos y siguiendo siempre la estructura que ya vimos. Recuerden siempre modificar el NUMERO de elementos.
Al final noten como los números rojos indican el número de elementos que cambiaron, mientras que los azules indican los nuevos datos agregados.
Guardamos cambios en nuestro Editor Hex y solo nos queda una cosa, decirle al Rom donde se encuntran nuestros nuevos datos, osea, repuntear.
Recordemos que el pointer de nuestra nueva dirección es [607066], por lo que escribiremos los últimos 2-bytes en el espacio correspondiente en Megamap y guardamos cambios.
Al final tendremos un resultado como este:
Al final hemos logrado modificar la cantidad de eventos en un mapa determinado, lo cual nos permite un sinfín de posibilidades, como abrir nuevos espacios en lugares cerrados, agregar eventos de pokemon legendarios en cuevas, agregar un NPC con script de MART en el centro pokemon para tener CP iguales a los de nuevas generaciones, tener scripts de gatillo donde antes no había, en fin, un montón de etcéteras.
Recuerden que los warps tienen que estar localizados en un tile que tenga la "collision data" de warp, de lo contrario no funcionara.
Espero el tutorial haya sido de su agrado, cualquier duda no duden en preguntar (valga la redundancia).
PD1: En el resultado final, tuve un error en los bordes gráficos. No me explico por que. He hecho este procedimiento fácil unas 20 veces y nunca me había pasado algo así. Cuando lleven a cabo este tutorial háganlo en un mapa diferente esperando que no suceda este fallo.
PD2: Volví a escribir el tutorial de noche, así que si ven errores de redacción o de ortografía avísenme por favor.
Antes hacia este metodo con el de mateo, usando goldmap, pero este se ve mas completo, simplemente ss muy util, te invito a que sigas aportando con tutos como este
[Scroll=left]Saludos!!![/scroll]
Efectivamente, johtomap hace todo es sin sobreescribir datos, incluso nos ahorra mucho tiempo en la edicion. Lo unico que no hace es repuntear, eso tendriamos que hacerlo siempre manualmente o me equivoco?
nope, de hecho si repuntea y si se vuelven a añadir mas eventos y el espacio ya no alcanza vuelve a repuntear
edito: el problema viene cuando se insertan los tiles extendidos, que da error al abrir las opciones para hacer esto, por lo cual se tendria que usar este metodo
Primero que nada les recuerdo que no hagan topic chat que no quiero sancionar, gracias
===================================================
Acabo de probar el metodo de repunteo de johtomap y lo resumire en lo siguiente:
1. Efectivamente repuntea datos, pero al igual que en skeetendo publican tutos de cosas para las que hay herramientas, es VITAL conocer este metodo, pues no me fio al 100% de las herramientas.
2. En este momento se me ocurrio un metodo de hacer esto con mapas de tileset extendido, con megamap abrimos el mapa y le cambiamos el tileset a uno que no este extendido, guardamos y nos pasamos a johtomap, agegamos el ow y listo, solo quedaria volver a cambiar el tileset al original del mapa.