summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitattributes23
-rwxr-xr-xconstants/item_data_constants.asm258
-rw-r--r--[-rwxr-xr-x]constants/movement_constants.asm88
-rwxr-xr-xconstants/name_constants.asm2
-rwxr-xr-xconstants/script_constants.asm36
-rw-r--r--[-rwxr-xr-x]data/collision/collision_type_table.asm138
-rw-r--r--data/types/type_matchups.asm226
-rwxr-xr-xengine/bcd.asm110
-rwxr-xr-xengine/events/field_moves.asm1083
-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
-rw-r--r--gfx/pokemon/annon_pic_ptrs.asm110
-rw-r--r--gfx/pokemon/annon_pics.asm106
-rwxr-xr-xhome/items.asm138
-rwxr-xr-xhome/tables.asm54
-rwxr-xr-xmacros/queue.asm34
-rwxr-xr-xmacros/scripts.asm28
21 files changed, 2676 insertions, 2652 deletions
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..b967def
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,23 @@
+# Auto detect text files and perform LF normalization
+* text eol=lf
+
+# Explicitly declare text files you want to always be normalized and converted
+# to native line endings on checkout.
+*.asm text
+*.sh text
+*.c text
+*.py text
+*.MD text
+*.h text
+*.txt text
+*.inc text
+
+
+# Denote all files that are truly binary and should not be modified.
+*.png binary
+*.lz binary
+*.2bpp binary
+*.1bpp binary
+*.bin binary
+*.blk binary
+*.pic binary \ No newline at end of file
diff --git a/constants/item_data_constants.asm b/constants/item_data_constants.asm
index bf8516d..1354a40 100755
--- a/constants/item_data_constants.asm
+++ b/constants/item_data_constants.asm
@@ -1,129 +1,129 @@
-; item_attributes struct members (see data/items/attributes.asm)
- const_def
- const ITEMATTR_PRICE
- const ITEMATTR_PRICE_HI
- const ITEMATTR_EFFECT
- const ITEMATTR_PARAM
- const ITEMATTR_PERMISSIONS
- const ITEMATTR_POCKET
- const ITEMATTR_HELP
-ITEMATTR_STRUCT_LENGTH EQU const_value
-
-; item types
- const_def 1
- const ITEM ; 1
- const KEY_ITEM ; 2
- const BALL ; 3
- const TM_HM ; 4
-
-; item menu types
-; UseItem.dw indexes (see engine/items/pack.asm)
-; UseRegisteredItem.SwitchTo indexes (see engine/overworld/select_menu.asm)
-ITEMMENU_NOUSE EQU 0
-ITEMMENU_CURRENT EQU 4
-ITEMMENU_PARTY EQU 5
-ITEMMENU_CLOSE EQU 6
-
-; item actions
-CANT_SELECT_F EQU 6
-CANT_TOSS_F EQU 7
-
-NO_LIMITS EQU 0
-CANT_SELECT EQU 1 << CANT_SELECT_F
-CANT_TOSS EQU 1 << CANT_TOSS_F
-
-; pack pockets
- const_def
- const ITEM_POCKET ; 0
- const BALL_POCKET ; 1
- const KEY_ITEM_POCKET ; 2
- const TM_HM_POCKET ; 3
-NUM_POCKETS EQU const_value
-
-MAX_ITEMS EQU 20
-MAX_KEY_ITEMS EQU 20
-MAX_PC_ITEMS EQU 50
-
-; held item effects
- const_def
- const HELD_NONE
- const HELD_BERRY
- const HELD_2
- const HELD_LEFTOVERS
- const HELD_4
- const HELD_5
- const HELD_RESTORE_PP
- const HELD_RESTORE_ALL_PP
- const HELD_CLEANSE_TAG
-
- const_def 10
- const HELD_HEAL_POISON
- const HELD_HEAL_FREEZE
- const HELD_HEAL_BURN
- const HELD_HEAL_SLEEP
- const HELD_HEAL_PARALYZE
- const HELD_HEAL_STATUS
- const HELD_HEAL_CONFUSION
-
- const_def 20
- const HELD_PREVENT_POISON
- const HELD_PREVENT_BURN
- const HELD_PREVENT_FREEZE
- const HELD_PREVENT_SLEEP
- const HELD_PREVENT_PARALYZE
- const HELD_PREVENT_CONFUSE
-
- const_def 30
- const HELD_30
- const HELD_ATTACK_UP
- const HELD_DEFENSE_UP
- const HELD_SPEED_UP
- const HELD_SP_ATTACK_UP
- const HELD_SP_DEFENSE_UP
- const HELD_ACCURACY_UP
- const HELD_EVASION_UP
- const HELD_38
-
- const_def 40
- const HELD_40
- const HELD_41
- const HELD_METAL_POWDER
- const HELD_43
- const HELD_44
- const HELD_45
- const HELD_46
- const HELD_47
- const HELD_48
-
- const_def 50
- const HELD_NORMAL_BOOST
- const HELD_FIGHTING_BOOST
- const HELD_FLYING_BOOST
- const HELD_POISON_BOOST
- const HELD_GROUND_BOOST
- const HELD_ROCK_BOOST
- const HELD_BUG_BOOST
- const HELD_GHOST_BOOST
- const HELD_FIRE_BOOST
- const HELD_WATER_BOOST
- const HELD_GRASS_BOOST
- const HELD_ELECTRIC_BOOST
- const HELD_PSYCHIC_BOOST
- const HELD_ICE_BOOST
- const HELD_DRAGON_BOOST
- const HELD_DARK_BOOST
- const HELD_STEEL_BOOST
-
- const_def 70
- const HELD_CATCH_CHANCE
- const HELD_71
- const HELD_ESCAPE
- const HELD_CRITICAL_UP
- const HELD_QUICK_CLAW
- const HELD_FLINCH
- const HELD_AMULET_COIN
- const HELD_BRIGHTPOWDER
- const HELD_78
- const HELD_FOCUS_BAND
-
-
+; item_attributes struct members (see data/items/attributes.asm)
+ const_def
+ const ITEMATTR_PRICE
+ const ITEMATTR_PRICE_HI
+ const ITEMATTR_EFFECT
+ const ITEMATTR_PARAM
+ const ITEMATTR_PERMISSIONS
+ const ITEMATTR_POCKET
+ const ITEMATTR_HELP
+ITEMATTR_STRUCT_LENGTH EQU const_value
+
+; item types
+ const_def 1
+ const ITEM ; 1
+ const KEY_ITEM ; 2
+ const BALL ; 3
+ const TM_HM ; 4
+
+; item menu types
+; UseItem.dw indexes (see engine/items/pack.asm)
+; UseRegisteredItem.SwitchTo indexes (see engine/overworld/select_menu.asm)
+ITEMMENU_NOUSE EQU 0
+ITEMMENU_CURRENT EQU 4
+ITEMMENU_PARTY EQU 5
+ITEMMENU_CLOSE EQU 6
+
+; item actions
+CANT_SELECT_F EQU 6
+CANT_TOSS_F EQU 7
+
+NO_LIMITS EQU 0
+CANT_SELECT EQU 1 << CANT_SELECT_F
+CANT_TOSS EQU 1 << CANT_TOSS_F
+
+; pack pockets
+ const_def
+ const ITEM_POCKET ; 0
+ const BALL_POCKET ; 1
+ const KEY_ITEM_POCKET ; 2
+ const TM_HM_POCKET ; 3
+NUM_POCKETS EQU const_value
+
+MAX_ITEMS EQU 20
+MAX_KEY_ITEMS EQU 20
+MAX_PC_ITEMS EQU 50
+
+; held item effects
+ const_def
+ const HELD_NONE
+ const HELD_BERRY
+ const HELD_2
+ const HELD_LEFTOVERS
+ const HELD_4
+ const HELD_5
+ const HELD_RESTORE_PP
+ const HELD_RESTORE_ALL_PP
+ const HELD_CLEANSE_TAG
+
+ const_def 10
+ const HELD_HEAL_POISON
+ const HELD_HEAL_FREEZE
+ const HELD_HEAL_BURN
+ const HELD_HEAL_SLEEP
+ const HELD_HEAL_PARALYZE
+ const HELD_HEAL_STATUS
+ const HELD_HEAL_CONFUSION
+
+ const_def 20
+ const HELD_PREVENT_POISON
+ const HELD_PREVENT_BURN
+ const HELD_PREVENT_FREEZE
+ const HELD_PREVENT_SLEEP
+ const HELD_PREVENT_PARALYZE
+ const HELD_PREVENT_CONFUSE
+
+ const_def 30
+ const HELD_30
+ const HELD_ATTACK_UP
+ const HELD_DEFENSE_UP
+ const HELD_SPEED_UP
+ const HELD_SP_ATTACK_UP
+ const HELD_SP_DEFENSE_UP
+ const HELD_ACCURACY_UP
+ const HELD_EVASION_UP
+ const HELD_38
+
+ const_def 40
+ const HELD_40
+ const HELD_41
+ const HELD_METAL_POWDER
+ const HELD_43
+ const HELD_44
+ const HELD_45
+ const HELD_46
+ const HELD_47
+ const HELD_48
+
+ const_def 50
+ const HELD_NORMAL_BOOST
+ const HELD_FIGHTING_BOOST
+ const HELD_FLYING_BOOST
+ const HELD_POISON_BOOST
+ const HELD_GROUND_BOOST
+ const HELD_ROCK_BOOST
+ const HELD_BUG_BOOST
+ const HELD_GHOST_BOOST
+ const HELD_FIRE_BOOST
+ const HELD_WATER_BOOST
+ const HELD_GRASS_BOOST
+ const HELD_ELECTRIC_BOOST
+ const HELD_PSYCHIC_BOOST
+ const HELD_ICE_BOOST
+ const HELD_DRAGON_BOOST
+ const HELD_DARK_BOOST
+ const HELD_STEEL_BOOST
+
+ const_def 70
+ const HELD_CATCH_CHANCE
+ const HELD_71
+ const HELD_ESCAPE
+ const HELD_CRITICAL_UP
+ const HELD_QUICK_CLAW
+ const HELD_FLINCH
+ const HELD_AMULET_COIN
+ const HELD_BRIGHTPOWDER
+ const HELD_78
+ const HELD_FOCUS_BAND
+
+
diff --git a/constants/movement_constants.asm b/constants/movement_constants.asm
index f0c1a88..6347318 100755..100644
--- a/constants/movement_constants.asm
+++ b/constants/movement_constants.asm
@@ -1,44 +1,44 @@
- const_def
- const FACE_DOWN ; $00
- const FACE_UP ; $01
- const FACE_LEFT ; $02
- const FACE_RIGHT ; $03
- const SLOW_STEP_DOWN ; $04
- const SLOW_STEP_UP ; $05
- const SLOW_STEP_LEFT ; $06
- const SLOW_STEP_RIGHT ; $07
- const STEP_DOWN ; $08
- const STEP_UP ; $09
- const STEP_LEFT ; $0a
- const STEP_RIGHT ; $0b
- const FAST_STEP_DOWN ; $0c
- const FAST_STEP_UP ; $0d
- const FAST_STEP_LEFT ; $0e
- const FAST_STEP_RIGHT ; $0f
- const FAST_STEP_DOWN2 ; $10
- const FAST_STEP_UP2 ; $11
- const FAST_STEP_LEFT2 ; $12
- const FAST_STEP_RIGHT2 ; $13
- const SLOW_JUMP_DOWN ; $14
- const SLOW_JUMP_UP ; $15
- const SLOW_JUMP_LEFT ; $16
- const SLOW_JUMP_RIGHT ; $17
- const JUMP_DOWN ; $18
- const JUMP_UP ; $19
- const JUMP_LEFT ; $1a
- const JUMP_RIGHT ; $1b
- const FAST_JUMP_DOWN ; $1c
- const FAST_JUMP_UP ; $1d
- const FAST_JUMP_LEFT ; $1e
- const FAST_JUMP_RIGHT ; $1f
- const FAST_JUMP_DOWN2 ; $20
- const FAST_JUMP_UP2 ; $21
- const FAST_JUMP_LEFT2 ; $22
- const FAST_JUMP_RIGHT2 ; $23
- const MOVEMENT_24 ; $24
- const MOVEMENT_25 ; $25
- const MOVEMENT_26 ; $26
- const MOVEMENT_27 ; $27
- const MOVEMENT_28 ; $28
- const MOVEMENT_29 ; $29
- const NO_MOVEMENT ; $2a
+ const_def
+ const FACE_DOWN ; $00
+ const FACE_UP ; $01
+ const FACE_LEFT ; $02
+ const FACE_RIGHT ; $03
+ const SLOW_STEP_DOWN ; $04
+ const SLOW_STEP_UP ; $05
+ const SLOW_STEP_LEFT ; $06
+ const SLOW_STEP_RIGHT ; $07
+ const STEP_DOWN ; $08
+ const STEP_UP ; $09
+ const STEP_LEFT ; $0a
+ const STEP_RIGHT ; $0b
+ const FAST_STEP_DOWN ; $0c
+ const FAST_STEP_UP ; $0d
+ const FAST_STEP_LEFT ; $0e
+ const FAST_STEP_RIGHT ; $0f
+ const FAST_STEP_DOWN2 ; $10
+ const FAST_STEP_UP2 ; $11
+ const FAST_STEP_LEFT2 ; $12
+ const FAST_STEP_RIGHT2 ; $13
+ const SLOW_JUMP_DOWN ; $14
+ const SLOW_JUMP_UP ; $15
+ const SLOW_JUMP_LEFT ; $16
+ const SLOW_JUMP_RIGHT ; $17
+ const JUMP_DOWN ; $18
+ const JUMP_UP ; $19
+ const JUMP_LEFT ; $1a
+ const JUMP_RIGHT ; $1b
+ const FAST_JUMP_DOWN ; $1c
+ const FAST_JUMP_UP ; $1d
+ const FAST_JUMP_LEFT ; $1e
+ const FAST_JUMP_RIGHT ; $1f
+ const FAST_JUMP_DOWN2 ; $20
+ const FAST_JUMP_UP2 ; $21
+ const FAST_JUMP_LEFT2 ; $22
+ const FAST_JUMP_RIGHT2 ; $23
+ const MOVEMENT_24 ; $24
+ const MOVEMENT_25 ; $25
+ const MOVEMENT_26 ; $26
+ const MOVEMENT_27 ; $27
+ const MOVEMENT_28 ; $28
+ const MOVEMENT_29 ; $29
+ const NO_MOVEMENT ; $2a
diff --git a/constants/name_constants.asm b/constants/name_constants.asm
index 7e35ebb..1db3e75 100755
--- a/constants/name_constants.asm
+++ b/constants/name_constants.asm
@@ -1,2 +1,2 @@
-; Name Lists
+; Name Lists
ITEM_NAME EQU 4 \ No newline at end of file
diff --git a/constants/script_constants.asm b/constants/script_constants.asm
index 15a08c0..5dc3e8d 100755
--- a/constants/script_constants.asm
+++ b/constants/script_constants.asm
@@ -1,18 +1,18 @@
-
-; Script IDs
- const_def
- const SCRIPT_ID_00 ; 00
- const SCRIPT_ID_01 ; 01
- const SCRIPT_ID_02 ; 02
- const SCRIPT_ID_03 ; 03
- const SCRIPT_ID_04 ; 04
- const SCRIPT_ID_05 ; 05
-
-; Flags
-SCRIPT_FINISHED_F EQU 7
-
-; Masks/Return Values
-SCRIPT_FINISHED_MASK EQU 1 << SCRIPT_FINISHED_F
-SCRIPT_SUCCESS EQU $f
-SCRIPT_FAIL EQU 0
-
+
+; Script IDs
+ const_def
+ const SCRIPT_ID_00 ; 00
+ const SCRIPT_ID_01 ; 01
+ const SCRIPT_ID_02 ; 02
+ const SCRIPT_ID_03 ; 03
+ const SCRIPT_ID_04 ; 04
+ const SCRIPT_ID_05 ; 05
+
+; Flags
+SCRIPT_FINISHED_F EQU 7
+
+; Masks/Return Values
+SCRIPT_FINISHED_MASK EQU 1 << SCRIPT_FINISHED_F
+SCRIPT_SUCCESS EQU $f
+SCRIPT_FAIL EQU 0
+
diff --git a/data/collision/collision_type_table.asm b/data/collision/collision_type_table.asm
index 6919535..df3dc33 100755..100644
--- a/data/collision/collision_type_table.asm
+++ b/data/collision/collision_type_table.asm
@@ -1,69 +1,69 @@
-INCLUDE "constants.asm"
-
-SECTION "Collision Type Table", ROMX[$4664], BANK[$03]
-
-CollisionTypeTable: ; 03:4664
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $00
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, ALWAYS_SOLID ; $04
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $08
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, ALWAYS_SOLID ; $0C
- db NEVER_SOLID, NEVER_SOLID, SOMETIMES_SOLID, NEVER_SOLID ; $10
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $14
- db NEVER_SOLID, NEVER_SOLID, SOMETIMES_SOLID, NEVER_SOLID ; $18
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $1C
- db SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID ; $20
- db SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID, ALWAYS_SOLID ; $24
- db SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID ; $28
- db SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID, ALWAYS_SOLID ; $30
- db SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID ; $34
- db SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID ; $38
- db SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID ; $3C
- db SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID ; $40
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $44
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $48
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $4C
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $50
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $54
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $58
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $5C
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $60
- db NEVER_SOLID, NEVER_SOLID, ALWAYS_SOLID, NEVER_SOLID ; $64
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $68
- db NEVER_SOLID, NEVER_SOLID, ALWAYS_SOLID, NEVER_SOLID ; $6C
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $70
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $74
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $78
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $7C
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $80
- db ALWAYS_SOLID, ALWAYS_SOLID, ALWAYS_SOLID, ALWAYS_SOLID ; $84
- db ALWAYS_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $88
- db ALWAYS_SOLID, ALWAYS_SOLID, ALWAYS_SOLID, ALWAYS_SOLID ; $8C
- db ALWAYS_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $90
- db ALWAYS_SOLID, ALWAYS_SOLID, ALWAYS_SOLID, ALWAYS_SOLID ; $94
- db ALWAYS_SOLID, ALWAYS_SOLID, NEVER_SOLID, ALWAYS_SOLID ; $98
- db ALWAYS_SOLID, ALWAYS_SOLID, ALWAYS_SOLID, ALWAYS_SOLID ; $9C
- db ALWAYS_SOLID, ALWAYS_SOLID, NEVER_SOLID, ALWAYS_SOLID ; $A0
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $A4
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $A8
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $AC
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $B0
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $B4
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $B8
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $BC
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $C0
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $C4
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $C8
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $CC
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $D0
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $D4
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $D8
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $DC
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $E0
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $E4
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $E8
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $EC
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $F0
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $F4
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $F8
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $FC
- db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, ALWAYS_SOLID ; $100
+INCLUDE "constants.asm"
+
+SECTION "Collision Type Table", ROMX[$4664], BANK[$03]
+
+CollisionTypeTable: ; 03:4664
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $00
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, ALWAYS_SOLID ; $04
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $08
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, ALWAYS_SOLID ; $0C
+ db NEVER_SOLID, NEVER_SOLID, SOMETIMES_SOLID, NEVER_SOLID ; $10
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $14
+ db NEVER_SOLID, NEVER_SOLID, SOMETIMES_SOLID, NEVER_SOLID ; $18
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $1C
+ db SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID ; $20
+ db SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID, ALWAYS_SOLID ; $24
+ db SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID ; $28
+ db SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID, ALWAYS_SOLID ; $30
+ db SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID ; $34
+ db SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID ; $38
+ db SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID ; $3C
+ db SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID ; $40
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $44
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $48
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $4C
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $50
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $54
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $58
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $5C
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $60
+ db NEVER_SOLID, NEVER_SOLID, ALWAYS_SOLID, NEVER_SOLID ; $64
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $68
+ db NEVER_SOLID, NEVER_SOLID, ALWAYS_SOLID, NEVER_SOLID ; $6C
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $70
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $74
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $78
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $7C
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $80
+ db ALWAYS_SOLID, ALWAYS_SOLID, ALWAYS_SOLID, ALWAYS_SOLID ; $84
+ db ALWAYS_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $88
+ db ALWAYS_SOLID, ALWAYS_SOLID, ALWAYS_SOLID, ALWAYS_SOLID ; $8C
+ db ALWAYS_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $90
+ db ALWAYS_SOLID, ALWAYS_SOLID, ALWAYS_SOLID, ALWAYS_SOLID ; $94
+ db ALWAYS_SOLID, ALWAYS_SOLID, NEVER_SOLID, ALWAYS_SOLID ; $98
+ db ALWAYS_SOLID, ALWAYS_SOLID, ALWAYS_SOLID, ALWAYS_SOLID ; $9C
+ db ALWAYS_SOLID, ALWAYS_SOLID, NEVER_SOLID, ALWAYS_SOLID ; $A0
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $A4
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $A8
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $AC
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $B0
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $B4
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $B8
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $BC
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $C0
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $C4
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $C8
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $CC
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $D0
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $D4
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $D8
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $DC
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $E0
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $E4
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $E8
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $EC
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $F0
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $F4
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $F8
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $FC
+ db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, ALWAYS_SOLID ; $100
diff --git a/data/types/type_matchups.asm b/data/types/type_matchups.asm
index 2c1f22c..8923a80 100644
--- a/data/types/type_matchups.asm
+++ b/data/types/type_matchups.asm
@@ -1,113 +1,113 @@
-INCLUDE "constants.asm"
-
-SECTION "Type Matchups", ROMX[$506D], BANK[$0D]
-
-TypeMatchups: ; 3506d
- ; attacker, defender, *=
- db TYPE_NORMAL, TYPE_ROCK, NOT_VERY_EFFECTIVE
- db TYPE_NORMAL, TYPE_DARK, SUPER_EFFECTIVE
- db TYPE_FIRE, TYPE_FIRE, NOT_VERY_EFFECTIVE
- db TYPE_FIRE, TYPE_WATER, NOT_VERY_EFFECTIVE
- db TYPE_FIRE, TYPE_GRASS, SUPER_EFFECTIVE
- db TYPE_FIRE, TYPE_ICE, SUPER_EFFECTIVE
- db TYPE_FIRE, TYPE_BUG, SUPER_EFFECTIVE
- db TYPE_FIRE, TYPE_ROCK, NOT_VERY_EFFECTIVE
- db TYPE_FIRE, TYPE_DRAGON, NOT_VERY_EFFECTIVE
- db TYPE_WATER, TYPE_FIRE, SUPER_EFFECTIVE
- db TYPE_WATER, TYPE_WATER, NOT_VERY_EFFECTIVE
- db TYPE_WATER, TYPE_ELECTRIC, NOT_VERY_EFFECTIVE
- db TYPE_WATER, TYPE_GRASS, NOT_VERY_EFFECTIVE
- db TYPE_WATER, TYPE_GROUND, SUPER_EFFECTIVE
- db TYPE_WATER, TYPE_ROCK, SUPER_EFFECTIVE
- db TYPE_WATER, TYPE_DRAGON, NOT_VERY_EFFECTIVE
- db TYPE_WATER, TYPE_METAL, SUPER_EFFECTIVE
- db TYPE_ELECTRIC, TYPE_WATER, SUPER_EFFECTIVE
- db TYPE_ELECTRIC, TYPE_ELECTRIC, NOT_VERY_EFFECTIVE
- db TYPE_ELECTRIC, TYPE_GRASS, NOT_VERY_EFFECTIVE
- db TYPE_ELECTRIC, TYPE_GROUND, NO_EFFECT
- db TYPE_ELECTRIC, TYPE_FLYING, SUPER_EFFECTIVE
- db TYPE_ELECTRIC, TYPE_DRAGON, NOT_VERY_EFFECTIVE
- db TYPE_ELECTRIC, TYPE_METAL, SUPER_EFFECTIVE
- db TYPE_GRASS, TYPE_FIRE, NOT_VERY_EFFECTIVE
- db TYPE_GRASS, TYPE_WATER, SUPER_EFFECTIVE
- db TYPE_GRASS, TYPE_GRASS, NOT_VERY_EFFECTIVE
- db TYPE_GRASS, TYPE_POISON, NOT_VERY_EFFECTIVE
- db TYPE_GRASS, TYPE_GROUND, SUPER_EFFECTIVE
- db TYPE_GRASS, TYPE_FLYING, NOT_VERY_EFFECTIVE
- db TYPE_GRASS, TYPE_BUG, NOT_VERY_EFFECTIVE
- db TYPE_GRASS, TYPE_ROCK, SUPER_EFFECTIVE
- db TYPE_GRASS, TYPE_DRAGON, NOT_VERY_EFFECTIVE
- db TYPE_ICE, TYPE_FIRE, NOT_VERY_EFFECTIVE
- db TYPE_ICE, TYPE_WATER, NOT_VERY_EFFECTIVE
- db TYPE_ICE, TYPE_GRASS, SUPER_EFFECTIVE
- db TYPE_ICE, TYPE_ICE, NOT_VERY_EFFECTIVE
- db TYPE_ICE, TYPE_GROUND, SUPER_EFFECTIVE
- db TYPE_ICE, TYPE_FLYING, SUPER_EFFECTIVE
- db TYPE_ICE, TYPE_DRAGON, SUPER_EFFECTIVE
- db TYPE_FIGHTING, TYPE_NORMAL, SUPER_EFFECTIVE
- db TYPE_FIGHTING, TYPE_ICE, SUPER_EFFECTIVE
- db TYPE_FIGHTING, TYPE_POISON, NOT_VERY_EFFECTIVE
- db TYPE_FIGHTING, TYPE_FLYING, NOT_VERY_EFFECTIVE
- db TYPE_FIGHTING, TYPE_PSYCHIC, NOT_VERY_EFFECTIVE
- db TYPE_FIGHTING, TYPE_BUG, NOT_VERY_EFFECTIVE
- db TYPE_FIGHTING, TYPE_ROCK, SUPER_EFFECTIVE
- db TYPE_FIGHTING, TYPE_GHOST, NO_EFFECT
- db TYPE_FIGHTING, TYPE_METAL, NOT_VERY_EFFECTIVE
- db TYPE_POISON, TYPE_GRASS, SUPER_EFFECTIVE
- db TYPE_POISON, TYPE_POISON, NOT_VERY_EFFECTIVE
- db TYPE_POISON, TYPE_GROUND, NOT_VERY_EFFECTIVE
- db TYPE_POISON, TYPE_BUG, SUPER_EFFECTIVE
- db TYPE_POISON, TYPE_ROCK, NOT_VERY_EFFECTIVE
- db TYPE_POISON, TYPE_GHOST, NOT_VERY_EFFECTIVE
- db TYPE_POISON, TYPE_METAL, NOT_VERY_EFFECTIVE
- db TYPE_GROUND, TYPE_FIRE, SUPER_EFFECTIVE
- db TYPE_GROUND, TYPE_ELECTRIC, SUPER_EFFECTIVE
- db TYPE_GROUND, TYPE_GRASS, NOT_VERY_EFFECTIVE
- db TYPE_GROUND, TYPE_POISON, SUPER_EFFECTIVE
- db TYPE_GROUND, TYPE_FLYING, NO_EFFECT
- db TYPE_GROUND, TYPE_BUG, NOT_VERY_EFFECTIVE
- db TYPE_GROUND, TYPE_ROCK, SUPER_EFFECTIVE
- db TYPE_FLYING, TYPE_ELECTRIC, NOT_VERY_EFFECTIVE
- db TYPE_FLYING, TYPE_GRASS, SUPER_EFFECTIVE
- db TYPE_FLYING, TYPE_FIGHTING, SUPER_EFFECTIVE
- db TYPE_FLYING, TYPE_BUG, SUPER_EFFECTIVE
- db TYPE_FLYING, TYPE_ROCK, NOT_VERY_EFFECTIVE
- db TYPE_PSYCHIC, TYPE_FIGHTING, SUPER_EFFECTIVE
- db TYPE_PSYCHIC, TYPE_POISON, SUPER_EFFECTIVE
- db TYPE_PSYCHIC, TYPE_PSYCHIC, NOT_VERY_EFFECTIVE
- db TYPE_PSYCHIC, TYPE_DARK, NOT_VERY_EFFECTIVE
- db TYPE_BUG, TYPE_FIRE, NOT_VERY_EFFECTIVE
- db TYPE_BUG, TYPE_GRASS, SUPER_EFFECTIVE
- db TYPE_BUG, TYPE_FIGHTING, NOT_VERY_EFFECTIVE
- db TYPE_BUG, TYPE_POISON, SUPER_EFFECTIVE
- db TYPE_BUG, TYPE_FLYING, NOT_VERY_EFFECTIVE
- db TYPE_BUG, TYPE_PSYCHIC, SUPER_EFFECTIVE
- db TYPE_BUG, TYPE_GHOST, NOT_VERY_EFFECTIVE
- db TYPE_BUG, TYPE_DARK, SUPER_EFFECTIVE
- db TYPE_ROCK, TYPE_FIRE, SUPER_EFFECTIVE
- db TYPE_ROCK, TYPE_ICE, SUPER_EFFECTIVE
- db TYPE_ROCK, TYPE_FIGHTING, NOT_VERY_EFFECTIVE
- db TYPE_ROCK, TYPE_GROUND, NOT_VERY_EFFECTIVE
- db TYPE_ROCK, TYPE_FLYING, SUPER_EFFECTIVE
- db TYPE_ROCK, TYPE_BUG, SUPER_EFFECTIVE
- db TYPE_ROCK, TYPE_METAL, NOT_VERY_EFFECTIVE
- db TYPE_GHOST, TYPE_NORMAL, NO_EFFECT
- db TYPE_GHOST, TYPE_PSYCHIC, SUPER_EFFECTIVE
- db TYPE_GHOST, TYPE_DARK, NOT_VERY_EFFECTIVE
- db TYPE_DRAGON, TYPE_DRAGON, SUPER_EFFECTIVE
- db TYPE_DARK, TYPE_NORMAL, NOT_VERY_EFFECTIVE
- db TYPE_DARK, TYPE_PSYCHIC, SUPER_EFFECTIVE
- db TYPE_DARK, TYPE_GHOST, SUPER_EFFECTIVE
- db TYPE_DARK, TYPE_DARK, SUPER_EFFECTIVE
- db TYPE_METAL, TYPE_WATER, NOT_VERY_EFFECTIVE
- db TYPE_METAL, TYPE_ELECTRIC, NOT_VERY_EFFECTIVE
- db TYPE_METAL, TYPE_ROCK, SUPER_EFFECTIVE
- db TYPE_METAL, TYPE_METAL, NO_EFFECT
-
- db -2 ; end (with Foresight)
-
-; Foresight removes Ghost's immunity to Normal
- db TYPE_NORMAL, TYPE_GHOST, NO_EFFECT
-
- db -1 ; end
-; 3519b
+INCLUDE "constants.asm"
+
+SECTION "Type Matchups", ROMX[$506D], BANK[$0D]
+
+TypeMatchups: ; 3506d
+ ; attacker, defender, *=
+ db TYPE_NORMAL, TYPE_ROCK, NOT_VERY_EFFECTIVE
+ db TYPE_NORMAL, TYPE_DARK, SUPER_EFFECTIVE
+ db TYPE_FIRE, TYPE_FIRE, NOT_VERY_EFFECTIVE
+ db TYPE_FIRE, TYPE_WATER, NOT_VERY_EFFECTIVE
+ db TYPE_FIRE, TYPE_GRASS, SUPER_EFFECTIVE
+ db TYPE_FIRE, TYPE_ICE, SUPER_EFFECTIVE
+ db TYPE_FIRE, TYPE_BUG, SUPER_EFFECTIVE
+ db TYPE_FIRE, TYPE_ROCK, NOT_VERY_EFFECTIVE
+ db TYPE_FIRE, TYPE_DRAGON, NOT_VERY_EFFECTIVE
+ db TYPE_WATER, TYPE_FIRE, SUPER_EFFECTIVE
+ db TYPE_WATER, TYPE_WATER, NOT_VERY_EFFECTIVE
+ db TYPE_WATER, TYPE_ELECTRIC, NOT_VERY_EFFECTIVE
+ db TYPE_WATER, TYPE_GRASS, NOT_VERY_EFFECTIVE
+ db TYPE_WATER, TYPE_GROUND, SUPER_EFFECTIVE
+ db TYPE_WATER, TYPE_ROCK, SUPER_EFFECTIVE
+ db TYPE_WATER, TYPE_DRAGON, NOT_VERY_EFFECTIVE
+ db TYPE_WATER, TYPE_METAL, SUPER_EFFECTIVE
+ db TYPE_ELECTRIC, TYPE_WATER, SUPER_EFFECTIVE
+ db TYPE_ELECTRIC, TYPE_ELECTRIC, NOT_VERY_EFFECTIVE
+ db TYPE_ELECTRIC, TYPE_GRASS, NOT_VERY_EFFECTIVE
+ db TYPE_ELECTRIC, TYPE_GROUND, NO_EFFECT
+ db TYPE_ELECTRIC, TYPE_FLYING, SUPER_EFFECTIVE
+ db TYPE_ELECTRIC, TYPE_DRAGON, NOT_VERY_EFFECTIVE
+ db TYPE_ELECTRIC, TYPE_METAL, SUPER_EFFECTIVE
+ db TYPE_GRASS, TYPE_FIRE, NOT_VERY_EFFECTIVE
+ db TYPE_GRASS, TYPE_WATER, SUPER_EFFECTIVE
+ db TYPE_GRASS, TYPE_GRASS, NOT_VERY_EFFECTIVE
+ db TYPE_GRASS, TYPE_POISON, NOT_VERY_EFFECTIVE
+ db TYPE_GRASS, TYPE_GROUND, SUPER_EFFECTIVE
+ db TYPE_GRASS, TYPE_FLYING, NOT_VERY_EFFECTIVE
+ db TYPE_GRASS, TYPE_BUG, NOT_VERY_EFFECTIVE
+ db TYPE_GRASS, TYPE_ROCK, SUPER_EFFECTIVE
+ db TYPE_GRASS, TYPE_DRAGON, NOT_VERY_EFFECTIVE
+ db TYPE_ICE, TYPE_FIRE, NOT_VERY_EFFECTIVE
+ db TYPE_ICE, TYPE_WATER, NOT_VERY_EFFECTIVE
+ db TYPE_ICE, TYPE_GRASS, SUPER_EFFECTIVE
+ db TYPE_ICE, TYPE_ICE, NOT_VERY_EFFECTIVE
+ db TYPE_ICE, TYPE_GROUND, SUPER_EFFECTIVE
+ db TYPE_ICE, TYPE_FLYING, SUPER_EFFECTIVE
+ db TYPE_ICE, TYPE_DRAGON, SUPER_EFFECTIVE
+ db TYPE_FIGHTING, TYPE_NORMAL, SUPER_EFFECTIVE
+ db TYPE_FIGHTING, TYPE_ICE, SUPER_EFFECTIVE
+ db TYPE_FIGHTING, TYPE_POISON, NOT_VERY_EFFECTIVE
+ db TYPE_FIGHTING, TYPE_FLYING, NOT_VERY_EFFECTIVE
+ db TYPE_FIGHTING, TYPE_PSYCHIC, NOT_VERY_EFFECTIVE
+ db TYPE_FIGHTING, TYPE_BUG, NOT_VERY_EFFECTIVE
+ db TYPE_FIGHTING, TYPE_ROCK, SUPER_EFFECTIVE
+ db TYPE_FIGHTING, TYPE_GHOST, NO_EFFECT
+ db TYPE_FIGHTING, TYPE_METAL, NOT_VERY_EFFECTIVE
+ db TYPE_POISON, TYPE_GRASS, SUPER_EFFECTIVE
+ db TYPE_POISON, TYPE_POISON, NOT_VERY_EFFECTIVE
+ db TYPE_POISON, TYPE_GROUND, NOT_VERY_EFFECTIVE
+ db TYPE_POISON, TYPE_BUG, SUPER_EFFECTIVE
+ db TYPE_POISON, TYPE_ROCK, NOT_VERY_EFFECTIVE
+ db TYPE_POISON, TYPE_GHOST, NOT_VERY_EFFECTIVE
+ db TYPE_POISON, TYPE_METAL, NOT_VERY_EFFECTIVE
+ db TYPE_GROUND, TYPE_FIRE, SUPER_EFFECTIVE
+ db TYPE_GROUND, TYPE_ELECTRIC, SUPER_EFFECTIVE
+ db TYPE_GROUND, TYPE_GRASS, NOT_VERY_EFFECTIVE
+ db TYPE_GROUND, TYPE_POISON, SUPER_EFFECTIVE
+ db TYPE_GROUND, TYPE_FLYING, NO_EFFECT
+ db TYPE_GROUND, TYPE_BUG, NOT_VERY_EFFECTIVE
+ db TYPE_GROUND, TYPE_ROCK, SUPER_EFFECTIVE
+ db TYPE_FLYING, TYPE_ELECTRIC, NOT_VERY_EFFECTIVE
+ db TYPE_FLYING, TYPE_GRASS, SUPER_EFFECTIVE
+ db TYPE_FLYING, TYPE_FIGHTING, SUPER_EFFECTIVE
+ db TYPE_FLYING, TYPE_BUG, SUPER_EFFECTIVE
+ db TYPE_FLYING, TYPE_ROCK, NOT_VERY_EFFECTIVE
+ db TYPE_PSYCHIC, TYPE_FIGHTING, SUPER_EFFECTIVE
+ db TYPE_PSYCHIC, TYPE_POISON, SUPER_EFFECTIVE
+ db TYPE_PSYCHIC, TYPE_PSYCHIC, NOT_VERY_EFFECTIVE
+ db TYPE_PSYCHIC, TYPE_DARK, NOT_VERY_EFFECTIVE
+ db TYPE_BUG, TYPE_FIRE, NOT_VERY_EFFECTIVE
+ db TYPE_BUG, TYPE_GRASS, SUPER_EFFECTIVE
+ db TYPE_BUG, TYPE_FIGHTING, NOT_VERY_EFFECTIVE
+ db TYPE_BUG, TYPE_POISON, SUPER_EFFECTIVE
+ db TYPE_BUG, TYPE_FLYING, NOT_VERY_EFFECTIVE
+ db TYPE_BUG, TYPE_PSYCHIC, SUPER_EFFECTIVE
+ db TYPE_BUG, TYPE_GHOST, NOT_VERY_EFFECTIVE
+ db TYPE_BUG, TYPE_DARK, SUPER_EFFECTIVE
+ db TYPE_ROCK, TYPE_FIRE, SUPER_EFFECTIVE
+ db TYPE_ROCK, TYPE_ICE, SUPER_EFFECTIVE
+ db TYPE_ROCK, TYPE_FIGHTING, NOT_VERY_EFFECTIVE
+ db TYPE_ROCK, TYPE_GROUND, NOT_VERY_EFFECTIVE
+ db TYPE_ROCK, TYPE_FLYING, SUPER_EFFECTIVE
+ db TYPE_ROCK, TYPE_BUG, SUPER_EFFECTIVE
+ db TYPE_ROCK, TYPE_METAL, NOT_VERY_EFFECTIVE
+ db TYPE_GHOST, TYPE_NORMAL, NO_EFFECT
+ db TYPE_GHOST, TYPE_PSYCHIC, SUPER_EFFECTIVE
+ db TYPE_GHOST, TYPE_DARK, NOT_VERY_EFFECTIVE
+ db TYPE_DRAGON, TYPE_DRAGON, SUPER_EFFECTIVE
+ db TYPE_DARK, TYPE_NORMAL, NOT_VERY_EFFECTIVE
+ db TYPE_DARK, TYPE_PSYCHIC, SUPER_EFFECTIVE
+ db TYPE_DARK, TYPE_GHOST, SUPER_EFFECTIVE
+ db TYPE_DARK, TYPE_DARK, SUPER_EFFECTIVE
+ db TYPE_METAL, TYPE_WATER, NOT_VERY_EFFECTIVE
+ db TYPE_METAL, TYPE_ELECTRIC, NOT_VERY_EFFECTIVE
+ db TYPE_METAL, TYPE_ROCK, SUPER_EFFECTIVE
+ db TYPE_METAL, TYPE_METAL, NO_EFFECT
+
+ db -2 ; end (with Foresight)
+
+; Foresight removes Ghost's immunity to Normal
+ db TYPE_NORMAL, TYPE_GHOST, NO_EFFECT
+
+ db -1 ; end
+; 3519b
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..741d601 100755
--- a/engine/events/field_moves.asm
+++ b/engine/events/field_moves.asm
@@ -1,541 +1,542 @@
-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
+
+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
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
diff --git a/gfx/pokemon/annon_pic_ptrs.asm b/gfx/pokemon/annon_pic_ptrs.asm
index 45e5873..b128aee 100644
--- a/gfx/pokemon/annon_pic_ptrs.asm
+++ b/gfx/pokemon/annon_pic_ptrs.asm
@@ -1,55 +1,55 @@
-AnnonPicPtrs::
-AnnonPicPtrsFront::
- dw AnnonAPicFront
-AnnonPicPtrsBack::
- dw AnnonAPicBack
- dw AnnonBPicFront
- dw AnnonBPicBack
- dw AnnonCPicFront
- dw AnnonCPicBack
- dw AnnonDPicFront
- dw AnnonDPicBack
- dw AnnonEPicFront
- dw AnnonEPicBack
- dw AnnonFPicFront
- dw AnnonFPicBack
- dw AnnonGPicFront
- dw AnnonGPicBack
- dw AnnonHPicFront
- dw AnnonHPicBack
- dw AnnonIPicFront
- dw AnnonIPicBack
- dw AnnonJPicFront
- dw AnnonJPicBack
- dw AnnonKPicFront
- dw AnnonKPicBack
- dw AnnonLPicFront
- dw AnnonLPicBack
- dw AnnonMPicFront
- dw AnnonMPicBack
- dw AnnonNPicFront
- dw AnnonNPicBack
- dw AnnonOPicFront
- dw AnnonOPicBack
- dw AnnonPPicFront
- dw AnnonPPicBack
- dw AnnonQPicFront
- dw AnnonQPicBack
- dw AnnonRPicFront
- dw AnnonRPicBack
- dw AnnonSPicFront
- dw AnnonSPicBack
- dw AnnonTPicFront
- dw AnnonTPicBack
- dw AnnonUPicFront
- dw AnnonUPicBack
- dw AnnonVPicFront
- dw AnnonVPicBack
- dw AnnonWPicFront
- dw AnnonWPicBack
- dw AnnonXPicFront
- dw AnnonXPicBack
- dw AnnonYPicFront
- dw AnnonYPicBack
- dw AnnonZPicFront
- dw AnnonYPicBack ; typo in original list
+AnnonPicPtrs::
+AnnonPicPtrsFront::
+ dw AnnonAPicFront
+AnnonPicPtrsBack::
+ dw AnnonAPicBack
+ dw AnnonBPicFront
+ dw AnnonBPicBack
+ dw AnnonCPicFront
+ dw AnnonCPicBack
+ dw AnnonDPicFront
+ dw AnnonDPicBack
+ dw AnnonEPicFront
+ dw AnnonEPicBack
+ dw AnnonFPicFront
+ dw AnnonFPicBack
+ dw AnnonGPicFront
+ dw AnnonGPicBack
+ dw AnnonHPicFront
+ dw AnnonHPicBack
+ dw AnnonIPicFront
+ dw AnnonIPicBack
+ dw AnnonJPicFront
+ dw AnnonJPicBack
+ dw AnnonKPicFront
+ dw AnnonKPicBack
+ dw AnnonLPicFront
+ dw AnnonLPicBack
+ dw AnnonMPicFront
+ dw AnnonMPicBack
+ dw AnnonNPicFront
+ dw AnnonNPicBack
+ dw AnnonOPicFront
+ dw AnnonOPicBack
+ dw AnnonPPicFront
+ dw AnnonPPicBack
+ dw AnnonQPicFront
+ dw AnnonQPicBack
+ dw AnnonRPicFront
+ dw AnnonRPicBack
+ dw AnnonSPicFront
+ dw AnnonSPicBack
+ dw AnnonTPicFront
+ dw AnnonTPicBack
+ dw AnnonUPicFront
+ dw AnnonUPicBack
+ dw AnnonVPicFront
+ dw AnnonVPicBack
+ dw AnnonWPicFront
+ dw AnnonWPicBack
+ dw AnnonXPicFront
+ dw AnnonXPicBack
+ dw AnnonYPicFront
+ dw AnnonYPicBack
+ dw AnnonZPicFront
+ dw AnnonYPicBack ; typo in original list
diff --git a/gfx/pokemon/annon_pics.asm b/gfx/pokemon/annon_pics.asm
index 4999071..1a342e7 100644
--- a/gfx/pokemon/annon_pics.asm
+++ b/gfx/pokemon/annon_pics.asm
@@ -1,53 +1,53 @@
-AnnonPics::
-AnnonAPicFront:: INCBIN "gfx/pokemon/annon_a/front.pic" ; 0x07cdd2--0x07ce57
-AnnonAPicBack:: INCBIN "gfx/pokemon/annon_a/back.pic" ; 0x07ce57--0x07ced0
-AnnonBPicFront:: INCBIN "gfx/pokemon/annon_b/front.pic" ; 0x07ced0--0x07cf64
-AnnonBPicBack:: INCBIN "gfx/pokemon/annon_b/back.pic" ; 0x07cf64--0x07cfed
-AnnonCPicFront:: INCBIN "gfx/pokemon/annon_c/front.pic" ; 0x07cfed--0x07d0a1
-AnnonCPicBack:: INCBIN "gfx/pokemon/annon_c/back.pic" ; 0x07d0a1--0x07d147
-AnnonDPicFront:: INCBIN "gfx/pokemon/annon_d/front.pic" ; 0x07d147--0x07d1ec
-AnnonDPicBack:: INCBIN "gfx/pokemon/annon_d/back.pic" ; 0x07d1ec--0x07d285
-AnnonEPicFront:: INCBIN "gfx/pokemon/annon_e/front.pic" ; 0x07d285--0x07d30e
-AnnonEPicBack:: INCBIN "gfx/pokemon/annon_e/back.pic" ; 0x07d30e--0x07d38b
-AnnonFPicFront:: INCBIN "gfx/pokemon/annon_f/front.pic" ; 0x07d38b--0x07d425
-AnnonFPicBack:: INCBIN "gfx/pokemon/annon_f/back.pic" ; 0x07d425--0x07d4ae
-AnnonGPicFront:: INCBIN "gfx/pokemon/annon_g/front.pic" ; 0x07d4ae--0x07d53f
-AnnonGPicBack:: INCBIN "gfx/pokemon/annon_g/back.pic" ; 0x07d53f--0x07d5c4
-AnnonHPicFront:: INCBIN "gfx/pokemon/annon_h/front.pic" ; 0x07d5c4--0x07d693
-AnnonHPicBack:: INCBIN "gfx/pokemon/annon_h/back.pic" ; 0x07d693--0x07d757
-AnnonIPicFront:: INCBIN "gfx/pokemon/annon_i/front.pic" ; 0x07d757--0x07d7c0
-AnnonIPicBack:: INCBIN "gfx/pokemon/annon_i/back.pic" ; 0x07d7c0--0x07d81f
-AnnonJPicFront:: INCBIN "gfx/pokemon/annon_j/front.pic" ; 0x07d81f--0x07d89b
-AnnonJPicBack:: INCBIN "gfx/pokemon/annon_j/back.pic" ; 0x07d89b--0x07d909
-AnnonKPicFront:: INCBIN "gfx/pokemon/annon_k/front.pic" ; 0x07d909--0x07d98d
-AnnonKPicBack:: INCBIN "gfx/pokemon/annon_k/back.pic" ; 0x07d98d--0x07da06
-AnnonLPicFront:: INCBIN "gfx/pokemon/annon_l/front.pic" ; 0x07da06--0x07da7a
-AnnonLPicBack:: INCBIN "gfx/pokemon/annon_l/back.pic" ; 0x07da7a--0x07dade
-AnnonMPicFront:: INCBIN "gfx/pokemon/annon_m/front.pic" ; 0x07dade--0x07dba1
-AnnonMPicBack:: INCBIN "gfx/pokemon/annon_m/back.pic" ; 0x07dba1--0x07dc57
-AnnonNPicFront:: INCBIN "gfx/pokemon/annon_n/front.pic" ; 0x07dc57--0x07dcf4
-AnnonNPicBack:: INCBIN "gfx/pokemon/annon_n/back.pic" ; 0x07dcf4--0x07dd8b
-AnnonOPicFront:: INCBIN "gfx/pokemon/annon_o/front.pic" ; 0x07dd8b--0x07de55
-AnnonOPicBack:: INCBIN "gfx/pokemon/annon_o/back.pic" ; 0x07de55--0x07df15
-AnnonPPicFront:: INCBIN "gfx/pokemon/annon_p/front.pic" ; 0x07df15--0x07df7d
-AnnonPPicBack:: INCBIN "gfx/pokemon/annon_p/back.pic" ; 0x07df7d--0x07dfd6
-AnnonQPicFront:: INCBIN "gfx/pokemon/annon_q/front.pic" ; 0x07dfd6--0x07e03d
-AnnonQPicBack:: INCBIN "gfx/pokemon/annon_q/back.pic" ; 0x07e03d--0x07e099
-AnnonRPicFront:: INCBIN "gfx/pokemon/annon_r/front.pic" ; 0x07e099--0x07e0ff
-AnnonRPicBack:: INCBIN "gfx/pokemon/annon_r/back.pic" ; 0x07e0ff--0x07e159
-AnnonSPicFront:: INCBIN "gfx/pokemon/annon_s/front.pic" ; 0x07e159--0x07e1f0
-AnnonSPicBack:: INCBIN "gfx/pokemon/annon_s/back.pic" ; 0x07e1f0--0x07e27a
-AnnonTPicFront:: INCBIN "gfx/pokemon/annon_t/front.pic" ; 0x07e27a--0x07e2e8
-AnnonTPicBack:: INCBIN "gfx/pokemon/annon_t/back.pic" ; 0x07e2e8--0x07e348
-AnnonUPicFront:: INCBIN "gfx/pokemon/annon_u/front.pic" ; 0x07e348--0x07e3e7
-AnnonUPicBack:: INCBIN "gfx/pokemon/annon_u/back.pic" ; 0x07e3e7--0x07e47a
-AnnonVPicFront:: INCBIN "gfx/pokemon/annon_v/front.pic" ; 0x07e47a--0x07e50a
-AnnonVPicBack:: INCBIN "gfx/pokemon/annon_v/back.pic" ; 0x07e50a--0x07e589
-AnnonWPicFront:: INCBIN "gfx/pokemon/annon_w/front.pic" ; 0x07e589--0x07e60d
-AnnonWPicBack:: INCBIN "gfx/pokemon/annon_w/back.pic" ; 0x07e60d--0x07e681
-AnnonXPicFront:: INCBIN "gfx/pokemon/annon_x/front.pic" ; 0x07e681--0x07e705
-AnnonXPicBack:: INCBIN "gfx/pokemon/annon_x/back.pic" ; 0x07e705--0x07e77b
-AnnonYPicFront:: INCBIN "gfx/pokemon/annon_y/front.pic" ; 0x07e77b--0x07e801
-AnnonYPicBack:: INCBIN "gfx/pokemon/annon_y/back.pic" ; 0x07e801--0x07e87c
-AnnonZPicFront:: INCBIN "gfx/pokemon/annon_z/front.pic" ; 0x07e87c--0x07e8fa
-AnnonZPicBack:: INCBIN "gfx/pokemon/annon_z/back.pic" ; 0x07e8fa--0x07e96a
+AnnonPics::
+AnnonAPicFront:: INCBIN "gfx/pokemon/annon_a/front.pic" ; 0x07cdd2--0x07ce57
+AnnonAPicBack:: INCBIN "gfx/pokemon/annon_a/back.pic" ; 0x07ce57--0x07ced0
+AnnonBPicFront:: INCBIN "gfx/pokemon/annon_b/front.pic" ; 0x07ced0--0x07cf64
+AnnonBPicBack:: INCBIN "gfx/pokemon/annon_b/back.pic" ; 0x07cf64--0x07cfed
+AnnonCPicFront:: INCBIN "gfx/pokemon/annon_c/front.pic" ; 0x07cfed--0x07d0a1
+AnnonCPicBack:: INCBIN "gfx/pokemon/annon_c/back.pic" ; 0x07d0a1--0x07d147
+AnnonDPicFront:: INCBIN "gfx/pokemon/annon_d/front.pic" ; 0x07d147--0x07d1ec
+AnnonDPicBack:: INCBIN "gfx/pokemon/annon_d/back.pic" ; 0x07d1ec--0x07d285
+AnnonEPicFront:: INCBIN "gfx/pokemon/annon_e/front.pic" ; 0x07d285--0x07d30e
+AnnonEPicBack:: INCBIN "gfx/pokemon/annon_e/back.pic" ; 0x07d30e--0x07d38b
+AnnonFPicFront:: INCBIN "gfx/pokemon/annon_f/front.pic" ; 0x07d38b--0x07d425
+AnnonFPicBack:: INCBIN "gfx/pokemon/annon_f/back.pic" ; 0x07d425--0x07d4ae
+AnnonGPicFront:: INCBIN "gfx/pokemon/annon_g/front.pic" ; 0x07d4ae--0x07d53f
+AnnonGPicBack:: INCBIN "gfx/pokemon/annon_g/back.pic" ; 0x07d53f--0x07d5c4
+AnnonHPicFront:: INCBIN "gfx/pokemon/annon_h/front.pic" ; 0x07d5c4--0x07d693
+AnnonHPicBack:: INCBIN "gfx/pokemon/annon_h/back.pic" ; 0x07d693--0x07d757
+AnnonIPicFront:: INCBIN "gfx/pokemon/annon_i/front.pic" ; 0x07d757--0x07d7c0
+AnnonIPicBack:: INCBIN "gfx/pokemon/annon_i/back.pic" ; 0x07d7c0--0x07d81f
+AnnonJPicFront:: INCBIN "gfx/pokemon/annon_j/front.pic" ; 0x07d81f--0x07d89b
+AnnonJPicBack:: INCBIN "gfx/pokemon/annon_j/back.pic" ; 0x07d89b--0x07d909
+AnnonKPicFront:: INCBIN "gfx/pokemon/annon_k/front.pic" ; 0x07d909--0x07d98d
+AnnonKPicBack:: INCBIN "gfx/pokemon/annon_k/back.pic" ; 0x07d98d--0x07da06
+AnnonLPicFront:: INCBIN "gfx/pokemon/annon_l/front.pic" ; 0x07da06--0x07da7a
+AnnonLPicBack:: INCBIN "gfx/pokemon/annon_l/back.pic" ; 0x07da7a--0x07dade
+AnnonMPicFront:: INCBIN "gfx/pokemon/annon_m/front.pic" ; 0x07dade--0x07dba1
+AnnonMPicBack:: INCBIN "gfx/pokemon/annon_m/back.pic" ; 0x07dba1--0x07dc57
+AnnonNPicFront:: INCBIN "gfx/pokemon/annon_n/front.pic" ; 0x07dc57--0x07dcf4
+AnnonNPicBack:: INCBIN "gfx/pokemon/annon_n/back.pic" ; 0x07dcf4--0x07dd8b
+AnnonOPicFront:: INCBIN "gfx/pokemon/annon_o/front.pic" ; 0x07dd8b--0x07de55
+AnnonOPicBack:: INCBIN "gfx/pokemon/annon_o/back.pic" ; 0x07de55--0x07df15
+AnnonPPicFront:: INCBIN "gfx/pokemon/annon_p/front.pic" ; 0x07df15--0x07df7d
+AnnonPPicBack:: INCBIN "gfx/pokemon/annon_p/back.pic" ; 0x07df7d--0x07dfd6
+AnnonQPicFront:: INCBIN "gfx/pokemon/annon_q/front.pic" ; 0x07dfd6--0x07e03d
+AnnonQPicBack:: INCBIN "gfx/pokemon/annon_q/back.pic" ; 0x07e03d--0x07e099
+AnnonRPicFront:: INCBIN "gfx/pokemon/annon_r/front.pic" ; 0x07e099--0x07e0ff
+AnnonRPicBack:: INCBIN "gfx/pokemon/annon_r/back.pic" ; 0x07e0ff--0x07e159
+AnnonSPicFront:: INCBIN "gfx/pokemon/annon_s/front.pic" ; 0x07e159--0x07e1f0
+AnnonSPicBack:: INCBIN "gfx/pokemon/annon_s/back.pic" ; 0x07e1f0--0x07e27a
+AnnonTPicFront:: INCBIN "gfx/pokemon/annon_t/front.pic" ; 0x07e27a--0x07e2e8
+AnnonTPicBack:: INCBIN "gfx/pokemon/annon_t/back.pic" ; 0x07e2e8--0x07e348
+AnnonUPicFront:: INCBIN "gfx/pokemon/annon_u/front.pic" ; 0x07e348--0x07e3e7
+AnnonUPicBack:: INCBIN "gfx/pokemon/annon_u/back.pic" ; 0x07e3e7--0x07e47a
+AnnonVPicFront:: INCBIN "gfx/pokemon/annon_v/front.pic" ; 0x07e47a--0x07e50a
+AnnonVPicBack:: INCBIN "gfx/pokemon/annon_v/back.pic" ; 0x07e50a--0x07e589
+AnnonWPicFront:: INCBIN "gfx/pokemon/annon_w/front.pic" ; 0x07e589--0x07e60d
+AnnonWPicBack:: INCBIN "gfx/pokemon/annon_w/back.pic" ; 0x07e60d--0x07e681
+AnnonXPicFront:: INCBIN "gfx/pokemon/annon_x/front.pic" ; 0x07e681--0x07e705
+AnnonXPicBack:: INCBIN "gfx/pokemon/annon_x/back.pic" ; 0x07e705--0x07e77b
+AnnonYPicFront:: INCBIN "gfx/pokemon/annon_y/front.pic" ; 0x07e77b--0x07e801
+AnnonYPicBack:: INCBIN "gfx/pokemon/annon_y/back.pic" ; 0x07e801--0x07e87c
+AnnonZPicFront:: INCBIN "gfx/pokemon/annon_z/front.pic" ; 0x07e87c--0x07e8fa
+AnnonZPicBack:: INCBIN "gfx/pokemon/annon_z/back.pic" ; 0x07e8fa--0x07e96a
diff --git a/home/items.asm b/home/items.asm
index dd4e8d3..332d5e1 100755
--- a/home/items.asm
+++ b/home/items.asm
@@ -1,69 +1,69 @@
-INCLUDE "constants.asm"
-
-if DEBUG
-SECTION "TossItem", ROM0[$3243]
-else
-SECTION "TossItem", ROM0[$3207]
-endc
-
-TossItem: ; 00:3243
- ldh a, [hROMBank]
- push af
- ld a, BANK(_TossItem)
- call Bankswitch
- push hl
- push de
- push bc
- call _TossItem
- pop bc
- pop de
- pop hl
- pop af
- call Bankswitch
- ret
-
-ReceiveItem:: ; 3259
-; function to add an item (in varying quantities) to the player's bag or PC box
-; INPUT:
-; HL = address of inventory (either wNumBagItems or wNumBoxItems)
-; [wCurItem] = item ID
-; [wItemQuantity] = item quantity
-; sets carry flag if successful, unsets carry flag if unsuccessful
- push bc
- ldh a, [hROMBank]
- push af
- ld a, BANK(_ReceiveItem)
- call Bankswitch
- push hl
- push de
- call _ReceiveItem
- pop de
- pop hl
- pop bc
- ld a, b
- call Bankswitch
- pop bc
- ret
-
-if DEBUG
-SECTION "GiveItem", ROM0[$366C]
-else
-SECTION "GiveItem", ROM0[$3630]
-endc
-
-GiveItem::
-; Give player quantity c of item b,
-; and copy the item's name to wcf4b.
-; Return carry on success.
- ld a, b
- ld [wNamedObjectIndexBuffer], a
- ld [wCurItem], a
- ld a, c
- ld [wItemQuantity], a
- ld hl, wNumBagItems
- call ReceiveItem
- ret nc
- call GetItemName
- call CopyStringToStringBuffer2
- scf
- ret
+INCLUDE "constants.asm"
+
+if DEBUG
+SECTION "TossItem", ROM0[$3243]
+else
+SECTION "TossItem", ROM0[$3207]
+endc
+
+TossItem: ; 00:3243
+ ldh a, [hROMBank]
+ push af
+ ld a, BANK(_TossItem)
+ call Bankswitch
+ push hl
+ push de
+ push bc
+ call _TossItem
+ pop bc
+ pop de
+ pop hl
+ pop af
+ call Bankswitch
+ ret
+
+ReceiveItem:: ; 3259
+; function to add an item (in varying quantities) to the player's bag or PC box
+; INPUT:
+; HL = address of inventory (either wNumBagItems or wNumBoxItems)
+; [wCurItem] = item ID
+; [wItemQuantity] = item quantity
+; sets carry flag if successful, unsets carry flag if unsuccessful
+ push bc
+ ldh a, [hROMBank]
+ push af
+ ld a, BANK(_ReceiveItem)
+ call Bankswitch
+ push hl
+ push de
+ call _ReceiveItem
+ pop de
+ pop hl
+ pop bc
+ ld a, b
+ call Bankswitch
+ pop bc
+ ret
+
+if DEBUG
+SECTION "GiveItem", ROM0[$366C]
+else
+SECTION "GiveItem", ROM0[$3630]
+endc
+
+GiveItem::
+; Give player quantity c of item b,
+; and copy the item's name to wcf4b.
+; Return carry on success.
+ ld a, b
+ ld [wNamedObjectIndexBuffer], a
+ ld [wCurItem], a
+ ld a, c
+ ld [wItemQuantity], a
+ ld hl, wNumBagItems
+ call ReceiveItem
+ ret nc
+ call GetItemName
+ call CopyStringToStringBuffer2
+ scf
+ ret
diff --git a/home/tables.asm b/home/tables.asm
index 5c35a4f..02fc78a 100755
--- a/home/tables.asm
+++ b/home/tables.asm
@@ -1,27 +1,27 @@
-INCLUDE "constants.asm"
-
-SECTION "FindItemInTable", ROM0[$35F8]
-
-; find value a from table hl with row length de
-; returns carry and row index b if successful
-FindItemInTable: ; 00:35F8
- ld b, 0
- ld c, a
-
-.loop
- ld a, [hl]
- cp -1
- jr z, .fail
- cp c
- jr z, .success
- inc b
- add hl, de
- jr .loop
-
-.fail
- and a
- ret
-
-.success
- scf
- ret
+INCLUDE "constants.asm"
+
+SECTION "FindItemInTable", ROM0[$35F8]
+
+; find value a from table hl with row length de
+; returns carry and row index b if successful
+FindItemInTable: ; 00:35F8
+ ld b, 0
+ ld c, a
+
+.loop
+ ld a, [hl]
+ cp -1
+ jr z, .fail
+ cp c
+ jr z, .success
+ inc b
+ add hl, de
+ jr .loop
+
+.fail
+ and a
+ ret
+
+.success
+ scf
+ ret
diff --git a/macros/queue.asm b/macros/queue.asm
index c868dc8..37fb1cb 100755
--- a/macros/queue.asm
+++ b/macros/queue.asm
@@ -1,17 +1,17 @@
-queue_ab: MACRO
- ld hl, \1
- ldh a, [hROMBank]
- call QueueScript
-ENDM
-
-queue_ba: MACRO
- ldh a, [hROMBank]
- ld hl, \1
- call QueueScript
-ENDM
-
-far_queue: MACRO
- ld hl, \1
- ld a, BANK(\1)
- call QueueScript
-ENDM
+queue_ab: MACRO
+ ld hl, \1
+ ldh a, [hROMBank]
+ call QueueScript
+ENDM
+
+queue_ba: MACRO
+ ldh a, [hROMBank]
+ ld hl, \1
+ call QueueScript
+ENDM
+
+far_queue: MACRO
+ ld hl, \1
+ ld a, BANK(\1)
+ call QueueScript
+ENDM
diff --git a/macros/scripts.asm b/macros/scripts.asm
index 73ad461..e392391 100755
--- a/macros/scripts.asm
+++ b/macros/scripts.asm
@@ -1,14 +1,14 @@
-init_script_table: MACRO
-script_id = 0
-ENDM
-
-add_script: MACRO
- dw \1
-\1ScriptID = script_id
-script_id = script_id + 1
-ENDM
-
-set_script: MACRO
- ld a, \1ScriptID
- ld [wFieldMoveScriptID], a
-ENDM
+init_script_table: MACRO
+script_id = 0
+ENDM
+
+add_script: MACRO
+ dw \1
+\1ScriptID = script_id
+script_id = script_id + 1
+ENDM
+
+set_script: MACRO
+ ld a, \1ScriptID
+ ld [wFieldMoveScriptID], a
+ENDM