¡Que pasa maricas!
Hoy os traigo, un tutorial sobre como tener pokémons con ataques personalizados.
¿Qué como es eso?
Pues comiendo, ok no.
Esto trata de que en vez de que carguemos la tabla de movimientos aprendidos por nivel, carguemos la nuestra.
Pero solo para pokémon's especificados por nosotros.
Es decir, ¡sin limitaciones!
Para que entendais mejor, os dejo un video:
En ese caso, he recibido DOS bulbasaurs, uno con ataques por default, y otro por mí. (Y si subiese de nivel, este segundo, aprendería los movs de la nueva tabla)
Y además, no solo sirve con givepokemon, si no que también lo podrémos utilizar con wildbattle en forma de script! (También los podríamos insertar en los aleatorios de la hierba, pero para eso habria que editar dicha rutina y ahora vamos a cosas sencillitas..)
Tras este tocho, vamos a hacer magia!
Abrimos nuestro pokémon rubí ING con el heditor hex, y nos vamos a la siguiente dirección: 0803B75E
Y colocamos los siguientes bytes:
Ahora vamos a crear nuesta tabla de ataques de aprendizaje por pokémon
¿Como?
Es bien sencillo, ves a un espacio vacío y pon lo siguiente:
XXYYXXYYXXYY ...
Donde XX = ataque
Donde YY = nivel * 2
(Para entender mejor este funcionamiento, puedes ver la tabla original de ataques, que está en la siguiente direccion: 08207bc8)
Cuando acabeis de poner los nuevos movimientos que aprenderá ese pokemon, colocar: FF FF.
Y si quereis añadir movimientos de otro pokémon, ha de ser seguido de esos FF..)
Ahora crearemos otra tabla, (bastante alejada de la anterior a ser posible..)
Y colocaremos el pointer de donde empezó los ataques que aprenderá el pokemon X.
(Si agregasemos un nuevos pokémon con nuevos ataques, habremos de colocarla seguida de esta)
Por poner un ejemplo; pusismos los ataques del pokémon X en el offset: 08AABBCC, y los del pokemon Y en el offset: 08DDEEFF.
Entonces esta tabla será así:
¿Entendeis?
La primera tabla no es más que los movimientos que aprenderá X pokémon.
Y la segunda tabla, contiene la información de todos los punteros de los ataques que aprenderán los nuevos pokemon.
Una vez entendido esto, joder que lío..
Vamos a compilar la siguiente rutina (usando thumb)
Explicación breve:
Var atacks = 0x40f4 (Decide si cargamos la tabla de ataques nueva o no)
var_slot = 0x40f1 (Carga el slot X de la tabla de ataques) (moveset1, dos.. etc)
Array_atacks = Offset donde colocamos nuestro pointer de movesets.
Y ya para finalizar, nos vamos al siguiente offset: 0803B7BC
Donde colocaremos lo siguiente:
Donde XX+1 XX XX = el offset donde compilamos nuestra rutina.
Si fue por poner un ejemplo en el 08909192, será lo colocaremos así:
Y para finalizar el tutorial, que tal un ejemplillo?
Y eso es todo!
PD:
PD2: Y sí, se puede hacer mejor con LASTRESULT, pero yo he utilizado una variable para determinar si es nuevo moveset, o no, porque tambien cargo distintos moveset, segun sea givepokemon, salvaje o wildbattle.
Hoy os traigo, un tutorial sobre como tener pokémons con ataques personalizados.
¿Qué como es eso?
Pues comiendo, ok no.
Esto trata de que en vez de que carguemos la tabla de movimientos aprendidos por nivel, carguemos la nuestra.
Pero solo para pokémon's especificados por nosotros.
Es decir, ¡sin limitaciones!
Para que entendais mejor, os dejo un video:
En ese caso, he recibido DOS bulbasaurs, uno con ataques por default, y otro por mí. (Y si subiese de nivel, este segundo, aprendería los movs de la nueva tabla)
Y además, no solo sirve con givepokemon, si no que también lo podrémos utilizar con wildbattle en forma de script! (También los podríamos insertar en los aleatorios de la hierba, pero para eso habria que editar dicha rutina y ahora vamos a cosas sencillitas..)
Tras este tocho, vamos a hacer magia!
Abrimos nuestro pokémon rubí ING con el heditor hex, y nos vamos a la siguiente dirección: 0803B75E
Y colocamos los siguientes bytes:
Código:
17 48 00 47
¿Como?
Es bien sencillo, ves a un espacio vacío y pon lo siguiente:
XXYYXXYYXXYY ...
Donde XX = ataque
Donde YY = nivel * 2
(Para entender mejor este funcionamiento, puedes ver la tabla original de ataques, que está en la siguiente direccion: 08207bc8)
Cuando acabeis de poner los nuevos movimientos que aprenderá ese pokemon, colocar: FF FF.
Y si quereis añadir movimientos de otro pokémon, ha de ser seguido de esos FF..)
Ahora crearemos otra tabla, (bastante alejada de la anterior a ser posible..)
Y colocaremos el pointer de donde empezó los ataques que aprenderá el pokemon X.
(Si agregasemos un nuevos pokémon con nuevos ataques, habremos de colocarla seguida de esta)
Por poner un ejemplo; pusismos los ataques del pokémon X en el offset: 08AABBCC, y los del pokemon Y en el offset: 08DDEEFF.
Entonces esta tabla será así:
Código:
CCBBAA08 (pointer moveset pokemon 1)FFEEDD08 (pointer moveset pokemon 2)
La primera tabla no es más que los movimientos que aprenderá X pokémon.
Y la segunda tabla, contiene la información de todos los punteros de los ataques que aprenderán los nuevos pokemon.
Una vez entendido esto, joder que lío..
Vamos a compilar la siguiente rutina (usando thumb)
Código:
.align 2
.thumb
main:
ldr r0,.var_atacks [MENTION=28468]car[/MENTION]gamos pointer var de ataques
ldrh r0,[r0,#0x0] [MENTION=28468]car[/MENTION]ganis valor var de ataques
cmp r0,#0x1 @Comparamos variable ataques = 1
beq new_atacks @Ataques nuevos
Ldr r0,.default_atacks
add r7,r6,r0
b back
new_atacks:
ldr r0,.var_slot [MENTION=28468]car[/MENTION]gamos pointer var slot set de ataques.
ldrh r0,[r0,#0x0] [MENTION=28468]car[/MENTION]gamos valor var_slot
Mov r2,#0x4
Mul r0,r2
ldr r7,.array_atacks@Cargamos pointer array ataques
back:
ldr r2,.Back_routine
bx r2
.align 2
.var_atacks: .word 0x02026c5c @Tabla a cargar de ataques
.Back_routine: .word 0x0803b763 @Back Routine
.array_atacks: .word 0x08BB0000 @Array ataques
.var_slot: .word 0x02026c56 [MENTION=17182]pointer[/MENTION] var slot a cargar tabla.
.default_atacks: .word 0x08207bc8 @Array default atacks
Var atacks = 0x40f4 (Decide si cargamos la tabla de ataques nueva o no)
var_slot = 0x40f1 (Carga el slot X de la tabla de ataques) (moveset1, dos.. etc)
Array_atacks = Offset donde colocamos nuestro pointer de movesets.
Y ya para finalizar, nos vamos al siguiente offset: 0803B7BC
Donde colocaremos lo siguiente:
Código:
XX+1XXXX08
Si fue por poner un ejemplo en el 08909192, será lo colocaremos así:
Código:
93919008
Código:
#org 0x086F3A10
setvar 0x40f4 0x1 'Indicamos que nuestro pokémon tendrá nuevo moveset
setvar 0x40f1 0x0 ' Indicamos que cargará el moveset 0
givepokemon 0x1 0x5 0x0 0x0 0x0 'Recibimos bulbasaur
setvar 0x40f4 0x0 'Colocamos la var que indica si cargamos nuevo moveset o no a 0. (Porque si no, todos los pokémon tendran ese moveset..)
setvar 0x40f1 0x0 'Resetear a 0, por si alguna vez la volvemos a utilizar
end
Y eso es todo!
PD:
Para aquellos curiosos, hackers de FR, hacer esto es tan simple como localizar donde carga la tabla de aprendizaje de ataques los pokémon (se puede mirar en YAPE) y acto seguido, con el VBA en el dissamble ir a esa dirección y subir hasta encontrar cuando la carga.
Entonces.. si usa los mismos registros, os vale este tutorial, si no averiguar el valor de Bx Rx ponerlo y MAGIA)
También debereis encontrar las direcciones de las variables)
Entonces.. si usa los mismos registros, os vale este tutorial, si no averiguar el valor de Bx Rx ponerlo y MAGIA)
También debereis encontrar las direcciones de las variables)
PD2: Y sí, se puede hacer mejor con LASTRESULT, pero yo he utilizado una variable para determinar si es nuevo moveset, o no, porque tambien cargo distintos moveset, segun sea givepokemon, salvaje o wildbattle.
Última edición: