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

Development: Animating the FireRed titlescreen.

Darthatron

巨大なトロール。
1,152
Posts
18
Years
  • While browsing this section I found a post by colcolstyles (see below) about the amount of frames that the titlescreen in FireRed is displayed for. I then thought to myself "That'd be a good way to add an animation to the titlescreen!" and then I posted this thread.

    For anyone who's interested, at '0x078c1c' there is a 32-bit number (the default value is '0x00000a8b') which dictates the number of frames for which the titlescreen is displayed before resetting. The GBA operates at roughly 60 frames per second and '0xa8b' divided by 60 is 45 so the unedited titlescreen is displayed for 45 seconds. You can change that number (remember to reverse it) to lengthen or shorten the amount of time it takes for the titlescreen to reset.

    This is for Fire Red, by the way.

    Anyway, my idea is to inject a routine just before that check to change the tileset/tilemap of the Charizard on the titlescreen, based on the amount of frames passed, allowing for animations to be used.

    This would be a much better way of having an animated titlescreen than anything done before now(I think), since more than 2 frames will be able to be used.

    I'll let you all know how it goes!!

    EDIT:
    http://www.youtube.com/watch?v=SA95KzAgb48
    Success has been had.

    EDIT2:
    It now works by using a data array that works as such:
    Code:
    word:   Pointer to image
    byte:   Pause Length
    byte:   Next Frame
    hword:  Buffer

    ...so a simple endless-loop animation (like in the video) would be possible, or you could play the first few frames once, then loop to a frame somewhere in the middle. Or you can stop the animation at the end by pointing to its own frame. The animation can be up to 255 frames. ^_^

    So yeah, it just changes the tiles, not the tilemap, as that seems to suffice.

    Any other ideas?

    EDIT:
    Zapdos in the animation: http://www.youtube.com/watch?v=rnm4SkwE22I
     
    Last edited:

    Darthatron

    巨大なトロール。
    1,152
    Posts
    18
    Years
  • For Emerald, I think it would be better to use an OAM. Of course, this would make moving of the animation a lot easier as well. But it would limit the size of the animation to 64x64. :\
     

    Full Metal

    C(++) Developer.
    810
    Posts
    16
    Years
  • Awesome, thanks for this, I can't wait to quit programming and try it out at somepoint.
     
    Last edited:

    knizz

    192
    Posts
    16
    Years
    • Seen Oct 28, 2020
    Cool idea. Once I have finished all my school work I'll contribute.
     

    Sierraffinity

    Desperately trying to retire from ROM hacking
    1,069
    Posts
    16
    Years
  • I wouldn't know, exactly, how to get the game to load a new OAM to the title screen, or how to have it animate... well, that would probably just use the frame system we've already found. But I wouldn't know how to make it, say, go across the screen. Then again, I don't know how to do that with tilemaps either...
     

    Darthatron

    巨大なトロール。
    1,152
    Posts
    18
    Years
  • Yeah, but not with the way they are stored in the B/W ROM, since they are stored as "parts" rather than full frames. But if you make/find full frames, and give me the order, I can make a video showing it.

    EDIT: I got bored an put in Zapdos' animation. Well... kind of. Just the frames. Not the FULL animation, though that is very possible.

    http://www.youtube.com/watch?v=rnm4SkwE22I

    There is a downside to this hack, though. It takes quite a bit of space. The entire Zapdos animation (frames, tilemap and routine) take up 11.55kb (11,828 bytes) in the ROM. Which only works out to about 0.0007% of the entire (un-expanded) ROM, but it's still quite a bit.
     
    Last edited:

    war rock exe

    Pokemon Colosseum Remaker!!
    823
    Posts
    14
    Years
  • Yeah, but not with the way they are stored in the B/W ROM, since they are stored as "parts" rather than full frames. But if you make/find full frames, and give me the order, I can make a video showing it.

    EDIT: I got bored an put in Zapdos' animation. Well... kind of. Just the frames. Not the FULL animation, though that is very possible.

    http://www.youtube.com/watch?v=rnm4SkwE22I

    There is a downside to this hack, though. It takes quite a bit of space. The entire Zapdos animation (frames, tilemap and routine) take up 11.55kb (11,828 bytes) in the ROM. Which only works out to about 0.0007% of the entire (un-expanded) ROM, but it's still quite a bit.



    nice vid man

    i'm guessing that you should probably complete the hack before you input the titlescreen...
     

    Full Metal

    C(++) Developer.
    810
    Posts
    16
    Years
  • ^ He's not actually making a hack. He's hacking. you know, learning, experimenting in areas others haven't really abused much. It's pretty cool and fun. ;)
    ANYWAYS, what I *really* came here with.
    I tried bpr 08078C1C 2
    and nothing ever came up. :(
    But it's okay, I followed that post link, and read down on that thread a bit further where Knizz ( Reference ) posted the offset of the comparison. I looked up the point where r0 is loaded with the value.
    Spoiler:

    And I was wondering, is the bpr not triggering because it's not ldr-ing a constant value? :\
     

    Darthatron

    巨大なトロール。
    1,152
    Posts
    18
    Years
  • ^ He's not actually making a hack. He's hacking. you know, learning, experimenting in areas others haven't really abused much. It's pretty cool and fun. ;)
    ANYWAYS, what I *really* came here with.
    I tried bpr 08078C1C 2
    and nothing ever came up. :(
    But it's okay, I followed that post link, and read down on that thread a bit further where Knizz ( Reference ) posted the offset of the comparison. I looked up the point where r0 is loaded with the value.
    Spoiler:

    And I was wondering, is the bpr not triggering because it's not ldr-ing a constant value? :\

    I had the same problem, I think. I had to manually go to the offset and look for the part that loaded it. :\ I have no idea why, though. Sorry.

    I use No$GBA to debug, though. Not VBA.



    Anyway, if anyone wants the routine as is, PM me for it. I'm sure it can be optimized, but I don't have much free time to do so.
     

    Darthatron

    巨大なトロール。
    1,152
    Posts
    18
    Years
  • Nice work! Now we only need to be able to 'pull' tilemaps across the screen...
    And make this work in Emerald too, as it just resets on the end of the song.

    In regards to this, I looked in to it, and it's a LOT easier to move the tilemap than I thought it would be. ^_^ Infact, I implemented it and it seems to work fine. Except when moving it from the X-axis, from off the screen, since the GBA hardware "wraps" the tilemap, which makes it come from left if moved off the right, and visa versa. :\ I can't see an easy way around this... Y-axis has no problem at all, though.

    EDIT: Source off all knowledge: http://nocash.emubase.de/gbatek.htm#lcdiobgscrolling

    EDIT2: http://www.youtube.com/watch?v=NuetDQEUqKQ
     
    Last edited:
    3,830
    Posts
    14
    Years
    • Age 27
    • OH
    • Seen Feb 26, 2024
    Wow, that really is quite amazing. Great work! I only wish I knew more so that I could contribute to this. :(
     

    RHIOne

    Dev of Hack Album RHIOne
    5
    Posts
    13
    Years
  • Wow... Amazing job on this, I was having a two-framed titlescreen before, and I look into this for more frames :D
     

    Full Metal

    C(++) Developer.
    810
    Posts
    16
    Years
  • Hey, I tried that routine.
    I think I did a nice job at understanding it. :)
    You load a pointer to an array of those structures
    Then, you load a pointer to the image and copy it.
    Then you wait until the frame count for that image passes
    Then you load the next and continue. { you store the fc and the current frame in that RAM_ADDRESS location thing. }
    But one question, how do you know when to reset back to the first image?
    { I still haven't actually gotten this thing to work btw. I probably just need to start with a fresh ROM and go from there. }
    Also, some other questions.
    For that routine, does it use a tilemap? What about the graphics, should they be compressed, or decompressed?
    *edit*
    NVM on the knowing when to restart. You just set the `next frame` value to 0. :P
    I FEEL SILLY now. But the questions of tilemaps uncompressed/compressed still remains.
    Although I have a feeling it's uncompressed with a tilemap...(GbaTek doesn't say swi 0xC uncompresses any data )
     
    Last edited:

    Darthatron

    巨大なトロール。
    1,152
    Posts
    18
    Years
  • Hey, I tried that routine.
    I think I did a nice job at understanding it. :)
    You load a pointer to an array of those structures
    Then, you load a pointer to the image and copy it.
    Then you wait until the frame count for that image passes
    Then you load the next and continue. { you store the fc and the current frame in that RAM_ADDRESS location thing. }
    But one question, how do you know when to reset back to the first image?
    { I still haven't actually gotten this thing to work btw. I probably just need to start with a fresh ROM and go from there. }
    Also, some other questions.
    For that routine, does it use a tilemap? What about the graphics, should they be compressed, or decompressed?
    *edit*
    NVM on the knowing when to restart. You just set the `next frame` value to 0. :P
    I FEEL SILLY now. But the questions of tilemaps uncompressed/compressed still remains.
    Although I have a feeling it's uncompressed with a tilemap...(GbaTek doesn't say swi 0xC uncompresses any data )

    The routine I gave you doesn't load any tilemap, it just uses the one in the original titlescreen, so you can replace that one. All graphics are compressed. ^_^

    EDIT: Also, I don't know where you got SWI 0xC from? The only SWI used is 0x12 (LZ77UnCompVram.)
     
    Last edited:

    Full Metal

    C(++) Developer.
    810
    Posts
    16
    Years
  • OH! I thought that was a decimal twelve, which I thought was odd. Awesome, thanks.

    Okay...I must be doing something wrong.
    I inserted my routine, and adjusted the original as you recommended ( I remembered to add 1 to the offset ) and I can view the titlescreen, and continue to the continue/new game screen. However...the swi function I think is causing some issues. It's copying *way* too much data, and it looks corrupt in the tile-viewer. ( I did insert two frames using unlz.GBA )



    The Title Screen as it appears now.


    Tile Viewer.
     
    Last edited:

    xephos

    xephos Inc.
    14
    Posts
    12
    Years
  • Nice. Is it possible to get objects moving left to fight ie: fireballs going left and right rather than up and down?
     
    Back
    Top