Registrarse

[Rutina] [ASM] Wild Double Battle in BPRE

jiangzhengwenjz

Usuario mítico
Here's a new version of double wild battle: https://github.com/jiangzhengwenjz/Double_wild_battle
All information is included in ReadMe.txt

I'm here again and here's some information about double wild battle in BPRE. The system is not yet perfect, but I don't have time to improve it so I decided to release the code. Please credit Jambo51 because some of the codes are ripped from his FR649. However, iirr, Karatekid552 has released the ASM codes in FR649 on github, so I think it's not inappropriate to post them here. These routines will make it possible to have "double wild battle" in "grass battles".
Bugs fixed:
1. Loading only 1 pokemon
2. Capture animation
3. Audio error
4. Captured pokemon data
5. pokedex things
6. can't flee
7. nickname issues
Now the main bugs are all fixed and here's a picture of what we can do now. (I don't use an English ROM, sorry.)

The byte changes are in the comments of the routines, so please read carefully.
Código:
.thumb
/*0x82a26 -  04 49 08 47
0x82a38 - XX+1 XX XX 08
0x7F760 - 00 00*/

str r0, [sp]
ldr r0, .opponent_slot
add r1, r4, #0
add r2, r6, #0
mov r3, #0x20
ldr r4, .pokemon_make_3
bl linker_4
mov r1, #0
mov r2, #0

loop_1:
mov r4, #0x64
ldr r0, .party_slot
add r0, #0x56
mul r4, r1
add r0, r0, r4
ldrh r0, [r0]
cmp r0, #0
bne add_1

increment:
add r1, #1
cmp r1, #6
bne loop_1
cmp r2, #2
blt back_1
ldr r1, .offset
ldr r2, .save_block_1
ldr r2, [r2]
ldrb r3, [r2, #4] @bank
lsl r3, r3, #2
add r1, r1, r3
ldr r1, [r1]
ldrb r3, [r2, #5] @map
lsl r3, r3, #2
add r1, r1, r3
ldr r1, [r1]
ldr r1, [r1]
ldr r3, [r1, #0x10]
ldr r2, .tileset_table
cmp r3, r2
bne back_1
bl get_block_id
mov r2, #0

loop_2:
mov r1, pc
add r1, #0x92
lsl r3, r2, #2
add r1, r1, r3
ldrh r3, [r1]
cmp r0, r3
beq calculation
ldr r1, .end
cmp r1, r3
beq back_1
add r2, #1
b loop_2

add_1:
add r2, #1
b increment

back_1:
mov r0, #0
ldr r1, .battle_flag
str r0, [r1]

back_2:
add sp, sp, #0x10
pop {r4-r6, pc}

get_block_id:
push {lr}
ldr r0, .npc_state
ldrh r1, [r0, #0x12] @Y
ldrh r0, [r0, #0x10] @X
ldr r4, .getter
bl linker_4
pop {pc}

calculation:
ldrb r4, [r1, #2]
cmp r4, #0x63
bhi doubletwo
bl random
mov r1, #0x64
bl mod_func

doublethree:
add r1, r4, #0
cmp r0, r1
bge back_1

double: 
mov r0, #1
ldr r1, .battle_flag
str r0, [r1]
ldr r4, .rand_grass
bl linker_4
ldr r1, [r7, #4]
lsl r0, r0, #2
add r0, r0, r1
ldrh r4, [r0, #2]
ldr r1, .generate
bl linker_1
add r6, r0, #0
bl random
mov r1, #0x19
bl mod_func
str r0, [sp]
ldr r0, .opponent_slot
add r0, #0x64
add r1, r4, #0
add r2, r6, #0
mov r3, #0x20
ldr r4, .pokemon_make_3
bl linker_4
b back_2

doubletwo:
mov r0, #0
b doublethree

mod_func:
ldr r3, .mod_addr
bx r3

random:
ldr r2, .rand
bx r2

linker_1:
bx r1

linker_4:
bx r4

.word 0x0005000A
.word 0x0005000B
.word 0x0005000C
.word 0x0005000D
.hword 0xFEFE

.align 2
.opponent_slot: .word 0x0202402C
.pokemon_make_3: .word 0x0803DD99
.party_slot: .word 0x02024284
.battle_flag: .word 0x02022B4C
.offset: .word 0x083526A8
.save_block_1: .word 0x03005008
.tileset_table: .word 0x082D4A94
.npc_state: .word 0x02036E38
.getter: .word 0x08058E49
.end: .word 0x0000FEFE
.mod_addr: .word 0x081E4685
.rand: .word 0x08044EC9
.rand_grass: .word 0x0808274D
.generate: .word 0x080828F9
Código:
.thumb
.align 2
/*0x16824 - 00 48 00 47 JJ+1 JJ JJ 08*/
cmp r3, #5
beq .L_1
mov r0, #1
and r3, r0
cmp r3, #0
bne .L_0

.L_1:
ldr r0, =0x801682D
bx r0

.L_0:
ldr r0, =0x801682D
add r0, #0x42
bx r0
Código:
.thumb
/*Change all 1D 1E 0A 08 to the pointer (+1) to this routine, and please do the change before inserting the routine!!!!!!!!!!!!!!!!!!*/
ldr r1, .battle_flag
ldr r1, [r1]
cmp r1, #5
bne normal
ldr r1, .struct
mov r2, #0x58
lsl r2, r2, #1
add r2, r1, r2
ldrh r1, [r1, #0x28]
ldrh r2, [r2, #0x28]
mul r1, r2
cmp r1, #0
bne two_mon
normal:
ldr r1, .pokeball
bx r1
two_mon:
push {r4, lr}
mov r0, #0
mov r1, #2
ldr r2, .string_shown
ldr r3, .bag_print
ldr r4, .texter
bl jump
pop {r4, pc}
jump:
bx r4

.align 2
.battle_flag: .word 0x2022B4C
.pokeball:  .word 0x80A1E1D
.struct: .word 0x2023C3C
.bag_print: .word 0x810a1f9
.texter: .word 0x08108E71
.string_shown: .word 0x08[text offset]
Please change [text offset] to a piece of text data. The text should be like "There're 2 pokemon on the opponent side and i can't lock on the target".
Código:
.thumb
.align 2
/*21d46 - 00 47
21d94 - ZZ+1 ZZ ZZ 08*/
ldr r0, =0x2022b4c
ldr r0, [r0]
cmp r0, #5
beq double

audio:
ldr r0, =0x137
ldr r1, =0x80722A1
bl jump
ldr r1, =0x8021D4B

jump:
bx r1

double:
ldr r0, =0x2023C3C
mov r1, #0x58
lsl r1, r1, #1
add r1, r0, r1
ldrh r0, [r0, #0x28]
ldrh r1, [r1, #0x28]
add r0, r0, r1
cmp r0, #0
beq audio
ldr r1, =0x8021D4B
add r1, #8
bx r1
Código:
.thumb
.align 2
/*0x2D44C - 30 47
0x2D480 - MM+1 MM MM 08
0x2D812 - 00 00
0x2D858 - 00 00
0x2D8A6 - 00 00
0x2D8F4 - 01 1C
0x2DF36 - 08 1C
0x2DE58 - 00 00
0x2DE84 - 00 00
0x2DEA4 - 00 00
0x2DEC2 - 04 1C
0x2D874 - 6C 3D 02 02
0x2D94C - 6C 3D 02 02
0x2DF64 - 6C 3D 02 02
0x2DF04 - 6C 3D 02 02*/
ldr r6, =0x2022b4c
ldr r6, [r6]
cmp r6, #5
bne normal
ldr r6, =0x2023C3C
ldrh r6, [r6, #0x28]
cmp r6, #0
bne case_1

case_2:
mov r0, #3
b back

case_1:
mov r0, #1
b back

normal:
mov r1, #1
eor r0, r1

back:
ldr r6, =0x2023D6C
ldr r1, =0x802d451
bx r1
Código:
.thumb
.align 2
/*0x2d95c - 00 48 00 47 NN+1 NN NN 08*/
push {r4, r5, lr}
ldr r4, =0x0202402C
ldr r0, =0x02023D6C
ldrb r0, [r0]
lsr r0, r0, #1
mov r1, #0x64
mul r0, r1
add r0, r0, r4
add r4, r0, #0
mov r1, #0xb
ldr r2, =0x0802D965
bx r2
Código:
.thumb
.align 2
/*0x2d9de - 00 47
0x2da00 - UU+1 UU UU 08*/
ldr r0, =0x0202402C
ldr r1, =0x02023D6C
ldrb r1, [r1]
lsr r1, r1, #1
mov r2, #0x64
mul r1, r2
add r0, r1, r0
mov r1, #0xb
ldr r2, =0x0802D9E1
bx r2
Código:
.thumb
.align 2
/*0xEF5F8 - 10 47
0xEF680 - QQ+1 QQ QQ 08*/
ldr r2, =0x02037F1B
ldr r0, =0x02022B4C
ldr r0, [r0]
cmp r0, #5
bne normal
ldr r0, =0x02023C3C
mov r1, #0x58
lsl r1, r1, #1
add r1, r0, r1
ldrh r1, [r1, #0x28]
cmp r1, #0
beq normal
mov r1, #3
strb r1, [r2]

normal:
mov r8, r2
ldr r0, =0x080EF5FB
bx r0

After inserting the first routine, there will be a table in this format: 0A 00 05 00 0B 00 05 00 0C 00 05 00...... (The table is in the first routine and you can search for it)
The "05" is the rate of double battle in grass battles, which means 5% and you can change that on your own.
A, B, C, D are the ID of the 4 grass tile blocks and it's compatible with the clean BPRE 1.0 ROM.

As for now, there should still be some bugs like the fact that the name of captured pokemon is not shown right, but I won't do it now because I'm busy with my univ life. :)
 
Última edición:

Gold

Porrero a tiempo parcial
Miembro insignia
Amazing! I've looking for this a long time, thanks!!! c:
 

BLAx501!

A veces comento en temas :3
Miembro de honor
Usuario de Platino
Wow, @jiangzhengwenjz, simply amazing dude. Thanks for bringing this to our forum :D

I will be very useful for many people (like me(?) )
 

Sayer301!

UnityLord!
Miembro de honor
WADAFAK!!!

Queeeee guapo!!! Mola deeemasiado, te hablo en español porque no se inglés XD, pero vamos que me parece una lástima que aun tenga esos pequeños bugs, aun así tengo ganas de probarlo ya!

Gracias por traerlo, engorilao!
 

Aguiar

Colega de los colegas
Miembro del equipo
Staff
Vaya maquinote el colega de aquí! Pues como mola, muchas gracias por compartirlo!
 

jiangzhengwenjz

Usuario mítico
Re: Respuesta: [ASM] Wild Double Battle in BPRE

WADAFAK!!!

Queeeee guapo!!! Mola deeemasiado, te hablo en español porque no se inglés XD, pero vamos que me parece una lástima que aun tenga esos pequeños bugs, aun así tengo ganas de probarlo ya!

Gracias por traerlo, engorilao!
Vaya maquinote el colega de aquí! Pues como mola, muchas gracias por compartirlo!
Thanks for your supporting! ;)
 

Dragonite

But where's your heart
Lástima que tengas que noquear a uno de los dos Pokémon para atrapar el otro, pero bueno, supongo que en el futuro un poco de ASM solucionará eso.
 

jiangzhengwenjz

Usuario mítico
Re: Respuesta: [ASM] Wild Double Battle in BPRE

Lástima que tengas que noquear a uno de los dos Pokémon para atrapar el otro, pero bueno, supongo que en el futuro un poco de ASM solucionará eso.
This is imitating the Gen V style double wild battle so you should defeat one of them. :D
 

Versekr Dark

Usuario mítico
Disculpen mi ignorancia pero no se que hacer en esta parte:

*Change all 1D 1E 0A 08 to the pointer (+1) to this routine, and please do the change before inserting the routine!!!!!!!!!!!!!!!!!!*/
 

jiangzhengwenjz

Usuario mítico
Re: Respuesta: [ASM] Wild Double Battle in BPRE

Disculpen mi ignorancia pero no se que hacer en esta parte:

*Change all 1D 1E 0A 08 to the pointer (+1) to this routine, and please do the change before inserting the routine!!!!!!!!!!!!!!!!!!*/
I sent you a VM in pokecommunity. BTW, I really don't recommend you to do it in FR, because it's a bit buggy.
 

Eon Code

Profesional de WaH
I always wanted to do dual battles in wild you have made the same amazing thing like the boy who descovered how to megaevolve in gba!
 

jiangzhengwenjz

Usuario mítico
Re: Respuesta: [ASM] Wild Double Battle in BPRE

I always wanted to do dual battles in wild you have made the same amazing thing like the boy who descovered how to megaevolve in gba!
They're not similar to each other. The dual battle is originally implemented in GEN III pokemon games, but it's not used in-game and it's very buggy. What we do is to enable the game to generate 2 pokemon in wild and fix bugs in it. Nevertheless, this version is still buggy in FR because it even do not have the double trainer battle. The same thing in EM may be better as I guess. (GOGO has ported it to EM)
However, the MEGA system is not in the original game at all, so you should build it from 0.
 

Eon Code

Profesional de WaH
Respuesta: Re: Respuesta: [ASM] Wild Double Battle in BPRE

They're not similar to each other. The dual battle is originally implemented in GEN III pokemon games, but it's not used in-game and it's very buggy. What we do is to enable the game to generate 2 pokemon in wild and fix bugs in it. Nevertheless, this version is still buggy in FR because it even do not have the double trainer battle. The same thing in EM may be better as I guess. (GOGO has ported it to EM)
However, the MEGA system is not in the original game at all, so you should build it from 0.
I was just saying its a miracle :p
 

Versekr Dark

Usuario mítico
Disculpa, hay un error, lo he logrado a completar a quedado al 100%, pero el error que he visto es que si llevamos un huevo en el segundo puesto el primer pokémon se duplica, no se si pueda haber una solución :)
 

Versekr Dark

Usuario mítico
Respuesta: Re: Respuesta: [ASM] Wild Double Battle in BPRE

They're not similar to each other. The dual battle is originally implemented in GEN III pokemon games, but it's not used in-game and it's very buggy. What we do is to enable the game to generate 2 pokemon in wild and fix bugs in it. Nevertheless, this version is still buggy in FR because it even do not have the double trainer battle. The same thing in EM may be better as I guess. (GOGO has ported it to EM)
However, the MEGA system is not in the original game at all, so you should build it from 0.
Disculpe no funciona en cueva, ni en agua, hay manera de hacerlo funcionar?
 

BluRose

chiste, chiste
Respuesta: Re: Respuesta: [ASM] Wild Double Battle in BPRE

They're not similar to each other. The dual battle is originally implemented in GEN III pokemon games, but it's not used in-game and it's very buggy. What we do is to enable the game to generate 2 pokemon in wild and fix bugs in it.
Nevertheless, this version is still buggy in FR because it even do not have the double trainer battle.
The same thing in EM may be better as I guess. (GOGO has ported it to EM)
However, the MEGA system is not in the original game at all, so you should build it from 0.
Wrong. Fire Red has various instances of Double Trainer Battles, namely in the form of:
- "Young Couple"
- "Sis and Bro"s
- "Cool Couple"s
- "Crush Kin"
 
Arriba