Advertiser Content

Development [FR] Inverse Battles

Started by DoesntKnowHowToPlay December 4th, 2013 4:51 PM
  • 9063 views
  • 20 replies

DoesntKnowHowToPlay

Tiny Umbrella with Lots and Lots of Good

Seen 2 Weeks Ago
Posted June 15th, 2017
258 posts
7.9 Years


In XY, there is a new type of battle known as the Inverse Battle. In this mode, type match-ups are reversed- moves that are normally super-effective become ineffective, and moves that are normally resisted or would have no effect become super-effective. I did some poking at the type chart code recently and found that it's actually quite easy to implement these in FR.

"But that's easy! Just edit the well-documented type chart so every match-up is backwards!"

That isn't what this does. This hack hijacks the code that reads the type chart to make the game use the inverse of what's there. This means you can use a flag to have hacks with both regular and inverse battles.

The routine is as follows:

.align 2
.thumb
.thumb_func
push {r4, r5, lr}
mov r4, r0
mov r0, #0x02
lsl r0, #0x8
mov r1, #0x3D
add r0, r1
bl FlagCheck
cmp r0, #0x0
beq End
cmp r4, #0x0
beq SuperEffective
cmp r4, #0x5
beq SuperEffective
cmp r4, #0x14
beq Ineffective
b End

SuperEffective:
mov r4, #0x14
b End

Ineffective:
mov r4, #0x5

End:
ldr r5, .damageAddr
ldr r0, [r5, #0x0]
mul r0, r4
ldr r1, .returnAddr
bx r1

FlagCheck:
ldr r2, .flagAddr
bx r2


.align 2
.returnAddr: .word 0x0801e77d
.flagAddr: .word 0x0806e6d1
.damageAddr: .word 0x02023d50
.end
You can insert it anywhere. To call it, insert 00 49 08 47 at x1E770, followed by a pointer to where you inserted the method + 1. (For example, I inserted the method at x170900- I would put 00 49 08 47 01 09 17 08 at x1E770).

This code ties the Inverse Battle rules to flag x23D. If flag x23D is set, battles will use the Inverse Battle ruleset- otherwise they will work normally. If you want to use a different flag, you can change it quite easily by adjusting the values on the sixth and eighth lines. Note that in vanilla FireRed, flag x23D is used by the Pokeflute- if that script is still in the game you will want to pick a different one.

Lance32497

LanceKoijer of Pokemon_Addicts

Male
Criscanto town-Ginoa Region xD
Seen August 13th, 2017
Posted January 1st, 2017
793 posts
5.3 Years


In XY, there is a new type of battle known as the Inverse Battle. In this mode, type match-ups are reversed- moves that are normally super-effective become ineffective, and moves that are normally resisted or would have no effect become super-effective. I did some poking at the type chart code recently and found that it's actually quite easy to implement these in FR.

"But that's easy! Just edit the well-documented type chart so every match-up is backwards!"

That isn't what this does. This hack hijacks the code that reads the type chart to make the game use the inverse of what's there. This means you can use a flag to have hacks with both regular and inverse battles.

The routine is as follows:

.align 2
.thumb
.thumb_func
push {r4, r5, lr}
mov r4, r0
mov r0, #0x02
lsl r0, #0x8
mov r1, #0x3D
add r0, r1
bl FlagCheck
cmp r0, #0x0
beq End
cmp r4, #0x0
beq SuperEffective
cmp r4, #0x5
beq SuperEffective
cmp r4, #0x14
beq Ineffective
b End

SuperEffective:
mov r4, #0x14
b End

Ineffective:
mov r4, #0x5

End:
ldr r5, .damageAddr
ldr r0, [r5, #0x0]
mul r0, r4
ldr r1, .returnAddr
bx r1

FlagCheck:
ldr r2, .flagAddr
bx r2


.align 2
.returnAddr: .word 0x0801e77d
.flagAddr: .word 0x0806e6d1
.damageAddr: .word 0x02023d50
.end
You can insert it anywhere. To call it, insert 00 49 08 47 at x1E770, followed by a pointer to where you inserted the method + 1. (For example, I inserted the method at x170900- I would put 00 49 08 47 01 09 17 08 at x1E770).

This code ties the Inverse Battle rules to flag x23D. If flag x23D is set, battles will use the Inverse Battle ruleset- otherwise they will work normally. If you want to use a different flag, you can change it quite easily by adjusting the values on the sixth and eighth lines. Note that in vanilla FireRed, flag x23D is used by the Pokeflute- if that script is still in the game you will want to pick a different one.
Why when I use it in a rom, when I use a move that the type is expanded, the game crashed?
Age 30
Male
Seen August 16th, 2019
Posted February 8th, 2019
416 posts
6.9 Years
.align 2
.thumb
.thumb_func
push {r4, r5, lr}
mov r4, r0
mov r0, #0x02
lsl r0, #0x8
mov r1, #0x3D
add r0, r1
bl FlagCheck
cmp r0, #0x0
beq End
cmp r4, #0x0
beq SuperEffective
cmp r4, #0x5
beq SuperEffective
cmp r4, #0x14
beq Ineffective
b End

SuperEffective:
mov r4, #0x14
b End

Ineffective:
mov r4, #0x5

End:
ldr r5, .damageAddr
ldr r0, [r5, #0x0]
mul r0, r4
ldr r1, .returnAddr
bx r1

FlagCheck:
ldr r2, .flagAddr
bx r2


.align 2
.returnAddr: .word 0x0801e77d
.flagAddr: .word 0x0806e6d1
.damageAddr: .word 0x02023d50
.end
I kinda wanna make this as a tool lol... but I dont know how to compile ASM into hex bytes...

how would I do that?

P.S. Amazing work, really cool option for any hack.

On a completely unrelated note, wouldn't this make a cool hold item... wouldn't know what to call it though lol

Deokishisu

Mr. Magius

Male
If I'm online, it's a safe bet I'm at a computer.
Seen January 9th, 2019
Posted March 4th, 2018
859 posts
13.9 Years
On a completely unrelated note, wouldn't this make a cool hold item... wouldn't know what to call it though lol
Like an item that forces the inverse ruleset when a Pokemon that is holding one comes into battle?

It'd be super cool, but super broken. Put it on all your pure Ice-types. #IceMasterType

Or giving Normal-type moves unresisted coverage.
Age 30
Male
Seen August 16th, 2019
Posted February 8th, 2019
416 posts
6.9 Years
Like an item that forces the inverse ruleset when a Pokemon that is holding one comes into battle?

It'd be super cool, but super broken. Put it on all your pure Ice-types. #IceMasterType

Or giving Normal-type moves unresisted coverage.
Ud have to only give 1 per game...
Age 30
Male
Seen August 16th, 2019
Posted February 8th, 2019
416 posts
6.9 Years


In XY, there is a new type of battle known as the Inverse Battle. In this mode, type match-ups are reversed- moves that are normally super-effective become ineffective, and moves that are normally resisted or would have no effect become super-effective. I did some poking at the type chart code recently and found that it's actually quite easy to implement these in FR.

"But that's easy! Just edit the well-documented type chart so every match-up is backwards!"

That isn't what this does. This hack hijacks the code that reads the type chart to make the game use the inverse of what's there. This means you can use a flag to have hacks with both regular and inverse battles.

The routine is as follows:

.align 2
.thumb
.thumb_func
push {r4, r5, lr}
mov r4, r0
mov r0, #0x02
lsl r0, #0x8
mov r1, #0x3D
add r0, r1
bl FlagCheck
cmp r0, #0x0
beq End
cmp r4, #0x0
beq SuperEffective
cmp r4, #0x5
beq SuperEffective
cmp r4, #0x14
beq Ineffective
b End

SuperEffective:
mov r4, #0x14
b End

Ineffective:
mov r4, #0x5

End:
ldr r5, .damageAddr
ldr r0, [r5, #0x0]
mul r0, r4
ldr r1, .returnAddr
bx r1

FlagCheck:
ldr r2, .flagAddr
bx r2


.align 2
.returnAddr: .word 0x0801e77d
.flagAddr: .word 0x0806e6d1
.damageAddr: .word 0x02023d50
.end
You can insert it anywhere. To call it, insert 00 49 08 47 at x1E770, followed by a pointer to where you inserted the method + 1. (For example, I inserted the method at x170900- I would put 00 49 08 47 01 09 17 08 at x1E770).

This code ties the Inverse Battle rules to flag x23D. If flag x23D is set, battles will use the Inverse Battle ruleset- otherwise they will work normally. If you want to use a different flag, you can change it quite easily by adjusting the values on the sixth and eighth lines. Note that in vanilla FireRed, flag x23D is used by the Pokeflute- if that script is still in the game you will want to pick a different one.
IBA1.JPG

Soo here is the tool I made... if it meets your approval I would like to publish it about the web (it seems to work as prescribed)

LSA - Inverse Battle Applier.zip

DoesntKnowHowToPlay

Tiny Umbrella with Lots and Lots of Good

Seen 2 Weeks Ago
Posted June 15th, 2017
258 posts
7.9 Years
Attachment 73380

Soo here is the tool I made... if it meets your approval I would like to publish it about the web (it seems to work as prescribed)

Attachment 73379
I'm fine with it, although I'd appreciate if you linked back to this thread wherever you distribute it.
Age 30
Male
Seen August 16th, 2019
Posted February 8th, 2019
416 posts
6.9 Years
I'm fine with it, although I'd appreciate if you linked back to this thread wherever you distribute it.
Consider it done :) Thanks

byrikudouvlog

Romhacker promise

Male
Milano, IT
Seen January 1st, 2019
Posted September 14th, 2014
3 posts
5.9 Years
how do i to set in a script the inverse batle?
someone can show me an expample please?
i'm not understand so
Age 30
Male
Seen August 16th, 2019
Posted February 8th, 2019
416 posts
6.9 Years
how do i to set in a script the inverse batle?
someone can show me an expample please?
i'm not understand so
setflag 0x23D //turns on inverse battles
clearflag 0x23D //returns battles to normal
the flag you set or clear should be the flag you chose, not specifically 23D
Age 30
Male
Seen August 16th, 2019
Posted February 8th, 2019
416 posts
6.9 Years
For anyone wanting to know how to make a trainer have an inverse battle with you... here is a detailed script:

#dynamic 0x725BEF ' any free space
#org @start
'-----------------------------------
setflag 0x33D ' the flag you chose
trainerbattle 0x1 0x(battle) 0x0 @text1 0x(oldtext2) @clearinverse 
msgbox 0x(oldwon)
callstd MSG_LOCK ' Built-in lock command
clearflag 0x33D ' the flag you chose
end

#org @text1
= (old intro text)\pThis will be an\nINVERSE BATTLE.

#org @clearinverse
'-----------------------------------
clearflag 0x33D ' the flag you chose
release
end
It is color coded to the parts that need to be pasted in:
#org 0x816A63E
'-----------------------------------
trainerbattle 0x0 0x8E 0x0 0x81911EC 0x8191237
msgbox 0x819126B ' You're pretty hot.\n...
callstd MSG_LOCK ' Built-in lock command
end


#org 0x81911EC
= Stop right there, kid!\pYou're ten thousand light-years \nfrom facing BROCK!

#org 0x8191237
= Darn!\pLight-years isn't time[.]\nIt measures distance!

#org 0x819126B
= You're pretty hot.\n[.]But not as hot as BROCK!
The example trainer(above) is the trainer in brocks gym, but the same parts can be copied from any trainer.

trainers using this script will not approach the player, they must be talked too.

X and Y usually ask the player if they want to continue... this script warns the player but does not let them back out. A simple yes/no script can make that happen. If you can't figure that out, you probably shouldn't be scripting.

If you are doing this for multiple trainers, you do not need to compile the '@clearinverse' section each time, you can just use the same offset where it is compiled once.
Age 23
Male
Seen July 6th, 2019
Posted October 26th, 2016
253 posts
6.6 Years
Managed to port this to EM.

Replace the addresses at the end with this:

.returnAddr: .word 0x08046f6d
.flagAddr: .word 0x0809d791
.damageAddr: .word 0x020241f0
Next, put 00 49 08 47 at 0x46f60, followed by the pointer to where you inserted the ASM + 1.

That's it! I believe flag 0x2CD is used by something in EM as well, so just change the values in the sixth and eighth line if you want a different flag.
Male
Seen July 18th, 2016
Posted January 14th, 2016
199 posts
8.2 Years
I believe flag 0x2CD is used by something in EM as well, so just change the values in the sixth and eighth line if you want a different flag.
1. Thanks for the port of this (and of course to you, Doesnt)
2. Flag 0x2CD appears to be set sometime during the Hall of Fame script. So you probably would like to change that. :P
Age 30
Male
Seen August 16th, 2019
Posted February 8th, 2019
416 posts
6.9 Years
Managed to port this to EM.

Replace the addresses at the end with this:

.returnAddr: .word 0x08046f6d
.flagAddr: .word 0x0809d791
.damageAddr: .word 0x020241f0
Next, put 00 49 08 47 at 0x46f60, followed by the pointer to where you inserted the ASM + 1.

That's it! I believe flag 0x2CD is used by something in EM as well, so just change the values in the sixth and eighth line if you want a different flag.
would you care terrably if I added this to my tool? cedit given of course.
Age 30
Male
Seen August 16th, 2019
Posted February 8th, 2019
416 posts
6.9 Years
Feel free to do so. Why would I port this if I didn't want others to use it? lol
I just like to make sure :)

for those that are following this thread, version 2.0 of my tool can be downloaded from this thread:
http://www.pokecommunity.com/showthread.php?p=8435317
Advertiser Content