You are not logged in.
Pages: 1
Basically, I found this other GBC game that want to copy the animated tiles from over to Gold. I have already extracted the tiles from the other game, but what I would like to know is where to insert them in Gold (like what bank), and how I would make a new animation instruction for displaying those tiles (if possible)? Or would I have to replace existing animation instructions?
I'm pretty sure my question is pretty hard to understand, but I'm wasn't exactly sure how to word it.
Last edited by Munchulax (2013-02-03 19:22:56)
“To live is the rarest thing in the world. Most people exist, that is all.” ― Oscar Wilde
Offline
The animations for tileset 0 are a good example, at $fc01e (2f:401e).
; param, function
dw $9140, AnimateWaterTile
dw $0000, WaitTileAnimation
dw $0000, WaitTileAnimation
dw $0000, WaitTileAnimation
dw $0000, TileAnimationPalette
dw $0000, WaitTileAnimation
dw $0000, AnimateFlowerTile
dw $0000, WaitTileAnimation
dw $0000, WaitTileAnimation
dw $0000, NextTileFrame8
dw $0000, DoneTileAnimation
You can see that this loop animates water, flowers and changes a pallete (in this case, it's water's).
One function = one frame. DoneTileAnimation resets the loop. NextTileFrame8 means that the animation's counter loops from 0-7 (8 frames total).
The parameter is typically a VRAM address for the tile(s) that you're writing to. The current tileset starts from $9000, and each tile is $10 bytes. A quick way to figure out which tile you're on is to take the middle 2 digits. For $9140, the middle digits are $14, so we're on the 20th tile.
AnimateFlowerTile assumes that the flower is always at the same tile, so it doesn't take any parameters.
A standard function works by checking $cf42 (TileAnimationTimer) and getting the right tile based on which part of the animation we're on. The actual change is made by jumping to WriteAnimationTile ($fc4c7). There are a couple requirements for using this function.
Let's look at the water animation:
AnimateWaterTile: ; fc406
; draw a tile for a given frame into vram
; hl: vram tile address (dest)
; save sp in bc
ld hl, sp+$0
ld b, h
ld c, l
WriteAnimationTile ends by replacing the stack pointer (sp) with bc. Putting the stack pointer in bc in the first place needs to happen or everything will break.
; get frame
ld a, [TileAnimationTimer]
; 4 possible values -> 4 tiles
and %110 ; 0, 2, 4, 6
; # bytes from starting location
; 2 x 8 = 16 bytes per tile
add a ;
add a ; x8
add a ;
The water tile changes once every 20 frames. From before, the TileAnimationTimer for tileset 0 loops over 8 animation counts (10 frames each). Since the rate is halved, the number of bytes per tile is implicitly doubled, so we only need to multiply the current frame by 8 to get the current tile.
; add to start address
add WaterTileFrames & $ff
ld l, a
ld a, $0
adc WaterTileFrames / $100
ld h, a
; sp is now sitting at the start of the tile for this frame
ld sp, hl
ld l, e
ld h, d
jp WriteAnimationTile
; fc420
The reason we had to save sp in bc is that WriteAnimationTile uses the stack to update the tile as quickly as possible, since writing to VRAM is time-sensitive.
The tile graphics for water animations are right after:
WaterTileFrames: ; fc420
; frame 0-3
INCBIN "gfx/tilesets/water.2bpp"
; fc460
And that's pretty much all there is to tile animations. I haven't looked for the pointer table yet but it should be in the same bank.
Last edited by comet (2013-02-03 21:20:10)
Offline
Okay, I think I get tile animations a lot better now. If I have any other questions, I'll be sure to ask. Thanks for your help.
(If you're wondering why it took me so long to reply, it's because I was studying ASM so that I could understand the post :P)
Last edited by Munchulax (2013-02-05 23:50:45)
“To live is the rarest thing in the world. Most people exist, that is all.” ― Oscar Wilde
Offline
Pages: 1