Registrarse

FR | EM |Añadiendo más ataques

Estado
Cerrado para nuevas respuestas.

Gamer2020

Accept no Imitations!
Usuario de Platino
Hola. Hoy voy a escribir sobre cómo añadir más ataques a Rojo Fuego y Esmeralda. Tenga en cuenta que esto sólo se aplica a las versiones en inglés de estos juegos. Si está utilizando una versión diferente se tendrá que encontrar las direcciones adecuadas. También estaré asumiendo que usted ya sabe cómo re-apuntar los datos e insertar rutinas de ASM. Si por alguna razón usted no desea añadir los ataques a ti mismo, por favor utilice Pokemon Game Editor. Esto es para usuarios más avanzados. Si este thred se ve mal formatado or algo pueden ver el post original en mi website: Añadiendo más ataques a Rojo Fuego y Esmeralda!

Algunos de ustedes han oído hablar de un hacker de ROM llamado Jambo51. Él es un hacker de ROMs que crearon la primera base de ROM con Pokemon añadido. Mientras que trabajaba en ella, se dio cuenta que el formato de nivel hacia arriba tendría que ser cambiado con el fin de apoyar a más de 511 ataques. Todo esto se basa en el trabajo que inició; He añadido simplemente a él.

Para empezar usted querrá re-apuntar los nombres de ataque. Los nombres son 13 bytes por nombre y la longitud original de todos los nombres es 4615 bytes. Re-apunta los datos a espacio libre. Añada "ACACACACACACACFF0000000000" para cada nuevo nombre que desee agregar. Direcciones para los datos originales se encuentran abajo.

Rojo Fuego
247094
Esmeralda
31977C

El siguiente paso será los datos de ataque. Los datos de ataque son de 12 bytes por ataque y la longitud original de todos los datos es 4260 bytes. Re-apunta los datos actuales a espacio libre. Añada "000000000000000000000000" para cada nuevo ataque que desee agregar. Direcciones de los datos se encuentran abajo.

Rojo Fuego
250C04
Esmeralda
31C898


También hay que tener en cuenta que hay punteros para los datos de PP. Los punteros tendrán estas mismas direcciones más 4.


Rojo Fuego
250C08
Esmeralda
31C89C


A continuación vas a re-apuntar la tabla de descripciones de ataque. Los datos son un puntero, o 4 bytes por ataque y la longitud original de la tabla es 1420 bytes. Re-apunta la tabla a espacio libre. Añada un puntero para cualquier descripción existente para cada nuevo ataque que desee agregar. Las Direcciones para la tabla se encuentran abajo.


Rojo Fuego
4886E8
Esmeralda
61C524

A continuación, tiene que re-apuntar la tabla de animaciones de ataque. Los datos son un puntero, o 4 bytes por ataque y la longitud original de la tabla es 1420 bytes. Re-apunta la tabla a espacio libre. Añada un puntero para cualquier animación existente para cada nuevo ataque que desee agregar. Las Direcciones para la tabla se encuentran abajo.


Rojo Fuego
1C68F4
Esmeralda
2C8D6C


En lo que va re-apuntar, ya ha terminado en este punto cuando se trata de fuego rojo. Cuando se trata de Esmeralda, sin embargo, tiene datos de ataques de concurso para re-apuntar también. Los datos son 8 bytes por ataque y la longitud original de los datos es 2840 bytes. Re-apunta los datos actuales a espacio libre. Añada "0000000000000000" para cada nuevo ataque que desee agregar. La direccion de la tabla de está abajo.


Esmeralda datos de Ataque de concurso
58C2B4


En este punto has terminado de re-apuntar. Ahora sólo tiene que hacer algunas cosas para que los ataques funcionan correctamente. Hay un limitador que necesita ser cambiado para que los nombres de ataques sean utilizados. Escribe "00000000000013E0" en la direccion para su versión.


Rojo Fuego
D75FC
Esmeralda
14E504

Una vez más hamos terminado cuando se trata de color rojo fuego, pero tenemos que hacer un poco más cuando se trata de Esmeralda por los datos del concurso. Escribe "0000000000000000" a esta direccion. Esto parece hacer lo mismo pero para los concursos.


Esmeralda limitador de los nombres de los ataques de Concursos
D8F0C


En la siguiente direccion, escribe "00000000000000E0" para cambiar un limitador que parece estar relacionado con las animaciones de ataque para los concursos.


Esmeralda limitador de animaciones de los ataques del concurso
DE83A


En este punto usted ha hecho la mayor parte de lo que tiene que hacer. Si usted no necesita más de 511 ataques, ya ha terminado. Si necesita más de 511, tendrá que insertar las siguientes rutinas de ASM. Las instrucciones están con las respectivas rutinas.


Rojo Fuego
Código:
.text
.align 2
.thumb
.thumb_func
.global newmovesetstyle1

/* Escrito por: Jambo51 */
/* En 0x3EB20 escribe 18 49 08 47. En 0x3EB84 escribe XX XX XX 08, donde XX XX XX es la direccion de la rutina mas 1. */

main:
 mov r1, r9
 lsl r1, r1, #0x2
 ldr r0, table
 add r0, r0, r1
 ldr r0, [r0, #0x0]
 ldr r6, there
 add r6, #0x6
 ldrb r7, [r6, #0x0]
loop: lsl r1, r7, #0x1
 add r1, r1, r7
 add r3, r0, r1
 ldrb r1, [r3, #0x2]
 mov r4, r10
 cmp r4, r1
 beq learn
 cmp r1, #0xFF
 beq exit
 add r7, #0x1
 b loop
learn: ldr r2, there
 add r7, #0x1
 strb r7, [r6, #0x0]
 ldrb r1, [r3, #0x1]
 lsl r1, r1, #0x8
 ldrb r0, [r3, #0x0]
 orr r0, r1
 strh r0, [r2, #0x0]
 ldr r1, return
 bx r1
exit: ldr r0, return2
 bx r0
.align
return:  .word 0x0803EB65
return2: .word 0x0803EB73
there:  .word 0x02024022
table:  .word 0x0825D7B4
Código:
.text
.align 2
.thumb
.thumb_func
.global newmovesetstyle2

/* Escrito por: Jambo51 */
/* Mejorado por: DoesntKnowHowToPlay */
/* En 0x3EA10 escribe 00 49 08 47 XX XX XX 08 donde XX XX XX es la direccion de la rutina mas 1. */

main:
 ldrb r1, [r0, #0x2]
 mov r2, #0xFF
 cmp r1, r2
 beq exit2
 lsl r2, #0x8
 add r2, #0xFF
 mov r9, r2
 mov r3, #0x0
loop: lsl r0, r3, #0x1
 add r0, r0, r3
 ldr r1, movesettable
 add r1, r1, r6
 ldr r1, [r1, #0x0]
 add r7, r0, r1
 ldrb r0, [r7, #0x2]
 mov r4, r10
 cmp r0, r4
 bgt exit2
 ldrb r1, [r7, #0x1]
 ldrb r0, [r7, #0x0]
 lsl r1, r1, #0x8
 orr r1, r0
 mov r0, r8
 str r3, [sp, #0x0]
 mov r4, r1
 bl branchone
 mov r5, #0xFF
 ldr r3, [sp, #0x0]
 cmp r0, r9
 bne exit
 mov r0, r8
 add r1, r4, #0x0
 bl branchtwo
 ldr r3, [sp, #0x0]
exit: add r3, #0x1
# lsl r1, r3, #0x1
# add r1, r1, r3
# add r0, r7, r1
 mov r1, #0x3
 add r0, r7, r1
 ldrb r0, [r0, #0x2]
 cmp r0, r5
 bne loop
exit2: add sp, #0x4
 pop {r3-r5}
 mov r8, r3
 mov r9, r4
 mov r10, r5
 pop {r4-r7}
 pop {r0}
 bx r0
branchone: push {r4-r7,lr}
 add sp, #-0x4
 ldr r7, gothere
 bx r7
branchtwo: push {r4-r7,lr}
 ldr r7, gothere2
 bx r7
.align
gothere: .word 0x0803E8B5
gothere2: .word 0x0803EC43
movesettable: .word 0x0825D7B4
Código:
 .text
.align 2
.thumb
.thumb_func
.global newmovesetstyle3

/* Escrito por: Gamer2020 */
/* En 0x08043CD0 escribe 00490847 XXXXXXXX donde XXXXXX es la direccion de la rutina mas 1. */

main:
MOV    R5, #0x0
LDR     R6, .learned_moves_ptr
LSL    R1, R7, #0x2
ADD    R2, R1, R6
LDR     R3, [R2]
ldrb r0, [r3, #0x2]
STR     R1, [SP,#0x14]
CMP     R0, #0xFF
BEQ     loc_8043DB4
MOV     R9, R2
STR     R3, [SP,#0x10]

loc_8043CE8:
mov r2,#0x03
mul r2, r2, r5 /*mult 3*/
  ldr     r1,[sp, #0x10] /* Use these two lines to get current attack address.*/
  add     r0,r2,r1
  mov     r7,r2
 ldrb r1, [r0, #0x0]
 ldrb r3, [r0, #0x1]
 lsl r3, r3, #0x8
 orr r3, r1 /*Puts attack in r3.*/
ldrb r0, [r0, #0x2] /*Puts level in r0.*/
ldr     r1,[sp,#0x0C] /* Loads current level */
  add     r5, #0x1 /* Loop counter? */
  mov     r12,r5
  cmp     r0,r1 /* compares levels */
  bgt     loc_8043D9E
  mov     r4, #0x0
  mov     r0,r13
  ldrh    r1,[r0]
  mov     r0,r3 /* Puts attack in r0 */
  cmp     r1,r0
  beq     loc_8043D38
  ldr     r0,[sp,#0x14]
  ldr     r1, .learned_moves_ptr
  add     r6,r0,r1
  mov     r3,r13
  mov     r5,r7

loc_8043D20:
  add     r3, #0x2
  add     r4, #0x1
  cmp     r4, #0x3
  bgt     loc_8043D38
  ldr     r0,[r6]
  add     r0,r5,r0
 ldrb r1, [r0, #0x0]
 ldrb r0, [r0, #0x1]
 lsl r0, r0, #0x8
 orr r0, r1 /*Puts attack in r0.*/
  ldrh    r2,[r3]
  cmp     r2,r0
  bne     loc_8043D20

loc_8043D38:
  cmp     r4,#0x4
  bne     loc_8043D9E
  mov     r4,#0x0
  cmp     r4,r10
  bge     loc_8043D7C
  mov     r1,r9
  ldr     r0,[r1]
  add     r0,r7,r0
 ldrb r1, [r0, #0x0]
 ldrb r0, [r0, #0x1]
 lsl r0, r0, #0x8
 orr r0, r1 /*Puts attack in r0.*/
ldr     r2,[sp,#0x8]
ldrh    r2,[r2]
  cmp     r2,r0
  beq     loc_8043D7C
  ldr     r1,[sp, #0x14]
  ldr     r2, .learned_moves_ptr
  add     r6,r1,r2
  ldr     r3,[sp, #0x8]
  mov     r5,r7

loc_8043D64:
  add     r3, #0x2
  add     r4,#0x1
  cmp     r4,r10
  bge     loc_8043D7C
  ldr     r0,[r6]
  add     r0,r5,r0
 ldrb r1, [r0, #0x0]
 ldrb r0, [r0, #0x1]
 lsl r0, r0, #0x8
 orr r0, r1 /*Puts attack in r0.*/
  ldrh    r2,[r3]
  cmp     r2,r0
  bne     loc_8043D64

loc_8043D7C:
  cmp     r4,r10
  bne     loc_8043D9E
  mov     r0,r10
  add     r0,#0x1
  lsl     r0,r0,#0x18
  lsr     r0,r0,#0x18
  mov     r10,r0
  lsl     r2,r4, #0x1
  ldr     r1,[sp,#0x8]
  add     r2,r2,r1
  mov     r4,r9
  ldr     r0,[r4]
  add     r0,r7,r0
 ldrb r1, [r0, #0x0]
 ldrb r0, [r0, #0x1]
 lsl r0, r0, #0x8
 orr r0, r1 /*Puts attack in r0.*/
  strh    r0,[r2]

loc_8043D9E:
  mov     r5,r12
  cmp     r5, #0x13
  bgt     loc_8043DB4
  mov     r1,r9
  ldr     r0,[r1]
mov r1,#0x03
mul r1, r1, r5 /*mult 3*/
  add     r1,r1,r0
  ldrh    r0,[r1] /* Load bytes for term check. */
ldrb r0, [r1, #0x2]
cmp     r0, #0xFF /*Term Check*/
  bne     loc_8043CE8

loc_8043DB4:
  mov     r0,r10
  add     sp, #0x18
  pop     {r3-r5}
  mov     r8,r3
  mov     r9,r4
  mov     r10,r5
  pop     {r4-r7}
  pop     {r1}
  bx      r1

.align 2
.learned_moves_ptr:
  .word 0x0825D7B4
Código:
.text
.align 2
.thumb
.thumb_func
.global newmovesetstyle4

/* Escrito por: Gamer2020 */
/* En 8043E2C escribe 004B1847XXXXXXXX donde XXXXXXXX es la direccion de la rutina mas 1.*/

/*08043E2C*/
main:
  PUSH    {R4-R7,LR}
  MOV     R7, R10
  MOV     R6, R9
  MOV     R5, R8
  PUSH    {R5-R7}
  sub sp, sp, #0x3C
  add r6, r0, #0x0
  mov r0, #0x0
  mov r10, r0
  add r0, r6, #0x0
  mov r1, #0x41
  mov r2, #0x0
  ldr r3, .READ_Poke_DATA /*Get Species*/
  bl bx_r3
  lsl r0, r0, #0x10
  lsr r4, r0, #0x10
  add r0, r6, #0x0
  mov r1, #0x38
  mov r2, #0x0
  ldr r3, .READ_Poke_DATA /*Get Level*/
  bl bx_r3
  lsl r0, r0, #0x18 /*Drops leading 000000??*/
  lsr r0, r0, #0x18
  str r0, [sp, #0x30]
  mov r0, #0xce /*Check if slot 412*/
  lsl r0, r0, #0x01
  cmp r4, r0
  bne     loc_8043E68
  mov r0, #0x0
  b       exit

loc_8043E68:
  mov r5, #0x0
  lsl r4, r4, #0x02 /*Species x 4*/
  str r4, [sp, #0x38] /*Stores value for later */
  mov r4, sp

loc_8043E70:
  mov r1, r5
  add r1, #0xd
  mov r0, r6
  mov r2, #0x0
  ldr r3, .READ_Poke_DATA /*Get attacks*/
  bl bx_r3
  strh r0, [r4]
  add r4, #0x2
  add r5, #0x1 /*Loops through 4 attacks on Poke*/
  cmp r5, #0x3
  ble loc_8043E70
  mov r5, #0x0
  ldr     r3, .learned_moves_ptr
  ldr r2, [sp, #0x38]
  add r1, r2, r3
  ldr     r0,[r1]
ldrb r0, [r0, #0x2]
CMP     R0, #0xFF
  BEQ     loc_8043F70
  mov     r9,r1
  mov     r4,r13
  add     r4,#0x8
  str     r4,[sp,#0x34]        

loc_8043EA0:
  mov     r1,r9
  ldr     r0,[r1]
mov r2,#0x03
mul r2, r2, r5 /*mult 3*/
  add     r0,r2,r0
ldrb r0, [r0, #0x2] /*Puts level in r0.*/
  ldr     r4,[sp, #0x30] /*Loads mon level*/
mov     r1,r4
  mov     r7,r2
  add     r5, #0x1 /*Incremeants place*/
  mov     r12,r5
  cmp     r0,r1  /*Level Check*/
  bgt     loc_8043F5A
  mov     r4, #0x0
mov     r0,r9
ldr     r0,[r0]
 ldrb r1, [r0, #0x0]
 ldrb r0, [r0, #0x1]
 lsl r0, r0, #0x8
 orr r0, r1 /*Puts attack in r0.*/
     mov     r1,r13
  ldrh    r1,[r1]
  cmp     r1,r0
  beq     loc_8043EF2
  ldr     r0,[sp, #0x38]
  ldr     r1, .learned_moves_ptr
  add     r6,r0,r1
  mov     r3,r13
  mov     r5,r7

loc_8043EDA:
  add     r3, #0x2
  add     r4, #0x1
  cmp     r4, #0x3
  bgt     loc_8043EF2
  ldr     r0,[r6]
  add     r0,r5,r0
 ldrb r1, [r0, #0x0]
 ldrb r0, [r0, #0x1]
 lsl r0, r0, #0x8
 orr r0, r1 /*Loads bytes Gets attack put into r0*/
  ldrh    r2,[r3]
  cmp     r2,r0
  bne     loc_8043EDA

loc_8043EF2:
  cmp     r4, #0x4
  bne     loc_8043F5A
  mov     r4, #0x0
  cmp     r4,r10
  bge     loc_8043F38
  mov     r1,r9
  ldr     r0,[r1]
  add     r0,r7,r0
 ldrb r1, [r0, #0x0]
 ldrb r0, [r0, #0x1]
 lsl r0, r0, #0x8
 orr r1, r0 /*Loads bytes Gets attack put into r1*/
  ldr     r0,[sp,#0x34]
  ldrh    r2,[r0]
mov     r0,r1 /*Gets attack put into r0*/
  add     r1,sp,#0x8
  cmp     r2,r0
  beq     loc_8043F38
  ldr     r2,[sp,#0x38]
  ldr     r0, .learned_moves_ptr
  add     r6,r2,r0
  mov     r3,r1
  mov     r5,r7

loc_8043F20:
  add     r3, #0x2
  add     r4, #0x1
  cmp     r4,r10
  bge     loc_8043F38
  ldr     r0,[r6]
  add     r0,r5,r0 /*Attack*/
 ldrb r1, [r0, #0x0]
 ldrb r0, [r0, #0x1]
 lsl r0, r0, #0x8
 orr r0, r1 /*Loads bytes Gets attack put into r0*/
  ldrh    r2,[r3]
  cmp     r2,r0
  bne     loc_8043F20

loc_8043F38:
  cmp     r4,r10
  bne     loc_8043F5A
  mov     r0,r10
  add     r0, #0x1
  lsl     r0,r0, #0x18
  lsr     r0,r0, #0x18
  mov     r10,r0
  lsl     r2,r4, #0x1 /*mult 2?*/
  ldr     r4,[sp,#0x34]
  add     r2,r4,r2
  mov     r1,r9
  ldr     r0,[r1]
  add     r0,r7,r0
 ldrb r1, [r0, #0x0]
 ldrb r0, [r0, #0x1]
 lsl r0, r0, #0x8
 orr r0, r1 /*Loads bytes Gets attack put into r0*/
  strh    r0,[r2] 

loc_8043F5A:
  mov     r5,r12
  cmp     r5, #0x13 /*Some kind of limit to attacks?*/
  bgt     loc_8043F70
  mov     r2,r9
  ldr     r0,[r2]
mov r1,#0x03
mul r1, r1, r5
  add     r1,r1,r0
ldrb r0, [r1, #0x2]
cmp     r0, #0xFF /*Term Check*/
  bne     loc_8043EA0

loc_8043F70:
  mov     r0,r10 /*Return Value*/

exit:
  add     sp, #0x3C
  pop     {r3-r5}
  mov     r8,r3
  mov     r9,r4
  mov     r10,r5
  pop     {r4-r7}
  pop     {r1}
  bx      r1 

bx_r3:
  bx r3
  
.align 2
.READ_Poke_DATA:
  .word 0x0803FBE9
.learned_moves_ptr:
  .word 0x0825D7B4
Código:
.text
.align 2
.thumb
.thumb_func
.global newmovesetstyle5

/* Escrito por: Gamer2020 */
/* En 0803EAFC escribe 00490847XXXXXXXX donde XXXXXXXX es la direccion de la rutina mas 1. */
/* En 0803EAD4 escribe 8078C046C046C046C046*/
/* En 0803EB04 escribe FF29*/
/* En 0803EAE2 escribe 5446C046*/
/* En 0803EB18 escribe 081CC046*/

/*0803EAFC*/
main:
  mov r1,#0x03
  mul r0, r0, r1 /*mult 3*/
  ldr     r1,[r3] /* Loads offset for mon*/
  add     r0,r0,r1
  ldrb r1, [r0, #0x2]    
  ldr    r0, .return
  bx    r0
  
.align 2
.return:
  .word 0x0803EB05
Código:
.text
.align 2
.thumb
.thumb_func
.global newmovesetstyle6

/* Escrito por: Gamer2020 */
/* Escribe esta rutina en 08043DD4. */

/*08043DD4*/
main:    
  push    {r4-r7,r14}
  mov     r6,r1
  lsl     r0,r0,#0x10 /* r0 holds species.*/
  mov     r5, #0x0
  mov     r4, #0x0
  ldr     r1,=.learned_moves_ptr
  lsr     r0,r0, #0x0E
  add     r0,r0,r1
  ldr     r2,[r0]
ldrb r0, [r2, #0x2]
cmp     r0, #0xFF /*Term Check*/
  beq     loc_8043E18
  mov     r3,r2

loc_8043DF6:
  mov     r1,r5
  add     r0,r1, #0x1
  lsl     r0,r0, #0x18
  lsr     r5,r0, #0x18
  lsl     r1,r1, #0x1
  add     r1,r1,r6
ldrb r2, [r3, #0x0]
ldrb r0, [r3, #0x1]
lsl r0, r0, #0x8
orr r0, r2 /*Loads bytes Gets attack put into r0*/
  strh    r0,[r1] 
  add     r3, #0x3 /* Increment. */
  add     r4, #0x1
  cmp     r4, #0x13
  bgt     loc_8043E18
ldrb r0, [r3, #0x2]
cmp     r0, #0xFF /*Term Check*/
  bne     loc_8043DF6

loc_8043E18: 
  mov     r0,r5
  pop     {r4-r7}
  pop     {r1}
  bx      r1

.align 2
.learned_moves_ptr:
  .word 0x0825D7B4

Esmeralda
Código:
.text
.align 2
.thumb
.thumb_func
.global newmovesetstyle1

/* Escrito por: Jambo51 */
/* Portado por: Gamer2020*/
/* En 0x693B0 escribe 18 49 08 47. En 0x69414 escribe XX XX XX 08, donde XX XX XX es la direccion de la rutina mas 1. */

main:
 mov r1, r9
 lsl r1, r1, #0x2
 ldr r0, table
 add r0, r0, r1
 ldr r0, [r0, #0x0]
 ldr r6, there
 add r6, #0x6
 ldrb r7, [r6, #0x0]
loop: lsl r1, r7, #0x1
 add r1, r1, r7
 add r3, r0, r1
 ldrb r1, [r3, #0x2]
 mov r4, r10
 cmp r4, r1
 beq learn
 cmp r1, #0xFF
 beq exit
 add r7, #0x1
 b loop
learn: ldr r2, there
 add r7, #0x1
 strb r7, [r6, #0x0]
 ldrb r1, [r3, #0x1]
 lsl r1, r1, #0x8
 ldrb r0, [r3, #0x0]
 orr r0, r1
 strh r0, [r2, #0x0]
 ldr r1, return
 bx r1
exit: ldr r0, return2
 bx r0
.align
return:  .word 0x080693F5
return2: .word 0x08069403
there:  .word 0x020244E2
table:  .word 0x0832937C
Código:
.text
.align 2
.thumb
.thumb_func
.global newmovesetstyle2

/* Escrito por: Jambo51 */
/* Mejorado por: DoesntKnowHowToPlay */
/* Portado por: Gamer2020*/
/* En 0x692A0 escribe 00 49 08 47 XX XX XX 08 donde XX XX XX es la direccion de la rutina mas 1. */

main:
 ldrb r1, [r0, #0x2]
 mov r2, #0xFF
 cmp r1, r2
 beq exit2
 lsl r2, #0x8
 add r2, #0xFF
 mov r9, r2
 mov r3, #0x0
loop: lsl r0, r3, #0x1
 add r0, r0, r3
 ldr r1, movesettable
 add r1, r1, r6
 ldr r1, [r1, #0x0]
 add r7, r0, r1
 ldrb r0, [r7, #0x2]
 mov r4, r10
 cmp r0, r4
 bgt exit2
 ldrb r1, [r7, #0x1]
 ldrb r0, [r7, #0x0]
 lsl r1, r1, #0x8
 orr r1, r0
 mov r0, r8
 str r3, [sp, #0x0]
 mov r4, r1
 bl branchone
 mov r5, #0xFF
 ldr r3, [sp, #0x0]
 cmp r0, r9
 bne exit
 mov r0, r8
 add r1, r4, #0x0
 bl branchtwo
 ldr r3, [sp, #0x0]
exit: add r3, #0x1
 mov r1, #0x3
 add r0, r7, r1
 ldrb r0, [r0, #0x2]
 cmp r0, r5
 bne loop
exit2: add sp, #0x4
 pop {r3-r5}
 mov r8, r3
 mov r9, r4
 mov r10, r5
 pop {r4-r7}
 pop {r0}
 bx r0
branchone: push {r4-r7,lr}
 add sp, #-0x4
 ldr r7, gothere
 bx r7
branchtwo: push {r4-r7,lr}
 ldr r7, gothere2
 bx r7
.align
gothere: .word 0x08069145
gothere2: .word 0x080694D3
movesettable: .word 0x0832937C
Código:
 .text
.align 2
.thumb
.thumb_func
.global newmovesetstyle3

/* Escrito por: Gamer2020 */
/* En 0x0806E100 escribe 00490847 XXXXXXXX donde XXXXXXXX es la direccion de la rutina mas 1. */

main:
MOV    R5, #0x0
LDR     R6, .learned_moves_ptr
LSL    R1, R7, #0x2
ADD    R2, R1, R6
LDR     R3, [R2]
ldrb r0, [r3, #0x2]
STR     R1, [SP,#0x14]
CMP     R0, #0xFF
BEQ     loc_8043DB4
MOV     R9, R2
STR     R3, [SP,#0x10]

loc_8043CE8:
mov r2,#0x03
mul r2, r2, r5 /*mult 3*/
  ldr     r1,[sp, #0x10] /* Use these two lines to get current attack address.*/
  add     r0,r2,r1
  mov     r7,r2
 ldrb r1, [r0, #0x0]
 ldrb r3, [r0, #0x1]
 lsl r3, r3, #0x8
 orr r3, r1 /*Puts attack in r3.*/
ldrb r0, [r0, #0x2] /*Puts level in r0.*/
ldr     r1,[sp,#0x0C] /* Loads current level */
  add     r5, #0x1 /* Loop counter? */
  mov     r12,r5
  cmp     r0,r1 /* compares levels */
  bgt     loc_8043D9E
  mov     r4, #0x0
  mov     r0,r13
  ldrh    r1,[r0]
  mov     r0,r3 /* Puts attack in r0 */
  cmp     r1,r0
  beq     loc_8043D38
  ldr     r0,[sp,#0x14]
  ldr     r1, .learned_moves_ptr
  add     r6,r0,r1
  mov     r3,r13
  mov     r5,r7

loc_8043D20:
  add     r3, #0x2
  add     r4, #0x1
  cmp     r4, #0x3
  bgt     loc_8043D38
  ldr     r0,[r6]
  add     r0,r5,r0
 ldrb r1, [r0, #0x0]
 ldrb r0, [r0, #0x1]
 lsl r0, r0, #0x8
 orr r0, r1 /*Puts attack in r0.*/
  ldrh    r2,[r3]
  cmp     r2,r0
  bne     loc_8043D20

loc_8043D38:
  cmp     r4,#0x4
  bne     loc_8043D9E
  mov     r4,#0x0
  cmp     r4,r10
  bge     loc_8043D7C
  mov     r1,r9
  ldr     r0,[r1]
  add     r0,r7,r0
 ldrb r1, [r0, #0x0]
 ldrb r0, [r0, #0x1]
 lsl r0, r0, #0x8
 orr r0, r1 /*Puts attack in r0.*/
ldr     r2,[sp,#0x8]
ldrh    r2,[r2]
  cmp     r2,r0
  beq     loc_8043D7C
  ldr     r1,[sp, #0x14]
  ldr     r2, .learned_moves_ptr
  add     r6,r1,r2
  ldr     r3,[sp, #0x8]
  mov     r5,r7

loc_8043D64:
  add     r3, #0x2
  add     r4,#0x1
  cmp     r4,r10
  bge     loc_8043D7C
  ldr     r0,[r6]
  add     r0,r5,r0
 ldrb r1, [r0, #0x0]
 ldrb r0, [r0, #0x1]
 lsl r0, r0, #0x8
 orr r0, r1 /*Puts attack in r0.*/
  ldrh    r2,[r3]
  cmp     r2,r0
  bne     loc_8043D64

loc_8043D7C:
  cmp     r4,r10
  bne     loc_8043D9E
  mov     r0,r10
  add     r0,#0x1
  lsl     r0,r0,#0x18
  lsr     r0,r0,#0x18
  mov     r10,r0
  lsl     r2,r4, #0x1
  ldr     r1,[sp,#0x8]
  add     r2,r2,r1
  mov     r4,r9
  ldr     r0,[r4]
  add     r0,r7,r0
 ldrb r1, [r0, #0x0]
 ldrb r0, [r0, #0x1]
 lsl r0, r0, #0x8
 orr r0, r1 /*Puts attack in r0.*/
  strh    r0,[r2]

loc_8043D9E:
  mov     r5,r12
  cmp     r5, #0x13
  bgt     loc_8043DB4
  mov     r1,r9
  ldr     r0,[r1]
mov r1,#0x03
mul r1, r1, r5 /*mult 3*/
  add     r1,r1,r0
  ldrh    r0,[r1] /* Load bytes for term check. */
ldrb r0, [r1, #0x2]
cmp     r0, #0xFF /*Term Check*/
  bne     loc_8043CE8

loc_8043DB4:
  mov     r0,r10
  add     sp, #0x18
  pop     {r3-r5}
  mov     r8,r3
  mov     r9,r4
  mov     r10,r5
  pop     {r4-r7}
  pop     {r1}
  bx      r1

.align 2
.learned_moves_ptr:
  .word 0x0832937C
Código:
.text
.align 2
.thumb
.thumb_func
.global newmovesetstyle4

/* Escrito por: Gamer2020 */
/* En 0806E25C escribe 004B1847xxxxxxxx donde xxxxxxxx es la direccion de la rutina mas 1. */

main:
  PUSH    {R4-R7,LR}
  MOV     R7, R10
  MOV     R6, R9
  MOV     R5, R8
  PUSH    {R5-R7}
  sub sp, sp, #0x3C
  add r6, r0, #0x0
  mov r0, #0x0
  mov r10, r0
  add r0, r6, #0x0
  mov r1, #0x41
  mov r2, #0x0
  ldr r3, .READ_Poke_DATA /*Get Species*/
  bl bx_r3
  lsl r0, r0, #0x10
  lsr r4, r0, #0x10
  add r0, r6, #0x0
  mov r1, #0x38
  mov r2, #0x0
  ldr r3, .READ_Poke_DATA /*Get Level*/
  bl bx_r3
  lsl r0, r0, #0x18 /*Drops leading 000000??*/
  lsr r0, r0, #0x18
  str r0, [sp, #0x30]
  mov r0, #0xce /*Check if slot 412*/
  lsl r0, r0, #0x01
  cmp r4, r0
  bne     loc_8043E68
  mov r0, #0x0
  b       exit

loc_8043E68:
  mov r5, #0x0
  lsl r4, r4, #0x02 /*Species x 4*/
  str r4, [sp, #0x38] /*Stores value for later */
  mov r4, sp

loc_8043E70:
  mov r1, r5
  add r1, #0xd
  mov r0, r6
  mov r2, #0x0
  ldr r3, .READ_Poke_DATA /*Get attacks*/
  bl bx_r3
  strh r0, [r4]
  add r4, #0x2
  add r5, #0x1 /*Loops through 4 attacks on Poke*/
  cmp r5, #0x3
  ble loc_8043E70
  mov r5, #0x0
  ldr     r3, .learned_moves_ptr
  ldr r2, [sp, #0x38]
  add r1, r2, r3
  ldr     r0,[r1]
ldrb r0, [r0, #0x2]
CMP     R0, #0xFF
  BEQ     loc_8043F70
  mov     r9,r1
  mov     r4,r13
  add     r4,#0x8
  str     r4,[sp,#0x34]        

loc_8043EA0:
  mov     r1,r9
  ldr     r0,[r1]
mov r2,#0x03
mul r2, r2, r5 /*mult 3*/
  add     r0,r2,r0
ldrb r0, [r0, #0x2] /*Puts level in r0.*/
  ldr     r4,[sp, #0x30] /*Loads mon level*/
mov     r1,r4
  mov     r7,r2
  add     r5, #0x1 /*Incremeants place*/
  mov     r12,r5
  cmp     r0,r1  /*Level Check*/
  bgt     loc_8043F5A
  mov     r4, #0x0
mov     r0,r9
ldr     r0,[r0]
 ldrb r1, [r0, #0x0]
 ldrb r0, [r0, #0x1]
 lsl r0, r0, #0x8
 orr r0, r1 /*Puts attack in r0.*/
     mov     r1,r13
  ldrh    r1,[r1]
  cmp     r1,r0
  beq     loc_8043EF2
  ldr     r0,[sp, #0x38]
  ldr     r1, .learned_moves_ptr
  add     r6,r0,r1
  mov     r3,r13
  mov     r5,r7

loc_8043EDA:
  add     r3, #0x2
  add     r4, #0x1
  cmp     r4, #0x3
  bgt     loc_8043EF2
  ldr     r0,[r6]
  add     r0,r5,r0
 ldrb r1, [r0, #0x0]
 ldrb r0, [r0, #0x1]
 lsl r0, r0, #0x8
 orr r0, r1 /*Loads bytes Gets attack put into r0*/
  ldrh    r2,[r3]
  cmp     r2,r0
  bne     loc_8043EDA

loc_8043EF2:
  cmp     r4, #0x4
  bne     loc_8043F5A
  mov     r4, #0x0
  cmp     r4,r10
  bge     loc_8043F38
  mov     r1,r9
  ldr     r0,[r1]
  add     r0,r7,r0
 ldrb r1, [r0, #0x0]
 ldrb r0, [r0, #0x1]
 lsl r0, r0, #0x8
 orr r1, r0 /*Loads bytes Gets attack put into r1*/
  ldr     r0,[sp,#0x34]
  ldrh    r2,[r0]
mov     r0,r1 /*Gets attack put into r0*/
  add     r1,sp,#0x8
  cmp     r2,r0
  beq     loc_8043F38
  ldr     r2,[sp,#0x38]
  ldr     r0, .learned_moves_ptr
  add     r6,r2,r0
  mov     r3,r1
  mov     r5,r7

loc_8043F20:
  add     r3, #0x2
  add     r4, #0x1
  cmp     r4,r10
  bge     loc_8043F38
  ldr     r0,[r6]
  add     r0,r5,r0 /*Attack*/
 ldrb r1, [r0, #0x0]
 ldrb r0, [r0, #0x1]
 lsl r0, r0, #0x8
 orr r0, r1 /*Loads bytes Gets attack put into r0*/
  ldrh    r2,[r3]
  cmp     r2,r0
  bne     loc_8043F20

loc_8043F38:
  cmp     r4,r10
  bne     loc_8043F5A
  mov     r0,r10
  add     r0, #0x1
  lsl     r0,r0, #0x18
  lsr     r0,r0, #0x18
  mov     r10,r0
  lsl     r2,r4, #0x1 /*mult 2?*/
  ldr     r4,[sp,#0x34]
  add     r2,r4,r2
  mov     r1,r9
  ldr     r0,[r1]
  add     r0,r7,r0
 ldrb r1, [r0, #0x0]
 ldrb r0, [r0, #0x1]
 lsl r0, r0, #0x8
 orr r0, r1 /*Loads bytes Gets attack put into r0*/
  strh    r0,[r2] 

loc_8043F5A:
  mov     r5,r12
  cmp     r5, #0x13 /*Some kind of limit to attacks?*/
  bgt     loc_8043F70
  mov     r2,r9
  ldr     r0,[r2]
mov r1,#0x03
mul r1, r1, r5
  add     r1,r1,r0
ldrb r0, [r1, #0x2]
cmp     r0, #0xFF /*Term Check*/
  bne     loc_8043EA0

loc_8043F70:
  mov     r0,r10 /*Return Value*/

exit:
  add     sp, #0x3C
  pop     {r3-r5}
  mov     r8,r3
  mov     r9,r4
  mov     r10,r5
  pop     {r4-r7}
  pop     {r1}
  bx      r1 

bx_r3:
  bx r3
  
.align 2
.READ_Poke_DATA:
  .word 0x0806A519
.learned_moves_ptr:
  .word 0x0832937C
Código:
.text
.align 2
.thumb
.thumb_func
.global newmovesetstyle5

/* Escrito por: Gamer2020 */
/* En 0806938C escribe 00490847xxxxxxxx donde xxxxxxxx es la direccion de la rutina mas 1.*/
/* En 08069364 escribe 8078C046C046C046C046 */
/* En 08069394 escribe FF29 */
/* En 08069372 escribe 5446C046 */
/* En 080693A8 escribe 081CC046 */

main:
  mov r1,#0x03
  mul r0, r0, r1 /*mult 3*/
  ldr     r1,[r3] /* Loads offset for mon*/
  add     r0,r0,r1
  ldrb r1, [r0, #0x2]    
  ldr    r0, .return
  bx    r0
  
.align 2
.return:
  .word 0x08069395
Código:
.text
.align 2
.thumb
.thumb_func
.global newmovesetstyle6

/* Escrito por: Gamer2020 */
/* Escribe esta rutina en 0806E204.*/

main:    
  push    {r4-r7,r14}
  mov     r6,r1
  lsl     r0,r0,#0x10 /* r0 holds species.*/
  mov     r5, #0x0
  mov     r4, #0x0
  ldr     r1,=.learned_moves_ptr
  lsr     r0,r0, #0x0E
  add     r0,r0,r1
  ldr     r2,[r0]
ldrb r0, [r2, #0x2]
cmp     r0, #0xFF /*Term Check*/
  beq     loc_8043E18
  mov     r3,r2

loc_8043DF6:
  mov     r1,r5
  add     r0,r1, #0x1
  lsl     r0,r0, #0x18
  lsr     r5,r0, #0x18
  lsl     r1,r1, #0x1
  add     r1,r1,r6
ldrb r2, [r3, #0x0]
ldrb r0, [r3, #0x1]
lsl r0, r0, #0x8
orr r0, r2 /*Loads bytes Gets attack put into r0*/
  strh    r0,[r1] 
  add     r3, #0x3 /* Increment. */
  add     r4, #0x1
  cmp     r4, #0x13
  bgt     loc_8043E18
ldrb r0, [r3, #0x2]
cmp     r0, #0xFF /*Term Check*/
  bne     loc_8043DF6

loc_8043E18: 
  mov     r0,r5
  pop     {r4-r7}
  pop     {r1}
  bx      r1

.align 2
.learned_moves_ptr:
  .word 0x0832937C
Aparte de estas rutinas también se debe tener en cuenta que hay dos rutinas más, en Emerald, que se refieren la tabla situada en 19FF98 y 1A01E8. No he incluido las versiones editadas de estas rutinas, simplemente porque no podía que el debugger rompa en ellos. No tengo idea de lo que los usa, pero te puedo decir que las 6 rutinas previstas son suficientes para hacer funcionar las cosas. Si algún día averigo lo que las otras rutinas son voy a publicar una actualización, pero no parecen ser importantes en este momento.

Una vez que se insertan esas rutinas de ASM es el momento de para algunas cosas aburridas. Las tablas de nivel para cada Pokemon necesitan cambiarse al nuevo formato utilizado por estas rutinas. El formato es el siguiente con "0000FF" como el terminador.

Código:
[Ataques - Mitad-Palabra - Hex Inversa] [Nivel - Byte]
Desafortunadamente, esto es mucho de hacer pero se necesita para que el hack funcione. Por suerte, si no se desea convertir el nivel de las tablas a sí mismo, puede utilizar Pokemon Game Editor para añadir más ataques y va a convertir las tablas para usted.

Cuando lo hayas hecho todo esto, ya ha terminado. En este punto, puede que desee editar inis para todos los programas que deseará utilizar su ROM. Las siguientes son las entradas que tendría que editar de Pokemon Game Editor.

Código:
AttackNames=31977C
NumberOfAttacks=354
AttackData=31C898
ContestMoveData=58C2B4
AttackDescriptionTable=61C524
AttackAnimationTable=2C8D6C
MoveTableHack=True
Esto debería ser todo lo que necesita para añadir más ataques a su ROM. Ahora usted puede seguir adelante con la creación de animaciones, efectos y todas esas cosas buenas. Por favor, siéntase libre de comentar si tiene alguna pregunta.
 

Omega

For endless fight
Miembro del equipo
Moderador/a
Respuesta: Añadiendo más ataques a Rojo Fuego y Esmeralda!

Exelente tuto bro, Tal vez lo practique luego Si no se me olvida
 

Naren Jr.

Puto amo
Usuario de Platino
Respuesta: Añadiendo más ataques a Rojo Fuego y Esmeralda!

Buen tutorial.

Te estas viviendo a tope con tutoriales y aportes.

Yo ya tengo los ataques expandidos con algo similar a esto, no los agregue yo pero al fijo usaré esto para colocar nuevos ataques.

Un saludo, +gracias y repu
 

Gamer2020

Accept no Imitations!
Usuario de Platino
Re: Añadiendo más ataques a Rojo Fuego y Esmeralda!

Gracias a todos. He añadido esto para Emerald en Pokemon Game Editor y he publicado una actualización .
 

FraynSebas

Psychedelic Client~
Respuesta: Añadiendo más ataques a Rojo Fuego y Esmeralda!

Tremendo tutorial, me gusta como explicaste.
Me ha funcionado, está de maravilla este tutorial por que trabajo en Esmeralda :D
Te ganaste un +gracias.
 
Respuesta: Añadiendo más ataques a Rojo Fuego y Esmeralda!

Wow que buen tuto! esto definitivamente lo usare.
GRACIAS por aportarlo buen hombre.
 

Noctul~

Usuario de Platino
Respuesta: Añadiendo más ataques a Rojo Fuego y Esmeralda!

Vaya pedazo de tuto que seguramente use en mi proyecto, gracias por traerlo
 

H.B.P

Emperador Kaktiácero
Miembro de honor
Respuesta: Añadiendo más ataques a Rojo Fuego y Esmeralda!

Aunque hoy en día tengamos tu fantástica herramienta, siempre es importante que sepamos qué tipo de cambios estamos realizando al utilizarla y en base a qué información fue desarrollada, así que espero que este comentario ayude a que el tema se haga notar, te llevas un +Gracias.
 
Estado
Cerrado para nuevas respuestas.
Arriba