diff options
-rw-r--r-- | data/facing.asm | 188 | ||||
-rwxr-xr-x | data/item_prices.asm | 2 | ||||
-rw-r--r-- | engine/bank3c/main.asm | 4 | ||||
-rw-r--r-- | engine/battle/common_text.asm | 2 | ||||
-rwxr-xr-x | engine/hall_of_fame.asm | 2 | ||||
-rwxr-xr-x | engine/items/items.asm | 2 | ||||
-rw-r--r-- | engine/menu/bills_pc.asm | 6 | ||||
-rw-r--r-- | engine/overworld/oam.asm | 161 | ||||
-rwxr-xr-x | engine/titlescreen.asm | 461 | ||||
-rwxr-xr-x | engine/town_map.asm | 2 | ||||
-rw-r--r-- | home.asm | 32 | ||||
-rwxr-xr-x | main.asm | 2 | ||||
-rwxr-xr-x | text/item_names.asm | 2 | ||||
-rwxr-xr-x | yellow/main.asm | 547 |
14 files changed, 418 insertions, 995 deletions
diff --git a/data/facing.asm b/data/facing.asm index 138a0162..6906002e 100644 --- a/data/facing.asm +++ b/data/facing.asm @@ -1,133 +1,57 @@ SpriteFacingAndAnimationTable: ; 4000 (1:4000) - dw SpriteFacingDownAndStanding ; facing down, walk animation frame 0 - dw SpriteFacingDownAndWalking ; facing down, walk animation frame 1 - dw SpriteFacingDownAndStanding ; facing down, walk animation frame 2 - dw SpriteFacingDownAndWalking2 ; facing down, walk animation frame 3 - - dw SpriteFacingUpAndStanding ; facing up, walk animation frame 0 - dw SpriteFacingUpAndWalking ; facing up, walk animation frame 1 - dw SpriteFacingUpAndStanding ; facing up, walk animation frame 2 - dw SpriteFacingUpAndWalking2 ; facing up, walk animation frame 3 - - dw SpriteFacingLeftAndStanding ; facing left, walk animation frame 0 - dw SpriteFacingLeftAndWalking ; facing left, walk animation frame 1 - dw SpriteFacingLeftAndStanding ; facing left, walk animation frame 2 - dw SpriteFacingLeftAndWalking ; facing left, walk animation frame 3 - - dw SpriteFacingRightAndStanding ; facing right, walk animation frame 0 - dw SpriteFacingRightAndWalking ; facing right, walk animation frame 1 - dw SpriteFacingRightAndStanding ; facing right, walk animation frame 2 - dw SpriteFacingRightAndWalking ; facing right, walk animation frame 3 - - dw SpriteFacingDownAndStanding ; --- - dw SpriteFacingDownAndStanding ; This table is used for sprites $a and $b. - dw SpriteFacingDownAndStanding ; All orientation and animation parameters - dw SpriteFacingDownAndStanding ; lead to the same result. Used for immobile - dw SpriteFacingDownAndStanding ; sprites like items on the ground - dw SpriteFacingDownAndStanding ; --- - dw SpriteFacingDownAndStanding - dw SpriteFacingDownAndStanding - dw SpriteFacingDownAndStanding - dw SpriteFacingDownAndStanding - dw SpriteFacingDownAndStanding - dw SpriteFacingDownAndStanding - dw SpriteFacingDownAndStanding - dw SpriteFacingDownAndStanding - dw SpriteFacingDownAndStanding - dw SpriteFacingDownAndStanding -; special case - dw SpriteSpecialCase ; pikachu maybe? - -SpriteFacingDownAndStanding: ; 4042 (1:4042) - db $04 -; Sprite OAM Parameters - db $00,$00,$00,$00 ; top left - db $00,$08,$01,$00 ; top right - db $08,$00,$02,OAMFLAG_CANBEMASKED ; bottom left - db $08,$08,$03,OAMFLAG_CANBEMASKED | OAMFLAG_ENDOFDATA ; bottom right - -SpriteFacingDownAndWalking: ; 4053 (1:4053) - db $04 -; Sprite OAM Parameters - db $00,$00,$80,$00 ; top left - db $00,$08,$81,$00 ; top right - db $08,$00,$82,OAMFLAG_CANBEMASKED ; bottom left - db $08,$08,$83,OAMFLAG_CANBEMASKED | OAMFLAG_ENDOFDATA ; bottom right - -SpriteFacingDownAndWalking2: ; 4064 (1:4064) - db $04 -; Sprite OAM Parameters - db $00,$08,$80,OAMFLAG_VFLIPPED ; top left - db $00,$00,$81,OAMFLAG_VFLIPPED ; top right - db $08,$08,$82,OAMFLAG_VFLIPPED | OAMFLAG_CANBEMASKED ; bottom left - db $08,$00,$83,OAMFLAG_VFLIPPED | OAMFLAG_CANBEMASKED | OAMFLAG_ENDOFDATA ; bottom right - -SpriteFacingUpAndStanding: ; 4075 (1:4075) - db $04 -; Sprite OAM Parameters - db $00,$00,$04,$00 ; top left - db $00,$08,$05,$00 ; top right - db $08,$00,$06,OAMFLAG_CANBEMASKED ; bottom left - db $08,$08,$07,OAMFLAG_CANBEMASKED | OAMFLAG_ENDOFDATA ; bottom right - -SpriteFacingUpAndWalking: ; 4086 (1:4086) - db $04 -; Sprite OAM Parameters - db $00,$00,$84,$00 ; top left - db $00,$08,$85,$00 ; top right - db $08,$00,$86,OAMFLAG_CANBEMASKED ; bottom left - db $08,$08,$87,OAMFLAG_CANBEMASKED | OAMFLAG_ENDOFDATA ; bottom right - -SpriteFacingUpAndWalking2: ; 4097 (1:4097) - db $04 -; Sprite OAM Parameters - db $00,$08,$84,OAMFLAG_VFLIPPED ; top left - db $00,$00,$85,OAMFLAG_VFLIPPED ; top right - db $08,$08,$86,OAMFLAG_VFLIPPED | OAMFLAG_CANBEMASKED ; bottom left - db $08,$00,$87,OAMFLAG_VFLIPPED | OAMFLAG_CANBEMASKED | OAMFLAG_ENDOFDATA ; bottom right - -SpriteFacingLeftAndStanding: ; 40a8 (1:40a8) - db $04 -; Sprite OAM Parameters - db $00,$00,$08,$00 ; top left - db $00,$08,$09,$00 ; top right - db $08,$00,$0a,OAMFLAG_CANBEMASKED ; bottom left - db $08,$08,$0b,OAMFLAG_CANBEMASKED | OAMFLAG_ENDOFDATA ; bottom right - -SpriteFacingLeftAndWalking: ; 40b9 (1:40b9) - db $04 -; Sprite OAM Parameters - db $00,$00,$88,$00 ; top left - db $00,$08,$89,$00 ; top right - db $08,$00,$8a,OAMFLAG_CANBEMASKED ; bottom left - db $08,$08,$8b,OAMFLAG_CANBEMASKED | OAMFLAG_ENDOFDATA ; bottom right - -SpriteFacingRightAndStanding: ; 40ca (1:40ca) - db $04 -; Sprite OAM Parameters - db $00,$08,$08,OAMFLAG_VFLIPPED ; top left - db $00,$00,$09,OAMFLAG_VFLIPPED ; top right - db $08,$08,$0a,OAMFLAG_VFLIPPED | OAMFLAG_CANBEMASKED ; bottom left - db $08,$00,$0b,OAMFLAG_VFLIPPED | OAMFLAG_CANBEMASKED | OAMFLAG_ENDOFDATA ; bottom right - -SpriteFacingRightAndWalking: ; 40db (1:40db) - db $04 -; Sprite OAM Parameters - db $00,$08,$88,OAMFLAG_VFLIPPED ; top left - db $00,$00,$89,OAMFLAG_VFLIPPED ; top right - db $08,$08,$8a,OAMFLAG_VFLIPPED | OAMFLAG_CANBEMASKED ; bottom left - db $08,$00,$8b,OAMFLAG_VFLIPPED | OAMFLAG_CANBEMASKED | OAMFLAG_ENDOFDATA ; bottom right - -SpriteSpecialCase ; 40ec (1:40ec) - db $09 -; Sprite OAM Parameters - db -$4,-$4,$00,$00 - db -$4,$04,$01,$00 - db -$4,$0c,$00,OAMFLAG_VFLIPPED - db $04,-$4,$01,$00 - db $04,$04,$02,$00 - db $04,$0c,$01,$00 - db $0c,-$4,$00,OAM_VFLIP | OAMFLAG_CANBEMASKED - db $0c,$04,$01,OAMFLAG_CANBEMASKED - db $0c,$0c,$00,OAM_VFLIP | OAM_HFLIP | OAMFLAG_CANBEMASKED | OAMFLAG_ENDOFDATA -
\ No newline at end of file + dw SpriteFacingDownAndStanding, SpriteOAMParameters ; facing down, walk animation frame 0 + dw SpriteFacingDownAndWalking, SpriteOAMParameters ; facing down, walk animation frame 1 + dw SpriteFacingDownAndStanding, SpriteOAMParameters ; facing down, walk animation frame 2 + dw SpriteFacingDownAndWalking, SpriteOAMParametersFlipped ; facing down, walk animation frame 3 + dw SpriteFacingUpAndStanding, SpriteOAMParameters ; facing up, walk animation frame 0 + dw SpriteFacingUpAndWalking, SpriteOAMParameters ; facing up, walk animation frame 1 + dw SpriteFacingUpAndStanding, SpriteOAMParameters ; facing up, walk animation frame 2 + dw SpriteFacingUpAndWalking, SpriteOAMParametersFlipped ; facing up, walk animation frame 3 + dw SpriteFacingLeftAndStanding, SpriteOAMParameters ; facing left, walk animation frame 0 + dw SpriteFacingLeftAndWalking, SpriteOAMParameters ; facing left, walk animation frame 1 + dw SpriteFacingLeftAndStanding, SpriteOAMParameters ; facing left, walk animation frame 2 + dw SpriteFacingLeftAndWalking, SpriteOAMParameters ; facing left, walk animation frame 3 + dw SpriteFacingLeftAndStanding, SpriteOAMParametersFlipped ; facing right, walk animation frame 0 + dw SpriteFacingLeftAndWalking, SpriteOAMParametersFlipped ; facing right, walk animation frame 1 + dw SpriteFacingLeftAndStanding, SpriteOAMParametersFlipped ; facing right, walk animation frame 2 + dw SpriteFacingLeftAndWalking, SpriteOAMParametersFlipped ; facing right, walk animation frame 3 + dw SpriteFacingDownAndStanding, SpriteOAMParameters ; --- + dw SpriteFacingDownAndStanding, SpriteOAMParameters ; This table is used for sprites $a and $b. + dw SpriteFacingDownAndStanding, SpriteOAMParameters ; All orientation and animation parameters + dw SpriteFacingDownAndStanding, SpriteOAMParameters ; lead to the same result. Used for immobile + dw SpriteFacingDownAndStanding, SpriteOAMParameters ; sprites like items on the ground + dw SpriteFacingDownAndStanding, SpriteOAMParameters ; --- + dw SpriteFacingDownAndStanding, SpriteOAMParameters + dw SpriteFacingDownAndStanding, SpriteOAMParameters + dw SpriteFacingDownAndStanding, SpriteOAMParameters + dw SpriteFacingDownAndStanding, SpriteOAMParameters + dw SpriteFacingDownAndStanding, SpriteOAMParameters + dw SpriteFacingDownAndStanding, SpriteOAMParameters + dw SpriteFacingDownAndStanding, SpriteOAMParameters + dw SpriteFacingDownAndStanding, SpriteOAMParameters + dw SpriteFacingDownAndStanding, SpriteOAMParameters + dw SpriteFacingDownAndStanding, SpriteOAMParameters + +SpriteFacingDownAndStanding: ; 4080 (1:4080) + db $00,$01,$02,$03 +SpriteFacingDownAndWalking: ; 4084 (1:4084) + db $80,$81,$82,$83 +SpriteFacingUpAndStanding: ; 4088 (1:4088) + db $04,$05,$06,$07 +SpriteFacingUpAndWalking: ; 408c (1:408c) + db $84,$85,$86,$87 +SpriteFacingLeftAndStanding: ; 4090 (1:4090) + db $08,$09,$0a,$0b +SpriteFacingLeftAndWalking: ; 4094 (1:4094) + db $88,$89,$8a,$8b + +SpriteOAMParameters: ; 4098 (1:4098) + db $00,$00, $00 ; top left + db $00,$08, $00 ; top right + db $08,$00, OAMFLAG_CANBEMASKED ; bottom left + db $08,$08, OAMFLAG_CANBEMASKED | OAMFLAG_ENDOFDATA ; bottom right +SpriteOAMParametersFlipped: ; 40a4 (1:40a4) + db $00,$08, OAMFLAG_VFLIPPED + db $00,$00, OAMFLAG_VFLIPPED + db $08,$08, OAMFLAG_VFLIPPED | OAMFLAG_CANBEMASKED + db $08,$00, OAMFLAG_VFLIPPED | OAMFLAG_CANBEMASKED | OAMFLAG_ENDOFDATA diff --git a/data/item_prices.asm b/data/item_prices.asm index ed60e56b..aa5cb21e 100755 --- a/data/item_prices.asm +++ b/data/item_prices.asm @@ -1,4 +1,4 @@ -ItemPrices: ; 4494 (1:4494) +ItemPrices: ; 4608 (1:4608) money 0 ; MASTER_BALL money 1200 ; ULTRA_BALL money 600 ; GREAT_BALL diff --git a/engine/bank3c/main.asm b/engine/bank3c/main.asm index 6253f971..c967e93c 100644 --- a/engine/bank3c/main.asm +++ b/engine/bank3c/main.asm @@ -1,4 +1,4 @@ -PlayPikachuSoundClip:: ; f0000 (3c:4000) +Func_f0000:: ; f0000 (3c:4000) ld a, e ld e, a ld d, $0 @@ -53,7 +53,7 @@ PlayPikachuSoundClip:: ; f0000 (3c:4000) ld [rNR34], a pop hl pop bc - call PlayPikachuPCM + call Func_150 xor a ld [wc0f3], a ld [wc0f4], a diff --git a/engine/battle/common_text.asm b/engine/battle/common_text.asm index 449fc1ab..fcc00376 100644 --- a/engine/battle/common_text.asm +++ b/engine/battle/common_text.asm @@ -16,7 +16,7 @@ PrintBeginningBattleText: ; f4000 (3d:4000) jr c,.asm_f4026 ld e,$a .asm_f4026 - callab PlayPikachuSoundClip + callab Func_f0000 jr .continue .notnewbattletype ld a, [wEnemyMonSpecies2] diff --git a/engine/hall_of_fame.asm b/engine/hall_of_fame.asm index 3db51e05..cf7a3caa 100755 --- a/engine/hall_of_fame.asm +++ b/engine/hall_of_fame.asm @@ -159,7 +159,7 @@ HoFDisplayAndRecordMonInfo: ; 7030e (1c:430e) callab IsThisPartymonOurPikachu ; 3f:4e18 jr nc, .asm_70336 ld e, $22 - callab PlayPikachuSoundClip + callab Func_f0000 jr .asm_7033c .asm_70336 ld a,[wHoFMonSpecies] diff --git a/engine/items/items.asm b/engine/items/items.asm index 2b3c1840..3afae425 100755 --- a/engine/items/items.asm +++ b/engine/items/items.asm @@ -676,7 +676,7 @@ ItemUseEvoStone: ; d7d0 (3:57d0) callab IsThisPartymonOurPikachu jr nc, .notPlayerPikachu ld e, $1b - callab PlayPikachuSoundClip + callab Func_f0000 ld a, [wWhichPokemon] ld hl, wPartyMonNicks call GetPartyMonName diff --git a/engine/menu/bills_pc.asm b/engine/menu/bills_pc.asm index 3ef1f95a..4a274871 100644 --- a/engine/menu/bills_pc.asm +++ b/engine/menu/bills_pc.asm @@ -241,7 +241,7 @@ BillsPCDeposit: ; 2156d (8:556d) callab IsThisPartymonOurPikachu jr nc, .asm_215c9 ld e, $1b - callab PlayPikachuSoundClip + callab Func_f0000 jr .asm_215cf .asm_215c9 ld a, [wcf91] @@ -304,7 +304,7 @@ BillsPCWithdraw: ; 21613 (8:5613) callab Func_fce0d jr nc, .asm_21660 ld e, $22 - callab PlayPikachuSoundClip + callab Func_f0000 jr .asm_21666 .asm_21660 ld a, [wcf91] @@ -355,7 +355,7 @@ BillsPCRelease: ; 21690 (8:5690) ld hl, wBoxMonNicks call GetPartyMonName ld e, $27 - callab PlayPikachuSoundClip + callab Func_f0000 ld hl, PikachuUnhappyText call PrintText jp BillsPCMenu diff --git a/engine/overworld/oam.asm b/engine/overworld/oam.asm index e81375a3..ff85eb3e 100644 --- a/engine/overworld/oam.asm +++ b/engine/overworld/oam.asm @@ -1,14 +1,12 @@ -PrepareOAMData: ; 499b (1:499b) +PrepareOAMData: ; Determine OAM data for currently visible ; sprites and write it to wOAMBuffer. -; Yellow code has been changed to use registers more efficiently -; as well as tweaking the code to show gbc palettes ld a, [wUpdateSpritesEnabled] dec a jr z, .updateEnabled - cp $ff + cp 0 - 1 ret nz ld [wUpdateSpritesEnabled], a jp HideSprites @@ -19,10 +17,10 @@ PrepareOAMData: ; 499b (1:499b) .spriteLoop ld [hSpriteOffset2], a - - ld e, a + ld d, wSpriteStateData1 / $100 - + ld a, [hSpriteOffset2] + ld e, a ld a, [de] ; c1x0 and a jp z, .nextSprite @@ -42,22 +40,16 @@ PrepareOAMData: ; 499b (1:499b) jr c, .usefacing ; unchanging - ld a, $0 + and $f + add $10 ; skip to the second half of the table which doesn't account for facing direction jr .next .usefacing and $f .next -; read the entry from the table - ld c, a - ld b, 0 - ld hl, SpriteFacingAndAnimationTable - add hl, bc - add hl, bc - ld a, [hli] - ld h, [hl] ld l, a + ; get sprite priority push de inc d @@ -69,46 +61,65 @@ PrepareOAMData: ; 499b (1:499b) ld [hSpritePriority], a ; temp store sprite priority pop de +; read the entry from the table + ld h, 0 + ld bc, SpriteFacingAndAnimationTable + add hl, hl + add hl, hl + add hl, bc + ld a, [hli] + ld c, a + ld a, [hli] + ld b, a + ld a, [hli] + ld h, [hl] + ld l, a call GetSpriteScreenXY ld a, [hOAMBufferOffset] - add [hl] - cp $a0 - jr z, .hidden - jr nc, .asm_4a41 -.hidden - call Func_4a7b - ld [wd5cd], a - ld a, [hOAMBufferOffset] - ld e, a ld d, wOAMBuffer / $100 .tileLoop - ld a, [hli] - ld c, a -.loop ld a, [hSpriteScreenY] ; temp for sprite Y position add $10 ; Y=16 is top of screen (Y=0 is invisible) add [hl] ; add Y offset from table ld [de], a ; write new sprite OAM Y position inc hl - inc e ld a, [hSpriteScreenX] ; temp for sprite X position add $8 ; X=8 is left of screen (X=0 is invisible) add [hl] ; add X offset from table - ld [de], a - inc hl inc e - ld a, [wd5cd] - add [hl] - cp $80 - jr c, .asm_4a1c + ld [de], a ; write new sprite OAM X position + inc e + ld a, [bc] ; read pattern number offset (accommodates orientation (offset 0,4 or 8) and animation (offset 0 or $80)) + inc bc + push bc ld b, a - ld a, [$fffc] - add b -.asm_4a1c + + ld a, [wd5cd] ; temp copy of c1x2 + swap a ; high nybble determines sprite used (0 is always player sprite, next are some npcs) + and $f + + ; Sprites $a and $b have one face (and therefore 4 tiles instead of 12). + ; As a result, sprite $b's tile offset is less than normal. + cp $b + jr nz, .notFourTileSprite + ld a, $a * 12 + 4 + jr .next2 + +.notFourTileSprite + ; a *= 12 + sla a + sla a + ld c, a + sla a + add c + +.next2 + add b ; add the tile offset from the table (based on frame and facing direction) + pop bc ld [de], a ; tile id inc hl inc e @@ -118,19 +129,15 @@ PrepareOAMData: ; 499b (1:499b) ld a, [hSpritePriority] or [hl] .skipPriority - and $f0 - bit 4, a ; OBP0 or OBP1 - jr z, .spriteusesOBP0 - or %100 ; palettes 4-7 are OBP1 -.spriteusesOBP0 - ld [de], a inc hl + ld [de], a inc e - dec c - jr nz, .loop + bit 0, a ; OAMFLAG_ENDOFDATA + jr z, .tileLoop ld a, e ld [hOAMBufferOffset], a + .nextSprite ld a, [hSpriteOffset2] add $10 @@ -138,33 +145,28 @@ PrepareOAMData: ; 499b (1:499b) jp nz, .spriteLoop ; Clear unused OAM. -.asm_4a41 + ld a, [hOAMBufferOffset] + ld l, a + ld h, wOAMBuffer / $100 + ld de, $4 + ld b, $a0 ld a, [wd736] bit 6, a ; jumping down ledge or fishing animation? - ld c, $a0 + ld a, $a0 jr z, .clear ; Don't clear the last 4 entries because they are used for the shadow in the ; jumping down ledge animation and the rod in the fishing animation. - ld c, $90 + ld a, $90 .clear - ld a, [hOAMBufferOffset] - cp c - ret nc - ld l, a - ld h, wOAMBuffer / $100 - ld a, c - ld de, $4 ; entry size - ld b, $a0 -.clearLoop + cp l + ret z ld [hl], b add hl, de - cp l - jr nz, .clearLoop - ret + jr .clear -GetSpriteScreenXY: ; 4a5f (1:4a5f) +GetSpriteScreenXY: ; 4bd1 (1:4bd1) inc e inc e ld a, [de] ; c1x4 @@ -186,32 +188,6 @@ GetSpriteScreenXY: ; 4a5f (1:4a5f) ld [de], a ; c1xb (x) ret -Func_4a7b: ; 4a7b (1:4a7b) - push bc - ld a, [wd5cd] ; temp copy of c1x2 - swap a ; high nybble determines sprite used (0 is always player sprite, next are some npcs) - and $f - - ; Sprites $a and $b have one face (and therefore 4 tiles instead of 12). - ; As a result, sprite $b's tile offset is less than normal. - cp $b - jr nz, .notFourTileSprite - ld a, $a * 12 + 4 ; $7c - jr .done - -.notFourTileSprite - ; a *= 12 - add a - add a - ld c, a - add a - add c -.done - pop bc - ret - -INCLUDE "engine/oam_dma.asm" - _IsTilePassable:: ; 4aaa (1:4aaa) ld hl,W_TILESETCOLLISIONPTR ; pointer to list of passable tiles ld a,[hli] @@ -222,11 +198,8 @@ _IsTilePassable:: ; 4aaa (1:4aaa) cp a,$ff jr z,.tileNotPassable cp c - jr nz,.loop - xor a - ret + ret z + jr .loop .tileNotPassable scf - ret - -INCLUDE "data/collision.asm" ; probably
\ No newline at end of file + ret
\ No newline at end of file diff --git a/engine/titlescreen.asm b/engine/titlescreen.asm index 244d9ff7..8d605c49 100755 --- a/engine/titlescreen.asm +++ b/engine/titlescreen.asm @@ -1,4 +1,9 @@ -SetDefaultNamesBeforeTitlescreen: ; 414b (1:414b) +; copy text of fixed length NAME_LENGTH (like player name, rival name, mon names, ...) +CopyFixedLengthText: ; 42b1 (1:42b1) + ld bc, NAME_LENGTH + jp CopyData + +SetDefaultNamesBeforeTitlescreen: ; 42b7 (1:42b7) ld hl, NintenText ld de, wPlayerName call CopyFixedLengthText @@ -16,7 +21,7 @@ SetDefaultNamesBeforeTitlescreen: ; 414b (1:414b) ld [wAudioROMBank], a ld [wAudioSavedROMBank], a -DisplayTitleScreen: ; 4171 (1:4171) +DisplayTitleScreen: ; 42dd (1:42dd) call GBPalWhiteOut ld a, $1 ld [H_AUTOBGTRANSFERENABLED], a @@ -30,35 +35,93 @@ DisplayTitleScreen: ; 4171 (1:4171) call ClearScreen call DisableLCD call LoadFontTilePatterns -; todo: fix hl pointers - ld hl, NintendoCopyrightLogoGraphics ; 4:4c48 - ld de, vTitleLogo + $600 + ld hl, NintendoCopyrightLogoGraphics + ld de, vTitleLogo2 + $100 ld bc, $50 ld a, BANK(NintendoCopyrightLogoGraphics) - call FarCopyData - ld hl, NineTile ; 4:4e08 - ld de, vTitleLogo + $6e0 - ld bc, $10 - ld a, BANK(NineTile) - call FarCopyData - ld hl, GamefreakLogoGraphics ; 4:4d78 - ld de, vTitleLogo + $650 + call FarCopyData2 + ld hl, GamefreakLogoGraphics + ld de, vTitleLogo2 + $100 + $50 ld bc, $90 ld a, BANK(GamefreakLogoGraphics) - call FarCopyData - callab Func_f453f - ld hl, vBGMap0 - ld bc, (vBGMap1 + $400) - vBGMap0 - ld a, " " - call FillMemory - callab Func_f4578 - call Func_4418 - call .WriteCopyrightTiles + call FarCopyData2 + ld hl, PokemonLogoGraphics + ld de, vTitleLogo + ld bc, $600 + ld a, BANK(PokemonLogoGraphics) + call FarCopyData2 ; first chunk + ld hl, PokemonLogoGraphics+$600 + ld de, vTitleLogo2 + ld bc, $100 + ld a, BANK(PokemonLogoGraphics) + call FarCopyData2 ; second chunk + ld hl, Version_GFX ; $402f + ld de,vChars2 + $600 + ld bc, Version_GFXEnd - Version_GFX + ld a, BANK(Version_GFX) + call FarCopyDataDouble + call ClearBothBGMaps + +; place tiles for pokemon logo (except for the last row) + coord hl, 2, 1 + ld a, $80 + ld de, SCREEN_WIDTH + ld c, 6 +.pokemonLogoTileLoop + ld b, $10 + push hl +.pokemonLogoTileRowLoop ; place tiles for one row + ld [hli], a + inc a + dec b + jr nz, .pokemonLogoTileRowLoop + pop hl + add hl, de + dec c + jr nz, .pokemonLogoTileLoop + +; place tiles for the last row of the pokemon logo + coord hl, 2, 7 + ld a, $31 + ld b, $10 +.pokemonLogoLastTileRowLoop + ld [hli], a + inc a + dec b + jr nz, .pokemonLogoLastTileRowLoop + + call DrawPlayerCharacter + +; put a pokeball in the player's hand + ld hl, wOAMBuffer + $28 + ld a, $74 + ld [hl], a + +; place tiles for title screen copyright + coord hl, 2, 17 + ld de, .tileScreenCopyrightTiles + ld b, $10 +.tileScreenCopyrightTilesLoop + ld a, [de] + ld [hli], a + inc de + dec b + jr nz, .tileScreenCopyrightTilesLoop + + jr .next + +.tileScreenCopyrightTiles ; 437f (1:437f) + db $41,$42,$43,$42,$44,$42,$45,$46,$47,$48,$49,$4A,$4B,$4C,$4D,$4E ; ©'95.'96.'98 GAME FREAK inc. + +.next call SaveScreenTilesToBuffer2 call LoadScreenTilesFromBuffer2 call EnableLCD - callab Func_f459a - ld a, $9b + ld a,CHARMANDER ; which Pokemon to show first on the title screen + + ld [wTitleMonSpecies], a + call LoadTitleMonSprite + ld a, (vBGMap0 + $300) / $100 call TitleScreenCopyTileMapToVRAM call SaveScreenTilesToBuffer1 ld a, $40 @@ -69,9 +132,8 @@ DisplayTitleScreen: ; 4171 (1:4171) ld b, SET_PAL_TITLE_SCREEN call RunPaletteCommand call GBPalNormal - ld a, %11100000 + ld a, %11100100 ld [rOBP0], a - call UpdateGBCPal_OBP0 ; make pokemon logo bounce up and down ld bc, hSCY ; background scroll Y @@ -91,7 +153,7 @@ DisplayTitleScreen: ; 4171 (1:4171) call .ScrollTitleScreenPokemonLogo jr .bouncePokemonLogoLoop -.TitleScreenPokemonLogoYScrolls ; 4228 (1:4228) +.TitleScreenPokemonLogoYScrolls: ; 43db (1:43db) ; Controls the bouncing effect of the Pokemon logo on the title screen db -4,16 ; y scroll amount, number of times to scroll db 3,4 @@ -102,7 +164,7 @@ DisplayTitleScreen: ; 4171 (1:4171) db -1,2 db 0 ; terminate list with 0 -.ScrollTitleScreenPokemonLogo ; 4237 (1:4237) +.ScrollTitleScreenPokemonLogo ; Scrolls the Pokemon logo on the title screen to create the bouncing effect ; Scrolls d pixels e times call DelayFrame @@ -113,22 +175,7 @@ DisplayTitleScreen: ; 4171 (1:4171) jr nz, .ScrollTitleScreenPokemonLogo ret -; place tiles for title screen copyright -.WriteCopyrightTiles ; 4241 (1:4241) - coord hl, 2, 17 - ld de, .tileScreenCopyrightTiles -.titleScreenCopyrightTilesLoop - ld a, [de] - inc de - cp $ff - ret z - ld [hli], a - jr .titleScreenCopyrightTilesLoop - -.tileScreenCopyrightTiles ; 424f (1:424f) - db $e0,$e1,$e2,$e3,$e1,$e2,$ee,$e5,$e6,$e7,$e8,$e9,$ea,$eb,$ec,$ed,$ff ; ©1995-1999 GAME FREAK inc. - -.finishedBouncingPokemonLogo ; 4260 (1:4260) +.finishedBouncingPokemonLogo call LoadScreenTilesFromBuffer1 ld c, 36 call DelayFrames @@ -136,41 +183,52 @@ DisplayTitleScreen: ; 4171 (1:4171) call PlaySound ; scroll game version in from the right - callab Func_f4585 + call PrintGameVersionOnTitleScreen ld a, SCREEN_HEIGHT_PIXELS ld [hWY], a + ld d, 144 +.scrollTitleScreenGameVersionLoop + ld h, d + ld l, 64 + call ScrollTitleScreenGameVersion + ld h, 0 + ld l, 80 + call ScrollTitleScreenGameVersion + ld a, d + add 4 + ld d, a + and a + jr nz, .scrollTitleScreenGameVersionLoop + + ld a, vBGMap1 / $100 + call TitleScreenCopyTileMapToVRAM + call LoadScreenTilesFromBuffer2 + call PrintGameVersionOnTitleScreen call Delay3 - ld e, 0 - call TitleScreen_PlayPikachuPCM call WaitForSoundToFinish - call StopAllMusic ld a, MUSIC_TITLE_SCREEN ld [wNewSoundID], a call PlaySound -.asm_428f xor a ld [wUnusedCC5B], a - ld [wTitleMonSpecies], a - ld [wTitleMonSpecies+1], a - ld [wTitleMonSpecies+2], a - ld [wTitleMonSpecies+3], a - ld a, $f - ld [wTitleMonSpecies+4], a -.titleScreenLoop - call IncrementResetCounter - jp c, .doTitlescreenReset - call DelayFrame - call JoypadLowSensitivity - ld a, [hJoyHeld] - cp D_UP | SELECT | B_BUTTON - jr z, .asm_42bf - and A_BUTTON | START - jr nz, .asm_42bf - call Func_4390 - jr .titleScreenLoop -.asm_42bf - ld e, $a - call TitleScreen_PlayPikachuPCM + +; Keep scrolling in new mons indefinitely until the user performs input. +.awaitUserInterruptionLoop + ld c, 200 + call CheckForUserInterruption + jr c, .finishedWaiting + call TitleScreenScrollInMon + ld c, 1 + call CheckForUserInterruption + jr c, .finishedWaiting + callba TitleScreenAnimateBallIfStarterOut + call TitleScreenPickNewMon + jr .awaitUserInterruptionLoop + +.finishedWaiting + ld a, [wTitleMonSpecies] + call PlayCry + call WaitForSoundToFinish call GBPalWhiteOutWithDelay3 call ClearSprites xor a @@ -190,172 +248,143 @@ DisplayTitleScreen: ; 4171 (1:4171) cp D_UP | SELECT | B_BUTTON jp z, .doClearSaveDialogue jp MainMenu -.asm_42f0 ; 42f0 (1:42f0) - callab Func_e8e79 - jp .asm_428f -.asm_42fb ; 42fb (1:42fb) - ld a, [wTitleMonSpecies+4] - inc a - cp $2a - jr c, .asm_4305 - ld a, $f -.asm_4305 - ld [wTitleMonSpecies+4], a - ld e, a - callab PlayPikachuSoundClip - xor a - ld [wTitleMonSpecies+2], a - ld [wTitleMonSpecies+3], a - jp .titleScreenLoop -.doTitlescreenReset ; 431b (1:431b) - ld [wAudioFadeOutControl], a - call StopAllMusic -.audioFadeLoop - ld a, [wAudioFadeOutControl] - and a - jr nz, .audioFadeLoop - jp Init - -.doClearSaveDialogue ; 432a (1:432a) +.doClearSaveDialogue jpba DoClearSaveDialogue +TitleScreenPickNewMon: ; 4496 (1:4496) + ld a, vBGMap0 / $100 + call TitleScreenCopyTileMapToVRAM + +.loop +; Keep looping until a mon different from the current one is picked. + call Random + and $f + ld c, a + ld b, 0 + ld hl, TitleMons + add hl, bc + ld a, [hl] + ld hl, wTitleMonSpecies + +; Can't be the same as before. + cp [hl] + jr z, .loop + + ld [hl], a + call LoadTitleMonSprite + + ld a, $90 + ld [hWY], a + ld d, 1 ; scroll out + callba TitleScroll + ret + +TitleScreenScrollInMon: ; 44c1 (1:44c1) + ld d, 0 ; scroll in + callba TitleScroll + xor a + ld [hWY], a + ret -TitleScreenCopyTileMapToVRAM: ; 4332 (1:4332) +ScrollTitleScreenGameVersion: ; 44cf (1:44cf) +.wait + ld a, [rLY] + cp l + jr nz, .wait + + ld a, h + ld [rSCX], a + +.wait2 + ld a, [rLY] + cp h + jr z, .wait2 + ret + +DrawPlayerCharacter: ; 44dd (1:44dd) + ld hl, PlayerCharacterTitleGraphics + ld de, vSprites + ld bc, PlayerCharacterTitleGraphicsEnd - PlayerCharacterTitleGraphics + ld a, BANK(PlayerCharacterTitleGraphics) + call FarCopyData2 + call ClearSprites + xor a + ld [wPlayerCharacterOAMTile], a + ld hl, wOAMBuffer + ld de, $605a + ld b, 7 +.loop + push de + ld c, 5 +.innerLoop + ld a, d + ld [hli], a ; Y + ld a, e + ld [hli], a ; X + add 8 + ld e, a + ld a, [wPlayerCharacterOAMTile] + ld [hli], a ; tile + inc a + ld [wPlayerCharacterOAMTile], a + inc hl + dec c + jr nz, .innerLoop + pop de + ld a, 8 + add d + ld d, a + dec b + jr nz, .loop + ret + +ClearBothBGMaps: ; 4519 (1:4519) + ld hl, vBGMap0 + ld bc, $400 * 2 + ld a, " " + jp FillMemory + +LoadTitleMonSprite: ; 4524 (1:4524) + ld [wcf91], a + ld [wd0b5], a + coord hl, 5, 10 + call GetMonHeader + jp LoadFrontSpriteByMonIndex + +TitleScreenCopyTileMapToVRAM: ; 4533 (1:4533) ld [H_AUTOBGTRANSFERDEST + 1], a jp Delay3 -LoadCopyrightAndTextBoxTiles: ; 4337 (1:4337) +LoadCopyrightAndTextBoxTiles: ; 4538 (1:4538) xor a ld [hWY], a call ClearScreen call LoadTextBoxTilePatterns -LoadCopyrightTiles: ; 4340 (1:4340) +LoadCopyrightTiles: ; 4541 (1:4541) ld de, NintendoCopyrightLogoGraphics ld hl, vChars2 + $600 - lb bc, BANK(NintendoCopyrightLogoGraphics), (TextBoxGraphics + $10 - NintendoCopyrightLogoGraphics) / $10 ; bug: overflows into text box graphics and copies the "A" tile + lb bc, BANK(NintendoCopyrightLogoGraphics), (GamefreakLogoGraphicsEnd - NintendoCopyrightLogoGraphics) / $10 call CopyVideoData coord hl, 2, 7 ld de, CopyrightTextString jp PlaceString -CopyrightTextString: ; 4355 (1:4355) - db $60,$61,$62,$63,$61,$62,$7c,$7f,$65,$66,$67,$68,$69,$6a ; ©1995-1999 Nintendo - next $60,$61,$62,$63,$61,$62,$7c,$7f,$6b,$6c,$6d,$6e,$6f,$70,$71,$72 ; ©1995-1999 Creatures inc. - next $60,$61,$62,$63,$61,$62,$7c,$7f,$73,$74,$75,$76,$77,$78,$79,$7a,$7b ; ©1995-1999 GAME FREAK inc. +CopyrightTextString: ; 4556 (1:4556) + db $60,$61,$62,$61,$63,$61,$64,$7F,$65,$66,$67,$68,$69,$6A ; ©'95.'96.'98 Nintendo + next $60,$61,$62,$61,$63,$61,$64,$7F,$6B,$6C,$6D,$6E,$6F,$70,$71,$72 ; ©'95.'96.'98 Creatures inc. + next $60,$61,$62,$61,$63,$61,$64,$7F,$73,$74,$75,$76,$77,$78,$79,$7A,$7B ; ©'95.'96.'98 GAME FREAK inc. db "@" -TitleScreen_PlayPikachuPCM: ; 4387 (1:4387) - callab PlayPikachuSoundClip - ret - -Func_4390: ; 4390 (1:4390) - call Func_43de - ld a, [wTitleMonSpecies] - ld e, a - ld d, 0 - ld hl, PointerTable_43a2 - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -PointerTable_43a2: ; 43a2 (1:43a2) - dw Func_43be - dw Func_43c3 - dw Func_43d9 - dw Func_43d9 - dw Func_43c7 - dw Func_43d9 - dw Func_43d9 - dw Func_43c3 - dw Func_43d9 - dw Func_43d9 - dw Func_43bf - dw Func_43ba - -Func_43ba: ; 43ba (1:43ba) - xor a - ld [wTitleMonSpecies], a -Func_43be - ret - -Func_43bf: ; 43bf (1:43bf) - ld e, 0 - jr asm_43c9 -Func_43c3: ; 43c3 (1:43c3) - ld e, 4 - jr asm_43c9 -Func_43c7: ; 43c7 (1:43c7) - ld e, 8 -asm_43c9: ; 43c9 (1:43c9) - ld hl, wOAMBuffer + 2 - ld c, 8 -.loop - ld a, [hl] - and $f3 - or e - ld [hli], a - inc hl - inc hl - inc hl - dec c - jr nz, .loop -Func_43d9: ; 43d9 (1:43d9) - ld hl, wTitleMonSpecies - inc [hl] - ret - -Func_43de: ; 43de (1:43de) - ld hl, wTitleMonSpecies + 1 - ld a, [hl] - inc [hl] - and a - jr z, .asm_43ed - cp $80 - jr z, .asm_43ed - cp $90 - ret nz -.asm_43ed - ld a, $1 - ld [wTitleMonSpecies], a - ret +INCLUDE "data/title_mons.asm" -; copy text of fixed length NAME_LENGTH (like player name, rival name, mon names, ...) -CopyFixedLengthText: ; 43f3 (1:43f3) - ld bc, NAME_LENGTH - jp CopyData - -NintenText: db "NINTEN@" -SonyText: db "SONY@" +; prints version text (red, blue) +PrintGameVersionOnTitleScreen: ; 4598 (1:4598) + coord hl, 7, 8 + ld de, VersionOnTitleScreenText + jp PlaceString -IncrementResetCounter: ; 4405 (1:4405) - ld hl, wTitleMonSpecies + 2 - ld e, [hl] - inc hl - ld d, [hl] - inc de - ld a, d - cp $c - jr z, .doReset - ld [hl], d - dec hl - ld [hl], e - and a - ret -.doReset - scf - ret - -Func_4418: ; 4418 (1:4418) - xor a - call SwitchSRAMBankAndLatchClockData - ld hl, $a000 - ld bc, $20 - ld a, $aa - call FillMemory - call PrepareRTCDataAndDisableSRAM - ret
\ No newline at end of file +; these point to special tiles specifically loaded for that purpose and are not usual text +VersionOnTitleScreenText: ; 45a1 (1:45a1) + db $60,$61,$7F,$65,$66,$67,$68,$69,"@" ; "Red Version" diff --git a/engine/town_map.asm b/engine/town_map.asm index ea60e5a4..31eefcfd 100755 --- a/engine/town_map.asm +++ b/engine/town_map.asm @@ -108,7 +108,7 @@ DisplayTownMap: ; 70eb7 (1c:4eb7) ld a,[hJoy5] and D_DOWN | D_UP ret z - callab PlayPikachuSoundClip + callab Func_f0000 ret INCLUDE "data/town_map_order.asm" @@ -32,7 +32,7 @@ SECTION "joypad", ROM0 [$60] SECTION "Home", ROM0 -DisableLCD:: ; 0061 (0:0061) +DisableLCD:: xor a ld [rIF], a ld a, [rIE] @@ -52,13 +52,13 @@ DisableLCD:: ; 0061 (0:0061) ld [rIE], a ret -EnableLCD:: ; 007b (0:007b) +EnableLCD:: ld a, [rLCDC] set rLCDC_ENABLE, a ld [rLCDC], a ret -ClearSprites:: ; 0082 (0:0082) +ClearSprites:: xor a ld hl, wOAMBuffer ld b, 40 * 4 @@ -68,7 +68,7 @@ ClearSprites:: ; 0082 (0:0082) jr nz, .loop ret -HideSprites:: ; 008d (0:008d) +HideSprites:: ld a, 160 ld hl, wOAMBuffer ld de, 4 @@ -101,7 +101,7 @@ SECTION "Header", ROM0 [$104] SECTION "Main", ROM0 -PlayPikachuPCM:: ; 0150 (0:0150) +Func_150:: ; 0150 (0:0150) ld a,[H_LOADEDROMBANK] push af ld a,b @@ -114,16 +114,16 @@ PlayPikachuPCM:: ; 0150 (0:0150) ld a,[hli] ld d,a ld a,$3 -.playSingleSample +.unknownloop dec a - jr nz,.playSingleSample + jr nz,.unknownloop rept 7 - call LoadNextSoundClipSample - call PlaySoundClipSample + call Func_199 + call Func_1a5 endr - call LoadNextSoundClipSample + call Func_199 dec bc ld a,c or b @@ -132,7 +132,7 @@ PlayPikachuPCM:: ; 0150 (0:0150) call BankswitchCommon ret -LoadNextSoundClipSample:: ; 0199 (0:0199) +Func_199:: ; 0199 (0:0199) ld a,d and $80 srl a @@ -141,14 +141,14 @@ LoadNextSoundClipSample:: ; 0199 (0:0199) sla d ret -PlaySoundClipSample:: ; 01a5 (0:01a5) +Func_1a5:: ; 01a5 (0:01a5) ld a,$3 -.loop +.unknownloop2 dec a - jr nz,.loop + jr nz,.unknownloop2 ret -Start:: ; 01ab (0:01ab) +Start:: cp GBC jr z, .gbc xor a @@ -159,7 +159,7 @@ Start:: ; 01ab (0:01ab) ld [hGBC], a jp Init -Joypad:: ; 01b9 (0:01b9) +Joypad:: ; 01b9 homecall_jump _Joypad ReadJoypad:: ; 01c8 (0:01c8) @@ -2540,7 +2540,7 @@ ApplyOutOfBattlePoisonDamage: ; c3de (3:43de) callab IsThisPartymonOurPikachu jr nc, .curMonNotPlayerPikachu ld e, $3 - callab PlayPikachuSoundClip + callab Func_f0000 callab_ModifyPikachuHappiness_ld_d PIKAHAPPY_PSNFNT .curMonNotPlayerPikachu pop de diff --git a/text/item_names.asm b/text/item_names.asm index 6a401597..3c0f4c49 100755 --- a/text/item_names.asm +++ b/text/item_names.asm @@ -1,4 +1,4 @@ -ItemNames: ; 45b7 (1:45b7) +ItemNames: ; 472b (1:472b) db "MASTER BALL@" db "ULTRA BALL@" db "GREAT BALL@" diff --git a/yellow/main.asm b/yellow/main.asm index 41db0e44..82198765 100755 --- a/yellow/main.asm +++ b/yellow/main.asm @@ -18,529 +18,31 @@ SECTION "home",ROM0 INCLUDE "home.asm" SECTION "bank01",ROMX,BANK[$01] -INCLUDE "data/facing.asm" +;INCLUDE "data/facing.asm" + dr $4000,$4111 INCLUDE "engine/battle/safari_zone.asm" -INCLUDE "engine/titlescreen.asm" - +SetDefaultNamesBeforeTitlescreen: ; 414b (1:414b) + dr $414b,$442b LoadMonData_: ; 442b (1:442b) -; Load monster [wWhichPokemon] from list [wMonDataLocation]: -; 0: partymon -; 1: enemymon -; 2: boxmon -; 3: daycaremon -; Return monster id at wcf91 and its data at wLoadedMon. -; Also load base stats at W_MONHEADER for convenience. - - ld a, [wDayCareMonSpecies] - ld [wcf91], a - ld a, [wMonDataLocation] - cp DAYCARE_DATA - jr z, .GetMonHeader - - ld a, [wWhichPokemon] - ld e, a - call GetMonSpecies - -.GetMonHeader - ld a, [wcf91] - ld [wd0b5], a ; input for GetMonHeader - call GetMonHeader - - ld hl, wPartyMons - ld bc, wPartyMon2 - wPartyMon1 - ld a, [wMonDataLocation] - cp ENEMY_PARTY_DATA - jr c, .getMonEntry - - ld hl, wEnemyMons - jr z, .getMonEntry - - cp 2 - ld hl, wBoxMons - ld bc, wBoxMon2 - wBoxMon1 - jr z, .getMonEntry - - ld hl, wDayCareMon - jr .copyMonData - -.getMonEntry - ld a, [wWhichPokemon] - call AddNTimes - -.copyMonData - ld de, wLoadedMon - ld bc, wPartyMon2 - wPartyMon1 - jp CopyData - -; get species of mon e in list [wMonDataLocation] for LoadMonData -GetMonSpecies: ; 4478 (1:4478) - ld hl, wPartySpecies - ld a, [wMonDataLocation] - and a - jr z, .getSpecies - dec a - jr z, .enemyParty - ld hl, wBoxSpecies - jr .getSpecies -.enemyParty - ld hl, wEnemyPartyMons -.getSpecies - ld d, 0 - add hl, de - ld a, [hl] - ld [wcf91], a - ret - -INCLUDE "data/item_prices.asm" -INCLUDE "text/item_names.asm" - + dr $442b,$4494 +ItemPrices: ; 4494 (1:4494) + dr $4494,$45b7 +ItemNames: ; 45b7 (1:45b7) + dr $45b7,$491e UnusedNames: ; 491e (1:491e) - db "かみなりバッヂ@" - db "かいがらバッヂ@" - db "おじぞうバッヂ@" - db "はやぶさバッヂ@" - db "ひんやりバッヂ@" - db "なかよしバッヂ@" - db "バラバッヂ@" - db "ひのたまバッヂ@" - db "ゴールドバッヂ@" - db "たまご@" - db "ひよこ@" - db "ブロンズ@" - db "シルバー@" - db "ゴールド@" - db "プチキャプテン@" - db "キャプテン@" - db "プチマスター@" - db "マスター@" - db "エクセレント" - -INCLUDE "engine/overworld/oam.asm" - + dr $491e,$499b +PrepareOAMData: ; 499b (1:499b) + dr $499b,$4a92 +WriteDMACodeToHRAM: ; 4a92 (1:4a92) + dr $4a92,$4aaa +_IsTilePassable: ; 4aaa (1:4aaa) + dr $4aaa,$4b89 PrintWaitingText: ; 4b89 (1:4b89) - coord hl, 3, 10 - lb bc, 1, 11 - ld a, [W_ISINBATTLE] - and a - jr z, .asm_4b9a - call TextBoxBorder - jr .asm_4b9d -.asm_4b9a - call CableClub_TextBoxBorder -.asm_4b9d - coord hl, 4, 11 - ld de, WaitingText - call PlaceString - ld c, 50 - jp DelayFrames - -WaitingText: ; 4bab (1:4bab) - db "Waiting...!@" - + dr $4b89,$4bb7 _UpdateSprites: ; 4bb7 (1:4bb7) - ld h, wSpriteStateData1 / $100 - inc h - ld a, $e ; (wSpriteStateData2 + $0e) & $ff -.spriteLoop - ld l, a - sub $e - ld c, a - ld [H_CURRENTSPRITEOFFSET], a - ld a, [hl] - and a - jr z, .skipSprite ; tests $c2Xe - push hl - push de - push bc - call .updateCurrentSprite - pop bc - pop de - pop hl -.skipSprite - ld a, l - add $10 ; move to next sprite - cp $e ; test for overflow (back at $0e) - jr nz, .spriteLoop - ret -.updateCurrentSprite ; 4bd7 (1:4bd7) - ld a, [H_CURRENTSPRITEOFFSET] - and a - jp z, UpdatePlayerSprite - cp $f0 ; pikachu - jp z, Func_1552 - ld a, [hl] - -UpdateNonPlayerSprite: ; 4be3 (1:4be3) - dec a - swap a - ld [$ff93], a ; $10 * sprite# - ld a, [wNPCMovementScriptSpriteOffset] ; some sprite offset? - ld b, a - ld a, [H_CURRENTSPRITEOFFSET] - cp b - jr nz, .unequal - jp DoScriptedNPCMovement -.unequal - jp UpdateNPCSprite - -; This detects if the current sprite (whose offset is at H_CURRENTSPRITEOFFSET) -; is going to collide with another sprite by looping over the other sprites. -; The current sprite's offset will be labelled with i (e.g. $c1i0). -; The loop sprite's offset will labelled with j (e.g. $c1j0). -; -; Note that the Y coordinate of the sprite (in [$c1k4]) is one of the following -; 9 values when the sprite is aligned with the grid: $fc, $0c, $1c, $2c, ..., $7c. -; The reason that 4 is added below to the coordinate is to make it align with a -; multiple of $10 to make comparisons easier. -DetectCollisionBetweenSprites: ; 4bf7 (1:4bf7) - ; nop - - ld h, wSpriteStateData1 / $100 - ld a, [H_CURRENTSPRITEOFFSET] - ld l, a - - ld a, [hl] ; a = [$c1i0] (picture) (0 if slot is unused) - and a ; is this sprite slot slot used? - ret z ; return if not used - - ld a, l - add 3 - ld l, a - - ld a, [hli] ; a = [$c1i3] (delta Y) (-1, 0, or 1) - call SetSpriteCollisionValues - - ld a, [hli] ; a = [$C1i4] (Y screen coordinate) - add 4 ; align with multiple of $10 - -; The effect of the following 3 lines is to -; add 7 to a if moving south or -; subtract 7 from a if moving north. - add b - and $f0 - or c - - ld [$ff90], a ; store Y coordinate adjusted for direction of movement - - ld a, [hli] ; a = [$c1i5] (delta X) (-1, 0, or 1) - call SetSpriteCollisionValues - ld a, [hl] ; a = [$C1i6] (X screen coordinate) - -; The effect of the following 3 lines is to -; add 7 to a if moving east or -; subtract 7 from a if moving west. - add b - and $f0 - or c - - ld [$ff91], a ; store X coordinate adjusted for direction of movement - - ld a, l - add 7 - ld l, a - - xor a - ld [hld], a ; zero [$c1id] XXX what's [$c1id] for? - ld [hld], a ; zero [$c1ic] (directions in which collisions occurred) - - ld a, [$ff91] - ld [hld], a ; [$c1ib] = adjusted X coordinate - ld a, [$ff90] - ld [hl], a ; [$c1ia] = adjusted Y coordinate - - xor a ; zero the loop counter - -.loop - ld [$ff8f], a ; store loop counter - swap a - ld e, a - ld a, [H_CURRENTSPRITEOFFSET] - cp e ; does the loop sprite match the current sprite? - jp z, .next ; go to the next sprite if they match - - ld d, h - ld a, [de] ; a = [$c1j0] (picture) (0 if slot is unused) - and a ; is this sprite slot slot used? - jp z, .next ; go the next sprite if not used - - inc e - inc e - ld a, [de] ; a = [$c1j2] ($ff means the sprite is offscreen) - inc a - jp z, .next ; go the next sprite if offscreen - - ld a, [H_CURRENTSPRITEOFFSET] - add 10 - ld l, a - - inc e - ld a, [de] ; a = [$c1j3] (delta Y) - call SetSpriteCollisionValues - - inc e - ld a, [de] ; a = [$C1j4] (Y screen coordinate) - add 4 ; align with multiple of $10 - -; The effect of the following 3 lines is to -; add 7 to a if moving south or -; subtract 7 from a if moving north. - add b - and $f0 - or c - - sub [hl] ; subtract the adjusted Y coordinate of sprite i ([$c1ia]) from that of sprite j - -; calculate the absolute value of the difference to get the distance - jr nc, .noCarry1 - cpl - inc a -.noCarry1 - ld [$ff90], a ; store the distance between the two sprites' adjusted Y values - -; Use the carry flag set by the above subtraction to determine which sprite's -; Y coordinate is larger. This information is used later to set [$c1ic], -; which stores which direction the collision occurred in. -; The following 5 lines set the lowest 2 bits of c, which are later shifted left by 2. -; If sprite i's Y is larger, set lowest 2 bits of c to 10. -; If sprite j's Y is larger or both are equal, set lowest 2 bits of c to 01. - push af - rl c - pop af - ccf - rl c - -; If sprite i's delta Y is 0, then b = 7, else b = 9. - ld b, 7 - ld a, [hl] ; a = [$c1ia] (adjusted Y coordinate) - and $f - jr z, .next1 - ld b, 9 - -.next1 - ld a, [$ff90] ; a = distance between adjusted Y coordinates - sub b - ld [$ff92], a ; store distance adjusted using sprite i's direction - ld a, b - ld [$ff90], a ; store 7 or 9 depending on sprite i's delta Y - jr c, .checkXDistance - -; If sprite j's delta Y is 0, then b = 7, else b = 9. - ld b, 7 - dec e - ld a, [de] ; a = [$c1j3] (delta Y) - inc e - and a - jr z, .next2 - ld b, 9 - -.next2 - ld a, [$ff92] ; a = distance adjusted using sprite i's direction - sub b ; adjust distance using sprite j's direction - jr z, .checkXDistance - jr nc, .next ; go to next sprite if distance is still positive after both adjustments - -.checkXDistance - inc e - inc l - ld a, [de] ; a = [$c1j5] (delta X) - - push bc - - call SetSpriteCollisionValues - inc e - ld a, [de] ; a = [$c1j6] (X screen coordinate) - -; The effect of the following 3 lines is to -; add 7 to a if moving east or -; subtract 7 from a if moving west. - add b - and $f0 - or c - - pop bc - - sub [hl] ; subtract the adjusted X coordinate of sprite i ([$c1ib]) from that of sprite j - -; calculate the absolute value of the difference to get the distance - jr nc, .noCarry2 - cpl - inc a -.noCarry2 - ld [$ff91], a ; store the distance between the two sprites' adjusted X values - -; Use the carry flag set by the above subtraction to determine which sprite's -; X coordinate is larger. This information is used later to set [$c1ic], -; which stores which direction the collision occurred in. -; The following 5 lines set the lowest 2 bits of c. -; If sprite i's X is larger, set lowest 2 bits of c to 10. -; If sprite j's X is larger or both are equal, set lowest 2 bits of c to 01. - push af - rl c - pop af - ccf - rl c - -; If sprite i's delta X is 0, then b = 7, else b = 9. - ld b, 7 - ld a, [hl] ; a = [$c1ib] (adjusted X coordinate) - and $f - jr z, .next3 - ld b, 9 - -.next3 - ld a, [$ff91] ; a = distance between adjusted X coordinates - sub b - ld [$ff92], a ; store distance adjusted using sprite i's direction - ld a, b - ld [$ff91], a ; store 7 or 9 depending on sprite i's delta X - jr c, .collision - -; If sprite j's delta X is 0, then b = 7, else b = 9. - ld b, 7 - dec e - ld a, [de] ; a = [$c1j5] (delta X) - inc e - and a - jr z, .next4 - ld b, 9 - -.next4 - ld a, [$ff92] ; a = distance adjusted using sprite i's direction - sub b ; adjust distance using sprite j's direction - jr z, .collision - jr nc, .next ; go to next sprite if distance is still positive after both adjustments - -.collision - ld a, l - and $f0 ; collision with pikachu? - jr nz, .asm_4cd9 - xor a - ld [wd434], a - ld a, [$ff8f] - cp $f - jr nz, .asm_4cd9 - call Func_4d0a - jr .asm_4cef -.asm_4cd9 - ld a, [$ff91] ; a = 7 or 9 depending on sprite i's delta X - ld b, a - ld a, [$ff90] ; a = 7 or 9 depending on sprite i's delta Y - inc l - -; If delta X isn't 0 and delta Y is 0, then b = %0011, else b = %1100. -; (note that normally if delta X isn't 0, then delta Y must be 0 and vice versa) - cp b - jr c, .next5 - ld b, %1100 - jr .next6 -.next5 - ld b, %0011 - -.next6 - ld a, c ; c has 2 bits set (one of bits 0-1 is set for the X axis and one of bits 2-3 for the Y axis) - and b ; we select either the bit in bits 0-1 or bits 2-3 based on the calculation immediately above - or [hl] ; or with existing collision direction bits in [$c1ic] - ld [hl], a ; store new value - ld a, c ; useless code because a is overwritten before being used again - -; set bit in [$c1ie] or [$c1if] to indicate which sprite the collision occurred with - inc l - inc l -.asm_4cef - ld a, [$ff8f] ; a = loop counter - ld de, SpriteCollisionBitTable - add a - add e - ld e, a - jr nc, .noCarry3 - inc d -.noCarry3 - ld a, [de] - or [hl] - ld [hli], a - inc de - ld a, [de] - or [hl] - ld [hl], a - -.next - ld a, [$ff8f] ; a = loop counter - inc a - cp $10 - jp nz, .loop - ret - -; takes delta X or delta Y in a -; b = delta X/Y -; c = 0 if delta X/Y is 0 -; c = 7 if delta X/Y is 1 -; c = 9 if delta X/Y is -1 -Func_4d0a: ; 4d0a (1:4d0a) - ld a, [$ff91] - ld b, a - ld a, [$ff90] - inc l - cp b - jr c, .asm_4d17 - ld b, %1100 - jr .asm_4d19 -.asm_4d17 - ld b, %11 -.asm_4d19 - ld a, c - and b - ld [wd434], a - ld a, c - inc l - inc l - ret - -SetSpriteCollisionValues: ; 4d22 (1:4d22) - and a - ld b, 0 - ld c, 0 - jr z, .done - ld c, 9 - cp -1 - jr z, .ok - ld c, 7 - ld a, 0 -.ok - ld b, a -.done - ret - -SpriteCollisionBitTable: ; 4d35 (1:4d35) - db %00000000,%00000001 - db %00000000,%00000010 - db %00000000,%00000100 - db %00000000,%00001000 - db %00000000,%00010000 - db %00000000,%00100000 - db %00000000,%01000000 - db %00000000,%10000000 - db %00000001,%00000000 - db %00000010,%00000000 - db %00000100,%00000000 - db %00001000,%00000000 - db %00010000,%00000000 - db %00100000,%00000000 - db %01000000,%00000000 - db %10000000,%00000000 - - dr $4d55,$4da5 -UpdatePlayerSprite: ; 4da5 (1:4da5) - dr $4da5,$4e3e -UpdateNPCSprite: ; 4e3e (1:4e3e) - dr $4e3e,$5012 + dr $4bb7,$5012 Func_5012: ; 5012 (1:5012) - dr $5012,$5199 -DoScriptedNPCMovement: ; 5199 (1:5199) - dr $5199,$5b67 -CableClub_TextBoxBorder: ; 5b67 (1:5b67) - dr $5b67,$5ba6 -MainMenu: ; 5ba6 (1:5ba6) - dr $5ba6,$5ce4 + dr $5012,$5ce4 Func_5ce4: ; 5ce4 (1:5ce4) dr $5ce4,$5d58 PrintSaveScreenText: ; 5d58 (1:5d58) @@ -1120,7 +622,7 @@ ApplyOutOfBattlePoisonDamage: ; c3de (3:43de) callab IsThisPartymonOurPikachu jr nc, .curMonNotPlayerPikachu ld e, $3 - callab PlayPikachuSoundClip + callab Func_f0000 calladb_ModifyPikachuHappiness PIKAHAPPY_PSNFNT .curMonNotPlayerPikachu pop de @@ -2879,7 +2381,6 @@ BattleHudTiles2: INCBIN "gfx/battle_hud2.1bpp" BattleHudTiles3: INCBIN "gfx/battle_hud3.1bpp" NintendoCopyrightLogoGraphics: INCBIN "gfx/copyright.2bpp" GamefreakLogoGraphics: INCBIN "gfx/gamefreak.2bpp" -GamefreakLogoGraphicsEnd: NineTile: INCBIN "gfx/9_tile.2bpp" TextBoxGraphics: INCBIN "gfx/text_box.2bpp" TextBoxGraphicsEnd: @@ -3026,9 +2527,7 @@ HandleLedges: ; 1a7f4 (6:67f4) SECTION "bank07",ROMX,BANK[$07] - dr $1c000,$1c21e -DoClearSaveDialogue: ; 1c21e (7:421e) - dr $1c21e,$1e321 + dr $1c000,$1e321 SafariZoneCheck: ; 1e321 (7:6e21) dr $1e321,$1e330 SafariZoneCheckSteps: ; 1e330 (7:6330) @@ -3800,9 +3299,7 @@ MonsterNames: ; e8000 (3a:4000) Func_e8a5e: ; e8a5e (3a:4a5e) dr $e8a5e,$e8d35 Func_e8d35:: ; e8d35 (3a:4d35) - dr $e8d35,$e8e79 -Func_e8e79: ; e8e79 (3a:4e79) - dr $e8e79,$e928a + dr $e8d35,$e928a SurfingPikachu2Graphics: INCBIN "gfx/surfing_pikachu_2.2bpp" dr $e988a,$e9bfa |