summaryrefslogtreecommitdiff
path: root/engine
diff options
context:
space:
mode:
Diffstat (limited to 'engine')
-rwxr-xr-xengine/bcd.asm110
-rwxr-xr-xengine/events/field_moves.asm1626
-rwxr-xr-xengine/items/inventory.asm1446
-rwxr-xr-xengine/items/item_effects.asm158
-rw-r--r--[-rwxr-xr-x]engine/overworld/object_collision.asm314
-rwxr-xr-xengine/overworld/spawn_points.asm118
-rwxr-xr-xengine/pokemon/health.asm716
-rwxr-xr-xengine/smallflag.asm142
8 files changed, 2587 insertions, 2043 deletions
diff --git a/engine/bcd.asm b/engine/bcd.asm
index 020dc64..6d441b2 100755
--- a/engine/bcd.asm
+++ b/engine/bcd.asm
@@ -1,55 +1,55 @@
-INCLUDE "constants.asm"
-
-SECTION "BCD", ROMX[$4de3], BANK[$03]
-
-AddBCD: ; 03:4de3
- and a
- ld b, c
-.add
- ld a, [de]
- adc [hl]
- daa
- ld [de], a
- dec de
- dec hl
- dec c
- jr nz, .add
- jr nc, .done
-
- ld a, $99
- inc de
-
-.fill
- ld [de], a
- inc de
- dec b
- jr nz, .fill
-
-.done
- ret
-
-
-SubBCD: ; 03:4df9
- and a
- ld b, c
-.sub
- ld a, [de]
- sbc [hl]
- daa
- ld [de], a
- dec de
- dec hl
- dec c
- jr nz, .sub
- jr nc, .done
- ld a, 0
- inc de
-
-.fill
- ld [de], a
- inc de
- dec b
- jr nz, .fill
- scf
-.done
- ret
+INCLUDE "constants.asm"
+
+SECTION "BCD", ROMX[$4de3], BANK[$03]
+
+AddBCD: ; 03:4de3
+ and a
+ ld b, c
+.add
+ ld a, [de]
+ adc [hl]
+ daa
+ ld [de], a
+ dec de
+ dec hl
+ dec c
+ jr nz, .add
+ jr nc, .done
+
+ ld a, $99
+ inc de
+
+.fill
+ ld [de], a
+ inc de
+ dec b
+ jr nz, .fill
+
+.done
+ ret
+
+
+SubBCD: ; 03:4df9
+ and a
+ ld b, c
+.sub
+ ld a, [de]
+ sbc [hl]
+ daa
+ ld [de], a
+ dec de
+ dec hl
+ dec c
+ jr nz, .sub
+ jr nc, .done
+ ld a, 0
+ inc de
+
+.fill
+ ld [de], a
+ inc de
+ dec b
+ jr nz, .fill
+ scf
+.done
+ ret
diff --git a/engine/events/field_moves.asm b/engine/events/field_moves.asm
index f6e53a3..bee72f9 100755
--- a/engine/events/field_moves.asm
+++ b/engine/events/field_moves.asm
@@ -1,541 +1,1085 @@
-INCLUDE "constants.asm"
-
-; TODO - need to constantize tile ids, movements
-
-SECTION "Field Moves", ROMX[$4fab], BANK[$03]
-
-CutFunction: ; 03:4fab
- call .ResetScriptID
-.next
- call .ExecScript
- jr nc, .next
- ld [wFieldMoveSucceeded], a
- ret
-.ResetScriptID
- xor a
- ld [wFieldMoveScriptID], a
- ret
-.ExecScript
- ld a, [wFieldMoveScriptID]
- ld hl, .CutScriptTable
- jp CallJumptable
-
-.CutScriptTable ; 03:4fc5
- init_script_table
- add_script TryCut
- add_script CheckCuttableBlock
- add_script CheckCuttableTile
- add_script DoCut
- add_script DoCut2
- add_script FailCut
-
-TryCut: ; 03:4fd1
- call GetMapEnvironment
- cp ROUTE
- jr z, .success
- cp TOWN
- jr z, .success
- set_script FailCut
- xor a
- ret
-.success
- set_script CheckCuttableBlock
- xor a
- ret
-
-CheckCuttableBlock: ; 03:4fea
- call GetFacingTileCoord
- cp $80
- jr nz, .fail
- call GetBlockLocation
- ld a, l
- ld [wMapBlocksAddress], a
- ld a, h
- ld [wMapBlocksAddress + 1], a
- ld a, [hl]
- call GetCutReplacementBlock
- jr nc, .fail
- dec hl
- ld a, [hl]
- ld [wReplacementBlock], a
- set_script DoCut2
- xor a
- ret
-.fail
- set_script CheckCuttableTile
- xor a
- ret
-
-GetCutReplacementBlock: ; 03:5015
- ld c, a
- ld hl, CutReplacementBlocks
-.loop
- ld a, [hli]
- cp -1
- ret z
- inc hl
- cp c
- jr nz, .loop
- scf
- ret
-
-CutReplacementBlocks: ; 03:5023
-; replacement block, facing block
- db $30, $25
- db $31, $2A
- db $32, $34
- db $33, $35
- db -1
-
-CheckCuttableTile: ; 03:502c
- call GetFacingTileCoord
- call IsCuttableTile
- jr nc, .fail
- call GetBlockLocation
- ld a, [hl]
- cp $3b
- jr nz, .fail
- ld a, l
- ld [wMapBlocksAddress], a
- ld a, h
- ld [wMapBlocksAddress + 1], a
- ld a, $04
- ld [wReplacementBlock], a
- set_script DoCut
- xor a
- ret
-.fail
- set_script FailCut
- xor a
- ret
-
-IsCuttableTile: ; 03:5057
- ld hl, CuttableTiles
- ld c, a
-.loop
- ld a, [hli]
- cp -1
- ret z
- cp c
- jr nz, .loop
- scf
- ret
-
-CuttableTiles: ; 03:5064
- db $81
- db $82
- db $8A
- db $8B
- db -1
-
-FailCut: ; 03:5069
- ld hl, Text_CantUseCutHere
- call MenuTextBoxBackup
- scf
- ld a, SCRIPT_FAIL
- ret
-
-Text_CantUseCutHere: ; 03:5073
- text "ここでは つかえません"
- prompt
-
-DoCut:
-DoCut2: ; 03:5080
- far_queue CutScript
- scf
- ld a, SCRIPT_SUCCESS
- ret
-
-CutScript: ; 03:508C
- call RefreshScreen
- ld hl, wPartyMonNicknames
- ld a, BOXMON
- ld [wMonType], a
- ld a, [wWhichPokemon]
- call GetNick
- call CopyStringToStringBuffer2
- ld hl, Text_CutItDown
- call MenuTextBoxBackup
- ld de, MUSIC_SURF
- call PlaySFX
- ld hl, wMapBlocksAddress
- ld a, [hli]
- ld h, [hl]
- ld l, a
- ld a, [wReplacementBlock]
- ld [hl], a
- call LoadMapPart
- call UpdateSprites
- call WaitBGMap
- call Function1fea
- scf
- ret
-
-Text_CutItDown ; 03:50c4
- text_from_ram wStringBuffer2
- text " は "
- line "くさかりを つかった!"
- prompt
-
-SurfFunction: ; 03:50d8
- call .ResetScriptID
-.next
- call .ExecScript
- jr nc, .next
- ld [wFieldMoveSucceeded], a
- ret
-.ResetScriptID
- xor a
- ld [wFieldMoveScriptID], a
- ret
-.ExecScript
- ld a, [wFieldMoveScriptID]
- ld hl, .SurfScriptTable
- jp CallJumptable
-
-.SurfScriptTable: ; 03:50f2
- init_script_table
- add_script TrySurf
- add_script DoSurf
- add_script FailSurf
-
-TrySurf: ; 03:50f8
- call GetFacingTileCoord
- and $f0
- cp $20
- jr z, .success
- cp $40
- jr z, .success
- set_script FailSurf
- xor a
- ret
-.success
- set_script DoSurf
- xor a
- ret
-
-DoSurf: ; 03:5113
- queue_ba SurfScript
- ld a, -1
- ld [wFieldMoveScriptID], a
- scf
- ld a, SCRIPT_SUCCESS
- ret
-
-FailSurf: ; 03:5124
- ld hl, Text_CantSurfHere
- call MenuTextBoxBackup
- ld a, -1
- ld [wFieldMoveScriptID], a
- scf
- ld a, SCRIPT_FAIL
- ret
-
-Text_CantSurfHere: ; 03:5133
- text "ここでは のることが"
- next "できません"
- prompt
-
-SurfScript: ; 03:5145
- call RefreshScreen
- ld hl, wPartyMonNicknames
- ld a, BOXMON
- ld [wMonType], a
- ld a, [wWhichPokemon]
- call GetNick
- call CopyStringToStringBuffer2
- ld hl, Text_UsedSurf
- call MenuTextBoxBackup
- ld a, PLAYER_SURF
- ld [wPlayerState], a
- call RedrawPlayerSprite
- call PlayMapMusic
- call MovePlayerIntoWater
- call Function1fea
- ret
-
-Text_UsedSurf: ; 03:5171
- text_from_ram wStringBuffer2
- text " は "
- line "@"
- text_from_ram wPlayerName
- text "を のせた!"
- prompt
-
-MovePlayerIntoWater: ; 03:5185
- call InitMovementBuffer
- call .get_movement_direction
- call AppendToMovementBuffer
- ld a, $32
- call AppendToMovementBuffer
- ld a, 0
- ld hl, wMovementBuffer
- call LoadMovementDataPointer
-.get_movement_direction
- ld a, [wPlayerWalking]
- srl a
- srl a
- ld e, a
- ld d, $00
- ld hl, SurfMovementDirections
- add hl, de
- ld a, [hl]
- ret
-
-; Direction to move player, mapped to facing direction
-SurfMovementDirections: ; 03:51ab
- db 4, 5, 6, 7
-
-
-FlyFunction: ; 03:51af
- call .ResetScriptID
-.next
- call .ExecScript
- jr nc, .next
- ld [wFieldMoveSucceeded], a
- ret
-.ResetScriptID
- xor a
- ld [wFieldMoveScriptID], a
- ret
-.ExecScript
- ld a, [wFieldMoveScriptID]
- ld hl, .FlyScriptTable
- jp CallJumptable
-
-.FlyScriptTable: ; 03:51c9
- init_script_table
- add_script TryFly
- add_script ShowFlyMap
- add_script DoFly
- add_script FailFly
-
-TryFly: ; 03:51d1
- call GetMapEnvironment
- cp TOWN
- jr z, .success
- cp ROUTE
- jr z, .success
- set_script FailFly
- xor a
- ret
-.success
- set_script ShowFlyMap
- xor a
- ret
-
-ShowFlyMap: ; 03:51ea
- call LoadStandardMenuHeader
- call ClearSprites
- callab FlyMap
- call ClearPalettes
- call GetMemSGBLayout
- call ExitMenu
- ld a, [wFlyDestination]
- cp -1
- jr z, .dont_fly
- cp NUM_SPAWNS
- jr nc, .dont_fly
- set_script DoFly
- xor a
- ret
-.dont_fly
- call UpdateTimePals
- ld a, -1
- ld [wFieldMoveScriptID], a
- scf
- ld a, SCRIPT_FAIL
- ret
-
-DoFly: ; 03:521f
- ld a, [wFlyDestination]
- inc a
- ld [wDefaultSpawnPoint], a
- queue_ba FlyScript
- ld a, -1
- ld [wFieldMoveScriptID], a
- scf
- ld a, SCRIPT_SUCCESS
- ret
-
-FailFly: ; 03:5237
- ld hl, Text_CantUseFlyHere
- call MenuTextBoxBackup
- ld a, -1
- ld [wFieldMoveScriptID], a
- scf
- ld a, SCRIPT_FAIL
- ret
-
-Text_CantUseFlyHere: ; 03:5246
- text "ここでは つかえません!"
- prompt
-
-FlyScript: ; 03:5254
- ld a, MAPSETUP_TELEPORT
- ldh [hMapEntryMethod], a
- jpab Functionfcc24
-
-
-DigFunction: ; 03:5260
- call .ResetScriptID
-.next
- ld a, [wFieldMoveScriptID]
- bit SCRIPT_FINISHED_F, a
- jr nz, .finish
- ld hl, .DigScriptTable
- call CallJumptable
- jr .next
-
-; Finish by returning only the low nibble
-.finish
- and $FF - SCRIPT_FINISHED_MASK
- ld [wFieldMoveSucceeded], a
- ret
-
-.ResetScriptID
- xor a
- ld [wFieldMoveScriptID], a
- ret
-
-.DigScriptTable: ; 03:527D
- init_script_table
- add_script CheckCanDig
- add_script DoDig
- add_script FailDig
-
-CheckCanDig: ; 03:5283
- call GetMapEnvironment
- cp INDOOR
- jr z, .success
- cp CAVE
- jr z, .success
- set_script FailDig
- ret
-.success
- set_script DoDig
- ret
-
-DoDig: ; 03:529a
- queue_ab DigScript
- ld a, SCRIPT_FINISHED_MASK | SCRIPT_SUCCESS
- ld [wFieldMoveScriptID], a
- ret
-
-FailDig: ; 03:52a8
- ld hl, Text_CantUseDigHere
- call MenuTextBoxBackup
- ld a, SCRIPT_FINISHED_MASK | SCRIPT_FAIL
- ld [wFieldMoveScriptID], a
- ret
-
-Text_CantUseDigHere: ; 03:52b4
- text "ここでは つかえません!"
- prompt
-
-DigScript: ; 03:52c2
- ld hl, wDigWarpNumber
- ld de, wNextWarp
- ld bc, 3
- call CopyBytes
- ld a, MAPSETUP_WARP
- ldh [hMapEntryMethod], a
- jpab Functionfcc24
-
-EmptyFunctiond2da: ; 03:52da
- ret
-
-TeleportFunction: ; 03:52db
- xor a
- ld [wFieldMoveScriptID], a
-.next
- ld a, [wFieldMoveScriptID]
- bit SCRIPT_FINISHED_F, a
- jr nz, .finish
- ld hl, .TeleportScriptTable
- call CallJumptable
- jr .next
-
-; Finish by returning only the low nibble
-.finish
- and $FF - SCRIPT_FINISHED_MASK
- ld [wFieldMoveSucceeded], a
- ret
-
-.TeleportScriptTable
- init_script_table
- add_script TryTeleport
- add_script DoTeleport
- add_script FailTeleport
- add_script CheckIfSpawnPoint
-
-TryTeleport: ; 03:52fc
- call GetMapEnvironment
- cp TOWN
- jr z, .success
- cp ROUTE
- jr z, .success
- set_script FailTeleport
- ret
-.success
- set_script CheckIfSpawnPoint
- ret
-
-CheckIfSpawnPoint ; 03:5313
- ld a, [wLastSpawnMapGroup]
- ld d, a
- ld a, [wLastSpawnMapNumber]
- ld e, a
- callab IsSpawnPoint
- jr c, .not_spawn
- ld hl, Text_CantFindDestination
- call MenuTextBoxBackup
- ld a, SCRIPT_FINISHED_MASK | SCRIPT_FAIL
- ld [wFieldMoveScriptID], a
- ret
-.not_spawn
- ld a, c
- ld [wDefaultSpawnPoint], a
- set_script DoTeleport
- ret
-
-Text_CantFindDestination: ; 03:533B
- text "とびさきが みつかりません"
- para ""
- done
-
-DoTeleport: ; 03:534b
- queue_ba TeleportScript
- ld a, SCRIPT_FINISHED_MASK | SCRIPT_SUCCESS
- ld [wFieldMoveScriptID], a
- ret
-
-FailTeleport: ; 03:5359
- ld hl, Text_CantUseTeleportHere
- call MenuTextBoxBackup
- ld a, SCRIPT_FINISHED_MASK | SCRIPT_FAIL
- ld [wFieldMoveScriptID], a
- scf
- ret
-
-Text_CantUseTeleportHere: ; 03:5366
- text "ここでは つかえません!"
- para ""
- done
-
-TeleportScript: ; 03:5375
- call RefreshScreen
- ld hl, Text_ReturnToLastMonCenter
- call MenuTextBox
- ld c, 60
- call DelayFrames
- call CloseWindow
- call Function1fea
- ld a, MAPSETUP_TELEPORT
- ldh [hMapEntryMethod], a
- jpab Functionfcc24
-
-Text_ReturnToLastMonCenter: ; 03:5395
- text "さいごに たちよった"
- line "#センターにもどります"
- done
+<<<<<<< HEAD
+INCLUDE "constants.asm"
+
+; TODO - need to constantize tile ids, movements
+
+SECTION "Field Moves", ROMX[$4fab], BANK[$03]
+
+CutFunction: ; 03:4fab
+ call .ResetScriptID
+.next
+ call .ExecScript
+ jr nc, .next
+ ld [wFieldMoveSucceeded], a
+ ret
+.ResetScriptID
+ xor a
+ ld [wFieldMoveScriptID], a
+ ret
+.ExecScript
+ ld a, [wFieldMoveScriptID]
+ ld hl, .CutScriptTable
+ jp CallJumptable
+
+.CutScriptTable ; 03:4fc5
+ init_script_table
+ add_script TryCut
+ add_script CheckCuttableBlock
+ add_script CheckCuttableTile
+ add_script DoCut
+ add_script DoCut2
+ add_script FailCut
+
+TryCut: ; 03:4fd1
+ call GetMapEnvironment
+ cp ROUTE
+ jr z, .success
+ cp TOWN
+ jr z, .success
+ set_script FailCut
+ xor a
+ ret
+.success
+ set_script CheckCuttableBlock
+ xor a
+ ret
+
+CheckCuttableBlock: ; 03:4fea
+ call GetFacingTileCoord
+ cp $80
+ jr nz, .fail
+ call GetBlockLocation
+ ld a, l
+ ld [wMapBlocksAddress], a
+ ld a, h
+ ld [wMapBlocksAddress + 1], a
+ ld a, [hl]
+ call GetCutReplacementBlock
+ jr nc, .fail
+ dec hl
+ ld a, [hl]
+ ld [wReplacementBlock], a
+ set_script DoCut2
+ xor a
+ ret
+.fail
+ set_script CheckCuttableTile
+ xor a
+ ret
+
+GetCutReplacementBlock: ; 03:5015
+ ld c, a
+ ld hl, CutReplacementBlocks
+.loop
+ ld a, [hli]
+ cp -1
+ ret z
+ inc hl
+ cp c
+ jr nz, .loop
+ scf
+ ret
+
+CutReplacementBlocks: ; 03:5023
+; replacement block, facing block
+ db $30, $25
+ db $31, $2A
+ db $32, $34
+ db $33, $35
+ db -1
+
+CheckCuttableTile: ; 03:502c
+ call GetFacingTileCoord
+ call IsCuttableTile
+ jr nc, .fail
+ call GetBlockLocation
+ ld a, [hl]
+ cp $3b
+ jr nz, .fail
+ ld a, l
+ ld [wMapBlocksAddress], a
+ ld a, h
+ ld [wMapBlocksAddress + 1], a
+ ld a, $04
+ ld [wReplacementBlock], a
+ set_script DoCut
+ xor a
+ ret
+.fail
+ set_script FailCut
+ xor a
+ ret
+
+IsCuttableTile: ; 03:5057
+ ld hl, CuttableTiles
+ ld c, a
+.loop
+ ld a, [hli]
+ cp -1
+ ret z
+ cp c
+ jr nz, .loop
+ scf
+ ret
+
+CuttableTiles: ; 03:5064
+ db $81
+ db $82
+ db $8A
+ db $8B
+ db -1
+
+FailCut: ; 03:5069
+ ld hl, Text_CantUseCutHere
+ call MenuTextBoxBackup
+ scf
+ ld a, SCRIPT_FAIL
+ ret
+
+Text_CantUseCutHere: ; 03:5073
+ text "ここでは つかえません"
+ prompt
+
+DoCut:
+DoCut2: ; 03:5080
+ far_queue CutScript
+ scf
+ ld a, SCRIPT_SUCCESS
+ ret
+
+CutScript: ; 03:508C
+ call RefreshScreen
+ ld hl, wPartyMonNicknames
+ ld a, BOXMON
+ ld [wMonType], a
+ ld a, [wWhichPokemon]
+ call GetNick
+ call CopyStringToStringBuffer2
+ ld hl, Text_CutItDown
+ call MenuTextBoxBackup
+ ld de, MUSIC_SURF
+ call PlaySFX
+ ld hl, wMapBlocksAddress
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [wReplacementBlock]
+ ld [hl], a
+ call LoadMapPart
+ call UpdateSprites
+ call WaitBGMap
+ call Function1fea
+ scf
+ ret
+
+Text_CutItDown ; 03:50c4
+ text_from_ram wStringBuffer2
+ text " は "
+ line "くさかりを つかった!"
+ prompt
+
+SurfFunction: ; 03:50d8
+ call .ResetScriptID
+.next
+ call .ExecScript
+ jr nc, .next
+ ld [wFieldMoveSucceeded], a
+ ret
+.ResetScriptID
+ xor a
+ ld [wFieldMoveScriptID], a
+ ret
+.ExecScript
+ ld a, [wFieldMoveScriptID]
+ ld hl, .SurfScriptTable
+ jp CallJumptable
+
+.SurfScriptTable: ; 03:50f2
+ init_script_table
+ add_script TrySurf
+ add_script DoSurf
+ add_script FailSurf
+
+TrySurf: ; 03:50f8
+ call GetFacingTileCoord
+ and $f0
+ cp $20
+ jr z, .success
+ cp $40
+ jr z, .success
+ set_script FailSurf
+ xor a
+ ret
+.success
+ set_script DoSurf
+ xor a
+ ret
+
+DoSurf: ; 03:5113
+ queue_ba SurfScript
+ ld a, -1
+ ld [wFieldMoveScriptID], a
+ scf
+ ld a, SCRIPT_SUCCESS
+ ret
+
+FailSurf: ; 03:5124
+ ld hl, Text_CantSurfHere
+ call MenuTextBoxBackup
+ ld a, -1
+ ld [wFieldMoveScriptID], a
+ scf
+ ld a, SCRIPT_FAIL
+ ret
+
+Text_CantSurfHere: ; 03:5133
+ text "ここでは のることが"
+ next "できません"
+ prompt
+
+SurfScript: ; 03:5145
+ call RefreshScreen
+ ld hl, wPartyMonNicknames
+ ld a, BOXMON
+ ld [wMonType], a
+ ld a, [wWhichPokemon]
+ call GetNick
+ call CopyStringToStringBuffer2
+ ld hl, Text_UsedSurf
+ call MenuTextBoxBackup
+ ld a, PLAYER_SURF
+ ld [wPlayerState], a
+ call Function0d02
+ call PlayMapMusic
+ call MovePlayerIntoWater
+ call Function1fea
+ ret
+
+Text_UsedSurf: ; 03:5171
+ text_from_ram wStringBuffer2
+ text " は "
+ line "@"
+ text_from_ram wPlayerName
+ text "を のせた!"
+ prompt
+
+MovePlayerIntoWater: ; 03:5185
+ call InitMovementBuffer
+ call .get_movement_direction
+ call AppendToMovementBuffer
+ ld a, $32
+ call AppendToMovementBuffer
+ ld a, 0
+ ld hl, wMovementBuffer
+ call LoadMovementDataPointer
+.get_movement_direction
+ ld a, [wPlayerWalking]
+ srl a
+ srl a
+ ld e, a
+ ld d, $00
+ ld hl, SurfMovementDirections
+ add hl, de
+ ld a, [hl]
+ ret
+
+; Direction to move player, mapped to facing direction
+SurfMovementDirections: ; 03:51ab
+ db 4, 5, 6, 7
+
+
+FlyFunction: ; 03:51af
+ call .ResetScriptID
+.next
+ call .ExecScript
+ jr nc, .next
+ ld [wFieldMoveSucceeded], a
+ ret
+.ResetScriptID
+ xor a
+ ld [wFieldMoveScriptID], a
+ ret
+.ExecScript
+ ld a, [wFieldMoveScriptID]
+ ld hl, .FlyScriptTable
+ jp CallJumptable
+
+.FlyScriptTable: ; 03:51c9
+ init_script_table
+ add_script TryFly
+ add_script ShowFlyMap
+ add_script DoFly
+ add_script FailFly
+
+TryFly: ; 03:51d1
+ call GetMapEnvironment
+ cp TOWN
+ jr z, .success
+ cp ROUTE
+ jr z, .success
+ set_script FailFly
+ xor a
+ ret
+.success
+ set_script ShowFlyMap
+ xor a
+ ret
+
+ShowFlyMap: ; 03:51ea
+ call LoadStandardMenuHeader
+ call ClearSprites
+ callab FlyMap
+ call ClearPalettes
+ call GetMemSGBLayout
+ call ExitMenu
+ ld a, [wFlyDestination]
+ cp -1
+ jr z, .dont_fly
+ cp NUM_SPAWNS
+ jr nc, .dont_fly
+ set_script DoFly
+ xor a
+ ret
+.dont_fly
+ call UpdateTimePals
+ ld a, -1
+ ld [wFieldMoveScriptID], a
+ scf
+ ld a, SCRIPT_FAIL
+ ret
+
+DoFly: ; 03:521f
+ ld a, [wFlyDestination]
+ inc a
+ ld [wDefaultSpawnPoint], a
+ queue_ba FlyScript
+ ld a, -1
+ ld [wFieldMoveScriptID], a
+ scf
+ ld a, SCRIPT_SUCCESS
+ ret
+
+FailFly: ; 03:5237
+ ld hl, Text_CantUseFlyHere
+ call MenuTextBoxBackup
+ ld a, -1
+ ld [wFieldMoveScriptID], a
+ scf
+ ld a, SCRIPT_FAIL
+ ret
+
+Text_CantUseFlyHere: ; 03:5246
+ text "ここでは つかえません!"
+ prompt
+
+FlyScript: ; 03:5254
+ ld a, MAPSETUP_TELEPORT
+ ldh [hMapEntryMethod], a
+ jpab Functionfcc24
+
+
+DigFunction: ; 03:5260
+ call .ResetScriptID
+.next
+ ld a, [wFieldMoveScriptID]
+ bit SCRIPT_FINISHED_F, a
+ jr nz, .finish
+ ld hl, .DigScriptTable
+ call CallJumptable
+ jr .next
+
+; Finish by returning only the low nibble
+.finish
+ and $FF - SCRIPT_FINISHED_MASK
+ ld [wFieldMoveSucceeded], a
+ ret
+
+.ResetScriptID
+ xor a
+ ld [wFieldMoveScriptID], a
+ ret
+
+.DigScriptTable: ; 03:527D
+ init_script_table
+ add_script CheckCanDig
+ add_script DoDig
+ add_script FailDig
+
+CheckCanDig: ; 03:5283
+ call GetMapEnvironment
+ cp INDOOR
+ jr z, .success
+ cp CAVE
+ jr z, .success
+ set_script FailDig
+ ret
+.success
+ set_script DoDig
+ ret
+
+DoDig: ; 03:529a
+ queue_ab DigScript
+ ld a, SCRIPT_FINISHED_MASK | SCRIPT_SUCCESS
+ ld [wFieldMoveScriptID], a
+ ret
+
+FailDig: ; 03:52a8
+ ld hl, Text_CantUseDigHere
+ call MenuTextBoxBackup
+ ld a, SCRIPT_FINISHED_MASK | SCRIPT_FAIL
+ ld [wFieldMoveScriptID], a
+ ret
+
+Text_CantUseDigHere: ; 03:52b4
+ text "ここでは つかえません!"
+ prompt
+
+DigScript: ; 03:52c2
+ ld hl, wDigWarpNumber
+ ld de, wNextWarp
+ ld bc, 3
+ call CopyBytes
+ ld a, MAPSETUP_WARP
+ ldh [hMapEntryMethod], a
+ jpab Functionfcc24
+
+EmptyFunctiond2da: ; 03:52da
+ ret
+
+TeleportFunction: ; 03:52db
+ xor a
+ ld [wFieldMoveScriptID], a
+.next
+ ld a, [wFieldMoveScriptID]
+ bit SCRIPT_FINISHED_F, a
+ jr nz, .finish
+ ld hl, .TeleportScriptTable
+ call CallJumptable
+ jr .next
+
+; Finish by returning only the low nibble
+.finish
+ and $FF - SCRIPT_FINISHED_MASK
+ ld [wFieldMoveSucceeded], a
+ ret
+
+.TeleportScriptTable
+ init_script_table
+ add_script TryTeleport
+ add_script DoTeleport
+ add_script FailTeleport
+ add_script CheckIfSpawnPoint
+
+TryTeleport: ; 03:52fc
+ call GetMapEnvironment
+ cp TOWN
+ jr z, .success
+ cp ROUTE
+ jr z, .success
+ set_script FailTeleport
+ ret
+.success
+ set_script CheckIfSpawnPoint
+ ret
+
+CheckIfSpawnPoint ; 03:5313
+ ld a, [wLastSpawnMapGroup]
+ ld d, a
+ ld a, [wLastSpawnMapNumber]
+ ld e, a
+ callab IsSpawnPoint
+ jr c, .not_spawn
+ ld hl, Text_CantFindDestination
+ call MenuTextBoxBackup
+ ld a, SCRIPT_FINISHED_MASK | SCRIPT_FAIL
+ ld [wFieldMoveScriptID], a
+ ret
+.not_spawn
+ ld a, c
+ ld [wDefaultSpawnPoint], a
+ set_script DoTeleport
+ ret
+
+Text_CantFindDestination: ; 03:533B
+ text "とびさきが みつかりません"
+ para ""
+ done
+
+DoTeleport: ; 03:534b
+ queue_ba TeleportScript
+ ld a, SCRIPT_FINISHED_MASK | SCRIPT_SUCCESS
+ ld [wFieldMoveScriptID], a
+ ret
+
+FailTeleport: ; 03:5359
+ ld hl, Text_CantUseTeleportHere
+ call MenuTextBoxBackup
+ ld a, SCRIPT_FINISHED_MASK | SCRIPT_FAIL
+ ld [wFieldMoveScriptID], a
+ scf
+ ret
+
+Text_CantUseTeleportHere: ; 03:5366
+ text "ここでは つかえません!"
+ para ""
+ done
+
+TeleportScript: ; 03:5375
+ call RefreshScreen
+ ld hl, Text_ReturnToLastMonCenter
+ call MenuTextBox
+ ld c, 60
+ call DelayFrames
+ call CloseWindow
+ call Function1fea
+ ld a, MAPSETUP_TELEPORT
+ ldh [hMapEntryMethod], a
+ jpab Functionfcc24
+
+Text_ReturnToLastMonCenter: ; 03:5395
+ text "さいごに たちよった"
+ line "#センターにもどります"
+ done
+=======
+INCLUDE "constants.asm"
+
+; TODO - need to constantize tile ids, movements
+
+SECTION "Field Moves", ROMX[$4fab], BANK[$03]
+
+CutFunction: ; 03:4fab
+ call .ResetScriptID
+.next
+ call .ExecScript
+ jr nc, .next
+ ld [wFieldMoveSucceeded], a
+ ret
+.ResetScriptID
+ xor a
+ ld [wFieldMoveScriptID], a
+ ret
+.ExecScript
+ ld a, [wFieldMoveScriptID]
+ ld hl, .CutScriptTable
+ jp CallJumptable
+
+.CutScriptTable ; 03:4fc5
+ init_script_table
+ add_script TryCut
+ add_script CheckCuttableBlock
+ add_script CheckCuttableTile
+ add_script DoCut
+ add_script DoCut2
+ add_script FailCut
+
+TryCut: ; 03:4fd1
+ call GetMapEnvironment
+ cp ROUTE
+ jr z, .success
+ cp TOWN
+ jr z, .success
+ set_script FailCut
+ xor a
+ ret
+.success
+ set_script CheckCuttableBlock
+ xor a
+ ret
+
+CheckCuttableBlock: ; 03:4fea
+ call GetFacingTileCoord
+ cp $80
+ jr nz, .fail
+ call GetBlockLocation
+ ld a, l
+ ld [wMapBlocksAddress], a
+ ld a, h
+ ld [wMapBlocksAddress + 1], a
+ ld a, [hl]
+ call GetCutReplacementBlock
+ jr nc, .fail
+ dec hl
+ ld a, [hl]
+ ld [wReplacementBlock], a
+ set_script DoCut2
+ xor a
+ ret
+.fail
+ set_script CheckCuttableTile
+ xor a
+ ret
+
+GetCutReplacementBlock: ; 03:5015
+ ld c, a
+ ld hl, CutReplacementBlocks
+.loop
+ ld a, [hli]
+ cp -1
+ ret z
+ inc hl
+ cp c
+ jr nz, .loop
+ scf
+ ret
+
+CutReplacementBlocks: ; 03:5023
+; replacement block, facing block
+ db $30, $25
+ db $31, $2A
+ db $32, $34
+ db $33, $35
+ db -1
+
+CheckCuttableTile: ; 03:502c
+ call GetFacingTileCoord
+ call IsCuttableTile
+ jr nc, .fail
+ call GetBlockLocation
+ ld a, [hl]
+ cp $3b
+ jr nz, .fail
+ ld a, l
+ ld [wMapBlocksAddress], a
+ ld a, h
+ ld [wMapBlocksAddress + 1], a
+ ld a, $04
+ ld [wReplacementBlock], a
+ set_script DoCut
+ xor a
+ ret
+.fail
+ set_script FailCut
+ xor a
+ ret
+
+IsCuttableTile: ; 03:5057
+ ld hl, CuttableTiles
+ ld c, a
+.loop
+ ld a, [hli]
+ cp -1
+ ret z
+ cp c
+ jr nz, .loop
+ scf
+ ret
+
+CuttableTiles: ; 03:5064
+ db $81
+ db $82
+ db $8A
+ db $8B
+ db -1
+
+FailCut: ; 03:5069
+ ld hl, Text_CantUseCutHere
+ call MenuTextBoxBackup
+ scf
+ ld a, SCRIPT_FAIL
+ ret
+
+Text_CantUseCutHere: ; 03:5073
+ text "ここでは つかえません"
+ prompt
+
+DoCut:
+DoCut2: ; 03:5080
+ far_queue CutScript
+ scf
+ ld a, SCRIPT_SUCCESS
+ ret
+
+CutScript: ; 03:508C
+ call RefreshScreen
+ ld hl, wPartyMonNicknames
+ ld a, BOXMON
+ ld [wMonType], a
+ ld a, [wWhichPokemon]
+ call GetNick
+ call CopyStringToStringBuffer2
+ ld hl, Text_CutItDown
+ call MenuTextBoxBackup
+ ld de, MUSIC_SURF
+ call PlaySFX
+ ld hl, wMapBlocksAddress
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [wReplacementBlock]
+ ld [hl], a
+ call LoadMapPart
+ call UpdateSprites
+ call WaitBGMap
+ call Function1fea
+ scf
+ ret
+
+Text_CutItDown ; 03:50c4
+ text_from_ram wStringBuffer2
+ text " は "
+ line "くさかりを つかった!"
+ prompt
+
+SurfFunction: ; 03:50d8
+ call .ResetScriptID
+.next
+ call .ExecScript
+ jr nc, .next
+ ld [wFieldMoveSucceeded], a
+ ret
+.ResetScriptID
+ xor a
+ ld [wFieldMoveScriptID], a
+ ret
+.ExecScript
+ ld a, [wFieldMoveScriptID]
+ ld hl, .SurfScriptTable
+ jp CallJumptable
+
+.SurfScriptTable: ; 03:50f2
+ init_script_table
+ add_script TrySurf
+ add_script DoSurf
+ add_script FailSurf
+
+TrySurf: ; 03:50f8
+ call GetFacingTileCoord
+ and $f0
+ cp $20
+ jr z, .success
+ cp $40
+ jr z, .success
+ set_script FailSurf
+ xor a
+ ret
+.success
+ set_script DoSurf
+ xor a
+ ret
+
+DoSurf: ; 03:5113
+ queue_ba SurfScript
+ ld a, -1
+ ld [wFieldMoveScriptID], a
+ scf
+ ld a, SCRIPT_SUCCESS
+ ret
+
+FailSurf: ; 03:5124
+ ld hl, Text_CantSurfHere
+ call MenuTextBoxBackup
+ ld a, -1
+ ld [wFieldMoveScriptID], a
+ scf
+ ld a, SCRIPT_FAIL
+ ret
+
+Text_CantSurfHere: ; 03:5133
+ text "ここでは のることが"
+ next "できません"
+ prompt
+
+SurfScript: ; 03:5145
+ call RefreshScreen
+ ld hl, wPartyMonNicknames
+ ld a, BOXMON
+ ld [wMonType], a
+ ld a, [wWhichPokemon]
+ call GetNick
+ call CopyStringToStringBuffer2
+ ld hl, Text_UsedSurf
+ call MenuTextBoxBackup
+ ld a, PLAYER_SURF
+ ld [wPlayerState], a
+ call RedrawPlayerSprite
+ call PlayMapMusic
+ call MovePlayerIntoWater
+ call Function1fea
+ ret
+
+Text_UsedSurf: ; 03:5171
+ text_from_ram wStringBuffer2
+ text " は "
+ line "@"
+ text_from_ram wPlayerName
+ text "を のせた!"
+ prompt
+
+MovePlayerIntoWater: ; 03:5185
+ call InitMovementBuffer
+ call .get_movement_direction
+ call AppendToMovementBuffer
+ ld a, $32
+ call AppendToMovementBuffer
+ ld a, 0
+ ld hl, wMovementBuffer
+ call LoadMovementDataPointer
+.get_movement_direction
+ ld a, [wPlayerWalking]
+ srl a
+ srl a
+ ld e, a
+ ld d, $00
+ ld hl, SurfMovementDirections
+ add hl, de
+ ld a, [hl]
+ ret
+
+; Direction to move player, mapped to facing direction
+SurfMovementDirections: ; 03:51ab
+ db 4, 5, 6, 7
+
+
+FlyFunction: ; 03:51af
+ call .ResetScriptID
+.next
+ call .ExecScript
+ jr nc, .next
+ ld [wFieldMoveSucceeded], a
+ ret
+.ResetScriptID
+ xor a
+ ld [wFieldMoveScriptID], a
+ ret
+.ExecScript
+ ld a, [wFieldMoveScriptID]
+ ld hl, .FlyScriptTable
+ jp CallJumptable
+
+.FlyScriptTable: ; 03:51c9
+ init_script_table
+ add_script TryFly
+ add_script ShowFlyMap
+ add_script DoFly
+ add_script FailFly
+
+TryFly: ; 03:51d1
+ call GetMapEnvironment
+ cp TOWN
+ jr z, .success
+ cp ROUTE
+ jr z, .success
+ set_script FailFly
+ xor a
+ ret
+.success
+ set_script ShowFlyMap
+ xor a
+ ret
+
+ShowFlyMap: ; 03:51ea
+ call LoadStandardMenuHeader
+ call ClearSprites
+ callab FlyMap
+ call ClearPalettes
+ call GetMemSGBLayout
+ call ExitMenu
+ ld a, [wFlyDestination]
+ cp -1
+ jr z, .dont_fly
+ cp NUM_SPAWNS
+ jr nc, .dont_fly
+ set_script DoFly
+ xor a
+ ret
+.dont_fly
+ call UpdateTimePals
+ ld a, -1
+ ld [wFieldMoveScriptID], a
+ scf
+ ld a, SCRIPT_FAIL
+ ret
+
+DoFly: ; 03:521f
+ ld a, [wFlyDestination]
+ inc a
+ ld [wDefaultSpawnPoint], a
+ queue_ba FlyScript
+ ld a, -1
+ ld [wFieldMoveScriptID], a
+ scf
+ ld a, SCRIPT_SUCCESS
+ ret
+
+FailFly: ; 03:5237
+ ld hl, Text_CantUseFlyHere
+ call MenuTextBoxBackup
+ ld a, -1
+ ld [wFieldMoveScriptID], a
+ scf
+ ld a, SCRIPT_FAIL
+ ret
+
+Text_CantUseFlyHere: ; 03:5246
+ text "ここでは つかえません!"
+ prompt
+
+FlyScript: ; 03:5254
+ ld a, MAPSETUP_TELEPORT
+ ldh [hMapEntryMethod], a
+ jpab Functionfcc24
+
+
+DigFunction: ; 03:5260
+ call .ResetScriptID
+.next
+ ld a, [wFieldMoveScriptID]
+ bit SCRIPT_FINISHED_F, a
+ jr nz, .finish
+ ld hl, .DigScriptTable
+ call CallJumptable
+ jr .next
+
+; Finish by returning only the low nibble
+.finish
+ and $FF - SCRIPT_FINISHED_MASK
+ ld [wFieldMoveSucceeded], a
+ ret
+
+.ResetScriptID
+ xor a
+ ld [wFieldMoveScriptID], a
+ ret
+
+.DigScriptTable: ; 03:527D
+ init_script_table
+ add_script CheckCanDig
+ add_script DoDig
+ add_script FailDig
+
+CheckCanDig: ; 03:5283
+ call GetMapEnvironment
+ cp INDOOR
+ jr z, .success
+ cp CAVE
+ jr z, .success
+ set_script FailDig
+ ret
+.success
+ set_script DoDig
+ ret
+
+DoDig: ; 03:529a
+ queue_ab DigScript
+ ld a, SCRIPT_FINISHED_MASK | SCRIPT_SUCCESS
+ ld [wFieldMoveScriptID], a
+ ret
+
+FailDig: ; 03:52a8
+ ld hl, Text_CantUseDigHere
+ call MenuTextBoxBackup
+ ld a, SCRIPT_FINISHED_MASK | SCRIPT_FAIL
+ ld [wFieldMoveScriptID], a
+ ret
+
+Text_CantUseDigHere: ; 03:52b4
+ text "ここでは つかえません!"
+ prompt
+
+DigScript: ; 03:52c2
+ ld hl, wDigWarpNumber
+ ld de, wNextWarp
+ ld bc, 3
+ call CopyBytes
+ ld a, MAPSETUP_WARP
+ ldh [hMapEntryMethod], a
+ jpab Functionfcc24
+
+EmptyFunctiond2da: ; 03:52da
+ ret
+
+TeleportFunction: ; 03:52db
+ xor a
+ ld [wFieldMoveScriptID], a
+.next
+ ld a, [wFieldMoveScriptID]
+ bit SCRIPT_FINISHED_F, a
+ jr nz, .finish
+ ld hl, .TeleportScriptTable
+ call CallJumptable
+ jr .next
+
+; Finish by returning only the low nibble
+.finish
+ and $FF - SCRIPT_FINISHED_MASK
+ ld [wFieldMoveSucceeded], a
+ ret
+
+.TeleportScriptTable
+ init_script_table
+ add_script TryTeleport
+ add_script DoTeleport
+ add_script FailTeleport
+ add_script CheckIfSpawnPoint
+
+TryTeleport: ; 03:52fc
+ call GetMapEnvironment
+ cp TOWN
+ jr z, .success
+ cp ROUTE
+ jr z, .success
+ set_script FailTeleport
+ ret
+.success
+ set_script CheckIfSpawnPoint
+ ret
+
+CheckIfSpawnPoint ; 03:5313
+ ld a, [wLastSpawnMapGroup]
+ ld d, a
+ ld a, [wLastSpawnMapNumber]
+ ld e, a
+ callab IsSpawnPoint
+ jr c, .not_spawn
+ ld hl, Text_CantFindDestination
+ call MenuTextBoxBackup
+ ld a, SCRIPT_FINISHED_MASK | SCRIPT_FAIL
+ ld [wFieldMoveScriptID], a
+ ret
+.not_spawn
+ ld a, c
+ ld [wDefaultSpawnPoint], a
+ set_script DoTeleport
+ ret
+
+Text_CantFindDestination: ; 03:533B
+ text "とびさきが みつかりません"
+ para ""
+ done
+
+DoTeleport: ; 03:534b
+ queue_ba TeleportScript
+ ld a, SCRIPT_FINISHED_MASK | SCRIPT_SUCCESS
+ ld [wFieldMoveScriptID], a
+ ret
+
+FailTeleport: ; 03:5359
+ ld hl, Text_CantUseTeleportHere
+ call MenuTextBoxBackup
+ ld a, SCRIPT_FINISHED_MASK | SCRIPT_FAIL
+ ld [wFieldMoveScriptID], a
+ scf
+ ret
+
+Text_CantUseTeleportHere: ; 03:5366
+ text "ここでは つかえません!"
+ para ""
+ done
+
+TeleportScript: ; 03:5375
+ call RefreshScreen
+ ld hl, Text_ReturnToLastMonCenter
+ call MenuTextBox
+ ld c, 60
+ call DelayFrames
+ call CloseWindow
+ call Function1fea
+ ld a, MAPSETUP_TELEPORT
+ ldh [hMapEntryMethod], a
+ jpab Functionfcc24
+
+Text_ReturnToLastMonCenter: ; 03:5395
+ text "さいごに たちよった"
+ line "#センターにもどります"
+ done
+>>>>>>> 3fab27f221a8d5400d4b203809ff9b13355d55a3
diff --git a/engine/items/inventory.asm b/engine/items/inventory.asm
index 9524d70..c30e5c0 100755
--- a/engine/items/inventory.asm
+++ b/engine/items/inventory.asm
@@ -1,723 +1,723 @@
-INCLUDE "constants.asm"
-
-SECTION "Inventory", ROMX[$4AA1], BANK[$03]
-
-_ReceiveItem: ; 03:4AA1
- call DoesHLEqualwNumBagItems
- jp nz, PutItemInPocket
- push hl
- callab CheckItemPocket
- ld a, [wItemAttributeParamBuffer]
- dec a
- ld hl, .Pockets
- jp CallJumptable
-
-.Pockets: ; 03:4ABA
- dw .Item
- dw .KeyItem
- dw .Ball
- dw .TMHM
-
-.Item: ; 03:4AC2
- pop hl
- jp PutItemInPocket
-
-.KeyItem: ; 03:4AC6
- pop hl
- jp ReceiveKeyItem
-
-.Ball: ; 03:4ACA
- pop hl
- ld a, [wCurItem]
- ld c, a
- call GetBallIndex
- jp ReceiveBall
-
-.TMHM: ; 03:4AD5
- pop hl
- ld a, [wCurItem]
- ld c, a
- call GetTMHMNumber
- jp ReceiveTMHM
-
-
-_TossItem: ; 03:4AE0
- call DoesHLEqualwNumBagItems
- jr nz, .remove_item
- push hl
- callab CheckItemPocket
- ld a, [wItemAttributeParamBuffer]
- dec a
- ld hl, .Pockets
- jp CallJumptable
-
-.Pockets ; 03:4AF8
- dw .Item
- dw .KeyItem
- dw .Ball
- dw .TMHM
-
-.Ball ; 03:4B00
- pop hl
- ld a, [wCurItem]
- ld c, a
- call GetBallIndex
- jp TossBall
-
-.TMHM ; 03:4B0B
- pop hl
- ld a, [wCurItem]
- ld c, a
- call GetTMHMNumber
- jp TossTMHM
-
-.KeyItem ; 03:4B16
- pop hl
- jp TossKeyItem
-
-.Item ; 03:4B1A
- pop hl
-
-.remove_item ; 03:4B1B
- jp RemoveItemFromPocket
-
-
-_CheckItem: ; 03:4B1E
- call DoesHLEqualwNumBagItems
- jr nz, .not_bag
- push hl
- callab CheckItemPocket
- ld a, [wItemAttributeParamBuffer]
- dec a
- ld hl, .Pockets
- jp CallJumptable
-
-.Pockets ; 03:4B36
- dw .Item
- dw .KeyItem
- dw .Ball
- dw .TMHM
-
-.Ball ; 03:4B3E
- pop hl
- ld a, [wCurItem]
- ld c, a
- call GetBallIndex
- jp CheckBall
-
-.TMHM ; 03:4B49
- pop hl
- ld a, [wCurItem]
- ld c, a
- call GetTMHMNumber
- jp CheckTMHM
-
-.KeyItem ; 03:4B54
- pop hl
- jp CheckKeyItems
-
-.Item ; 03:4B58
- pop hl
-
-.not_bag
- jp CheckTheItem
-
-
-DoesHLEqualwNumBagItems: ; 03:4B5C
- ld a, l
- cp LOW(wNumBagItems)
- ret nz
- ld a, h
- cp HIGH(wNumBagItems)
- ret
-
-
-PutItemInPocket: ; 03:4B64
- ld d, h
- ld e, l
- inc hl
- ld a, [wCurItem]
- ld c, a
- ld b, 0
-
-; will add the item once the total
-; available space (b) exceeds the
-; amount being added
-.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, [wItemQuantity]
- cp b
- jr z, .can_add
- jr c, .can_add
-
-.next
- inc hl
- jr .loop
-
-.terminator
- call GetPocketCapacity
- ld a, [de]
- cp c
- jr c, .can_add
-
- and a
- ret
-
-.can_add
- ld h, d
- ld l, e
- ld a, [wCurItem]
- ld c, a
-
-.loop2
- inc hl
- ld a, [hli]
- cp a, -1
- jr z, .terminator2
- cp c
- jr nz, .loop2
-
- ld a, [wItemQuantity]
- add [hl]
- cp a, 100
- jr nc, .set_max
- ld [hl], a
- jr .done
-
-; set this slot's quantity to 99,
-; and keep iterating through list
-; to add remaining amount
-.set_max
- ld [hl], 99
- sub 99
- ld [wItemQuantity], a
- jr .loop2
-
-.terminator2
- dec hl
- ld a, [wCurItem]
- ld [hli], a
- ld a, [wItemQuantity]
- ld [hli], a
- ld [hl], -1
- ld h, d
- ld l, e
- inc [hl]
-
-.done
- scf
- ret
-
-
-GetPocketCapacity: ; 03:4BC1
- ld c, MAX_ITEMS
- ld a, e
- cp a, LOW(wNumBagItems)
- jr nz, .not_bag
- ld a, d
- cp HIGH(wNumBagItems)
- ret z
-
-.not_bag
- ld c, MAX_PC_ITEMS
- ret
-
-
-RemoveItemFromPocket: ;03:4BCF
- ld d, h
- ld e, l
- inc hl
- ld a, [wItemIndex]
- ld c, a
- ld b, 0
- add hl, bc
- add hl, bc
- inc hl
- ld a, [wItemQuantity]
- ld b, a
- ld a, [hl]
- sub b
- jr c, .underflow
-
- ld [hl], a
- ld [wItemQuantityBuffer], a
- and a
- jr nz, .done
-
-; if the remaining quantity is zero
-; then erase the slot by shifting
-; the subsequent data upwards
- dec hl
- ld b, h
- ld c, l
- inc hl
- inc hl
-
-.loop
- ld a, [hli]
- ld [bc], a
- inc bc
- cp -1
- jr nz, .loop
- ld h, d
- ld l, e
- dec [hl]
-
-.done
- scf
- ret
-
-.underflow
- and a
- ret
-
-
-CheckTheItem: ; 03:4BFD
- ld a, [wCurItem]
- ld c, a
-
-.loop
- inc hl
- ld a, [hli]
- cp -1
- jr z, .fail
- cp c
- jr nz, .loop
-
- scf
- ret
-
-.fail
- and a
- ret
-
-
-ReceiveKeyItem: ; 03:4C0E
- ld hl, wNumKeyItems
- ld a, [hli]
- cp a, MAX_KEY_ITEMS
- jr nc, .full_pack
- ld c, a
- ld b, 0
- add hl, bc
- ld a, [wCurItem]
- ld [hli], a
- ld [hl], -1
- ld hl, wNumKeyItems
- inc [hl]
- scf
- ret
-
-.full_pack
- and a
- ret
-
-
-TossKeyItem: ; 03:4C28
- ld hl, wNumKeyItems
- dec [hl]
- inc hl
- ld a, [wItemIndex]
- ld e, a
- ld d, 0
- add hl, de
- ld d, h
- ld e, l
- inc hl
-
-; erase this item by shifting
-; all subsequent data upwards
-.loop
- ld a, [hli]
- ld [de], a
- inc de
- cp -1
- jr nz, .loop
- scf
- ret
-
-
-CheckKeyItems: ; 03:4C40
- ld a, [wCurItem]
- ld c, a
- ld hl, wKeyItems
-
-.loop
- ld a, [hli]
- cp c
- jr z, .done
- cp -1
- jr nz, .loop
-
- and a
- ret
-
-.done
- scf
- ret
-
-
-; get index of ball item id c from BallItems
-GetBallIndex: ; 03:4C53
- ld a, c
- push hl
- push de
- push bc
- ld hl, BallItems
- ld de, 1
- call FindItemInTable
- ld a, b
- pop bc
- pop de
- pop hl
- ld c, a
- ret
-
-
-; get ball item id at index c in BallItems
-GetBallByIndex: ; 03:4c66
- push bc
- push hl
- ld b, 0
- ld hl, BallItems
- add hl, bc
- ld a, [hl]
- pop hl
- pop bc
- ld c, a
- ret
-
-
-BallItems: ; 03:4C73
- db ITEM_MASTER_BALL
- db ITEM_ULTRA_BALL
- db ITEM_GREAT_BALL
- db ITEM_POKE_BALL
- db -1
-
-
-; empties the ball pocket by setting the
-; terminator immediately after wNumBallItems
-
- ; Note, the ball pocket appears to be
- ; a fixed length, not -1 terminated
-EmptyBallPocket: ; 03:4C78
- ld hl, wNumBallItems
- xor a
- ld [hli], a
- ld [hl], -1
- ret
-
-
-ReceiveBall: ; 03:4C80
- ld hl, wBallQuantities
- ld b, 0
- add hl, bc
- ld a, [wItemQuantity]
- add [hl]
- cp 100
- jr nc, .overflow
- ld b, a
- ld a, [hl]
- and a
- jr nz, .done
-
-; increase the ball pocket size if
-; this ball's previous quantity was 0
- ld a, [wNumBallItems]
- inc a
- ld [wNumBallItems], a
-
-.done
- ld [hl], b
- scf
- ret
-
-.overflow
- and a
- ret
-
-
-TossBall: ; 03:4C9F
- ld hl, wBallQuantities
- ld b, 0
- add hl, bc
- ld a, [wItemQuantity]
- ld b, a
- ld a, [hl]
- sub b
- jr c, .underflow
- jr nz, .done
-
-; increase the ball pocket size if
-; this ball's new quantity is 0
- ld b, a
- ld a, [wNumBallItems]
- dec a
- ld [wNumBallItems], a
- ld a, b
-
-.done
- ld [hl], a
- ld [wItemQuantityBuffer], a
- scf
- ret
-
-.underflow
- and a
- ret
-
-
-CheckBall: ; 03:4CC0
- ld hl, wBallQuantities
- ld b, 0
- add hl, bc
- ld a, [hl]
- and a
- ret z
- scf
- ret
-
-
-ReceiveTMHM: ; 03:4CCB
- ld b, 0
- ld hl, wTMsHMs
- add hl, bc
- ld a, [wItemQuantity]
- add [hl]
- cp 100
- jr nc, .overflow
- ld [hl], a
- scf
- ret
-
-.overflow
- and a
- ret
-
-
-TossTMHM: ; 03:4CDE
- ld b, 0
- ld hl, wTMsHMs
- add hl, bc
- ld a, [wItemQuantity]
- ld b, a
- ld a, [hl]
- sub b
- jr c, .underflow
-
- ld [hl], a
- ld [wItemQuantityBuffer], a
- scf
- ret
-
-.underflow
- and a
- ret
-
-
-CheckTMHM: ; 03:4CF4
- ld b, 0
- ld hl, wTMsHMs
- add hl, bc
- ld a, [hl]
- and a
- ret z
- scf
- ret
-
-GetTMHMNumber: ; 03:4CFF
- ld a, c
- ld c, 0
-
- sub ITEM_TM01
- jr c, .not_machine
-
- cp ITEM_C8 - ITEM_TM01
- jr z, .not_machine
- jr c, .finish
-
- inc c
- cp ITEM_E1 - ITEM_TM01
- jr z, .not_machine
-
- jr c, .finish
- inc c
-
-; c represents the amount of non-TMs which
-; appear ahead of this item in the list
-; so subtract that value before exiting
-.finish
- sub c
- ld c, a
- scf
- ret
-
-.not_machine
- and a
- ret
-
-GetNumberedTMHM: ; 03:4D1A
-; Return the item id of a TM/HM by number c.
- ld a, c
- ld c, 0
-; Adjust for any dummy items.
- cp ITEM_C8 - ITEM_TM01 ; TM01-04
- jr c, .finish
- inc c
- cp ITEM_E1 - ITEM_TM01 - 1 ; TM05-28
- jr c, .finish
- inc c
- cp ITEM_FF - ITEM_TM01 - 2 ; End of list
- jr nc, .not_machine
-.finish
- add c
- add ITEM_TM01
- ld c, a
- scf
- ret
-.not_machine
- and a
- ret
-
-SECTION "GetItemAmount", ROMX[$4e10], BANK[$03]
-
-; Returns carry if user has the item
-; and the amount in b
-GetItemAmount: ; 03:4e10
- call CheckAmountInItemPocket
- ret c
- call CheckAmountInKeyItems
- ret c
- ld b, 0
- and a
- ret
-
-; Returns the amount of item b in b
-CheckAmountInItemPocket: ; 03:4E1C
- ld hl, wItems
-.loop
- inc hl
- ld a, [hli]
- cp -1
- ret z
- cp b
- jr nz, .loop
-
- ld a, [hl]
- ld b, a
- scf
- ret
-
-; Returns the amount of item b in b
-CheckAmountInKeyItems: ; 03:4E2B
- ld hl, wNumKeyItems
- ld a, [hli]
- and a
- ret z
-
-.loop
- ld a, [hli]
- cp -1
- ret z
- cp b
- jr nz, .loop
- ld b, 1
- scf
- ret
-
-SECTION "_CheckTossableItem", ROMX[$53AD], BANK[$03]
-
-; Return 1 in wItemAttributeParamBuffer and
-; carry if wCurItem can't be removed from the bag.
-_CheckTossableItem: ; 03:53AD
- ld a, ITEMATTR_PERMISSIONS
- call GetItemAttr
- bit CANT_TOSS_F, a
- jr nz, ItemAttr_ReturnCarry
- and a
- ret
-
-; Return 1 in wItemAttributeParamBuffer
-; and carry if wCurItem can't be selected.
-CheckSelectableItem: ; 03:53B8
- ld a, ITEMATTR_PERMISSIONS
- call GetItemAttr
- bit CANT_SELECT_F, a
- jr nz, ItemAttr_ReturnCarry
- and a
- ret
-
-; Return the pocket for wCurItem in wItemAttributeParamBuffer.
-CheckItemPocket: ; 03:53C3
- ld a, ITEMATTR_POCKET
- call GetItemAttr
- and $f
- ld [wItemAttributeParamBuffer], a
- ret
-
-; Return the context for wCurItem in wItemAttributeParamBuffer.
-CheckItemContext: ; 03:53CE
- ld a, ITEMATTR_HELP
- call GetItemAttr
- and $f
- ld [wItemAttributeParamBuffer], a
- ret
-
-; Return the menu for wCurItem in wItemAttributeParamBuffer.
-CheckItemMenu: ; 03:53D9
- ld a, ITEMATTR_HELP
- call GetItemAttr
- swap a
- and $f
- ld [wItemAttributeParamBuffer], a
- ret
-
-; Get attribute a of wCurItem.
-GetItemAttr: ; 03:53E6
- push hl
- push bc
- ld hl, ItemAttributes
- ld c, a
- ld b, 0
- add hl, bc
- xor a
- ld [wItemAttributeParamBuffer], a
- ld a, [wCurItem]
- dec a
- ld c, a
- ld a, ITEMATTR_STRUCT_LENGTH
- call AddNTimes
- ld a, BANK(ItemAttributes)
- call GetFarByte
- pop bc
- pop hl
- ret
-
-ItemAttr_ReturnCarry: ; 03:5405
- ld a, 1
- ld [wItemAttributeParamBuffer], a
- scf
- ret
-
-; Return the price of wCurItem in de.
-GetItemPrice: ; 03:540C
- 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
+INCLUDE "constants.asm"
+
+SECTION "Inventory", ROMX[$4AA1], BANK[$03]
+
+_ReceiveItem: ; 03:4AA1
+ call DoesHLEqualwNumBagItems
+ jp nz, PutItemInPocket
+ push hl
+ callab CheckItemPocket
+ ld a, [wItemAttributeParamBuffer]
+ dec a
+ ld hl, .Pockets
+ jp CallJumptable
+
+.Pockets: ; 03:4ABA
+ dw .Item
+ dw .KeyItem
+ dw .Ball
+ dw .TMHM
+
+.Item: ; 03:4AC2
+ pop hl
+ jp PutItemInPocket
+
+.KeyItem: ; 03:4AC6
+ pop hl
+ jp ReceiveKeyItem
+
+.Ball: ; 03:4ACA
+ pop hl
+ ld a, [wCurItem]
+ ld c, a
+ call GetBallIndex
+ jp ReceiveBall
+
+.TMHM: ; 03:4AD5
+ pop hl
+ ld a, [wCurItem]
+ ld c, a
+ call GetTMHMNumber
+ jp ReceiveTMHM
+
+
+_TossItem: ; 03:4AE0
+ call DoesHLEqualwNumBagItems
+ jr nz, .remove_item
+ push hl
+ callab CheckItemPocket
+ ld a, [wItemAttributeParamBuffer]
+ dec a
+ ld hl, .Pockets
+ jp CallJumptable
+
+.Pockets ; 03:4AF8
+ dw .Item
+ dw .KeyItem
+ dw .Ball
+ dw .TMHM
+
+.Ball ; 03:4B00
+ pop hl
+ ld a, [wCurItem]
+ ld c, a
+ call GetBallIndex
+ jp TossBall
+
+.TMHM ; 03:4B0B
+ pop hl
+ ld a, [wCurItem]
+ ld c, a
+ call GetTMHMNumber
+ jp TossTMHM
+
+.KeyItem ; 03:4B16
+ pop hl
+ jp TossKeyItem
+
+.Item ; 03:4B1A
+ pop hl
+
+.remove_item ; 03:4B1B
+ jp RemoveItemFromPocket
+
+
+_CheckItem: ; 03:4B1E
+ call DoesHLEqualwNumBagItems
+ jr nz, .not_bag
+ push hl
+ callab CheckItemPocket
+ ld a, [wItemAttributeParamBuffer]
+ dec a
+ ld hl, .Pockets
+ jp CallJumptable
+
+.Pockets ; 03:4B36
+ dw .Item
+ dw .KeyItem
+ dw .Ball
+ dw .TMHM
+
+.Ball ; 03:4B3E
+ pop hl
+ ld a, [wCurItem]
+ ld c, a
+ call GetBallIndex
+ jp CheckBall
+
+.TMHM ; 03:4B49
+ pop hl
+ ld a, [wCurItem]
+ ld c, a
+ call GetTMHMNumber
+ jp CheckTMHM
+
+.KeyItem ; 03:4B54
+ pop hl
+ jp CheckKeyItems
+
+.Item ; 03:4B58
+ pop hl
+
+.not_bag
+ jp CheckTheItem
+
+
+DoesHLEqualwNumBagItems: ; 03:4B5C
+ ld a, l
+ cp LOW(wNumBagItems)
+ ret nz
+ ld a, h
+ cp HIGH(wNumBagItems)
+ ret
+
+
+PutItemInPocket: ; 03:4B64
+ ld d, h
+ ld e, l
+ inc hl
+ ld a, [wCurItem]
+ ld c, a
+ ld b, 0
+
+; will add the item once the total
+; available space (b) exceeds the
+; amount being added
+.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, [wItemQuantity]
+ cp b
+ jr z, .can_add
+ jr c, .can_add
+
+.next
+ inc hl
+ jr .loop
+
+.terminator
+ call GetPocketCapacity
+ ld a, [de]
+ cp c
+ jr c, .can_add
+
+ and a
+ ret
+
+.can_add
+ ld h, d
+ ld l, e
+ ld a, [wCurItem]
+ ld c, a
+
+.loop2
+ inc hl
+ ld a, [hli]
+ cp a, -1
+ jr z, .terminator2
+ cp c
+ jr nz, .loop2
+
+ ld a, [wItemQuantity]
+ add [hl]
+ cp a, 100
+ jr nc, .set_max
+ ld [hl], a
+ jr .done
+
+; set this slot's quantity to 99,
+; and keep iterating through list
+; to add remaining amount
+.set_max
+ ld [hl], 99
+ sub 99
+ ld [wItemQuantity], a
+ jr .loop2
+
+.terminator2
+ dec hl
+ ld a, [wCurItem]
+ ld [hli], a
+ ld a, [wItemQuantity]
+ ld [hli], a
+ ld [hl], -1
+ ld h, d
+ ld l, e
+ inc [hl]
+
+.done
+ scf
+ ret
+
+
+GetPocketCapacity: ; 03:4BC1
+ ld c, MAX_ITEMS
+ ld a, e
+ cp a, LOW(wNumBagItems)
+ jr nz, .not_bag
+ ld a, d
+ cp HIGH(wNumBagItems)
+ ret z
+
+.not_bag
+ ld c, MAX_PC_ITEMS
+ ret
+
+
+RemoveItemFromPocket: ;03:4BCF
+ ld d, h
+ ld e, l
+ inc hl
+ ld a, [wItemIndex]
+ ld c, a
+ ld b, 0
+ add hl, bc
+ add hl, bc
+ inc hl
+ ld a, [wItemQuantity]
+ ld b, a
+ ld a, [hl]
+ sub b
+ jr c, .underflow
+
+ ld [hl], a
+ ld [wItemQuantityBuffer], a
+ and a
+ jr nz, .done
+
+; if the remaining quantity is zero
+; then erase the slot by shifting
+; the subsequent data upwards
+ dec hl
+ ld b, h
+ ld c, l
+ inc hl
+ inc hl
+
+.loop
+ ld a, [hli]
+ ld [bc], a
+ inc bc
+ cp -1
+ jr nz, .loop
+ ld h, d
+ ld l, e
+ dec [hl]
+
+.done
+ scf
+ ret
+
+.underflow
+ and a
+ ret
+
+
+CheckTheItem: ; 03:4BFD
+ ld a, [wCurItem]
+ ld c, a
+
+.loop
+ inc hl
+ ld a, [hli]
+ cp -1
+ jr z, .fail
+ cp c
+ jr nz, .loop
+
+ scf
+ ret
+
+.fail
+ and a
+ ret
+
+
+ReceiveKeyItem: ; 03:4C0E
+ ld hl, wNumKeyItems
+ ld a, [hli]
+ cp a, MAX_KEY_ITEMS
+ jr nc, .full_pack
+ ld c, a
+ ld b, 0
+ add hl, bc
+ ld a, [wCurItem]
+ ld [hli], a
+ ld [hl], -1
+ ld hl, wNumKeyItems
+ inc [hl]
+ scf
+ ret
+
+.full_pack
+ and a
+ ret
+
+
+TossKeyItem: ; 03:4C28
+ ld hl, wNumKeyItems
+ dec [hl]
+ inc hl
+ ld a, [wItemIndex]
+ ld e, a
+ ld d, 0
+ add hl, de
+ ld d, h
+ ld e, l
+ inc hl
+
+; erase this item by shifting
+; all subsequent data upwards
+.loop
+ ld a, [hli]
+ ld [de], a
+ inc de
+ cp -1
+ jr nz, .loop
+ scf
+ ret
+
+
+CheckKeyItems: ; 03:4C40
+ ld a, [wCurItem]
+ ld c, a
+ ld hl, wKeyItems
+
+.loop
+ ld a, [hli]
+ cp c
+ jr z, .done
+ cp -1
+ jr nz, .loop
+
+ and a
+ ret
+
+.done
+ scf
+ ret
+
+
+; get index of ball item id c from BallItems
+GetBallIndex: ; 03:4C53
+ ld a, c
+ push hl
+ push de
+ push bc
+ ld hl, BallItems
+ ld de, 1
+ call FindItemInTable
+ ld a, b
+ pop bc
+ pop de
+ pop hl
+ ld c, a
+ ret
+
+
+; get ball item id at index c in BallItems
+GetBallByIndex: ; 03:4c66
+ push bc
+ push hl
+ ld b, 0
+ ld hl, BallItems
+ add hl, bc
+ ld a, [hl]
+ pop hl
+ pop bc
+ ld c, a
+ ret
+
+
+BallItems: ; 03:4C73
+ db ITEM_MASTER_BALL
+ db ITEM_ULTRA_BALL
+ db ITEM_GREAT_BALL
+ db ITEM_POKE_BALL
+ db -1
+
+
+; empties the ball pocket by setting the
+; terminator immediately after wNumBallItems
+
+ ; Note, the ball pocket appears to be
+ ; a fixed length, not -1 terminated
+EmptyBallPocket: ; 03:4C78
+ ld hl, wNumBallItems
+ xor a
+ ld [hli], a
+ ld [hl], -1
+ ret
+
+
+ReceiveBall: ; 03:4C80
+ ld hl, wBallQuantities
+ ld b, 0
+ add hl, bc
+ ld a, [wItemQuantity]
+ add [hl]
+ cp 100
+ jr nc, .overflow
+ ld b, a
+ ld a, [hl]
+ and a
+ jr nz, .done
+
+; increase the ball pocket size if
+; this ball's previous quantity was 0
+ ld a, [wNumBallItems]
+ inc a
+ ld [wNumBallItems], a
+
+.done
+ ld [hl], b
+ scf
+ ret
+
+.overflow
+ and a
+ ret
+
+
+TossBall: ; 03:4C9F
+ ld hl, wBallQuantities
+ ld b, 0
+ add hl, bc
+ ld a, [wItemQuantity]
+ ld b, a
+ ld a, [hl]
+ sub b
+ jr c, .underflow
+ jr nz, .done
+
+; increase the ball pocket size if
+; this ball's new quantity is 0
+ ld b, a
+ ld a, [wNumBallItems]
+ dec a
+ ld [wNumBallItems], a
+ ld a, b
+
+.done
+ ld [hl], a
+ ld [wItemQuantityBuffer], a
+ scf
+ ret
+
+.underflow
+ and a
+ ret
+
+
+CheckBall: ; 03:4CC0
+ ld hl, wBallQuantities
+ ld b, 0
+ add hl, bc
+ ld a, [hl]
+ and a
+ ret z
+ scf
+ ret
+
+
+ReceiveTMHM: ; 03:4CCB
+ ld b, 0
+ ld hl, wTMsHMs
+ add hl, bc
+ ld a, [wItemQuantity]
+ add [hl]
+ cp 100
+ jr nc, .overflow
+ ld [hl], a
+ scf
+ ret
+
+.overflow
+ and a
+ ret
+
+
+TossTMHM: ; 03:4CDE
+ ld b, 0
+ ld hl, wTMsHMs
+ add hl, bc
+ ld a, [wItemQuantity]
+ ld b, a
+ ld a, [hl]
+ sub b
+ jr c, .underflow
+
+ ld [hl], a
+ ld [wItemQuantityBuffer], a
+ scf
+ ret
+
+.underflow
+ and a
+ ret
+
+
+CheckTMHM: ; 03:4CF4
+ ld b, 0
+ ld hl, wTMsHMs
+ add hl, bc
+ ld a, [hl]
+ and a
+ ret z
+ scf
+ ret
+
+GetTMHMNumber: ; 03:4CFF
+ ld a, c
+ ld c, 0
+
+ sub ITEM_TM01
+ jr c, .not_machine
+
+ cp ITEM_C8 - ITEM_TM01
+ jr z, .not_machine
+ jr c, .finish
+
+ inc c
+ cp ITEM_E1 - ITEM_TM01
+ jr z, .not_machine
+
+ jr c, .finish
+ inc c
+
+; c represents the amount of non-TMs which
+; appear ahead of this item in the list
+; so subtract that value before exiting
+.finish
+ sub c
+ ld c, a
+ scf
+ ret
+
+.not_machine
+ and a
+ ret
+
+GetNumberedTMHM: ; 03:4D1A
+; Return the item id of a TM/HM by number c.
+ ld a, c
+ ld c, 0
+; Adjust for any dummy items.
+ cp ITEM_C8 - ITEM_TM01 ; TM01-04
+ jr c, .finish
+ inc c
+ cp ITEM_E1 - ITEM_TM01 - 1 ; TM05-28
+ jr c, .finish
+ inc c
+ cp ITEM_FF - ITEM_TM01 - 2 ; End of list
+ jr nc, .not_machine
+.finish
+ add c
+ add ITEM_TM01
+ ld c, a
+ scf
+ ret
+.not_machine
+ and a
+ ret
+
+SECTION "GetItemAmount", ROMX[$4e10], BANK[$03]
+
+; Returns carry if user has the item
+; and the amount in b
+GetItemAmount: ; 03:4e10
+ call CheckAmountInItemPocket
+ ret c
+ call CheckAmountInKeyItems
+ ret c
+ ld b, 0
+ and a
+ ret
+
+; Returns the amount of item b in b
+CheckAmountInItemPocket: ; 03:4E1C
+ ld hl, wItems
+.loop
+ inc hl
+ ld a, [hli]
+ cp -1
+ ret z
+ cp b
+ jr nz, .loop
+
+ ld a, [hl]
+ ld b, a
+ scf
+ ret
+
+; Returns the amount of item b in b
+CheckAmountInKeyItems: ; 03:4E2B
+ ld hl, wNumKeyItems
+ ld a, [hli]
+ and a
+ ret z
+
+.loop
+ ld a, [hli]
+ cp -1
+ ret z
+ cp b
+ jr nz, .loop
+ ld b, 1
+ scf
+ ret
+
+SECTION "_CheckTossableItem", ROMX[$53AD], BANK[$03]
+
+; Return 1 in wItemAttributeParamBuffer and
+; carry if wCurItem can't be removed from the bag.
+_CheckTossableItem: ; 03:53AD
+ ld a, ITEMATTR_PERMISSIONS
+ call GetItemAttr
+ bit CANT_TOSS_F, a
+ jr nz, ItemAttr_ReturnCarry
+ and a
+ ret
+
+; Return 1 in wItemAttributeParamBuffer
+; and carry if wCurItem can't be selected.
+CheckSelectableItem: ; 03:53B8
+ ld a, ITEMATTR_PERMISSIONS
+ call GetItemAttr
+ bit CANT_SELECT_F, a
+ jr nz, ItemAttr_ReturnCarry
+ and a
+ ret
+
+; Return the pocket for wCurItem in wItemAttributeParamBuffer.
+CheckItemPocket: ; 03:53C3
+ ld a, ITEMATTR_POCKET
+ call GetItemAttr
+ and $f
+ ld [wItemAttributeParamBuffer], a
+ ret
+
+; Return the context for wCurItem in wItemAttributeParamBuffer.
+CheckItemContext: ; 03:53CE
+ ld a, ITEMATTR_HELP
+ call GetItemAttr
+ and $f
+ ld [wItemAttributeParamBuffer], a
+ ret
+
+; Return the menu for wCurItem in wItemAttributeParamBuffer.
+CheckItemMenu: ; 03:53D9
+ ld a, ITEMATTR_HELP
+ call GetItemAttr
+ swap a
+ and $f
+ ld [wItemAttributeParamBuffer], a
+ ret
+
+; Get attribute a of wCurItem.
+GetItemAttr: ; 03:53E6
+ push hl
+ push bc
+ ld hl, ItemAttributes
+ ld c, a
+ ld b, 0
+ add hl, bc
+ xor a
+ ld [wItemAttributeParamBuffer], a
+ ld a, [wCurItem]
+ dec a
+ ld c, a
+ ld a, ITEMATTR_STRUCT_LENGTH
+ call AddNTimes
+ ld a, BANK(ItemAttributes)
+ call GetFarByte
+ pop bc
+ pop hl
+ ret
+
+ItemAttr_ReturnCarry: ; 03:5405
+ ld a, 1
+ ld [wItemAttributeParamBuffer], a
+ scf
+ ret
+
+; Return the price of wCurItem in de.
+GetItemPrice: ; 03:540C
+ 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/items/item_effects.asm b/engine/items/item_effects.asm
index d2e9545..7f886f1 100755
--- a/engine/items/item_effects.asm
+++ b/engine/items/item_effects.asm
@@ -1,79 +1,79 @@
-INCLUDE "constants.asm"
-
-SECTION "ApplyPPUp", ROMX[$78f6], BANK[$03]
-
-ApplyPPUp: ; 03:78f6
- ld a, MON_MOVES
- call GetPartyParamLocation
- push hl
- ld de, wStringBuffer1
- predef FillPP
- pop hl
- ld c, MON_PP - MON_MOVES
- ld b, 0
- add hl, bc
- ld de, wStringBuffer1 + 1
- ld b, 0
-.loop
- inc b
- ld a, b
- cp NUM_MOVES + 1
- ret z
- ld a, [wce37]
- dec a
- jr nz, .use
- ld a, [wMenuCursorY]
- inc a
- cp b
- jr nz, .skip
-.use
- ld a, [hl]
- and PP_UP_MASK
- call nz, ComputeMaxPP
-.skip
- inc hl
- inc de
- jr .loop
-
-ComputeMaxPP: ; 03:792B
- push bc
- ; Divide the base PP by 5.
- ld a, [de]
- ldh [hDividend + 3], a
- xor a
- ldh [hDividend], a
- ldh [hDividend + 1], a
- ldh [hDividend + 2], a
- ld a, 5
- ldh [hDivisor], a
- ld b, 4
- call Divide
- ; Get the number of PP, which are bits 6 and 7 of the PP value stored in RAM.
- ld a, [hl]
- ld b, a
- swap a
- and $f
- srl a
- srl a
- ld c, a
-.loop
- ; Normally, a move with 40 PP would have 64 PP with three PP Ups.
- ; Since this would overflow into bit 6, we prevent that from happening
- ; by decreasing the extra amount of PP each PP Up provides, resulting
- ; in a maximum of 61.
- ldh a, [hQuotient + 2]
- cp $8
- jr c, .okay
- ld a, $7
-.okay
- add b
- ld b, a
- ld a, [wce37]
- dec a
- jr z, .no_pp_up
- dec c
- jr nz, .loop
-.no_pp_up
- ld [hl], b
- pop bc
- ret
+INCLUDE "constants.asm"
+
+SECTION "ApplyPPUp", ROMX[$78f6], BANK[$03]
+
+ApplyPPUp: ; 03:78f6
+ ld a, MON_MOVES
+ call GetPartyParamLocation
+ push hl
+ ld de, wStringBuffer1
+ predef FillPP
+ pop hl
+ ld c, MON_PP - MON_MOVES
+ ld b, 0
+ add hl, bc
+ ld de, wStringBuffer1 + 1
+ ld b, 0
+.loop
+ inc b
+ ld a, b
+ cp NUM_MOVES + 1
+ ret z
+ ld a, [wce37]
+ dec a
+ jr nz, .use
+ ld a, [wMenuCursorY]
+ inc a
+ cp b
+ jr nz, .skip
+.use
+ ld a, [hl]
+ and PP_UP_MASK
+ call nz, ComputeMaxPP
+.skip
+ inc hl
+ inc de
+ jr .loop
+
+ComputeMaxPP: ; 03:792B
+ push bc
+ ; Divide the base PP by 5.
+ ld a, [de]
+ ldh [hDividend + 3], a
+ xor a
+ ldh [hDividend], a
+ ldh [hDividend + 1], a
+ ldh [hDividend + 2], a
+ ld a, 5
+ ldh [hDivisor], a
+ ld b, 4
+ call Divide
+ ; Get the number of PP, which are bits 6 and 7 of the PP value stored in RAM.
+ ld a, [hl]
+ ld b, a
+ swap a
+ and $f
+ srl a
+ srl a
+ ld c, a
+.loop
+ ; Normally, a move with 40 PP would have 64 PP with three PP Ups.
+ ; Since this would overflow into bit 6, we prevent that from happening
+ ; by decreasing the extra amount of PP each PP Up provides, resulting
+ ; in a maximum of 61.
+ ldh a, [hQuotient + 2]
+ cp $8
+ jr c, .okay
+ ld a, $7
+.okay
+ add b
+ ld b, a
+ ld a, [wce37]
+ dec a
+ jr z, .no_pp_up
+ dec c
+ jr nz, .loop
+.no_pp_up
+ ld [hl], b
+ pop bc
+ ret
diff --git a/engine/overworld/object_collision.asm b/engine/overworld/object_collision.asm
index a04000b..8d42a93 100755..100644
--- a/engine/overworld/object_collision.asm
+++ b/engine/overworld/object_collision.asm
@@ -1,157 +1,157 @@
-INCLUDE "constants.asm"
-
-SECTION "GetSpritesNextTile", ROMX[$774a], BANK[$01]
-
-; Get the tile that the sprite will walk onto next
-GetSpritesNextTile: ; 01:774a
- ld hl, OBJECT_NEXT_MAP_X
- add hl, bc
- ld d, [hl]
- ld hl, OBJECT_NEXT_MAP_Y
- add hl, bc
- ld e, [hl]
- push bc
- call GetCoordTile
- pop bc
- ret
-
-; Sets carry flag if the object (bc) next tile is a collision
-_IsObjectCollisionTileSolid: ; 01:775a
- call GetSpritesNextTile
- ld e, a
- ld d, 0
- ld hl, CollisionTypeTable
- add hl, de
- ld a, BANK(CollisionTypeTable)
- call GetFarByte
- and ALWAYS_SOLID ; also covers SOMETIMES_SOLID
- ret z
- scf
- ret
-
-
-
-SECTION "_CheckObjectCollision", ROMX[$77dd], BANK[$01]
-
-; returns the carry flag if a sprite is at coords d, e
-; will not collide with sprite index stored in hEventCollisionException
-_CheckObjectCollision: ; 01:77dd
- ld bc, wObjectStructs
- xor a
-.loop
- ldh [hObjectStructIndexBuffer], a
- ld hl, OBJECT_SPRITE
- add hl, bc
- ld a, [hl]
- and a
- jr z, .next
- ld hl, OBJECT_NEXT_MAP_X
- add hl, bc
- ld a, [hl]
- cp d
- jr nz, .check_last_position
- ld hl, OBJECT_NEXT_MAP_Y
- add hl, bc
- ld a, [hl]
- cp e
- jr nz, .check_last_position
- ldh a, [hEventCollisionException]
- ld l, a
- ldh a, [hObjectStructIndexBuffer]
- cp l
- jr nz, .collision
-.check_last_position
- ld hl, OBJECT_MAP_X
- add hl, bc
- ld a, [hl]
- cp d
- jr nz, .next
- ld hl, OBJECT_MAP_Y
- add hl, bc
- ld a, [hl]
- cp e
- jr nz, .next
- ldh a, [hEventCollisionException]
- ld l, a
- ldh a, [hObjectStructIndexBuffer]
- cp l
- jr nz, .collision
-.next
- ld hl, OBJECT_LENGTH
- add hl, bc
- ld b, h
- ld c, l
- ldh a, [hObjectStructIndexBuffer]
- inc a
- cp NUM_OBJECT_STRUCTS
- jr nz, .loop
- and a
- ret
-
-.collision
- scf
- ret
-
-SECTION "_CheckPlayerObjectCollision", ROMX[$7894], BANK[$01]
-
-; Sets the carry flag if the player will collide with another sprite's current or next position
-_CheckPlayerObjectCollision: ; 01:7894
- ld a, [wPlayerNextMapX]
- ld d, a
- ld a, [wPlayerNextMapY]
- ld e, a
- ld bc, wObjectStructs
- xor a
-
-.loop
- ldh [hObjectStructIndexBuffer], a
- ld hl, OBJECT_SPRITE
- add hl, bc
- ld a, [hl]
- and a
- jr z, .next
- ld hl, OBJECT_NEXT_MAP_Y
- add hl, bc
- ld a, [hl]
- cp e
- jr nz, .check_last_position
- ld hl, OBJECT_NEXT_MAP_X
- add hl, bc
- ld a, [hl]
- cp d
- jr nz, .check_last_position
-
-; skip the player sprite
- ldh a, [hObjectStructIndexBuffer]
- cp PLAYER_OBJECT_INDEX
- jr z, .next
- jr .collision
-
-.check_last_position
- ld hl, OBJECT_MAP_Y
- add hl, bc
- ld a, [hl]
- cp e
- jr nz, .next
- ld hl, OBJECT_MAP_X
- add hl, bc
- ld a, [hl]
- cp d
- jr nz, .next
- jr .collision
-
-.next
- ld hl, OBJECT_LENGTH
- add hl, bc
- ld b, h
- ld c, l
- ldh a, [hObjectStructIndexBuffer]
- inc a
- cp NUM_OBJECT_STRUCTS
- jr nz, .loop
- xor a
- ret
-
-.collision
- scf
- ret
+INCLUDE "constants.asm"
+
+SECTION "GetSpritesNextTile", ROMX[$774a], BANK[$01]
+
+; Get the tile that the sprite will walk onto next
+GetSpritesNextTile: ; 01:774a
+ ld hl, OBJECT_NEXT_MAP_X
+ add hl, bc
+ ld d, [hl]
+ ld hl, OBJECT_NEXT_MAP_Y
+ add hl, bc
+ ld e, [hl]
+ push bc
+ call GetCoordTile
+ pop bc
+ ret
+
+; Sets carry flag if the object (bc) next tile is a collision
+_IsObjectCollisionTileSolid: ; 01:775a
+ call GetSpritesNextTile
+ ld e, a
+ ld d, 0
+ ld hl, CollisionTypeTable
+ add hl, de
+ ld a, BANK(CollisionTypeTable)
+ call GetFarByte
+ and ALWAYS_SOLID ; also covers SOMETIMES_SOLID
+ ret z
+ scf
+ ret
+
+
+
+SECTION "_CheckObjectCollision", ROMX[$77dd], BANK[$01]
+
+; returns the carry flag if a sprite is at coords d, e
+; will not collide with sprite index stored in hEventCollisionException
+_CheckObjectCollision: ; 01:77dd
+ ld bc, wObjectStructs
+ xor a
+.loop
+ ldh [hObjectStructIndexBuffer], a
+ ld hl, OBJECT_SPRITE
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .next
+ ld hl, OBJECT_NEXT_MAP_X
+ add hl, bc
+ ld a, [hl]
+ cp d
+ jr nz, .check_last_position
+ ld hl, OBJECT_NEXT_MAP_Y
+ add hl, bc
+ ld a, [hl]
+ cp e
+ jr nz, .check_last_position
+ ldh a, [hEventCollisionException]
+ ld l, a
+ ldh a, [hObjectStructIndexBuffer]
+ cp l
+ jr nz, .collision
+.check_last_position
+ ld hl, OBJECT_MAP_X
+ add hl, bc
+ ld a, [hl]
+ cp d
+ jr nz, .next
+ ld hl, OBJECT_MAP_Y
+ add hl, bc
+ ld a, [hl]
+ cp e
+ jr nz, .next
+ ldh a, [hEventCollisionException]
+ ld l, a
+ ldh a, [hObjectStructIndexBuffer]
+ cp l
+ jr nz, .collision
+.next
+ ld hl, OBJECT_LENGTH
+ add hl, bc
+ ld b, h
+ ld c, l
+ ldh a, [hObjectStructIndexBuffer]
+ inc a
+ cp NUM_OBJECT_STRUCTS
+ jr nz, .loop
+ and a
+ ret
+
+.collision
+ scf
+ ret
+
+SECTION "_CheckPlayerObjectCollision", ROMX[$7894], BANK[$01]
+
+; Sets the carry flag if the player will collide with another sprite's current or next position
+_CheckPlayerObjectCollision: ; 01:7894
+ ld a, [wPlayerNextMapX]
+ ld d, a
+ ld a, [wPlayerNextMapY]
+ ld e, a
+ ld bc, wObjectStructs
+ xor a
+
+.loop
+ ldh [hObjectStructIndexBuffer], a
+ ld hl, OBJECT_SPRITE
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .next
+ ld hl, OBJECT_NEXT_MAP_Y
+ add hl, bc
+ ld a, [hl]
+ cp e
+ jr nz, .check_last_position
+ ld hl, OBJECT_NEXT_MAP_X
+ add hl, bc
+ ld a, [hl]
+ cp d
+ jr nz, .check_last_position
+
+; skip the player sprite
+ ldh a, [hObjectStructIndexBuffer]
+ cp PLAYER_OBJECT_INDEX
+ jr z, .next
+ jr .collision
+
+.check_last_position
+ ld hl, OBJECT_MAP_Y
+ add hl, bc
+ ld a, [hl]
+ cp e
+ jr nz, .next
+ ld hl, OBJECT_MAP_X
+ add hl, bc
+ ld a, [hl]
+ cp d
+ jr nz, .next
+ jr .collision
+
+.next
+ ld hl, OBJECT_LENGTH
+ add hl, bc
+ ld b, h
+ ld c, l
+ ldh a, [hObjectStructIndexBuffer]
+ inc a
+ cp NUM_OBJECT_STRUCTS
+ jr nz, .loop
+ xor a
+ ret
+
+.collision
+ scf
+ ret
diff --git a/engine/overworld/spawn_points.asm b/engine/overworld/spawn_points.asm
index c159a21..2476c46 100755
--- a/engine/overworld/spawn_points.asm
+++ b/engine/overworld/spawn_points.asm
@@ -1,59 +1,59 @@
-INCLUDE "constants.asm"
-
-SECTION "LoadSpawnPoint", ROMX[$4791], BANK[$03]
-
-LoadSpawnPoint: ; 03:4791
-; loads the spawn point in wDefaultSpawnPoint
- push hl
- push de
- ld a, [wDefaultSpawnPoint]
- and a
- jr z, .skip
- dec a
- ld l, a
- ld h, 0
- add hl, hl
- add hl, hl
- ld de, SpawnPoints
- add hl, de
- ld a, [hli]
- ld [wMapGroup], a
- ld a, [hli]
- ld [wMapId], a
- ld a, [hli]
- ld [wXCoord], a
- ld a, [hli]
- ld [wYCoord], a
-.skip
- pop de
- pop hl
- ret
-
-IsSpawnPoint: ; 03:47b6
-; Checks if the map loaded in de is a spawn point.
-; Returns carry if it's a spawn point.
- ld hl, SpawnPoints
- ld c, 1
-.loop
- ld a, [hl]
- cp SPAWN_N_A
- jr z, .fail
- cp d
- jr nz, .next
- inc hl
- ld a, [hld]
- cp e
- jr z, .succeed
-.next
- push bc
- ld bc, SPAWN_POINT_SIZE
- add hl, bc
- pop bc
- inc c
- jr .loop
-.fail
- and a
- ret
-.succeed
- scf
- ret
+INCLUDE "constants.asm"
+
+SECTION "LoadSpawnPoint", ROMX[$4791], BANK[$03]
+
+LoadSpawnPoint: ; 03:4791
+; loads the spawn point in wDefaultSpawnPoint
+ push hl
+ push de
+ ld a, [wDefaultSpawnPoint]
+ and a
+ jr z, .skip
+ dec a
+ ld l, a
+ ld h, 0
+ add hl, hl
+ add hl, hl
+ ld de, SpawnPoints
+ add hl, de
+ ld a, [hli]
+ ld [wMapGroup], a
+ ld a, [hli]
+ ld [wMapId], a
+ ld a, [hli]
+ ld [wXCoord], a
+ ld a, [hli]
+ ld [wYCoord], a
+.skip
+ pop de
+ pop hl
+ ret
+
+IsSpawnPoint: ; 03:47b6
+; Checks if the map loaded in de is a spawn point.
+; Returns carry if it's a spawn point.
+ ld hl, SpawnPoints
+ ld c, 1
+.loop
+ ld a, [hl]
+ cp SPAWN_N_A
+ jr z, .fail
+ cp d
+ jr nz, .next
+ inc hl
+ ld a, [hld]
+ cp e
+ jr z, .succeed
+.next
+ push bc
+ ld bc, SPAWN_POINT_SIZE
+ add hl, bc
+ pop bc
+ inc c
+ jr .loop
+.fail
+ and a
+ ret
+.succeed
+ scf
+ ret
diff --git a/engine/pokemon/health.asm b/engine/pokemon/health.asm
index 2d81b8d..8456623 100755
--- a/engine/pokemon/health.asm
+++ b/engine/pokemon/health.asm
@@ -1,358 +1,358 @@
-INCLUDE "constants.asm"
-
-SECTION "HealParty", ROMX[$4d6f], BANK[$03]
-
-HealParty: ; 03:4d6f
- ld hl, wPartySpecies
- ld de, wPartyMons
-
-.party_loop
- ld a, [hli]
- cp -1
- jr z, .party_done
- push hl
- push de
-
-; Clear the status
- ld hl, MON_STATUS
- add hl, de
- xor a
- ld [hli], a
- ld [hl], a
-
-; Reset the PP
- ld hl, MON_MOVES
- add hl, de
- ld b, NUM_MOVES
-
-.move_loop
- push hl
- push bc
- ld a, [hl]
- and a
- jr z, .next_move
- dec a
- push hl
- ld hl, Moves
- ld bc, MOVE_DATA_SIZE
- call AddNTimes
- ld a, BANK(Moves)
- call GetFarByte
- pop hl
- ld bc, MON_PP - MON_MOVES
- add hl, bc
- ld b, a
- ld a, [hl]
- and PP_UP_MASK
- add b
- ld [hl], a
-
-.next_move
- pop bc
- pop hl
- inc hl
- dec b
- jr nz, .move_loop
-
-; Reset the HP
- pop de
- push de
- ld hl, MON_MAXHP
- add hl, de
- ld b, h
- ld c, l
- dec bc
- dec bc
- ld a, [hli]
- ld [bc], a
- inc bc
- ld a, [hl]
- ld [bc], a
- pop de
- pop hl
- push hl
- ld hl, PARTYMON_STRUCT_LENGTH
- add hl, de
- ld d, h
- ld e, l
- pop hl
- jr .party_loop
-
-.party_done
- xor a
- ld [wWhichPokemon], a
- ld [wce37], a
- ld a, [wPartyCount]
- ld b, a
-
-.pp_up
- push bc
- call ApplyPPUp
- pop bc
- ld hl, wWhichPokemon
- inc [hl]
- dec b
- jr nz, .pp_up
- ret
-
-SECTION "HP Bar", ROMX[$4e3c], BANK[$03]
-
-ComputeHPBarPixels: ; 03:4e3c
- push hl
- xor a
- ldh [hMultiplicand], a
- ld a, b
- ldh [hMultiplicand + 1], a
- ld a, c
- ldh [hMultiplicand + 2], a
- ld a, HP_BAR_LENGTH_PX
- ldh [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
- ldh a, [hProduct + 2]
- ld b, a
- ldh a, [hProduct + 3]
- srl b
- rr a
- srl b
- rr a
- ldh [hDividend + 3], a
- ld a, b
- ldh [hDividend + 2], a
-.divide
- ld a, e
- ldh [hDivisor], a
- ld b, 4
- call Divide
- ldh a, [hQuotient + 2]
- ld e, a
- pop hl
- and a
- ret nz
- ld e, 1
- ret
-
-UpdateHPBar: ; 03:4e7c
- ld a, [wHPBarOldHP]
- ld c, a
- ld a, [wHPBarOldHP + 1]
- ld b, a
- ld a, [wHPBarNewHP]
- ld e, a
- ld a, [wHPBarNewHP + 1]
- ld d, a
- push de
- push bc
- call UpdateHPBar_CalcHPDifference
- ld a, e
- ld [wHPBarHPDifference + 1], a
- ld a, d
- ld [wHPBarHPDifference], a
- pop bc
- pop de
- call UpdateHPBar_CompareNewHPToOldHP
- ret z
- ld a, -1
- jr c, .hp_decrease
- ld a, 1
-.hp_decrease
- ld [wHPBarDelta], a
- ld a, [wHPBarNewHP]
- ld e, a
- ld a, [wHPBarNewHP + 1]
- ld d, a
-.animate_hp_bar_loop
- push de
- ld a, [wHPBarOldHP]
- ld c, a
- ld a, [wHPBarOldHP + 1]
- ld b, a
- call UpdateHPBar_CompareNewHPToOldHP
- jr z, .animate_hp_bar_done
- jr nc, .hp_increase
-
-;hp_decrease
- dec bc
- ld a, c
- ld [wHPBarNewHP], a
- ld a, b
- ld [wHPBarNewHP + 1], a
- call UpdateHPBar_CalcOldNewHPBarPixels
- ld a, e
- sub d
- jr .apply
-.hp_increase
- inc bc
- ld a, c
- ld [wHPBarNewHP], a
- ld a, b
- ld [wHPBarNewHP + 1], a
- call UpdateHPBar_CalcOldNewHPBarPixels
- ld a, d
- sub e
-.apply
- call UpdateHPBar_PrintHPNumber
- and a
- jr z, .no_pixel_difference
- call UpdateHPBar_AnimateHPBar
-.no_pixel_difference
- ld a, [wHPBarNewHP]
- ld [wHPBarOldHP], a
- ld a, [wHPBarNewHP + 1]
- ld [wHPBarOldHP + 1], a
- pop de
- jr .animate_hp_bar_loop
-.animate_hp_bar_done
- pop de
- ld a, e
- ld [wHPBarOldHP], a
- ld a, d
- ld [wHPBarOldHP + 1], a
- or e
- jr z, .mon_fainted
- call UpdateHPBar_CalcOldNewHPBarPixels
- ld d, e
-.mon_fainted
- call UpdateHPBar_PrintHPNumber
- ld a, 1
- call UpdateHPBar_AnimateHPBar
- jp WaitBGMap
-
-; animates the HP bar going up or down for (a) ticks (two waiting frames each)
-; stops prematurely if bar is filled up
-; e: current health (in pixels) to start with
-UpdateHPBar_AnimateHPBar: ; 03:4F11
- push hl
-
-.bar_animation_loop
- push af
- push de
- ld d, HP_BAR_LENGTH
- ld a, [wHPBarType]
- and BATTLE_HP_BAR
- ld b, a
- call DrawBattleHPBar
- ld c, 2
- call DelayFrames
- pop de
- ld a, [wHPBarDelta]
- add e
- cp HP_BAR_LENGTH_PX + 1
- jr nc, .bar_filled_up
- ld e, a
- pop af
- dec a
- jr nz, .bar_animation_loop
- pop hl
- ret
-.bar_filled_up
- pop af
- pop hl
- ret
-
-; compares old HP and new HP and sets c and z flags accordingly
-UpdateHPBar_CompareNewHPToOldHP: ; 03:4F37
- ld a, d
- sub b
- ret nz
- ld a, e
- sub c
- ret
-
-; calcs HP difference between bc and de (into de)
-UpdateHPBar_CalcHPDifference: ; 03:4F3D
- ld a, d
- sub b
- jr c, .old_hp_greater
- jr z, .test_lower_byte
-.new_hp_greater
- ld a, e
- sub c
- ld e, a
- ld a, d
- sbc b
- ld d, a
- ret
-.old_hp_greater
- ld a, c
- sub e
- ld e, a
- ld a, b
- sbc d
- ld d, a
- ret
-.test_lower_byte
- ld a, e
- sub c
- jr c, .old_hp_greater
- jr nz, .new_hp_greater
- ld de, 0
- ret
-
-UpdateHPBar_PrintHPNumber: ; 03:4F5B
- push af
- push de
- ld a, [wHPBarType]
- and a
- jr z, .done
- ld a, [wHPBarOldHP]
- ld [wHPBarTempHP + 1], a
- ld a, [wHPBarOldHP + 1]
- ld [wHPBarTempHP], a
- push hl
- ld de, SCREEN_WIDTH + 1
- add hl, de
- push hl
- ld a, " "
- ld [hli], a
- ld [hli], a
- ld [hli], a
- pop hl
- ld de, wHPBarTempHP
- lb bc, 2, 3
- call PrintNumber
- call DelayFrame
- pop hl
-.done
- pop de
- pop af
- ret
-
-; calcs number of HP bar pixels for old and new HP value
-; d: new pixels
-; e: old pixels
-UpdateHPBar_CalcOldNewHPBarPixels: ; 03:4F8B
- push hl
- ld hl, wHPBarMaxHP
- ld a, [hli]
- ld e, a
- ld a, [hli]
- ld d, a
- ld a, [hli]
- ld c, a
- ld a, [hli]
- ld b, a
- ld a, [hli]
- ld h, [hl]
- ld l, a
- push hl
- push de
- call ComputeHPBarPixels
- ld a, e
- pop de
- pop bc
- push af
- call ComputeHPBarPixels
- pop af
- ld d, e
- ld e, a
- pop hl
- ret
+INCLUDE "constants.asm"
+
+SECTION "HealParty", ROMX[$4d6f], BANK[$03]
+
+HealParty: ; 03:4d6f
+ ld hl, wPartySpecies
+ ld de, wPartyMons
+
+.party_loop
+ ld a, [hli]
+ cp -1
+ jr z, .party_done
+ push hl
+ push de
+
+; Clear the status
+ ld hl, MON_STATUS
+ add hl, de
+ xor a
+ ld [hli], a
+ ld [hl], a
+
+; Reset the PP
+ ld hl, MON_MOVES
+ add hl, de
+ ld b, NUM_MOVES
+
+.move_loop
+ push hl
+ push bc
+ ld a, [hl]
+ and a
+ jr z, .next_move
+ dec a
+ push hl
+ ld hl, Moves
+ ld bc, MOVE_DATA_SIZE
+ call AddNTimes
+ ld a, BANK(Moves)
+ call GetFarByte
+ pop hl
+ ld bc, MON_PP - MON_MOVES
+ add hl, bc
+ ld b, a
+ ld a, [hl]
+ and PP_UP_MASK
+ add b
+ ld [hl], a
+
+.next_move
+ pop bc
+ pop hl
+ inc hl
+ dec b
+ jr nz, .move_loop
+
+; Reset the HP
+ pop de
+ push de
+ ld hl, MON_MAXHP
+ add hl, de
+ ld b, h
+ ld c, l
+ dec bc
+ dec bc
+ ld a, [hli]
+ ld [bc], a
+ inc bc
+ ld a, [hl]
+ ld [bc], a
+ pop de
+ pop hl
+ push hl
+ ld hl, PARTYMON_STRUCT_LENGTH
+ add hl, de
+ ld d, h
+ ld e, l
+ pop hl
+ jr .party_loop
+
+.party_done
+ xor a
+ ld [wWhichPokemon], a
+ ld [wce37], a
+ ld a, [wPartyCount]
+ ld b, a
+
+.pp_up
+ push bc
+ call ApplyPPUp
+ pop bc
+ ld hl, wWhichPokemon
+ inc [hl]
+ dec b
+ jr nz, .pp_up
+ ret
+
+SECTION "HP Bar", ROMX[$4e3c], BANK[$03]
+
+ComputeHPBarPixels: ; 03:4e3c
+ push hl
+ xor a
+ ldh [hMultiplicand], a
+ ld a, b
+ ldh [hMultiplicand + 1], a
+ ld a, c
+ ldh [hMultiplicand + 2], a
+ ld a, HP_BAR_LENGTH_PX
+ ldh [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
+ ldh a, [hProduct + 2]
+ ld b, a
+ ldh a, [hProduct + 3]
+ srl b
+ rr a
+ srl b
+ rr a
+ ldh [hDividend + 3], a
+ ld a, b
+ ldh [hDividend + 2], a
+.divide
+ ld a, e
+ ldh [hDivisor], a
+ ld b, 4
+ call Divide
+ ldh a, [hQuotient + 2]
+ ld e, a
+ pop hl
+ and a
+ ret nz
+ ld e, 1
+ ret
+
+UpdateHPBar: ; 03:4e7c
+ ld a, [wHPBarOldHP]
+ ld c, a
+ ld a, [wHPBarOldHP + 1]
+ ld b, a
+ ld a, [wHPBarNewHP]
+ ld e, a
+ ld a, [wHPBarNewHP + 1]
+ ld d, a
+ push de
+ push bc
+ call UpdateHPBar_CalcHPDifference
+ ld a, e
+ ld [wHPBarHPDifference + 1], a
+ ld a, d
+ ld [wHPBarHPDifference], a
+ pop bc
+ pop de
+ call UpdateHPBar_CompareNewHPToOldHP
+ ret z
+ ld a, -1
+ jr c, .hp_decrease
+ ld a, 1
+.hp_decrease
+ ld [wHPBarDelta], a
+ ld a, [wHPBarNewHP]
+ ld e, a
+ ld a, [wHPBarNewHP + 1]
+ ld d, a
+.animate_hp_bar_loop
+ push de
+ ld a, [wHPBarOldHP]
+ ld c, a
+ ld a, [wHPBarOldHP + 1]
+ ld b, a
+ call UpdateHPBar_CompareNewHPToOldHP
+ jr z, .animate_hp_bar_done
+ jr nc, .hp_increase
+
+;hp_decrease
+ dec bc
+ ld a, c
+ ld [wHPBarNewHP], a
+ ld a, b
+ ld [wHPBarNewHP + 1], a
+ call UpdateHPBar_CalcOldNewHPBarPixels
+ ld a, e
+ sub d
+ jr .apply
+.hp_increase
+ inc bc
+ ld a, c
+ ld [wHPBarNewHP], a
+ ld a, b
+ ld [wHPBarNewHP + 1], a
+ call UpdateHPBar_CalcOldNewHPBarPixels
+ ld a, d
+ sub e
+.apply
+ call UpdateHPBar_PrintHPNumber
+ and a
+ jr z, .no_pixel_difference
+ call UpdateHPBar_AnimateHPBar
+.no_pixel_difference
+ ld a, [wHPBarNewHP]
+ ld [wHPBarOldHP], a
+ ld a, [wHPBarNewHP + 1]
+ ld [wHPBarOldHP + 1], a
+ pop de
+ jr .animate_hp_bar_loop
+.animate_hp_bar_done
+ pop de
+ ld a, e
+ ld [wHPBarOldHP], a
+ ld a, d
+ ld [wHPBarOldHP + 1], a
+ or e
+ jr z, .mon_fainted
+ call UpdateHPBar_CalcOldNewHPBarPixels
+ ld d, e
+.mon_fainted
+ call UpdateHPBar_PrintHPNumber
+ ld a, 1
+ call UpdateHPBar_AnimateHPBar
+ jp WaitBGMap
+
+; animates the HP bar going up or down for (a) ticks (two waiting frames each)
+; stops prematurely if bar is filled up
+; e: current health (in pixels) to start with
+UpdateHPBar_AnimateHPBar: ; 03:4F11
+ push hl
+
+.bar_animation_loop
+ push af
+ push de
+ ld d, HP_BAR_LENGTH
+ ld a, [wHPBarType]
+ and BATTLE_HP_BAR
+ ld b, a
+ call DrawBattleHPBar
+ ld c, 2
+ call DelayFrames
+ pop de
+ ld a, [wHPBarDelta]
+ add e
+ cp HP_BAR_LENGTH_PX + 1
+ jr nc, .bar_filled_up
+ ld e, a
+ pop af
+ dec a
+ jr nz, .bar_animation_loop
+ pop hl
+ ret
+.bar_filled_up
+ pop af
+ pop hl
+ ret
+
+; compares old HP and new HP and sets c and z flags accordingly
+UpdateHPBar_CompareNewHPToOldHP: ; 03:4F37
+ ld a, d
+ sub b
+ ret nz
+ ld a, e
+ sub c
+ ret
+
+; calcs HP difference between bc and de (into de)
+UpdateHPBar_CalcHPDifference: ; 03:4F3D
+ ld a, d
+ sub b
+ jr c, .old_hp_greater
+ jr z, .test_lower_byte
+.new_hp_greater
+ ld a, e
+ sub c
+ ld e, a
+ ld a, d
+ sbc b
+ ld d, a
+ ret
+.old_hp_greater
+ ld a, c
+ sub e
+ ld e, a
+ ld a, b
+ sbc d
+ ld d, a
+ ret
+.test_lower_byte
+ ld a, e
+ sub c
+ jr c, .old_hp_greater
+ jr nz, .new_hp_greater
+ ld de, 0
+ ret
+
+UpdateHPBar_PrintHPNumber: ; 03:4F5B
+ push af
+ push de
+ ld a, [wHPBarType]
+ and a
+ jr z, .done
+ ld a, [wHPBarOldHP]
+ ld [wHPBarTempHP + 1], a
+ ld a, [wHPBarOldHP + 1]
+ ld [wHPBarTempHP], a
+ push hl
+ ld de, SCREEN_WIDTH + 1
+ add hl, de
+ push hl
+ ld a, " "
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ pop hl
+ ld de, wHPBarTempHP
+ lb bc, 2, 3
+ call PrintNumber
+ call DelayFrame
+ pop hl
+.done
+ pop de
+ pop af
+ ret
+
+; calcs number of HP bar pixels for old and new HP value
+; d: new pixels
+; e: old pixels
+UpdateHPBar_CalcOldNewHPBarPixels: ; 03:4F8B
+ push hl
+ ld hl, wHPBarMaxHP
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a
+ ld a, [hli]
+ ld c, a
+ ld a, [hli]
+ ld b, a
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ push hl
+ push de
+ call ComputeHPBarPixels
+ ld a, e
+ pop de
+ pop bc
+ push af
+ call ComputeHPBarPixels
+ pop af
+ ld d, e
+ ld e, a
+ pop hl
+ ret
diff --git a/engine/smallflag.asm b/engine/smallflag.asm
index dfce475..a231d0b 100755
--- a/engine/smallflag.asm
+++ b/engine/smallflag.asm
@@ -1,72 +1,72 @@
-SECTION "SmallFarFlagAction", ROMX[$4d33], BANK[$03]
-
-SmallFarFlagAction: ; 03:4d33
-; Perform action b on bit c in flag array hl.
-; If checking a flag, check flag array d:hl unless d is 0.
-
-; For longer flag arrays, see FlagAction.
-
- push hl
- push bc
-
-; Divide by 8 to get the byte we want.
- push bc
- srl c
- srl c
- srl c
- ld b, 0
- add hl, bc
- pop bc
-
-; Which bit we want from the byte
- ld a, c
- and 7
- ld c, a
-
-; Shift left until we can mask the bit
- ld a, 1
- jr z, .shifted
-.shift
- add a
- dec c
- jr nz, .shift
-.shifted
- ld c, a
-
-; What are we doing to this flag?
- dec b
- jr z, .set ; 1
- dec b
- jr z, .check ; 2
-
-.reset
- ld a, c
- cpl
- and [hl]
- ld [hl], a
- jr .done
-
-.set
- ld a, [hl]
- or c
- ld [hl], a
- jr .done
-
-.check
- ld a, d
- cp 0
- jr nz, .farcheck
-
- ld a, [hl]
- and c
- jr .done
-
-.farcheck
- call GetFarByte
- and c
-
-.done
- pop bc
- pop hl
- ld c, a
+SECTION "SmallFarFlagAction", ROMX[$4d33], BANK[$03]
+
+SmallFarFlagAction: ; 03:4d33
+; Perform action b on bit c in flag array hl.
+; If checking a flag, check flag array d:hl unless d is 0.
+
+; For longer flag arrays, see FlagAction.
+
+ push hl
+ push bc
+
+; Divide by 8 to get the byte we want.
+ push bc
+ srl c
+ srl c
+ srl c
+ ld b, 0
+ add hl, bc
+ pop bc
+
+; Which bit we want from the byte
+ ld a, c
+ and 7
+ ld c, a
+
+; Shift left until we can mask the bit
+ ld a, 1
+ jr z, .shifted
+.shift
+ add a
+ dec c
+ jr nz, .shift
+.shifted
+ ld c, a
+
+; What are we doing to this flag?
+ dec b
+ jr z, .set ; 1
+ dec b
+ jr z, .check ; 2
+
+.reset
+ ld a, c
+ cpl
+ and [hl]
+ ld [hl], a
+ jr .done
+
+.set
+ ld a, [hl]
+ or c
+ ld [hl], a
+ jr .done
+
+.check
+ ld a, d
+ cp 0
+ jr nz, .farcheck
+
+ ld a, [hl]
+ and c
+ jr .done
+
+.farcheck
+ call GetFarByte
+ and c
+
+.done
+ pop bc
+ pop hl
+ ld c, a
ret \ No newline at end of file