• Our software update is now concluded. You will need to reset your password to log in. In order to do this, you will have to click "Log in" in the top right corner and then "Forgot your password?".
  • Welcome to PokéCommunity! Register now and join one of the best fan communities on the 'net to talk Pokémon and more! We are not affiliated with The Pokémon Company or Nintendo.

Advanced Over World Sprite Editing

Status
Not open for further replies.

Darthatron

巨大なトロール。
1,152
Posts
18
Years
Okay, in this tutorial I will teach you how to repoint, resize and increase the amount of OWS (Over World Sprites) in Pokemon FireRed. Sounds fun, right? :P

I haven't tested this in the other Advance Gen Games, but I'm sure it will work just the same. :)

For this Tutorial you will need...
  • An English FireRed ROM
  • A Hex Editor
  • The latest version of VBA
  • A Free Space Finder
  • A Brain

Lesson 01: Understanding the Data.

Ok, let's take a quick look at the Layout of the Sprite Data, before we go any further. Here is what the first Sprites Data will look like in FireRed:
Code:
FFFF001102110002100020001001000010373A089C373A0870343A08A0003A08FC1C2308
Now, let's break it down, so you can all understand:
Code:
FFFF		= Starter Byte
00		= Palette Number
11 02 11	= Unknown Data 1
0002		= Unknown Data Size
10		= Width
00		= Unknown Byte 1
20		= Height
00		= Unknown Byte 1
10 01 0000	= Unknown Data 2
10373A08	= Unknown Pointer 1
9C373A08	= Unknown Pointer 2
70343A08	= Unknown Pointer 3
A0003A08	= Sprite Pointer
FC1C2308	= Unknown Pointer 4
Following the "Sprite Pointer" will lead you to this Data:
Code:
68BB350800010000
This is another pointer to where the actual Sprite Hex Art is, don't worry about looking at it, it's pointless unless you look at it in an OWE. Here's the broken up version of the Sprite Data:
Code:
68BB3508	= Hex Art Pointer
0001		= Data Size
0000		= Unknown Data
The Data Size is always equal to this algorithm:
Code:
Data Size	= (Width x Height) / 2
That's about it for this lesson, next we will learn how to resize the OW Sprite! YAY! *Cheers*

Lesson 02: Resizing an Over World Sprite.

Right, so if you remember correctly, before we looked at the Sprite Data, and it had the "Height" and "Width" Bytes stored there, so... Let's just change them, and see what happens. Why don't we make it a 32 x 32 Sprite now?
Code:
FFFF		= Starter Byte
00		= Palette Number
11 02 11	= Unknown Data 1
0002		= Unknown Data Size
[B]20		= Width[/B]
00		= Unknown Byte 1
[B]20		= Height[/B]
00		= Unknown Byte 1
10 01 0000	= Unknown Data 2
10373A08	= Unknown Pointer 1
9C373A08	= Unknown Pointer 2
70343A08	= Unknown Pointer 3
A0003A08	= Sprite Pointer
FC1C2308	= Unknown Pointer 4
Now, let's put it back together.
Code:
FFFF001102110002[B]10[/B]00[B]20[/B]001001000010373A089C373A0870343A08A0003A08FC1C2308
...And put it back into our Hex Editor. Next we will open up the OWS in our OWE.
0.png

Oh dear! Frame 0 and 1 seemed to have melded together! This means we have to repoint the Frames, YAY! :)
Ok, so all you have to do is follow the "Sprite Pointer", which is "A0003A08", or "0x003A00A0" when it's flipped. SO now, goto the offset "0x003A00A0" in your Hex Editor and look at the data. It should look something like this:
Code:
68BB350800010000
Now, we need to work out how many frames the OWS has. The Hero Sprite has 20 Frames, so open up your Free Space Finder and search for the Value of this Sum:
Code:
Value = (Height x Width) / 2 x Frames
So, in this case it would be:
Code:
Value = (16 x 16) / 2 x 20
Value = 256 / 2 x 20
Value = 128 x 20
Value = 2560
So, we will be searching for 2560 Bytes! YAY! Searching sure is fun. :)
*Searches*
Ok, I found the Space I need at the offset: "0x00720A00" Lucky me. Now, I'm going to start Repointing all the Pointers. :)
Back to the Offset "0x003A00A0" in your Hex Editor and it's time to start the fun!
Alright, so replace the First Pointer with "000A7208", which now lead to the Free Space we found earlier. Now, view that Frame and Sprite in your OWE. And see how it turns out.
1.png

Great! We now have a clear Sprite! Next we are going to want to do the same for every frame, so back at the Offset "0x003A00A0" we are going to move 8 more Bytes into the File and Repoint this Frame aswell!

So with the Free Space we found earlier, which was "0x00720A00", we want to add 128 Bytes, because that is the Value of the Sum we did before:
Code:
Value = (Height x Width) / 2
So, the new Offset will be: "0x00720A80"
And the new Pointer will be: "800A7208"

So, what we want to do it replace the Pointer at the Offset "0x003A00A0" with our new pointer, in my case: "800A7208".

Great! The second Frame is now clear as well! Do that for the other 18 Frames, and then you can start painting your new OWS! YAY!

Lesson 03: Adding for OWS to the game.

Finally, we can learn how to repoint the OWS and add more into out game! YAY! *Cheers*

Ok, what we are going to do it open our ROM in our Hex Editor...

*Opens ROM*

Right, now Goto the offset: "0x0039FDB0" And you will see a whole bunch of Pointers, right? They should look something... like... this:

Code:
B03B3A08D43B3A08F83B3A081C3C3A0858483A08A0483A08C4483A0864453A08
88453A08AC453A08D0453A087C483A08E8483A080C493A08643C3A08883C3A08
AC3C3A08D03C3A083C3D3A08A83D3A08F03D3A08F43C3A08183D3A08603D3A08
CC3D3A0890433A08B4433A08143E3A085C3E3A08EC3E3A08383E3A08843D3A08
803E3A08343F3A0820443A08583F3A084C423A0828423A0870423A087C3F3A08
A03F3A08C43F3A08E83F3A0878403A089C403A08C0403A08E4403A08A43E3A08
C83E3A0818463A0854403A0878493A080C403A08B8423A0808413A082C413A08
94423A08BC413A0830403A08103F3A08403C3A0850413A0874413A0898413A08
00433A08D4443A08F8443A0824433A0868443A088C443A08B0443A086C433A08
34483A08A4473A0810483A0860463A08C8473A08EC473A08D8433A08FC433A08
84463A08A8463A08CC463A08F0463A0814473A0880473A085C473A0838473A08
EC503A083C463A08E0413A08DC423A0848433A0830493A0854493A0844443A08
1C453A0840453A08C0493A08E4493A08084A3A082C4A3A08504A3A08744A3A08
984A3A08BC4A3A08E04A3A08044B3A0810513A089C493A08284B3A08844F3A08
F04F3A08C8503A0814503A0880503A08A4503A0838503A084C4B3A08704B3A08
5C503A08944B3A08B84B3A08DC4B3A08004C3A08244C3A08484C3A086C4C3A08
904C3A08B44C3A08D84C3A08FC4C3A08204D3A08444D3A08A84F3A08684D3A08
8C4D3A08B04D3A08D44D3A08644E3A08884E3A08AC4E3A08F44E3A08D04E3A08
184F3A083C4F3A08604F3A08CC4F3A08F84D3A081C4E3A08404E3A08

They look fun... NOT! Ok, so I'll show you what each pointer means...

Code:
B03B3A08	= Pointer to OWS 0
D43B3A08	= Pointer to OWS 1
F83B3A08	= Pointer to OWS 2
1C3C3A08	= Pointer to OWS 3
58483A08	= Pointer to OWS 4
A0483A08	= Pointer to OWS 5
C4483A08	= Pointer to OWS 6
64453A08	= Pointer to OWS 7
88453A08	= Pointer to OWS 8
AC453A08	= Pointer to OWS 9
D0453A08	= Pointer to OWS 10
7C483A08	= Pointer to OWS 11
E8483A08	= Pointer to OWS 12
0C493A08	= Pointer to OWS 13
643C3A08	= Pointer to OWS 14
883C3A08	= Pointer to OWS 15
AC3C3A08	= Pointer to OWS 16
D03C3A08	= Pointer to OWS 17
3C3D3A08	= Pointer to OWS 18
...
404E3A08	= Pointer to OWS 150

Yes, that's right. Following one of those points will take you to the "Sprite Data", we looked at that data before (Lesson 01 & 02), cool huh? This is the location where AMap reads from, however, this isn't as far back as we can go...

Now, in your Hex Editor we are going to goto the location that points to this Table, and change it. So, goto this location: "0x0005F2F4", this should have a pointer to the table we just looked at, correct?

Ok, now open up your ROM in your FSF and search for this number of bytes:
Code:
Value		= Number x 4
"Number" is how many Sprites you want to have in your game. For this example we will use 151, Which is 1 extra Sprite to the average 151 FireRed has.

So.... In my FSF I will search for....
Code:
Value		= Number x 4
Value		= 152 x 4
Value		= 608
...608 Bytes. However, due to my vast amount of laziness, and my really slow computer, I will just use the offset "0x00801000", write that offset down somewhere, alright so... Asuming we are still at the offset "0x0005F2F4", I will set the Pointer there to... "00108008".

Now, we have copy/paste the Table at the Location "0x0039FDB0", ONLY THE FIRST 151 POINTERS (604 Bytes), to the Location we just found, in my case "0x00801000". Now, if you did everything correctly, there should be at least 4 Free Bytes after the table has been pasted. With this free space we are going to add a new pointer to some free space where we will put our new Sprite Data...

Once again, open up FSF and search for some free space, this time search for 36 Bytes. Once again, due my huge amount of laziness, I will be using the offset "0x00802000". Back at the 4 Bytes that we have free after pasting the Pointer Table, we are going to add out new pointer. In my case: "00208008".

Now, in your Hex Editor we are going to look at the Hero's Sprite Data, located at "0x003A3BB0", and we are going to copy it all (36 Bytes). Then we will go back to our new free space, in my case "0x00802000", and we are going to paste the data we just stole from the Hero's Sprite Data.

Open your ROM up in a Map Editor and make a Sprite with the Picture Number of "151" and you will notice that the Map Editor doesn't appear to show any Sprite. However, opening the ROM in your emulator and looking at the Sprite it will look like the Hero.

Alright, now you just have to follow Lesson 02, using this Sprite Data instead of the First, and all should be fine. I think... I kind of lost track of where I was up to. :D If for whatever reason it doesn't work, post and I'll see if I missed anything... xD
 
Last edited:

zel 2.0

Gold Remaker
1,955
Posts
17
Years
Hey, Darth, since you are trying to make a tutorial about this, then perhaps you'll manage to see what's the problem I have when I'm increasing the ammount of OWs.
Yeah, according to the guide at WAH (by Peyi), you can increase the ammount, and, while OWE recognizes them (till a certain limit...), apparently, neither Advance Map nor the rom itself recognizes the overworlds beyond the original limit, it just uses the hero sprite (or was it one of those small kids OW?) for anything beyond that limit.

Can you try to see if you can increase the ammount and show a screenshot of the extra overworld in both AMap and the game? Thanks ^^
 
581
Posts
17
Years
Hey, Darth, since you are trying to make a tutorial about this, then perhaps you'll manage to see what's the problem I have when I'm increasing the ammount of OWs.
Yeah, according to the guide at WAH (by Peyi), you can increase the ammount, and, while OWE recognizes them (till a certain limit...), apparently, neither Advance Map nor the rom itself recognizes the overworlds beyond the original limit, it just uses the hero sprite (or was it one of those small kids OW?) for anything beyond that limit.

Can you try to see if you can increase the ammount and show a screenshot of the extra overworld in both AMap and the game? Thanks ^^

Hi, What do you mean by "The rom itself"?

I don't done much with the OW in fire red, but I gues, that maybe Advancemap don't read the amount of OW's from the rom, but it's just in the program?
You tryed to inset the OW number through hex?
 

Teh Baro

In my times...!
521
Posts
18
Years
Hi, What do you mean by "The rom itself"?

I don't done much with the OW in fire red, but I gues, that maybe Advancemap don't read the amount of OW's from the rom, but it's just in the program?
You tryed to inset the OW number through hex?
If they aren't in the rom, maybe it's because those slots are reserved for variable sprites. For example, the trainers at the trainer tower in ruby and fire red, that trainer in that event that has somewhat to do with a pokemon card reader, (The rival in ruby, where you find him/her on routes, doesn't it use it too?), so maybe even if you edit it, it still shows what's in the variable
 

X-aveon

IS BACK!!!!!!!!!!!!!!!!!!!
233
Posts
16
Years
  • Seen Jun 25, 2012
could you make an english one for ruby for expaning the size cuz i dont know how and that is one of the messed up parts in my hack.
 

ZodiacDaGreat

Working on a Mobile System
429
Posts
17
Years
could you make an english one for ruby for expaning the size cuz i dont know how and that is one of the messed up parts in my hack.

There's no need, you just need the offsets for Ruby, and then follow then instructions closely.
 

Darthatron

巨大なトロール。
1,152
Posts
18
Years
Everyone who is interested, my method works in the game, unlike the WAH one. However, due to OWE and AM current way of reading the Data, they do not support it. Here is a lazy proof of it working in game, not in AM. I got lazy and just pointed to the Hero's data. xD
151.png

On another note, I lost what I had done so far, when my niece decided it would be fun to restart the computer, without saving anything that was open... I hate children... Anyway, should be up in a few days. :)
 

tImE

It's still me, 44tim44 ;)
673
Posts
17
Years
Everyone who is interested, my method works in the game, unlike the WAH one. However, due to OWE and AM current way of reading the Data, they do not support it. Here is a lazy proof of it working in game, not in AM. I got lazy and just pointed to the Hero's data. xD
151.png

On another note, I lost what I had done so far, when my niece decided it would be fun to restart the computer, without saving anything that was open... I hate children... Anyway, should be up in a few days. :)

Hey, Darthatron,
I think the link to the proof is broken
cause there's just a red cross there
instead of the image XD

And, yah little kids, can be really
annoying sometimes o_O


//44tim44


EDIT: Hmm, it seems my computer lagged
or somethn' cause now the pic works...
 
Last edited:
712
Posts
16
Years
  • Age 31
  • Seen Apr 8, 2024
The link isn't broken, I can see it.. Try to refresh the page a few times
 
18
Posts
16
Years
  • Seen Aug 11, 2008
Some of your data is wrong. I'll find more on the parts tommmorow.



FFFF = Starter Byte
00 = Palette Number
11 02 11 = Sprite validation.
0200 = Not sure.
0010 = Width
0020 = Height
0110 and 0000 = oam data. Do not modify!
1@ 10373A08 = Points to @3.
2@ 9C373A08 = Void pointer\ unsure.
3@ 70343A08 = A pointer to @5 lol.
4@ A0003A08 = Sprite Pointer
5@ FC1C2308 = Pointer to pointers which point to code that loads the sprite through the ewram into the sprite block of the vram and its data into the oam.



Have you considered the reason why the game assumes the sprite is the hero is because you copied the hero's data and maybe just changed the pointers? Why not make new ones?
 

Darthatron

巨大なトロール。
1,152
Posts
18
Years
Some of your data is wrong. I'll find more on the parts tommmorow.



FFFF = Starter Byte
00 = Palette Number
11 02 11 = Sprite validation.
0200 = Not sure.
0010 = Width
0020 = Height
0110 and 0000 = oam data. Do not modify!
1@ 10373A08 = Points to @3.
2@ 9C373A08 = Void pointer\ unsure.
3@ 70343A08 = A pointer to @5 lol.
4@ A0003A08 = Sprite Pointer
5@ FC1C2308 = Pointer to pointers which point to code that loads the sprite through the ewram into the sprite block of the vram and its data into the oam.



Have you considered the reason why the game assumes the sprite is the hero is because you copied the hero's data and maybe just changed the pointers? Why not make new ones?

Thanks for new data, and I know the reason why it points to the Hero's data, I made it point there.

In other news, I'm about half way through the Adding OWS guide.

EDIT: Finished my uber leet guide. Getting some people to test it, then I will post it.
 
Last edited:

Darthatron

巨大なトロール。
1,152
Posts
18
Years
For anyone who hadn't noticed yet, I've posted the "Adding Over World" guide to the first post.

On another note, the sprites will show up in AMap, you just have to close it, and reload after you edit the amount. :)
 

Tropical Sunlight

The Faltine
3,476
Posts
16
Years
There is a program called OverWorldChanger 4.0.1 that resizes OW sprites. You can download it on WAH. Maybe change the name to: Hex Editing OW Size
 
Status
Not open for further replies.
Back
Top