The PokéCommunity Forums

The PokéCommunity Forums (https://www.pokecommunity.com/index.php)
-   Binary Hack Research & Development (https://www.pokecommunity.com/forumdisplay.php?f=195)
-   -   Quick Research & Development Thread (https://www.pokecommunity.com/showthread.php?t=205158)

GoGoJJTech April 13th, 2014 6:59 AM

Quote:

Originally Posted by sp13 (Post 8196370)
Doing it straight from Anvil sounds really handy! I didn't think to do that because I could never actually hear the modulations when listening through Anvil, only when opening in Sappy.

The mod command is quite necessary for most DS songs. Know why? It controls the way the instrument goes from one speaker to the next. To correct it type modt, 12 right under the mod command. Or you can use ipatix' tool MIDFIXforAGB.exe, which does this for you. My mega huge sappy tutorial covers this :D

ThomasWinwood April 17th, 2014 9:20 AM

The Pickup table in Emerald is at 0x31C440. It consists of two lists of values, the first for common items, the second for rare items starting at 0x31C464.

e: The Pickup routine is at 0x55C00, and the move command table is at 0x31BD10. There seem to be quite a few blocks in that region of pointer tables followed by data used by the routines they point to.

dagid44 May 4th, 2014 3:42 AM

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.

vizor May 4th, 2014 7:50 AM

Hey there, i need the offset of the generateOAM function + its parameter.

Shiny Quagsire May 4th, 2014 2:02 PM

Quote:

Originally Posted by vizor (Post 8230813)
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.

vizor May 4th, 2014 8:56 PM

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

Shiny Quagsire May 4th, 2014 9:25 PM

Quote:

Originally Posted by vizor (Post 8231780)
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.

vizor May 5th, 2014 3:34 AM

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?

Shiny Quagsire May 5th, 2014 8:05 PM

Quote:

Originally Posted by vizor (Post 8232086)
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.

Mana May 7th, 2014 7:46 AM

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?

vizor May 8th, 2014 6:03 AM

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.

daniilS May 8th, 2014 7:02 AM

Quote:

Originally Posted by vizor (Post 8237887)
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.

vizor May 8th, 2014 7:28 AM

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)

slawter666 May 8th, 2014 11:11 PM

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.

Jambo51 May 9th, 2014 8:48 AM

Quote:

Originally Posted by slawter666 (Post 8239853)
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.

vizor May 10th, 2014 10:39 AM

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.

slawter666 May 10th, 2014 11:56 AM

Quote:

Originally Posted by vizor (Post 8243045)
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.

Jambo51 May 11th, 2014 5:46 AM

Quote:

Originally Posted by slawter666 (Post 8243207)
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.

Derlo May 11th, 2014 10:09 AM

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.

vizor May 12th, 2014 5:42 AM

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

Deokishisu May 12th, 2014 9:18 PM

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.

Nerketur May 12th, 2014 11:41 PM

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

GoGoJJTech May 13th, 2014 2:25 AM

Quote:

Originally Posted by Deokishisu (Post 8247906)
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.

SBird May 13th, 2014 1:38 PM

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

Spherical Ice May 17th, 2014 10:40 PM

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/showpost.php?p=6360629&postcount=17122

Quote:

Originally Posted by colcolstyles (Post 6360629)
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.


All times are GMT -8. The time now is 8:53 AM.


Like our Facebook Page Follow us on Twitter © 2002 - 2018 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 - 2016 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.

Acknowledgements
Use of PokéCommunity Assets
vB Optimise by DragonByte Technologies Ltd © 2023.