Well if they work then I apologize! I was under the impresion that that "required" code was what determined more than just used in decrypting. So good job on simplifying those then!
Thank you for your reply!
Actually only 2 (maybe 3) are tested ok and the others are not tested and my friend is sparing his time testing them so they may have problem at the moment. Therefore, you may be right about keeping these "required" codes and i may be wrong as everything is not explicit now.
Anyway, I'm a bit confused with the function at 0x43110 as it is treated as the abort routine but also used as 6 different evolution methods. I cannot find out how it can distinguish them and I do not have much time to research it.....
Thank you very much if you can test and add them ;)
For the latter sentence, r u speaking of the last function? Then r4 needn't be protected as the decrypter function pushes and pops r4 so it won't change XD
And please ignore the last function as it is very bugged and it couldn't be done if the pokemon is not the first one in the party. (I tried to change r8 to fix it as you can see in the label "adjust", but failed.)
Then I've just written a routine to evolve at specific level (the second parameter in the evolution table) when it detects a certain event has happened by checking flag 0x200. Not tested.
Spoiler:
Code:
.thumb
mov r0, #0x1
lsl r0, r0, #0x9 @you can change the flag ID here and I use 0x200
push {r1-r7}
ldr r1, decrypter
bl decrypt
pop {r1-r7}
cmp r0, #0x1
bne abort
ldr r0, evolve
bx r0
abort:
ldr r0, evolve
add r0, #0xfa
bx r0
decrypt:
bx r1
.align 2
decrypter: .word 0x0806e6d1
evolve: .word 0x8043017
In addition, the routine checking if the Pokemon is shiny to go to level evolution. (Also not tested and I'm a bit not sure if the pokemon data pointer is in r8)
And here I will post the simplified routines in the thread, all not tested. (The routines I write before several days will also be included)
Now the simplified routines are all finished because i only simplified some of them.
I won't simplify the other routines because I'm very lazy and busy. I think they are great and do not need modification.
If you've found any glitches, please post a reply to this post and testing them is very appreciated.
I am not sure if my way of writing evolution routines is correct as it looks different from the original ones in the thread.
All the ASM codes who was simplified by jiangzhengwenjzw have been tested by me, they were working properly. Very nice to see these.
All the ASM codes who was simplified by jiangzhengwenjzw have been tested by me, they were working properly. Very nice to see these.
Thank you very much for your testing!
If you (or anyone) make sure that my simplified routines work properly in FR, you can just use them and bear in mind that you should absolutely keep the original credits and credit of mine is not needed as I actually only do the simplification work.
I hope that someone will check the 2 custom routines written by me though they are not such useful as far as I know XD
New working and tested routine:
Item and Level evolution!
Note: This works based on one item per routine!!! So you can reuse this for every Pokemon that needs metal coat, but if you want another one to use a Pokeball then you need to edit the routine(just one byte real simple)
Once G3HS is updated to support multiple arguments for evolutions this will make the routine customizable.
New working and tested routine:
Item and Level evolution!
Note: This works based on one item per routine!!! So you can reuse this for every Pokemon that needs metal coat, but if you want another one to use a Pokeball then you need to edit the routine(just one byte real simple)
Once G3HS is updated to support multiple arguments for evolutions this will make the routine customizable.
Tested. The parameter in G3HS (or you use HxD) is the same as "specific map evolution", which means [byte-mapbank][byte-mapnumber]
The coordinates are reversed in the routine, so please be careful. It should be [hword-Y][hword-X]
For example, if you want your pokemon to evolve in (0x23,0x10e), You should put 0x010e0023 in the above routine.
How about Karrablast-Shelmet trade evolution, Gligar and Sneasel evolution, and Inkay evolution? I believe Inkay's is almost impossible?
There already is Gligar and Sneasel evolution, look up the first post and see "day/night evolution while holding an item". How would you want Inkay's evolution to look like on a emulator though?
There already is Gligar and Sneasel evolution, look up the first post and see "day/night evolution while holding an item". How would you want Inkay's evolution to look like on a emulator though?
I'm sorry that I overlooked the Gligar and Sneasel evolution method... Hmm, yeah that's what I'm also thinking right now...
1. I noticed that it said Day and night specific evolution methods, I thought there wasnt a day and night feature in FR
2. With specific map evolution not being available in G3HS yet and Hex edit only, what is being said here, how to implement it?
3. The Gender evolutions is it where like for example we have gallade a non stone evo, the only way we get garveoir and gallade is dependent on leveling up with corresponding gender?
4. And when you said dont forget to update your pokemon base stats table, what do we update? and where is it? And what is done if it is not update?
5. The day and night time hold item, where says if you edited the pokemon data structure table in the RAM the item clearing will not work, what does this mean?
6. And can you expand on the day and night friendship issue? Having to edit the routine in the table, because they dont work in FR?
Sorry for a lot of questions lol
__________________
Hey guys. lol i didnt think my username through. Wish i could change it.
Hey guys, I think you would enjoy a Pokemon RPG: Pokemon Eclipse!
Originally Posted by The Legacy of The Legends Creator :D
I have a few questions ;3;
Spoiler:
1. I noticed that it said Day and night specific evolution methods, I thought there wasnt a day and night feature in FR
2. With specific map evolution not being available in G3HS yet and Hex edit only, what is being said here, how to implement it?
3. The Gender evolutions is it where like for example we have gallade a non stone evo, the only way we get garveoir and gallade is dependent on leveling up with corresponding gender?
4. And when you said dont forget to update your pokemon base stats table, what do we update? and where is it? And what is done if it is not update?
5. The day and night time hold item, where says if you edited the pokemon data structure table in the RAM the item clearing will not work, what does this mean?
6. And can you expand on the day and night friendship issue? Having to edit the routine in the table, because they dont work in FR?
Sorry for a lot of questions lol
1. You have to insert an rtc yourself using a day night tool
2. Like all the new evolution methods you have to change the .ini
3. The stone gender evolutions have not yet been made yet
4,5,6. not sure
Originally Posted by The Legacy of The Legends Creator :D
I have a few questions ;3;
Spoiler:
1. I noticed that it said Day and night specific evolution methods, I thought there wasnt a day and night feature in FR
2. With specific map evolution not being available in G3HS yet and Hex edit only, what is being said here, how to implement it?
3. The Gender evolutions is it where like for example we have gallade a non stone evo, the only way we get garveoir and gallade is dependent on leveling up with corresponding gender?
4. And when you said dont forget to update your pokemon base stats table, what do we update? and where is it? And what is done if it is not update?
5. The day and night time hold item, where says if you edited the pokemon data structure table in the RAM the item clearing will not work, what does this mean?
6. And can you expand on the day and night friendship issue? Having to edit the routine in the table, because they dont work in FR?
Sorry for a lot of questions lol
2. It means that you have to go into the ROM and edit the evolution to change which map it uses.
3.Actually the gender by stone evolution has been done by Gogo and I madea version myself, but as I am not satisfied with how I did it, I am not releasing it till I fix it.
4. If you dont know, then dont worry about it.
5. Again, if you dont know, dont worry about it.
6. Not entirely sure what you're asking here.
Quote:
Originally Posted by PurpleOrange
1. You have to insert an rtc yourself using a day night tool
2. Like all the new evolution methods you have to change the .ini
3. The stone gender evolutions have not yet been made yet
4,5,6. not sure
Actually the gender by stone evolution has been done by Gogo and I made a version myself, but as I am not satisfied with how I did it, I am not releasing it until I fix it.
Originally Posted by The Legacy of The Legends Creator :D
Why would i not worry about if i just dont know,i dont know if its something i may have to do, id like to know, im trying to learn.
Why would i not need to know?
Cause both require you to knowengly have changed them.
For the pokemon stats, if youve expanded then yes change it, and for the other, that requires quite a bit of ASM to change the layout of the stats in RAM.
Im not saying dont learn. Im saying if you dont know if theyre changed then they arent changed.
Firstly, the tutorial tells us a lot, thanks.
But there's a serious problem that the "required codes" in the thread is actually not need, you can always use your own code to load parameters and handle registers. Actually it's more safe and simple so why should we always push & pop r0-r7?
Another thing is that there're levelcheckloc & evoloc. The former will check the parameter of level, so in some cases, like the D/N evolution, we will never use any of the "required codes" because the routine itself will handle all the things and we don't need to load parameters except level. :)
Looking to pick this up from where it stopped.
I want the following evolutions, and I'll be trying them from now on:
- Level + Item;
- Gender + Stone;
- Level + Pokémon in Party > loses that Pokémon from the party.
Those are the ones I'm trying.
It would be great to receive help. joexv, you are more than welcome to step in!
By the way, where can I find the "Hold Induced Evolution" without any specific time (no Day/Night) and the "Stone Evolution" with gender?
Hold induced?
Also, I saw comments on Gender + Stone and Level + Item been done. Can you confirm?
joexv was working on them, but he didn't come to a working completion. We were also trying to find why stone evolutions can't be cancelled.
Hold induced?
Also, I saw comments on Gender + Stone and Level + Item been done. Can you confirm?
joexv was working on them, but he didn't come to a working completion. We were also trying to find why stone evolutions can't be cancelled.
Yeah... Hold induced is when a Pokémon levels up and evolve while holding a necessary item... Those are already made but in a specific time (day or night)... I'm just not sure if there's something like that without the day or night condition exist... I'm also not sure if that's the same with Level + Item which does exist...
The Gender + Stone, I'm not sure... I haven't seen that yet...
Yeah... Hold induced is when a Pokémon levels up and evolve while holding a necessary item... Those are already made but in a specific time (day or night)... I'm just not sure if there's something like that without the day or night condition exist... I'm also not sure if that's the same with Level + Item which does exist...
The Gender + Stone, I'm not sure... I haven't seen that yet...
Don't know how you can pick a specific time of the day and a specific item, but that doesn't include specific level. Pokémon just level up, but still, that's two arguments. Changing the daytime to be level, should work.
I say this, 'cause if I'm not wrong, they are in the main post.
Need a more experienced fellow hacker here, as I haven't had the chance to try it myself, yet.
Is it possible to run a code like this:
Spoiler:
Code:
Special Evolution
LevelItemBuffer:
load into r1 the Pokémon's level
load into r2 the Pokémon's held item
CheckArgument1: //let's say "Level 40 + Metal Coat" (for Steelix, maybe)
compare level to 40
if not, go to CheckArgument2
compare item to Metal Coat
if not, go to CheckArgument2
move rx, #0x1
go to Evolution
CheckArgument2: //let's go with "Level 40 + Magmarizer" (Magmortar)
compare level to 40
if not, go to CheckArgument3
compare item to Magmarizer
if not, go to CheckArgument3
move rx, #0x2
go to Evolution
CheckArgument3: //let's say "Level 30 + Metal Coat" (for Scizor now)
compare level to 30
if not, go to NoEvo
compare item to Metal Coat
if not, go to NoEvo
move rx, #0x3
go to Evolution
NoEvo:
simply return
Evolution:
makes the evolution happening based on the argument in rx
What's the idea? Since we can have an argument up to #0xFF, I first thought that we could make argument 101 on level be like "Level 40 + Metal Coat", but then I remembered that the "Level" evolution routine wouldn't check for items, so it's not much use.
But if we could make another evolution method, one that runs a check for every type of evolution you want and simply give it an argument value, it could work.
Of course, there are probable ways of making this way more efficient, since looking for 0xFF possibilities could take a while, though I don't think people will do that many evolution types.
I had an idea of putting all equal level checks together, or items. That way, instead of jumping to the next check, we could have something like this:
Spoiler:
Code:
Special Evolution
LevelItemBuffer:
load into r1 the Pokémon's level
load into r2 the Pokémon's held item
CheckArgument1: //let's say "Level 40 + Metal Coat" (for Steelix, maybe)
compare item to Metal Coat.
if not, go to CheckArgument3
compare level to 40
if not, go to CheckArgument2
move rx, #0x1
go to Evolution
CheckArgument2: //let's say "Level 30 + Metal Coat" (for Scizor now)
compare item to Metal Coat
if not, go to CheckArgument3
compare level to 30
if not, go to CheckArgument3
move rx, #0x2
go to Evolution
CheckArgument3: //let's go with "Level 40 + Magmarizer" (Magmortar)
compare item to Magmarizer
if not, go to NoEvo
compare level to 40
if not, go to NoEvo
move rx, #0x3
go to Evolution
NoEvo:
simply return
Evolution:
makes the evolution happening based on the argument in rx
Problem is I only have 3 arguments in this example, but since I let all Metal Coat evolutions together, if the first check doesn't find a Metal Coat, it goes straight to the next item, ignoring all the possible levels + Metal Coat. Even comparing Metal Coat again is deletable, since if it's not Metal Coat, the code will jump all Metal Coat evolutions. I only let there to show the idea (and to be safe).
The problem now is, can this idea work? The argument stops being two things. It's two checks, and then you give a single argument for each combination. Aaaand, it can be edited via G3HS.
Thanks for the attention.
EDIT:
Okay, I've worked on getting what every register meant before calling an evolution routine and wrote this, based on kearnseyboy6's routines, what's in IDA and the game.
I didn't have time to finish this up and clearly this is meant for my own hack, knowing what evolutions I will need. If it works, it'll be easily editable to get a different combination of levels and items for each argument entry.
Spoiler:
Code:
.text
.align 2
.thumb
.thumb_func
.global LevelItemEvo
Main:
push {r0-r7}
add r0, r6, r7
lsl r0, r0, #0x3
add r0, r2, r0
add r1, r0, r3
ldrb r0, [r1, #0x2]
//r0 holds the Pokémon's evolution argument value (not type of evolution, nor to which Pokémon it evolves)
BufferHeldItem:
//load Pokémon's held item in r6
Level10:
cmp r9, #0x9
bhi Level10SilverPowder
Level12:
cmp r9, #0xB
bhi Level12BeigeBelt
Level20:
cmp r9, #0x13
bhi Level20DeepSeaTooth
Level30:
cmp r9, #0x1D
bhi Level30RazorFang
Level40:
cmp r9, #0x27
bhi Level40Magnet
Level50:
cmp r9, #0x31
bhi Level50MetalCoat
mov r5, #0x0
b ArgumentCheck
Level10SilverPowder:
cmp r6, #0xBC
bne Level10PoisonBarb
mov r5, #0x1
b ArgumentCheck
Level10PoisonBarb:
cmp r6, #0xD3
bne WrongItem
mov r5, #0x2
b ArgumentCheck
Level12BeigeBelt:
cmp r6, #0xBeigeBeltID
bne Level12RedBelt
mov r5, #0x3
b ArgumentCheck
Level12RedBelt:
cmp r6, #0xRedBeltID
bne Level12BlueBelt
mov r5, #0x4
b ArgumentCheck
Level12BlueBelt:
cmp r6, #0xBlueBeltID
bne WrongItem
mov r5, #0x5
b ArgumentCheck
Level20DeepSeaTooth:
cmp r6, #0xC0
bne Level20DeepSeaScale
mov r5, #0x6
b ArgumentCheck
Level20DeepSeaScale:
cmp r6, #0xC1
bne WrongItem
mov r5, #0x7
b ArgumentCheck
Level30RazorFang:
cmp r6, #0xRazorFangID
bne Level30RazorClaw
mov r5, #0x8
b ArgumentCheck
Level30RazorClaw:
cmp r6, #0xRazorClawID
bne Level30MetalCoat
mov r5, #0x9
b ArgumentCheck
Level30MetalCoat:
cmp r6, #0xC7
bne WrongItem
mov r5, #0xA
b ArgumentCheck
Level40Magnet:
cmp r6, #0xD0
bne Level40DragonScale
mov r5, #0xB
b ArgumentCheck
Level40DragonScale:
cmp r6, #0xC9
bne Level40MetalCoat
mov r5, #0xC
b ArgumentCheck
Level40MetalCoat:
cmp r6, #0xC7
bne Level40Electirizer
mov r5, #0xD
b ArgumentCheck
Level40Electirizer:
cmp r6, #0xElectirizerID
bne Level40Magmarizer
mov r5, #0xE
b ArgumentCheck
Level40Magmarizer:
cmp r6, #0xMagmarizerID
bne Level40SpellTag
mov r5, #0xF
b ArgumentCheck
Level40SpellTag:
cmp r6, #0xD5
bne WrongItem
mov r5, #0x10
b ArgumentCheck
Level50MetalCoat:
cmp r6, #0xC7
bne WrongItem
mov r5, #0x11
b ArgumentCheck
WrongItem:
mov r5, #0x0
b ArgumentCheck
ArgumentCheck:
cmp r0, r5 //say argument 1 is Level 10 + Silver Powder. If the Pokémon matches both requirements, it will receive argument #0x1 and will evolve
beq Evolution
//REST OF THE CODE I HAVEN't WORKED UP YET