Quote:
Originally Posted by metapod23
Oh, and I thought that ldrb was for reading one byte, and that two bytes = 16 bits. So if the game uses ldrb, it's only loading one byte?
|
I'm sorry, I should have been more clear. The Bulbapedia article says that the last two bytes of the Growth substructure are unknown. It groups them together as one halfword. However, because the game reads from that data in bytes, I'm guessing that instead the "unknown halfword" is actually two unknown bytes (though it might be safe to say that the second byte is no longer unknown).
I'm going to go do a little more research on that byte. Perhaps by looking at Mew's data (who I've heard is disobedient unless obtained legally or something like that) I can figure out if there's a certain value which makes a pokémon disobedient.
edit: At '0x0801D402' the game checks if the player's pokémon is Mew. I expanded the routine to add a check for Squirtle (which was the only other pokémon I had in my party at the time). And look what I got:
In an unedited ROM, all pokémon except Mew will always obey the player unless they don't have enough badges (but I didn't look up those routines). If the player
is using a Mew, it checks the top bit of the last byte in the Growth Structure. If it is set, then Mew will obey. If not, then Mew won't obey. By default, all pokémon don't have that bit set but because it isn't checked, it doesn't matter. However, in order to get Mew to obey, you need to use the 'setobedience' command to set that bit, unless you want to do the work of decrypting the Pokémon data and then recalculating the checksum. Once you use 'setobedience', Mew/Squirtle will start to obey again:
Because I'm a nice guy, here's the code:
Code:
.text
.align 2
.thumb
.thumb_func
.global hijack
@ put at 0x0801D404
@ also put 0x0000 at 0x081D402
main:
ldr r1, .ADDRESS
bx r1
.align 2
.ADDRESS:
.word 0x08720001
That branches off to the new routine at '0x720000' (that address can be changed) which is:
Code:
.text
.align 2
.thumb
.thumb_func
.global obedience
main:
cmp r0, #0x97 @ if current attacker == Mew
beq disobey
cmp r0, #0x07 @ if current attacker == Squirtle
beq disobey
mov r0, #0x01
ldr r1, .RESUME
bx r1
disobey:
ldr r1, .DISOBEY
bx r1
branchlink:
bx r3
.align 2
.RESUME:
.word 0x0801D42B
.DISOBEY:
.word 0x0801D415 @ goes on to check obedient byte
Obviously, you should change
#0x07 to
#0x06 for Charizard. That should do the trick.