Registrarse

[ASM] R | Pokémon con ataques personalizados

eing

Miembro de honor
Miembro de honor
¡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:
Código:
17 48 00 47
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í:
Código:
 CCBBAA08 (pointer moveset pokemon 1)FFEEDD08 (pointer moveset pokemon 2)
¿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)

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
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:
Código:
XX+1XXXX08
Donde XX+1 XX XX = el offset donde compilamos nuestra rutina.
Si fue por poner un ejemplo en el 08909192, será lo colocaremos así:
Código:
 93919008
Y para finalizar el tutorial, que tal un ejemplillo?

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)

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:

DeadApolo

A'KERIA'S TRACES
Respuesta: [RUBY]Pokémon con ataques personalizados

¡Pero qué aporte colega!.
Está todo bastante bien explicado y conciso, nada que decir. Seguro a muchos les sirve, aunque en lo personal sólo hackeo el FR, igual me da el tirón de adaptar la rutina cuando esté con el ASM xD, ya que has puesto ese BONUS podría echarle una ojeadita, lástima que aún no sé ni lo que es Bx Rx xDDD.

Espero ver más de estos aportes colega, saludos.

Atte:

ApoloD - DeadApolo actualmente.
 

Xiros

¡Pokémon Omega con actualización del 30/8!
Miembro de honor
Respuesta: [RUBY]Pokémon con ataques personalizados

Muchas gracias eing! Recién lo termine de leer y creo que esta muy entendible! Cuando haga la prueba y vea si me funciona te cuento.

Esto es muy útil para ciertos pokemon especiales o incluso manipulados genéricamente por los malvados. Muy buen aporte!
 

Dani_SR_17

¡Pokémon LionHeart!
Respuesta: [RUBY]Pokémon con ataques personalizados

Sin duda una rutina muy, muy útil. Este tipo de rutinas dan mucho juego a los hacks.

PD: Por si quieres mirar el tema de las direcciones de FR, te dejo este tema y este otro tema, donde hay rutinas que hace cosas similares.
 

Jaizu

Usuario mítico
Respuesta: [RUBY]Pokémon con ataques personalizados

Pues yo me voy a animar a hacerlo, quiero que mi starter sea el puto amo ni más ni menos xD
Gracias por el tuto, a ver cuando portas todo lo que haces a FR y a Emerald :p
 

Xiros

¡Pokémon Omega con actualización del 30/8!
Miembro de honor
Respuesta: [RUBY]Pokémon con ataques personalizados

@eing, te faltó después de "beq new_atacks @Ataques nuevos" cargar los default attacks (ldr r0,.default_atacks)

Me estuve volviendo loco no entendiendo porque me cargaba cualquier ataque y me los iba cambiando (se ve que dependiendo del valor de la ram en ese momento) cuando quería los default attacks! jaja

Todavía no logro entender porque aunque cambie el valor de la variable 40F1 no me está cambiando el moveset :(. Como haría para cambiarlo por otro? (tengo dos movesets creados pero solo logro usar el primero)

Que significa ldrh r0,[r0,#0x0]? osea, cargo el valor del pointer r0 en r0, pero porque se pone el #0x0 entre los corchetes?

Ya de paso (auqnue no es de esta rutina), que significaría si pusiese ldrh r2,[r2,r1]? (se que ya lo hablamos pero no me acuerdo!)
 
Última edición:

ByFemok

3D Artist/Tiler/
Respuesta: [RUBY]Pokémon con ataques personalizados

Vaya por eso siempre fuiste de los que admire maldito ;3

se que lo que aportaste es algo super increible que la verdad no entiendo ya que no me dedico al rom hacking ahaha pero se te agradece estos aportes para los que si les interesa c: muchas gracias espero ver mas tutoriales señor profesor
 

Xiros

¡Pokémon Omega con actualización del 30/8!
Miembro de honor
Respuesta: [RUBY]Pokémon con ataques personalizados

eing, te falta un detallecito en la rutina:

.align 2
.thumb

main:
ldr r0,.var_atacks @cargamos pointer var de ataques
ldrh r0,[r0,#0x0] @carganis 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 @cargamos pointer var slot set de ataques.
ldrh r0,[r0,#0x0] @cargamos valor var_slot
mov r2,#0x4
mul r0,r2
ldr r7,.array_atacks @cargamos pointer array ataques
add r7,r7,r0
b back

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 0x086B4300 @Array ataques
.var_slot: .word 0x02026c56
.default_atacks: .word 0x08207bc8 @Array default atacks



Puse para que se sumara al r7 (la direccion de la tabla de ataques) el valor de r0 (para ver a cual offset de moveset ir), y así me funcionó bien lo de cargar los movesets!

Gran aporte y aprendí mucho!
 
Arriba