The PokéCommunity Forums  

Go Back   The PokéCommunity Forums > ROM Hacking > Research & Development
Sign Up Rules/FAQ Live Battle Blogs Mark Forums Read

Notices

Research & Development Got a well-founded knack with ROM hacking? Love reverse-engineering the Pokémon games? Or perhaps you love your assembly language. This is the spot for polling and gathering your ideas, and then implementing them! Share your hypothesis, get ideas from others, and collaborate to create!
Research & Development programs in this forum are subject to moderator approval before they are displayed.


Reply
Click here to go to the first staff post in this thread.  
Thread Tools
  #476    
Old May 4th, 2014, 03:42 AM
dagid44
 
Join Date: Apr 2012
Gender: Male
Hi I'm beginner,

I'm trying to understand how is all data about mapping stored. I found this article, which explain some structure of data.

Code:
datacrystal.romhacking.net/wiki/Pok%C3%A9mon_3rd_Generation
But it is uncompleted, it is missing information about block structure, animation structure, etc... Is there any better research/document ? I can't found any.

Thank you for your help.
Reply With Quote
  #477    
Old May 4th, 2014, 07:50 AM
vizor
 
Join Date: Dec 2011
Gender: Female
Hey there, i need the offset of the generateOAM function + its parameter.
Reply With Quote
  #478    
Old May 4th, 2014, 02:02 PM
Shiny Quagsire's Avatar
Shiny Quagsire
Unexpectedly Gone until Aug 13
 
Join Date: May 2009
Location: Hoenn Safari Zone
Age: 16
Gender: Male
Nature: Jolly
Quote:
Originally Posted by vizor View Post
Hey there, i need the offset of the generateOAM function + its parameter.
The function is located at 08006F8C in Fire Red. I have it formatted as such in my personal .h I've used:
Code:
u32 createSprite(int *template, int *XPos, int *YPos, int *i)
Arguments are pretty self explanatory, except template and i. Template is basically the unit as described here under object_template, and all you need is the proper formatting to get it going. i is usually left at 0 and I haven't actually checked to see what it is. I believe it might have to do with it's priority over other sprites.
__________________



Reply With Quote
  #479    
Old May 4th, 2014, 08:56 PM
vizor
 
Join Date: Dec 2011
Gender: Female
Thank you for your help.

I'm a German, and i don't know for sure wether i understood the template. Is this simply a pointer to the oam's animation data? And what if the object has'nt any animation. Will the obj disappear after displaying all frames listed in the template?

And in what registers i have to transfer ( i don't know how to say this, sorry) each param?

- Viz0r
Reply With Quote
  #480    
Old May 4th, 2014, 09:25 PM
Shiny Quagsire's Avatar
Shiny Quagsire
Unexpectedly Gone until Aug 13
 
Join Date: May 2009
Location: Hoenn Safari Zone
Age: 16
Gender: Male
Nature: Jolly
Quote:
Originally Posted by vizor View Post
Thank you for your help.

I'm a German, and i don't know for sure wether i understood the template. Is this simply a pointer to the oam's animation data? And what if the object has'nt any animation. Will the obj disappear after displaying all frames listed in the template?

And in what registers i have to transfer ( i don't know how to say this, sorry) each param?

- Viz0r
It's a tad bit complicated, and I haven't actually done this in ASM before so I could be wrong. Basically though, the first four arguments of the function correspond to r0-r3 respectively. As for the template, if you can understand C I'd suggest taking a look at some example coding here where I created a obj_template as a struct along with all the data needed for it. The first two word values (each are two bytes) are usually 2 and 1 based on existing templates in the ROM. Then you have a pointer to the basic OAM data you'd find in the GBA's OAM memory. The rest of it I usually keep to the values 0, 0x08231CFC, 0x080EE4DD, and 0xFF simply because that's what has always worked for me. The animation table is fairly straightforward. You have two bytes for the tile number and two for the duration. 0xFFFF ends the animation and usually removes the sprite, and 0xFFFE will loop it forever.

Let me know if you have any questions, and feel free to browse around some of my C code where I use these functions quite a bit. If you're good with C it might make a bit more sense for you, but otherwise I'd suggest reading up in knizz's research thread.
__________________



Reply With Quote
  #481    
Old May 5th, 2014, 03:34 AM
vizor
 
Join Date: Dec 2011
Gender: Female
Isnt there any way creating OAM without using a entry in the template table? i mean the Overworlds are sureley not genereted due to this table, arent they?
Reply With Quote
  #482    
Old May 5th, 2014, 08:05 PM
Shiny Quagsire's Avatar
Shiny Quagsire
Unexpectedly Gone until Aug 13
 
Join Date: May 2009
Location: Hoenn Safari Zone
Age: 16
Gender: Male
Nature: Jolly
Quote:
Originally Posted by vizor View Post
Isnt there any way creating OAM without using a entry in the template table? i mean the Overworlds are sureley not genereted due to this table, arent they?
NPCs are actually a lot more complicated due to their dynamic nature and interactability in the game. They have a lot of traits which makes them a tiny bit difficult to add in through ASM (I have yet to do it myself to be honest). And yes, every single OAM in the game is made using this method. While it seems difficult now, once it's created it's all downhill. GameFreak has methods for easily moving, scaling, rotating, and deleting these OAMs, which makes things much easier in the long run as opposed to making a GBA OAM.
__________________



Reply With Quote
  #483    
Old May 7th, 2014, 07:46 AM
Magic's Avatar
Magic
 
Join Date: Jan 2009
Location: UK
Age: 23
Gender: Male
Possibly odd question, has anyone ever looked into/seen any research into removing the pokedex? Mainly, the pop-up when you catch a new pokemon?

I imagine it would take some hardwiring, since it's not something scripting could deal with - unless the sequence can be repointed/reorganised in hex I'm guessing it's an ASM job?
__________________
Reply With Quote
  #484    
Old May 8th, 2014, 06:03 AM
vizor
 
Join Date: Dec 2011
Gender: Female
It defenity is an ASM job, but it shouldn't be too hard, since there is some kind of switch case for the battle, which leads to certain parts that can be displayed during the battle (such as send new poke, attack and so on). There could be one entry that leads to the pokedex_information. You could simply change the pointer to another function, but there definitly is research needed.

Another question. I was reseraching an function, which updates all stats given on a pokemon, like the stat level, which is based on the ep, or the stat attack, wich is based on the baseATk, level, IV and EV.
To reach this aim i did a lot on reasearch at picking a pokemon from your box, because there a lot of data is cacluated, but i found not very much. All i got is (for a german firered)

sub_func at 0x08093078 (r0:int8 a, r1:int8 b) a = box ID, b = box nr. Pokemon is taken, if box ID = 0xe there is an exeption

/* takes pokemon from box, buffers its data into malloced RAM

has anybody ever found a fucntion that updates and recalcutes pokemon stats? because i want to make a species change, but the stats are not updating imideatly.
Reply With Quote
  #485    
Old May 8th, 2014, 07:02 AM
daniilS's Avatar
daniilS
busy trying to do stuff not done yet
 
Join Date: Aug 2013
Age: 14
Gender: Male
Nature: Relaxed
Quote:
Originally Posted by vizor View Post
It defenity is an ASM job, but it shouldn't be too hard, since there is some kind of switch case for the battle, which leads to certain parts that can be displayed during the battle (such as send new poke, attack and so on). There could be one entry that leads to the pokedex_information. You could simply change the pointer to another function, but there definitly is research needed.

Another question. I was reseraching an function, which updates all stats given on a pokemon, like the stat level, which is based on the ep, or the stat attack, wich is based on the baseATk, level, IV and EV.
To reach this aim i did a lot on reasearch at picking a pokemon from your box, because there a lot of data is cacluated, but i found not very much. All i got is (for a german firered)

sub_func at 0x08093078 (r0:int8 a, r1:int8 b) a = box ID, b = box nr. Pokemon is taken, if box ID = 0xe there is an exeption

/* takes pokemon from box, buffers its data into malloced RAM

has anybody ever found a fucntion that updates and recalcutes pokemon stats? because i want to make a species change, but the stats are not updating imideatly.
I've got an offset somewhere, will send it later today.
__________________

Thanks to JPAN, Jambo51, Shiny Quagsire and knizz for teaching me almost everything I know about hacking, through tutorials or in person.
Reply With Quote
  #486    
Old May 8th, 2014, 07:28 AM
vizor
 
Join Date: Dec 2011
Gender: Female
I already found one. Its located at SUB_0x0803E674 in Fire Red German.

You have to permitt: r0, int32: source of basicData(0x50 bytes) ;; r1, int32: destination of calcuated data (0x64 Bytes)
Reply With Quote
  #487    
Old May 8th, 2014, 11:11 PM
slawter666
 
Join Date: Sep 2008
Is it possible for an overworld to use two palettes? I've been thinking about the idea of hacking the bike routine for ridable pokemon (Page 16 of this thread) and the pokemon and hero would need seperate palettes for the sprite to look good.
__________________
Reply With Quote
  #488    
Old May 9th, 2014, 08:48 AM
Jambo51's Avatar
Jambo51
Glory To Arstotzka
 
Join Date: Jun 2009
Gender: Male
Nature: Quiet
Quote:
Originally Posted by slawter666 View Post
Is it possible for an overworld to use two palettes? I've been thinking about the idea of hacking the bike routine for ridable pokemon (Page 16 of this thread) and the pokemon and hero would need seperate palettes for the sprite to look good.
Without significant hacking of the game, no. The GBA is technically able to support such a sprite, but you would need to have intimate knowledge of the OAM system and how the palettes can be used in such a manner.

Basically, no, you can't do it.
__________________
Hey guys, please check out my recreations of the gen 1 and 2 music on my custom engine at my SoundCloud! - Here!
Reply With Quote
  #489    
Old May 10th, 2014, 10:39 AM
vizor
 
Join Date: Dec 2011
Gender: Female
It definitley is possible, since any object of the OAM can use all 16 OAM-Palettes, if it is in 256 Col Mode.
BUT: you have to make the game set the bike Sprite to this mode,
you have to custom the palettes the way, that the sprite can use all 256 by not destroying other sprites

It definitley is possible, but no one would do this kind of job just for an simple object, since it would probably ♥♥♥♥ up with all other objects...
Just use an 16 colors palette, its way easier

Here is a quatation from GBATEK, if you intend to hack the OAM-system

Quote:
OBJ Attribute 0 (R/W)
Bit Expl. 0-7 Y-Coordinate (0-255) 8 Rotation/Scaling Flag (0=Off, 1=On) When Rotation/Scaling used (Attribute 0, bit 8 set): 9 Double-Size Flag (0=Normal, 1=Double) When Rotation/Scaling not used (Attribute 0, bit 8 cleared): 9 OBJ Disable (0=Normal, 1=Not displayed) 10-11 OBJ Mode (0=Normal, 1=Semi-Transparent, 2=OBJ Window, 3=Prohibited) 12 OBJ Mosaic (0=Off, 1=On) 13 Colors/Palettes (0=16/16, 1=256/1) 14-15 OBJ Shape (0=Square,1=Horizontal,2=Vertical,3=Prohibited) Caution: A very large OBJ (of 128 pixels vertically, ie. a 64 pixels OBJ in a Double Size area) located at Y>128 will be treated as at Y>-128, the OBJ is then displayed parts offscreen at the TOP of the display, it is then NOT displayed at the bottom.
Reply With Quote
  #490    
Old May 10th, 2014, 11:56 AM
slawter666
 
Join Date: Sep 2008
Quote:
Originally Posted by vizor View Post
It definitley is possible, since any object of the OAM can use all 16 OAM-Palettes, if it is in 256 Col Mode.
BUT: you have to make the game set the bike Sprite to this mode,
you have to custom the palettes the way, that the sprite can use all 256 by not destroying other sprites

It definitley is possible, but no one would do this kind of job just for an simple object, since it would probably ♥♥♥♥ up with all other objects...
Just use an 16 colors palette, its way easier

Here is a quatation from GBATEK, if you intend to hack the OAM-system
What classifies as an OAM-palette? Because if it's just overworlds it would be easy enough to make it so each map only has a maximum of 14 overworlds with different palettes (leaving one for the player and one for the bike-pokemon).

EDIT: A workaround could be when the bike is selected create an overworld of the pokemon on the same spot that mimics the players movements. From the players point of view this would be exactly the same as if it is one object.
__________________

Last edited by slawter666; May 10th, 2014 at 05:17 PM.
Reply With Quote
  #491    
Old May 11th, 2014, 05:46 AM
Jambo51's Avatar
Jambo51
Glory To Arstotzka
 
Join Date: Jun 2009
Gender: Male
Nature: Quiet
Quote:
Originally Posted by slawter666 View Post
What classifies as an OAM-palette? Because if it's just overworlds it would be easy enough to make it so each map only has a maximum of 14 overworlds with different palettes (leaving one for the player and one for the bike-pokemon).

EDIT: A workaround could be when the bike is selected create an overworld of the pokemon on the same spot that mimics the players movements. From the players point of view this would be exactly the same as if it is one object.
You're not getting it, sadly. While it IS possible to do, and in fact should be fairly simple from a coding standpoint, it's not something that can feasibly achieved as a hack to an existing game.

The GBA renders objects on a per object basis. Meaning that data for one object can be interpreted differently to another. You could feasibly store the bike sprite as an 8bpp image and then tell the GBA (using the OAM data) to interpret it as such, while leaving all other images in their native 4bpp format and having no ill effects.

The trick to this is that doing so as a hack is a lot harder than you would initially think, especially as you'd have to do it as a hook into the existing sprite object code for the bike.

I wasn't ever saying it wasn't physically possible, simply trying to get it across to you that it's not really feasible as a hack within the Game Freak developed system, since that system relies on the sprites being in 4bpp format.
__________________
Hey guys, please check out my recreations of the gen 1 and 2 music on my custom engine at my SoundCloud! - Here!

Last edited by Jambo51; May 11th, 2014 at 05:50 AM. Reason: typo; added italics for emphasis
Reply With Quote
  #492    
Old May 11th, 2014, 10:09 AM
Derlo's Avatar
Derlo
Braziliam Hacker!! De Mossoró
 
Join Date: Aug 2007
Send a message via Windows Live Messenger to Derlo
Anyone know if it is possible to import the system of double battles in Emerald for the FR?
When we are in range of vision of two different NPCs, and get a Double Battle, and when standing in reach of only one, a normal battle.
__________________



Pokémon
Essence of Light

Comming Soon...
Reply With Quote
  #493    
Old May 12th, 2014, 05:42 AM
vizor
 
Join Date: Dec 2011
Gender: Female
I used a german Firered Rom. Maybe my offsets are incorrect, but i dont think so, since reseraching was very easy...

.equ generate, 0x08006F0D
.equ OAM_thingy, 0x08231BCC
.equ callback, 0x08EE9ED
.equ buffer, 0x0202063C

i made the template dynamic, so i could use it for several objects. i placed it at a malloced offset, so its save to use. then i called the generate_sub func (sub_08A5007C does this at my rom), and transfered the right params. however my game freezes, after some time, and its not due to may code, since it is executed completley and corretcley and it also correctly returns to the scripthandler.

here is a screenshot of the point in my code, in which i spawn the OAM.

http://www.directupload.net/file/d/3621/aw7kvpan_png.htm

Last edited by vizor; May 12th, 2014 at 08:53 PM.
Reply With Quote
  #494    
Old May 12th, 2014, 09:18 PM
Deokishisu's Avatar
Deokishisu
Mr. Magius
 
Join Date: Feb 2006
Location: If I'm online, it's a safe bet I'm at a computer.
Gender: Male
Nature: Relaxed
Wouldn't it be easier to piggyback on the code that handles the surfing sprite? I mean, the player and the blob Pokemon that is surfed on are two different images. If you want riding Pokemon, I feel like it would be much easier to start there. See if the surfing blob sprite can use a different palette than the player.
Reply With Quote
  #495    
Old May 12th, 2014, 11:41 PM
Nerketur's Avatar
Nerketur
PokéScripter
 
Join Date: Nov 2010
Gender: Male
Nature: Quirky
A small bit of reasearch into the .bpc files in the PMD era of games leads to an interesting result. This is too small for a thread of its own, and I might not look at it past this, but I figured someone may be able to use it as a starting point or point me towards a tool that can already do this.

first byte is offset to first image data portion
Code:
0x0000:length of header (word)
Header:
Code:
0x0002: offset to next group/image?
0x04: ??
Image data section (relative offsets):
Code:
0x00: length of data-1 (Byte)
0xlength: what to do to the next section (byte)
    CA: (Unsure)
    CB: rows of 8px laid out normally, left to right, top to bottom
    CE: Rows are laid out from the end to beginning, right to left, bottom to top
    CF: (Unsure)
Aaaand that's all I know so far. But it's still a good insight. In case anyone else wants to explore it. I found this almost completely by accident, and I was so very excited to have even gotten that far. Best of luck to the person that finishes the job =D
__________________
Want my help in PokéScripting? PM me =)
I use XSE v1.1.1 (HackMew = awesome) and Advance Map 1.92.
Thanks to Diego and HackMew for their tutorials, helping me learn how to script!

Hacks I support 100% (MUST SEE!):


Very well made hacks:

My work:
Figuring out scripting in PMD
Entire script map of LeafGreen
PMDSE (Pokémon Mystery Dungeon Script Editor)

Last edited by Nerketur; May 12th, 2014 at 11:46 PM. Reason: Made things clearer.
Reply With Quote
  #496    
Old May 13th, 2014, 02:25 AM
GoGoJJTech's Avatar
GoGoJJTech
GoGo
 
Join Date: Nov 2012
Location: Earth
Age: 15
Gender: Male
Nature: Quiet
Quote:
Originally Posted by Deokishisu View Post
Wouldn't it be easier to piggyback on the code that handles the surfing sprite? I mean, the player and the blob Pokemon that is surfed on are two different images. If you want riding Pokemon, I feel like it would be much easier to start there. See if the surfing blob sprite can use a different palette than the player.
No, since the surf sprite also uses the player's palette.
__________________
I believe in Jesus Christ my Savior. If you do too, and aren't scared to admit it, then copy and paste this into your signature.
Proof that I'm the third best Temple Run player in the Universe
The SoulSilver Music Patch - The Black Music Patch - Mega-Huge Sappy Tutorial - Time-Based Events - Yet Another Sprite Resource

Pokémon Platinum Red and Blue

Join me in the chat! Get help or just talk, I really don't care :D | Click here: http://chat.linkandzelda.com:9090/?c...omhacking,GoGo
Reply With Quote
  #497    
Old May 13th, 2014, 01:38 PM
SBird
 
Join Date: Aug 2009
Gender: Male
I just came over an somehow interesting problem(at least one I have no solution for by now, I actually thought that was kind of easy)

I am basically looking for a routine that updates the palettes of a map, so the BG palettes and the OAM palettes. It does'nt have to update the tiles, but I don't care if it does (As long as this does not produce lagg, slowdowns or visual shinanigance since I would have to call those routines during the players movement)

What I already found is a routine that is sort of a soft_reset, it does not update the sprites though and it ignores rain, so if its currently raining and the routine is called, the screen is lit up. Basically such a thing has to exist because this is what happens when the player enters a warp or leaves the menu, but I wasn't able to find it.

Maybe someone had already had more luck than me :D

Oh btw. I am working on pokémon emerald (german) but if anyone has a routine offset that works for FRE I'll be happy as well because it's not too complicated to port such an offset since the games basically had the same base code which is firered.

~SBird
Reply With Quote
  #498    
Old May 17th, 2014, 10:40 PM
Spherical Ice's Avatar
Spherical Ice
Community Supporter
 
Join Date: Nov 2007
Location: UK
Send a message via Skype™ to Spherical Ice
I'm not sure if I'm allowed to do this, but to prevent this info from getting lost I'm going to quote colcolstyles from here: http://www.pokecommunity.com/showpos...ostcount=17122

Quote:
Originally Posted by colcolstyles View Post
Here are some of my findings:

Code:
0x1A654B : executed after battle fades, before "scurried home/to PC" text

0x16a2cb : viridian city 'sethealingplace' script (type 3)
0x1bc05c : 'special 0x182' script (type 5)

0x1A8DD8 : home script (mother heals your team)
0x1a8d97 : PokeCenter Script (Nurse Joy heals your team)
Basically this is what happens: after the battles fades, the game runs the script at 0x1A654B. Before the "player scurried to such and such place" text is displayed, the level scripts (types 3 & 5) are executed for the target map (there are none for the player's house). After the text is printed and the player presses A, the game fades back in to the player's new location and one of those two scripts is executed. As for which tile the player gets warped to, I'll have to do further research.
Again, I didn't discover this but I think it needs to be reposted because it took me quite some time to find it.
__________________
Reply With Quote
  #499    
Old May 19th, 2014, 12:48 PM
daniilS's Avatar
daniilS
busy trying to do stuff not done yet
 
Join Date: Aug 2013
Age: 14
Gender: Male
Nature: Relaxed
Has anybody got any info on link functionality in FireRed? What I'm looking for specifically is how multi/tag battles work and how the other player's data is transfered.
__________________

Thanks to JPAN, Jambo51, Shiny Quagsire and knizz for teaching me almost everything I know about hacking, through tutorials or in person.
Reply With Quote
  #500    
Old May 26th, 2014, 05:51 AM
Spherical Ice's Avatar
Spherical Ice
Community Supporter
 
Join Date: Nov 2007
Location: UK
Send a message via Skype™ to Spherical Ice
textcolor 0xFF reverts the text colour to the default colour for the person event's gender. This is information from DavidJCobb's repository on each of the commands in FireRed. He has since abandoned this, but in an effort to revive it and continue the documentation, I have hosted this repository with some revisions: http://www.sphericalice.co/romhackin...djcobb_script/

If you have any contributions you wish to add to this, please do share them either here, by PM/VMing, or by e-mailing me, and I'll add it to that repository. Hopefully we can expand it!
__________________

Last edited by Spherical Ice; May 26th, 2014 at 06:20 AM.
Reply With Quote
Reply
Quick Reply

Sponsored Links
Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Minimum Characters Per Post: 25



All times are UTC -8. The time now is 12:22 PM.


Style by Nymphadora, artwork by Sa-Dui.
Like our Facebook Page Follow us on Twitter © 2002 - 2014 The PokéCommunity™, pokecommunity.com.
Pokémon characters and images belong to The Pokémon Company International and Nintendo. This website is in no way affiliated with or endorsed by Nintendo, Creatures, GAMEFREAK, The Pokémon Company or The Pokémon Company International. We just love Pokémon.
All forum styles, their images (unless noted otherwise) and site designs are © 2002 - 2014 The PokéCommunity / PokéCommunity.com.
PokéCommunity™ is a trademark of The PokéCommunity. All rights reserved. Sponsor advertisements do not imply our endorsement of that product or service. User generated content remains the property of its creator.