• 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?".
  • Forum moderator applications are now open! Click here for details.
  • 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.

Quick Research & Development Thread

25
Posts
12
Years
  • Seen Aug 25, 2017
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

busy trying to do stuff not done yet
409
Posts
10
Years
  • Age 24
  • Seen Jan 29, 2024
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.
 
25
Posts
12
Years
  • Seen Aug 25, 2017
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)
 
106
Posts
15
Years
  • Seen May 29, 2019
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

Glory To Arstotzka
736
Posts
14
Years
  • Seen Jan 28, 2018
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.
 
25
Posts
12
Years
  • Seen Aug 25, 2017
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

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.
 
106
Posts
15
Years
  • Seen May 29, 2019
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:

Jambo51

Glory To Arstotzka
736
Posts
14
Years
  • Seen Jan 28, 2018
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.
 
Last edited:

Derlo

Tired....
135
Posts
16
Years
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.
 
25
Posts
12
Years
  • Seen Aug 25, 2017
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:

Deokishisu

Mr. Magius
989
Posts
18
Years
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

PokéScripter
104
Posts
13
Years
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
 
Last edited:

GoGoJJTech

(☞゚ヮ゚)☞ http://GoGoJJTech.com ☜(゚ヮ゚☜)
2,475
Posts
11
Years
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.
 
91
Posts
14
Years
  • Seen Feb 22, 2023
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
 
5,256
Posts
16
Years
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

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.
 

daniilS

busy trying to do stuff not done yet
409
Posts
10
Years
  • Age 24
  • Seen Jan 29, 2024
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.
 
5,256
Posts
16
Years
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/romhacking/davidjcobb_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:

kearnseyboy6

Aussie's Toughest Mudder
300
Posts
15
Years
  • Seen Jun 22, 2019
If you want to change a text box permanently navigate to 0x160450. There are pointer to textbox type 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6 etc.

Yes you can use XSE to decompile these scripts and feel free to add in anything you may desire.... permanently!

So you won't have to call the transparency asm in every script you want, it does it automatically.
 
Back
Top