PDA

View Full Version : [Tutorial] Advanced Over World Sprite Editing

Darthatron
June 15th, 2008, 5:08 AM
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
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:
FFFF001102110002100020001001000010373A089C373A0870343A08A0003A08FC1C2308
Now, let's break it down, so you can all understand:
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:
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:
68BB3508 = Hex Art Pointer
0001 = Data Size
0000 = Unknown Data
The Data Size is always equal to this algorithm:
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?
FFFF = Starter Byte
00 = Palette Number
11 02 11 = Unknown Data 1
0002 = Unknown Data Size
20 = 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
Now, let's put it back together.
FFFF001102110002100020001001000010373A089C373A0870343A08A0003A08FC1C2308
...And put it back into our Hex Editor. Next we will open up the OWS in our OWE.
http://i307.photobucket.com/albums/nn295/darthatron/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:
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:
Value = (Height x Width) / 2 x Frames
So, in this case it would be:
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.
http://i307.photobucket.com/albums/nn295/darthatron/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:
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:

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...

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:
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....
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

X-Buster
June 16th, 2008, 4:45 AM
wow, this is a good tutorial.. I'll try it..!^^

Darthatron
June 16th, 2008, 9:29 PM
Well, if only one person cares about this then there is really no point on posting the rest...

Thanks for caring X-Buster. :)

ZodiacDaGreat
June 16th, 2008, 9:34 PM
It's really good but time consuming though :P, I'm glad you got it in english :)

Dr Gregory House
June 17th, 2008, 3:50 AM
wow man, this is ftw!
i vote post the rest

zel 2.0
June 17th, 2008, 4:56 AM
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 sir tomato my password is syvniti
June 17th, 2008, 5:29 AM
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
June 17th, 2008, 8:07 AM
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
June 17th, 2008, 2:27 PM
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
June 17th, 2008, 8:14 PM
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.

Mos3s
June 17th, 2008, 8:37 PM
Looks good darthaton!! Tee why .
ily

Darthatron
June 17th, 2008, 9:55 PM
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
http://i307.photobucket.com/albums/nn295/darthatron/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
June 18th, 2008, 12:51 AM
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
http://i307.photobucket.com/albums/nn295/darthatron/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

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...

X-Buster
June 18th, 2008, 1:39 AM
The link isn't broken, I can see it.. Try to refresh the page a few times

Neti
June 18th, 2008, 3:31 AM
oh wow thx, i really needed this!

GBChacker
June 18th, 2008, 6:32 PM
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
June 18th, 2008, 9:04 PM
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.

One Winged Angel
June 19th, 2008, 8:58 PM
Hey, this is great... but i think ill stick to the easier way.
Keep up the good work !

Darthatron
June 20th, 2008, 1:01 AM
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
July 1st, 2008, 2:59 AM
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

Derlo
August 2nd, 2008, 2:09 PM
Hello!!!
Really that tuto helped a lot to me...
They put something that I don't know what is happening causes!!
In the first 5 times that I followed the tutorial worked perfectly...
but when I turned off and later I tied PC didn't work more....
I already tried to redo all of the steps and he/she always gives that same mistake!
http://img353.imageshack.us/img353/4262/imagemlg3.png (http://imageshack.us)
PS: I put the same MINIS in the spaces 151 and in the 152

The rom just recognizes the 151 minis... all the other ones after the 151 appear as in the image...
What do I make!?

hi sir tomato my password is syvniti
August 2nd, 2008, 11:09 PM
Hello!!!
Really that tuto helped a lot to me...
They put something that I don't know what is happening causes!!
In the first 5 times that I followed the tutorial worked perfectly...
but when I turned off and later I tied PC didn't work more....
I already tried to redo all of the steps and he/she always gives that same mistake!
http://img353.imageshack.us/img353/4262/imagemlg3.png (http://imageshack.us)
PS: I put the same MINIS in the spaces 151 and in the 152

The rom just recognizes the 151 minis... all the other ones after the 151 appear as in the image...
What do I make!?
Have you been restarting amap?
Here's a 6 step tutorial...
3. Pick some thing up to eat
4. eat it
5. go back

(This might could be done faster, but then it would be long enough to I could claim it a toturial...)

liuyanghejerry
August 2nd, 2008, 11:49 PM
Great! And I'm still waiting for how to add new trainers (Not only a picture but the new data for the pokemon and moves...) and pokemon out of 386...Keep researching!

Derlo
August 4th, 2008, 5:59 AM
Have you been restarting amap?
Here's a 6 step tutorial...
3. Pick some thing up to eat
4. eat it
5. go back

(This might could be done faster, but then it would be long enough to I could claim it a toturial...)

(¬_¬)
Hum.... unhappily it didn't work...

I already tried more times and it is always the same mistake...
Any mini after the 151 is accepted by the rom.... just for AMAP.
All of the minis that I put in the new spaces appear the child's mini....
I don't know more than to do....

hi sir tomato my password is syvniti
August 4th, 2008, 6:24 AM
(¬_¬)
Hum.... unhappily it didn't work...

I already tried more times and it is always the same mistake...
Any mini after the 151 is accepted by the rom.... just for AMAP.
All of the minis that I put in the new spaces appear the child's mini....
I don't know more than to do....

And you are sure you pointed the new offset to the overworlds? Have you been chaning the new sprites? I had kind of same problem but then I reeliezed that I had messed up the offset that points to the sprites offsets

o0oBahamuto0o
August 7th, 2008, 6:22 AM
Resize the Sprites , very Good, I Must try it :D

Derlo
August 8th, 2008, 8:16 AM
Curse!!!!
I already tried vary times and always the same mistake!!
I already used several different offsets...
but when I will play the rom it doesn't recognize the new sprits...
but AMAP yes!!
I am being already crazy!!!! xD

hi sir tomato my password is syvniti
August 8th, 2008, 8:42 AM
Curse!!!!
I already tried vary times and always the same mistake!!
I already used several different offsets...
but when I will play the rom it doesn't recognize the new sprits...
but AMAP yes!!
I am being already crazy!!!! xD

I currently got 97% in the story mode, but I can't win the last battle with Goku vs Hidogaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaan?

Derlo
August 12th, 2008, 8:39 AM
Finally I got!!!
But... another problem appeared!

http://img364.imageshack.us/img364/981/imagemwk7.png (http://imageshack.us)

The other frames don't work.... only the 0, but starting from the 1 it doesn't work! Why does anybody know!?

image => I managed to do OWE to recognize the new sprites!

*Poliwag*
August 31st, 2008, 10:33 AM
I'm having the same problem as Derlo, I have managed to add one sprite to OWE but I cannot seem to have more than one frame, if I click the arrow I get "Run time error '9' subscript out of range"

Does anyone have a solution to this?

***MAJOR EDIT***
A change to the .ini is needed but all is fine afterwards, no error messages (as of yet).

Hope this helps!

.Seth
September 4th, 2008, 6:19 PM
What offset is it located in the hex editor?
I've searched for the string, but no luck.
Can anyone help?

hi sir tomato my password is syvniti
September 7th, 2008, 12:07 AM
What offset is it located in the hex editor?
I've searched for the string, but no luck.
Can anyone help?

Psss... Steal the INI from OW Rebirth... All the offset is in there...

hi sir tomato my password is syvniti
September 14th, 2008, 10:15 AM
Finally I got!!!
But... another problem appeared!

http://img364.imageshack.us/img364/981/imagemwk7.png (http://imageshack.us)

The other frames don't work.... only the 0, but starting from the 1 it doesn't work! Why does anybody know!?

image => I managed to do OWE to recognize the new sprites!
That's because the Overworld editor by hackmew don't read the Frame limit from the rom, but from a list inside the tool, after using the 151 or how many there are, sprites then the tool has no limits... You could fix that by either change overworld editor or edit the source (Which followed)

I'm having the same problem as Derlo, I have managed to add one sprite to OWE but I cannot seem to have more than one frame, if I click the arrow I get "Run time error '9' subscript out of range"

Does anyone have a solution to this?

***MAJOR EDIT***
A change to the .ini is needed but all is fine afterwards, no error messages (as of yet).

Hope this helps!
Yeah, As you see the orginal let you load as many frames as you want, then It just start to load the next sprite...

Derlo
September 14th, 2008, 10:38 AM
Buaa!! xP
Same me using old OWE... the rom doesn't recognize the movements.... (at least with me)..
That feels because of a "key" that exists in the rom, so much for the counting of the minis as for the numbers of minis with more than 1 frame that is already certain in the original rom!

I just found the restraint for the counting of minis...
But for the frames... not yet!

With some of you new Frames did work in the rom without problem?!
With me, same editing them, it happened mistakes in all of the minis that were close to the new mini when he was moved.

See you later!

September 20th, 2008, 7:34 AM
Well, this isn't a month old yet now is it?
I'm having trouble finding the OW's offsets...

hi sir tomato my password is syvniti
September 20th, 2008, 10:10 AM
Well, this isn't a month old yet now is it?
I'm having trouble finding the OW's offsets...

HOST HOST... GO STEAL THE OFFSETS FROM THE OVERWORLD EDITORS INI... HOST HOST...

(And then seach for the offset twice)

September 20th, 2008, 11:40 AM
HOST HOST... GO STEAL THE OFFSETS FROM THE OVERWORLD EDITORS INI... HOST HOST...

(And then seach for the offset twice)
I found the offset, but I'm having trouble with the repointing part...

hi sir tomato my password is syvniti
September 20th, 2008, 9:44 PM
I found the offset, but I'm having trouble with the repointing part...

You do know that the offsets in the Rebirth INI is to the sprite data?

So seach for that offset to get the offset tabel, and the one more to get the offset to the offset tabel..
if this wasn't what you asked for then exsplain a bit more.

Darthatron
September 21st, 2008, 5:51 AM
Uh, I'll just make a tool for it. *rolls eyes* Pathetic mortals can't do anything alone...

master morty
September 27th, 2008, 12:58 PM
I hate to look stupid but how do you follow a pointer? XD

Snowfield34
September 27th, 2008, 11:31 PM
I hate to look stupid but how do you follow a pointer? XD

68553A08
Split it to 68 55 3A 08
Switch the last and First, Then the second and the third
08 3A 55 68
Put It all toghetter
83A5568
The 08 means tha It point to the rom's first 16 MB... So Minus it with 8000000
83A5568 - 8000000 = 3A5568

So go to 3A5568
3A5568 is a pointer I just made up, And I have no Idea what it point to! Do it with your own pointier!

cyberzero
December 31st, 2008, 11:05 AM
First of all, sorry for reviving a topic over a month old, but this tutorial would be extremely helpful for a hack I plan on showcasing soon. I'm having a little trouble with the repointing. I don't mean to sound like a noob, but I have to.

When you say there should be a pointer, I honestly don't understand. =/
Could you please clarify for me how to set the pointer there?

Uh, I'll just make a tool for it. *rolls eyes* Pathetic mortals can't do anything alone...

A tool for this would be awesome. =)

Blazichu
December 31st, 2008, 11:14 PM
No need to revive month old threads.

*Locks*