Skip to content

Commit

Permalink
Special OAM code refactoring
Browse files Browse the repository at this point in the history
Refactoring of the code responsible for custom animation tables and sprites pixel offsets. Those properties are now loaded in SpriteStateData2 before PrepareOAMData is called, minimise the processing impact of searching in list for every map object which caused tearing.
  • Loading branch information
Engezerstorung committed Sep 13, 2024
1 parent 08b7beb commit 6d8a48d
Show file tree
Hide file tree
Showing 7 changed files with 200 additions and 177 deletions.
1 change: 1 addition & 0 deletions color/color.asm
Original file line number Diff line number Diff line change
Expand Up @@ -1145,6 +1145,7 @@ INCLUDE "color/data/badgepalettemap.asm"
INCLUDE "color/dmg.asm"

INCLUDE "color/colorplus/loadextragfx.asm"
INCLUDE "color/colorplus/spritespecialproperties.asm"

; Copy of sound engine used by dmg-mode to play jingle
SECTION "bank31", ROMX
Expand Down
159 changes: 159 additions & 0 deletions color/colorplus/spritespecialproperties.asm
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
SpriteSpecialProperties::
; This function look for sprites in SpecialOAMlist and load special proporties in wSpriteStateData2
; it make use of the previously unused bytes $1, $A, and $B
xor a
.spriteLoop
ldh [hSpriteOffset2], a

ld d, HIGH(wSpriteStateData1) ; start by searching the PictureID of the current map object
ld e, a
ld a, [de] ; [x#SPRITESTATEDATA1_PICTUREID]
ld [wSavedSpritePictureID], a

ld hl, SpecialOAMlist ; loading list for identification and properties values
push de ; save d and e
ld de, 4 ; define the number of properties in list
call IsInArray ; check if Sprite is in list ; modify a/b/de
pop de
jr nc, .nextCheck

inc hl
inc e
inc d
ld a, [hli]
ld [de], a
ld a, $9
add e
ld e, a
ld a, [hli]
ld [de], a
inc e
ld a, [hl]
ld [de], a

.nextCheck
ldh a, [hSpriteOffset2]
add $10
cp LOW($100)
jp nz, .spriteLoop
ret

SpecialOAMlist:
; see constants/sprite_constants.asm
; db SPRITE_CONSTANT, $OAMtable, YPixelOffest, XPixelOffset
; Regular sprites
; db SPRITE_NONE, $00, 0, 0
; db SPRITE_RED, $00, 0, 0
; db SPRITE_BLUE, $00, 0, 0
; db SPRITE_OAK, $00, 0, 0
; db SPRITE_YOUNGSTER, $00, 0, 0
; db SPRITE_MONSTER, $00, 0, 0
; db SPRITE_COOLTRAINER_F, $00, 0, 0
; db SPRITE_COOLTRAINER_M, $00, 0, 0
; db SPRITE_LITTLE_GIRL, $00, 0, 0
; db SPRITE_BIRD, $00, 0, 0
; db SPRITE_MIDDLE_AGED_MAN, $00, 0, 0
; db SPRITE_GAMBLER, $00, 0, 0
; db SPRITE_SUPER_NERD, $00, 0, 0
; db SPRITE_GIRL, $00, 0, 0
; db SPRITE_HIKER, $00, 0, 0
; db SPRITE_BEAUTY, $00, 0, 0
; db SPRITE_GENTLEMAN, $00, 0, 0
; db SPRITE_DAISY, $00, 0, 0
; db SPRITE_BIKER, $00, 0, 0
; db SPRITE_SAILOR, $00, 0, 0
; db SPRITE_COOK, $00, 0, 0
; db SPRITE_BIKE_SHOP_CLERK, $00, 0, 0
; db SPRITE_MR_FUJI, $00, 0, 0
; db SPRITE_GIOVANNI, $00, 0, 0
; db SPRITE_ROCKET, $00, 0, 0
; db SPRITE_CHANNELER, $00, 0, 0
; db SPRITE_WAITER, $00, 0, 0
; db SPRITE_ERIKA, $00, 0, 0
; db SPRITE_MIDDLE_AGED_WOMAN, $00, 0, 0
; db SPRITE_BRUNETTE_GIRL, $00, 0, 0
; db SPRITE_LANCE, $00, 0, 0
; db SPRITE_UNUSED_SCIENTIST, $00, 0, 0
; db SPRITE_SCIENTIST, $00, 0, 0
; db SPRITE_ROCKER, $00, 0, 0
; db SPRITE_SWIMMER, $00, 0, 0
; db SPRITE_SAFARI_ZONE_WORKER, $00, 0, 0
; db SPRITE_GYM_GUIDE, $00, 0, 0
; db SPRITE_GRAMPS, $00, 0, 0
; db SPRITE_CLERK, $00, 0, 0
; db SPRITE_FISHING_GURU, $00, 0, 0
; db SPRITE_GRANNY, $00, 0, 0
; db SPRITE_NURSE, $00, 0, 0
; db SPRITE_LINK_RECEPTIONIST, $00, 0, 0
; db SPRITE_SILPH_PRESIDENT, $00, 0, 0
; db SPRITE_SILPH_WORKER, $00, 0, 0
; db SPRITE_WARDEN, $00, 0, 0
; db SPRITE_CAPTAIN, $00, 0, 0
; db SPRITE_FISHER, $00, 0, 0
; db SPRITE_KOGA, $00, 0, 0
; db SPRITE_GUARD, $00, 0, 0
; db SPRITE_UNUSED_GUARD, $00, 0, 0
; db SPRITE_MOM, $00, 0, 0
; db SPRITE_BALDING_GUY, $00, 0, 0
; db SPRITE_LITTLE_BOY, $00, 0, 0
; db SPRITE_UNUSED_GAMEBOY_KID, $00, 0, 0
; db SPRITE_GAMEBOY_KID, $00, 0, 0
; db SPRITE_FAIRY, $00, 0, 0
; db SPRITE_AGATHA, $00, 0, 0
; db SPRITE_BRUNO, $00, 0, 0
; db SPRITE_LORELEI, $00, 0, 0
; db SPRITE_SEEL, $00, 0, 0
; db SPRITE_ARTICUNO, $00, 0, 0
; db SPRITE_CHANSEY, $00, 0, 0
; db SPRITE_CLEFAIRY, $00, 0, 0
; db SPRITE_CUBONE, $00, 0, 0
; db SPRITE_KANGASKHAN, $00, 0, 0
; db SPRITE_LAPRAS, $00, 0, 0
; db SPRITE_MEOWTH, $00, 0, 0
; db SPRITE_MEWTWO, $00, 0, 0
; db SPRITE_MOLTRES, $00, 0, 0
; db SPRITE_NIDORINO, $00, 0, 0
; db SPRITE_PIDGEOT, $00, 0, 0
; db SPRITE_POLYWRATH, $00, 0, 0
; db SPRITE_PSYDUCK, $00, 0, 0
; db SPRITE_SLOWBRO, $00, 0, 0
; db SPRITE_SLOWPOKE, $00, 0, 0
; db SPRITE_SPEAROW, $00, 0, 0
; db SPRITE_VOLTORB, $00, 0, 0
; db SPRITE_WIGGLYTUFF, $00, 0, 0
; Still Sprites
; db SPRITE_POKE_BALL, $10, 0, 0
; db SPRITE_FOSSIL, $10, 0, 0
; db SPRITE_PAPER, $10, 0, 0
; db SPRITE_POKEDEX, $10, 0, 0
; db SPRITE_CLIPBOARD, $10, 0, 0
; db SPRITE_UNUSED_OLD_AMBER, $10, 0, 0
; db SPRITE_OLD_AMBER, $10, 0, 0
; db SPRITE_UNUSED_GAMBLER_ASLEEP_1, $10, 0, 0
; db SPRITE_UNUSED_GAMBLER_ASLEEP_2, $10, 0, 0
; db SPRITE_GAMBLER_ASLEEP, $10, 0, 0

db SPRITE_DOME_FOSSIL, $10, 0, 0
; Regular sprites with -1 X offset on down/up flipped walking frame
db SPRITE_DODUO, $20, 0, 0
db SPRITE_FEAROW, $20, 0, 0
db SPRITE_JIGGLYPUFF, $20, 0, 0
db SPRITE_MACHOKE, $20, 0, 0
db SPRITE_MACHOP, $20, 0, 0
db SPRITE_NIDORANF, $20, 0, 1
db SPRITE_NIDORANM, $20, 0, 0
db SPRITE_PIDGEY, $20, 0, 0
db SPRITE_PIKACHU, $20, 0, 0
db SPRITE_SEEL2, $20, 0, 0
db SPRITE_ZAPDOS, $20, 0, 0
db SPRITE_KABUTO, $20, 0, 0
; Still, Y offset
db SPRITE_BOULDER, $10, 3, 0
db SPRITE_SNORLAX, $10, 4, 0
; Still, YX offset
db SPRITE_BENCH_GUY, $10, 4, 4
; Bill's Machines
db SPRITE_BILLS_MACHINE, $30, 0, 0
; 3x3 tiles Snorlax
db SPRITE_SNORLAXBIG, $40, 0, 0
db -1
136 changes: 8 additions & 128 deletions data/sprites/facings.asm
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ SpriteFacingAndAnimationTable:
dw .StandingDown, .NormalOAM ; facing right, walk animation frame 1
dw .StandingDown, .NormalOAM ; facing right, walk animation frame 2
dw .StandingDown, .NormalOAM ; facing right, walk animation frame 3
; $20 This table is usef for Pokémons with an Odd number of pixels when facing Up and Down
; $20 This table is used for Pokémons with an Odd number of pixels when facing Up and Down
; Add a -1 X offset on the flipped down/up walking frame
dw .StandingDown, .NormalOAM ; facing down, walk animation frame 0
dw .WalkingDown, .NormalOAM ; facing down, walk animation frame 1
Expand Down Expand Up @@ -87,6 +87,7 @@ SpriteFacingAndAnimationTable:
dw .Snorlax, .SnorlaxOAM ; facing right, walk animation frame 1
dw .Snorlax, .SnorlaxOAM ; facing right, walk animation frame 2
dw .Snorlax, .SnorlaxOAM ; facing right, walk animation frame 3

; insert custom table starting here, each table must contain 4 facings with 4 animation frames each (16 total)

; four tile ids compose an overworld sprite
Expand All @@ -97,8 +98,8 @@ SpriteFacingAndAnimationTable:
.StandingLeft: db $08, $09, $0a, $0b
.WalkingLeft: db $88, $89, $8a, $8b

.MachineSides: db $02
.MachineCenter:db $03, $03
.MachineCenter:db $01, $01
.MachineSides: ; fallthrough for $00

.Snorlax: db $00, $01, $00, $02, $03, $02, $04, $05, $04

Expand All @@ -125,14 +126,14 @@ SpriteFacingAndAnimationTable:

.MachineLOAM:
; y, x, attributes
db 4, 8, OAMFLAG_ENDOFDATA
db 12, 8, OAMFLAG_ENDOFDATA
.MachineROAM:
; y, x, attributes
db 4, 0, OAM_HFLIP | OAMFLAG_ENDOFDATA
db 12, 0, OAM_HFLIP | OAMFLAG_ENDOFDATA
.MachineMOAM:
; y, x, attributes
db 4, 0, $00
db 4, 8, OAM_HFLIP | OAMFLAG_ENDOFDATA
db 12, 0, $00
db 12, 8, OAM_HFLIP | OAMFLAG_ENDOFDATA

.SnorlaxOAM:
; y, x, attributes
Expand All @@ -145,124 +146,3 @@ SpriteFacingAndAnimationTable:
db 13, -4, $00 ; bottom left
db 13, 4, $00 ; bottom center
db 13, 12, OAM_HFLIP | OAMFLAG_ENDOFDATA ; bottom right

SpecialOAMlist:
; see constants/sprite_constants.asm
; db SPRITE_CONSTANT, $OAMtable, YPixelOffest, XPixelOffset
; Regular sprites
; db SPRITE_NONE, $00, 0, 0
; db SPRITE_RED, $00, 0, 0
; db SPRITE_BLUE, $00, 0, 0
; db SPRITE_OAK, $00, 0, 0
; db SPRITE_YOUNGSTER, $00, 0, 0
; db SPRITE_MONSTER, $00, 0, 0
; db SPRITE_COOLTRAINER_F, $00, 0, 0
; db SPRITE_COOLTRAINER_M, $00, 0, 0
; db SPRITE_LITTLE_GIRL, $00, 0, 0
; db SPRITE_BIRD, $00, 0, 0
; db SPRITE_MIDDLE_AGED_MAN, $00, 0, 0
; db SPRITE_GAMBLER, $00, 0, 0
; db SPRITE_SUPER_NERD, $00, 0, 0
; db SPRITE_GIRL, $00, 0, 0
; db SPRITE_HIKER, $00, 0, 0
; db SPRITE_BEAUTY, $00, 0, 0
; db SPRITE_GENTLEMAN, $00, 0, 0
; db SPRITE_DAISY, $00, 0, 0
; db SPRITE_BIKER, $00, 0, 0
; db SPRITE_SAILOR, $00, 0, 0
; db SPRITE_COOK, $00, 0, 0
; db SPRITE_BIKE_SHOP_CLERK, $00, 0, 0
; db SPRITE_MR_FUJI, $00, 0, 0
; db SPRITE_GIOVANNI, $00, 0, 0
; db SPRITE_ROCKET, $00, 0, 0
; db SPRITE_CHANNELER, $00, 0, 0
; db SPRITE_WAITER, $00, 0, 0
; db SPRITE_ERIKA, $00, 0, 0
; db SPRITE_MIDDLE_AGED_WOMAN, $00, 0, 0
; db SPRITE_BRUNETTE_GIRL, $00, 0, 0
; db SPRITE_LANCE, $00, 0, 0
; db SPRITE_UNUSED_SCIENTIST, $00, 0, 0
; db SPRITE_SCIENTIST, $00, 0, 0
; db SPRITE_ROCKER, $00, 0, 0
; db SPRITE_SWIMMER, $00, 0, 0
; db SPRITE_SAFARI_ZONE_WORKER, $00, 0, 0
; db SPRITE_GYM_GUIDE, $00, 0, 0
; db SPRITE_GRAMPS, $00, 0, 0
; db SPRITE_CLERK, $00, 0, 0
; db SPRITE_FISHING_GURU, $00, 0, 0
; db SPRITE_GRANNY, $00, 0, 0
; db SPRITE_NURSE, $00, 0, 0
; db SPRITE_LINK_RECEPTIONIST, $00, 0, 0
; db SPRITE_SILPH_PRESIDENT, $00, 0, 0
; db SPRITE_SILPH_WORKER, $00, 0, 0
; db SPRITE_WARDEN, $00, 0, 0
; db SPRITE_CAPTAIN, $00, 0, 0
; db SPRITE_FISHER, $00, 0, 0
; db SPRITE_KOGA, $00, 0, 0
; db SPRITE_GUARD, $00, 0, 0
; db SPRITE_UNUSED_GUARD, $00, 0, 0
; db SPRITE_MOM, $00, 0, 0
; db SPRITE_BALDING_GUY, $00, 0, 0
; db SPRITE_LITTLE_BOY, $00, 0, 0
; db SPRITE_UNUSED_GAMEBOY_KID, $00, 0, 0
; db SPRITE_GAMEBOY_KID, $00, 0, 0
; db SPRITE_FAIRY, $00, 0, 0
; db SPRITE_AGATHA, $00, 0, 0
; db SPRITE_BRUNO, $00, 0, 0
; db SPRITE_LORELEI, $00, 0, 0
; db SPRITE_SEEL, $00, 0, 0
; db SPRITE_ARTICUNO, $00, 0, 0
; db SPRITE_CHANSEY, $00, 0, 0
; db SPRITE_CLEFAIRY, $00, 0, 0
; db SPRITE_CUBONE, $00, 0, 0
; db SPRITE_KANGASKHAN, $00, 0, 0
; db SPRITE_LAPRAS, $00, 0, 0
; db SPRITE_MEOWTH, $00, 0, 0
; db SPRITE_MEWTWO, $00, 0, 0
; db SPRITE_MOLTRES, $00, 0, 0
; db SPRITE_NIDORINO, $00, 0, 0
; db SPRITE_PIDGEOT, $00, 0, 0
; db SPRITE_POLYWRATH, $00, 0, 0
; db SPRITE_PSYDUCK, $00, 0, 0
; db SPRITE_SLOWBRO, $00, 0, 0
; db SPRITE_SLOWPOKE, $00, 0, 0
; db SPRITE_SPEAROW, $00, 0, 0
; db SPRITE_VOLTORB, $00, 0, 0
; db SPRITE_WIGGLYTUFF, $00, 0, 0
; Still Sprites
; db SPRITE_POKE_BALL, $10, 0, 0
; db SPRITE_FOSSIL, $10, 0, 0
; db SPRITE_PAPER, $10, 0, 0
; db SPRITE_POKEDEX, $10, 0, 0
; db SPRITE_CLIPBOARD, $10, 0, 0
; db SPRITE_UNUSED_OLD_AMBER, $10, 0, 0
; db SPRITE_OLD_AMBER, $10, 0, 0
; db SPRITE_UNUSED_GAMBLER_ASLEEP_1, $10, 0, 0
; db SPRITE_UNUSED_GAMBLER_ASLEEP_2, $10, 0, 0
; db SPRITE_GAMBLER_ASLEEP, $10, 0, 0

db SPRITE_DOME_FOSSIL, $10, 0, 0
; Regular sprites with -1 X offset on down/up flipped walking frame
db SPRITE_DODUO, $20, 0, 0
db SPRITE_FEAROW, $20, 0, 0
db SPRITE_JIGGLYPUFF, $20, 0, 0
db SPRITE_MACHOKE, $20, 0, 0
db SPRITE_MACHOP, $20, 0, 0
db SPRITE_NIDORANF, $20, 0, 1
db SPRITE_NIDORANM, $20, 0, 0
db SPRITE_PIDGEY, $20, 0, 0
db SPRITE_PIKACHU, $20, 0, 0
db SPRITE_SEEL2, $20, 0, 0
db SPRITE_ZAPDOS, $20, 0, 0
db SPRITE_KABUTO, $20, 0, 0
; Still, Y offset
db SPRITE_BOULDER, $10, 3, 0
db SPRITE_SNORLAX, $10, 4, 0
; Still, YX offset
db SPRITE_BENCH_GUY, $10, 4, 4
; Bill's Machines
db SPRITE_BILLS_MACHINE, $30, 8, 0
; 3x3 tiles Snorlax
db SPRITE_SNORLAXBIG, $40, 0, 0
db -1
Loading

0 comments on commit 6d8a48d

Please sign in to comment.