Este tutorial esta pensado para proporcionar al lector toda la información necesaria a la hora de trabajar con mapas. El tutorial contiene información sobre como modificar mapas existentes y crear nuevos mapas, como modificar el aspecto de la región y la localización de los mapas en ésta, y como conexionar mapas adyacentes corréctamente.
Para editar la apariencia de los mapas se emplean editores de mapas como son JohtoMap y GoldMap para Pokemon Gold / Silver, y CrystalMap para Pokemon Crystal. Como la edición del aspecto de mapas es muy intuitivo mediante la utilización de estas tools, nos centraremos en otros aspectos mas complicados.
Cada mapa viene identificado por dos equivalentes númericos de tamaño de byte: un equivalente que identifica el grupo al que pertenece el mapa, y un equivalente que permite distinguir entre mapas dentro de un mismo grupo. Hay 0x1A grupos diferentes mientras que la cantidad de mapas dentro de un mismo grupo es variable.
Un mapa viene definido por su Map Header y su Secondary Map Header y debe tener una entrada en ambos para existir como tal.
Map Header
Gold (U) / Silver (U): 0x94121
Crystal (U): 0x94034
Longitud de cada entrada: 0x09 bytes
Estructura
[Tileset][Permiso][Pointer a Secondary Map Header (2 bytes)]
[Localización en el Town Map][Música][Tiempo del día][Grupo de pesca]
Bank del Secondary Map Header
ROM bank en la que se encuentra el Secondary Map Header del mapa.
Tileset
Tileset usada por el mapa.
Permiso
Permisos ofrecidos por el mapa, tales como si es posible volar o montar en bicicleta.
01 - Ciudades y pueblos
02 - Rutas y exteriores
03 - Interiores
04 - Cuevas
06 - Portales
07 - Torres
Pointer a Secondary Map Header
Puntero de 2 bytes al Secondary Map Header del mapa (dentro de la ROM bank indicada por Bank del Secondary Map Header).
Localización en el Town Map
Localización del mapa en el Town Map visible en el Pokegear (ver la sección Localización en el Town Map para mas información).
Tiempo del día
Paleta usada por el mapa según el tiempo del día.
XXXXX000 - Cambia según el tiempo del día
XXXXX001 - Paleta de día (usada por interiores)
XXXXX010 - Paleta de noche (usada por cuevas)
XXXXX011 - Paleta de mañana
XXXXX100 - No hay luz. Se cambia a paleta de noche tras usar Flash
XXXXX101 - Cambia según el tiempo del día
XXXXX110 - Cambia según el tiempo del día
XXXXX111 - Cambia según el tiempo del día
Grupo de pesca
Indica que tabla de pesca tiene asignada el mapa (ver la sección Añadiendo Pokemon Salvajes para mas información).
Secondary Map Header
Gold (U) / Silver (U): 0x95B6D
Crystal (U): 0x94DD8
Longitud de cada entrada: 0x0C + (0x0C * Nº Conexiones) bytes
Estructura
[Altura][Anchura][Pointer a Block Data (3 bytes)]
[Pointer a Script Header (2 bytes)][Pointer a Event Header (2 bytes)]
Por cada conexión:
[Identificador de grupo del mapa destino][Identificador de mapa del mapa destino][Strip Pointer (2 bytes)]
[Strip destination (2 bytes)][Longitud del Strip][Anchura del mapa destino][Alineación vertical]
[Alineación horizontal][Ventana (2 bytes)]
Border Block
Bloque de relleno mostrado en pantalla por defecto cuando el mapa no cubre toda el área de visión de la ventana y no hay datos de otro mapa adyacente que mostrar. El bloque se toma del tileset utilizado por el mapa en que nos encontramos.
Altura
Numero de bloques que tiene mapa en el eje Y.
Anchura
Numero de bloques que tiene mapa en el eje X.
Pointer a Block Data (3 bytes)
Puntero de 3 bytes al Block Data del mapa.
Bank del Script Header y del Event Header
ROM bank en la que se encuentan el Script Header y el Event Header del mapa.
Pointer a Script Header (2 bytes)
Puntero de 2 bytes al Script Header del mapa (dentro de la ROM bank indicada por Bank del Script Header y del Event Header).
Pointer a Event Header (2 bytes)
Puntero de 2 bytes al Event Header del mapa (dentro de la ROM bank indicada por Bank del Script Header y del Event Header).
Byte de conexión
Indica la cantidad y tipo de conexiones del mapa.
00 = Sin Conexiones
01 = Este
02 = Oeste
03 = Oeste + Este
04 = Sur
05 = Sur + Este
06 = Sur + Oeste
07 = Sur + Oeste + Este
08 = Norte
09 = Norte + Este
0A = Norte + Oeste
0B = Norte + Oeste + Este
0C = Norte + Sur
0D = Norte + Sur + Este
0E = Norte + Sur + Oeste
0F = Norte + Sur + Oeste + Este
Si hay mas de una conexión, estás deben ordenarse NORTE | SUR | OESTE | ESTE
(Ver la sección Conectando Mapas para mas información)
Identificador de grupo del mapa destino
Identificador de grupo del mapa al cual el mapa en en que nos encontramos se conecta.
Identificador de mapa del mapa destino
Identificador de mapa del mapa al cual el mapa en en que nos encontramos se conecta.
Strip Pointer (2 bytes)
Puntero del Strip en la ROM.
Strip destination (2 bytes)
Destino del Strip en la RAM.
Longitud del Strip
Número de bloques que cubre el Strip a lo largo.
Anchura del mapa destino
Numero de bloques que tiene el mapa en el eje X.
Alineación vertical
Posición relativa en el eje Y tras entrar en el mapa destino (en bloques).
Alineación horizontal
Posición relativa en el eje X tras entrar en el mapa destino (en bloques).
Ventana
Parte del mapa que se visualiza en la pantalla tras entrar en el mapa destino.
Localización en el Town Map
Esta sección es una ampliación a la entrada del Map Header Localización en el Town Map.
La posición de cada mapa individual en el mapa global (Town Map) mostrado en el Pokegear viene determinado por una tabla con la siguiente estructura y localización:
[Coordenada X][Coordenada Y][Pointer al nombre del mapa (2 bytes)]
Gold (U) / Silver (U): 0x92383
Crystal (U): 0x1CA8C3
Longitud de cada entrada: 0x04 bytes
El orden de los mapas en la tabla, que coincide con el orden según el cual nos desplazamos en el Pokegear, es el siguiente:
00 - Special
01 - New Bark Town
02 - Route 29
03 - Cherrygrove City
04 - Route 30
05 - Route 31
06 - Violet City
07 - Sprout Tower
08 - Route 32
09 - Ruins of Alph
0A - Union Cave
0B - Route 33
0C - Azalea Town
0D - Slowpoke Well
0E - Ilex Forest
0F - Route 34
10 - Goldenrod City
11 - Radio Tower
12 - Route 35
13 - National Park
14 - Route 36
15 - Route 37
16 - Ecruteak City
17 - Tin Tower
18 - Burned Tower
19 - Route 38
1A - Route 39
1B - Olivine City
1C - Lighthouse
1D - Route 40
1E - Whirl Islands
1F - Route 41
20 - Cianwood City
21 - Route 42
22 - Mt. Mortar
23 - Mahogany Town
24 - Route 43
25 - Lake of Rage
26 - Route 44
27 - Ice Path
28 - Blackthorn City
29 - Dragon's Den
2A - Route 45
2B - Dark Cave
2C - Route 46
2D - Silver Cave
2E - Pallet Town
2F - Route 1
30 - Viridian City
31 - Route 2
32 - Pewter City
33 - Route 3
34 - Mt. Moon
35 - Route 4
36 - Cerulean City
37 - Route 24
38 - Route 25
39 - Route 5
3A - Underground
3B - Route 6
3C - Vermilion City
3D - Diglett Cave
3E - Route 7
3F - Route 8
40 - Route 9
41 - Rock Tunnel
42 - Route 10
43 - Power Plant
44 - Lavender City
45 - Lav. Radio Tower
46 - Celadon City
47 - Saffron City
48 - Route 11
49 - Route 12
4A - Route 13
4B - Route 14
4C - Route 15
4D - Route 16
4E - Route 17
4F - Route 18
50 - Fuschia City
51 - Route 19
52 - Route 20
53 - Seafoam Islands
54 - Cinnabar Island
55 - Route 21
56 - Route 22
57 - Victory Road
58 - Route 23
59 - Indigo Plateau
5A - Route 26
5B - Route 27
5C - Tohjo Falls
5D - Route 28
5E - Fast Ship
00 - Special
01 - New Bark Town
02 - Route 29
03 - Cherrygrove City
04 - Route 30
05 - Route 31
06 - Violet City
07 - Sprout Tower
08 - Route 32
09 - Ruins of Alph
0A - Union Cave
0B - Route 33
0C - Azalea Town
0D - Slowpoke Well
0E - Ilex Forest
0F - Route 34
10 - Goldenrod City
11 - Radio Tower
12 - Route 35
13 - National Park
14 - Route 36
15 - Route 37
16 - Ecruteak City
17 - Tin Tower
18 - Burned Tower
19 - Route 38
1A - Route 39
1B - Olivine City
1C - Lighthouse
1D - Battle Tower
1E - Route 40
1F - Whirl Islands
20 - Route 41
21 - Cianwood City
22 - Route 42
23 - Mt. Mortar
24 - Mahogany Town
25 - Route 43
26 - Lake of Rage
27 - Route 44
28 - Ice Path
29 - Blackthorn City
2A - Dragon's Den
2B - Route 45
2C - Dark Cave
2D - Route 46
2E - Silver Cave
2F - Pallet Town
30 - Route 1
31 - Viridian City
32 - Route 2
33 - Pewter City
34 - Route 3
35 - Mt. Moon
36 - Route 4
37 - Cerulean City
38 - Route 24
39 - Route 25
3A - Route 5
3B - Underground
3C - Route 6
3D - Vermilion City
3E - Diglett Cave
3F - Route 7
40 - Route 8
41 - Route 9
42 - Rock Tunnel
43 - Route 10
44 - Power Plant
45 - Lavender City
46 - Lav. Radio Tower
47 - Celadon City
48 - Saffron City
49 - Route 11
4A - Route 12
4B - Route 13
4C - Route 14
4D - Route 15
4E - Route 16
4F - Route 17
50 - Route 18
51 - Fuschia City
52 - Route 19
53 - Route 20
54 - Seafoam Islands
55 - Cinnabar Island
56 - Route 21
57 - Route 22
58 - Victory Road
59 - Route 23
5A - Indigo Plateau
5B - Route 26
5C - Route 27
5D - Tohjo Falls
5E - Route 28
5F - Fast Ship
La diferencia entre Gold / Silver y Crystal es que Crystal contiene una entrada adicional entre Lighthouse y Route 40: Battle Tower.
La primera entrada ("SPECIAL") nos es irrelevante, por lo que utilizaremos como ejemplo la siguiente, que se corresponde con "NEW BARK TOWN". Si utilizamos Pokemon Gold / Silver como ROM base, veremos lo siguiente:
[0x94][0x74][0xFE][0x64]
0x94: Coordenada X en el Town Map
0x74: Coordenada Y en el Town Map
0xFE 0x64: Puntero de 2 bytes al nombre asignado a dichas coordenadas (es decir, la string con el nombre esta localizada en 0x924FE).
(Nota: Para modificar el aspecto del Town Map se recomienda utilizar la tool GSC Town Map Editor.)
Flypoints y Blackout Points
Los flypoints (posiciones de vuelo) y blackout points (posiciones de blackout) vienen determinados por una tabla con la siguiente estructura:
[Identificador de grupo del mapa][Identificador de mapa del mapa][Coordenada X][Coordenada Y]
donde las coordenadas X e Y se miden en half-blocks.
Su localización es:
Gold (U) / Silver (U): 0x15319
Crystal (U): 0x152AB
Longitud de cada entrada: 0x04 bytes
Esta tabla indica los mapas a los que se puede volar mediante en uso de la HM02 (Fly) con las coordenadas correspondientes en las que apareceremos en cada mapa, además de determinar los mapas y posiciones de blackout. En este último caso, se tomará la entrada de la tabla que contenga el mapa cuyo PC (Pokemon Center) se visitó por última vez.
La primera entrada de la tabla coincide con la posición de inicio del juego, y será, ademas, la entrada utilizada si ocurre un blackout cuando no se ha visitado ningún PC aún. La segunda entrada apunta al PC de Viridian City, pero en realidad nunca se usa. A partir de aquí tendremos una entrada para cada mapa con PC.
Cada uno de los mapas con entrada en la tabla posee una flag que indica si es posible volar a dicho mapa o no. Estas flags de vuelo pertenecen a la BitTable2 y están localizadas en el rango [0034,004B] para Gold / Silver, y en el rango [0035,004C] para Crystal. Si la flag asociada a un determinado mapa está activada, será posible volar a dicho mapa. Estas flags se activan inmediatamente al entrar a cada mapa en cuestión, mediante un Callback y la instrucción SetBit2 cuya estructura es [0x34][Flag (2 bytes)]. En otras palabras, es posible volar a un mapa una vez que éste haya sido visitado.
A continuación se muestra una lista con el formato Nº entrada en la tabla - Flag asociada - Nombre del mapa
00 - FFFF - Casa del jugador
01 - FFFF - Viridian City PC (No usada)
02 - 0034 - Pallet Town
03 - 0035 - Viridian City
04 - 0036 - Pewter City
05 - 0037 - Cerulean City
06 - 0038 - Rock Tunnel Outside
07 - 0039 - Vermilion City
08 - 003A - Lavender Town
09 - 003B - Saffron City
0A - 003C - Celadon City
0B - 003D - Fuchsia City
0C - 003E - Cinnibar Island
0D - 003F - Indigo Plateau
0E - 0040 - New Bark Town
0F - 0041 - Cherrygrove City
10 - 0042 - Violet City
11 - FFFF - Route 32
12 - 0043 - Azalea Town
13 - 0044 - Cianwood City
14 - 0045 - Goldenrod City
15 - 0046 - Olivine City
16 - 0047 - Ecruteak City
17 - 0048 - Mahogany Town
18 - 0049 - Lake of Rage
19 - 004A - Blackthorn City
1A - 004B - Silver Cave Outside
00 - FFFF - Casa del jugador
01 - FFFF - Viridian City PC (No usada)
02 - 0035 - Pallet Town
03 - 0036 - Viridian City
04 - 0037 - Pewter City
05 - 0038 - Cerulean City
06 - 0039 - Rock Tunnel Outside
07 - 003A - Vermilion City
08 - 003B - Lavender Town
09 - 003C - Saffron City
0A - 003D - Celadon City
0B - 003E - Fuchsia City
0C - 003F - Cinnibar Island
0D - 0040 - Indigo Plateau
0E - 0041 - New Bark Town
0F - 0042 - Cherrygrove City
10 - 0043 - Violet City
11 - FFFF - Route 32
12 - 0044 - Azalea Town
13 - 0045 - Cianwood City
14 - 0046 - Goldenrod City
15 - 0047 - Olivine City
16 - 0048 - Ecruteak City
17 - 0049 - Mahogany Town
18 - 004A - Lake of Rage
19 - 004B - Blackthorn City
1A - 004C - Silver Cave Outside
La tabla que vamos a ver a continuación relaciona las entradas correspondientes de la tabla vista en la sección Localización del Town Map (G/S: 0x92383 / C: 0x1CA8C3), con las entradas de la tabla vista recientemente en esta sección (G/S: 0x15319 / C: 0x152AB). Por tanto, es importante tener esta tabla en cuenta para que el Town Map mostrado al usar Fly se muestre consecuentemente a los cambios realizados en los flypoints.
Estructura:
[Nº entrada tabla 0x92383 / 0x1CA8C3][Nº entrada tabla 0x15319 / 0x152AB]
Localización:
Gold (U) / Silver (U): 0x91BCC
Crystal (U): 0x91C5E
Longitud de cada entrada: 0x02 bytes
Por ejemplo, la primera entrada de esta tabla es [0x01][0x0E]. Esta entrada implica que, en efecto, la posición en el Town Map correspondiente a New Bark Town (ver tabla G/S: 0x92383 / C: 0x1CA8C3) se corresponde con el flypoint de New Bark Town (ver tabla G/S: 0x15319 / C: 0x152AB). Del mismo modo, la segunda entrada de esta tabla, [0x03][0x0F], está relacionando las dos instancias de Cherrygrove City.
Ejemplo
Para este ejemplo tomaremos Pokemon Crystal como ROM base. Nótese que para aplicarlo a las versiones Gold / Silver tan solo tendríamos que ajustar el orden de las diferentes entradas de dichas tablas, y, por supuesto, usar los offsets indicados para Gold / Silver.
Vamos a suponer que queremos situar el flypoint / blackout point correspondiente a Cherrygrove City en Route 43. A primera vista esto no tiene mucho sentido, pero en caso de haber cambiado el aspecto de la región (o de haber creado una nueva región), es posible que hayamos convertido lo que originalmente era Route 43 en una ciudad o pueblo con PC.
Lo primero que debemos hacer es localizar la entrada de Cherrygrove City en la tabla 0x152AB. Para ello no tenemos mas que tener en cuenta la longitud de cada entrada. Como Cherrygrove City se encuentra en la entrada 0x0F y la primera entrada la hemos identificado como 0x00:
Lo primero que hacemos es ajustar los bytes identificadores de mapa. Tomamos los identificadores correspondientes a Route 43, de manera que nos queda:
[0x09][0x05][0x1D][0x04]
También deberiamos ajustar las coordenadas X e Y a nuestro nuevo mapa. Si quisiesemos seguir con la tendencia del juego original, ajustaríamos las coordenadas al half-block situado delante de la puerta del PC. Un ejemplo podría ser:
[0x09][0x05][0x11][0x0B]
Por último debemos modificar la entrada correspondiente de la tabla 0x91C5E para que el Town Map se muestre acorde a los cambios realizados al usar Fly. Como ya hemos visto, la entrada correspondiente a Cherrygrove City se encuentra en la segunda posición de dicha tabla. Si tuviesemos que encontar una entrada N cualquiera, tan solo tendríamos que aplicar la misma lógica que usamos para la tabla anterior. Es decir, si tomamos como referencia que la primera entrada se corresponde con 0x01:
0x91C5E + (N - 0x01) * 0x02
Nuestro caso es muy sencillo:
0x91C5E + (0x02 - 0x01) * 0x02 = 0x91C60
Esta entrada contiene los siguientes bytes:
[0x03][0x0F]
El segundo byte no lo modificamos ya que hace referencia a la entrada 0x0F de la tabla 0x152AB que acabamos de ajustar.
Sin embargo, debemos modificar el primero para que haga referencia a Route 43 en vez de a Cherrygrove City. Para ello, no tenemos mas que buscar la posición de Route 43 en la tabla 0x1CA8C3 vista en Localización en el Town Map. Como su posición es 0x25, la entrada de la tabla 0x91C5E modificada quedaría de la siguiente manera:
[0x25][0x0F]
Conectando Mapas
A la hora de conectar dos mapas adyacentes debemos establecer una conexión en ambos mapas y debemos tener en cuenta, para las dos conexiones, los siguientes parámetros:
Identificador de grupo del mapa destino
Identificador de mapa del mapa destino
Strip Pointer
Srip Destination
Longitud del Strip
Anchura del mapa destino
Alineación vertical
Alineación horizontal
Ventana
En el caso de que los dos mapas esten conectados mediante un Warp, los siguientes parámetros son irrelevantes:
Alineación vertical
Alineación horizontal
Ventana
Si además el mapa destino no es visible desde ningún punto del mapa origen, todos los parámetros son irrelevantes y no es necesario definir la conexión en esa dirección.
(Nota: en esta subsección, todas las medidas de longitud se toman en bloques, y todos los calculos están realizados en numeración hexadecimal.)
Identificando el Strip
El Strip es una tira que cubre todo el rango de visión del mapa destino desde cualquier punto del mapa origen. Debido al tamaño de la ventana mostrada en pantalla, se tiene que tomas un margen de 3 bloques tanto a lo largo como a lo ancho siempre que sea necesario.
Strip Pointer
Puntero al bloque de menor offset del Strip.
Strip Destination
Se calcula de la siguiente manera, dependiendo del tipo de conexión:
Norte: C703 + X + V
Oeste: C700 + (w+6) * (Y+3) + V
Sur: C703 + (h+3) * (w+6) + X + V
Este: C6FD + (w+6) * (Y+4) + V
Donde:
h: Altura del mapa origen
w: Anchura del mapa origen
Y: Offset vertical
X: Offset horizontal
V: 0 para Pokemon Gold / Silver y 100 para Pokemon Crystal
Alineación vertical
Se calcula de la siguiente manera, dependiendo del tipo de conexión:
Norte: (h*2) - 1
Oeste: (-2) * Y
Sur: 0
Este: (-2) * Y
Donde:
h: Altura del mapa destino
w: Anchura del mapa destino
Y: Offset vertical
X: Offset horizontal
Alineación horizontal
Se calcula de la siguiente manera, dependiendo del tipo de conexión:
Norte: (-2) * X
Oeste: (2*w) - 1
Sur: (-2) * X
Este: 0
Donde:
h: Altura del mapa destino
w: Anchura del mapa destino
Y: Offset vertical
X: Offset horizontal
Ventana
Se calcula de la siguiente manera, dependiendo del tipo de conexión:
Norte: C701 + (h) * (w+6) + V
Oeste: C706 + (2*w) + V
Sur: C707 + w + V
Este: C707 + w + V
Donde:
h: Altura del mapa destino
w: Anchura del mapa destino
Y: Offset vertical
X: Offset horizontal
V: 0 para Pokemon Gold / Silver y 100 para Pokemon Crystal
Ejemplo
Vamos a ver un ejemplo para cada tipo de conexión, tomando Pokemon Crystal como ROM base:
Origen: Cherrygrove City - Destino: Este a Route 29
Origen: Route 29 - Destino: Oeste a Cherrygrove City
Origen: Cherrygrove City - Destino: Norte a Route 30
Origen: Route 30 - Destino: Sur a Cherrygrove City
Se recomienda tomar esta imagen como referencia:
Origen: Cherrygrove City - Destino: Este a Route 29 (1)
Strip y Longitud del Strip
Identificamos el Strip como el área de Route 29 que puede verse desde Cherrygrove City, tomando como margen 3 bloques (Área 1). Su longitud es entonces el rango que cubre verticalmente, el cual coincide con la áltura de Route 29: 0x09.
Strip Pointer
Bloque de menor offset del Strip (SP1). Este bloque tiene como offset 0xA92D5. Por tanto, el Strip Pointer es 0xD5 0x52.
Strip Destination
En un editor de mapas podemos ver facilmente que la anchura de Cherrygrove City (w) es 0x14 y que su altura (h) es 0x09. Como el lado por el que se conectan los mapas tiene el mismo tamaño en ambos mapas, el offset será nulo.
Hemos dicho ya que el offset Y es nulo. Por tanto, aplicando la fórmula (-2) * Y:
(-2) * 0 = 0
El byte de alineación vertical es 0x00.
Alineación horizontal
Como veíamos antes, el byte de alineación horizontal es siempre 0x00 para conexiones dirección este.
Ventana
Aplicamos la fórmula C707 + w + V, donde w es la anchura del mapa destino, es decir, Route 29. Por tanto, w es 0x1E.
C707 + 1E + 100 = C825
Invirtiendo los bytes del resultado obtenemos 0x25 0xC8.
Origen: Route 29 - Destino: Oeste a Cherrygrove City (2)
Strip y Longitud del Strip
El Strip es el área indicada por (Área 2) en la imagen. Se puede ver facilmetne que su longitud coincide con la del caso anterior: 0x09.
Strip Pointer
Bloque indicado en la imagen por (SP2). Su offset es 0xACE20. Por tanto, el Strip Pointer es 0x20 0x4E.
Strip Destination
Tomando la altura (h=0x09) y anchura (w=0x1E) de Route 29, teniendo en cuenta que no hay offset, y aplicando la fórmula vista para la dirección oeste obtenemos:
C700 + (1E+6) * (0+3) + 100= C86C
Esto equivale a un Strip Destination de 0x6C 0xC8.
Alineación vertical
(-2) * Y = (-2) * 0 = 0
El byte de alineación vertical es 0x00.
Alineación horizontal
Tomamos (w*2) - 1 con w = 0x14 (anchura de Cherrygrove City).
El byte de alineación horizontal resultante es 0x27
Ventana
Aplicamos la fórmula C706 + (2*w) + V, donde w es 0x14 y V lo consideramos 0x100 por tratarse de Pokemon Crystal.
Invertimos el resultado y obtenemos 0x2E 0xC8.
Origen: Cherrygrove City - Destino: Norte a Route 30 (3)
Strip y Longitud del Strip
La longitud del Strip (Área 3) coincide con el ancho de Route 30: 0x0A
Strip Pointer
0xE7 0x60 (SP3).
Strip Destination
La fórmula a aplicar es: C703 + X + V, donde X es el offset horizontal.
Para calcular el offset en X tomamos el extremo izquierdo del mapa origen y el extremo izquierdo del Strip en el mapa destino, y contamos la cantidad de bloques que el segundo esta desplazado respecto del primero (ver imagen). En este caso, el número de "espacios tamaño bloque" es igual a 5.
La fórmula queda por tanto C703 + 5 + 100, lo que da un Strip Destination de 0x08 0xC8.
Si, por contra, tuviésemos una conexión de mapas horizontal, e hiciera falta calcular el offset en Y, tomaríamos los extremos de arriba como referencia.
El resto de parámetros se calcularían de una forma similar a lo visto en los ejemplos anteriores, pero tomando las fórmulas correspondientes a dirección norte, y teniendo en cuenta que el offset horizontal tiene un valor de 5.
(Nótese que el offset vertical nunca está presente en las fórmulas de Norte | Sur y viceversa.)
Si cualquier fórmula diese un resultado negativo (menor que 0x00), se debe sumar 0x100 (256 en decimal) al resultado obtenido.
Origen: Route 30 - Destino: Sur a Cherrygrove City (4)
En este caso se van a detallar tan solo las diferencias significativas con respecto a los ejemplos anteriores.
A la hora de determinar el Strip, debemos tener en cuenta que estamos pasando verticalmente hacia un mapa mas ancho. Por tanto el Strip no solo debe cubrir el margen de 3 bloques vertical, sino que se deben añadir 3 bloques horizontalmente a ambos lados para cubrir todo el posible área de visión (ver imagen). Es facil de ver que la longitud del Strip sera entonces la anchura de Route 30 + 6, es decir, 0x10.
Para calcular el offset horizontal, al igual que en el ejemplo anterior, tomamos el extremo izquierdo del mapa origen y el extremo izquierdo del Strip en el mapa destino, y contamos la cantidad de bloques que el segundo esta desplazado respecto del primero (ver imagen). En este caso, el Strip del mapa destino (Cherrygrove City) comienza tres bloques mas a la izquierda ("antes") que el mapa origen (Route 30), lo que significa que tenemos que manejar un offset en X de -3.
Este offset de valor -3 nos sirve para calcular el Strip Destination, pero para calcular la alineacion horizontal, alineación vertical y ventana (parámetros que no están relacionados con el Strip), el offset horizontal es diferente. En este caso, no debemos tomar el extremo izquierdo del Strip, sino el extremo izquierdo del mapa completo, lo que nos da un offset de -5 (ver imagen). En el ejemplo (3) no existía diferencia entre el offset para el Strip Destination y el offset para los parámetros posteriores, ya que la posición en la que empezaba el Strip coincidía con la posición en la que empezaba el mapa (ver imagen).
Añadiendo Pokemon Salvajes
Pokemon salvajes "de suelo"
Aunque resulta muy sencillo editar este tipo Pokemon salvajes mediante una tool como el GSC Wild Pokemon Editor, resulta útil tener conocimientos sobre este tema para poder asignar datos de Pokemon salvajes a diferentes mapas.
(Nota: A partir de ahora en esta subsección se concreta el termino Pokemon Salvajes a tan solo los Pokemon "de suelo", es decir, Pokemon que aparecen en la hierba alta o en cuevas o torres.)
La estructura que siguen los datos de los Pokemon salvajes es la siguiente:
[Identificador de grupo][Identificador de mapa][Prob. encuentro mañana][Prob. encuentro día][Prob. encuentro noche][Datos de Pokemon]
donde la probabilidad de encuentro se calcula sobre 256. Los datos de Pokemon se organizan de la forma [Nivel][Pokemon], habiendo un total de 21 Pokemon (7 por cada tiempo del día). Por tanto, los datos de Pokemon salvajes de un mapa ocupan un total de 47 bytes de la memoria ROM. Las probabilidades de aparición de cada uno de los siete Pokemon en particular dependen del orden el que estén colocados, y son, aproximadamente las siguientes:
Los datos de Pokemon salvajes son muy extensos y en gran medida no es necesario tener una tabla con las localizaciones de los Pokemon salvajes de cada mapa. Hay maneras sencillas de localizar los Pokemon salvajes de un determinado mapa en la ROM; conociendo los porcentajes de encuentro del mapa, no habría mas que buscar los 5 primeros bytes de la estructura dentro de la bank 0x0A. Por otra parte, el propio GSC Wild Pokemon Editor nos muestra los offsets donde se encuentran los Pokemon salvajes de un mapa sin mas que guardar cambios en ese mapa. Una vez localizada la entrada buscada, no hay mas que modificar los identificadores de mapa si quisiéramos asignar los datos de Pokemon salvajes de un mapa a otro.
Pokemon de Surf
Los Pokemon salvajes que se pueden encontrar al usar Surf siguen unas característican similares, pero ocupan mucho menos espacio:
[Identificador de grupo][Identificador de mapa][Prob. encuentro][Datos de Pokemon]
En este caso no se distingue en en función del tiempo del día, y, ademas solo hay 3 Pokemon asignados a cada mapa para un total de 9 bytes por entrada.
Los dos primeros Pokemon que introduzcamos aparecerán en el rango de niveles [L,L+4] y el tercer Pokemon podrá aparecer en el rango [L,L+1], donde L es el nivel introducido. Las doce posibilidades resultantes tienen una probabilidad similar de darse en un encuentro con un Pokemon salvaje de Surf.
La busqueda de los datos de Pokemon de Surf puede ser algo mas complicada, pero la tool GSC Wild Pokemon Editor también nos puede mostrar sus localizaciones si fuese necesario.
Pokemon de Headbutt y Rock Smash
Existen 12 tablas diferentes que contienen datos de Pokemon que aparecen al utilizar la TM Headbutt en uno de los árboles permitidos. Adicionalmente, existe una decimotercera tabla situada en la última posición que contiene los datos de Pokemon encontrados al usar Rock Smash en las rocas correspondientes. La localización de la primera tabla es:
Gold (U) / Silver (U): 0xBA47C
Crystal (U): 0xB82FA
Longitud de cada tabla: 0x13 bytes
Los punteros a cada una de las tablas se encuentran situadas justo antes de éstas.
WildTreeMonTable1:
db 50, SPEAROW, 10
db 15, SPEAROW, 10
db 15, SPEAROW, 10
db 10, AIPOM, 10
db 5, AIPOM, 10
db 5, AIPOM, 10
db $ff ; end
WildTreeMonTable2:
db 50, SPEAROW, 10
db 15, HERACROSS, 10
db 15, HERACROSS, 10
db 10, AIPOM, 10
db 5, AIPOM, 10
db 5, AIPOM, 10
db $ff ; end
WildTreeMonTable3:
db 50, SPEAROW, 10
db 15, EKANS, 10
db 15, SPEAROW, 10
db 10, AIPOM, 10
db 5, AIPOM, 10
db 5, AIPOM, 10
db $ff ; end
WildTreeMonTable4:
db 50, SPEAROW, 10
db 15, HERACROSS, 10
db 15, HERACROSS, 10
db 10, AIPOM, 10
db 5, AIPOM, 10
db 5, AIPOM, 10
db $ff ; end
WildTreeMonTable5:
db 50, HOOTHOOT, 10
db 15, SPINARAK, 10
db 15, LEDYBA, 10
db 10, EXEGGCUTE, 10
db 5, EXEGGCUTE, 10
db 5, EXEGGCUTE, 10
db $ff ; end
WildTreeMonTable6:
db 50, HOOTHOOT, 10
db 15, PINECO, 10
db 15, PINECO, 10
db 10, EXEGGCUTE, 10
db 5, EXEGGCUTE, 10
db 5, EXEGGCUTE, 10
db $ff ; end
WildTreeMonTable7:
db 50, HOOTHOOT, 10
db 15, EKANS, 10
db 15, HOOTHOOT, 10
db 10, EXEGGCUTE, 10
db 5, EXEGGCUTE, 10
db 5, EXEGGCUTE, 10
db $ff ; end
WildTreeMonTable8:
db 50, HOOTHOOT, 10
db 15, PINECO, 10
db 15, PINECO, 10
db 10, EXEGGCUTE, 10
db 5, EXEGGCUTE, 10
db 5, EXEGGCUTE, 10
db $ff ; end
WildTreeMonTable9:
db 50, HOOTHOOT, 10
db 15, VENONAT, 10
db 15, HOOTHOOT, 10
db 10, EXEGGCUTE, 10
db 5, EXEGGCUTE, 10
db 5, EXEGGCUTE, 10
db $ff ; end
WildTreeMonTable10:
db 50, HOOTHOOT, 10
db 15, PINECO, 10
db 15, PINECO, 10
db 10, EXEGGCUTE, 10
db 5, EXEGGCUTE, 10
db 5, EXEGGCUTE, 10
db $ff ; end
WildTreeMonTable11:
db 50, HOOTHOOT, 10
db 15, PINECO, 10
db 15, PINECO, 10
db 10, NOCTOWL, 10
db 5, BUTTERFREE, 10
db 5, BEEDRILL, 10
db $ff ; end
WildTreeMonTable12:
db 50, HOOTHOOT, 10
db 15, CATERPIE, 10
db 15, WEEDLE, 10
db 10, HOOTHOOT, 10
db 5, METAPOD, 10
db 5, KAKUNA, 10
db $ff ; end
WildRockMonTable:
db 90, KRABBY, 15
db 10, SHUCKLE, 15
db $ff ; end
La tabla que asigna una tabla de Headbutt a cada mapa está localizada en el offset 0xBA3E6 en Pokemon Gold / Silver y en el offset 0xB825E en Pokemon Crystal. Para cada entrada, los dos primeros bytes identifican al mapa, y el tercero determina la tabla de Headbutt asignada a dicho mapa. Al final de esta tabla se puede encontrar una nueva tabla que, del mismo modo, indica que mapas tienen asignada la tabla correspondiente a los Pokemon de Rock Smash.
Dependiendo del tiempo del día determinados Pokemon caerán dormidos del árbol al usar Headbutt. La tabla que determina que Pokemon y cuando lo harán está situada en el offset 0x3E9F3 en las versiones Gold / Silver y en el offset 0x3EBB5 en la versión Crystal. La tabla posee la siguiente estructura:
Como vimos al principio del tutorial, los Pokemon salvajes que aparecen al pescar dependen de la tabla que tenga asignada cada mapa en su Map Header. Existen un total de 12 tablas o grupos de pesca, e incluyen datos correspondientes a las tres cañas de pescar (Old Rod, Good Rod, y Super Rod).
La localización de la primera tabla es la siguiente:
Además de las 12 tablas de pesca existe una tabla adicional (TimeFishGroups) que contiene datos de Pokemon que tan solo aparecen en un determinado tiempo del día.
Si [Pokemon] =/= 0x00:
[Porcentaje aparición acumulado][Pokemon][Nivel]
Si [Pokemon] = 0x00:
[Porcentaje aparición acumulado][0x00][Entrada de TimeFishGroups]
[Pokemon de día][Nivel][Pokemon de noche][Nivel]
FishGroup1:
FishGroup1_Old:
db $b3, MAGIKARP, 10
db $d9, MAGIKARP, 10
db $ff, KRABBY, 10
FishGroup1_Good:
db $59, MAGIKARP, 20
db $b2, KRABBY, 20
db $e6, KRABBY, 20
db $ff, $0, 0
FishGroup1_Super:
db $66, KRABBY, 40
db $b2, $0, 1
db $e6, KRABBY, 40
db $ff, KINGLER, 40
FishGroup2:
FishGroup2_Old:
db $b3, MAGIKARP, 10
db $d9, MAGIKARP, 10
db $ff, TENTACOOL, 10
FishGroup2_Good:
db $59, MAGIKARP, 20
db $b2, TENTACOOL, 20
db $e6, CHINCHOU, 20
db $ff, $0, 2
FishGroup2_Super:
db $66, CHINCHOU, 40
db $b2, $0, 3
db $e6, TENTACRUEL, 40
db $ff, LANTURN, 40
FishGroup3:
FishGroup3_Old:
db $b3, MAGIKARP, 10
db $d9, MAGIKARP, 10
db $ff, GOLDEEN, 10
FishGroup3_Good:
db $59, MAGIKARP, 20
db $b2, GOLDEEN, 20
db $e6, GOLDEEN, 20
db $ff, $0, 4
FishGroup3_Super:
db $66, GOLDEEN, 40
db $b2, $0, 5
db $e6, MAGIKARP, 40
db $ff, SEAKING, 40
FishGroup4:
FishGroup4_Old:
db $b3, MAGIKARP, 10
db $d9, MAGIKARP, 10
db $ff, POLIWAG, 10
FishGroup4_Good:
db $59, MAGIKARP, 20
db $b2, POLIWAG, 20
db $e6, POLIWAG, 20
db $ff, $0, 6
FishGroup4_Super:
db $66, POLIWAG, 40
db $b2, $0, 7
db $e6, MAGIKARP, 40
db $ff, POLIWAG, 40
FishGroup5:
FishGroup5_Old: ;
db $b3, MAGIKARP, 10
db $d9, MAGIKARP, 10
db $ff, MAGIKARP, 10
FishGroup5_Good:
db $59, MAGIKARP, 20
db $b2, MAGIKARP, 20
db $e6, MAGIKARP, 20
db $ff, $0, 8
FishGroup5_Super:
db $66, MAGIKARP, 40
db $b2, $0, 9
db $e6, MAGIKARP, 40
db $ff, DRAGONAIR, 40
FishGroup6:
FishGroup6_Old:
db $b3, MAGIKARP, 5
db $d9, MAGIKARP, 5
db $ff, QWILFISH, 5
FishGroup6_Good:
db $59, MAGIKARP, 20
db $b2, QWILFISH, 20
db $e6, QWILFISH, 20
db $ff, $0, 10
FishGroup6_Super:
db $66, QWILFISH, 40
db $b2, $0, 11
db $e6, QWILFISH, 40
db $ff, QWILFISH, 40
FishGroup7:
FishGroup7_Old:
db $b3, MAGIKARP, 10
db $d9, MAGIKARP, 10
db $ff, REMORAID, 10
FishGroup7_Good:
db $59, MAGIKARP, 20
db $b2, REMORAID, 20
db $e6, REMORAID, 20
db $ff, $0, 12
FishGroup7_Super:
db $66, REMORAID, 40
db $b2, $0, 13
db $e6, REMORAID, 40
db $ff, REMORAID, 40
FishGroup8:
FishGroup8_Old:
db $b3, MAGIKARP, 10
db $d9, MAGIKARP, 10
db $ff, MAGIKARP, 10
FishGroup8_Good:
db $59, MAGIKARP, 20
db $b2, MAGIKARP, 20
db $e6, MAGIKARP, 20
db $ff, $0, 14
FishGroup8_Super:
db $66, MAGIKARP, 40
db $b2, $0, 15
db $e6, MAGIKARP, 40
db $ff, MAGIKARP, 40
FishGroup9:
FishGroup9_Old:
db $b3, MAGIKARP, 10
db $d9, MAGIKARP, 10
db $ff, MAGIKARP, 10
FishGroup9_Good:
db $59, MAGIKARP, 10
db $b2, MAGIKARP, 10
db $e6, MAGIKARP, 10
db $ff, $0, 16
FishGroup9_Super:
db $66, MAGIKARP, 10
db $b2, $0, 17
db $e6, MAGIKARP, 10
db $ff, DRAGONAIR, 10
FishGroup10:
FishGroup10_Old:
db $b3, MAGIKARP, 10
db $d9, MAGIKARP, 10
db $ff, KRABBY, 10
FishGroup10_Good:
db $59, MAGIKARP, 20
db $b2, KRABBY, 20
db $e6, KRABBY, 20
db $ff, $0, 18
FishGroup10_Super:
db $66, KRABBY, 40
db $b2, $0, 19
db $e6, KINGLER, 40
db $ff, SEADRA, 40
FishGroup11:
FishGroup11_Old:
db $b3, MAGIKARP, 10
db $d9, MAGIKARP, 10
db $ff, TENTACOOL, 10
FishGroup11_Good:
db $59, MAGIKARP, 20
db $b2, TENTACOOL, 20
db $e6, TENTACOOL, 20
db $ff, $0, 20
FishGroup11_Super:
db $66, TENTACOOL, 40
db $b2, $0, 21
db $e6, MAGIKARP, 40
db $ff, QWILFISH, 40
FishGroup12:
FishGroup12_Old:
db $b3, MAGIKARP, 10
db $d9, MAGIKARP, 10
db $ff, POLIWAG, 10
FishGroup12_Good:
db $59, MAGIKARP, 20
db $b2, POLIWAG, 20
db $e6, POLIWAG, 20
db $ff, $0, 6
FishGroup12_Super:
db $66, POLIWAG, 40
db $b2, $0, 7
db $e6, MAGIKARP, 40
db $ff, REMORAID, 40
TimeFishGroups:
; 0
db CORSOLA, 20 ; nite
db STARYU, 20 ; day
; 1
db CORSOLA, 40 ; nite
db STARYU, 40 ; day
; 2
db SHELLDER, 20 ; nite
db SHELLDER, 20 ; day
; 3
db SHELLDER, 40 ; nite
db SHELLDER, 40 ; day
; 4
db GOLDEEN, 20 ; nite
db GOLDEEN, 20 ; day
; 5
db GOLDEEN, 40 ; nite
db GOLDEEN, 40 ; day
; 6
db POLIWAG, 20 ; nite
db POLIWAG, 20 ; day
; 7
db POLIWAG, 40 ; nite
db POLIWAG, 40 ; day
; 8
db DRATINI, 20 ; nite
db DRATINI, 20 ; day
; 9
db DRATINI, 40 ; nite
db DRATINI, 40 ; day
; 10
db QWILFISH, 20 ; nite
db QWILFISH, 20 ; day
; 11
db QWILFISH, 40 ; nite
db QWILFISH, 40 ; day
; 12
db REMORAID, 20 ; nite
db REMORAID, 20 ; day
; 13
db REMORAID, 40 ; nite
db REMORAID, 40 ; day
; 14
db GYARADOS, 20 ; nite
db GYARADOS, 20 ; day
; 15
db GYARADOS, 40 ; nite
db GYARADOS, 40 ; day
; 16
db DRATINI, 10 ; nite
db DRATINI, 10 ; day
; 17
db DRATINI, 10 ; nite
db DRATINI, 10 ; day
; 18
db HORSEA, 20 ; nite
db HORSEA, 20 ; day
; 19
db HORSEA, 40 ; nite
db HORSEA, 40 ; day
; 20
db TENTACOOL, 20 ; nite
db TENTACOOL, 20 ; day
; 21
db TENTACOOL, 40 ; nite
db TENTACOOL, 40 ; day
Uaaa cuanta información, se agradece mucho, si vas a hacer una guia de GBC es una gran noticia ya que no hay tanta informacion en castellano :D, la seguiré de cerca, y gracias por este primer tutorial, espero poder ver muchos mas!
Muchas cosas son faciles de enteneder, otras tantas no estaban bien explicadas en otras webs, pero veo que aqui si esta toda la informacion.
Me surgen algunas dudas que quizas puedas responder.
1.-Donde se encuentran los identificadores de grupo?
2.-Hace tiempo pense en modificar el numero de mapas que tiene cada grupo, pero hay algun riesgo si modifico esa informacion?
3.-En el byte de "permiso", supongo que el de los portales se refiere a las casetas que unen rutas y pueblos en donde puedes andar en bicicleta?
4.-No entendi muy bien lo de los grupos de pesca, si el byte del map header es igual a 0x00 entonces pertenece a un TimeFishGroups verdad?, pero como sabe a cual de todos los grupos pertenece?
Son equivalentes que el juego utiliza para "nombrar" a cada mapa. No es que exista una tabla o algo que relacione nombre con identificador, es solo que a lo que nosotros llamamos Olivine Pokecenter el lo reconoce como 0x01 0x01. El olivine pokecenter se distingue del ecruteak gym debido a los bloques utilizados para formar el mapa, el tamaño del mapa, los eventos etc., no debido a una tabla que relacione la forma en la que tu llamas al mapa con la forma que el juego reconoce dicho mapa.
2 -
Añadir un nuevo mapa supondria añadir una nueva entrada en los map headers y secondary map headers. Lo mas sencillo sería sobreescribir alguno de los mapas beta existentes como puede ser safari zone, aunque si piensas añadir muchos mapas entonces eso ya no será posible para todos ellos. Pero en realidad da igual que un mapa pertenezca a un grupo y a otro siempre y cuando lo identifiques correctamente.
3 - Si
4 -
FishGroup1_Good:
db $59, MAGIKARP, 20
db $b2, KRABBY, 20
db $e6, KRABBY, 20
db $ff, $0, 0
Primer caso: [Pokemon] = Magikarp
Entonces [%][Pokemon][Nivel]
Cuarto caso: [Pokemon] = $0 (= 0x00)
Entonces [%][0x00 (obviamente, ya que este byte es la condición señalada arriba)][Nº entrada TimeFishGroups]
En este caso la entrada tiene el valor 0, lo cual significa:
; 0
db CORSOLA, 20 ; nite (Noche: Corsola lv 20)
db STARYU, 20 ; day (Dia: Staryu lv 20)
Esto se esta convirtiendo en una enciclopedia, deberias dar clases en la universidad pokemon jaja
Una informacion muy detallada sobre las conexiones de mapas que de seguro me seran de gran ayuda cuando haga la reconstruccion de Hoenn en pokemon GOLD.
Sobre la respuesta 2 de arriba, segun entiendo los mapas betas no tienen Secondary y Primary Map header no? solo son los bytes del mapa en si, o me equivoco y si puedo usarlos para nuevas rutas? De cualquier forma no es problema, por que siempre podremos tomar una casa y convertirla en algo mas sin que se note en el juego.
Te recomiendo que vayas a los map_headers y second_map_headers de pokecrystal y busques la palabra "beta". Verás que hay alrededor de 12-15 (no se el numero exacto) mapas beta con entrada ambos map headers. Sin embargo ninguno de ellos tiene conexiones, por lo que depende para lo que quieras los mapas tendrías que repointear algunos second_map_headers para hacer hueco a las conexiones. Ademas ten cuidado porque, si no me equivoco, el block data indicado ahí como el portal beta de safari zone es común para todos los portales verticales que existen, asi que, aunque si puedes suprimir la entrada en los headers del portal beta de safari zone, ten cuidado de no modificar el block data!
EDIT: Por cierto, la parte 1 no está finalizada del todo todavía. Ya avisaré cuando esté!
Lamento en doble post pero es para actualizar el estado del tutorial y en concreto para avisar que la parte 1 correspondiente a mapas ya esta finalizada.
Como digo en la introducción este tutorial debería contener "toda la información necesaria a la hora de trabajar con mapas": " información sobre como modificar mapas existentes y crear nuevos mapas, como modificar el aspecto de la región y la localización de los mapas en ésta, y como conexionar mapas adyacentes corréctamente."
Pues bueno eso es todo, espero que os sirva de ayuda y que valga la pena el tiempo que me ha tomado, aunque es probable que llegue el dia que me sirva a mi de ayuda mas que a nadie! La verdad es que tener las ideas y conceptos ordenados a mi me viene muy bien, espero que a vosotros tambien!
Por cierto, no me pregunteis mucho sobre cuando tengo pensado hacer la parte 2, la verdad es que no lo he pensado todavía, pero ya llegará :P
Pues bueno, felicidades por una guia tan completa.
Muy util la parte de los pokemon salvajes, justo lo que necesitaba desde que inicie en esto, ya que al no haber informacion al respecto no podia reemplazar pokemones acuaticos por no querer que me aparecieran pokemon de suelo surfeando.
De seguro me surgiran dudas cuando empieze a afinar los detalles de mi hack, hasta entonces estas libre de preguntas jaja
Pues bien, por fin heche mano a parte de la informacion expuesta aqui, especificamente tablas de pesca y Headbutt.
Note cosas un poco raras en las tablas de pesca con respecto a las de Crystal donde quizas me puedas apoyar [MENTION=28012]Crystal_[/MENTION]. Revisando la asignacion de tablas a cada mapa, noto que las tablas mas usadas (en el caso de pokemon GOLD) son 3, la tabla 0x0, 0x1 y 0x2; se usa tambien mucho la tabla 0x5 pero comparte el mismo pointer que la 0x0, asi que no cuenta... En fin, siguiendo los pointers de dichas tablas me encuentro los datos siguientes:
Como podras ver en ningun momento se habla de Heracroos ni Ekans en ellas, pokemon que segun Wikidex y Bulbapedia aparecen en los arboles. He ledio por ahi, que la gente tiene problemas para encontrar a Heracross en los arboles en pokemon gold. Entonces te pregunto, es posible que haya una rutina que cambie las tablas de los mapas para hacer posible la aparicion de mas pokemon?
Hay muchas diferencias entre las tablas de Gold y Crystal, principalmente por que tu documentas Lv 10 para todas las tablas y en Gold hay variaciones.