mirror of
https://github.com/thornAvery/kep-hack.git
synced 2025-09-17 02:40:50 +12:00
disasm of map sprite tile pattern loading code plus misc stuff
hg-commit-id: 58a62ff918a5
This commit is contained in:
parent
9d070736cc
commit
fe3b626ab9
|
@ -637,6 +637,10 @@ W_MAPCONN2PTR EQU $D37C
|
||||||
W_MAPCONN3PTR EQU $D387
|
W_MAPCONN3PTR EQU $D387
|
||||||
W_MAPCONN4PTR EQU $D392
|
W_MAPCONN4PTR EQU $D392
|
||||||
|
|
||||||
|
W_SPRITESET EQU $D39D ; sprite set for the current map (11 sprite picture ID's)
|
||||||
|
W_SPRITESETID EQU $D3A8 ; sprite set ID for the current map
|
||||||
|
|
||||||
|
W_NUMSPRITES EQU $D4E1 ; number of sprites on the current map
|
||||||
W_PEOPLEMOVEPERMISSIONS EQU $D4E4
|
W_PEOPLEMOVEPERMISSIONS EQU $D4E4
|
||||||
|
|
||||||
; coins are in decimal
|
; coins are in decimal
|
||||||
|
|
672
main.asm
672
main.asm
|
@ -1115,9 +1115,11 @@ CheckMapConnections: ; 7BA
|
||||||
call LoadMapHeader
|
call LoadMapHeader
|
||||||
call $2312 ; music
|
call $2312 ; music
|
||||||
ld b,$09
|
ld b,$09
|
||||||
call $3def ; SGB palette
|
call GoPAL_SET
|
||||||
ld b,$05
|
; Since the sprite set shouldn't change, this will just update VRAM slots at
|
||||||
ld hl,$785b ; load tile pattern data for sprites
|
; $C2XE without loading any tile patterns.
|
||||||
|
ld b,BANK(InitMapSprites)
|
||||||
|
ld hl,InitMapSprites
|
||||||
call Bankswitch
|
call Bankswitch
|
||||||
call LoadTileBlockMap
|
call LoadTileBlockMap
|
||||||
jp OverworldLoopLessDelay
|
jp OverworldLoopLessDelay
|
||||||
|
@ -2781,8 +2783,8 @@ LoadMapData: ; 1241
|
||||||
ld [$d3a8],a
|
ld [$d3a8],a
|
||||||
call LoadTextBoxTilePatterns
|
call LoadTextBoxTilePatterns
|
||||||
call LoadMapHeader
|
call LoadMapHeader
|
||||||
ld b,$05
|
ld b,BANK(InitMapSprites)
|
||||||
ld hl,$785b
|
ld hl,InitMapSprites
|
||||||
call Bankswitch ; load tile pattern data for sprites
|
call Bankswitch ; load tile pattern data for sprites
|
||||||
call LoadTileBlockMap
|
call LoadTileBlockMap
|
||||||
call LoadTilesetTilePatternData
|
call LoadTilesetTilePatternData
|
||||||
|
@ -2811,7 +2813,7 @@ LoadMapData: ; 1241
|
||||||
ld [$cfcb],a
|
ld [$cfcb],a
|
||||||
call EnableLCD
|
call EnableLCD
|
||||||
ld b,$09
|
ld b,$09
|
||||||
call $3def ; handle SGB palette
|
call GoPAL_SET
|
||||||
call LoadPlayerSpriteGraphics
|
call LoadPlayerSpriteGraphics
|
||||||
ld a,[$d732]
|
ld a,[$d732]
|
||||||
and a,$18 ; did the player fly or teleport in?
|
and a,$18 ; did the player fly or teleport in?
|
||||||
|
@ -4967,7 +4969,7 @@ InitGame: ; 1F54
|
||||||
call Predef ; display the copyrights, GameFreak logo, and battle animation
|
call Predef ; display the copyrights, GameFreak logo, and battle animation
|
||||||
call DisableLCD
|
call DisableLCD
|
||||||
call ZeroVram
|
call ZeroVram
|
||||||
call $3ddc
|
call GBPalNormal
|
||||||
call CleanLCD_OAM
|
call CleanLCD_OAM
|
||||||
ld a,%11100011
|
ld a,%11100011
|
||||||
ld [rLCDC],a ; enable LCD
|
ld [rLCDC],a ; enable LCD
|
||||||
|
@ -5567,10 +5569,10 @@ CloseTextDisplay: ; 29E8
|
||||||
add hl,de
|
add hl,de
|
||||||
dec c
|
dec c
|
||||||
jr nz,.restoreSpriteFacingDirectionLoop\@
|
jr nz,.restoreSpriteFacingDirectionLoop\@
|
||||||
ld a,$05
|
ld a,BANK(InitMapSprites)
|
||||||
ld [$ffb8],a
|
ld [$ffb8],a
|
||||||
ld [$2000],a
|
ld [$2000],a
|
||||||
call $785b ; reload sprite tile pattern data (since it was partially overwritten by text tile patterns)
|
call InitMapSprites ; reload sprite tile pattern data (since it was partially overwritten by text tile patterns)
|
||||||
ld hl,$cfc4
|
ld hl,$cfc4
|
||||||
res 0,[hl]
|
res 0,[hl]
|
||||||
ld a,[$d732]
|
ld a,[$d732]
|
||||||
|
@ -19721,7 +19723,647 @@ LoreleiSprite: ; 0x17540
|
||||||
SeelSprite: ; 0x176c0
|
SeelSprite: ; 0x176c0
|
||||||
INCBIN "gfx/sprites/seel.2bpp" ; was $176c0
|
INCBIN "gfx/sprites/seel.2bpp" ; was $176c0
|
||||||
|
|
||||||
INCBIN "baserom.gbc",$17840,$17b27 - $17840
|
; Loads tile patterns for tiles used in the pokedex.
|
||||||
|
LoadPokedexTilePatterns: ; 7840
|
||||||
|
call LoadHpBarAndStatusTilePatterns
|
||||||
|
ld de,$6488
|
||||||
|
ld hl,$9600
|
||||||
|
ld bc,$0412
|
||||||
|
call CopyVideoData
|
||||||
|
ld de,$697e
|
||||||
|
ld hl,$9720
|
||||||
|
ld bc,$0e01
|
||||||
|
jp CopyVideoData
|
||||||
|
|
||||||
|
; Loads tile patterns for map's sprites.
|
||||||
|
; For outside maps, it loads one of several fixed sets of sprites.
|
||||||
|
; For inside maps, it loads each sprite picture ID used in the map header.
|
||||||
|
; This is also called after displaying text because loading
|
||||||
|
; text tile patterns overwrites half of the sprite tile pattern data.
|
||||||
|
; Note on notation:
|
||||||
|
; $C1X* and $C2X* are used to denote $C100-$C1FF and $C200-$C2FF sprite slot
|
||||||
|
; fields, respectively, within loops. The X is the loop index.
|
||||||
|
; If there is an inner loop, Y is the inner loop index, i.e. $C1Y* and $C2Y*
|
||||||
|
; denote fields of the sprite slots interated over in the inner loop.
|
||||||
|
InitMapSprites: ; 785B
|
||||||
|
call InitOutsideMapSprites
|
||||||
|
ret c ; return if the map is an outside map (already handled by above call)
|
||||||
|
; if the map is an inside map (i.e. mapID >= $25)
|
||||||
|
ld hl,$c100
|
||||||
|
ld de,$c20d
|
||||||
|
; Loop to copy picture ID's from $C1X0 to $C2XD for LoadMapSpriteTilePatterns.
|
||||||
|
.copyPictureIDLoop\@
|
||||||
|
ld a,[hl] ; $C1X0 (picture ID)
|
||||||
|
ld [de],a ; $C2XD
|
||||||
|
ld a,$10
|
||||||
|
add e
|
||||||
|
ld e,a
|
||||||
|
ld a,$10
|
||||||
|
add l
|
||||||
|
ld l,a
|
||||||
|
jr nz,.copyPictureIDLoop\@
|
||||||
|
|
||||||
|
; This is used for both inside and outside maps, since it is called by
|
||||||
|
; InitOutsideMapSprites.
|
||||||
|
; Loads tile pattern data for sprites into VRAM.
|
||||||
|
LoadMapSpriteTilePatterns: ; 7871
|
||||||
|
ld a,[W_NUMSPRITES]
|
||||||
|
and a ; are there any sprites?
|
||||||
|
jr nz,.spritesExist\@
|
||||||
|
ret
|
||||||
|
.spritesExist\@
|
||||||
|
ld c,a ; c = [W_NUMSPRITES]
|
||||||
|
ld b,$10 ; number of sprite slots
|
||||||
|
ld hl,$c20d
|
||||||
|
xor a
|
||||||
|
ld [$ff8e],a ; 4-tile sprite counter
|
||||||
|
.copyPictureIDLoop\@ ; loop to copy picture ID from $C2XD to $C2XE
|
||||||
|
ld a,[hli] ; $C2XD (sprite picture ID)
|
||||||
|
ld [hld],a ; $C2XE
|
||||||
|
ld a,l
|
||||||
|
add a,$10
|
||||||
|
ld l,a
|
||||||
|
dec b
|
||||||
|
jr nz,.copyPictureIDLoop\@
|
||||||
|
ld hl,$c21e
|
||||||
|
.loadTilePatternLoop\@
|
||||||
|
ld de,$c21d
|
||||||
|
; Check if the current picture ID has already had its tile patterns loaded.
|
||||||
|
; This done by looping through the previous sprite slots and seeing if any of
|
||||||
|
; their picture ID's match that of the current sprite slot.
|
||||||
|
.checkIfAlreadyLoadedLoop\@
|
||||||
|
ld a,e
|
||||||
|
and a,$f0
|
||||||
|
ld b,a ; b = offset of the $c200 sprite slot being checked against
|
||||||
|
ld a,l
|
||||||
|
and a,$f0 ; a = offset of current $c200 sprite slot
|
||||||
|
cp b ; done checking all previous sprite slots?
|
||||||
|
jr z,.notAlreadyLoaded\@
|
||||||
|
ld a,[de] ; picture ID of the $c200 sprite slot being checked against
|
||||||
|
cp [hl] ; do the picture ID's match?
|
||||||
|
jp z,.alreadyLoaded\@
|
||||||
|
ld a,e
|
||||||
|
add a,$10
|
||||||
|
ld e,a
|
||||||
|
jr .checkIfAlreadyLoadedLoop\@
|
||||||
|
.notAlreadyLoaded\@
|
||||||
|
ld de,$c20e
|
||||||
|
ld b,$01
|
||||||
|
; loop to find the highest tile pattern VRAM slot (among the first 10 slots) used by a previous sprite slot
|
||||||
|
; this is done in order to find the first free VRAM slot available
|
||||||
|
.findNextVRAMSlotLoop\@
|
||||||
|
ld a,e
|
||||||
|
add a,$10
|
||||||
|
ld e,a
|
||||||
|
ld a,l
|
||||||
|
cp e ; reached current slot?
|
||||||
|
jr z,.foundNextVRAMSlot\@
|
||||||
|
ld a,[de] ; $C2YE (VRAM slot)
|
||||||
|
cp a,11 ; is it one of the first 10 slots?
|
||||||
|
jr nc,.findNextVRAMSlotLoop\@
|
||||||
|
cp b ; compare the slot being checked to the current max
|
||||||
|
jr c,.findNextVRAMSlotLoop\@ ; if the slot being checked is less than the current max
|
||||||
|
; if the slot being checked is greater than or equal to the current max
|
||||||
|
ld b,a ; store new max VRAM slot
|
||||||
|
jr .findNextVRAMSlotLoop\@
|
||||||
|
.foundNextVRAMSlot\@
|
||||||
|
inc b ; increment previous max value to get next VRAM tile pattern slot
|
||||||
|
ld a,b ; a = next VRAM tile pattern slot
|
||||||
|
push af
|
||||||
|
ld a,[hl] ; $C2XE (sprite picture ID)
|
||||||
|
ld b,a ; b = current sprite picture ID
|
||||||
|
cp a,SPRITE_BALL ; is it a 4-tile sprite?
|
||||||
|
jr c,.notFourTileSprite\@
|
||||||
|
pop af
|
||||||
|
ld a,[$ff8e] ; 4-tile sprite counter
|
||||||
|
add a,11
|
||||||
|
jr .storeVRAMSlot\@
|
||||||
|
.notFourTileSprite\@
|
||||||
|
pop af
|
||||||
|
.storeVRAMSlot\@
|
||||||
|
ld [hl],a ; store VRAM slot at $C2XE
|
||||||
|
ld [$ff8d],a ; used to determine if it's 4-tile sprite later
|
||||||
|
ld a,b ; a = current sprite picture ID
|
||||||
|
dec a
|
||||||
|
add a
|
||||||
|
add a
|
||||||
|
push bc
|
||||||
|
push hl
|
||||||
|
ld hl,SpriteSheetPointerTable
|
||||||
|
jr nc,.noCarry\@
|
||||||
|
inc h
|
||||||
|
.noCarry\@
|
||||||
|
add l
|
||||||
|
ld l,a
|
||||||
|
jr nc,.noCarry2\@
|
||||||
|
inc h
|
||||||
|
.noCarry2\@
|
||||||
|
push hl
|
||||||
|
call ReadSpriteSheetData
|
||||||
|
push af
|
||||||
|
push de
|
||||||
|
push bc
|
||||||
|
ld hl,$8000 ; VRAM base address
|
||||||
|
ld bc,$c0 ; number of bytes per VRAM slot
|
||||||
|
ld a,[$ff8d]
|
||||||
|
cp a,11 ; is it a 4-tile sprite?
|
||||||
|
jr nc,.fourTileSpriteVRAMAddr\@
|
||||||
|
ld d,a
|
||||||
|
dec d
|
||||||
|
; Equivalent to multiplying $C0 (number of bytes in 12 tiles) times the VRAM
|
||||||
|
; slot and adding the result to $8000 (the VRAM base address).
|
||||||
|
.calculateVRAMAddrLoop\@
|
||||||
|
add hl,bc
|
||||||
|
dec d
|
||||||
|
jr nz,.calculateVRAMAddrLoop\@
|
||||||
|
jr .loadStillTilePattern\@
|
||||||
|
.fourTileSpriteVRAMAddr\@
|
||||||
|
ld hl,$87c0 ; address for second 4-tile sprite
|
||||||
|
ld a,[$ff8e] ; 4-tile sprite counter
|
||||||
|
and a ; is it the first 4-tile sprite?
|
||||||
|
jr nz,.loadStillTilePattern\@
|
||||||
|
; if it's the first 4-tile sprite
|
||||||
|
ld hl,$8780 ; address for first 4-tile sprite
|
||||||
|
inc a
|
||||||
|
ld [$ff8e],a ; 4-tile sprite counter
|
||||||
|
.loadStillTilePattern\@
|
||||||
|
pop bc
|
||||||
|
pop de
|
||||||
|
pop af
|
||||||
|
push hl
|
||||||
|
push hl
|
||||||
|
ld h,d
|
||||||
|
ld l,e
|
||||||
|
pop de
|
||||||
|
ld b,a
|
||||||
|
ld a,[$cfc4]
|
||||||
|
bit 0,a ; reloading upper half of tile patterns after displaying text?
|
||||||
|
jr nz,.skipFirstLoad\@ ; if so, skip loading data into the lower half
|
||||||
|
ld a,b
|
||||||
|
ld b,0
|
||||||
|
call FarCopyData2 ; load tile pattern data for sprite when standing still
|
||||||
|
.skipFirstLoad\@
|
||||||
|
pop de
|
||||||
|
pop hl
|
||||||
|
ld a,[$ff8d]
|
||||||
|
cp a,11 ; is it a 4-tile sprite?
|
||||||
|
jr nc,.skipSecondLoad\@ ; if so, there is no second block
|
||||||
|
push de
|
||||||
|
call ReadSpriteSheetData
|
||||||
|
push af
|
||||||
|
ld a,$c0
|
||||||
|
add e
|
||||||
|
ld e,a
|
||||||
|
jr nc,.noCarry3\@
|
||||||
|
inc d
|
||||||
|
.noCarry3\@
|
||||||
|
ld a,[$cfc4]
|
||||||
|
bit 0,a ; reloading upper half of tile patterns after displaying text?
|
||||||
|
jr nz,.loadWhileLCDOn\@
|
||||||
|
pop af
|
||||||
|
pop hl
|
||||||
|
set 3,h ; add $800 to hl
|
||||||
|
push hl
|
||||||
|
ld h,d
|
||||||
|
ld l,e
|
||||||
|
pop de
|
||||||
|
call FarCopyData2 ; load tile pattern data for sprite when walking
|
||||||
|
jr .skipSecondLoad\@
|
||||||
|
; When reloading the upper half of tile patterns after diplaying text, the LCD
|
||||||
|
; will be on, so CopyVideoData (which writes to VRAM only during V-blank) must
|
||||||
|
; be used instead of FarCopyData2.
|
||||||
|
.loadWhileLCDOn\@
|
||||||
|
pop af
|
||||||
|
pop hl
|
||||||
|
set 3,h ; add $800 to hl
|
||||||
|
ld b,a
|
||||||
|
swap c
|
||||||
|
call CopyVideoData ; load tile pattern data for sprite when walking
|
||||||
|
.skipSecondLoad\@
|
||||||
|
pop hl
|
||||||
|
pop bc
|
||||||
|
jr .nextSpriteSlot\@
|
||||||
|
.alreadyLoaded\@ ; if the current picture ID has already had its tile patterns loaded
|
||||||
|
inc de
|
||||||
|
ld a,[de] ; a = VRAM slot for the current picture ID (from $C2YE)
|
||||||
|
ld [hl],a ; store VRAM slot in current $c200 sprite slot (at $C2XE)
|
||||||
|
.nextSpriteSlot\@
|
||||||
|
ld a,l
|
||||||
|
add a,$10
|
||||||
|
ld l,a
|
||||||
|
dec c
|
||||||
|
jp nz,.loadTilePatternLoop\@
|
||||||
|
ld hl,$c20d
|
||||||
|
ld b,$10
|
||||||
|
; the pictures ID's stored at $C2XD are no longer needed, so zero them
|
||||||
|
.zeroStoredPictureIDLoop\@
|
||||||
|
xor a
|
||||||
|
ld [hl],a ; $C2XD
|
||||||
|
ld a,$10
|
||||||
|
add l
|
||||||
|
ld l,a
|
||||||
|
dec b
|
||||||
|
jr nz,.zeroStoredPictureIDLoop\@
|
||||||
|
ret
|
||||||
|
|
||||||
|
; reads data from SpriteSheetPointerTable
|
||||||
|
; INPUT:
|
||||||
|
; hl = address of sprite sheet entry
|
||||||
|
; OUTPUT:
|
||||||
|
; de = pointer to sprite sheet
|
||||||
|
; bc = length in bytes
|
||||||
|
; a = ROM bank
|
||||||
|
ReadSpriteSheetData: ; 7971
|
||||||
|
ld a,[hli]
|
||||||
|
ld e,a
|
||||||
|
ld a,[hli]
|
||||||
|
ld d,a
|
||||||
|
ld a,[hli]
|
||||||
|
ld c,a
|
||||||
|
xor a
|
||||||
|
ld b,a
|
||||||
|
ld a,[hli]
|
||||||
|
ret
|
||||||
|
|
||||||
|
; Loads sprite set for outside maps (cities and routes) and sets VRAM slots.
|
||||||
|
; sets carry if the map is a city or route, unsets carry if not
|
||||||
|
InitOutsideMapSprites: ; 797B
|
||||||
|
ld a,[W_CURMAP]
|
||||||
|
cp a,$25 ; is the map a city or a route (map ID less than $25)?
|
||||||
|
ret nc ; if not, return
|
||||||
|
ld hl,MapSpriteSets
|
||||||
|
add l
|
||||||
|
ld l,a
|
||||||
|
jr nc,.noCarry\@
|
||||||
|
inc h
|
||||||
|
.noCarry\@
|
||||||
|
ld a,[hl] ; a = spriteSetID
|
||||||
|
cp a,$f0 ; does the map have 2 sprite sets?
|
||||||
|
call nc,GetSplitMapSpriteSetID ; if so, choose the appropriate one
|
||||||
|
ld b,a ; b = spriteSetID
|
||||||
|
ld a,[$cfc4]
|
||||||
|
bit 0,a ; reloading upper half of tile patterns after displaying text?
|
||||||
|
jr nz,.loadSpriteSet\@ ; if so, forcibly reload the sprite set
|
||||||
|
ld a,[W_SPRITESETID]
|
||||||
|
cp b ; has the sprite set ID changed?
|
||||||
|
jr z,.skipLoadingSpriteSet\@ ; if not, don't load it again
|
||||||
|
.loadSpriteSet\@
|
||||||
|
ld a,b
|
||||||
|
ld [W_SPRITESETID],a
|
||||||
|
dec a
|
||||||
|
ld b,a
|
||||||
|
sla a
|
||||||
|
ld c,a
|
||||||
|
sla a
|
||||||
|
sla a
|
||||||
|
add c
|
||||||
|
add b ; a = (spriteSetID - 1) * 11
|
||||||
|
ld de,SpriteSets
|
||||||
|
; add a to de to get offset of sprite set
|
||||||
|
add e
|
||||||
|
ld e,a
|
||||||
|
jr nc,.noCarry2\@
|
||||||
|
inc d
|
||||||
|
.noCarry2\@
|
||||||
|
ld hl,$c20d
|
||||||
|
ld a,SPRITE_RED
|
||||||
|
ld [hl],a
|
||||||
|
ld bc,W_SPRITESET
|
||||||
|
; Load the sprite set into RAM.
|
||||||
|
; This loop also fills $C2XD (sprite picture ID) where X is from $0 to $A
|
||||||
|
; with picture ID's. This is done so that LoadMapSpriteTilePatterns will
|
||||||
|
; load tile patterns for all sprite pictures in the sprite set.
|
||||||
|
.loadSpriteSetLoop\@
|
||||||
|
ld a,$10
|
||||||
|
add l
|
||||||
|
ld l,a
|
||||||
|
ld a,[de] ; sprite picture ID from sprite set
|
||||||
|
ld [hl],a ; $C2XD (sprite picture ID)
|
||||||
|
ld [bc],a
|
||||||
|
inc de
|
||||||
|
inc bc
|
||||||
|
ld a,l
|
||||||
|
cp a,$bd ; reached 11th sprite slot?
|
||||||
|
jr nz,.loadSpriteSetLoop\@
|
||||||
|
ld b,4 ; 4 remaining sprite slots
|
||||||
|
.zeroRemainingSlotsLoop\@ ; loop to zero the picture ID's of the remaining sprite slots
|
||||||
|
ld a,$10
|
||||||
|
add l
|
||||||
|
ld l,a
|
||||||
|
xor a
|
||||||
|
ld [hl],a ; $C2XD (sprite picture ID)
|
||||||
|
dec b
|
||||||
|
jr nz,.zeroRemainingSlotsLoop\@
|
||||||
|
ld a,[W_NUMSPRITES]
|
||||||
|
push af ; save number of sprites
|
||||||
|
ld a,11 ; 11 sprites in sprite set
|
||||||
|
ld [W_NUMSPRITES],a
|
||||||
|
call LoadMapSpriteTilePatterns
|
||||||
|
pop af
|
||||||
|
ld [W_NUMSPRITES],a ; restore number of sprites
|
||||||
|
ld hl,$c21e
|
||||||
|
ld b,$0f
|
||||||
|
; The VRAM tile pattern slots that LoadMapSpriteTilePatterns set are in the
|
||||||
|
; order of the map's sprite set, not the order of the actual sprites loaded
|
||||||
|
; for the current map. So, they are not needed and are zeroed by this loop.
|
||||||
|
.zeroVRAMSlotsLoop\@
|
||||||
|
xor a
|
||||||
|
ld [hl],a ; $C2XE (VRAM slot)
|
||||||
|
ld a,$10
|
||||||
|
add l
|
||||||
|
ld l,a
|
||||||
|
dec b
|
||||||
|
jr nz,.zeroVRAMSlotsLoop\@
|
||||||
|
.skipLoadingSpriteSet\@
|
||||||
|
ld hl,$c110
|
||||||
|
; This loop stores the correct VRAM tile pattern slots according the sprite
|
||||||
|
; data from the map's header. Since the VRAM tile pattern slots are filled in
|
||||||
|
; the order of the sprite set, in order to find the VRAM tile pattern slot
|
||||||
|
; for a sprite slot, the picture ID for the sprite is looked up within the
|
||||||
|
; sprite set. The index of the picture ID within the sprite set plus one
|
||||||
|
; (since the Red sprite always has the first VRAM tile pattern slot) is the
|
||||||
|
; VRAM tile pattern slot.
|
||||||
|
.storeVRAMSlotsLoop\@
|
||||||
|
ld c,0
|
||||||
|
ld a,[hl] ; $C1X0 (picture ID) (zero if sprite slot is not used)
|
||||||
|
and a ; is the sprite slot used?
|
||||||
|
jr z,.skipGettingPictureIndex\@ ; if the sprite slot is not used
|
||||||
|
ld b,a ; b = picture ID
|
||||||
|
ld de,W_SPRITESET
|
||||||
|
; Loop to find the index of the sprite's picture ID within the sprite set.
|
||||||
|
.getPictureIndexLoop\@
|
||||||
|
inc c
|
||||||
|
ld a,[de]
|
||||||
|
inc de
|
||||||
|
cp b ; does the picture ID match?
|
||||||
|
jr nz,.getPictureIndexLoop\@
|
||||||
|
inc c
|
||||||
|
.skipGettingPictureIndex\@
|
||||||
|
push hl
|
||||||
|
inc h
|
||||||
|
ld a,$0e
|
||||||
|
add l
|
||||||
|
ld l,a
|
||||||
|
ld a,c ; a = VRAM slot (zero if sprite slot is not used)
|
||||||
|
ld [hl],a ; $C2XE (VRAM slot)
|
||||||
|
pop hl
|
||||||
|
ld a,$10
|
||||||
|
add l
|
||||||
|
ld l,a
|
||||||
|
and a
|
||||||
|
jr nz,.storeVRAMSlotsLoop\@
|
||||||
|
scf
|
||||||
|
ret
|
||||||
|
|
||||||
|
; Chooses the correct sprite set ID depending on the player's position within
|
||||||
|
; the map for maps with two sprite sets.
|
||||||
|
GetSplitMapSpriteSetID: ; 7A1A
|
||||||
|
cp a,$f8
|
||||||
|
jr z,.route20\@
|
||||||
|
ld hl,SplitMapSpriteSets
|
||||||
|
and a,$0f
|
||||||
|
dec a
|
||||||
|
sla a
|
||||||
|
sla a
|
||||||
|
add l
|
||||||
|
ld l,a
|
||||||
|
jr nc,.noCarry\@
|
||||||
|
inc h
|
||||||
|
.noCarry\@
|
||||||
|
ld a,[hli] ; determines whether the map is split East/West or North/South
|
||||||
|
cp a,$01
|
||||||
|
ld a,[hli] ; position of dividing line
|
||||||
|
ld b,a
|
||||||
|
jr z,.eastWestDivide\@
|
||||||
|
.northSouthDivide\@
|
||||||
|
ld a,[W_YCOORD]
|
||||||
|
jr .compareCoord\@
|
||||||
|
.eastWestDivide\@
|
||||||
|
ld a,[W_XCOORD]
|
||||||
|
.compareCoord\@
|
||||||
|
cp b
|
||||||
|
jr c,.loadSpriteSetID\@
|
||||||
|
; if in the East side or South side
|
||||||
|
inc hl
|
||||||
|
.loadSpriteSetID\@
|
||||||
|
ld a,[hl]
|
||||||
|
ret
|
||||||
|
; Uses sprite set $01 for West side and $0A for East side.
|
||||||
|
; Route 20 is a special case because the two map sections have a more complex
|
||||||
|
; shape instead of the map simply being split horizontally or vertically.
|
||||||
|
.route20\@
|
||||||
|
ld hl,W_XCOORD
|
||||||
|
ld a,[hl]
|
||||||
|
cp a,$2b
|
||||||
|
ld a,$01
|
||||||
|
ret c
|
||||||
|
ld a,[hl]
|
||||||
|
cp a,$3e
|
||||||
|
ld a,$0a
|
||||||
|
ret nc
|
||||||
|
ld a,[hl]
|
||||||
|
cp a,$37
|
||||||
|
ld b,$08
|
||||||
|
jr nc,.next\@
|
||||||
|
ld b,$0d
|
||||||
|
.next\@
|
||||||
|
ld a,[W_YCOORD]
|
||||||
|
cp b
|
||||||
|
ld a,$0a
|
||||||
|
ret c
|
||||||
|
ld a,$01
|
||||||
|
ret
|
||||||
|
|
||||||
|
MapSpriteSets: ; 7A64
|
||||||
|
db $01 ; PALLET_TOWN
|
||||||
|
db $01 ; VIRIDIAN_CITY
|
||||||
|
db $02 ; PEWTER_CITY
|
||||||
|
db $02 ; CERULEAN_CITY
|
||||||
|
db $03 ; LAVENDER_TOWN
|
||||||
|
db $04 ; VERMILION_CITY
|
||||||
|
db $05 ; CELADON_CITY
|
||||||
|
db $0a ; FUCHSIA_CITY
|
||||||
|
db $01 ; CINNABAR_ISLAND
|
||||||
|
db $06 ; INDIGO_PLATEAU
|
||||||
|
db $07 ; SAFFRON_CITY
|
||||||
|
db $01 ; unused map ID
|
||||||
|
db $01 ; ROUTE_1
|
||||||
|
db $f1 ; ROUTE_2
|
||||||
|
db $02 ; ROUTE_3
|
||||||
|
db $02 ; ROUTE_4
|
||||||
|
db $f9 ; ROUTE_5
|
||||||
|
db $fa ; ROUTE_6
|
||||||
|
db $fb ; ROUTE_7
|
||||||
|
db $fc ; ROUTE_8
|
||||||
|
db $02 ; ROUTE_9
|
||||||
|
db $f2 ; ROUTE_10
|
||||||
|
db $f3 ; ROUTE_11
|
||||||
|
db $f4 ; ROUTE_12
|
||||||
|
db $08 ; ROUTE_13
|
||||||
|
db $08 ; ROUTE_14
|
||||||
|
db $f5 ; ROUTE_15
|
||||||
|
db $f6 ; ROUTE_16
|
||||||
|
db $09 ; ROUTE_17
|
||||||
|
db $f7 ; ROUTE_18
|
||||||
|
db $0a ; ROUTE_19
|
||||||
|
db $f8 ; ROUTE_20
|
||||||
|
db $01 ; ROUTE_21
|
||||||
|
db $01 ; ROUTE_22
|
||||||
|
db $06 ; ROUTE_23
|
||||||
|
db $02 ; ROUTE_24
|
||||||
|
db $02 ; ROUTE_25
|
||||||
|
|
||||||
|
; Format:
|
||||||
|
; 00: determines whether the map is split East/West or North/South
|
||||||
|
; $01 = East/West divide
|
||||||
|
; $02 = North/South divide
|
||||||
|
; 01: coordinate of dividing line
|
||||||
|
; 02: sprite set ID if in the West or North side
|
||||||
|
; 03: sprite set ID if in the East or South side
|
||||||
|
SplitMapSpriteSets: ; 7A89
|
||||||
|
db $02,$25,$02,$01 ; $f1
|
||||||
|
db $02,$32,$02,$03 ; $f2
|
||||||
|
db $01,$39,$04,$08 ; $f3
|
||||||
|
db $02,$15,$03,$08 ; $f4
|
||||||
|
db $01,$08,$0A,$08 ; $f5
|
||||||
|
db $01,$18,$09,$05 ; $f6
|
||||||
|
db $01,$22,$09,$0A ; $f7
|
||||||
|
db $01,$35,$01,$0A ; $f8
|
||||||
|
db $02,$21,$02,$07 ; $f9
|
||||||
|
db $02,$02,$07,$04 ; $fa
|
||||||
|
db $01,$11,$05,$07 ; $fb
|
||||||
|
db $01,$03,$07,$03 ; $fc
|
||||||
|
|
||||||
|
SpriteSets: ; 7AB9
|
||||||
|
; sprite set $01
|
||||||
|
db SPRITE_BLUE
|
||||||
|
db SPRITE_BUG_CATCHER
|
||||||
|
db SPRITE_GIRL
|
||||||
|
db SPRITE_FISHER2
|
||||||
|
db SPRITE_BLACK_HAIR_BOY_1
|
||||||
|
db SPRITE_GAMBLER
|
||||||
|
db SPRITE_SEEL
|
||||||
|
db SPRITE_OAK
|
||||||
|
db SPRITE_SWIMMER
|
||||||
|
db SPRITE_BALL
|
||||||
|
db SPRITE_LYING_OLD_MAN
|
||||||
|
|
||||||
|
; sprite set $02
|
||||||
|
db SPRITE_BUG_CATCHER
|
||||||
|
db SPRITE_ROCKET
|
||||||
|
db SPRITE_BLACK_HAIR_BOY_2
|
||||||
|
db SPRITE_HIKER
|
||||||
|
db SPRITE_SLOWBRO
|
||||||
|
db SPRITE_BLUE
|
||||||
|
db SPRITE_GUARD
|
||||||
|
db SPRITE_LASS
|
||||||
|
db SPRITE_BLACK_HAIR_BOY_1
|
||||||
|
db SPRITE_BALL
|
||||||
|
db SPRITE_LYING_OLD_MAN_UNUSED_2
|
||||||
|
|
||||||
|
; sprite set $03
|
||||||
|
db SPRITE_LITTLE_GIRL
|
||||||
|
db SPRITE_GIRL
|
||||||
|
db SPRITE_BLACK_HAIR_BOY_2
|
||||||
|
db SPRITE_HIKER
|
||||||
|
db SPRITE_GAMBLER
|
||||||
|
db SPRITE_SLOWBRO
|
||||||
|
db SPRITE_LASS
|
||||||
|
db SPRITE_BLACK_HAIR_BOY_1
|
||||||
|
db SPRITE_GUARD
|
||||||
|
db SPRITE_BALL
|
||||||
|
db SPRITE_LYING_OLD_MAN_UNUSED_2
|
||||||
|
|
||||||
|
; sprite set $04
|
||||||
|
db SPRITE_FOULARD_WOMAN
|
||||||
|
db SPRITE_BLACK_HAIR_BOY_2
|
||||||
|
db SPRITE_BUG_CATCHER
|
||||||
|
db SPRITE_GAMBLER
|
||||||
|
db SPRITE_SLOWBRO
|
||||||
|
db SPRITE_GUARD
|
||||||
|
db SPRITE_SAILOR
|
||||||
|
db SPRITE_LASS
|
||||||
|
db SPRITE_BLACK_HAIR_BOY_1
|
||||||
|
db SPRITE_BALL
|
||||||
|
db SPRITE_LYING_OLD_MAN_UNUSED_2
|
||||||
|
|
||||||
|
; sprite set $05
|
||||||
|
db SPRITE_LITTLE_GIRL
|
||||||
|
db SPRITE_YOUNG_BOY
|
||||||
|
db SPRITE_GIRL
|
||||||
|
db SPRITE_FISHER2
|
||||||
|
db SPRITE_FAT_BALD_GUY
|
||||||
|
db SPRITE_OLD_PERSON
|
||||||
|
db SPRITE_SLOWBRO
|
||||||
|
db SPRITE_GUARD
|
||||||
|
db SPRITE_ROCKET
|
||||||
|
db SPRITE_BALL
|
||||||
|
db SPRITE_SNORLAX
|
||||||
|
|
||||||
|
; sprite set $06
|
||||||
|
db SPRITE_BUG_CATCHER
|
||||||
|
db SPRITE_GYM_HELPER
|
||||||
|
db SPRITE_SLOWBRO
|
||||||
|
db SPRITE_BLUE
|
||||||
|
db SPRITE_LASS
|
||||||
|
db SPRITE_BLACK_HAIR_BOY_1
|
||||||
|
db SPRITE_SWIMMER
|
||||||
|
db SPRITE_GUARD
|
||||||
|
db SPRITE_GAMBLER
|
||||||
|
db SPRITE_BALL
|
||||||
|
db SPRITE_LYING_OLD_MAN_UNUSED_2
|
||||||
|
|
||||||
|
; sprite set $07
|
||||||
|
db SPRITE_ROCKET
|
||||||
|
db SPRITE_OAK_AIDE
|
||||||
|
db SPRITE_LAPRAS_GIVER
|
||||||
|
db SPRITE_ERIKA
|
||||||
|
db SPRITE_GENTLEMAN
|
||||||
|
db SPRITE_BIRD
|
||||||
|
db SPRITE_ROCKER
|
||||||
|
db SPRITE_BLACK_HAIR_BOY_1
|
||||||
|
db SPRITE_SLOWBRO
|
||||||
|
db SPRITE_BALL
|
||||||
|
db SPRITE_LYING_OLD_MAN_UNUSED_2
|
||||||
|
|
||||||
|
; sprite set $08
|
||||||
|
db SPRITE_BIKER
|
||||||
|
db SPRITE_BLACK_HAIR_BOY_2
|
||||||
|
db SPRITE_FAT_BALD_GUY
|
||||||
|
db SPRITE_LASS
|
||||||
|
db SPRITE_BLACK_HAIR_BOY_1
|
||||||
|
db SPRITE_FOULARD_WOMAN
|
||||||
|
db SPRITE_FISHER2
|
||||||
|
db SPRITE_ROCKER
|
||||||
|
db SPRITE_SLOWBRO
|
||||||
|
db SPRITE_BALL
|
||||||
|
db SPRITE_SNORLAX
|
||||||
|
|
||||||
|
; sprite set $09
|
||||||
|
db SPRITE_BIKER
|
||||||
|
db SPRITE_BLACK_HAIR_BOY_1
|
||||||
|
db SPRITE_LAPRAS_GIVER
|
||||||
|
db SPRITE_FISHER2
|
||||||
|
db SPRITE_ROCKER
|
||||||
|
db SPRITE_HIKER
|
||||||
|
db SPRITE_GAMBLER
|
||||||
|
db SPRITE_FAT_BALD_GUY
|
||||||
|
db SPRITE_BLACK_HAIR_BOY_2
|
||||||
|
db SPRITE_BALL
|
||||||
|
db SPRITE_SNORLAX
|
||||||
|
|
||||||
|
; sprite set $0a
|
||||||
|
db SPRITE_BIRD
|
||||||
|
db SPRITE_BLACK_HAIR_BOY_1
|
||||||
|
db SPRITE_CLEFAIRY
|
||||||
|
db SPRITE_FISHER2
|
||||||
|
db SPRITE_GAMBLER
|
||||||
|
db SPRITE_SLOWBRO
|
||||||
|
db SPRITE_SEEL
|
||||||
|
db SPRITE_SWIMMER
|
||||||
|
db SPRITE_BUG_CATCHER
|
||||||
|
db SPRITE_BALL
|
||||||
|
db SPRITE_OMANYTE
|
||||||
|
|
||||||
SpriteSheetPointerTable: ; 0x17b27
|
SpriteSheetPointerTable: ; 0x17b27
|
||||||
; SPRITE_RED
|
; SPRITE_RED
|
||||||
|
@ -37842,8 +38484,8 @@ EnemySendOut: ; 490E
|
||||||
ld bc,$040B
|
ld bc,$040B
|
||||||
call ClearScreenArea
|
call ClearScreenArea
|
||||||
ld b,1
|
ld b,1
|
||||||
call $3DEF
|
call GoPAL_SET
|
||||||
call $3DDC
|
call GBPalNormal
|
||||||
ld hl,TrainerSentOutText
|
ld hl,TrainerSentOutText
|
||||||
call PrintText
|
call PrintText
|
||||||
ld a,[$CFD8]
|
ld a,[$CFD8]
|
||||||
|
@ -39731,9 +40373,9 @@ DisplayPokedexMenu_: ; 4000
|
||||||
.setUpGraphics\@
|
.setUpGraphics\@
|
||||||
ld b,$08
|
ld b,$08
|
||||||
call GoPAL_SET
|
call GoPAL_SET
|
||||||
ld hl,$7840
|
ld hl,LoadPokedexTilePatterns
|
||||||
ld b,$05
|
ld b,BANK(LoadPokedexTilePatterns)
|
||||||
call Bankswitch ; load pokedex tile data
|
call Bankswitch
|
||||||
.doPokemonListMenu\@
|
.doPokemonListMenu\@
|
||||||
ld hl,W_TOPMENUITEMY
|
ld hl,W_TOPMENUITEMY
|
||||||
ld a,3
|
ld a,3
|
||||||
|
|
Loading…
Reference in a new issue