Use macros for bit arrays

This commit is contained in:
Rangi 2021-05-23 22:09:02 -04:00
parent 715496bf35
commit 346ce9454a
4 changed files with 124 additions and 107 deletions

View file

@ -3,7 +3,7 @@
; - ItemNames (see data/items/names.asm) ; - ItemNames (see data/items/names.asm)
; - ItemPrices (see data/items/prices.asm) ; - ItemPrices (see data/items/prices.asm)
; - TechnicalMachinePrices (see data/items/tm_prices.asm) ; - TechnicalMachinePrices (see data/items/tm_prices.asm)
; - KeyItemBitfield (see data/items/key_items.asm) ; - KeyItemFlags (see data/items/key_items.asm)
; - ItemUsePtrTable (see engine/items/item_effects.asm) ; - ItemUsePtrTable (see engine/items/item_effects.asm)
const_def const_def
const NO_ITEM ; $00 const NO_ITEM ; $00

View file

@ -1,105 +1,86 @@
key_item_bits: MACRO KeyItemFlags:
_bit = 0 bit_array KeyItemFlags
_byte = 0 dbit FALSE ; MASTER_BALL
REPT _NARG dbit FALSE ; ULTRA_BALL
_byte = _byte | ((\1) << _bit) dbit FALSE ; GREAT_BALL
_bit = _bit + 1 dbit FALSE ; POKE_BALL
IF _bit == 8 dbit TRUE ; TOWN_MAP
db _byte dbit TRUE ; BICYCLE
_byte = 0 dbit TRUE ; SURFBOARD
_bit = 0 dbit TRUE ; SAFARI_BALL
ENDC dbit TRUE ; POKEDEX
SHIFT dbit FALSE ; MOON_STONE
ENDR dbit FALSE ; ANTIDOTE
IF _bit > 0 dbit FALSE ; BURN_HEAL
db _byte dbit FALSE ; ICE_HEAL
ENDC dbit FALSE ; AWAKENING
ENDM dbit FALSE ; PARLYZ_HEAL
dbit FALSE ; FULL_RESTORE
KeyItemBitfield: dbit FALSE ; MAX_POTION
table_width 1, KeyItemBitfield dbit FALSE ; HYPER_POTION
key_item_bits \ dbit FALSE ; SUPER_POTION
FALSE, \ ; MASTER_BALL dbit FALSE ; POTION
FALSE, \ ; ULTRA_BALL dbit TRUE ; BOULDERBADGE
FALSE, \ ; GREAT_BALL dbit TRUE ; CASCADEBADGE
FALSE, \ ; POKE_BALL dbit TRUE ; THUNDERBADGE
TRUE, \ ; TOWN_MAP dbit TRUE ; RAINBOWBADGE
TRUE, \ ; BICYCLE dbit TRUE ; SOULBADGE
TRUE, \ ; SURFBOARD dbit TRUE ; MARSHBADGE
TRUE, \ ; SAFARI_BALL dbit TRUE ; VOLCANOBADGE
TRUE, \ ; POKEDEX dbit TRUE ; EARTHBADGE
FALSE, \ ; MOON_STONE dbit FALSE ; ESCAPE_ROPE
FALSE, \ ; ANTIDOTE dbit FALSE ; REPEL
FALSE, \ ; BURN_HEAL dbit TRUE ; OLD_AMBER
FALSE, \ ; ICE_HEAL dbit FALSE ; FIRE_STONE
FALSE, \ ; AWAKENING dbit FALSE ; THUNDER_STONE
FALSE, \ ; PARLYZ_HEAL dbit FALSE ; WATER_STONE
FALSE, \ ; FULL_RESTORE dbit FALSE ; HP_UP
FALSE, \ ; MAX_POTION dbit FALSE ; PROTEIN
FALSE, \ ; HYPER_POTION dbit FALSE ; IRON
FALSE, \ ; SUPER_POTION dbit FALSE ; CARBOS
FALSE, \ ; POTION dbit FALSE ; CALCIUM
TRUE, \ ; BOULDERBADGE dbit FALSE ; RARE_CANDY
TRUE, \ ; CASCADEBADGE dbit TRUE ; DOME_FOSSIL
TRUE, \ ; THUNDERBADGE dbit TRUE ; HELIX_FOSSIL
TRUE, \ ; RAINBOWBADGE dbit TRUE ; SECRET_KEY
TRUE, \ ; SOULBADGE dbit TRUE ; UNUSED_ITEM
TRUE, \ ; MARSHBADGE dbit TRUE ; BIKE_VOUCHER
TRUE, \ ; VOLCANOBADGE dbit FALSE ; X_ACCURACY
TRUE, \ ; EARTHBADGE dbit FALSE ; LEAF_STONE
FALSE, \ ; ESCAPE_ROPE dbit TRUE ; CARD_KEY
FALSE, \ ; REPEL dbit FALSE ; NUGGET
TRUE, \ ; OLD_AMBER dbit FALSE ; PP_UP_2
FALSE, \ ; FIRE_STONE dbit FALSE ; POKE_DOLL
FALSE, \ ; THUNDER_STONE dbit FALSE ; FULL_HEAL
FALSE, \ ; WATER_STONE dbit FALSE ; REVIVE
FALSE, \ ; HP_UP dbit FALSE ; MAX_REVIVE
FALSE, \ ; PROTEIN dbit FALSE ; GUARD_SPEC
FALSE, \ ; IRON dbit FALSE ; SUPER_REPEL
FALSE, \ ; CARBOS dbit FALSE ; MAX_REPEL
FALSE, \ ; CALCIUM dbit FALSE ; DIRE_HIT
FALSE, \ ; RARE_CANDY dbit FALSE ; COIN
TRUE, \ ; DOME_FOSSIL dbit FALSE ; FRESH_WATER
TRUE, \ ; HELIX_FOSSIL dbit FALSE ; SODA_POP
TRUE, \ ; SECRET_KEY dbit FALSE ; LEMONADE
TRUE, \ ; UNUSED_ITEM dbit TRUE ; S_S_TICKET
TRUE, \ ; BIKE_VOUCHER dbit TRUE ; GOLD_TEETH
FALSE, \ ; X_ACCURACY dbit FALSE ; X_ATTACK
FALSE, \ ; LEAF_STONE dbit FALSE ; X_DEFEND
TRUE, \ ; CARD_KEY dbit FALSE ; X_SPEED
FALSE, \ ; NUGGET dbit FALSE ; X_SPECIAL
FALSE, \ ; PP_UP_2 dbit TRUE ; COIN_CASE
FALSE, \ ; POKE_DOLL dbit TRUE ; OAKS_PARCEL
FALSE, \ ; FULL_HEAL dbit TRUE ; ITEMFINDER
FALSE, \ ; REVIVE dbit TRUE ; SILPH_SCOPE
FALSE, \ ; MAX_REVIVE dbit TRUE ; POKE_FLUTE
FALSE, \ ; GUARD_SPEC dbit TRUE ; LIFT_KEY
FALSE, \ ; SUPER_REPEL dbit FALSE ; EXP_ALL
FALSE, \ ; MAX_REPEL dbit TRUE ; OLD_ROD
FALSE, \ ; DIRE_HIT dbit TRUE ; GOOD_ROD
FALSE, \ ; COIN dbit TRUE ; SUPER_ROD
FALSE, \ ; FRESH_WATER dbit FALSE ; PP_UP
FALSE, \ ; SODA_POP dbit FALSE ; ETHER
FALSE, \ ; LEMONADE dbit FALSE ; MAX_ETHER
TRUE, \ ; S_S_TICKET dbit FALSE ; ELIXER
TRUE, \ ; GOLD_TEETH dbit FALSE ; MAX_ELIXER
FALSE, \ ; X_ATTACK end_bit_array NUM_ITEMS
FALSE, \ ; X_DEFEND
FALSE, \ ; X_SPEED
FALSE, \ ; X_SPECIAL
TRUE, \ ; COIN_CASE
TRUE, \ ; OAKS_PARCEL
TRUE, \ ; ITEMFINDER
TRUE, \ ; SILPH_SCOPE
TRUE, \ ; POKE_FLUTE
TRUE, \ ; LIFT_KEY
FALSE, \ ; EXP_ALL
TRUE, \ ; OLD_ROD
TRUE, \ ; GOOD_ROD
TRUE, \ ; SUPER_ROD
FALSE, \ ; PP_UP
FALSE, \ ; ETHER
FALSE, \ ; MAX_ETHER
FALSE, \ ; ELIXER
FALSE ; MAX_ELIXER
assert_table_length (NUM_ITEMS + 7) / 8

View file

@ -2614,9 +2614,10 @@ IsKeyItem_::
jr nc, .checkIfItemIsHM jr nc, .checkIfItemIsHM
; if the item is not an HM or TM ; if the item is not an HM or TM
push af push af
ld hl, KeyItemBitfield ld hl, KeyItemFlags
ld de, wBuffer ld de, wBuffer
ld bc, 15 ; only 11 bytes are actually used ld bc, 15 ; only 11 bytes are actually used
assert 15 >= (NUM_ITEMS + 7) / 8
call CopyData call CopyData
pop af pop af
dec a dec a

View file

@ -73,6 +73,41 @@ x = (x + 1) / 2
ENDC ENDC
ENDM ENDM
bit_array: MACRO
CURRENT_BIT_ARRAY_VALUE = 0
CURRENT_BIT_ARRAY_LENGTH = 0
IF _NARG == 1
REDEF CURRENT_BIT_ARRAY_START EQUS "\1"
ELSE
REDEF CURRENT_BIT_ARRAY_START EQUS "._bit_array\@"
{CURRENT_BIT_ARRAY_START}:
ENDC
ENDM
dbit: MACRO
ASSERT (\1) == 0 || (\1) == 1, "bits must be 0 or 1"
CURRENT_BIT_ARRAY_VALUE = CURRENT_BIT_ARRAY_VALUE | ((\1) << (CURRENT_BIT_ARRAY_LENGTH % 8))
CURRENT_BIT_ARRAY_LENGTH = CURRENT_BIT_ARRAY_LENGTH + 1
IF CURRENT_BIT_ARRAY_LENGTH % 8 == 0
db CURRENT_BIT_ARRAY_VALUE
CURRENT_BIT_ARRAY_VALUE = 0
ENDC
ENDM
end_bit_array: MACRO
IF CURRENT_BIT_ARRAY_LENGTH % 8
db CURRENT_BIT_ARRAY_VALUE
ENDC
IF _NARG == 1
x = \1
ASSERT x == CURRENT_BIT_ARRAY_LENGTH, \
"{CURRENT_BIT_ARRAY_START}: expected {d:x} bits, got {d:CURRENT_BIT_ARRAY_LENGTH}"
x = (x + 7) / 8
ASSERT x == @ - {CURRENT_BIT_ARRAY_START}, \
"{CURRENT_BIT_ARRAY_START}: expected {d:x} bytes"
ENDC
ENDM
def_grass_wildmons: MACRO def_grass_wildmons: MACRO
;\1: encounter rate ;\1: encounter rate
CURRENT_GRASS_WILDMONS_RATE = \1 CURRENT_GRASS_WILDMONS_RATE = \1