Registrarse

E - FR | Recopilación de Offsets frecuentes en rutinas ASM

Fran Agustín

L'amor està en l'aire
Recopilación de Offsets Frecuentes Emerald - Esmeralda​
¿Alguna vez te ha pasado de ir por ahí y encontrarte un montón de offsets sobre distintas rutinas incluidas en la ROM de FR? ¿Quizás buscar los datos para hacer una rutina ASM en Emerald (inglés o español)? ¿Tampoco? ¿Y encontrarte una rutina súper dúper fascinante y te preguntaste cómo pasarla de FR a Emerald?
¿No? Bueno, vete porque este post no es para ti. '^^

¡Pues tengo la solución! Revisando los archivos de mi PC acabo de encontrarme con una lista de offsets que busqué cuando quise pasar el MO a Esmeralda. En ella había un montón de offsets que se usan mucho al escribir nuestras propias rutinas para FR pero, para mi sorpresa, ¡eran los equivalentes tanto en Emerald como en Esmeralda! Se ve que los busqué en algún momento y nunca los compartí. Así que aquí tienen, todos para ustedes.

Tabla de offsets
Nombre - Información
Pokémon Decrypter
Pokémon Encrypter
Flag Status Query
Flag Setter
Flag Clearer
Variable Finder
Random (16 bits)
Division Quotient
Division Remainder
Dynamic Var Pointers
Player Party Data
Opponent Party Data
Offset en Emerald (ENG)
0x0806A518
0x0806ACAC
0x0809D790
0x0809D740
0x0809D768
0x0809D648
0x0806F5CC
0x082E7540
0x082E7BE0
0x081DBA0C
0x020244EC
0x02024744
Offset en Esmeralda (ES)
0x0806A518
0x0806ACAC
0x0809D7A4
0x0809D754
0x0809D77C
0x0809D65C
0x0806F5C8
0x082EECCC
0x082EF36C
0x081DB730
0x020244EC
0x02024744
Offset equivalente en FR (ENG)
0x0803FBE8
0x0804037C
0x0806E6D0
0x0806E680
0x0806E6A8
0x0806E454
0x08044EC8
0x081E4018
0x081E4684
0x0806A9F0
0x02024284
0x0202402C


Detalles sobre los offsets
Pokémon Decrypter
Parámetros de entrada: 2
  1. R0: Offset del pokémon en la RAM.
  2. R1: Índice. Uno de los números de la lista de abajo.
0x00 - Pokémon ID
0x01 - Trainer IDs
0x02 - Nickname Max Length 10 (r6 should be the nickname's address)
0x03 - Font / Language
0x04 - Sanity
0x05 - Sanity
0x06 - Sanity
0x07 - OT Name Max Length 7
0x08 - Marks
0x09 - Checksum
0x0A - Filler
0x0B - Species
0x0C - Held Item
0x0D - Attack 1
0x0E - Attack 2
0x0F - Attack 3
0x10 - Attack 4
0x11 - PP 1
0x12 - PP 2
0x13 - PP 3
0x14 - PP 4
0x15 - PP Bonuses
0x16 - Coolness
0x17 - Beauty
0x18 - Cuteness
0x19 - Exp. Points
0x1A - HP EV
0x1B - Attack EV
0x1C - Defence EV
0x1D - Speed EV
0x1E - Sp. Attack EV
0x1F - Sp. Defence EV
0x20 - Happiness
0x21 - Smartness
0x22 - Pokérus Status
0x23 - Catch Location
0x24 - Catch Level
0x25 - Unknown
0x26 - Hometown / Poké Ball / Trainer Gender
0x27 - HP IV
0x28 - Attack IV
0x29 - Defence IV
0x2A - Speed IV
0x2B - Sp. Attack IV
0x2C - Sp. Defence IV
0x2D - IsEgg
0x2E - Ability Bit
0x2F - Toughness
0x30 - Sheen
0x31 - Unknown
0x32 - Unknown
0x33 - Unknown
0x34 - Unknown
0x35 - Unknown
0x36 - Unknown
0x37 - Status Ailment
0x38 - Level
0x39 - Current HP
0x3A - Total HP
0x3B - Attack
0x3C - Defence
0x3D - Speed
0x3E - Sp. Attack
0x3F - Sp. Defence
0x40 - Unknown
0x41 - Species
Parámetros de salida: 1
  1. R0: Devuelve el valor de la información cuyo índice hayas pasado en R1 del pokémon cuyo offset hayas pasado en R0.

Pokémon Encrypter
Parámetros de entrada: 3
  1. R0: Offset del pokémon en la RAM.
  2. R1: Índice. Uno de los números de la lista del punto anterior.
  3. R2: Offst de la RAM donde hayas guardado el valor que quieres asignarle a esa data del pokémon.

Parámetros de salida: 0
Flag Status Query
Es el equivalente al checkflag del scripting.
Parámetros de entrada: 1
  1. R0: Número de flag cuyo estado quieres saber.
  2. Nota: El "estado" puede ser activado o desactivado, 0 o 1.

Parámetros de salida: 1
  1. R0: Devuelve el estado de la flag. 0 si está desactivada, 1 si está activada.
Flag Setter
Es el equivalente al setflag del scripting.

Parámetros de entrada: 1
  1. R0: Número de flag que quieres activar.

Parámetros de salida: 0
Flag Clearer
Es el equivalente al clearflag del scripting.

Parámetros de entrada: 1
  1. R0: Número de flag que quieres desactivar.

Parámetros de salida: 0
Variable Finder
Las variables son parte de la DMA. Eso quiere decir que su offset dentro de la RAM no es siempre el mismo. Esta función descubre en qué offset está una variable.
Parámetros de entrada: 1
  1. R0: Número de variable cuyo offset quieras saber.

Parámetros de salida: 1
  1. R0: Offset de la RAM en donde está la variable.

Random (16 bits)
También llamado RNG (Random Number Generator). Genera un número aleatorio de 16 bits (2 bytes, 1 halfword).

Parámetros de entrada: 0

Parámetros de salida: 1
  1. R0: Número aleatorio de 16 bits.
Division Quotient
Devuelve el cociente entero de una divisón. Es decir, toma dos números, divide uno por otro y devuelve el resultado sin decimales.

Parámetros de entrada: 2
  1. R0: Numerador o dividendo.
  2. R1: Divisor.

Parámetros de salida: 1
  1. R0: Resultado o cociente.

Division Remainder
Devuelve el resto de una divisón. Es decir, toma dos números, divide uno por otro y devuelve la parte que no se puede dividir. En otras palabras, devuelve el módulo.

Parámetros de entrada: 2
  1. R0: Numerador o dividendo.
  2. R1: Divisor.

Parámetros de salida: 1
  1. R0: Resto o módulo.
Dynamic Var Pointers
En este offset encontrarán, en orden, los punteros a los offsets de la RAM en que se encuentran las variables "dinámicas" (8000's). Recordemos que estas variables, a diferencia de las otras, sí tienen un offset estático. Aunque las llamamos dinámicas porque su valor lo es.

Player Party Data
En este offset de la RAM se encuentran, en orden, los datos de los pokémon en el equipo del jugador. Recordemos que son 100 bytes por cada uno, lo que nos lleva a un total de 600 bytes disponibles (no necesariamente todos ocupados).

Opponent Party Data
En este offset de la RAM se encuentran, en orden, los datos de los pokémon en el equipo del entrenador contra el que se esté luchando, o bien los de un pokémon salvaje. Recordemos que son 100 bytes por cada uno, lo que nos lleva a un total de 600 bytes disponibles (no necesariamente todos ocupados).

Eso es todo por ahora. Si llego a encontrar más archivos o me da por buscar otros offsets, actualizaré este post.
Entiendo que algunos de los nombres no especifican lo suficiente ya que no detalla qué parámetros recibe o devuelve. La verdad es que no tengo ganas de ponerme a escribirlo ahora a las 2:22 AM, pero ya actualizaré mañana o pasado con esos datos. Ruego sepan ser pacientes ^^
Y desde ya, si alguno tiene otro offset, que lo aporte y con gusto lo agrego en esta tablita.
 
Última edición:

kakarotto

Baneado
Esto es una buena idea sin duda. Ademas deberíais incluir ruby. Si bien es cierto que pocos hackers la usan como base a editar,todavia hay algunos que lo hacen.

Tambien sería buena idea este glosario pero en dissambely.
Saludos.
 

Fran Agustín

L'amor està en l'aire
Buenas buenas. Hoy vengo a explicar un poco de qué van estas funciones.
Ya dejé actualizado el post principal.

Detalles sobre los offsets
Pokémon Decrypter
Parámetros de entrada: 2
  1. R0: Offset del pokémon en la RAM.
  2. R1: Índice. Uno de los números de la lista de abajo.
0x00 - Pokémon ID
0x01 - Trainer IDs
0x02 - Nickname Max Length 10 (r6 should be the nickname's address)
0x03 - Font / Language
0x04 - Sanity
0x05 - Sanity
0x06 - Sanity
0x07 - OT Name Max Length 7
0x08 - Marks
0x09 - Checksum
0x0A - Filler
0x0B - Species
0x0C - Held Item
0x0D - Attack 1
0x0E - Attack 2
0x0F - Attack 3
0x10 - Attack 4
0x11 - PP 1
0x12 - PP 2
0x13 - PP 3
0x14 - PP 4
0x15 - PP Bonuses
0x16 - Coolness
0x17 - Beauty
0x18 - Cuteness
0x19 - Exp. Points
0x1A - HP EV
0x1B - Attack EV
0x1C - Defence EV
0x1D - Speed EV
0x1E - Sp. Attack EV
0x1F - Sp. Defence EV
0x20 - Happiness
0x21 - Smartness
0x22 - Pokérus Status
0x23 - Catch Location
0x24 - Catch Level
0x25 - Unknown
0x26 - Hometown / Poké Ball / Trainer Gender
0x27 - HP IV
0x28 - Attack IV
0x29 - Defence IV
0x2A - Speed IV
0x2B - Sp. Attack IV
0x2C - Sp. Defence IV
0x2D - IsEgg
0x2E - Ability Bit
0x2F - Toughness
0x30 - Sheen
0x31 - Unknown
0x32 - Unknown
0x33 - Unknown
0x34 - Unknown
0x35 - Unknown
0x36 - Unknown
0x37 - Status Ailment
0x38 - Level
0x39 - Current HP
0x3A - Total HP
0x3B - Attack
0x3C - Defence
0x3D - Speed
0x3E - Sp. Attack
0x3F - Sp. Defence
0x40 - Unknown
0x41 - Species
Parámetros de salida: 1
  1. R0: Devuelve el valor de la información cuyo índice hayas pasado en R1 del pokémon cuyo offset hayas pasado en R0.

Pokémon Encrypter
Parámetros de entrada: 3
  1. R0: Offset del pokémon en la RAM.
  2. R1: Índice. Uno de los números de la lista del punto anterior.
  3. R2: Offst de la RAM donde hayas guardado el valor que quieres asignarle a esa data del pokémon.

Parámetros de salida: 0

Flag Status Query
Es el equivalente al checkflag del scripting.

Parámetros de entrada: 1
  1. R0: Número de flag cuyo estado quieres saber.
  2. Nota: El "estado" puede ser activado o desactivado, 0 o 1.

Parámetros de salida: 1
  1. R0: Devuelve el estado de la flag. 0 si está desactivada, 1 si está activada.

Flag Setter
Es el equivalente al setflag del scripting.

Parámetros de entrada: 1
  1. R0: Número de flag que quieres activar.

Parámetros de salida: 0

Flag Clearer
Es el equivalente al clearflag del scripting.

Parámetros de entrada: 1
  1. R0: Número de flag que quieres desactivar.

Parámetros de salida: 0

Variable Finder
Las variables son parte de la DMA. Eso quiere decir que su offset dentro de la RAM no es siempre el mismo. Esta función descubre en qué offset está una variable.

Parámetros de entrada: 1
  1. R0: Número de variable cuyo offset quieras saber.

Parámetros de salida: 1
  1. R0: Offset de la RAM en donde está la variable.

Random (16 bits)
También llamado RNG (Random Number Generator). Genera un número aleatorio de 16 bits (2 bytes, 1 halfword).

Parámetros de entrada: 0

Parámetros de salida: 1
  1. R0: Número aleatorio de 16 bits.

Division Quotient
Devuelve el cociente entero de una divisón. Es decir, toma dos números, divide uno por otro y devuelve el resultado sin decimales.

Parámetros de entrada: 2
  1. R0: Numerador o dividendo.
  2. R1: Divisor.

Parámetros de salida: 1
  1. R0: Resultado o cociente.

Division Remainder
Devuelve el resto de una divisón. Es decir, toma dos números, divide uno por otro y devuelve la parte que no se puede dividir. En otras palabras, devuelve el módulo.

Parámetros de entrada: 2
  1. R0: Numerador o dividendo.
  2. R1: Divisor.

Parámetros de salida: 1
  1. R0: Resto o módulo.

Dynamic Var Pointers
En este offset encontrarán, en orden, los punteros a los offsets de la RAM en que se encuentran las variables "dinámicas" (8000's). Recordemos que estas variables, a diferencia de las otras, sí tienen un offset estático. Aunque las llamamos dinámicas porque su valor lo es.

Player Party Data
En este offset de la RAM se encuentran, en orden, los datos de los pokémon en el equipo del jugador. Recordemos que son 100 bytes por cada uno, lo que nos lleva a un total de 600 bytes disponibles (no necesariamente todos ocupados).

Player Party Data
En este offset de la RAM se encuentran, en orden, los datos de los pokémon en el equipo del entrenador contra el que se esté luchando, o bien los de un pokémon salvaje. Recordemos que son 100 bytes por cada uno, lo que nos lleva a un total de 600 bytes disponibles (no necesariamente todos ocupados).

-------------------------------------------------------------------------------------------------------

Esto es una buena idea sin duda. Ademas deberíais incluir ruby. Si bien es cierto que pocos hackers la usan como base a editar,todavia hay algunos que lo hacen.

Tambien sería buena idea este glosario pero en dissambely.
Saludos.
Es cierto. Deberíamos incluir Ruby y Rubí también. Revisaré a ver si ya los tengo por ahí.

-------------------------------------------------------------------------------------------------------

Por ahora, creo que eso es todo, chiquis. Si me he dejado alguna cosa o si algo no lo he explicado lo suficientemente bien, me avisan que con gusto lo reviso. ;)
 

Kaiser de Emperana

Called in hand
No se si servira de mucho, pero dejo los offsets de todas las funciones nombradas en pokeruby y pokeemerald por si alguien quiere buscar equivalentes.
Pokeemerald

Pokeruby

(Mirar offset de una rutina de emerald en el post principal. Buscar offset en el archivo de pokeemerald. Buscar el nombre que aparece en el archivo de pokeemerald, pero en el archivo de pokeruby. Walá, offset de la rutina en ruby)
 

jiangzhengwenjz

Profesional de WaH
I think it's better to write them in C function format to make them clearer. (especially for those having over 4 arguments)
 

Naren Jr.

Puto amo
Usuario de Platino
No que habías dejado el RH @EnamoratDeKatie ?

He de decir que esto es muy útil para armar rutinas o utilizar algunas cosas en Emerald, la forma como tu las sacas es usando el IDA o Debbugeando la ROM?

Gracias por traer los de FR, servirán para muchas cosas técnicas y armar una que otra cosilla interesante.
 
Arriba