diff options
-rw-r--r-- | .gitattributes | 23 | ||||
-rwxr-xr-x | constants/item_data_constants.asm | 258 | ||||
-rw-r--r--[-rwxr-xr-x] | constants/movement_constants.asm | 88 | ||||
-rwxr-xr-x | constants/name_constants.asm | 2 | ||||
-rwxr-xr-x | constants/script_constants.asm | 36 | ||||
-rw-r--r--[-rwxr-xr-x] | data/collision/collision_type_table.asm | 138 | ||||
-rw-r--r-- | data/types/type_matchups.asm | 226 | ||||
-rwxr-xr-x | engine/bcd.asm | 110 | ||||
-rwxr-xr-x | engine/events/field_moves.asm | 1083 | ||||
-rwxr-xr-x | engine/items/inventory.asm | 1446 | ||||
-rwxr-xr-x | engine/items/item_effects.asm | 158 | ||||
-rw-r--r--[-rwxr-xr-x] | engine/overworld/object_collision.asm | 314 | ||||
-rwxr-xr-x | engine/overworld/spawn_points.asm | 118 | ||||
-rwxr-xr-x | engine/pokemon/health.asm | 716 | ||||
-rwxr-xr-x | engine/smallflag.asm | 142 | ||||
-rw-r--r-- | gfx/pokemon/annon_pic_ptrs.asm | 110 | ||||
-rw-r--r-- | gfx/pokemon/annon_pics.asm | 106 | ||||
-rwxr-xr-x | home/items.asm | 138 | ||||
-rwxr-xr-x | home/tables.asm | 54 | ||||
-rwxr-xr-x | macros/queue.asm | 34 | ||||
-rwxr-xr-x | macros/scripts.asm | 28 |
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 |