summaryrefslogtreecommitdiff
path: root/engine/bank3d.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/bank3d.asm')
-rw-r--r--engine/bank3d.asm693
1 files changed, 693 insertions, 0 deletions
diff --git a/engine/bank3d.asm b/engine/bank3d.asm
new file mode 100644
index 00000000..ef848679
--- /dev/null
+++ b/engine/bank3d.asm
@@ -0,0 +1,693 @@
+INCLUDE "engine/battle/common_text.asm"
+INCLUDE "engine/battle/link_battle_versus_text.asm"
+INCLUDE "engine/battle/unused_stats_functions.asm"
+INCLUDE "engine/battle/scroll_draw_trainer_pic.asm"
+
+Func_f429f:: ; f429f (3d:429f)
+ coord hl, 0,5
+ ld c,$0
+.asm_f42a4
+ inc c
+ ld a,c
+ cp $9
+ ret z
+ ld d,$5b
+ push bc
+ push hl
+.asm_f42ad
+ call Func_f42c2
+ dec hl
+ ld a,d
+ sub $7
+ ld d,a
+ dec c
+ jr nz,.asm_f42ad
+ ld c,$2
+ call DelayFrames
+ pop hl
+ pop bc
+ inc hl
+ jr .asm_f42a4
+
+Func_f42c2:: ; f42c2 (3d:f42c2)
+ push hl
+ push de
+ push bc
+ ld e,$7
+.loop
+ ld a,d
+ cp $31
+ jr nc,.asm_f42ce
+ ld a,$7f
+.asm_f42ce
+ ld [hl],a
+ ld bc,$14
+ add hl,bc
+ inc d
+ dec e
+ jr nz,.loop
+ pop bc
+ pop de
+ pop hl
+ ret
+
+INCLUDE "engine/battle/decrement_pp.asm"
+
+ModifyPikachuHappiness:: ; f430a (3d:430a)
+ ld a, d
+ cp PIKAHAPPY_GYMLEADER
+ jr z, .checkanywhereinparty
+ cp PIKAHAPPY_WALKING
+ jr z, .checkanywhereinparty
+ push de
+ callab IsThisPartymonStarterPikachu_Party
+ pop de
+ ret nc
+ jr .proceed
+
+.checkanywhereinparty
+ push de
+ callab IsStarterPikachuInOurParty
+ pop de
+ ret nc
+
+.proceed
+ push de
+ ; Divide [wPikachuHappiness] by 100. Hold the integer part in e.
+ ld e, $0
+ ld a, [wPikachuHappiness]
+ cp 100
+ jr c, .wPikachuHappiness_div_100
+ inc e
+ cp 200
+ jr c, .wPikachuHappiness_div_100
+ inc e
+.wPikachuHappiness_div_100
+ ; Get the (d, e) entry from .HappinessChangeTable.
+ ld c, d
+ dec c
+ ld b, $0
+ ld hl, .HappinessChangeTable
+ add hl, bc
+ add hl, bc
+ add hl, bc
+ ld d, $0
+ add hl, de
+ ld a, [hl]
+ ; If [hl] is positive, take min(0xff, [hl] + [wPikachuHappiness]).
+ ; If [hl] is negative, take max(0x00, [hl] + [wPikachuHappiness]).
+ ; Inexplicably, we're using 100 as the threshold for comparison.
+ cp 100
+ ld a, [wPikachuHappiness]
+ jr nc, .negative
+ add [hl]
+ jr nc, .okay
+ ld a, -1
+ jr .okay
+
+.negative
+ add [hl]
+ jr c, .okay
+ xor a
+.okay
+ ld [wPikachuHappiness], a
+
+ ; Restore d and get the d'th entry in .Moods.
+ pop de
+ dec d
+ ld hl, .Moods
+ ld e, d
+ ld d, $0
+ add hl, de
+ ld a, [hl]
+ ld b, a
+ ; Modify Pikachu's mood
+ cp $80
+ jr z, .done
+ ld a, [wPikachuMood]
+ jr c, .decreased
+ cp b
+ jr nc, .done
+ ld a, [wd49c]
+ and a
+ jr nz, .done
+ jr .update_mood
+
+.decreased
+ cp b
+ jr c, .done
+.update_mood
+ ld a, b
+ ld [wPikachuMood], a
+.done
+ ret
+
+.HappinessChangeTable: ; f4385 (3d:4385)
+ ; Increase
+ db 5, 3, 2 ; Gained a level
+ db 5, 3, 2 ; HP restore
+ db 1, 1, 0 ; Used X item
+ db 3, 2, 1 ; Challenged Gym Leader
+ db 1, 1, 0 ; Teach TM/HM
+ db 2, 1, 1 ; Walking around
+ ; Decrease
+ db -3, -3, -5 ; Deposited
+ db -1, -1, -1 ; Fainted in battle
+ db -5, -5, -10 ; Fainted due to Poison outside of battle
+ db -5, -5, -10 ; Unknown (d = 10)
+ db -10, -10, -20 ; Unknown (d = 11)
+
+.Moods: ; f43a6 (3d:43a6)
+ ; Increase
+ db $8a ; Gained a level
+ db $83 ; HP restore
+ db $80 ; Teach TM/HM
+ db $80 ; Challenged Gym Leader
+ db $94 ; Unknown (d = 5)
+ db $80 ; Unknown (d = 6)
+ ; Decrease
+ db $62 ; Deposited
+ db $6c ; Fainted
+ db $62 ; Unknown (d = 9)
+ db $6c ; Unknown (d = 10)
+ db $00 ; Unknown (d = 11)
+
+; f43b1 (3d:43b1)
+RedPicBack:: INCBIN "pic/trainer/redb.pic"
+OldManPic:: INCBIN "pic/trainer/oldman.pic"
+OakPicBack:: INCBIN "pic/ytrainer/prof.oakb.pic"
+
+;SECTION "bank3d Yellow Intro",ROMX[$453f],BANK[$3D]
+
+Func_f453f:: ; f453f (3d:453f)
+ ld hl,PokemonLogoGraphics
+ ld de,vChars2
+ ld bc,$730
+ ld a,BANK(PokemonLogoGraphics) ; redundant because this function is in bank3d
+ call FarCopyData
+ ld hl,YellowLogoGraphics+$230
+ ld de,vChars0+$fd0
+ ld bc,$30
+ ld a,BANK(YellowLogoGraphics)
+ call FarCopyData
+ ld hl,YellowLogoGraphics+$260
+ ld de,vChars1
+ ld bc,$400
+ ld a,BANK(YellowLogoGraphics)
+ call FarCopyData
+ ld hl,YellowLogoGraphics+$660
+ ld de,vChars0+$f00
+ ld bc,$c0
+ ld a,BANK(YellowLogoGraphics)
+ call FarCopyData
+ ret
+
+Func_f4578:: ; f4578 (3d:4578)
+ coord hl, 2,1
+ ld de,Pointer_f45f9
+ ld bc,7 << 8 | 16 ; 16x7 (xy)
+ call CopyScreenArea
+ ret
+
+Func_f4585:: ; f4585 (3d:4585)
+ coord hl, 6,4
+ ld de,Pointer_f4673
+ ld bc,4 << 8 | 7 ; 7x4 (xy)
+ call CopyScreenArea
+ coord hl, 9,8
+ ld [hl],$64
+ inc hl
+ ld [hl],$65
+ ret
+
+Func_f459a:: ; f459a (3d:459a)
+ coord hl, 4,8
+ ld de,Pointer_f468f
+ ld bc,9 << 8 | 12 ; 12x9 (xy)
+ call CopyScreenArea
+ coord hl, 16,10
+ ld [hl],$96
+ coord hl, 16,11
+ ld [hl],$9d
+ coord hl, 16,12
+ ld [hl],$a7
+ coord hl, 16,13
+ ld [hl],$b1
+ ld hl,Pointer_f45c7
+ ld de,wOAMBuffer
+ ld bc,$20
+ call CopyData
+ ret
+
+Pointer_f45c7: ; f45c7 (3d:45c7)
+ db $60,$40,$f1,$22
+ db $60,$48,$f0,$22
+ db $68,$40,$f3,$22
+ db $68,$48,$f2,$22
+ db $60,$60,$f0,$02
+ db $60,$68,$f1,$02
+ db $68,$60,$f2,$02
+ db $68,$68,$f3,$02
+
+CopyScreenArea:: ; f45e7 (3d:45e7)
+; copy cxb (xy) screen area from de to hl
+ push bc
+ push hl
+.loop
+ ld a,[de]
+ inc de
+ ld [hli],a
+ dec c
+ jr nz,.loop
+ pop hl
+ ld bc,$14
+ add hl,bc
+ pop bc
+ dec b
+ jr nz,CopyScreenArea
+ ret
+
+Pointer_f45f9: ; f45f9 (3d:45f9)
+; 16x7 (xy)
+ db $f4,$f4,$f4,$f4,$f4,$f4,$49,$f4,$72,$30,$f4,$f4,$f4,$f4,$f4,$f4
+ db $fd,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0a,$0b,$f4,$0d,$0e,$0f
+ db $10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1a,$1b,$1c,$1d,$1e,$1f
+ db $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2a,$2b,$2c,$2d,$2e,$2f
+ db $f4,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3a,$3b,$3c,$3d,$3e,$3f
+ db $f4,$41,$42,$43,$44,$45,$46,$47,$48,$f4,$4a,$4b,$4c,$4d,$4e,$4f
+ db $f4,$6a,$6b,$6c,$6d,$f4,$f4,$f4,$f4,$f4,$f4,$6e,$6f,$70,$71,$f4
+
+Pointer_f4669:: ; f4669 (3d:4669)
+ db $47,$48,$49,$4a,$4b,$4c,$4d,$4e,$4f,$5f
+
+Pointer_f4673:: ; f4673 (3d:4673)
+; 7x4 (xy)
+ db $24,$25,$66,$67,$68,$69,$2a
+ db $50,$51,$52,$53,$54,$55,$56
+ db $57,$58,$59,$5a,$5b,$5c,$5d
+ db $6d,$5e,$5f,$60,$61,$62,$63
+
+Pointer_f468f:: ; f468f (3d:468f)
+; 12x9 (xy)
+ db $80,$81,$82,$83,$00,$00,$00,$00,$84,$85,$86,$87
+ db $88,$89,$8a,$8b,$8c,$8d,$8d,$8e,$8f,$8a,$90,$91
+ db $00,$92,$93,$8a,$8a,$8a,$8a,$8a,$8a,$94,$95,$00
+ db $00,$00,$97,$8a,$8a,$98,$99,$8a,$8a,$9a,$9b,$9c
+ db $00,$00,$9e,$9f,$a0,$a1,$a2,$a3,$a4,$a5,$a6,$8a
+ db $00,$a8,$a9,$aa,$8a,$ab,$ac,$8a,$ad,$ae,$af,$b0
+ db $00,$b2,$b3,$b4,$8a,$8a,$8a,$8a,$b5,$b6,$b7,$b8
+ db $00,$b9,$ba,$8a,$8a,$8a,$8a,$8a,$8a,$bb,$bc,$00
+ db $00,$00,$bd,$8a,$8a,$8a,$8a,$8a,$8a,$be,$bf,$00
+
+; f46f9 (3d:46f9)
+PokemonLogoGraphics: INCBIN "gfx/pokemon_logo.2bpp"
+YellowLogoGraphics: INCBIN "gfx/yellow_titlescreen.2bpp"
+
+INCLUDE "engine/menu/link_menu.asm"
+
+HandleMenuInputDouble:: ; f5a40 (3d:5a40)
+ xor a
+ ld [wPartyMenuAnimMonEnabled],a
+
+HandleMenuInputPokemonSelectionDouble:: ; f5a44 (3d:5a44)
+ ld a,[H_DOWNARROWBLINKCNT1]
+ push af
+ ld a,[H_DOWNARROWBLINKCNT2]
+ push af ; save existing values on stack
+ xor a
+ ld [H_DOWNARROWBLINKCNT1],a ; blinking down arrow timing value 1
+ ld a,$06
+ ld [H_DOWNARROWBLINKCNT2],a ; blinking down arrow timing value 2
+.loop1
+ xor a
+ ld [wAnimCounter],a ; counter for pokemon shaking animation
+ call Func_f5ab0
+ call JoypadLowSensitivity
+ ld a,[hJoy5]
+ and a ; was a key pressed?
+ jr nz,.keyPressed
+ pop af
+ ld [H_DOWNARROWBLINKCNT2],a
+ pop af
+ ld [H_DOWNARROWBLINKCNT1],a ; restore previous values
+ xor a
+ ld [wMenuWrappingEnabled],a ; disable menu wrapping
+ ret
+.keyPressed
+ xor a
+ ld [wCheckFor180DegreeTurn],a
+ ld a,[hJoy5]
+ ld b,a
+ bit 6,a ; pressed Up key?
+ jr z,.checkIfDownPressed
+.upPressed
+ ld a,[wCurrentMenuItem] ; selected menu item
+ and a ; already at the top of the menu?
+ jr z,.checkOtherKeys
+.notAtTop
+ dec a
+ ld [wCurrentMenuItem],a ; move selected menu item up one space
+ jr .checkOtherKeys
+.checkIfDownPressed
+ bit 7,a
+ jr z,.checkOtherKeys
+.downPressed
+ ld a,[wCurrentMenuItem]
+ inc a
+ ld c,a
+ ld a,[wMaxMenuItem]
+ cp c
+ jr c,.checkOtherKeys
+ ld a,c
+ ld [wCurrentMenuItem],a
+.checkOtherKeys
+ ld a,[wMenuWatchedKeys]
+ and b ; does the menu care about any of the pressed keys?
+ jp z,.loop1
+.checkIfAButtonOrBButtonPressed
+ ld a,[hJoy5]
+ and A_BUTTON | B_BUTTON
+ jr z,.skipPlayingSound
+.AButtonOrBButtonPressed
+ ld a, $90 ; (SFX_02_40 - SFX_Headers_02) / 3
+ call PlaySound ; play sound
+.skipPlayingSound
+ pop af
+ ld [H_DOWNARROWBLINKCNT2],a
+ pop af
+ ld [H_DOWNARROWBLINKCNT1],a ; restore previous values
+ ld a,[hJoy5]
+ ret
+
+Func_f5ab0:: ; f5ab0 (3d:5ab0)
+ ld a,[wTopMenuItemY]
+ and a
+ jr z,.asm_f5ac0
+ coord hl, 0,0
+ ld bc,$14
+.loop
+ add hl,bc
+ dec a
+ jr nz,.loop
+.asm_f5ac0
+ ld a,[wTopMenuItemX]
+ ld b,$0
+ ld c,a
+ add hl,bc
+ push hl
+ ld a,[wLastMenuItem]
+ and a
+ jr z,.asm_f5ad5
+ ld bc,$28
+.loop2
+ add hl,bc
+ dec a
+ jr nz,.loop2
+.asm_f5ad5
+ ld a,[hl]
+ cp "▶"
+ jr nz,.asm_f5ade
+ ld a,[wTileBehindCursor]
+ ld [hl],a
+.asm_f5ade
+ pop hl
+ ld a,[wCurrentMenuItem]
+ and a
+ jr z,.asm_f5aec
+ ld bc,$28
+.loop3
+ add hl,bc
+ dec a
+ jr nz,.loop3
+.asm_f5aec
+ ld a,[hl]
+ cp "▶"
+ jr z,.asm_f5af4
+ ld [wTileBehindCursor],a
+.asm_f5af4
+ ld a,"▶"
+ ld [hl],a
+ ld a,l
+ ld [wMenuCursorLocation],a
+ ld a,h
+ ld [wMenuCursorLocation+1],a
+ ld a,[wCurrentMenuItem]
+ ld [wLastMenuItem],a
+ ret
+
+Func_f5b06:: ; f5b06 (3d:5b06)
+ ld hl,wd728
+ set 0,[hl]
+ ld hl,Text_f5b17
+ call PrintText
+ ld hl,Text_f5b28
+ jp PrintText
+
+Text_f5b17:: ; f5b17 (3d:5b17)
+ TX_FAR _UsedStrengthText ; 2d:417e
+ db $08 ; asm
+ ld a,[wcf91]
+ call PlayCry
+ call Delay3
+ jp TextScriptEnd
+
+Text_f5b28:: ; f5b28 (3d:5b28)
+ TX_FAR _CanMoveBouldersText ; 2d:4193
+ db "@"
+
+CheckForForcedBikeSurf:: ; f5b2d (3d:5b2d)
+ ld hl,wd728
+ set 1,[hl]
+ ld a,[wd732]
+ bit 5,a
+ jr nz,.asm_f5b59
+ ld a,[wCurMap]
+ cp SEAFOAM_ISLANDS_5
+ ret nz
+ CheckBothEventsSet EVENT_SEAFOAM4_BOULDER1_DOWN_HOLE, EVENT_SEAFOAM4_BOULDER2_DOWN_HOLE
+ ret z
+ ld hl,CoordsData_f5b64
+ call ArePlayerCoordsInArray
+ ret nc
+ ld hl,wd728
+ res 1,[hl]
+ ld hl,CurrentTooFastText
+ jp PrintText
+.asm_f5b59
+ ld hl,wd728
+ res 1,[hl]
+ ld hl,CyclingIsFunText
+ jp PrintText
+
+CoordsData_f5b64:: ; f5b64 (3d:5b64)
+ db 11,07
+ db $ff
+
+CurrentTooFastText:: ; f5b67 (3d:5b67)
+ TX_FAR _CurrentTooFastText ; 2d:41ab
+ db "@"
+
+CyclingIsFunText:: ; f5b6c (3d:5b6c)
+ TX_FAR _CyclingIsFunText ; 2d:41ca
+ db "@"
+
+AddItemToInventory_:: ; f5b70 (3d:5b70)
+ ld a,[wItemQuantity] ; a = item quantity
+ push af
+ push bc
+ push de
+ push hl
+ push hl
+ ld d,50 ; PC box can hold 50 items
+ ld a,wNumBagItems & $FF
+ cp l
+ jr nz,.checkIfInventoryFull
+ ld a,wNumBagItems >> 8
+ cp h
+ jr nz,.checkIfInventoryFull
+; if the destination is the bag
+ ld d,20 ; bag can hold 20 items
+.checkIfInventoryFull
+ ld a,[hl]
+ sub d
+ ld d,a
+ ld a,[hli]
+ and a
+ jr z,.addNewItem
+.notAtEndOfInventory
+ ld a,[hli]
+ ld b,a ; b = ID of current item in table
+ ld a,[wcf91] ; a = ID of item being added
+ cp b ; does the current item in the table match the item being added?
+ jp z,.increaseItemQuantity ; if so, increase the item's quantity
+ inc hl
+.loop
+ ld a,[hl]
+ cp a,$ff ; is it the end of the table?
+ jr nz, .notAtEndOfInventory
+.addNewItem ; add an item not yet in the inventory
+ pop hl
+ ld a,d
+ and a ; is there room for a new item slot?
+ jr z,.done
+; if there is room
+ inc [hl] ; increment the number of items in the inventory
+ ld a,[hl] ; the number of items will be the index of the new item
+ add a
+ dec a
+ ld c,a
+ ld b,0
+ add hl,bc ; hl = address to store the item
+ ld a,[wcf91]
+ ld [hli],a ; store item ID
+ ld a,[wItemQuantity]
+ ld [hli],a ; store item quantity
+ ld [hl],$ff ; store terminator
+ jp .success
+.increaseItemQuantity ; increase the quantity of an item already in the inventory
+ ld a,[wItemQuantity]
+ ld b,a ; b = quantity to add
+ ld a,[hl] ; a = existing item quantity
+ add b ; a = new item quantity
+ cp a,100
+ jp c,.storeNewQuantity ; if the new quantity is less than 100, store it
+; if the new quantity is greater than or equal to 100,
+; try to max out the current slot and add the rest in a new slot
+ sub a,99
+ ld [wItemQuantity],a ; a = amount left over (to put in the new slot)
+ ld a,d
+ and a ; is there room for a new item slot?
+ jr z,.increaseItemQuantityFailed
+; if so, store 99 in the current slot and store the rest in a new slot
+ ld a,99
+ ld [hli],a
+ jp .loop
+.increaseItemQuantityFailed
+ pop hl
+ and a
+ jr .done
+.storeNewQuantity
+ ld [hl],a
+ pop hl
+.success
+ scf
+.done
+ pop hl
+ pop de
+ pop bc
+ pop bc
+ ld a,b
+ ld [wItemQuantity],a ; restore the initial value from when the function was called
+ ret
+
+; function to remove an item (in varying quantities) from the player's bag or PC box
+; INPUT:
+; hl = address of inventory (either wNumBagItems or wNumBoxItems)
+; [wWhichPokemon] = index (within the inventory) of the item to remove
+; [wItemQuantity] = quantity to remove
+RemoveItemFromInventory_: ; f5be1 (3d:5be1)
+ push hl
+ inc hl
+ ld a,[wWhichPokemon] ; index (within the inventory) of the item being removed
+ add a
+ add l
+ ld l,a
+ jr nc,.noCarry
+ inc h
+.noCarry
+ inc hl
+ ld a,[wItemQuantity] ; quantity being removed
+ ld e,a
+ ld a,[hl] ; a = current quantity
+ sub e
+ ld [hld],a ; store new quantity
+ ld [wMaxItemQuantity],a
+ and a
+ jr nz,.skipMovingUpSlots
+; if the remaining quantity is 0,
+; remove the emptied item slot and move up all the following item slots
+.moveSlotsUp
+ ld e,l
+ ld d,h
+ inc de
+ inc de ; de = address of the slot following the emptied one
+.loop ; loop to move up the following slots
+ ld a,[de]
+ inc de
+ ld [hli],a
+ cp a,$ff
+ jr nz,.loop
+; update menu info
+ xor a
+ ld [wListScrollOffset],a
+ ld [wCurrentMenuItem],a
+ ld [wBagSavedMenuItem],a
+ ld [wSavedListScrollOffset],a
+ pop hl
+ ld a,[hl] ; a = number of items in inventory
+ dec a ; decrement the number of items
+ ld [hl],a ; store new number of items
+ ld [wListCount],a
+ cp a,2
+ jr c,.done
+ ld [wMaxMenuItem],a
+ jr .done
+.skipMovingUpSlots
+ pop hl
+.done
+ ret
+
+TrainerInfoTextBoxTileGraphics: INCBIN "gfx/trainer_info.2bpp"
+TrainerInfoTextBoxTileGraphicsEnd:
+BlankLeaderNames: INCBIN "gfx/blank_leader_names.2bpp"
+CircleTile: INCBIN "gfx/circle_tile.2bpp"
+BadgeNumbersTileGraphics: INCBIN "gfx/badge_numbers.2bpp"
+
+ReadSuperRodData:: ; f5ea4 (3d:5ea4)
+ ld a,[wCurMap]
+ ld c,a
+ ld hl,FishingSlots
+.loop
+ ld a,[hli]
+ cp $ff
+ jr z,.notfound
+ cp c
+ jr z,.found
+ ld de,$8
+ add hl,de
+ jr .loop
+.found
+ call GenerateRandomFishingEncounter
+ ret
+.notfound
+ ld de,$0
+ ret
+
+GenerateRandomFishingEncounter: ; f5ec1 (3d:5ec1)
+ call Random
+ cp $66
+ jr c,.asm_f5ed6
+ inc hl
+ inc hl
+ cp $b2
+ jr c,.asm_f5ed6
+ inc hl
+ inc hl
+ cp $e5
+ jr c,.asm_f5ed6
+ inc hl
+ inc hl
+.asm_f5ed6
+ ld e,[hl]
+ inc hl
+ ld d,[hl]
+ ret
+
+INCLUDE "data/super_rod.asm"
+INCLUDE "engine/battle/bank3d_battle.asm"
+INCLUDE "engine/items/tm_prices.asm"
+INCLUDE "engine/multiply_divide.asm"
+INCLUDE "engine/give_pokemon.asm"
+INCLUDE "engine/battle/get_trainer_name.asm"
+INCLUDE "engine/random.asm"
+INCLUDE "engine/predefs.asm" \ No newline at end of file