summaryrefslogtreecommitdiff
path: root/engine
diff options
context:
space:
mode:
Diffstat (limited to 'engine')
-rwxr-xr-xengine/anim_hp_bar.asm137
-rw-r--r--engine/battle_start.asm12
-rwxr-xr-xengine/billspctop.asm388
-rw-r--r--engine/color.asm374
-rwxr-xr-xengine/health.asm110
-rwxr-xr-xengine/init_gender.asm2
-rwxr-xr-xengine/items.asm584
-rwxr-xr-xengine/main_menu.asm2
-rw-r--r--engine/map_setup.asm2
-rwxr-xr-xengine/mon_icons.asm25
-rw-r--r--engine/movement.asm8
-rwxr-xr-xengine/namingscreen.asm6
-rw-r--r--engine/party_menu.asm8
-rw-r--r--engine/phone.asm11
-rwxr-xr-xengine/player_movement.asm4
-rwxr-xr-xengine/player_object.asm856
-rwxr-xr-xengine/pokecenter_pc.asm247
-rwxr-xr-xengine/pokegear.asm23
-rwxr-xr-xengine/printnum.asm300
-rwxr-xr-xengine/scrolling_menu.asm6
-rwxr-xr-xengine/sine.asm50
-rwxr-xr-xengine/startmenu.asm88
-rwxr-xr-xengine/tile_events.asm10
-rwxr-xr-xengine/time.asm4
-rwxr-xr-xengine/trade/animation.asm2
25 files changed, 2710 insertions, 549 deletions
diff --git a/engine/anim_hp_bar.asm b/engine/anim_hp_bar.asm
index c00a97921..404e6cbc3 100755
--- a/engine/anim_hp_bar.asm
+++ b/engine/anim_hp_bar.asm
@@ -1,46 +1,46 @@
_AnimateHPBar: ; d627
- call Functiond65f
- jr c, .do_player
- call Functiond670
-.enemy_loop
+ call .IsMaximumMoreThan48Pixels
+ jr c, .MoreThan48Pixels
+ call .ComputePixels
+.ShortAnimLoop
push bc
push hl
- call Functiond6e2
+ call ShortAnim_UpdateVariables
pop hl
pop bc
push af
push bc
push hl
- call Functiond730
- call Functiond7c9
+ call ShortHPBarAnim_UpdateTiles
+ call HPBarAnim_BGMapUpdate
pop hl
pop bc
pop af
- jr nc, .enemy_loop
+ jr nc, .ShortAnimLoop
ret
-.do_player
- call Functiond670
-.player_loop
+.MoreThan48Pixels
+ call .ComputePixels
+.LongAnimLoop
push bc
push hl
- call Functiond6f5
+ call LongAnim_UpdateVariables
pop hl
pop bc
ret c
push af
push bc
push hl
- call Functiond749
- call Functiond7c9
+ call LongHPBarAnim_UpdateTiles
+ call HPBarAnim_BGMapUpdate
pop hl
pop bc
pop af
- jr nc, .player_loop
+ jr nc, .LongAnimLoop
ret
; d65f
-Functiond65f: ; d65f
+.IsMaximumMoreThan48Pixels: ; d65f
ld a, [Buffer2]
and a
jr nz, .player
@@ -55,7 +55,7 @@ Functiond65f: ; d65f
ret
; d670
-Functiond670: ; d670
+.ComputePixels: ; d670
; Buffer1-2: Max HP
; Buffer3-4: Old HP
; Buffer5-6: New HP
@@ -72,7 +72,7 @@ Functiond670: ; d670
pop hl
call ComputeHPBarPixels
ld a, e
- ld [wd1f1], a
+ ld [wCurHPBarPixels], a
ld a, [Buffer5]
ld c, a
@@ -84,7 +84,7 @@ Functiond670: ; d670
ld d, a
call ComputeHPBarPixels
ld a, e
- ld [wd1f2], a
+ ld [wNewHPBarPixels], a
push hl
ld hl, Buffer3
@@ -103,15 +103,15 @@ Functiond670: ; d670
ld a, d
sbc b
ld d, a
- jr c, .asm_d6c1
+ jr c, .negative
ld a, [Buffer3]
ld [wd1f5], a
ld a, [Buffer5]
ld [wd1f6], a
ld bc, 1
- jr .asm_d6d9
+ jr .got_direction
-.asm_d6c1
+.negative
ld a, [Buffer3]
ld [wd1f6], a
ld a, [Buffer5]
@@ -123,8 +123,8 @@ Functiond670: ; d670
ld a, d
xor $ff
ld d, a
- ld bc, rIE
-.asm_d6d9
+ ld bc, -1
+.got_direction
ld a, d
ld [wd1f3], a
ld a, e
@@ -132,25 +132,25 @@ Functiond670: ; d670
ret
; d6e2
-Functiond6e2: ; d6e2
- ld hl, wd1f1
- ld a, [wd1f2]
+ShortAnim_UpdateVariables: ; d6e2
+ ld hl, wCurHPBarPixels
+ ld a, [wNewHPBarPixels]
cp [hl]
- jr nz, .asm_d6ed
+ jr nz, .not_finished
scf
ret
-.asm_d6ed
+.not_finished
ld a, c
add [hl]
ld [hl], a
- call Functiond839
+ call ShortHPBar_CalcPixelFrame
and a
ret
; d6f5
-Functiond6f5: ; d6f5
-.asm_d6f5
+LongAnim_UpdateVariables: ; d6f5
+.loop
ld hl, Buffer3
ld a, [hli]
ld e, a
@@ -158,22 +158,22 @@ Functiond6f5: ; d6f5
ld d, a
ld a, e
cp [hl]
- jr nz, .asm_d707
+ jr nz, .next
inc hl
ld a, d
cp [hl]
- jr nz, .asm_d707
+ jr nz, .next
scf
ret
-.asm_d707
+.next
ld l, e
ld h, d
add hl, bc
ld a, l
ld [Buffer3], a
ld a, h
- ld [wd1ed], a
+ ld [Buffer4], a
push hl
push de
push bc
@@ -186,40 +186,45 @@ Functiond6f5: ; d6f5
ld c, a
ld a, [hli]
ld b, a
+ ; This routine is buggy. The result from ComputeHPBarPixels is stored
+ ; in e. However, the pop de opcode deletes this result before it is even
+ ; used. The game then proceeds as though it never deleted that output.
+ ; To fix, uncomment the line below.
call ComputeHPBarPixels
+ ; ld a, e
pop bc
pop de
pop hl
- ld a, e
- ld hl, wd1f1
+ ld a, e ; Comment or delete this line to fix the above bug.
+ ld hl, wCurHPBarPixels
cp [hl]
- jr z, .asm_d6f5
+ jr z, .loop
ld [hl], a
and a
ret
; d730
-Functiond730: ; d730
- call Functiond784
+ShortHPBarAnim_UpdateTiles: ; d730
+ call HPBarAnim_UpdateHPRemaining
ld d, $6
ld a, [wWhichHPBar]
and $1
ld b, a
- ld a, [wd1f1]
+ ld a, [wCurHPBarPixels]
ld e, a
ld c, a
push de
- call Functiond771
+ call HPBarAnim_RedrawHPBar
pop de
- call Functiond7b4
+ call HPBarAnim_PaletteUpdate
ret
; d749
-Functiond749: ; d749
- call Functiond784
+LongHPBarAnim_UpdateTiles: ; d749
+ call HPBarAnim_UpdateHPRemaining
ld a, [Buffer3]
ld c, a
- ld a, [wd1ed]
+ ld a, [Buffer4]
ld b, a
ld a, [Buffer1]
ld e, a
@@ -232,20 +237,20 @@ Functiond749: ; d749
and $1
ld b, a
push de
- call Functiond771
+ call HPBarAnim_RedrawHPBar
pop de
- call Functiond7b4
+ call HPBarAnim_PaletteUpdate
ret
; d771
-Functiond771: ; d771
+HPBarAnim_RedrawHPBar: ; d771
ld a, [wWhichHPBar]
cp $2
jr nz, .skip
- ld a, $28
+ ld a, 2 * SCREEN_WIDTH
add l
ld l, a
- ld a, $0
+ ld a, 0
adc h
ld h, a
.skip
@@ -253,17 +258,17 @@ Functiond771: ; d771
ret
; d784
-Functiond784: ; d784
+HPBarAnim_UpdateHPRemaining: ; d784
ld a, [wWhichHPBar]
and a
ret z
cp $1
jr z, .load_15
- ld de, $16
+ ld de, SCREEN_WIDTH + 2
jr .loaded_de
.load_15
- ld de, $15
+ ld de, SCREEN_WIDTH + 1
.loaded_de
push hl
add hl, de
@@ -275,7 +280,7 @@ endr
dec hl
ld a, [Buffer3]
ld [StringBuffer2 + 1], a
- ld a, [wd1ed]
+ ld a, [Buffer4]
ld [StringBuffer2], a
ld de, StringBuffer2
lb bc, 2, 3
@@ -284,7 +289,7 @@ endr
ret
; d7b4
-Functiond7b4: ; d7b4
+HPBarAnim_PaletteUpdate: ; d7b4
ld a, [hCGB]
and a
ret z
@@ -296,7 +301,7 @@ Functiond7b4: ; d7b4
ret
; d7c9
-Functiond7c9: ; d7c9
+HPBarAnim_BGMapUpdate: ; d7c9
ld a, [hCGB]
and a
jr nz, .cgb
@@ -312,13 +317,13 @@ Functiond7c9: ; d7c9
jr z, .load_1
ld a, [CurPartyMon]
cp $3
- jr nc, .c_is_1
+ jr nc, .bottom_half_of_screen
ld c, $0
- jr .c_is_0
+ jr .got_third
-.c_is_1
+.bottom_half_of_screen
ld c, $1
-.c_is_0
+.got_third
push af
cp $2
jr z, .skip_delay
@@ -370,14 +375,14 @@ Functiond7c9: ; d7c9
ret
; d839
-Functiond839: ; d839
+ShortHPBar_CalcPixelFrame: ; d839
ld a, [Buffer1]
ld c, a
ld b, 0
ld hl, 0
- ld a, [wd1f1]
+ ld a, [wCurHPBarPixels]
cp 6 * 8
- jr nc, .coppy_buffer
+ jr nc, .return_max
and a
jr z, .return_zero
call AddNTimes
@@ -423,7 +428,7 @@ Functiond839: ; d839
ld [Buffer3], a
ret
-.coppy_buffer
+.return_max
ld a, [Buffer1]
ld [Buffer3], a
ret
diff --git a/engine/battle_start.asm b/engine/battle_start.asm
index 6fb64e9b1..083469b0d 100644
--- a/engine/battle_start.asm
+++ b/engine/battle_start.asm
@@ -1,5 +1,5 @@
Predef_StartBattle: ; 8c20f
- call Function8c26d
+ call .InitGFX
ld a, [rBGP]
ld [wBGP], a
ld a, [rOBP0]
@@ -52,15 +52,15 @@ Predef_StartBattle: ; 8c20f
ret
; 8c26d
-Function8c26d: ; 8c26d
+.InitGFX: ; 8c26d
ld a, [wLinkMode]
cp LINK_MOBILE
jr z, .mobile
callba Function6454
call UpdateSprites
call DelayFrame
- call Function8c2a0
- call Function8cf4f
+ call .NonMobile_LoadPokeballTiles
+ call BattleStart_LoadEDTile
jr .resume
.mobile
@@ -81,7 +81,7 @@ Function8c26d: ; 8c26d
ret
; 8c2a0
-Function8c2a0: ; 8c2a0
+.NonMobile_LoadPokeballTiles: ; 8c2a0
call LoadTrainerBattlePokeballTiles
hlbgcoord 0, 0
call Function8c2cf
@@ -663,7 +663,7 @@ StartTrainerBattle_LoadPokeBallGraphics: ; 8c5dc (23:45dc)
ld a, $1
ld [hCGBPalUpdate], a
call DelayFrame
- call Function8cf4f
+ call BattleStart_LoadEDTile
.nextscene: ; 8c673 (23:4673)
call StartTrainerBattle_NextScene
diff --git a/engine/billspctop.asm b/engine/billspctop.asm
new file mode 100755
index 000000000..038341ccc
--- /dev/null
+++ b/engine/billspctop.asm
@@ -0,0 +1,388 @@
+_BillsPC: ; e3fd
+ call .CheckCanUsePC
+ ret c
+ call .LogIn
+ call .UseBillsPC
+ jp .LogOut
+
+.CheckCanUsePC: ; e40a (3:640a)
+ ld a, [PartyCount]
+ and a
+ ret nz
+ ld hl, .Text_GottaHavePokemon
+ call MenuTextBoxBackup
+ scf
+ ret
+
+.Text_GottaHavePokemon: ; 0xe417
+ ; You gotta have #MON to call!
+ text_jump UnknownText_0x1c1006
+ db "@"
+
+.LogIn: ; e41c (3:641c)
+ xor a
+ ld [hBGMapMode], a
+ call LoadStandardMenuDataHeader
+ call ClearPCItemScreen
+ ld hl, Options
+ ld a, [hl]
+ push af
+ set NO_TEXT_SCROLL, [hl]
+ ld hl, .Text_What
+ call PrintText
+ pop af
+ ld [Options], a
+ call LoadFontsBattleExtra
+ ret
+
+.Text_What: ; 0xe43a
+ ; What?
+ text_jump UnknownText_0x1c1024
+ db "@"
+
+.LogOut: ; e43f (3:643f)
+ call CloseSubmenu
+ ret
+
+.UseBillsPC: ; e443 (3:6443)
+ ld hl, .MenuDataHeader
+ call LoadMenuDataHeader
+ ld a, $1
+.loop
+ ld [wMenuCursorBuffer], a
+ call SetPalettes
+ xor a
+ ld [wWhichIndexSet], a
+ ld [hBGMapMode], a
+ call DoNthMenu
+ jr c, .cancel
+ ld a, [wMenuCursorBuffer]
+ push af
+ ld a, [MenuSelection]
+ ld hl, .Jumptable
+ rst JumpTable
+ pop bc
+ ld a, b
+ jr nc, .loop
+.cancel
+ call CloseWindow
+ ret
+
+.MenuDataHeader: ; 0xe46f
+ db $40 ; flags
+ db 00, 00 ; start coords
+ db 17, 19 ; end coords
+ dw .MenuData2
+ db 1 ; default option
+
+.MenuData2: ; 0xe477
+ db $80 ; flags
+ db 0 ; items
+ dw .items
+ dw PlaceMenuStrings
+ dw .strings
+
+.strings: ; e47f
+ db "WITHDRAW <PK><MN>@"
+ db "DEPOSIT <PK><MN>@"
+ db "CHANGE BOX@"
+ db "MOVE <PK><MN> W/O MAIL@"
+ db "SEE YA!@"
+
+.Jumptable: ; e4ba (3:64ba)
+ dw BillsPC_WithdrawMenu
+ dw BillsPC_DepositMenu
+ dw BillsPC_ChangeBoxMenu
+ dw BillsPC_MovePKMNMenu
+ dw BillsPC_SeeYa
+
+.items: ; e4c4
+ db 5
+ db 0 ; WITHDRAW
+ db 1; DEPOSIT
+ db 2 ; CHANGE BOX
+ db 3 ; MOVE PKMN
+ db 4 ; SEE YA!
+ db -1
+
+BillsPC_SeeYa: ; e4cb
+ scf
+ ret
+
+BillsPC_MovePKMNMenu: ; e4cd
+ call LoadStandardMenuDataHeader
+ callba IsAnyMonHoldingMail
+ jr nc, .no_mail
+ ld hl, .Text_MonHoldingMail
+ call PrintText
+ jr .quit
+
+.no_mail
+ callba StartMovePkmnWOMail_SaveGame
+ jr c, .quit
+ callba _MovePKMNWithoutMail
+ call ReturnToMapFromSubmenu
+ call ClearPCItemScreen
+
+.quit
+ call CloseWindow
+ and a
+ ret
+
+.Text_MonHoldingMail: ; 0xe4f9
+ ; There is a #MON holding MAIL. Please remove the MAIL.
+ text_jump UnknownText_0x1c102b
+ db "@"
+
+BillsPC_DepositMenu: ; e4fe (3:64fe)
+ call LoadStandardMenuDataHeader
+ callba _DepositPKMN
+ call ReturnToMapFromSubmenu
+ call ClearPCItemScreen
+ call CloseWindow
+ and a
+ ret
+
+Functione512: ; unused
+ ld a, [PartyCount]
+ and a
+ jr z, .no_pkmn
+ cp 2
+ jr c, .only_one_pkmn
+ and a
+ ret
+
+.no_pkmn
+ ld hl, .Text_NoPKMN
+ call MenuTextBoxBackup
+ scf
+ ret
+
+.only_one_pkmn
+ ld hl, .Text_ItsYourLastPKMN
+ call MenuTextBoxBackup
+ scf
+ ret
+
+.Text_NoPKMN: ; 0xe52e
+ ; You don't have a single #MON!
+ text_jump UnknownText_0x1c1062
+ db "@"
+
+.Text_ItsYourLastPKMN: ; 0xe533
+ ; You can't deposit your last #MON!
+ text_jump UnknownText_0x1c1080
+ db "@"
+
+CheckCurPartyMonFainted: ; e538
+ ld hl, PartyMon1HP
+ ld de, PARTYMON_STRUCT_LENGTH
+ ld b, $0
+.loop
+ ld a, [CurPartyMon]
+ cp b
+ jr z, .skip
+ ld a, [hli]
+ or [hl]
+ jr nz, .notfainted
+ dec hl
+
+.skip
+ inc b
+ ld a, [PartyCount]
+ cp b
+ jr z, .done
+ add hl, de
+ jr .loop
+
+.done
+ scf
+ ret
+
+.notfainted
+ and a
+ ret
+
+BillsPC_WithdrawMenu: ; e559 (3:6559)
+ call LoadStandardMenuDataHeader
+ callba _WithdrawPKMN
+ call ReturnToMapFromSubmenu
+ call ClearPCItemScreen
+ call CloseWindow
+ and a
+ ret
+
+Functione56d: ; unused
+ ld a, [PartyCount]
+ cp PARTY_LENGTH
+ jr nc, .asm_e576
+ and a
+ ret
+
+.asm_e576
+ ld hl, UnknownText_0xe57e
+ call MenuTextBoxBackup
+ scf
+ ret
+
+UnknownText_0xe57e: ; 0xe57e
+ ; You can't take any more #MON.
+ text_jump UnknownText_0x1c10a2
+ db "@"
+
+BillsPC_ChangeBoxMenu: ; e583 (3:6583)
+ callba _ChangeBox
+ and a
+ ret
+
+ClearPCItemScreen: ; e58b
+ call DisableSpriteUpdates
+ xor a
+ ld [hBGMapMode], a
+ call ClearBGPalettes
+ call ClearSprites
+ hlcoord 0, 0
+ ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
+ ld a, " "
+ call ByteFill
+ hlcoord 0,0
+ lb bc, 10, 18
+ call TextBox
+ hlcoord 0,12
+ lb bc, 4, 18
+ call TextBox
+ call WaitBGMap2
+ call SetPalettes ; load regular palettes?
+ ret
+
+CopyBoxmonToTempMon: ; e5bb
+ ld a, [CurPartyMon]
+ ld hl, sBoxMon1Species
+ ld bc, BOXMON_STRUCT_LENGTH
+ call AddNTimes
+ ld de, TempMonSpecies
+ ld bc, BOXMON_STRUCT_LENGTH
+ ld a, BANK(sBoxMon1Species)
+ call GetSRAMBank
+ call CopyBytes
+ call CloseSRAM
+ ret
+
+Functione5d9: ; unreferenced
+ ld a, [wCurBox]
+ cp b
+ jr z, .same_box
+ ld a, b
+ ld hl, .BoxAddrs
+ ld bc, 3
+ call AddNTimes
+ ld a, [hli]
+ push af
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ pop af
+ jr .okay
+
+.same_box
+ ld a, BANK(sBoxCount)
+ ld hl, sBoxCount
+
+.okay
+ call GetSRAMBank
+ ld a, [hl]
+ ld bc, 1 + MONS_PER_BOX + 1
+ add hl, bc
+ ld b, a
+ ld c, $0
+ ld de, wc608
+ ld a, b
+ and a
+ jr z, .empty_box
+.loop
+ push hl
+ push bc
+ ld a, c
+ ld bc, 0
+ add hl, bc
+ ld bc, BOXMON_STRUCT_LENGTH
+ call AddNTimes
+ ld a, [hl]
+ ld [de], a
+ inc de
+ ld [CurSpecies], a
+ call GetBaseData
+ pop bc
+ pop hl
+
+ push hl
+ push bc
+ ld a, c
+ ld bc, MONS_PER_BOX * (BOXMON_STRUCT_LENGTH + NAME_LENGTH)
+ add hl, bc
+ call SkipNames
+ call CopyBytes
+ pop bc
+ pop hl
+
+ push hl
+ push bc
+ ld a, c
+ ld bc, MON_LEVEL
+ add hl, bc
+ ld bc, BOXMON_STRUCT_LENGTH
+ call AddNTimes
+ ld a, [hl]
+ ld [de], a
+ inc de
+ pop bc
+ pop hl
+
+ push hl
+ push bc
+ ld a, c
+ ld bc, MON_DVS
+ add hl, bc
+ ld bc, BOXMON_STRUCT_LENGTH
+ call AddNTimes
+ ld a, [hli]
+ and $f0
+ ld b, a
+ ld a, [hl]
+ and $f0
+ swap a
+ or b
+ ld b, a
+ ld a, [BaseGender]
+ cp b
+ ld a, $1
+ jr c, .okay2
+ xor a
+.okay2
+ ld [de], a
+ inc de
+ pop bc
+ pop hl
+
+ inc c
+ dec b
+ jr nz, .loop
+.empty_box
+ call CloseSRAM
+ ret
+
+.BoxAddrs: ; e66e
+ dba sBox1
+ dba sBox2
+ dba sBox3
+ dba sBox4
+ dba sBox5
+ dba sBox6
+ dba sBox7
+ dba sBox8
+ dba sBox9
+ dba sBox10
+ dba sBox11
+ dba sBox12
+ dba sBox13
+ dba sBox14
diff --git a/engine/color.asm b/engine/color.asm
index 57f616955..435f0e57b 100644
--- a/engine/color.asm
+++ b/engine/color.asm
@@ -5,10 +5,8 @@ SHINY_ATK_BIT EQU 5
SHINY_DEF_VAL EQU 10
SHINY_SPD_VAL EQU 10
SHINY_SPC_VAL EQU 10
-LO_NYBBLE EQU $0f
-HI_NYBBLE EQU $f0
-CheckShininess: ; 8a68
+CheckShininess:
; Check if a mon is shiny by DVs at bc.
; Return carry if shiny.
@@ -22,19 +20,19 @@ CheckShininess: ; 8a68
; Defense
ld a, [hli]
- and LO_NYBBLE
+ and $f
cp SHINY_DEF_VAL
jr nz, .NotShiny
; Speed
ld a, [hl]
- and HI_NYBBLE
+ and $f0
cp SHINY_SPD_VAL << 4
jr nz, .NotShiny
; Special
ld a, [hl]
- and LO_NYBBLE
+ and $f
cp SHINY_SPC_VAL
jr nz, .NotShiny
@@ -45,10 +43,8 @@ CheckShininess: ; 8a68
.NotShiny
and a
ret
-; 8a88
-
-CheckContestMon: ; 8a88
+CheckContestMon:
; Check a mon's DVs at hl in the bug catching contest.
; Return carry if its DVs are good enough to place in the contest.
@@ -59,7 +55,7 @@ CheckContestMon: ; 8a88
; Defense
ld a, [hli]
- and LO_NYBBLE
+ and $f
cp 10
jr c, .Bad
@@ -70,7 +66,7 @@ CheckContestMon: ; 8a88
; Special
ld a, [hl]
- and LO_NYBBLE
+ and $f
cp 10
jr c, .Bad
@@ -81,10 +77,8 @@ CheckContestMon: ; 8a88
.Bad
and a
ret
-; 8aa4
-
-Function8aa4: ; 8aa4
+Function8aa4:
push de
push bc
ld hl, PalPacket_9ce6
@@ -106,16 +100,13 @@ Function8aa4: ; 8aa4
ld hl, BlkPacket_9a86
call Function9809
ret
-; 8ad1
-
-InitPartyMenuPalettes: ; 8ad1
+InitPartyMenuPalettes:
ld hl, PalPacket_9c56 + 1
call CopyFourPalettes
call InitPartyMenuOBPals
call WipeAttrMap
ret
-; 8ade
SGB_ApplyPartyMenuHPPals: ; 8ade SGB layout $fc
ld hl, wHPPals
@@ -142,9 +133,8 @@ SGB_ApplyPartyMenuHPPals: ; 8ade SGB layout $fc
pop de
ld [hl], e
ret
-; 8b07
-Function8b07: ; 8b07
+Function8b07:
; Unreferenced
call CheckCGB
ret z
@@ -177,9 +167,7 @@ Function8b07: ; 8b07
RGB 08, 16, 28
RGB 00, 00, 00
-; 8b3f
-
-Function8b3f: ; 8b3f
+Function8b3f:
; Unreferenced
call CheckCGB
ret nz
@@ -188,9 +176,8 @@ Function8b3f: ; 8b3f
ret z
ld hl, BlkPacket_9a86
jp Function9809
-; 8b4d
-Function8b4d: ; 8b4d
+Function8b4d:
call CheckCGB
jr nz, .cgb
ld a, [hSGB]
@@ -204,9 +191,8 @@ Function8b4d: ; 8b4d
ld a, $3b
call GetPredefPal
jp LoadHLPaletteIntoDE
-; 8b67
-Function8b67: ; 8b67
+Function8b67:
call CheckCGB
jr nz, .cgb
ld a, [hSGB]
@@ -220,9 +206,8 @@ Function8b67: ; 8b67
ld a, $3c
call GetPredefPal
jp LoadHLPaletteIntoDE
-; 8b81
-Function8b81: ; 8b81
+Function8b81:
call CheckCGB
jr nz, .asm_8bb2
ld a, [hSGB]
@@ -253,9 +238,8 @@ Function8b81: ; 8b81
call GetMonPalettePointer_
call LoadPalette_White_Col1_Col2_Black
ret
-; 8bbd
-Function8bbd: ; 8bbd
+Function8bbd:
ld a, [TrainerClass]
call GetTrainerPalettePointer
ld a, e
@@ -290,9 +274,8 @@ asm_8bd7
pop hl
call LoadPalette_White_Col1_Col2_Black
ret
-; 8bec
-Function8bec: ; 8bec
+Function8bec:
ld a, [hCGB]
and a
jr nz, .asm_8bf7
@@ -321,9 +304,8 @@ Function8bec: ; 8bec
call FillBoxCGB
call LoadEDTile
ret
-; 8c1d
-ApplyMonOrTrainerPals: ; 8c1d
+ApplyMonOrTrainerPals:
call CheckCGB
ret z
ld a, e
@@ -344,9 +326,8 @@ ApplyMonOrTrainerPals: ; 8c1d
call ApplyAttrMap
call ApplyPals
ret
-; 8c43
-ApplyHPBarPals: ; 8c43
+ApplyHPBarPals:
ld a, [wWhichHPBar]
and a
jr z, .Enemy
@@ -395,9 +376,8 @@ ApplyHPBarPals: ; 8c43
ld a, e
call FillBoxCGB
ret
-; 8c8a
-LoadStatsScreenPals: ; 8c8a
+LoadStatsScreenPals:
call CheckCGB
ret z
ld hl, StatsScreenPals
@@ -420,9 +400,8 @@ LoadStatsScreenPals: ; 8c8a
call ApplyPals
ld a, $1
ret
-; 8cb4
-Function8cb4: ; 8cb4
+Function8cb4:
ld l, e
ld h, 0
rept 3
@@ -463,9 +442,8 @@ endr
call WipeAttrMap
call ApplyAttrMap
ret
-; 8d05
-Palettes_8d05: ; 8d05
+Palettes_8d05:
RGB 20, 31, 11
RGB 31, 19, 00
RGB 31, 10, 09
@@ -516,12 +494,9 @@ Palettes_8d05: ; 8d05
RGB 00, 21, 00
RGB 00, 00, 00
-; 8d55
-
INCLUDE "predef/cgb.asm"
-
-Function95f0: ; 95f0
+Function95f0:
ld hl, Palette_9608
ld de, UnknBGPals
ld bc, 8
@@ -531,22 +506,18 @@ Function95f0: ; 95f0
call WipeAttrMap
call ApplyAttrMap
ret
-; 9608
-Palette_9608: ; 9608
+Palette_9608:
RGB 31, 31, 31
RGB 09, 31, 31
RGB 10, 12, 31
RGB 00, 03, 19
-; 9610
-
-
-CopyFourPalettes: ; 9610
+CopyFourPalettes:
ld de, UnknBGPals
ld c, $4
-CopyPalettes: ; 9615
+CopyPalettes:
.loop
push bc
ld a, [hli]
@@ -559,9 +530,8 @@ CopyPalettes: ; 9615
dec c
jr nz, .loop
ret
-; 9625
-GetPredefPal: ; 9625
+GetPredefPal:
ld l, a
ld h, $0
rept 3 ; multiply by 8
@@ -570,9 +540,8 @@ endr
ld bc, Palettes_9df6
add hl, bc
ret
-; 9630
-LoadHLPaletteIntoDE: ; 9630
+LoadHLPaletteIntoDE:
ld a, [rSVBK]
push af
ld a, $5
@@ -587,9 +556,8 @@ LoadHLPaletteIntoDE: ; 9630
pop af
ld [rSVBK], a
ret
-; 9643
-LoadPalette_White_Col1_Col2_Black: ; 9643
+LoadPalette_White_Col1_Col2_Black:
ld a, [rSVBK]
push af
ld a, $5
@@ -619,9 +587,8 @@ LoadPalette_White_Col1_Col2_Black: ; 9643
pop af
ld [rSVBK], a
ret
-; 9663
-FillBoxCGB: ; 9663
+FillBoxCGB:
.row
push bc
push hl
@@ -636,9 +603,8 @@ FillBoxCGB: ; 9663
dec b
jr nz, .row
ret
-; 9673
-Function9673: ; 9673
+Function9673:
push af
push bc
push de
@@ -667,27 +633,23 @@ endr
pop bc
pop af
ret
-; 9699
-
-WipeAttrMap: ; 9699
+WipeAttrMap:
hlcoord 0, 0, AttrMap
ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
xor a
call ByteFill
ret
-; 96a4
-ApplyPals: ; 96a4
+ApplyPals:
ld hl, UnknBGPals
ld de, BGPals
ld bc, 16 palettes
ld a, $5
call FarCopyWRAM
ret
-; 96b3
-ApplyAttrMap: ; 96b3
+ApplyAttrMap:
ld a, [rLCDC]
bit 7, a
jr z, .UpdateVBank1
@@ -728,7 +690,6 @@ ApplyAttrMap: ; 96b3
ld a, $0
ld [rVBK], a
ret
-; 96f3
CGB_ApplyPartyMenuHPPals: ; 96f3 CGB layout $fc
ld hl, wHPPals
@@ -755,19 +716,16 @@ CGB_ApplyPartyMenuHPPals: ; 96f3 CGB layout $fc
ld a, e
call FillBoxCGB
ret
-; 971a
-
-InitPartyMenuOBPals: ; 971a
+InitPartyMenuOBPals:
ld hl, Palettes_b681
ld de, UnknOBPals
ld bc, 2 palettes
ld a, $5
call FarCopyWRAM
ret
-; 9729
-GetBattlemonBackpicPalettePointer: ; 9729
+GetBattlemonBackpicPalettePointer:
push de
callba GetPartyMonDVs
ld c, l
@@ -776,9 +734,8 @@ GetBattlemonBackpicPalettePointer: ; 9729
call GetPlayerOrMonPalettePointer
pop de
ret
-; 973a
-GetEnemyFrontpicPalettePointer: ; 973a
+GetEnemyFrontpicPalettePointer:
push de
callba GetEnemyMonDVs
ld c, l
@@ -787,9 +744,8 @@ GetEnemyFrontpicPalettePointer: ; 973a
call GetFrontpicPalettePointer
pop de
ret
-; 974b
-GetPlayerOrMonPalettePointer: ; 974b
+GetPlayerOrMonPalettePointer:
and a
jp nz, GetMonNormalOrShinyPalettePointer
ld a, [wPlayerSpriteSetupFlags]
@@ -804,14 +760,13 @@ GetPlayerOrMonPalettePointer: ; 974b
.male
ld hl, PlayerPalette
ret
-; 9764
-GetFrontpicPalettePointer: ; 9764
+GetFrontpicPalettePointer:
and a
jp nz, GetMonNormalOrShinyPalettePointer
ld a, [TrainerClass]
-GetTrainerPalettePointer: ; 976b
+GetTrainerPalettePointer:
ld l, a
ld h, 0
add hl,hl
@@ -819,14 +774,12 @@ GetTrainerPalettePointer: ; 976b
ld bc, TrainerPalettes
add hl, bc
ret
-; 9775
-GetMonPalettePointer_: ; 9775
+GetMonPalettePointer_:
call GetMonPalettePointer
ret
-; 9779
-Function9779: mobile ; 9779
+Function9779: mobile
call CheckCGB
ret z
ld hl, Palettes_979c
@@ -844,9 +797,8 @@ Function9779: mobile ; 9779
ld a, $5
call FarCopyWRAM
ret
-; 979c
-Palettes_979c: ; 979c
+Palettes_979c:
RGB 31, 31, 31
RGB 25, 25, 25
RGB 13, 13, 13
@@ -877,9 +829,7 @@ Palettes_979c: ; 979c
RGB 20, 15, 03
RGB 00, 00, 00
-; 97cc
-
-Function97cc: ; 97cc
+Function97cc:
call CheckCGB
ret z
ld a, $90
@@ -891,9 +841,8 @@ Function97cc: ; 97cc
call GetPredefPal
call Function97e5
ret
-; 97e5
-Function97e5: ; 97e5
+Function97e5:
ld c, 1 palettes
.loop
ld a, [hli]
@@ -901,9 +850,8 @@ Function97e5: ; 97e5
dec c
jr nz, .loop
ret
-; 97ee
-GetMonPalettePointer: ; 97ee
+GetMonPalettePointer:
ld l, a
ld h, $0
rept 3
@@ -912,9 +860,8 @@ endr
ld bc, PokemonPalettes
add hl, bc
ret
-; 97f9
-GetMonNormalOrShinyPalettePointer: ; 97f9
+GetMonNormalOrShinyPalettePointer:
push bc
call GetMonPalettePointer
pop bc
@@ -926,9 +873,8 @@ rept 4
inc hl
endr
ret
-; 9809
-Function9809: ; 9809
+Function9809:
ld a, [wcfbe]
push af
set 7, a
@@ -937,9 +883,8 @@ Function9809: ; 9809
pop af
ld [wcfbe], a
ret
-; 981a
-PushSGBPals: ; 981a
+PushSGBPals:
ld a, [hl]
and $7
ret z
@@ -978,9 +923,8 @@ PushSGBPals: ; 981a
dec b
jr nz, .loop
ret
-; 9853
-Function9853: ; 9853
+Function9853:
call CheckCGB
ret nz
di
@@ -1010,10 +954,8 @@ Function9853: ; 9853
ld [wcfbe], a
ei
ret
-; 9890
-
-Function9890:: ; 9890
+Function9890::
call CheckCGB
ret z
ld a, $1
@@ -1066,9 +1008,8 @@ Function9890:: ; 9890
dec c
jr nz, .loop
ret
-; 98eb
-Function98eb: ; 98eb
+Function98eb:
ld hl, .PalPacketPointerTable
ld c, 9
.loop
@@ -1084,9 +1025,8 @@ Function98eb: ; 98eb
dec c
jr nz, .loop
ret
-; 98ff
-.PalPacketPointerTable: ; 98ff
+.PalPacketPointerTable:
dw PalPacket_9d56
dw PalPacket_9d76
dw PalPacket_9d86
@@ -1096,9 +1036,8 @@ Function98eb: ; 98eb
dw PalPacket_9dc6
dw PalPacket_9dd6
dw PalPacket_9de6
-; 9911
-Function9911: ; 9911
+Function9911:
di
xor a
ld [rJOYP], a
@@ -1111,32 +1050,28 @@ Function9911: ; 9911
call PushSGBPals
ei
ret
-; 992c
-Function992c: ; 992c
+Function992c:
call .LoadSGBBorderPointers
push de
call Function9a24
pop hl
call Function99d8
ret
-; 9938
-.LoadSGBBorderPointers: ; 9938
+.LoadSGBBorderPointers:
ld hl, SGBBorder
ld de, SGBBorderMap
ret
-; 993f
-Function993f: ; 993f
+Function993f:
ld hl, VTiles0
ld bc, $2000
xor a
call ByteFill
ret
-; 994a
-Function994a: ; 994a
+Function994a:
ld hl, PalPacket_9d26
call PushSGBPals
call SGBDelayCycles
@@ -1180,15 +1115,13 @@ endr
call Function99ab
scf
ret
-; 99ab
-Function99ab: ; 99ab
+Function99ab:
ld hl, PalPacket_9d16
call PushSGBPals
jp SGBDelayCycles
-; 99b4
-Function99b4: ; 99b4
+Function99b4:
call DisableLCD
ld a, $e4
ld [rBGP], a
@@ -1204,9 +1137,8 @@ Function99b4: ; 99b4
xor a
ld [rBGP], a
ret
-; 99d8
-Function99d8: ; 99d8
+Function99d8:
call DisableLCD
ld a, $e4
ld [rBGP], a
@@ -1239,9 +1171,8 @@ Function99d8: ; 99d8
xor a
ld [rBGP], a
ret
-; 9a24
-Function9a24: ; 9a24
+Function9a24:
call DisableLCD
ld a, %11100100
ld [rBGP], a
@@ -1264,7 +1195,6 @@ Function9a24: ; 9a24
xor a
ld [rBGP], a
ret
-; 9a52
CopyData: ; 0x9a52
; copy bc bytes of data from hl to de
@@ -1310,7 +1240,7 @@ DrawDefaultTiles: ; 0x9a64
ret
; 0x9a7a
-SGBDelayCycles: ; 9a7a
+SGBDelayCycles:
ld de, 7000
.wait
nop
@@ -1321,51 +1251,47 @@ SGBDelayCycles: ; 9a7a
or e
jr nz, .wait
ret
-; 9a86
-BlkPacket_9a86: ; 9a86
+BlkPacket_9a86:
db $21, $01, $03, $00, $00, $00, $13, $11, $00, $00, $00, $00, $00, $00, $00, $00
-BlkPacket_9a96: ; 9a96
+BlkPacket_9a96:
db $21, $01, $07, $05, $00, $0a, $13, $0d, $00, $00, $00, $00, $00, $00, $00, $00
-BlkPacket_9aa6: ; 9a86
+BlkPacket_9aa6:
db $22, $05, $07, $0a, $00, $0c, $13, $11, $03, $05, $01, $00, $0a, $03, $03, $00
db $0a, $08, $13, $0a, $03, $0a, $00, $04, $08, $0b, $03, $0f, $0b, $00, $13, $07
-BlkPacket_9ac6: ; 9a86
+BlkPacket_9ac6:
db $21, $01, $07, $05, $00, $01, $07, $07, $00, $00, $00, $00, $00, $00, $00, $00
-BlkPacket_9ad6: ; 9a86
+BlkPacket_9ad6:
db $21, $01, $07, $05, $0b, $01, $13, $02, $00, $00, $00, $00, $00, $00, $00, $00
-BlkPacket_9ae6: ; 9a86
+BlkPacket_9ae6:
db $21, $01, $07, $05, $01, $01, $08, $08, $00, $00, $00, $00, $00, $00, $00, $00
-BlkPacket_9af6: ; 9a86
+BlkPacket_9af6:
db $21, $01, $07, $05, $07, $05, $0d, $0b, $00, $00, $00, $00, $00, $00, $00, $00
-BlkPacket_9b06: ; 9a86
+BlkPacket_9b06:
db $22, $05, $03, $05, $00, $00, $13, $0b, $03, $0a, $00, $04, $13, $09, $02, $0f
db $00, $06, $13, $07, $03, $00, $04, $04, $0f, $09, $03, $00, $00, $0c, $13, $11
-BlkPacket_9b26: ; 9a86
+BlkPacket_9b26:
db $23, $07, $07, $10, $00, $00, $02, $0c, $02, $00, $0c, $00, $12, $01, $02, $00
db $0c, $02, $12, $03, $02, $00, $0c, $04, $12, $05, $02, $00, $0c, $06, $12, $07
db $02, $00, $0c, $08, $12, $09, $02, $00, $0c, $0a, $12, $0b, $00, $00, $00, $00
-BlkPacket_9b56: ; 9a86
+BlkPacket_9b56:
db $22, $03, $07, $20, $00, $00, $13, $04, $03, $0f, $00, $06, $13, $11, $03, $05
db $0f, $01, $12, $04, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
-BlkPacket_9b76: ; 9a86
+BlkPacket_9b76:
db $21, $01, $07, $10, $00, $00, $13, $05, $00, $00, $00, $00, $00, $00, $00, $00
-BlkPacket_9b86: ; 9a86
+BlkPacket_9b86:
db $21, $02, $07, $0a, $00, $04, $13, $0d, $03, $05, $00, $06, $13, $0b, $00, $00
-; 9b96
-
-; 9b96
PalPacket_9b96: db $51, $48, $00, $49, $00, $4a, $00, $4b, $00, $00, $00, $00, $00, $00, $00, $00
PalPacket_9ba6: db $51, $2b, $00, $24, $00, $20, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
@@ -1405,9 +1331,8 @@ PalPacket_9db6: db $79, $31, $08, $00, $0b, $0c, $a5, $ca, $c9, $7e, $d0, $06, $
PalPacket_9dc6: db $79, $26, $08, $00, $0b, $39, $cd, $48, $0c, $d0, $34, $a5, $c9, $c9, $80, $d0
PalPacket_9dd6: db $79, $1b, $08, $00, $0b, $ea, $ea, $ea, $ea, $ea, $a9, $01, $cd, $4f, $0c, $d0
PalPacket_9de6: db $79, $10, $08, $00, $0b, $4c, $20, $08, $ea, $ea, $ea, $ea, $ea, $60, $ea, $ea
-; 9df6
-Palettes_9df6: ; 9df6
+Palettes_9df6:
RGB 31, 31, 31
RGB 22, 25, 19
RGB 16, 21, 30
@@ -1803,9 +1728,7 @@ Palettes_9df6: ; 9df6
RGB 21, 21, 21
RGB 31, 31, 31
-; a06e
-
-SGBBorderMap: ; a06e
+SGBBorderMap:
db $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $14,$14, $15,$14, $16,$14, $17,$14, $17,$54, $16,$54, $15,$54, $14,$54, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14
db $01,$14, $02,$14, $03,$14, $03,$54, $02,$54, $01,$54, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $24,$14, $25,$14, $26,$14, $07,$14, $07,$54, $26,$54, $25,$54, $24,$54, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$54, $01,$14, $02,$14, $03,$14, $03,$54, $02,$54, $01,$54
db $11,$14, $12,$14, $13,$14, $13,$54, $12,$54, $11,$54, $10,$54, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $24,$14, $34,$14, $35,$14, $35,$54, $34,$54, $33,$54, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $10,$14, $11,$14, $12,$14, $13,$14, $13,$54, $12,$54, $11,$54
@@ -1834,9 +1757,8 @@ SGBBorderMap: ; a06e
db $25,$14, $26,$14, $07,$14, $07,$54, $26,$54, $25,$54, $24,$54, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $01,$14, $02,$14, $03,$14, $03,$54, $02,$54, $01,$54, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $24,$14, $25,$14, $26,$14, $07,$14, $07,$54, $26,$54, $25,$54
db $33,$14, $34,$14, $35,$14, $35,$54, $34,$54, $24,$54, $07,$54, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $10,$14, $11,$14, $12,$14, $13,$14, $13,$54, $12,$54, $11,$54, $10,$54, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $24,$14, $34,$14, $35,$14, $35,$54, $34,$54, $33,$54
db $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $20,$14, $21,$14, $22,$14, $23,$14, $23,$54, $22,$54, $21,$54, $20,$54, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14, $07,$14
-; a49e
-SGBBorderPalettes: ; a49e
+SGBBorderPalettes:
RGB 24, 06, 06
RGB 24, 24, 26
RGB 14, 15, 20
@@ -1917,13 +1839,10 @@ SGBBorderPalettes: ; a49e
RGB 31, 31, 25
RGB 31, 31, 25
-; a51e
-
-SGBBorder: ; a51e
+SGBBorder:
INCBIN "gfx/misc/sgb_border.2bpp"
-; a8be
-Palettes_a8be: ; a8be
+Palettes_a8be:
RGB 30, 26, 15
RGB 00, 23, 00
@@ -1933,23 +1852,19 @@ Palettes_a8be: ; a8be
RGB 30, 26, 15
RGB 31, 00, 00
-Palettes_a8ca: ; a8ca
+Palettes_a8ca:
RGB 30, 26, 15
RGB 04, 17, 31
-; a8ce
-; a8ce
INCLUDE "gfx/pics/palette_pointers.asm"
-; b0ce
-; b0ce
INCLUDE "gfx/trainers/palette_pointers.asm"
-; b1de
-LoadMapPals: ; b1de
+LoadMapPals:
callba LoadSpecialMapPalette
jr c, .got_pals
+ ; Which palette group is based on whether we're outside or inside
ld a, [wPermission]
and 7
ld e, a
@@ -1960,16 +1875,18 @@ LoadMapPals: ; b1de
ld a, [hli]
ld h, [hl]
ld l, a
+ ; Futher refine by time of day
ld a, [TimeOfDayPal]
and 3
-rept 3
add a
-endr
+ add a
+ add a
ld e, a
ld d, 0
add hl, de
ld e, l
ld d, h
+ ; Switch to palettes WRAM bank
ld a, [rSVBK]
push af
ld a, $5
@@ -1977,14 +1894,14 @@ endr
ld hl, UnknBGPals
ld b, 8
.outer_loop
- ld a, [de]
+ ld a, [de] ; lookup index for TilesetBGPalette
push de
push hl
ld l, a
ld h, 0
-rept 3
- add hl,hl
-endr
+ add hl, hl
+ add hl, hl
+ add hl, hl
ld de, TilesetBGPalette
add hl, de
ld e, l
@@ -2042,43 +1959,41 @@ endr
ld a, $5
call FarCopyWRAM
ret
-; b279
-
-.TilesetColorsPointers: ; b279
- dw TilesetColors1
- dw TilesetColors1
- dw TilesetColors1
- dw TilesetColors2
- dw TilesetColors3
- dw TilesetColors4
- dw TilesetColors2
- dw TilesetColors3
-; b289
-
-TilesetColors1: ; b289
- db $00, $01, $02, $28, $04, $05, $06, $07
- db $08, $09, $0a, $28, $0c, $0d, $0e, $0f
- db $10, $11, $12, $29, $14, $15, $16, $17
- db $18, $19, $1a, $1b, $1c, $1d, $1e, $1f
-
-TilesetColors2: ; b289
- db $20, $21, $22, $23, $24, $25, $26, $07
- db $20, $21, $22, $23, $24, $25, $26, $07
- db $10, $11, $12, $13, $14, $15, $16, $07
- db $18, $19, $1a, $1b, $1c, $1d, $1e, $07
-
-TilesetColors3: ; b289
- db $00, $01, $02, $03, $04, $05, $06, $07
- db $08, $09, $0a, $0b, $0c, $0d, $0e, $0f
- db $10, $11, $12, $13, $14, $15, $16, $17
- db $18, $19, $1a, $1b, $1c, $1d, $1e, $1f
-
-TilesetColors4: ; b289
- db $00, $01, $02, $03, $04, $05, $06, $07
- db $08, $09, $0a, $0b, $0c, $0d, $0e, $0f
- db $10, $11, $12, $13, $14, $15, $16, $17
- db $18, $19, $1a, $1b, $1c, $1d, $1e, $1f
-; b309
+
+.TilesetColorsPointers
+ dw .OutdoorColors ; unused
+ dw .OutdoorColors ; TOWN
+ dw .OutdoorColors ; ROUTE
+ dw .IndoorColors ; INDOOR
+ dw .DungeonColors ; CAVE
+ dw .Perm5Colors ; PERM_5
+ dw .IndoorColors ; GATE
+ dw .DungeonColors ; DUNGEON
+
+; Valid indices: $00 - $29
+.OutdoorColors
+ db $00, $01, $02, $28, $04, $05, $06, $07 ; morn
+ db $08, $09, $0a, $28, $0c, $0d, $0e, $0f ; day
+ db $10, $11, $12, $29, $14, $15, $16, $17 ; nite
+ db $18, $19, $1a, $1b, $1c, $1d, $1e, $1f ; dark
+
+.IndoorColors
+ db $20, $21, $22, $23, $24, $25, $26, $07 ; morn
+ db $20, $21, $22, $23, $24, $25, $26, $07 ; day
+ db $10, $11, $12, $13, $14, $15, $16, $07 ; nite
+ db $18, $19, $1a, $1b, $1c, $1d, $1e, $07 ; dark
+
+.DungeonColors
+ db $00, $01, $02, $03, $04, $05, $06, $07 ; morn
+ db $08, $09, $0a, $0b, $0c, $0d, $0e, $0f ; day
+ db $10, $11, $12, $13, $14, $15, $16, $17 ; nite
+ db $18, $19, $1a, $1b, $1c, $1d, $1e, $1f ; dark
+
+.Perm5Colors
+ db $00, $01, $02, $03, $04, $05, $06, $07 ; morn
+ db $08, $09, $0a, $0b, $0c, $0d, $0e, $0f ; day
+ db $10, $11, $12, $13, $14, $15, $16, $17 ; nite
+ db $18, $19, $1a, $1b, $1c, $1d, $1e, $1f ; dark
Palette_b309: ; b309 mobile
RGB 31, 31, 31
@@ -2086,26 +2001,22 @@ Palette_b309: ; b309 mobile
RGB 30, 10, 06
RGB 00, 00, 00
-; b311
-
Palette_b311: ; b311 not mobile
RGB 31, 31, 31
RGB 17, 19, 31
RGB 14, 16, 31
RGB 00, 00, 00
-; b319
-
-TilesetBGPalette: ; b319
+TilesetBGPalette:
INCLUDE "tilesets/bg.pal"
-MapObjectPals:: ; b469
+MapObjectPals::
INCLUDE "tilesets/ob.pal"
-RoofPals: ; b569
+RoofPals:
INCLUDE "tilesets/roof.pal"
-Palettes_b641: ; b641
+Palettes_b641:
RGB 27, 31, 27
RGB 21, 21, 21
RGB 13, 13, 13
@@ -2146,9 +2057,7 @@ Palettes_b641: ; b641
RGB 07, 07, 12
RGB 00, 00, 00
-; b681
-
-Palettes_b681: ; b681
+Palettes_b681:
RGB 27, 31, 27
RGB 31, 19, 10
RGB 31, 07, 04
@@ -2219,8 +2128,7 @@ Palettes_b681: ; b681
RGB 20, 15, 03
RGB 07, 07, 07
-
-Palettes_b6f1: ; b6f1
+Palettes_b6f1:
RGB 31, 31, 31
RGB 18, 23, 31
RGB 15, 20, 31
@@ -2246,8 +2154,7 @@ Palettes_b6f1: ; b6f1
RGB 18, 23, 31
RGB 00, 00, 00
-
-Palettes_b719: ; b719
+Palettes_b719:
RGB 31, 31, 31
RGB 07, 06, 03
RGB 07, 06, 03
@@ -2258,9 +2165,7 @@ Palettes_b719: ; b719
RGB 26, 22, 00
RGB 00, 00, 00
-; b729
-
-MalePokegearPals: ; b729
+MalePokegearPals:
RGB 28, 31, 20
RGB 21, 21, 21
RGB 13, 13, 13
@@ -2291,9 +2196,7 @@ MalePokegearPals: ; b729
RGB 15, 07, 00
RGB 31, 00, 00
-; b759
-
-FemalePokegearPals: ; b759
+FemalePokegearPals:
RGB 28, 31, 20
RGB 21, 21, 21
RGB 13, 13, 13
@@ -2324,9 +2227,7 @@ FemalePokegearPals: ; b759
RGB 15, 07, 00
RGB 31, 00, 00
-; b789
-
-Palettes_b789: ; b789
+Palettes_b789:
RGB 31, 31, 31
RGB 30, 22, 24
RGB 18, 18, 18
@@ -2347,9 +2248,7 @@ Palettes_b789: ; b789
RGB 18, 18, 18
RGB 00, 00, 00
-; b7a9
-
-Palettes_b7a9: ; b7a9
+Palettes_b7a9:
RGB 31, 31, 31
RGB 24, 25, 28
RGB 24, 24, 09
@@ -2430,4 +2329,3 @@ Palettes_b7a9: ; b7a9
RGB 00, 00, 00
RGB 00, 00, 00
-; b829
diff --git a/engine/health.asm b/engine/health.asm
new file mode 100755
index 000000000..1c926f677
--- /dev/null
+++ b/engine/health.asm
@@ -0,0 +1,110 @@
+HealParty: ; c658
+ xor a
+ ld [CurPartyMon], a
+ ld hl, PartySpecies
+.loop
+ ld a, [hli]
+ cp -1
+ jr z, .done
+ cp EGG
+ jr z, .next
+
+ push hl
+ call HealPartyMon
+ pop hl
+
+.next
+ ld a, [CurPartyMon]
+ inc a
+ ld [CurPartyMon], a
+ jr .loop
+
+.done
+ ret
+
+HealPartyMon: ; c677
+ ld a, MON_SPECIES
+ call GetPartyParamLocation
+ ld d, h
+ ld e, l
+
+ ld hl, MON_STATUS
+ add hl, de
+ xor a
+ ld [hli], a
+ ld [hl], a
+
+ ld hl, MON_MAXHP
+ add hl, de
+
+ ; bc = MON_HP
+ ld b, h
+ ld c, l
+ dec bc
+ dec bc
+
+ ld a, [hli]
+ ld [bc], a
+ inc bc
+ ld a, [hl]
+ ld [bc], a
+
+ callba RestoreAllPP
+ ret
+
+ComputeHPBarPixels: ; c699
+; e = bc * (6 * 8) / de
+ ld a, b
+ or c
+ jr z, .zero
+ push hl
+ xor a
+ ld [hMultiplicand + 0], a
+ ld a, b
+ ld [hMultiplicand + 1], a
+ ld a, c
+ ld [hMultiplicand + 2], a
+ ld a, 6 * 8
+ ld [hMultiplier], a
+ call Multiply
+ ; We need de to be under 256 because hDivisor is only 1 byte.
+ ld a, d
+ and a
+ jr z, .divide
+ ; divide de and hProduct by 4
+ srl d
+ rr e
+ srl d
+ rr e
+ ld a, [hProduct + 2]
+ ld b, a
+ ld a, [hProduct + 3]
+ srl b
+ rr a
+ srl b
+ rr a
+ ld [hDividend + 3], a
+ ld a, b
+ ld [hDividend + 2], a
+.divide
+ ld a, e
+ ld [hDivisor], a
+ ld b, 4
+ call Divide
+ ld a, [hQuotient + 2]
+ ld e, a
+ pop hl
+ and a
+ ret nz
+ ld e, 1
+ ret
+
+.zero
+ ld e, 0
+ ret
+
+AnimateHPBar: ; c6e0
+ call WaitBGMap
+ call _AnimateHPBar
+ call WaitBGMap
+ ret
diff --git a/engine/init_gender.asm b/engine/init_gender.asm
index 5de576c2a..ff5babdf9 100755
--- a/engine/init_gender.asm
+++ b/engine/init_gender.asm
@@ -67,7 +67,7 @@ TextJump_AreYouABoyOrAreYouAGirl: ; 0x48e0f
InitGenderScreen: ; 48e14 (12:4e14)
ld a, $10
ld [MusicFade], a
- ld a, $0
+ ld a, MUSIC_NONE
ld [MusicFadeIDLo], a
ld a, $0
ld [MusicFadeIDHi], a
diff --git a/engine/items.asm b/engine/items.asm
new file mode 100755
index 000000000..ede8e4f73
--- /dev/null
+++ b/engine/items.asm
@@ -0,0 +1,584 @@
+_ReceiveItem:: ; d1d5
+ call DoesHLEqualNumItems
+ jp nz, PutItemInPocket
+ push hl
+ call CheckItemPocket
+ pop de
+ ld a, [wItemAttributeParamBuffer]
+ dec a
+ ld hl, .Pockets
+ rst JumpTable
+ ret
+
+.Pockets: ; d1e9
+ dw .Item
+ dw .KeyItem
+ dw .Ball
+ dw .TMHM
+
+.Item: ; d1f1
+ ld h, d
+ ld l, e
+ jp PutItemInPocket
+
+.KeyItem: ; d1f6
+ ld h, d
+ ld l, e
+ jp ReceiveKeyItem
+
+.Ball: ; d1fb
+ ld hl, NumBalls
+ jp PutItemInPocket
+
+.TMHM: ; d201
+ ld h, d
+ ld l, e
+ ld a, [CurItem]
+ ld c, a
+ call GetTMHMNumber
+ jp ReceiveTMHM
+
+_TossItem:: ; d20d
+ call DoesHLEqualNumItems
+ jr nz, .remove
+ push hl
+ call CheckItemPocket
+ pop de
+ ld a, [wItemAttributeParamBuffer]
+ dec a
+ ld hl, .Pockets
+ rst JumpTable
+ ret
+
+.Pockets
+ dw .Item
+ dw .KeyItem
+ dw .Ball
+ dw .TMHM
+
+.Ball ; d228
+ ld hl, NumBalls
+ jp RemoveItemFromPocket
+
+.TMHM ; d22e
+ ld h, d
+ ld l, e
+ ld a, [CurItem]
+ ld c, a
+ call GetTMHMNumber
+ jp TossTMHM
+
+.KeyItem ; d23a
+ ld h, d
+ ld l, e
+ jp TossKeyItem
+
+.Item ; d23f
+ ld h, d
+ ld l, e
+
+.remove
+ jp RemoveItemFromPocket
+
+_CheckItem:: ; d244
+ call DoesHLEqualNumItems
+ jr nz, .nope
+ push hl
+ call CheckItemPocket
+ pop de
+ ld a, [wItemAttributeParamBuffer]
+ dec a
+ ld hl, .Pockets
+ rst JumpTable
+ ret
+
+.Pockets
+ dw .Item
+ dw .KeyItem
+ dw .Ball
+ dw .TMHM
+
+.Ball ; d25f
+ ld hl, NumBalls
+ jp CheckTheItem
+
+.TMHM ; d265
+ ld h, d
+ ld l, e
+ ld a, [CurItem]
+ ld c, a
+ call GetTMHMNumber
+ jp CheckTMHM
+
+.KeyItem ; d271
+ ld h, d
+ ld l, e
+ jp CheckKeyItems
+
+.Item ; d276
+ ld h, d
+ ld l, e
+
+.nope
+ jp CheckTheItem
+
+DoesHLEqualNumItems: ; d27b
+ ld a, l
+ cp NumItems % $100
+ ret nz
+ ld a, h
+ cp NumItems / $100
+ ret
+
+GetPocketCapacity: ; d283
+ ld c, MAX_ITEMS
+ ld a, e
+ cp NumItems % $100
+ jr nz, .not_bag
+ ld a, d
+ cp NumItems / $100
+ ret z
+
+.not_bag
+ ld c, MAX_PC_ITEMS
+ ld a, e
+ cp PCItems % $100
+ jr nz, .not_pc
+ ld a, d
+ cp PCItems / $100
+ ret z
+
+.not_pc
+ ld c, MAX_BALLS
+ ret
+
+PutItemInPocket: ; d29c
+ ld d, h
+ ld e, l
+ inc hl
+ ld a, [CurItem]
+ ld c, a
+ ld b, 0
+.loop
+ ld a, [hli]
+ cp -1
+ jr z, .terminator
+ cp c
+ jr nz, .next
+ ld a, 99
+ sub [hl]
+ add b
+ ld b, a
+ ld a, [wItemQuantityChangeBuffer]
+ cp b
+ jr z, .ok
+ jr c, .ok
+
+.next
+ inc hl
+ jr .loop
+
+.terminator
+ call GetPocketCapacity
+ ld a, [de]
+ cp c
+ jr c, .ok
+ and a
+ ret
+
+.ok
+ ld h, d
+ ld l, e
+ ld a, [CurItem]
+ ld c, a
+ ld a, [wItemQuantityChangeBuffer]
+ ld [wItemQuantityBuffer], a
+.loop2
+ inc hl
+ ld a, [hli]
+ cp -1
+ jr z, .terminator2
+ cp c
+ jr nz, .loop2
+ ld a, [wItemQuantityBuffer]
+ add [hl]
+ cp 100
+ jr nc, .newstack
+ ld [hl], a
+ jr .done
+
+.newstack
+ ld [hl], 99
+ sub 99
+ ld [wItemQuantityBuffer], a
+ jr .loop2
+
+.terminator2
+ dec hl
+ ld a, [CurItem]
+ ld [hli], a
+ ld a, [wItemQuantityBuffer]
+ ld [hli], a
+ ld [hl], -1
+ ld h, d
+ ld l, e
+ inc [hl]
+
+.done
+ scf
+ ret
+
+RemoveItemFromPocket: ; d2ff
+ ld d, h
+ ld e, l
+ ld a, [hli]
+ ld c, a
+ ld a, [CurItemQuantity]
+ cp c
+ jr nc, .ok ; memory
+ ld c, a
+ ld b, $0
+ add hl, bc
+ add hl, bc
+ ld a, [CurItem]
+ cp [hl]
+ inc hl
+ jr z, .skip
+ ld h, d
+ ld l, e
+ inc hl
+
+.ok
+ ld a, [CurItem]
+ ld b, a
+.loop
+ ld a, [hli]
+ cp b
+ jr z, .skip
+ cp -1
+ jr z, .nope
+ inc hl
+ jr .loop
+
+.skip
+ ld a, [wItemQuantityChangeBuffer]
+ ld b, a
+ ld a, [hl]
+ sub b
+ jr c, .nope
+ ld [hl], a
+ ld [wItemQuantityBuffer], a
+ and a
+ jr nz, .yup
+ dec hl
+ ld b, h
+ ld c, l
+ inc hl
+ inc hl
+.loop2
+ ld a, [hli]
+ ld [bc], a
+ inc bc
+ cp -1
+ jr nz, .loop2
+ ld h, d
+ ld l, e
+ dec [hl]
+
+.yup
+ scf
+ ret
+
+.nope
+ and a
+ ret
+
+CheckTheItem: ; d349
+ ld a, [CurItem]
+ ld c, a
+.loop
+ inc hl
+ ld a, [hli]
+ cp -1
+ jr z, .done
+ cp c
+ jr nz, .loop
+ scf
+ ret
+
+.done
+ and a
+ ret
+
+ReceiveKeyItem: ; d35a
+ ld hl, NumKeyItems
+ ld a, [hli]
+ cp MAX_KEY_ITEMS
+ jr nc, .nope
+ ld c, a
+ ld b, 0
+ add hl, bc
+ ld a, [CurItem]
+ ld [hli], a
+ ld [hl], -1
+ ld hl, NumKeyItems
+ inc [hl]
+ scf
+ ret
+
+.nope
+ and a
+ ret
+
+TossKeyItem: ; d374
+ ld a, [wd107]
+ ld e, a
+ ld d, 0
+ ld hl, NumKeyItems
+ ld a, [hl]
+ cp e
+ jr nc, .ok
+ call .Toss
+ ret nc
+ jr .ok2
+
+.ok
+ dec [hl]
+ inc hl
+ add hl, de
+
+.ok2
+ ld d, h
+ ld e, l
+ inc hl
+.loop
+ ld a, [hli]
+ ld [de], a
+ inc de
+ cp -1
+ jr nz, .loop
+ scf
+ ret
+
+.Toss: ; d396
+ ld hl, NumKeyItems
+ ld a, [CurItem]
+ ld c, a
+.loop3
+ inc hl
+ ld a, [hl]
+ cp c
+ jr z, .ok3
+ cp -1
+ jr nz, .loop3
+ xor a
+ ret
+
+.ok3
+ ld a, [NumKeyItems]
+ dec a
+ ld [NumKeyItems], a
+ scf
+ ret
+
+CheckKeyItems: ; d3b1
+ ld a, [CurItem]
+ ld c, a
+ ld hl, KeyItems
+.loop
+ ld a, [hli]
+ cp c
+ jr z, .done
+ cp -1
+ jr nz, .loop
+ and a
+ ret
+
+.done
+ scf
+ ret
+
+ReceiveTMHM: ; d3c4
+ dec c
+ ld b, 0
+ ld hl, TMsHMs
+ add hl, bc
+ ld a, [wItemQuantityChangeBuffer]
+ add [hl]
+ cp 100
+ jr nc, .toomany
+ ld [hl], a
+ scf
+ ret
+
+.toomany
+ and a
+ ret
+
+TossTMHM: ; d3d8
+ dec c
+ ld b, 0
+ ld hl, TMsHMs
+ add hl, bc
+ ld a, [wItemQuantityChangeBuffer]
+ ld b, a
+ ld a, [hl]
+ sub b
+ jr c, .nope
+ ld [hl], a
+ ld [wItemQuantityBuffer], a
+ jr nz, .yup
+ ld a, [wTMHMPocketScrollPosition]
+ and a
+ jr z, .yup
+ dec a
+ ld [wTMHMPocketScrollPosition], a
+
+.yup
+ scf
+ ret
+
+.nope
+ and a
+ ret
+
+CheckTMHM: ; d3fb
+ dec c
+ ld b, $0
+ ld hl, TMsHMs
+ add hl, bc
+ ld a, [hl]
+ and a
+ ret z
+ scf
+ ret
+
+GetTMHMNumber:: ; d407
+; Return the number of a TM/HM by item id c.
+
+ ld a, c
+
+; Skip any dummy items.
+ cp ITEM_C3 ; TM04-05
+ jr c, .done
+ cp ITEM_DC ; TM28-29
+ jr c, .skip
+
+ dec a
+.skip
+ dec a
+.done
+ sub TM01
+ inc a
+ ld c, a
+ ret
+
+GetNumberedTMHM: ; d417
+; Return the item id of a TM/HM by number c.
+
+ ld a, c
+
+; Skip any gaps.
+ cp ITEM_C3 - (TM01 - 1)
+ jr c, .done
+ cp ITEM_DC - (TM01 - 1) - 1
+ jr c, .skip_one
+
+.skip_two
+ inc a
+.skip_one
+ inc a
+.done
+ add TM01
+ dec a
+ ld c, a
+ ret
+
+_CheckTossableItem:: ; d427
+; Return 1 in wItemAttributeParamBuffer and carry if CurItem can't be removed from the bag.
+ ld a, ITEMATTR_PERMISSIONS
+ call GetItemAttr
+ bit 7, a
+ jr nz, ItemAttr_ReturnCarry
+ and a
+ ret
+
+CheckSelectableItem: ; d432
+; Return 1 in wItemAttributeParamBuffer and carry if CurItem can't be selected.
+ ld a, ITEMATTR_PERMISSIONS
+ call GetItemAttr
+ bit 6, a
+ jr nz, ItemAttr_ReturnCarry
+ and a
+ ret
+
+CheckItemPocket:: ; d43d
+; Return the pocket for CurItem in wItemAttributeParamBuffer.
+ ld a, ITEMATTR_POCKET
+ call GetItemAttr
+ and $f
+ ld [wItemAttributeParamBuffer], a
+ ret
+
+CheckItemContext: ; d448
+; Return the context for CurItem in wItemAttributeParamBuffer.
+ ld a, ITEMATTR_HELP
+ call GetItemAttr
+ and $f
+ ld [wItemAttributeParamBuffer], a
+ ret
+
+CheckItemMenu: ; d453
+; Return the menu for CurItem in wItemAttributeParamBuffer.
+ ld a, ITEMATTR_HELP
+ call GetItemAttr
+ swap a
+ and $f
+ ld [wItemAttributeParamBuffer], a
+ ret
+
+GetItemAttr: ; d460
+; Get attribute a of CurItem.
+
+ push hl
+ push bc
+
+ ld hl, ItemAttributes
+ ld c, a
+ ld b, 0
+ add hl, bc
+
+ xor a
+ ld [wItemAttributeParamBuffer], a
+
+ ld a, [CurItem]
+ dec a
+ ld c, a
+ ld a, NUM_ITEMATTRS
+ call AddNTimes
+ ld a, BANK(ItemAttributes)
+ call GetFarByte
+
+ pop bc
+ pop hl
+ ret
+
+ItemAttr_ReturnCarry: ; d47f
+ ld a, 1
+ ld [wItemAttributeParamBuffer], a
+ scf
+ ret
+
+GetItemPrice: ; d486
+; Return the price of CurItem in de.
+ push hl
+ push bc
+ ld a, ITEMATTR_PRICE
+ call GetItemAttr
+ ld e, a
+ ld a, ITEMATTR_PRICE_HI
+ call GetItemAttr
+ ld d, a
+ pop bc
+ pop hl
+ ret
diff --git a/engine/main_menu.asm b/engine/main_menu.asm
index 637253c12..2c9afcc07 100755
--- a/engine/main_menu.asm
+++ b/engine/main_menu.asm
@@ -202,7 +202,7 @@ MainMenuJoypadLoop: ; 49de4
ld a, [w2DMenuFlags1]
set 5, a
ld [w2DMenuFlags1], a
- call Function1f1a
+ call GetScrollingMenuJoypad
ld a, [wMenuJoypad]
cp B_BUTTON
jr z, .b_button
diff --git a/engine/map_setup.asm b/engine/map_setup.asm
index 8fa768c87..952c12ac1 100644
--- a/engine/map_setup.asm
+++ b/engine/map_setup.asm
@@ -248,7 +248,7 @@ MapSetupCommands: ; 15440
dba EnterMapMusic ; 07
dba ForceMapMusic ; 08
dba FadeInMusic ; 09
- dba LoadBlockData ; 0a
+ dba LoadBlockData ; 0a (callback 1)
dba LoadNeighboringBlockData ; 0b
dba SaveScreen ; 0c
dba BufferScreen ; 0d
diff --git a/engine/mon_icons.asm b/engine/mon_icons.asm
index 5e41cd4a1..6a5c7484f 100755
--- a/engine/mon_icons.asm
+++ b/engine/mon_icons.asm
@@ -14,7 +14,7 @@ LoadOverworldMonIcon: ; 8e82b
ret
; 8e83f
-Function8e83f: ; 8e83f
+LoadMenuMonIcon: ; 8e83f
push hl
push de
push bc
@@ -28,9 +28,8 @@ Function8e83f: ; 8e83f
.LoadIcon: ; 8e849
ld d, 0
ld hl, .Jumptable
-rept 2
add hl, de
-endr
+ add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
@@ -39,13 +38,13 @@ endr
.Jumptable: ; 8e854 (23:6854)
- dw Function8e8d5 ; init
- dw Function8e961
- dw Function8e97d
- dw Trade_LoadMonIconGFX
- dw Function8e898
- dw Mobile_InitPartyMenuBGPal71
- dw .GetPartyMenuMonIcon
+ dw Function8e8d5 ; party menu
+ dw Function8e961 ; naming screen
+ dw Function8e97d ; moves (?)
+ dw Trade_LoadMonIconGFX ; trade
+ dw Function8e898 ; mobile
+ dw Mobile_InitPartyMenuBGPal71 ; mobile
+ dw .GetPartyMenuMonIcon ; unused
.GetPartyMenuMonIcon: ; 8e862 (23:6862)
@@ -89,7 +88,7 @@ Function8e898: ; 8e898 (23:6898)
call Function8e8d5
ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID
add hl, bc
- ld a, $0
+ ld a, SPRITE_ANIM_SEQ_NULL
ld [hl], a
ld hl, SPRITEANIMSTRUCT_XCOORD
add hl, bc
@@ -106,7 +105,7 @@ Mobile_InitPartyMenuBGPal71: ; 8e8b1 (23:68b1)
call SetPartyMonIconAnimSpeed
ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID
add hl, bc
- ld a, $0
+ ld a, SPRITE_ANIM_SEQ_NULL
ld [hl], a
ld hl, SPRITEANIMSTRUCT_XCOORD
add hl, bc
@@ -229,7 +228,7 @@ Function8e961: ; 8e961 (23:6961)
call InitSpriteAnimStruct
ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID
add hl, bc
- ld [hl], $0
+ ld [hl], SPRITE_ANIM_SEQ_NULL
ret
Function8e97d: ; 8e97d (23:697d)
diff --git a/engine/movement.asm b/engine/movement.asm
index ca3ac55b5..04f3f5208 100644
--- a/engine/movement.asm
+++ b/engine/movement.asm
@@ -55,8 +55,8 @@ MovementPointers: ; 5075
dw Movement_fast_jump_step_up ; 35
dw Movement_fast_jump_step_left ; 36
dw Movement_fast_jump_step_right ; 37
- dw Movement_38 ; 38
- dw Movement_39 ; 39
+ dw Movement_remove_sliding ; 38
+ dw Movement_set_sliding ; 39
dw Movement_remove_fixed_facing ; 3a
dw Movement_fix_facing ; 3b
dw Movement_show_person ; 3c
@@ -373,14 +373,14 @@ Movement_56: ; 5279
ret
; 5293
-Movement_38: ; 5293
+Movement_remove_sliding: ; 5293
ld hl, OBJECT_FLAGS1
add hl, bc
res SLIDING, [hl]
jp ContinueReadingMovement
; 529c
-Movement_39: ; 529c
+Movement_set_sliding: ; 529c
ld hl, OBJECT_FLAGS1
add hl, bc
set SLIDING, [hl]
diff --git a/engine/namingscreen.asm b/engine/namingscreen.asm
index ac56ec250..e65a2d54f 100755
--- a/engine/namingscreen.asm
+++ b/engine/namingscreen.asm
@@ -88,10 +88,10 @@ endr
.Pokemon: ; 1173e (4:573e)
ld a, [CurPartySpecies]
ld [wd265], a
- ld hl, Function8e83f
- ld a, BANK(Function8e83f)
+ ld hl, LoadMenuMonIcon
+ ld a, BANK(LoadMenuMonIcon)
ld e, $1
- rst FarCall ; ; indirect jump to Function8e83f (8e83f (23:683f))
+ rst FarCall ; ; indirect jump to LoadMenuMonIcon (8e83f (23:683f))
ld a, [CurPartySpecies]
ld [wd265], a
call GetPokemonName
diff --git a/engine/party_menu.asm b/engine/party_menu.asm
index b9048da10..9bf02351e 100644
--- a/engine/party_menu.asm
+++ b/engine/party_menu.asm
@@ -658,8 +658,8 @@ InitPartyMenuGFX: ; 503e0
.loop
push bc
push hl
- ld hl, Function8e83f
- ld a, BANK(Function8e83f)
+ ld hl, LoadMenuMonIcon
+ ld a, BANK(LoadMenuMonIcon)
ld e, $0
rst FarCall
ld a, [hObjectStructIndexBuffer]
@@ -752,8 +752,8 @@ PartyMenuSelect: ; 0x50457
ld [wPartyMenuCursor], a
ld a, [hJoyLast]
ld b, a
- bit 1, b
- jr nz, .exitmenu ; B button?
+ bit B_BUTTON_F, b
+ jr nz, .exitmenu ; B button
ld a, [wMenuCursorY]
dec a
ld [CurPartyMon], a
diff --git a/engine/phone.asm b/engine/phone.asm
index 1a3023bf1..ac21c1565 100644
--- a/engine/phone.asm
+++ b/engine/phone.asm
@@ -451,22 +451,20 @@ Script_ReceivePhoneCall: ; 0x90241
; 0x90255
Script_SpecialBillCall:: ; 0x90255
- callasm Function9025c
+ callasm .LoadBillScript
jump Script_ReceivePhoneCall
-; 0x9025c
-Function9025c: ; 9025c
+.LoadBillScript
ld e, PHONE_BILL
jp LoadCallerScript
; 90261
UnknownScript_0x90261: ; 0x90261
- callasm Function9026a
+ callasm .LoadElmScript
pause 30
jump Script_ReceivePhoneCall
-; 0x9026a
-Function9026a: ; 9026a
+.LoadElmScript
ld e, PHONE_ELM
jp LoadCallerScript
; 9026f
@@ -494,7 +492,6 @@ Phone_CallerTextboxWithName: ; 90292 (24:4292)
call Function90363
ret
-
PhoneCall:: ; 9029a
ld a, b
ld [PhoneScriptBank], a
diff --git a/engine/player_movement.asm b/engine/player_movement.asm
index 80c5e6edc..6ab121f61 100755
--- a/engine/player_movement.asm
+++ b/engine/player_movement.asm
@@ -121,12 +121,12 @@ DoPlayerMovement:: ; 80000
ld a, [PlayerStandingTile]
ld c, a
call CheckWhirlpoolTile
- jr c, .asm_800c4
+ jr c, .not_whirlpool
ld a, 3
scf
ret
-.asm_800c4
+.not_whirlpool
and $f0
cp $30 ; moving water
jr z, .water
diff --git a/engine/player_object.asm b/engine/player_object.asm
new file mode 100755
index 000000000..e84dff23e
--- /dev/null
+++ b/engine/player_object.asm
@@ -0,0 +1,856 @@
+BlankScreen: ; 8000
+ call DisableSpriteUpdates
+ xor a
+ ld [hBGMapMode], a
+ call ClearBGPalettes
+ call ClearSprites
+ hlcoord 0, 0
+ ld bc, TileMapEnd - TileMap
+ ld a, " "
+ call ByteFill
+ hlcoord 0, 0, AttrMap
+ ld bc, AttrMapEnd - AttrMap
+ ld a, $7
+ call ByteFill
+ call WaitBGMap2
+ call SetPalettes
+ ret
+
+SpawnPlayer: ; 8029
+ ld a, -1
+ ld [wObjectFollow_Leader], a
+ ld [wObjectFollow_Follower], a
+ ld a, $0
+ ld hl, PlayerObjectTemplate
+ call CopyPlayerObjectTemplate
+ ld b, $0
+ call PlayerSpawn_ConvertCoords
+ ld a, $0
+ call GetMapObject
+ ld hl, MAPOBJECT_COLOR
+ add hl, bc
+ ln e, (1 << 3) | PAL_OW_RED, PERSONTYPE_SCRIPT
+ ld a, [wPlayerSpriteSetupFlags]
+ bit 2, a
+ jr nz, .ok
+ ld a, [PlayerGender]
+ bit 0, a
+ jr z, .ok
+ ln e, (1 << 3) | PAL_OW_BLUE, PERSONTYPE_SCRIPT
+
+.ok
+ ld [hl], e
+ ld a, $0
+ ld [hMapObjectIndexBuffer], a
+ ld bc, MapObjects
+ ld a, $0
+ ld [hObjectStructIndexBuffer], a
+ ld de, ObjectStructs
+ call CopyMapObjectToObjectStruct
+ ld a, PLAYER
+ ld [wCenteredObject], a
+ ret
+
+PlayerObjectTemplate: ; 8071
+; A dummy map object used to initialize the player object.
+; Shorter than the actual amount copied by two bytes.
+; Said bytes seem to be unused.
+ person_event SPRITE_CHRIS, -4, -4, SPRITEMOVEDATA_PLAYER, 15, 15, -1, -1, 0, PERSONTYPE_SCRIPT, 0, 0, -1
+
+CopyDECoordsToMapObject:: ; 807e
+ push de
+ ld a, b
+ call GetMapObject
+ pop de
+ ld hl, MAPOBJECT_X_COORD
+ add hl, bc
+ ld [hl], d
+ ld hl, MAPOBJECT_Y_COORD
+ add hl, bc
+ ld [hl], e
+ ret
+
+PlayerSpawn_ConvertCoords: ; 808f
+ push bc
+ ld a, [XCoord]
+ add 4
+ ld d, a
+ ld a, [YCoord]
+ add 4
+ ld e, a
+ pop bc
+ call CopyDECoordsToMapObject
+ ret
+
+WritePersonXY:: ; 80a1
+ ld a, b
+ call CheckObjectVisibility
+ ret c
+
+ ld hl, OBJECT_NEXT_MAP_X
+ add hl, bc
+ ld d, [hl]
+ ld hl, OBJECT_NEXT_MAP_Y
+ add hl, bc
+ ld e, [hl]
+ ld a, [hMapObjectIndexBuffer]
+ ld b, a
+ call CopyDECoordsToMapObject
+ and a
+ ret
+
+RefreshPlayerCoords: ; 80b8
+ ld a, [XCoord]
+ add 4
+ ld d, a
+ ld hl, PlayerStandingMapX
+ sub [hl]
+ ld [hl], d
+ ld hl, MapObjects + MAPOBJECT_X_COORD
+ ld [hl], d
+ ld hl, PlayerLastMapX
+ ld [hl], d
+ ld d, a
+ ld a, [YCoord]
+ add 4
+ ld e, a
+ ld hl, PlayerStandingMapY
+ sub [hl]
+ ld [hl], e
+ ld hl, MapObjects + MAPOBJECT_Y_COORD
+ ld [hl], e
+ ld hl, PlayerLastMapY
+ ld [hl], e
+ ld e, a
+ ld a, [wObjectFollow_Leader]
+ cp $0
+ ret nz ; wtf
+ ret
+
+CopyObjectStruct:: ; 80e7
+ call CheckObjectMask
+ and a
+ ret nz ; masked
+
+ ld hl, ObjectStructs + OBJECT_STRUCT_LENGTH * 1
+ ld a, 1
+ ld de, OBJECT_STRUCT_LENGTH
+.loop
+ ld [hObjectStructIndexBuffer], a
+ ld a, [hl]
+ and a
+ jr z, .done
+ add hl, de
+ ld a, [hObjectStructIndexBuffer]
+ inc a
+ cp NUM_OBJECT_STRUCTS
+ jr nz, .loop
+ scf
+ ret ; overflow
+
+.done
+ ld d, h
+ ld e, l
+ call CopyMapObjectToObjectStruct
+ ld hl, VramState
+ bit 7, [hl]
+ ret z
+
+ ld hl, OBJECT_FLAGS2
+ add hl, de
+ set 5, [hl]
+ ret
+
+CopyMapObjectToObjectStruct: ; 8116
+ call .CopyMapObjectToTempObject
+ call CopyTempObjectToObjectStruct
+ ret
+
+.CopyMapObjectToTempObject: ; 811d
+ ld a, [hObjectStructIndexBuffer]
+ ld hl, MAPOBJECT_OBJECT_STRUCT_ID
+ add hl, bc
+ ld [hl], a
+
+ ld a, [hMapObjectIndexBuffer]
+ ld [wTempObjectCopyMapObjectIndex], a
+
+ ld hl, MAPOBJECT_SPRITE
+ add hl, bc
+ ld a, [hl]
+ ld [wTempObjectCopySprite], a
+
+ call GetSpriteVTile
+ ld [wTempObjectCopySpriteVTile], a
+
+ ld a, [hl]
+ call GetSpritePalette
+ ld [wTempObjectCopyPalette], a
+
+ ld hl, MAPOBJECT_COLOR
+ add hl, bc
+ ld a, [hl]
+ and $f0
+ jr z, .skip_color_override
+ swap a
+ and $7 ; OAM_PALETTE
+ ld [wTempObjectCopyPalette], a
+
+.skip_color_override
+ ld hl, MAPOBJECT_MOVEMENT
+ add hl, bc
+ ld a, [hl]
+ ld [wTempObjectCopyMovement], a
+
+ ld hl, MAPOBJECT_RANGE
+ add hl, bc
+ ld a, [hl]
+ ld [wTempObjectCopyRange], a
+
+ ld hl, MAPOBJECT_X_COORD
+ add hl, bc
+ ld a, [hl]
+ ld [wTempObjectCopyX], a
+
+ ld hl, MAPOBJECT_Y_COORD
+ add hl, bc
+ ld a, [hl]
+ ld [wTempObjectCopyY], a
+
+ ld hl, MAPOBJECT_RADIUS
+ add hl, bc
+ ld a, [hl]
+ ld [wTempObjectCopyRadius], a
+ ret
+
+InitializeVisibleSprites: ; 8177
+ ld bc, MapObjects + OBJECT_LENGTH
+ ld a, 1
+.loop
+ ld [hMapObjectIndexBuffer], a
+ ld hl, MAPOBJECT_SPRITE
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .next
+
+ ld hl, MAPOBJECT_OBJECT_STRUCT_ID
+ add hl, bc
+ ld a, [hl]
+ cp -1
+ jr nz, .next
+
+ ld a, [XCoord]
+ ld d, a
+ ld a, [YCoord]
+ ld e, a
+
+ ld hl, MAPOBJECT_X_COORD
+ add hl, bc
+ ld a, [hl]
+ add 1
+ sub d
+ jr c, .next
+
+ cp MAPOBJECT_SCREEN_WIDTH
+ jr nc, .next
+
+ ld hl, MAPOBJECT_Y_COORD
+ add hl, bc
+ ld a, [hl]
+ add 1
+ sub e
+ jr c, .next
+
+ cp MAPOBJECT_SCREEN_HEIGHT
+ jr nc, .next
+
+ push bc
+ call CopyObjectStruct
+ pop bc
+ jp c, .ret
+
+.next
+ ld hl, OBJECT_LENGTH
+ add hl, bc
+ ld b, h
+ ld c, l
+ ld a, [hMapObjectIndexBuffer]
+ inc a
+ cp NUM_OBJECTS
+ jr nz, .loop
+ ret
+
+.ret: ; 81c9
+ ret
+
+CheckObjectEnteringVisibleRange:: ; 81ca
+ nop
+ ld a, [wPlayerStepDirection]
+ cp STANDING
+ ret z
+ ld hl, .dw
+ rst JumpTable
+ ret
+
+.dw: ; 81d6
+ dw .Down
+ dw .Up
+ dw .Left
+ dw .Right
+
+.Up: ; 81de
+ ld a, [YCoord]
+ sub 1
+ jr .Vertical
+
+.Down: ; 81e5
+ ld a, [YCoord]
+ add 9
+.Vertical: ; 81ea
+ ld d, a
+ ld a, [XCoord]
+ ld e, a
+ ld bc, MapObjects + OBJECT_LENGTH
+ ld a, 1
+.loop_v
+ ld [hMapObjectIndexBuffer], a
+ ld hl, MAPOBJECT_SPRITE
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .next_v
+ ld hl, MAPOBJECT_Y_COORD
+ add hl, bc
+ ld a, d
+ cp [hl]
+ jr nz, .next_v
+ ld hl, MAPOBJECT_OBJECT_STRUCT_ID
+ add hl, bc
+ ld a, [hl]
+ cp -1
+ jr nz, .next_v
+ ld hl, MAPOBJECT_X_COORD
+ add hl, bc
+ ld a, [hl]
+ add 1
+ sub e
+ jr c, .next_v
+ cp MAPOBJECT_SCREEN_WIDTH
+ jr nc, .next_v
+ push de
+ push bc
+ call CopyObjectStruct
+ pop bc
+ pop de
+
+.next_v
+ ld hl, OBJECT_LENGTH
+ add hl, bc
+ ld b, h
+ ld c, l
+ ld a, [hMapObjectIndexBuffer]
+ inc a
+ cp NUM_OBJECTS
+ jr nz, .loop_v
+ ret
+
+.Left: ; 8232
+ ld a, [XCoord]
+ sub 1
+ jr .Horizontal
+
+.Right: ; 8239
+ ld a, [XCoord]
+ add 10
+.Horizontal: ; 823e
+ ld e, a
+ ld a, [YCoord]
+ ld d, a
+ ld bc, MapObjects + OBJECT_LENGTH
+ ld a, 1
+.loop_h
+ ld [hMapObjectIndexBuffer], a
+ ld hl, MAPOBJECT_SPRITE
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .next_h
+ ld hl, MAPOBJECT_X_COORD
+ add hl, bc
+ ld a, e
+ cp [hl]
+ jr nz, .next_h
+ ld hl, MAPOBJECT_OBJECT_STRUCT_ID
+ add hl, bc
+ ld a, [hl]
+ cp -1
+ jr nz, .next_h
+ ld hl, MAPOBJECT_Y_COORD
+ add hl, bc
+ ld a, [hl]
+ add 1
+ sub d
+ jr c, .next_h
+ cp MAPOBJECT_SCREEN_HEIGHT
+ jr nc, .next_h
+ push de
+ push bc
+ call CopyObjectStruct
+ pop bc
+ pop de
+
+.next_h
+ ld hl, OBJECT_LENGTH
+ add hl, bc
+ ld b, h
+ ld c, l
+ ld a, [hMapObjectIndexBuffer]
+ inc a
+ cp NUM_OBJECTS
+ jr nz, .loop_h
+ ret
+
+CopyTempObjectToObjectStruct: ; 8286
+ ld a, [wTempObjectCopyMapObjectIndex]
+ ld hl, OBJECT_MAP_OBJECT_INDEX
+ add hl, de
+ ld [hl], a
+
+ ld a, [wTempObjectCopyMovement]
+ call CopySpriteMovementData
+
+ ld a, [wTempObjectCopyPalette]
+ ld hl, OBJECT_PALETTE
+ add hl, de
+ or [hl]
+ ld [hl], a
+
+ ld a, [wTempObjectCopyY]
+ call .InitYCoord
+
+ ld a, [wTempObjectCopyX]
+ call .InitXCoord
+
+ ld a, [wTempObjectCopySprite]
+ ld hl, OBJECT_SPRITE
+ add hl, de
+ ld [hl], a
+
+ ld a, [wTempObjectCopySpriteVTile]
+ ld hl, OBJECT_SPRITE_TILE
+ add hl, de
+ ld [hl], a
+
+ ld hl, OBJECT_STEP_TYPE
+ add hl, de
+ ld [hl], STEP_TYPE_00
+
+ ld hl, OBJECT_FACING_STEP
+ add hl, de
+ ld [hl], STANDING
+
+ ld a, [wTempObjectCopyRadius]
+ call .InitRadius
+
+ ld a, [wTempObjectCopyRange]
+ ld hl, OBJECT_RANGE
+ add hl, de
+ ld [hl], a
+
+ and a
+ ret
+
+.InitYCoord: ; 82d5
+ ld hl, OBJECT_INIT_Y
+ add hl, de
+ ld [hl], a
+
+ ld hl, OBJECT_NEXT_MAP_Y
+ add hl, de
+ ld [hl], a
+
+ ld hl, YCoord
+ sub [hl]
+ and $f
+ swap a
+ ld hl, wFollowNotExactPersonY
+ sub [hl]
+ ld hl, OBJECT_SPRITE_Y
+ add hl, de
+ ld [hl], a
+ ret
+
+.InitXCoord: ; 82f1
+ ld hl, OBJECT_INIT_X
+ add hl, de
+ ld [hl], a
+ ld hl, OBJECT_NEXT_MAP_X
+ add hl, de
+ ld [hl], a
+ ld hl, XCoord
+ sub [hl]
+ and $f
+ swap a
+ ld hl, wFollowNotExactPersonX
+ sub [hl]
+ ld hl, OBJECT_SPRITE_X
+ add hl, de
+ ld [hl], a
+ ret
+
+.InitRadius: ; 830d
+ ld h, a
+ inc a
+ and $f
+ ld l, a
+ ld a, h
+ add $10
+ and $f0
+ or l
+ ld hl, OBJECT_RADIUS
+ add hl, de
+ ld [hl], a
+ ret
+
+TrainerWalkToPlayer: ; 831e
+ ld a, [hLastTalked]
+ call InitMovementBuffer
+ ld a, movement_step_sleep_1
+ call AppendToMovementBuffer
+ ld a, [wd03f]
+ dec a
+ jr z, .TerminateStep
+ ld a, [hLastTalked]
+ ld b, a
+ ld c, PLAYER
+ ld d, 1
+ call .GetPathToPlayer
+ call DecrementMovementBufferCount
+
+.TerminateStep
+ ld a, movement_step_end
+ call AppendToMovementBuffer
+ ret
+
+.GetPathToPlayer: ; 8341
+ push de
+ push bc
+; get player object struct, load to de
+ ld a, c
+ call GetMapObject
+ ld hl, MAPOBJECT_OBJECT_STRUCT_ID
+ add hl, bc
+ ld a, [hl]
+ call GetObjectStruct
+ ld d, b
+ ld e, c
+
+; get last talked object struct, load to bc
+ pop bc
+ ld a, b
+ call GetMapObject
+ ld hl, MAPOBJECT_OBJECT_STRUCT_ID
+ add hl, bc
+ ld a, [hl]
+ call GetObjectStruct
+
+; get last talked coords, load to bc
+ ld hl, OBJECT_NEXT_MAP_X
+ add hl, bc
+ ld a, [hl]
+ ld hl, OBJECT_NEXT_MAP_Y
+ add hl, bc
+ ld c, [hl]
+ ld b, a
+
+; get player coords, load to de
+ ld hl, OBJECT_NEXT_MAP_X
+ add hl, de
+ ld a, [hl]
+ ld hl, OBJECT_NEXT_MAP_Y
+ add hl, de
+ ld e, [hl]
+ ld d, a
+
+ pop af
+ call ComputePathToWalkToPlayer
+ ret
+
+Special_SurfStartStep: ; 8379
+ call InitMovementBuffer
+ call .GetMovementData
+ call AppendToMovementBuffer
+ ld a, movement_step_end
+ call AppendToMovementBuffer
+ ret
+
+.GetMovementData: ; 8388
+ ld a, [PlayerDirection]
+ srl a
+ srl a
+ and 3
+ ld e, a
+ ld d, 0
+ ld hl, .movement_data
+ add hl, de
+ ld a, [hl]
+ ret
+
+.movement_data
+ slow_step_down
+ slow_step_up
+ slow_step_left
+ slow_step_right
+
+FollowNotExact:: ; 839e
+ push bc
+ ld a, c
+ call CheckObjectVisibility
+ ld d, b
+ ld e, c
+ pop bc
+ ret c
+
+ ld a, b
+ call CheckObjectVisibility
+ ret c
+
+; Person 2 is now in bc, person 1 is now in de
+ ld hl, OBJECT_NEXT_MAP_X
+ add hl, bc
+ ld a, [hl]
+ ld hl, OBJECT_NEXT_MAP_Y
+ add hl, bc
+ ld c, [hl]
+ ld b, a
+
+ ld hl, OBJECT_NEXT_MAP_X
+ add hl, de
+ ld a, [hl]
+ cp b
+ jr z, .same_x
+ jr c, .to_the_left
+ inc b
+ jr .continue
+
+.to_the_left
+ dec b
+ jr .continue
+
+.same_x
+ ld hl, OBJECT_NEXT_MAP_Y
+ add hl, de
+ ld a, [hl]
+ cp c
+ jr z, .continue
+ jr c, .below
+ inc c
+ jr .continue
+
+.below
+ dec c
+
+.continue
+ ld hl, OBJECT_NEXT_MAP_X
+ add hl, de
+ ld [hl], b
+ ld a, b
+ ld hl, XCoord
+ sub [hl]
+ and $f
+ swap a
+ ld hl, wFollowNotExactPersonX
+ sub [hl]
+ ld hl, OBJECT_SPRITE_X
+ add hl, de
+ ld [hl], a
+ ld hl, OBJECT_NEXT_MAP_Y
+ add hl, de
+ ld [hl], c
+ ld a, c
+ ld hl, YCoord
+ sub [hl]
+ and $f
+ swap a
+ ld hl, wFollowNotExactPersonY
+ sub [hl]
+ ld hl, OBJECT_SPRITE_Y
+ add hl, de
+ ld [hl], a
+ ld a, [hObjectStructIndexBuffer]
+ ld hl, OBJECT_RANGE
+ add hl, de
+ ld [hl], a
+ ld hl, OBJECT_MOVEMENTTYPE
+ add hl, de
+ ld [hl], SPRITEMOVEDATA_FOLLOWNOTEXACT
+ ld hl, OBJECT_STEP_TYPE
+ add hl, de
+ ld [hl], STEP_TYPE_00
+ ret
+
+GetRelativeFacing:: ; 8417
+; Determines which way map object e would have to turn to face map object d. Returns carry if it's impossible for whatever reason.
+ ld a, d
+ call GetMapObject
+ ld hl, MAPOBJECT_OBJECT_STRUCT_ID
+ add hl, bc
+ ld a, [hl]
+ cp NUM_OBJECT_STRUCTS
+ jr nc, .carry
+ ld d, a
+ ld a, e
+ call GetMapObject
+ ld hl, MAPOBJECT_OBJECT_STRUCT_ID
+ add hl, bc
+ ld a, [hl]
+ cp NUM_OBJECT_STRUCTS
+ jr nc, .carry
+ ld e, a
+ call .GetFacing_e_relativeto_d
+ ret
+
+.carry
+ scf
+ ret
+
+.GetFacing_e_relativeto_d: ; 8439
+; Determines which way object e would have to turn to face object d. Returns carry if it's impossible.
+; load the coordinates of object d into bc
+ ld a, d
+ call GetObjectStruct
+ ld hl, OBJECT_NEXT_MAP_X
+ add hl, bc
+ ld a, [hl]
+ ld hl, OBJECT_NEXT_MAP_Y
+ add hl, bc
+ ld c, [hl]
+ ld b, a
+ push bc
+; load the coordinates of object e into de
+ ld a, e
+ call GetObjectStruct
+ ld hl, OBJECT_NEXT_MAP_X
+ add hl, bc
+ ld d, [hl]
+ ld hl, OBJECT_NEXT_MAP_Y
+ add hl, bc
+ ld e, [hl]
+ pop bc
+; |x1 - x2|
+ ld a, b
+ sub d
+ jr z, .same_x_1
+ jr nc, .b_right_of_d_1
+ cpl
+ inc a
+
+.b_right_of_d_1
+; |y1 - y2|
+ ld h, a
+ ld a, c
+ sub e
+ jr z, .same_y_1
+ jr nc, .c_below_e_1
+ cpl
+ inc a
+
+.c_below_e_1
+; |y1 - y2| - |x1 - x2|
+ sub h
+ jr c, .same_y_1
+
+.same_x_1
+; compare the y coordinates
+ ld a, c
+ cp e
+ jr z, .same_x_and_y
+ jr c, .c_directly_below_e
+; c directly above e
+ ld d, DOWN
+ and a
+ ret
+
+.c_directly_below_e
+ ld d, UP
+ and a
+ ret
+
+.same_y_1
+ ld a, b
+ cp d
+ jr z, .same_x_and_y
+ jr c, .b_directly_right_of_d
+; b directly left of d
+ ld d, RIGHT
+ and a
+ ret
+
+.b_directly_right_of_d
+ ld d, LEFT
+ and a
+ ret
+
+.same_x_and_y
+ scf
+ ret
+
+QueueFollowerFirstStep: ; 848a
+ call .QueueFirstStep
+ jr c, .same
+ ld [wFollowMovementQueue], a
+ xor a
+ ld [wFollowerMovementQueueLength], a
+ ret
+
+.same
+ ld a, -1
+ ld [wFollowerMovementQueueLength], a
+ ret
+
+.QueueFirstStep
+ ld a, [wObjectFollow_Leader]
+ call GetObjectStruct
+ ld hl, OBJECT_NEXT_MAP_X
+ add hl, bc
+ ld d, [hl]
+ ld hl, OBJECT_NEXT_MAP_Y
+ add hl, bc
+ ld e, [hl]
+ ld a, [wObjectFollow_Follower]
+ call GetObjectStruct
+ ld hl, OBJECT_NEXT_MAP_X
+ add hl, bc
+ ld a, d
+ cp [hl]
+ jr z, .check_y
+ jr c, .left
+ and a
+ ld a, movement_step_right
+ ret
+
+.left
+ and a
+ ld a, movement_step_left
+ ret
+
+.check_y
+ ld hl, OBJECT_NEXT_MAP_Y
+ add hl, bc
+ ld a, e
+ cp [hl]
+ jr z, .same_xy
+ jr c, .up
+ and a
+ ld a, movement_step_down
+ ret
+
+.up
+ and a
+ ld a, movement_step_up
+ ret
+
+.same_xy
+ scf
+ ret
diff --git a/engine/pokecenter_pc.asm b/engine/pokecenter_pc.asm
index a75798709..4c4effb6b 100755
--- a/engine/pokecenter_pc.asm
+++ b/engine/pokecenter_pc.asm
@@ -2,9 +2,9 @@ PokemonCenterPC: ; 1559a
call PC_CheckPartyForPokemon
ret c
call PC_PlayBootSound
- ld hl, UnknownText_0x15a27
+ ld hl, PokeCenterPCText_BootedUpPC
call PC_DisplayText
- ld hl, UnknownText_0x15a2c
+ ld hl, PokeCenterPCText_AccessWhosePC
call PC_DisplayTextWaitMenu
ld hl, .TopMenu
call LoadMenuDataHeader
@@ -25,40 +25,35 @@ PokemonCenterPC: ; 1559a
call ExitMenu
call CloseWindow
ret
-; 155d6
-.TopMenu: ; 0x155d6
+.TopMenu
db $48 ; flags
db 00, 00 ; start coords
db 12, 15 ; end coords
dw .MenuData2
db 1 ; default option
-; 0x155de
-.MenuData2: ; 0x155de
+.MenuData2
db $a0 ; flags
db 0 ; items
dw .WhichPC
dw PlaceNthMenuStrings
dw .JumpTable
-; 0x155e6
-.JumpTable: ; 155e6
+.JumpTable
dw PlayersPC, .String_PlayersPC
dw BillsPC, .String_BillsPC
dw OaksPC, .String_OaksPC
dw HallOfFamePC, .String_HallOfFame
dw TurnOffPC, .String_TurnOff
-; 155fa
-.String_PlayersPC: db "<PLAYER>'s PC@"
-.String_BillsPC: db "BILL's PC@"
-.String_OaksPC: db "PROF.OAK's PC@"
-.String_HallOfFame: db "HALL OF FAME@"
-.String_TurnOff: db "TURN OFF@"
-; 1562c
+.String_PlayersPC: db "<PLAYER>'s PC@"
+.String_BillsPC: db "BILL's PC@"
+.String_OaksPC: db "PROF.OAK's PC@"
+.String_HallOfFame: db "HALL OF FAME@"
+.String_TurnOff: db "TURN OFF@"
-.WhichPC: ; 1562c
+.WhichPC
; before pokedex
db 3 ; items
db 1, 0, 4 ; bill's, player's, turn off
@@ -73,9 +68,8 @@ PokemonCenterPC: ; 1559a
db 5 ; items
db 1, 0, 2, 3, 4 ; bill's, player's, oak's, hall of fame, turn off
db -1
-; 1563e
-.ChooseWhichPCListToUse: ; 1563e
+.ChooseWhichPCListToUse
call CheckReceivedDex
jr nz, .got_dex
ld a, $0
@@ -96,13 +90,12 @@ PC_CheckPartyForPokemon: ; 15650
ret nz
ld de, SFX_CHOOSE_PC_OPTION
call PlaySFX
- ld hl, UnknownText_0x15663
+ ld hl, .MustHavePokemonToUse
call PC_DisplayText
scf
ret
-; 15663
-UnknownText_0x15663: ; 0x15663
+.MustHavePokemonToUse
; Bzzzzt! You must have a #MON to use this!
text_jump UnknownText_0x1c1328
db "@"
@@ -110,7 +103,7 @@ UnknownText_0x15663: ; 0x15663
BillsPC: ; 15668
call PC_PlayChoosePCSound
- ld hl, UnknownText_0x15a31
+ ld hl, PokeCenterPCText_AccessedBillsPC
call PC_DisplayText
callba _BillsPC
and a
@@ -119,7 +112,7 @@ BillsPC: ; 15668
PlayersPC: ; 15679
call PC_PlayChoosePCSound
- ld hl, UnknownText_0x15a36
+ ld hl, PokeCenterPCText_AccessedOwnPC
call PC_DisplayText
ld b, $0
call _PlayersPC
@@ -129,7 +122,7 @@ PlayersPC: ; 15679
OaksPC: ; 15689
call PC_PlayChoosePCSound
- ld hl, UnknownText_0x15a3b
+ ld hl, PokeCenterPCText_AccessedOaksPC
call PC_DisplayText
callba ProfOaksPC
and a
@@ -146,7 +139,7 @@ HallOfFamePC: ; 1569a
; 156ab
TurnOffPC: ; 156ab
- ld hl, UnknownText_0x15a40
+ ld hl, PokeCenterPCText_LinkClosed
call PrintText
scf
ret
@@ -166,7 +159,7 @@ PC_PlayChoosePCSound: ; 156c2
ld de, SFX_CHOOSE_PC_OPTION
jr PC_WaitPlaySFX
-Function156c7: ; 156c7
+PC_PlaySwapItemsSound: ; 156c7
ld de, SFX_SWITCH_POKEMON
call PC_WaitPlaySFX
ld de, SFX_SWITCH_POKEMON
@@ -218,8 +211,8 @@ _PlayersPC: ; 15704
Function15715: ; 15715
xor a
- ld [wd0d7], a
- ld [wd0dd], a
+ ld [wPCItemsCursor], a
+ ld [wPCItemsScrollPosition], a
ld hl, KrissPCMenuData
call LoadMenuDataHeader
.asm_15722
@@ -316,19 +309,18 @@ UnknownText_0x157cc: ; 0x157cc
KrisWithdrawItemMenu: ; 0x157d1
call LoadStandardMenuDataHeader
callba ClearPCItemScreen
-.asm_157da
- call Function15985
- jr c, .asm_157e4
- call Function157e9
- jr .asm_157da
+.loop
+ call PCItemsJoypad
+ jr c, .quit
+ call .Submenu
+ jr .loop
-.asm_157e4
+.quit
call CloseSubmenu
xor a
ret
-; 0x157e9
-Function157e9: ; 0x157e9
+.Submenu
; check if the item has a quantity
callba _CheckTossableItem
ld a, [wItemAttributeParamBuffer]
@@ -351,7 +343,7 @@ Function157e9: ; 0x157e9
.withdraw
ld a, [wItemQuantityChangeBuffer]
ld [Buffer1], a ; quantity
- ld a, [wd107]
+ ld a, [CurItemQuantity]
ld [Buffer2], a
ld hl, NumItems
call ReceiveItem
@@ -359,7 +351,7 @@ Function157e9: ; 0x157e9
ld a, [Buffer1]
ld [wItemQuantityChangeBuffer], a
ld a, [Buffer2]
- ld [wd107], a
+ ld [CurItemQuantity], a
ld hl, PCItems
call TossItem
predef PartyMonItemName
@@ -377,7 +369,6 @@ Function157e9: ; 0x157e9
.done
ret
-; 0x15850
.HowManyText ; 0x15850
text_jump _KrissPCHowManyWithdrawText
@@ -391,24 +382,22 @@ Function157e9: ; 0x157e9
text_jump _KrissPCNoRoomWithdrawText
db "@"
-
KrisTossItemMenu: ; 0x1585f
call LoadStandardMenuDataHeader
callba ClearPCItemScreen
-.asm_15868
- call Function15985
- jr c, .asm_15878
+.loop
+ call PCItemsJoypad
+ jr c, .quit
ld de, PCItems
- callba Function129f4
- jr .asm_15868
+ callba TossItemFromPC
+ jr .loop
-.asm_15878
+.quit
call CloseSubmenu
xor a
ret
; 0x1587d
-
KrisDecorationMenu: ; 0x1587d
callba _KrisDecorationMenu
ld a, c
@@ -418,54 +407,48 @@ KrisDecorationMenu: ; 0x1587d
ret
; 0x15888
-
KrisLogOffMenu: ; 0x15888
xor a
scf
ret
; 0x1588b
-
KrisDepositItemMenu: ; 0x1588b
- call Function158b8
- jr c, .asm_158b6
+ call .CheckItemsInBag
+ jr c, .nope
call DisableSpriteUpdates
call LoadStandardMenuDataHeader
callba DepositSellInitPackBuffers
-.asm_1589c
+.loop
callba DepositSellPack
ld a, [wcf66]
and a
- jr z, .asm_158b3
- call Function158cc
+ jr z, .close
+ call .TryDepositItem
callba CheckRegisteredItem
- jr .asm_1589c
+ jr .loop
-.asm_158b3
+.close
call CloseSubmenu
-.asm_158b6
+.nope
xor a
ret
-; 0x158b8
-Function158b8: ; 0x158b8
+.CheckItemsInBag
callba HasNoItems
ret nc
- ld hl, UnknownText_0x158c7
+ ld hl, .NoItemsInBag
call MenuTextBoxBackup
scf
ret
-; 0x158c7
-UnknownText_0x158c7: ; 0x158c7
+.NoItemsInBag
; No items here!
text_jump UnknownText_0x1c13df
db "@"
-; 0x158cc
-
-Function158cc: ; 0x158cc
+.TryDepositItem
ld a, [wSpriteUpdatesEnabled]
push af
ld a, $0
@@ -477,9 +460,8 @@ Function158cc: ; 0x158cc
pop af
ld [wSpriteUpdatesEnabled], a
ret
-; 0x158e7
-.dw: ; 0x158e7
+.dw
dw .tossable
dw .no_toss
dw .no_toss
@@ -488,32 +470,31 @@ Function158cc: ; 0x158cc
dw .tossable
dw .tossable
-.no_toss:
+.no_toss
ret
-.tossable:
+.tossable
ld a, [Buffer1]
push af
ld a, [Buffer2]
push af
- call Function1590a
+ call .DepositItem_
pop af
ld [Buffer2], a
pop af
ld [Buffer1], a
ret
-; 0x1590a
-Function1590a: ; 0x1590a
+.DepositItem_
callba _CheckTossableItem
ld a, [wItemAttributeParamBuffer]
and a
- jr z, .asm_1591d
+ jr z, .AskQuantity
ld a, $1
ld [wItemQuantityChangeBuffer], a
- jr .asm_15933
+ jr .DepositItem
-.asm_1591d
+.AskQuantity
ld hl, .HowManyText
call MenuTextBox
callba SelectQuantityToToss
@@ -521,20 +502,20 @@ Function1590a: ; 0x1590a
call ExitMenu
call ExitMenu
pop af
- jr c, .asm_1596c
+ jr c, .DeclinedToDeposit
-.asm_15933
+.DepositItem
ld a, [wItemQuantityChangeBuffer]
ld [Buffer1], a
- ld a, [wd107]
+ ld a, [CurItemQuantity]
ld [Buffer2], a
ld hl, PCItems
call ReceiveItem
- jr nc, .asm_15965
+ jr nc, .NoRoomInPC
ld a, [Buffer1]
ld [wItemQuantityChangeBuffer], a
ld a, [Buffer2]
- ld [wd107], a
+ ld [CurItemQuantity], a
ld hl, NumItems
call TossItem
predef PartyMonItemName
@@ -542,16 +523,14 @@ Function1590a: ; 0x1590a
call PrintText
ret
-.asm_15965
+.NoRoomInPC
ld hl, .NoRoomText
call PrintText
ret
-.asm_1596c
+.DeclinedToDeposit
and a
ret
-; 0x1596e
-
.HowManyText ; 0x1596e
text_jump _KrissPCHowManyDepositText
@@ -565,87 +544,82 @@ Function1590a: ; 0x1590a
text_jump _KrissPCNoRoomDepositText
db "@"
-
KrisMailBoxMenu: ; 0x1597d
callba _KrisMailBoxMenu
xor a
ret
; 0x15985
-
-Function15985: ; 0x15985
+PCItemsJoypad: ; 0x15985
xor a
- ld [wd0e3], a
-.asm_15989
+ ld [wSwitchItem], a
+.loop
ld a, [wSpriteUpdatesEnabled]
push af
ld a, $0
ld [wSpriteUpdatesEnabled], a
- ld hl, MenuData15a08
+ ld hl, .PCItemsMenuData
call CopyMenuDataHeader
hlcoord 0, 0
- ld b, $a
- ld c, $12
+ ld b, 10
+ ld c, 18
call TextBox
- ld a, [wd0d7]
+ ld a, [wPCItemsCursor]
ld [wMenuCursorBuffer], a
- ld a, [wd0dd]
+ ld a, [wPCItemsScrollPosition]
ld [wMenuScrollPosition], a
call ScrollingMenu
ld a, [wMenuScrollPosition]
- ld [wd0dd], a
+ ld [wPCItemsScrollPosition], a
ld a, [wMenuCursorY]
- ld [wd0d7], a
+ ld [wPCItemsCursor], a
pop af
ld [wSpriteUpdatesEnabled], a
- ld a, [wd0e3]
+ ld a, [wSwitchItem]
and a
- jr nz, .asm_159d8
+ jr nz, .moving_stuff_around
ld a, [wMenuJoypad]
- cp $2
- jr z, .asm_15a06
- cp $1
- jr z, .asm_159fb
- cp $4
- jr z, .asm_159f2
- jr .asm_159f8
-
-.asm_159d8
+ cp B_BUTTON
+ jr z, .b_1
+ cp A_BUTTON
+ jr z, .a_1
+ cp SELECT
+ jr z, .select_1
+ jr .next
+
+.moving_stuff_around
ld a, [wMenuJoypad]
- cp $2
- jr z, .asm_159e9
- cp $1
- jr z, .asm_159ef
- cp $4
- jr z, .asm_159ef
- jr .asm_159f8
-
-.asm_159e9
+ cp B_BUTTON
+ jr z, .b_2
+ cp A_BUTTON
+ jr z, .a_select_2
+ cp SELECT
+ jr z, .a_select_2
+ jr .next
+
+.b_2
xor a
- ld [wd0e3], a
- jr .asm_159f8
-
-.asm_159ef
- call Function156c7
+ ld [wSwitchItem], a
+ jr .next
-.asm_159f2
+.a_select_2
+ call PC_PlaySwapItemsSound
+.select_1
callba SwitchItemsInBag
+.next
+ jp .loop
-.asm_159f8
- jp .asm_15989
-
-.asm_159fb
- callba Function24706
+.a_1
+ callba ScrollingMenu_ClearLeftColumn
call PlaceHollowCursor
and a
ret
-.asm_15a06
+.b_1
scf
ret
-; 0x15a08
-MenuData15a08: ; 0x15a08
+.PCItemsMenuData
db %01000000
db 1, 4 ; start coords
db 10, 18 ; end coords
@@ -667,38 +641,37 @@ PC_DisplayText: ; 15a20
ret
; 15a27
-
-UnknownText_0x15a27: ; 0x15a27
+PokeCenterPCText_BootedUpPC: ; 0x15a27
; turned on the PC.
text_jump UnknownText_0x1c144d
db "@"
; 0x15a2c
-UnknownText_0x15a2c: ; 0x15a2c
+PokeCenterPCText_AccessWhosePC: ; 0x15a2c
; Access whose PC?
text_jump UnknownText_0x1c1462
db "@"
; 0x15a31
-UnknownText_0x15a31: ; 0x15a31
+PokeCenterPCText_AccessedBillsPC: ; 0x15a31
; BILL's PC accessed. #MON Storage System opened.
text_jump UnknownText_0x1c1474
db "@"
; 0x15a36
-UnknownText_0x15a36: ; 0x15a36
+PokeCenterPCText_AccessedOwnPC: ; 0x15a36
; Accessed own PC. Item Storage System opened.
text_jump UnknownText_0x1c14a4
db "@"
; 0x15a3b
-UnknownText_0x15a3b: ; 0x15a3b
+PokeCenterPCText_AccessedOaksPC: ; 0x15a3b
; PROF.OAK's PC accessed. #DEX Rating System opened.
text_jump UnknownText_0x1c14d2
db "@"
; 0x15a40
-UnknownText_0x15a40: ; 0x15a40
+PokeCenterPCText_LinkClosed: ; 0x15a40
; … Link closed…
text_jump UnknownText_0x1c1505
db "@"
diff --git a/engine/pokegear.asm b/engine/pokegear.asm
index 44127fafc..c6829adbe 100755
--- a/engine/pokegear.asm
+++ b/engine/pokegear.asm
@@ -2841,7 +2841,7 @@ TownMapPals: ; 91f13
; The palette data is condensed to nybbles,
; least-significant first.
- ld hl, TownMapPalMap
+ ld hl, .PalMap
srl a
jr c, .odd
; Even-numbered tile ids take the bottom nybble...
@@ -2878,13 +2878,20 @@ TownMapPals: ; 91f13
jr nz, .loop
ret
-TownMapPalMap:
- dn 1, 1, 2, 1, 2, 2, 0, 0, 1, 1, 1, 3, 5, 4, 5, 4
- dn 1, 1, 2, 1, 2, 2, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0
- dn 1, 1, 2, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- dn 0, 0, 0, 0, 4, 4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0
- dn 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3
- dn 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0
+.PalMap
+townmappals: MACRO
+rept _NARG / 2
+ dn \2, \1
+ shift
+ shift
+endr
+endm
+ townmappals 1, 1, 1, 2, 2, 2, 0, 0, 1, 1, 3, 1, 4, 5, 4, 5
+ townmappals 1, 1, 1, 2, 2, 2, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0
+ townmappals 1, 1, 1, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ townmappals 0, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ townmappals 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0
+ townmappals 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0
; 91f7b
TownMapMon: ; 91f7b
diff --git a/engine/printnum.asm b/engine/printnum.asm
new file mode 100755
index 000000000..4ef7721c8
--- /dev/null
+++ b/engine/printnum.asm
@@ -0,0 +1,300 @@
+_PrintNum:: ; c4c7
+; Print c digits of the b-byte value from de to hl.
+; Allows 2 to 7 digits. For 1-digit numbers, add
+; the value to char "0" instead of calling PrintNum.
+; Some extra flags can be given in bits 5-7 of b.
+; Bit 5: money if set (unless left-aligned without leading zeros)
+; Bit 6: right-aligned if set
+; Bit 7: print leading zeros if set
+
+ push bc
+
+ bit 5, b
+ jr z, .main
+ bit 7, b
+ jr nz, .moneyflag
+ bit 6, b
+ jr z, .main
+
+.moneyflag ; 101xxxxx or 011xxxxx
+ ld a, "¥"
+ ld [hli], a
+ res 5, b ; 100xxxxx or 010xxxxx
+
+.main
+ xor a
+ ld [hPrintNum1], a
+ ld [hPrintNum2], a
+ ld [hPrintNum3], a
+ ld a, b
+ and $f
+ cp 1
+ jr z, .byte
+ cp 2
+ jr z, .word
+; maximum 3 bytes
+.long
+ ld a, [de]
+ ld [hPrintNum2], a
+ inc de
+ ld a, [de]
+ ld [hPrintNum3], a
+ inc de
+ ld a, [de]
+ ld [hPrintNum4], a
+ jr .start
+
+.word
+ ld a, [de]
+ ld [hPrintNum3], a
+ inc de
+ ld a, [de]
+ ld [hPrintNum4], a
+ jr .start
+
+.byte
+ ld a, [de]
+ ld [hPrintNum4], a
+
+.start
+ push de
+
+ ld d, b
+ ld a, c
+ swap a
+ and $f
+ ld e, a
+ ld a, c
+ and $f
+ ld b, a
+ ld c, 0
+ cp 2
+ jr z, .two
+ cp 3
+ jr z, .three
+ cp 4
+ jr z, .four
+ cp 5
+ jr z, .five
+ cp 6
+ jr z, .six
+
+.seven
+ ld a, 1000000 / $10000 % $100
+ ld [hPrintNum5], a
+ ld a, 1000000 / $100 % $100
+ ld [hPrintNum6], a
+ ld a, 1000000 % $100
+ ld [hPrintNum7], a
+ call .PrintDigit
+ call .AdvancePointer
+
+.six
+ ld a, 100000 / $10000 % $100
+ ld [hPrintNum5], a
+ ld a, 100000 / $100 % $100
+ ld [hPrintNum6], a
+ ld a, 100000 % $100
+ ld [hPrintNum7], a
+ call .PrintDigit
+ call .AdvancePointer
+
+.five
+ xor a
+ ld [hPrintNum5], a
+ ld a, 10000 / $100
+ ld [hPrintNum6], a
+ ld a, 10000 % $100
+ ld [hPrintNum7], a
+ call .PrintDigit
+ call .AdvancePointer
+
+.four
+ xor a
+ ld [hPrintNum5], a
+ ld a, 1000 / $100
+ ld [hPrintNum6], a
+ ld a, 1000 % $100
+ ld [hPrintNum7], a
+ call .PrintDigit
+ call .AdvancePointer
+
+.three
+ xor a
+ ld [hPrintNum5], a
+ xor a
+ ld [hPrintNum6], a
+ ld a, 100
+ ld [hPrintNum7], a
+ call .PrintDigit
+ call .AdvancePointer
+
+.two
+ dec e
+ jr nz, .two_skip
+ ld a, "0"
+ ld [hPrintNum1], a
+.two_skip
+
+ ld c, 0
+ ld a, [hPrintNum4]
+.mod_10
+ cp 10
+ jr c, .modded_10
+ sub 10
+ inc c
+ jr .mod_10
+.modded_10
+
+ ld b, a
+ ld a, [hPrintNum1]
+ or c
+ jr nz, .money
+ call .PrintLeadingZero
+ jr .money_leading_zero
+
+.money
+ call .PrintYen
+ push af
+ ld a, "0"
+ add c
+ ld [hl], a
+ pop af
+ ld [hPrintNum1], a
+ inc e
+ dec e
+ jr nz, .money_leading_zero
+ inc hl
+ ld [hl], $f2 ; XXX
+
+.money_leading_zero
+ call .AdvancePointer
+ call .PrintYen
+ ld a, "0"
+ add b
+ ld [hli], a
+
+ pop de
+ pop bc
+ ret
+
+.PrintYen: ; c5ba
+ push af
+ ld a, [hPrintNum1]
+ and a
+ jr nz, .stop
+ bit 5, d
+ jr z, .stop
+ ld a, "¥"
+ ld [hli], a
+ res 5, d
+
+.stop
+ pop af
+ ret
+
+.PrintDigit: ; c5cb (3:45cb)
+ dec e
+ jr nz, .ok
+ ld a, "0"
+ ld [hPrintNum1], a
+.ok
+ ld c, 0
+.loop
+ ld a, [hPrintNum5]
+ ld b, a
+ ld a, [hPrintNum2]
+ ld [hPrintNum8], a
+ cp b
+ jr c, .skip1
+ sub b
+ ld [hPrintNum2], a
+ ld a, [hPrintNum6]
+ ld b, a
+ ld a, [hPrintNum3]
+ ld [hPrintNum9], a
+ cp b
+ jr nc, .skip2
+ ld a, [hPrintNum2]
+ or 0
+ jr z, .skip3
+ dec a
+ ld [hPrintNum2], a
+ ld a, [hPrintNum3]
+.skip2
+ sub b
+ ld [hPrintNum3], a
+ ld a, [hPrintNum7]
+ ld b, a
+ ld a, [hPrintNum4]
+ ld [hPrintNum10], a
+ cp b
+ jr nc, .skip4
+ ld a, [hPrintNum3]
+ and a
+ jr nz, .skip5
+ ld a, [hPrintNum2]
+ and a
+ jr z, .skip6
+ dec a
+ ld [hPrintNum2], a
+ xor a
+.skip5
+ dec a
+ ld [hPrintNum3], a
+ ld a, [hPrintNum4]
+.skip4
+ sub b
+ ld [hPrintNum4], a
+ inc c
+ jr .loop
+.skip6
+ ld a, [hPrintNum9]
+ ld [hPrintNum3], a
+.skip3
+ ld a, [hPrintNum8]
+ ld [hPrintNum2], a
+.skip1
+ ld a, [hPrintNum1]
+ or c
+ jr z, .PrintLeadingZero
+ ld a, [hPrintNum1]
+ and a
+ jr nz, .done
+ bit 5, d
+ jr z, .done
+ ld a, "¥"
+ ld [hli], a
+ res 5, d
+.done
+ ld a, "0"
+ add c
+ ld [hl], a
+ ld [hPrintNum1], a
+ inc e
+ dec e
+ ret nz
+ inc hl
+ ld [hl], "·"
+ ret
+
+.PrintLeadingZero: ; c644
+; prints a leading zero unless they are turned off in the flags
+ bit 7, d ; print leading zeroes?
+ ret z
+ ld [hl], "0"
+ ret
+
+.AdvancePointer: ; c64a
+; increments the pointer unless leading zeroes are not being printed,
+; the number is left-aligned, and no nonzero digits have been printed yet
+ bit 7, d ; print leading zeroes?
+ jr nz, .inc
+ bit 6, d ; left alignment or right alignment?
+ jr z, .inc
+ ld a, [hPrintNum1]
+ and a
+ ret z
+.inc
+ inc hl
+ ret
diff --git a/engine/scrolling_menu.asm b/engine/scrolling_menu.asm
index b09453239..001beb71b 100755
--- a/engine/scrolling_menu.asm
+++ b/engine/scrolling_menu.asm
@@ -210,17 +210,17 @@ ScrollingMenu_GetCursorPosition: ; 246fc
ret
; 24706
-Function24706: ; 24706 (9:4706)
+ScrollingMenu_ClearLeftColumn: ; 24706 (9:4706)
call MenuBoxCoord2Tile
ld de, SCREEN_WIDTH
add hl, de
ld de, 2 * SCREEN_WIDTH
ld a, [wMenuData2_ScrollingMenuHeight]
-.asm_24713
+.loop
ld [hl], " "
add hl, de
dec a
- jr nz, .asm_24713
+ jr nz, .loop
ret
InitScrollingMenuCursor: ; 2471a
diff --git a/engine/sine.asm b/engine/sine.asm
new file mode 100755
index 000000000..b5da8059c
--- /dev/null
+++ b/engine/sine.asm
@@ -0,0 +1,50 @@
+_Sine:: ; 84d9
+; A simple sine function.
+; Return d * sin(e) in hl.
+
+; e is a signed 6-bit value.
+ ld a, e
+ and %111111
+ cp %100000
+ jr nc, .negative
+
+ call .ApplySineWave
+ ld a, h
+ ret
+
+.negative
+ and %011111
+ call .ApplySineWave
+ ld a, h
+ xor -1
+ inc a
+ ret
+
+.ApplySineWave: ; 84ef
+ ld e, a
+ ld a, d
+ ld d, 0
+ ld hl, .sinewave
+ add hl, de
+ add hl, de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, 0
+
+; Factor amplitude
+.multiply
+ srl a
+ jr nc, .even
+ add hl, de
+.even
+ sla e
+ rl d
+ and a
+ jr nz, .multiply
+ ret
+
+.sinewave: ; 850b
+; A $20-word table representing a sine wave.
+; 90 degrees is index $10 at a base amplitude of $100.
+ sine_wave $100
diff --git a/engine/startmenu.asm b/engine/startmenu.asm
index 25a3eee39..acad9bb88 100755
--- a/engine/startmenu.asm
+++ b/engine/startmenu.asm
@@ -91,7 +91,7 @@ StartMenu:: ; 125cd
ld [MenuSelection], a
.loop
call .PrintMenuAccount
- call Function1f1a
+ call GetScrollingMenuJoypad
ld a, [wMenuJoypad]
cp B_BUTTON
jr z, .b
@@ -591,70 +591,66 @@ HasNoItems: ; 129d5
and a
ret
-Function129f4: ; 129f4
+TossItemFromPC: ; 129f4
push de
call PartyMonItemName
callba _CheckTossableItem
ld a, [wItemAttributeParamBuffer]
and a
- jr nz, .asm_12a3f
- ld hl, UnknownText_0x12a45
+ jr nz, .key_item
+ ld hl, .TossHowMany
call MenuTextBox
callba SelectQuantityToToss
push af
call CloseWindow
call ExitMenu
pop af
- jr c, .asm_12a42
- ld hl, UnknownText_0x12a4a
+ jr c, .quit
+ ld hl, .ConfirmToss
call MenuTextBox
call YesNoBox
push af
call ExitMenu
pop af
- jr c, .asm_12a42
+ jr c, .quit
pop hl
ld a, [wd107]
call TossItem
call PartyMonItemName
- ld hl, UnknownText_0x12a4f
+ ld hl, .TossedThisMany
call MenuTextBox
call ExitMenu
and a
ret
-.asm_12a3f
- call Function12a54
-.asm_12a42
+
+.key_item
+ call .CantToss
+.quit
pop hl
scf
ret
-; 12a45 (4:6a45)
-UnknownText_0x12a45: ; 0x12a45
+.TossHowMany
; Toss out how many @ (S)?
text_jump UnknownText_0x1c1a90
db "@"
-; 0x12a4a
-UnknownText_0x12a4a: ; 0x12a4a
+.ConfirmToss
; Throw away @ @ (S)?
text_jump UnknownText_0x1c1aad
db "@"
-; 0x12a4f
-UnknownText_0x12a4f: ; 0x12a4f
+.TossedThisMany
; Discarded @ (S).
text_jump UnknownText_0x1c1aca
db "@"
-; 0x12a54
-Function12a54: ; 12a54 (4:6a54)
- ld hl, UnknownText_0x12a5b
+.CantToss
+ ld hl, .TooImportantToToss
call MenuTextBoxBackup
ret
-; 12a5b (4:6a5b)
-UnknownText_0x12a5b: ; 0x12a5b
+.TooImportantToToss
; That's too impor- tant to toss out!
text_jump UnknownText_0x1c1adf
db "@"
@@ -830,7 +826,7 @@ GiveTakePartyMonItem: ; 12b60
; 12ba9
-.GiveItem: ; 12ba9
+.GiveItem
callba DepositSellInitPackBuffers
@@ -1168,7 +1164,7 @@ MonMailAction: ; 12d45
; 12dc9
-.MenuDataHeader: ; 0x12dc9
+.MenuDataHeader
db $40 ; flags
db 10, 12 ; start coords
db 17, 19 ; end coords
@@ -1176,7 +1172,7 @@ MonMailAction: ; 12d45
db 1 ; default option
; 0x12dd1
-.MenuData2: ; 0x12dd1
+.MenuData2
db $80 ; flags
db 3 ; items
db "READ@"
@@ -1185,37 +1181,37 @@ MonMailAction: ; 12d45
; 0x12de2
-.mailwilllosemessagetext: ; 0x12de2
+.mailwilllosemessagetext
; The MAIL will lose its message. OK?
text_jump UnknownText_0x1c1c22
db "@"
; 0x12de7
-.tookmailfrommontext: ; 0x12de7
+.tookmailfrommontext
; MAIL detached from <POKEMON>.
text_jump UnknownText_0x1c1c47
db "@"
; 0x12dec
-.bagfulltext: ; 0x12dec
+.bagfulltext
; There's no space for removing MAIL.
text_jump UnknownText_0x1c1c62
db "@"
; 0x12df1
-.sendmailtopctext: ; 0x12df1
+.sendmailtopctext
; Send the removed MAIL to your PC?
text_jump UnknownText_0x1c1c86
db "@"
; 0x12df6
-.mailboxfulltext: ; 0x12df6
+.mailboxfulltext
; Your PC's MAILBOX is full.
text_jump UnknownText_0x1c1ca9
db "@"
; 0x12dfb
-.sentmailtopctext: ; 0x12dfb
+.sentmailtopctext
; The MAIL was sent to your PC.
text_jump UnknownText_0x1c1cc4
db "@"
@@ -1392,13 +1388,13 @@ MonMenu_Softboiled_MilkDrink: ; 12ee6
ret
; 12f00
-.Text_NotEnoughHP: ; 0x12f00
+.Text_NotEnoughHP
; Not enough HP!
text_jump UnknownText_0x1c1ce3
db "@"
; 0x12f05
-.CheckMonHasEnoughHP: ; 12f05
+.CheckMonHasEnoughHP
; Need to have at least (MaxHP / 5) HP left.
ld a, MON_MAXHP
call GetPartyParamLocation
@@ -1471,7 +1467,7 @@ ChooseMoveToDelete: ; 12f5b
ret
; 12f73
-.asm_12f73: ; 12f73
+.asm_12f73
call SetUpMoveScreenBG
ld de, DeleteMoveScreenAttrs
call SetMenuAttributes
@@ -1480,27 +1476,27 @@ ChooseMoveToDelete: ; 12f5b
set 6, [hl]
jr .asm_12f93
-.asm_12f86: ; 12f86
+.asm_12f86
call ScrollingMenuJoypad
bit 1, a
jp nz, .asm_12f9f
bit 0, a
jp nz, .asm_12f9c
-.asm_12f93: ; 12f93
+.asm_12f93
call PrepareToPlaceMoveData
call PlaceMoveData
jp .asm_12f86
; 12f9c
-.asm_12f9c: ; 12f9c
+.asm_12f9c
and a
jr .asm_12fa0
-.asm_12f9f: ; 12f9f
+.asm_12f9f
scf
-.asm_12fa0: ; 12fa0
+.asm_12fa0
push af
xor a
ld [wSwitchMon], a
@@ -1583,7 +1579,7 @@ MoveScreenLoop: ; 12fd5
ld de, String_1316b
call PlaceString
jp .joy_loop
-.b_button: ; 13038
+.b_button
call PlayClickSFX
call WaitSFX
ld a, [wMoveSwapBuffer]
@@ -1600,7 +1596,7 @@ MoveScreenLoop: ; 12fd5
jp .loop
; 1305b
-.d_right: ; 1305b
+.d_right
ld a, [wMoveSwapBuffer]
and a
jp nz, .joy_loop
@@ -1615,7 +1611,7 @@ MoveScreenLoop: ; 12fd5
jp z, .joy_loop
jp MoveScreenLoop
-.d_left: ; 13075
+.d_left
ld a, [wMoveSwapBuffer]
and a
jp nz, .joy_loop
@@ -1665,7 +1661,7 @@ MoveScreenLoop: ; 12fd5
jr .cycle_left_loop
; 130c6
-.a_button: ; 130c6
+.a_button
call PlayClickSFX
call WaitSFX
ld a, [wMoveSwapBuffer]
@@ -1716,7 +1712,7 @@ MoveScreenLoop: ; 12fd5
jp .loop
; 1313a
-.copy_move: ; 1313a
+.copy_move
push hl
ld a, [wMenuCursorY]
dec a
@@ -1739,7 +1735,7 @@ MoveScreenLoop: ; 12fd5
ret
; 13154
-.exit: ; 13154
+.exit
xor a
ld [wMoveSwapBuffer], a
ld hl, w2DMenuFlags1
@@ -1776,7 +1772,7 @@ SetUpMoveScreenBG: ; 13172
ld a, [hl]
ld [wd265], a
ld e, $2
- callba Function8e83f
+ callba LoadMenuMonIcon
hlcoord 0, 1
ld b, 9
ld c, 18
diff --git a/engine/tile_events.asm b/engine/tile_events.asm
index a6794e817..77f267b4f 100755
--- a/engine/tile_events.asm
+++ b/engine/tile_events.asm
@@ -21,17 +21,17 @@ CheckDirectionalWarp:: ; 149af
; Else, set carry (immediate warp).
ld a, [PlayerStandingTile]
cp $70 ; Warp on down
- jr z, .not_warp
+ jr z, .directional
cp $76 ; Warp on left
- jr z, .not_warp
+ jr z, .directional
cp $78 ; Warp on up
- jr z, .not_warp
+ jr z, .directional
cp $7e ; Warp on right
- jr z, .not_warp
+ jr z, .directional
scf
ret
-.not_warp
+.directional
xor a
ret
; 149c6
diff --git a/engine/time.asm b/engine/time.asm
index 4240522c2..29670afdc 100755
--- a/engine/time.asm
+++ b/engine/time.asm
@@ -124,16 +124,14 @@ endr
jr z, .RestartKenjiBreakCountdown
dec [hl]
jr nz, .DontRestartKenjiBreakCountdown
-
.RestartKenjiBreakCountdown
call Special_SampleKenjiBreakCountdown
-
.DontRestartKenjiBreakCountdown
jr RestartDailyResetTimer
; 11485
Special_SampleKenjiBreakCountdown: ; 11485
-; Generate a random number between 3 and 5
+; Generate a random number between 3 and 6
call Random
and 3
add 3
diff --git a/engine/trade/animation.asm b/engine/trade/animation.asm
index 719a230ff..be5318b2e 100755
--- a/engine/trade/animation.asm
+++ b/engine/trade/animation.asm
@@ -1440,7 +1440,7 @@ LoadTradeBallAndCableGFX: ; 2982b
LoadTradeBubbleGFX: ; 2985a
call DelayFrame
ld e, $3
- callab Function8e83f
+ callab LoadMenuMonIcon
ld de, TradeBubbleGFX
ld hl, VTiles0 tile $72
lb bc, BANK(TradeBubbleGFX), $4