summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--audio/notes.asm2
-rw-r--r--constants.asm10
-rw-r--r--constants/audio_constants.asm1
-rw-r--r--constants/battle_constants.asm35
-rw-r--r--constants/credits_constants.asm1
-rw-r--r--constants/gfx_constants.asm1
-rw-r--r--constants/hide_show_constants.asm1
-rw-r--r--constants/item_constants.asm4
-rw-r--r--constants/map_constants.asm1
-rw-r--r--constants/menu_constants.asm1
-rw-r--r--constants/move_animation_constants.asm3
-rw-r--r--constants/move_constants.asm6
-rw-r--r--constants/move_effect_constants.asm1
-rw-r--r--constants/palette_constants.asm1
-rw-r--r--constants/pokemon_data_constants.asm31
-rw-r--r--constants/script_constants.asm1
-rw-r--r--constants/sprite_constants.asm1
-rw-r--r--constants/tileset_constants.asm1
-rw-r--r--constants/trainer_constants.asm1
-rw-r--r--constants/type_constants.asm2
-rw-r--r--data/battle/stat_mod_names.asm17
-rw-r--r--data/battle/stat_names.asm17
-rw-r--r--data/battle_anims/base_coords.asm2
-rw-r--r--data/battle_anims/frame_blocks.asm2
-rw-r--r--data/battle_anims/subanimations.asm2
-rw-r--r--data/credits/credits_mons.asm1
-rw-r--r--data/credits/credits_text.asm2
-rw-r--r--data/events/trades.asm2
-rw-r--r--data/growth_rates.asm2
-rw-r--r--data/items/key_items.asm2
-rw-r--r--data/items/names.asm197
-rw-r--r--data/items/prices.asm3
-rw-r--r--data/items/tm_prices.asm2
-rw-r--r--data/maps/hide_show_data.asm4
-rw-r--r--data/maps/map_header_banks.asm2
-rw-r--r--data/maps/map_header_pointers.asm4
-rw-r--r--data/maps/names.asm1
-rw-r--r--data/maps/songs.asm2
-rw-r--r--data/maps/sprite_sets.asm26
-rw-r--r--data/maps/town_map_entries.asm2
-rw-r--r--data/moves/animations.asm3
-rw-r--r--data/moves/effects_pointers.asm2
-rw-r--r--data/moves/field_move_names.asm1
-rw-r--r--data/moves/moves.asm8
-rw-r--r--data/moves/names.asm332
-rw-r--r--data/moves/sfx.asm2
-rw-r--r--data/moves/tmhm_moves.asm3
-rw-r--r--data/pokemon/base_stats.asm6
-rw-r--r--data/pokemon/cries.asm2
-rw-r--r--data/pokemon/dex_entries.asm2
-rw-r--r--data/pokemon/dex_order.asm2
-rw-r--r--data/pokemon/evos_moves.asm2
-rw-r--r--data/pokemon/menu_icons.asm2
-rw-r--r--data/pokemon/names.asm2
-rw-r--r--data/pokemon/palettes.asm2
-rw-r--r--data/sgb/sgb_palettes.asm2
-rw-r--r--data/sprites/sprites.asm2
-rw-r--r--data/tilemaps.asm2
-rw-r--r--data/tilesets/tileset_headers.asm2
-rw-r--r--data/tilesets/warp_tile_ids.asm2
-rw-r--r--data/trainers/ai_pointers.asm2
-rw-r--r--data/trainers/move_choices.asm3
-rw-r--r--data/trainers/parties.asm2
-rw-r--r--data/trainers/pic_pointers_money.asm2
-rw-r--r--data/types/names.asm3
-rw-r--r--data/wild/grass_water.asm2
-rw-r--r--data/wild/maps/CeruleanCave1F.asm6
-rw-r--r--data/wild/maps/CeruleanCave2F.asm6
-rw-r--r--data/wild/maps/CeruleanCaveB1F.asm6
-rw-r--r--data/wild/maps/DiglettsCave.asm6
-rw-r--r--data/wild/maps/MtMoon1F.asm6
-rw-r--r--data/wild/maps/MtMoonB1F.asm6
-rw-r--r--data/wild/maps/MtMoonB2F.asm6
-rw-r--r--data/wild/maps/PokemonMansion1F.asm6
-rw-r--r--data/wild/maps/PokemonMansion2F.asm6
-rw-r--r--data/wild/maps/PokemonMansion3F.asm6
-rw-r--r--data/wild/maps/PokemonMansionB1F.asm6
-rw-r--r--data/wild/maps/PokemonTower1F.asm6
-rw-r--r--data/wild/maps/PokemonTower2F.asm6
-rw-r--r--data/wild/maps/PokemonTower3F.asm6
-rw-r--r--data/wild/maps/PokemonTower4F.asm6
-rw-r--r--data/wild/maps/PokemonTower5F.asm6
-rw-r--r--data/wild/maps/PokemonTower6F.asm6
-rw-r--r--data/wild/maps/PokemonTower7F.asm6
-rw-r--r--data/wild/maps/PowerPlant.asm6
-rw-r--r--data/wild/maps/RockTunnel1F.asm6
-rw-r--r--data/wild/maps/RockTunnelB1F.asm6
-rw-r--r--data/wild/maps/Route1.asm6
-rw-r--r--data/wild/maps/Route10.asm6
-rw-r--r--data/wild/maps/Route11.asm6
-rw-r--r--data/wild/maps/Route12.asm6
-rw-r--r--data/wild/maps/Route13.asm6
-rw-r--r--data/wild/maps/Route14.asm6
-rw-r--r--data/wild/maps/Route15.asm6
-rw-r--r--data/wild/maps/Route16.asm6
-rw-r--r--data/wild/maps/Route17.asm6
-rw-r--r--data/wild/maps/Route18.asm6
-rw-r--r--data/wild/maps/Route2.asm6
-rw-r--r--data/wild/maps/Route21.asm6
-rw-r--r--data/wild/maps/Route22.asm6
-rw-r--r--data/wild/maps/Route23.asm6
-rw-r--r--data/wild/maps/Route24.asm6
-rw-r--r--data/wild/maps/Route25.asm6
-rw-r--r--data/wild/maps/Route3.asm6
-rw-r--r--data/wild/maps/Route4.asm7
-rw-r--r--data/wild/maps/Route5.asm6
-rw-r--r--data/wild/maps/Route6.asm6
-rw-r--r--data/wild/maps/Route7.asm6
-rw-r--r--data/wild/maps/Route8.asm6
-rw-r--r--data/wild/maps/Route9.asm6
-rw-r--r--data/wild/maps/SafariZoneCenter.asm6
-rw-r--r--data/wild/maps/SafariZoneEast.asm6
-rw-r--r--data/wild/maps/SafariZoneNorth.asm6
-rw-r--r--data/wild/maps/SafariZoneWest.asm6
-rw-r--r--data/wild/maps/SeaRoutes.asm5
-rw-r--r--data/wild/maps/SeafoamIslands1F.asm6
-rw-r--r--data/wild/maps/SeafoamIslandsB1F.asm6
-rw-r--r--data/wild/maps/SeafoamIslandsB2F.asm6
-rw-r--r--data/wild/maps/SeafoamIslandsB3F.asm6
-rw-r--r--data/wild/maps/SeafoamIslandsB4F.asm6
-rw-r--r--data/wild/maps/VictoryRoad1F.asm6
-rw-r--r--data/wild/maps/VictoryRoad2F.asm6
-rw-r--r--data/wild/maps/VictoryRoad3F.asm6
-rw-r--r--data/wild/maps/ViridianForest.asm6
-rw-r--r--data/wild/maps/nothing.asm6
-rw-r--r--data/yes_no_menu_strings.asm2
-rw-r--r--engine/battle/core.asm10
-rw-r--r--engine/battle/effects.asm4
-rw-r--r--engine/battle/trainer_ai.asm2
-rw-r--r--engine/events/heal_party.asm2
-rw-r--r--engine/items/item_effects.asm11
-rw-r--r--engine/pokemon/add_mon.asm2
-rw-r--r--engine/pokemon/evos_moves.asm4
-rw-r--r--engine/pokemon/learn_move.asm2
-rw-r--r--home/pokemon.asm6
-rw-r--r--macros.asm1
-rw-r--r--macros/asserts.asm87
-rw-r--r--macros/const.asm8
-rw-r--r--wram.asm11
139 files changed, 862 insertions, 436 deletions
diff --git a/audio/notes.asm b/audio/notes.asm
index 75e1a0b7..ac4b3eb0 100644
--- a/audio/notes.asm
+++ b/audio/notes.asm
@@ -1,5 +1,6 @@
; This file is INCLUDEd three times, once in each audio engine.
+ table_width 2
dw $F82C ; C_
dw $F89D ; C#
dw $F907 ; D_
@@ -12,3 +13,4 @@
dw $FB58 ; A_
dw $FB9B ; A#
dw $FBDA ; B_
+ assert_table_length NUM_NOTES
diff --git a/constants.asm b/constants.asm
index 36a7acf5..a307549b 100644
--- a/constants.asm
+++ b/constants.asm
@@ -9,16 +9,16 @@ INCLUDE "constants/gfx_constants.asm"
INCLUDE "constants/input_constants.asm"
INCLUDE "constants/serial_constants.asm"
INCLUDE "constants/script_constants.asm"
-INCLUDE "constants/pokemon_constants.asm"
-INCLUDE "constants/pokedex_constants.asm"
-INCLUDE "constants/pokemon_data_constants.asm"
-INCLUDE "constants/trainer_constants.asm"
INCLUDE "constants/type_constants.asm"
+INCLUDE "constants/battle_constants.asm"
INCLUDE "constants/move_constants.asm"
INCLUDE "constants/move_animation_constants.asm"
INCLUDE "constants/move_effect_constants.asm"
-INCLUDE "constants/battle_constants.asm"
INCLUDE "constants/item_constants.asm"
+INCLUDE "constants/pokemon_constants.asm"
+INCLUDE "constants/pokedex_constants.asm"
+INCLUDE "constants/pokemon_data_constants.asm"
+INCLUDE "constants/trainer_constants.asm"
INCLUDE "constants/icon_constants.asm"
INCLUDE "constants/sprite_constants.asm"
INCLUDE "constants/sprite_data_constants.asm"
diff --git a/constants/audio_constants.asm b/constants/audio_constants.asm
index e36d2d5f..69ec4e74 100644
--- a/constants/audio_constants.asm
+++ b/constants/audio_constants.asm
@@ -13,6 +13,7 @@
const A_ ; 9
const A# ; A
const B_ ; B
+NUM_NOTES EQU const_value
; channel
; Audio[1|2|3]_HWChannelBaseAddresses, Audio[1|2|3]_HWChannelDisableMasks,
diff --git a/constants/battle_constants.asm b/constants/battle_constants.asm
index 99d371b2..fdbe8775 100644
--- a/constants/battle_constants.asm
+++ b/constants/battle_constants.asm
@@ -1,9 +1,36 @@
MAX_LEVEL EQU 100
-NUM_MOVES EQU 4
-NUM_STATS EQU 5
-NUM_STAT_MODS EQU 8
-NUM_DVS EQU 2
+NUM_MOVES EQU 4
+
+; VitaminStats indexes (see data/battle/stat_names.asm)
+ const_def
+ const STAT_HEALTH
+ const STAT_ATTACK
+ const STAT_DEFENSE
+ const STAT_SPEED
+ const STAT_SPECIAL
+NUM_STATS EQU const_value
+
+; StatModTextStrings indexes (see data/battle/stat_mod_names.asm)
+ const_def
+ const MOD_ATTACK
+ const MOD_DEFENSE
+ const MOD_SPEED
+ const MOD_SPECIAL
+ const MOD_ACCURACY
+ const MOD_EVASION
+ const_skip 2
+NUM_STAT_MODS EQU const_value
+
+; Moves struct fields (see data/moves/moves.asm)
+rsreset
+MOVE_ANIM rb
+MOVE_EFFECT rb
+MOVE_POWER rb
+MOVE_TYPE rb
+MOVE_ACC rb
+MOVE_PP rb
+MOVE_LENGTH EQU _RS
; D733 flags
BIT_TEST_BATTLE EQU 0
diff --git a/constants/credits_constants.asm b/constants/credits_constants.asm
index dcf782ef..78dc7675 100644
--- a/constants/credits_constants.asm
+++ b/constants/credits_constants.asm
@@ -64,6 +64,7 @@
const CRED_FUKUI ; $3D
const CRED_CLUB ; $3E
const CRED_PAAD ; $3F
+NUM_CRED_STRINGS EQU const_value
const_def -1, -1
const CRED_TEXT_FADE_MON ; $FF
diff --git a/constants/gfx_constants.asm b/constants/gfx_constants.asm
index dd9de6b6..19f935f6 100644
--- a/constants/gfx_constants.asm
+++ b/constants/gfx_constants.asm
@@ -37,3 +37,4 @@ REDRAW_ROW EQU 2
const TILEMAP_GENGAR_INTRO_3
const TILEMAP_GAME_BOY
const TILEMAP_LINK_CABLE
+NUM_TILEMAPS EQU const_value
diff --git a/constants/hide_show_constants.asm b/constants/hide_show_constants.asm
index 82e80bae..4770a29a 100644
--- a/constants/hide_show_constants.asm
+++ b/constants/hide_show_constants.asm
@@ -237,3 +237,4 @@ SHOW EQU $15
const HS_SEAFOAM_ISLANDS_B4F_BOULDER_1 ; E1
const HS_SEAFOAM_ISLANDS_B4F_BOULDER_2 ; E2
const HS_ARTICUNO ; E3 X
+NUM_HS_OBJECTS EQU const_value
diff --git a/constants/item_constants.asm b/constants/item_constants.asm
index d0c25202..9002a87b 100644
--- a/constants/item_constants.asm
+++ b/constants/item_constants.asm
@@ -92,6 +92,9 @@ SAFARI_ROCK EQU $16 ; overload
const MAX_ETHER ; $51
const ELIXER ; $52
const MAX_ELIXER ; $53
+NUM_ITEMS EQU const_value - 1
+
+; elevator floors use item IDs
const FLOOR_B2F ; $54
const FLOOR_B1F ; $55
const FLOOR_1F ; $56
@@ -106,6 +109,7 @@ SAFARI_ROCK EQU $16 ; overload
const FLOOR_10F ; $5F
const FLOOR_11F ; $60
const FLOOR_B4F ; $61
+NUM_FLOORS EQU const_value - 1 - NUM_ITEMS
const_next $C4
diff --git a/constants/map_constants.asm b/constants/map_constants.asm
index d33ffe12..58343342 100644
--- a/constants/map_constants.asm
+++ b/constants/map_constants.asm
@@ -266,6 +266,7 @@ FIRST_INDOOR_MAP EQU const_value
mapconst LORELEIS_ROOM, 6, 5 ; $F5
mapconst BRUNOS_ROOM, 6, 5 ; $F6
mapconst AGATHAS_ROOM, 6, 5 ; $F7
+NUM_MAPS EQU const_value
; Indoor maps, such as houses, use this as the Map ID in their exit warps
; This map ID takes the player back to the last outdoor map they were on, stored in wLastMap
diff --git a/constants/menu_constants.asm b/constants/menu_constants.asm
index a53adfdc..eafebe97 100644
--- a/constants/menu_constants.asm
+++ b/constants/menu_constants.asm
@@ -42,6 +42,7 @@ PC_ITEM_CAPACITY EQU 50
const TRADE_CANCEL_MENU ; 5
const HEAL_CANCEL_MENU ; 6
const NO_YES_MENU ; 7
+NUM_TWO_OPTION_MENUS EQU const_value
; menu exit method constants for list menus and the buy/sell/quit menu
CHOSE_MENU_ITEM EQU 1 ; pressed A
diff --git a/constants/move_animation_constants.asm b/constants/move_animation_constants.asm
index f7617544..dc8c94fb 100644
--- a/constants/move_animation_constants.asm
+++ b/constants/move_animation_constants.asm
@@ -132,6 +132,7 @@ FIRST_SE_ID EQU const_value
const SUBANIM_53
const SUBANIM_54
const SUBANIM_55
+NUM_SUBANIMS EQU const_value
; types of subanimations
const_def
@@ -267,6 +268,7 @@ FIRST_SE_ID EQU const_value
const FRAMEBLOCK_77
const FRAMEBLOCK_78
const FRAMEBLOCK_79
+NUM_FRAMEBLOCKS EQU const_value
; base coordinates that are part of subanimations
; FrameBlockBaseCoords indexes (see data/battle_anims/base_coords.asm)
@@ -448,6 +450,7 @@ FIRST_SE_ID EQU const_value
const BASECOORD_AE
const BASECOORD_AF
const BASECOORD_B0
+NUM_BASECOORDS EQU const_value
; frame block modes that are part of subanimations
const_def
diff --git a/constants/move_constants.asm b/constants/move_constants.asm
index ecc28078..52c44210 100644
--- a/constants/move_constants.asm
+++ b/constants/move_constants.asm
@@ -170,10 +170,8 @@
const SUPER_FANG ; a2
const SLASH ; a3
const SUBSTITUTE ; a4
-
-NUM_ATTACKS EQU const_value - 1
-
const STRUGGLE ; a5
+NUM_ATTACKS EQU const_value - 1
; Moves do double duty as animation identifiers.
@@ -214,3 +212,5 @@ NUM_ATTACKS EQU const_value - 1
const HIDEPIC_ANIM ; monster disappears
const ROCK_ANIM ; throw rock
const BAIT_ANIM ; throw bait
+
+NUM_ATTACK_ANIMS EQU const_value - 1
diff --git a/constants/move_effect_constants.asm b/constants/move_effect_constants.asm
index 5b81300f..bc444647 100644
--- a/constants/move_effect_constants.asm
+++ b/constants/move_effect_constants.asm
@@ -91,3 +91,4 @@
const LEECH_SEED_EFFECT ; $54
const SPLASH_EFFECT ; $55
const DISABLE_EFFECT ; $56
+NUM_MOVE_EFFECTS EQU const_value - 1
diff --git a/constants/palette_constants.asm b/constants/palette_constants.asm
index 177f8b81..c26945e8 100644
--- a/constants/palette_constants.asm
+++ b/constants/palette_constants.asm
@@ -70,3 +70,4 @@ SET_PAL_DEFAULT EQU $ff
const PAL_BADGE ; $22
const PAL_CAVE ; $23
const PAL_GAMEFREAK ; $24
+NUM_SGB_PALS EQU const_value
diff --git a/constants/pokemon_data_constants.asm b/constants/pokemon_data_constants.asm
index a0e5b257..6670f777 100644
--- a/constants/pokemon_data_constants.asm
+++ b/constants/pokemon_data_constants.asm
@@ -1,3 +1,29 @@
+; base data struct members (see data/pokemon/base_stats/*.asm)
+rsreset
+BASE_DEX_NO rb
+BASE_STATS rb NUM_STATS
+rsset BASE_STATS
+BASE_HP rb
+BASE_ATK rb
+BASE_DEF rb
+BASE_SPD rb
+BASE_SPC rb
+BASE_TYPES rw
+rsset BASE_TYPES
+BASE_TYPE_1 rb
+BASE_TYPE_2 rb
+BASE_CATCH_RATE rb
+BASE_EXP rb
+BASE_PIC_SIZE rb
+BASE_FRONTPIC rw
+BASE_BACKPIC rw
+BASE_MOVES rb NUM_MOVES
+BASE_GROWTH_RATE rb
+BASE_TMHM rb (NUM_TM_HM + 7) / 8
+ rb_skip
+BASE_DATA_SIZE EQU _RS
+
+
PARTY_LENGTH EQU 6
MONS_PER_BOX EQU 20
@@ -39,3 +65,8 @@ EVOLUTION_SIZE EQU 4
const GROWTH_MEDIUM_SLOW
const GROWTH_FAST
const GROWTH_SLOW
+NUM_GROWTH_RATES EQU const_value
+
+; wild data (see data/wild/maps/*.asm)
+NUM_WILDMONS EQU 10
+WILDDATA_LENGTH EQU 1 + NUM_WILDMONS * 2
diff --git a/constants/script_constants.asm b/constants/script_constants.asm
index b651a76d..fe50e8ae 100644
--- a/constants/script_constants.asm
+++ b/constants/script_constants.asm
@@ -30,6 +30,7 @@ SLOTS_SOMEONESKEYS EQU $ff
const TRADE_FOR_DORIS
const TRADE_FOR_CRINKLES
const TRADE_FOR_SPOT
+NUM_NPC_TRADES EQU const_value
; in game trade dialog sets
; InGameTradeTextPointers indexes (see engine/events/in_game_trades.asm)
diff --git a/constants/sprite_constants.asm b/constants/sprite_constants.asm
index a4354996..ee7238d9 100644
--- a/constants/sprite_constants.asm
+++ b/constants/sprite_constants.asm
@@ -75,3 +75,4 @@ FIRST_STILL_SPRITE EQU const_value
const SPRITE_UNUSED_GAMBLER_ASLEEP_1 ; $46
const SPRITE_UNUSED_GAMBLER_ASLEEP_2 ; $47
const SPRITE_GAMBLER_ASLEEP ; $48
+NUM_SPRITES EQU const_value - 1
diff --git a/constants/tileset_constants.asm b/constants/tileset_constants.asm
index 95473081..446df021 100644
--- a/constants/tileset_constants.asm
+++ b/constants/tileset_constants.asm
@@ -25,3 +25,4 @@
const CLUB ; 21
const FACILITY ; 22
const PLATEAU ; 23
+NUM_TILESETS EQU const_value
diff --git a/constants/trainer_constants.asm b/constants/trainer_constants.asm
index 6fdc5d4e..14b662f3 100644
--- a/constants/trainer_constants.asm
+++ b/constants/trainer_constants.asm
@@ -62,3 +62,4 @@ ENDM
trainer_const CHANNELER ; $2D
trainer_const AGATHA ; $2E
trainer_const LANCE ; $2F
+NUM_TRAINERS EQU const_value - 1
diff --git a/constants/type_constants.asm b/constants/type_constants.asm
index 6ae3408d..24817c20 100644
--- a/constants/type_constants.asm
+++ b/constants/type_constants.asm
@@ -22,3 +22,5 @@ SPECIAL EQU const_value
const PSYCHIC_TYPE ; $18
const ICE ; $19
const DRAGON ; $1A
+
+NUM_TYPES EQU const_value
diff --git a/data/battle/stat_mod_names.asm b/data/battle/stat_mod_names.asm
new file mode 100644
index 00000000..287e87e3
--- /dev/null
+++ b/data/battle/stat_mod_names.asm
@@ -0,0 +1,17 @@
+; Stats that move effects can raise or lower
+; The relevant move effect IDs correspond to the stats
+
+StatModTextStrings:
+ list_start StatModTextStrings
+ li "ATTACK"
+ li "DEFENSE"
+ li "SPEED"
+ li "SPECIAL"
+ assert_list_length SPECIAL_DOWN_SIDE_EFFECT - ATTACK_DOWN_SIDE_EFFECT + 1
+ li "ACCURACY"
+ li "EVADE"
+ assert_list_length NUM_STAT_MODS - 2 ; two bytes are unused
+ assert_list_length EVASION_UP1_EFFECT - ATTACK_UP1_EFFECT + 1
+ assert_list_length EVASION_DOWN1_EFFECT - ATTACK_DOWN1_EFFECT + 1
+ assert_list_length EVASION_UP2_EFFECT - ATTACK_UP2_EFFECT + 1
+ assert_list_length EVASION_DOWN2_EFFECT - ATTACK_DOWN2_EFFECT + 1
diff --git a/data/battle/stat_names.asm b/data/battle/stat_names.asm
index 854780c6..413ab991 100644
--- a/data/battle/stat_names.asm
+++ b/data/battle/stat_names.asm
@@ -1,7 +1,10 @@
-StatsTextStrings:
- db "ATTACK@"
- db "DEFENSE@"
- db "SPEED@"
- db "SPECIAL@"
- db "ACCURACY@"
- db "EVADE@"
+; Stats that vitamins can raise or lower
+
+VitaminStats:
+ list_start VitaminStats
+ li "HEALTH"
+ li "ATTACK"
+ li "DEFENSE"
+ li "SPEED"
+ li "SPECIAL"
+ assert_list_length NUM_STATS
diff --git a/data/battle_anims/base_coords.asm b/data/battle_anims/base_coords.asm
index ad67baff..109a06e8 100644
--- a/data/battle_anims/base_coords.asm
+++ b/data/battle_anims/base_coords.asm
@@ -1,4 +1,5 @@
FrameBlockBaseCoords:
+ table_width 2, FrameBlockBaseCoords
db $10, $68 ; BASECOORD_00
db $10, $70 ; BASECOORD_01
db $10, $78 ; BASECOORD_02
@@ -176,3 +177,4 @@ FrameBlockBaseCoords:
db $18, $4C ; BASECOORD_AE
db $1C, $48 ; BASECOORD_AF
db $48, $28 ; BASECOORD_B0
+ assert_table_length NUM_BASECOORDS
diff --git a/data/battle_anims/frame_blocks.asm b/data/battle_anims/frame_blocks.asm
index 8b9b0919..549c1c3c 100644
--- a/data/battle_anims/frame_blocks.asm
+++ b/data/battle_anims/frame_blocks.asm
@@ -1,4 +1,5 @@
FrameBlockPointers:
+ table_width 2, FrameBlockPointers
dw FrameBlock00
dw FrameBlock01
dw FrameBlock02
@@ -121,6 +122,7 @@ FrameBlockPointers:
dw FrameBlock77
dw FrameBlock78
dw FrameBlock79
+ assert_table_length NUM_FRAMEBLOCKS
FrameBlock01:
db 9 ; #
diff --git a/data/battle_anims/subanimations.asm b/data/battle_anims/subanimations.asm
index bbdc45c0..530192f6 100644
--- a/data/battle_anims/subanimations.asm
+++ b/data/battle_anims/subanimations.asm
@@ -1,4 +1,5 @@
SubanimationPointers:
+ table_width 2, SubanimationPointers
dw Subanimation00
dw Subanimation01
dw Subanimation02
@@ -85,6 +86,7 @@ SubanimationPointers:
dw Subanimation53
dw Subanimation54
dw Subanimation55
+ assert_table_length NUM_SUBANIMS
; format:
; subanim type, count
diff --git a/data/credits/credits_mons.asm b/data/credits/credits_mons.asm
index 23142f9f..5af4a309 100644
--- a/data/credits/credits_mons.asm
+++ b/data/credits/credits_mons.asm
@@ -1,4 +1,5 @@
CreditsMons:
+; one entry per CRED_TEXT_MON or CRED_TEXT_FADE_MON in CreditsOrder
db VENUSAUR
db ARBOK
db RHYHORN
diff --git a/data/credits/credits_text.asm b/data/credits/credits_text.asm
index ded7f5d6..220f8a37 100644
--- a/data/credits/credits_text.asm
+++ b/data/credits/credits_text.asm
@@ -1,5 +1,6 @@
CreditsTextPointers:
; entries correspond to CRED_* constants
+ table_width 2, CreditsTextPointers
dw CredVersion
dw CredTajiri
dw CredTaOota
@@ -64,6 +65,7 @@ CreditsTextPointers:
dw CredFukui
dw CredClub
dw CredPAAD
+ assert_table_length NUM_CRED_STRINGS
CredVersion: ; this 1 byte difference makes all bank addresses offset by 1 in the blue version
IF DEF(_RED)
diff --git a/data/events/trades.asm b/data/events/trades.asm
index 7018c22f..560abfa1 100644
--- a/data/events/trades.asm
+++ b/data/events/trades.asm
@@ -1,5 +1,6 @@
TradeMons:
; entries correspond to TRADE_FOR_* constants
+ table_width 3 + NAME_LENGTH, TradeMons
; give mon, get mon, dialog id, nickname
db NIDORINO, NIDORINA, TRADE_DIALOGSET_CASUAL, "TERRY@@@@@@"
db ABRA, MR_MIME, TRADE_DIALOGSET_CASUAL, "MARCEL@@@@@"
@@ -11,3 +12,4 @@ TradeMons:
db RAICHU, ELECTRODE, TRADE_DIALOGSET_POLITE, "DORIS@@@@@@"
db VENONAT, TANGELA, TRADE_DIALOGSET_HAPPY, "CRINKLES@@@"
db NIDORAN_M, NIDORAN_F, TRADE_DIALOGSET_HAPPY, "SPOT@@@@@@@"
+ assert_table_length NUM_NPC_TRADES
diff --git a/data/growth_rates.asm b/data/growth_rates.asm
index e2cb8c90..cc0955e4 100644
--- a/data/growth_rates.asm
+++ b/data/growth_rates.asm
@@ -11,9 +11,11 @@ ENDM
GrowthRateTable:
; entries correspond to GROWTH_* (see constants/pokemon_data_constants.asm)
+ table_width 4, GrowthRateTable
growth_rate 1, 1, 0, 0, 0 ; Medium Fast
growth_rate 3, 4, 10, 0, 30 ; Slightly Fast
growth_rate 3, 4, 20, 0, 70 ; Slightly Slow
growth_rate 6, 5, -15, 100, 140 ; Medium Slow
growth_rate 4, 5, 0, 0, 0 ; Fast
growth_rate 5, 4, 0, 0, 0 ; Slow
+ assert_table_length NUM_GROWTH_RATES
diff --git a/data/items/key_items.asm b/data/items/key_items.asm
index aca8cf81..13a69ea4 100644
--- a/data/items/key_items.asm
+++ b/data/items/key_items.asm
@@ -17,6 +17,7 @@ ENDC
ENDM
KeyItemBitfield:
+ table_width 1, KeyItemBitfield
key_item_bits \
FALSE, \ ; MASTER_BALL
FALSE, \ ; ULTRA_BALL
@@ -101,3 +102,4 @@ KeyItemBitfield:
FALSE, \ ; MAX_ETHER
FALSE, \ ; ELIXER
FALSE ; MAX_ELIXER
+ assert_table_length (NUM_ITEMS + 7) / 8
diff --git a/data/items/names.asm b/data/items/names.asm
index 0c07fe5d..af51446b 100644
--- a/data/items/names.asm
+++ b/data/items/names.asm
@@ -1,98 +1,101 @@
ItemNames::
- db "MASTER BALL@"
- db "ULTRA BALL@"
- db "GREAT BALL@"
- db "POKé BALL@"
- db "TOWN MAP@"
- db "BICYCLE@"
- db "?????@"
- db "SAFARI BALL@"
- db "POKéDEX@"
- db "MOON STONE@"
- db "ANTIDOTE@"
- db "BURN HEAL@"
- db "ICE HEAL@"
- db "AWAKENING@"
- db "PARLYZ HEAL@"
- db "FULL RESTORE@"
- db "MAX POTION@"
- db "HYPER POTION@"
- db "SUPER POTION@"
- db "POTION@"
- db "BOULDERBADGE@"
- db "CASCADEBADGE@"
- db "THUNDERBADGE@"
- db "RAINBOWBADGE@"
- db "SOULBADGE@"
- db "MARSHBADGE@"
- db "VOLCANOBADGE@"
- db "EARTHBADGE@"
- db "ESCAPE ROPE@"
- db "REPEL@"
- db "OLD AMBER@"
- db "FIRE STONE@"
- db "THUNDERSTONE@"
- db "WATER STONE@"
- db "HP UP@"
- db "PROTEIN@"
- db "IRON@"
- db "CARBOS@"
- db "CALCIUM@"
- db "RARE CANDY@"
- db "DOME FOSSIL@"
- db "HELIX FOSSIL@"
- db "SECRET KEY@"
- db "?????@"
- db "BIKE VOUCHER@"
- db "X ACCURACY@"
- db "LEAF STONE@"
- db "CARD KEY@"
- db "NUGGET@"
- db "PP UP@"
- db "POKé DOLL@"
- db "FULL HEAL@"
- db "REVIVE@"
- db "MAX REVIVE@"
- db "GUARD SPEC.@"
- db "SUPER REPEL@"
- db "MAX REPEL@"
- db "DIRE HIT@"
- db "COIN@"
- db "FRESH WATER@"
- db "SODA POP@"
- db "LEMONADE@"
- db "S.S.TICKET@"
- db "GOLD TEETH@"
- db "X ATTACK@"
- db "X DEFEND@"
- db "X SPEED@"
- db "X SPECIAL@"
- db "COIN CASE@"
- db "OAK's PARCEL@"
- db "ITEMFINDER@"
- db "SILPH SCOPE@"
- db "POKé FLUTE@"
- db "LIFT KEY@"
- db "EXP.ALL@"
- db "OLD ROD@"
- db "GOOD ROD@"
- db "SUPER ROD@"
- db "PP UP@"
- db "ETHER@"
- db "MAX ETHER@"
- db "ELIXER@"
- db "MAX ELIXER@"
- db "B2F@"
- db "B1F@"
- db "1F@"
- db "2F@"
- db "3F@"
- db "4F@"
- db "5F@"
- db "6F@"
- db "7F@"
- db "8F@"
- db "9F@"
- db "10F@"
- db "11F@"
- db "B4F@"
+ list_start ItemNames
+ li "MASTER BALL"
+ li "ULTRA BALL"
+ li "GREAT BALL"
+ li "POKé BALL"
+ li "TOWN MAP"
+ li "BICYCLE"
+ li "?????"
+ li "SAFARI BALL"
+ li "POKéDEX"
+ li "MOON STONE"
+ li "ANTIDOTE"
+ li "BURN HEAL"
+ li "ICE HEAL"
+ li "AWAKENING"
+ li "PARLYZ HEAL"
+ li "FULL RESTORE"
+ li "MAX POTION"
+ li "HYPER POTION"
+ li "SUPER POTION"
+ li "POTION"
+ li "BOULDERBADGE"
+ li "CASCADEBADGE"
+ li "THUNDERBADGE"
+ li "RAINBOWBADGE"
+ li "SOULBADGE"
+ li "MARSHBADGE"
+ li "VOLCANOBADGE"
+ li "EARTHBADGE"
+ li "ESCAPE ROPE"
+ li "REPEL"
+ li "OLD AMBER"
+ li "FIRE STONE"
+ li "THUNDERSTONE"
+ li "WATER STONE"
+ li "HP UP"
+ li "PROTEIN"
+ li "IRON"
+ li "CARBOS"
+ li "CALCIUM"
+ li "RARE CANDY"
+ li "DOME FOSSIL"
+ li "HELIX FOSSIL"
+ li "SECRET KEY"
+ li "?????"
+ li "BIKE VOUCHER"
+ li "X ACCURACY"
+ li "LEAF STONE"
+ li "CARD KEY"
+ li "NUGGET"
+ li "PP UP"
+ li "POKé DOLL"
+ li "FULL HEAL"
+ li "REVIVE"
+ li "MAX REVIVE"
+ li "GUARD SPEC."
+ li "SUPER REPEL"
+ li "MAX REPEL"
+ li "DIRE HIT"
+ li "COIN"
+ li "FRESH WATER"
+ li "SODA POP"
+ li "LEMONADE"
+ li "S.S.TICKET"
+ li "GOLD TEETH"
+ li "X ATTACK"
+ li "X DEFEND"
+ li "X SPEED"
+ li "X SPECIAL"
+ li "COIN CASE"
+ li "OAK's PARCEL"
+ li "ITEMFINDER"
+ li "SILPH SCOPE"
+ li "POKé FLUTE"
+ li "LIFT KEY"
+ li "EXP.ALL"
+ li "OLD ROD"
+ li "GOOD ROD"
+ li "SUPER ROD"
+ li "PP UP"
+ li "ETHER"
+ li "MAX ETHER"
+ li "ELIXER"
+ li "MAX ELIXER"
+ assert_list_length NUM_ITEMS
+ li "B2F"
+ li "B1F"
+ li "1F"
+ li "2F"
+ li "3F"
+ li "4F"
+ li "5F"
+ li "6F"
+ li "7F"
+ li "8F"
+ li "9F"
+ li "10F"
+ li "11F"
+ li "B4F"
+ assert_list_length NUM_ITEMS + NUM_FLOORS
diff --git a/data/items/prices.asm b/data/items/prices.asm
index f3d8f76b..3740df8a 100644
--- a/data/items/prices.asm
+++ b/data/items/prices.asm
@@ -1,4 +1,5 @@
ItemPrices::
+ table_width 3, ItemPrices
money 0 ; MASTER_BALL
money 1200 ; ULTRA_BALL
money 600 ; GREAT_BALL
@@ -82,6 +83,7 @@ ItemPrices::
money 0 ; MAX_ETHER
money 0 ; ELIXER
money 0 ; MAX_ELIXER
+ assert_table_length NUM_ITEMS
money 0 ; FLOOR_B2F
money 0 ; FLOOR_B1F
money 0 ; FLOOR_1F
@@ -96,3 +98,4 @@ ItemPrices::
money 0 ; FLOOR_10F
money 0 ; FLOOR_11F
money 0 ; FLOOR_B4F
+ assert_table_length NUM_ITEMS + NUM_FLOORS
diff --git a/data/items/tm_prices.asm b/data/items/tm_prices.asm
index 7f007e9d..22bcb074 100644
--- a/data/items/tm_prices.asm
+++ b/data/items/tm_prices.asm
@@ -1,5 +1,6 @@
TechnicalMachinePrices:
; In thousands (nybbles).
+ table_width 1, TechnicalMachinePrices
dn 3, 2 ; TM01, TM02
dn 2, 1 ; TM03, TM04
dn 3, 4 ; TM05, TM06
@@ -25,3 +26,4 @@ TechnicalMachinePrices:
dn 2, 4 ; TM45, TM46
dn 3, 4 ; TM47, TM48
dn 4, 2 ; TM49, TM50
+ assert_table_length (NUM_TMS + 1) / 2
diff --git a/data/maps/hide_show_data.asm b/data/maps/hide_show_data.asm
index fa0599f4..f54e484a 100644
--- a/data/maps/hide_show_data.asm
+++ b/data/maps/hide_show_data.asm
@@ -2,6 +2,7 @@
MapHSPointers:
; entries correspond to map ids
+ table_width 2, MapHSPointers
dw PalletTownHS
dw ViridianCityHS
dw PewterCityHS
@@ -250,6 +251,7 @@ MapHSPointers:
dw NoHS
dw NoHS
dw NoHS
+ assert_table_length NUM_MAPS
dw -1 ; end
NoHS:
@@ -257,6 +259,7 @@ NoHS:
MissableObjects:
; entries correspond to HS_* constants (see constants/hide_show_constants)
+ table_width 3, MissableObjects
; format: map id, object id, HIDE/SHOW
PalletTownHS:
@@ -562,3 +565,4 @@ SeafoamIslandsB4FHS:
db SEAFOAM_ISLANDS_B4F, $02, HIDE
db SEAFOAM_ISLANDS_B4F, $03, SHOW
db $FF, $01, SHOW ; end
+ assert_table_length NUM_HS_OBJECTS + 1
diff --git a/data/maps/map_header_banks.asm b/data/maps/map_header_banks.asm
index d698cfee..87ec01cf 100644
--- a/data/maps/map_header_banks.asm
+++ b/data/maps/map_header_banks.asm
@@ -1,5 +1,6 @@
; see also MapHeaderPointers
MapHeaderBanks::
+ table_width 1, MapHeaderBanks
db BANK(PalletTown_h)
db BANK(ViridianCity_h)
db BANK(PewterCity_h)
@@ -248,3 +249,4 @@ MapHeaderBanks::
db BANK(LoreleisRoom_h)
db BANK(BrunosRoom_h)
db BANK(AgathasRoom_h)
+ assert_table_length NUM_MAPS
diff --git a/data/maps/map_header_pointers.asm b/data/maps/map_header_pointers.asm
index 9d85eaae..44457ce6 100644
--- a/data/maps/map_header_pointers.asm
+++ b/data/maps/map_header_pointers.asm
@@ -1,5 +1,6 @@
; see also MapHeaderBanks
MapHeaderPointers::
+ table_width 2, MapHeaderPointers
dw PalletTown_h
dw ViridianCity_h
dw PewterCity_h
@@ -247,4 +248,5 @@ MapHeaderPointers::
dw SilphCo2F_h ; UNUSED_MAP_F4
dw LoreleisRoom_h
dw BrunosRoom_h
- dw AgathasRoom_h ;247
+ dw AgathasRoom_h
+ assert_table_length NUM_MAPS
diff --git a/data/maps/names.asm b/data/maps/names.asm
index 6bdb66d5..805c57c9 100644
--- a/data/maps/names.asm
+++ b/data/maps/names.asm
@@ -1,4 +1,3 @@
-MapNames:
PalletTownName: db "PALLET TOWN@"
ViridianCityName: db "VIRIDIAN CITY@"
PewterCityName: db "PEWTER CITY@"
diff --git a/data/maps/songs.asm b/data/maps/songs.asm
index 28e17223..111b87b8 100644
--- a/data/maps/songs.asm
+++ b/data/maps/songs.asm
@@ -1,4 +1,5 @@
MapSongBanks::
+ table_width 2, MapSongBanks
db MUSIC_PALLET_TOWN, BANK(Music_PalletTown) ; PALLET_TOWN
db MUSIC_CITIES1, BANK(Music_Cities1) ; VIRIDIAN_CITY
db MUSIC_CITIES1, BANK(Music_Cities1) ; PEWTER_CITY
@@ -247,3 +248,4 @@ MapSongBanks::
db MUSIC_GYM, BANK(Music_Gym) ; LORELEIS_ROOM
db MUSIC_DUNGEON1, BANK(Music_Dungeon1) ; BRUNOS_ROOM
db MUSIC_POKEMON_TOWER, BANK(Music_PokemonTower) ; AGATHAS_ROOM
+ assert_table_length NUM_MAPS
diff --git a/data/maps/sprite_sets.asm b/data/maps/sprite_sets.asm
index b2c9371c..6aad2958 100644
--- a/data/maps/sprite_sets.asm
+++ b/data/maps/sprite_sets.asm
@@ -1,4 +1,5 @@
MapSpriteSets:
+ table_width 1, MapSpriteSets
db $01 ; PALLET_TOWN
db $01 ; VIRIDIAN_CITY
db $02 ; PEWTER_CITY
@@ -36,6 +37,7 @@ MapSpriteSets:
db $06 ; ROUTE_23
db $02 ; ROUTE_24
db $02 ; ROUTE_25
+ assert_table_length FIRST_INDOOR_MAP
EAST_WEST EQU 1
NORTH_SOUTH EQU 2
@@ -60,7 +62,12 @@ SplitMapSpriteSets:
db EAST_WEST, 3, $07, $03 ; $fc
SpriteSets:
+
+; each sprite set has 9 walking sprites and 2 still sprites
+SPRITE_SET_LENGTH EQU 9 + 2
+
; sprite set $01
+ table_width 1
db SPRITE_BLUE
db SPRITE_YOUNGSTER
db SPRITE_GIRL
@@ -72,8 +79,10 @@ SpriteSets:
db SPRITE_SWIMMER
db SPRITE_POKE_BALL
db SPRITE_GAMBLER_ASLEEP
+ assert_table_length SPRITE_SET_LENGTH
; sprite set $02
+ table_width 1
db SPRITE_YOUNGSTER
db SPRITE_ROCKET
db SPRITE_SUPER_NERD
@@ -85,8 +94,10 @@ SpriteSets:
db SPRITE_COOLTRAINER_M
db SPRITE_POKE_BALL
db SPRITE_UNUSED_GAMBLER_ASLEEP_2
+ assert_table_length SPRITE_SET_LENGTH
; sprite set $03
+ table_width 1
db SPRITE_LITTLE_GIRL
db SPRITE_GIRL
db SPRITE_SUPER_NERD
@@ -98,8 +109,10 @@ SpriteSets:
db SPRITE_GUARD
db SPRITE_POKE_BALL
db SPRITE_UNUSED_GAMBLER_ASLEEP_2
+ assert_table_length SPRITE_SET_LENGTH
; sprite set $04
+ table_width 1
db SPRITE_BEAUTY
db SPRITE_SUPER_NERD
db SPRITE_YOUNGSTER
@@ -111,8 +124,10 @@ SpriteSets:
db SPRITE_COOLTRAINER_M
db SPRITE_POKE_BALL
db SPRITE_UNUSED_GAMBLER_ASLEEP_2
+ assert_table_length SPRITE_SET_LENGTH
; sprite set $05
+ table_width 1
db SPRITE_LITTLE_GIRL
db SPRITE_LITTLE_BOY
db SPRITE_GIRL
@@ -124,8 +139,10 @@ SpriteSets:
db SPRITE_ROCKET
db SPRITE_POKE_BALL
db SPRITE_SNORLAX
+ assert_table_length SPRITE_SET_LENGTH
; sprite set $06
+ table_width 1
db SPRITE_YOUNGSTER
db SPRITE_GYM_GUIDE
db SPRITE_MONSTER
@@ -137,8 +154,10 @@ SpriteSets:
db SPRITE_GAMBLER
db SPRITE_POKE_BALL
db SPRITE_UNUSED_GAMBLER_ASLEEP_2
+ assert_table_length SPRITE_SET_LENGTH
; sprite set $07
+ table_width 1
db SPRITE_ROCKET
db SPRITE_SCIENTIST
db SPRITE_SILPH_WORKER
@@ -150,8 +169,10 @@ SpriteSets:
db SPRITE_MONSTER
db SPRITE_POKE_BALL
db SPRITE_UNUSED_GAMBLER_ASLEEP_2
+ assert_table_length SPRITE_SET_LENGTH
; sprite set $08
+ table_width 1
db SPRITE_BIKER
db SPRITE_SUPER_NERD
db SPRITE_MIDDLE_AGED_MAN
@@ -163,8 +184,10 @@ SpriteSets:
db SPRITE_MONSTER
db SPRITE_POKE_BALL
db SPRITE_SNORLAX
+ assert_table_length SPRITE_SET_LENGTH
; sprite set $09
+ table_width 1
db SPRITE_BIKER
db SPRITE_COOLTRAINER_M
db SPRITE_SILPH_WORKER
@@ -176,8 +199,10 @@ SpriteSets:
db SPRITE_SUPER_NERD
db SPRITE_POKE_BALL
db SPRITE_SNORLAX
+ assert_table_length SPRITE_SET_LENGTH
; sprite set $0a
+ table_width 1
db SPRITE_BIRD
db SPRITE_COOLTRAINER_M
db SPRITE_FAIRY
@@ -189,3 +214,4 @@ SpriteSets:
db SPRITE_YOUNGSTER
db SPRITE_POKE_BALL
db SPRITE_FOSSIL
+ assert_table_length SPRITE_SET_LENGTH
diff --git a/data/maps/town_map_entries.asm b/data/maps/town_map_entries.asm
index 9b0cde26..fdec1e15 100644
--- a/data/maps/town_map_entries.asm
+++ b/data/maps/town_map_entries.asm
@@ -5,6 +5,7 @@ ENDM
; the appearance of towns and routes in the town map
ExternalMapEntries:
+ table_width 3, ExternalMapEntries
; x, y, name
external_map 2, 11, PalletTownName
external_map 2, 8, ViridianCityName
@@ -43,6 +44,7 @@ ExternalMapEntries:
external_map 0, 6, Route23Name
external_map 10, 1, Route24Name
external_map 11, 0, Route25Name
+ assert_table_length FIRST_INDOOR_MAP
internal_map: MACRO
diff --git a/data/moves/animations.asm b/data/moves/animations.asm
index 8249c50d..0d8a2bd4 100644
--- a/data/moves/animations.asm
+++ b/data/moves/animations.asm
@@ -1,4 +1,5 @@
AttackAnimationPointers:
+ table_width 2, AttackAnimationPointers
dw PoundAnim
dw KarateChopAnim
dw DoubleSlapAnim
@@ -164,6 +165,7 @@ AttackAnimationPointers:
dw SlashAnim
dw SubstituteAnim
dw StruggleAnim
+ assert_table_length NUM_ATTACKS
dw ShowPicAnim
dw EnemyFlashAnim
dw PlayerFlashAnim
@@ -201,6 +203,7 @@ AttackAnimationPointers:
dw HidePicAnim
dw ThrowRockAnim
dw ThrowBaitAnim
+ assert_table_length NUM_ATTACK_ANIMS
dw ZigZagScreenAnim
; each animation is a list of subanimations
diff --git a/data/moves/effects_pointers.asm b/data/moves/effects_pointers.asm
index a5e3d852..c33a5fd6 100644
--- a/data/moves/effects_pointers.asm
+++ b/data/moves/effects_pointers.asm
@@ -1,5 +1,6 @@
MoveEffectPointerTable:
; entries correspond to *_EFFECT constants
+ table_width 2, MoveEffectPointerTable
dw SleepEffect ; EFFECT_01
dw PoisonEffect ; POISON_SIDE_EFFECT1
dw DrainHPEffect ; DRAIN_HP_EFFECT
@@ -86,3 +87,4 @@ MoveEffectPointerTable:
dw LeechSeedEffect ; LEECH_SEED_EFFECT
dw SplashEffect ; SPLASH_EFFECT
dw DisableEffect ; DISABLE_EFFECT
+ assert_table_length NUM_MOVE_EFFECTS
diff --git a/data/moves/field_move_names.asm b/data/moves/field_move_names.asm
index b68ed828..f8966733 100644
--- a/data/moves/field_move_names.asm
+++ b/data/moves/field_move_names.asm
@@ -1,3 +1,4 @@
+; see also FieldMoveDisplayData
FieldMoveNames:
db "CUT@"
db "FLY@"
diff --git a/data/moves/moves.asm b/data/moves/moves.asm
index 85b6dcfc..0e52e01c 100644
--- a/data/moves/moves.asm
+++ b/data/moves/moves.asm
@@ -1,6 +1,3 @@
-Moves:
-; Characteristics of each move.
-
move: MACRO
db \1 ; animation (interchangeable with move id)
db \2 ; effect
@@ -10,8 +7,10 @@ move: MACRO
db \6 ; pp
ENDM
+Moves:
+; Characteristics of each move.
+ table_width MOVE_LENGTH, Moves
move POUND, NO_ADDITIONAL_EFFECT, 40, NORMAL, 100, 35
-MoveEnd:
move KARATE_CHOP, NO_ADDITIONAL_EFFECT, 50, NORMAL, 100, 25
move DOUBLESLAP, TWO_TO_FIVE_ATTACKS_EFFECT, 15, NORMAL, 85, 10
move COMET_PUNCH, TWO_TO_FIVE_ATTACKS_EFFECT, 18, NORMAL, 85, 15
@@ -176,3 +175,4 @@ MoveEnd:
move SLASH, NO_ADDITIONAL_EFFECT, 70, NORMAL, 100, 20
move SUBSTITUTE, SUBSTITUTE_EFFECT, 0, NORMAL, 100, 10
move STRUGGLE, RECOIL_EFFECT, 50, NORMAL, 100, 10
+ assert_table_length NUM_ATTACKS
diff --git a/data/moves/names.asm b/data/moves/names.asm
index cbb1a322..e9591619 100644
--- a/data/moves/names.asm
+++ b/data/moves/names.asm
@@ -1,166 +1,168 @@
MoveNames::
- db "POUND@"
- db "KARATE CHOP@"
- db "DOUBLESLAP@"
- db "COMET PUNCH@"
- db "MEGA PUNCH@"
- db "PAY DAY@"
- db "FIRE PUNCH@"
- db "ICE PUNCH@"
- db "THUNDERPUNCH@"
- db "SCRATCH@"
- db "VICEGRIP@"
- db "GUILLOTINE@"
- db "RAZOR WIND@"
- db "SWORDS DANCE@"
- db "CUT@"
- db "GUST@"
- db "WING ATTACK@"
- db "WHIRLWIND@"
- db "FLY@"
- db "BIND@"
- db "SLAM@"
- db "VINE WHIP@"
- db "STOMP@"
- db "DOUBLE KICK@"
- db "MEGA KICK@"
- db "JUMP KICK@"
- db "ROLLING KICK@"
- db "SAND-ATTACK@"
- db "HEADBUTT@"
- db "HORN ATTACK@"
- db "FURY ATTACK@"
- db "HORN DRILL@"
- db "TACKLE@"
- db "BODY SLAM@"
- db "WRAP@"
- db "TAKE DOWN@"
- db "THRASH@"
- db "DOUBLE-EDGE@"
- db "TAIL WHIP@"
- db "POISON STING@"
- db "TWINEEDLE@"
- db "PIN MISSILE@"
- db "LEER@"
- db "BITE@"
- db "GROWL@"
- db "ROAR@"
- db "SING@"
- db "SUPERSONIC@"
- db "SONICBOOM@"
- db "DISABLE@"
- db "ACID@"
- db "EMBER@"
- db "FLAMETHROWER@"
- db "MIST@"
- db "WATER GUN@"
- db "HYDRO PUMP@"
- db "SURF@"
- db "ICE BEAM@"
- db "BLIZZARD@"
- db "PSYBEAM@"
- db "BUBBLEBEAM@"
- db "AURORA BEAM@"
- db "HYPER BEAM@"
- db "PECK@"
- db "DRILL PECK@"
- db "SUBMISSION@"
- db "LOW KICK@"
- db "COUNTER@"
- db "SEISMIC TOSS@"
- db "STRENGTH@"
- db "ABSORB@"
- db "MEGA DRAIN@"
- db "LEECH SEED@"
- db "GROWTH@"
- db "RAZOR LEAF@"
- db "SOLARBEAM@"
- db "POISONPOWDER@"
- db "STUN SPORE@"
- db "SLEEP POWDER@"
- db "PETAL DANCE@"
- db "STRING SHOT@"
- db "DRAGON RAGE@"
- db "FIRE SPIN@"
- db "THUNDERSHOCK@"
- db "THUNDERBOLT@"
- db "THUNDER WAVE@"
- db "THUNDER@"
- db "ROCK THROW@"
- db "EARTHQUAKE@"
- db "FISSURE@"
- db "DIG@"
- db "TOXIC@"
- db "CONFUSION@"
- db "PSYCHIC@"
- db "HYPNOSIS@"
- db "MEDITATE@"
- db "AGILITY@"
- db "QUICK ATTACK@"
- db "RAGE@"
- db "TELEPORT@"
- db "NIGHT SHADE@"
- db "MIMIC@"
- db "SCREECH@"
- db "DOUBLE TEAM@"
- db "RECOVER@"
- db "HARDEN@"
- db "MINIMIZE@"
- db "SMOKESCREEN@"
- db "CONFUSE RAY@"
- db "WITHDRAW@"
- db "DEFENSE CURL@"
- db "BARRIER@"
- db "LIGHT SCREEN@"
- db "HAZE@"
- db "REFLECT@"
- db "FOCUS ENERGY@"
- db "BIDE@"
- db "METRONOME@"
- db "MIRROR MOVE@"
- db "SELFDESTRUCT@"
- db "EGG BOMB@"
- db "LICK@"
- db "SMOG@"
- db "SLUDGE@"
- db "BONE CLUB@"
- db "FIRE BLAST@"
- db "WATERFALL@"
- db "CLAMP@"
- db "SWIFT@"
- db "SKULL BASH@"
- db "SPIKE CANNON@"
- db "CONSTRICT@"
- db "AMNESIA@"
- db "KINESIS@"
- db "SOFTBOILED@"
- db "HI JUMP KICK@"
- db "GLARE@"
- db "DREAM EATER@"
- db "POISON GAS@"
- db "BARRAGE@"
- db "LEECH LIFE@"
- db "LOVELY KISS@"
- db "SKY ATTACK@"
- db "TRANSFORM@"
- db "BUBBLE@"
- db "DIZZY PUNCH@"
- db "SPORE@"
- db "FLASH@"
- db "PSYWAVE@"
- db "SPLASH@"
- db "ACID ARMOR@"
- db "CRABHAMMER@"
- db "EXPLOSION@"
- db "FURY SWIPES@"
- db "BONEMERANG@"
- db "REST@"
- db "ROCK SLIDE@"
- db "HYPER FANG@"
- db "SHARPEN@"
- db "CONVERSION@"
- db "TRI ATTACK@"
- db "SUPER FANG@"
- db "SLASH@"
- db "SUBSTITUTE@"
- db "STRUGGLE@"
+ list_start MoveNames
+ li "POUND"
+ li "KARATE CHOP"
+ li "DOUBLESLAP"
+ li "COMET PUNCH"
+ li "MEGA PUNCH"
+ li "PAY DAY"
+ li "FIRE PUNCH"
+ li "ICE PUNCH"
+ li "THUNDERPUNCH"
+ li "SCRATCH"
+ li "VICEGRIP"
+ li "GUILLOTINE"
+ li "RAZOR WIND"
+ li "SWORDS DANCE"
+ li "CUT"
+ li "GUST"
+ li "WING ATTACK"
+ li "WHIRLWIND"
+ li "FLY"
+ li "BIND"
+ li "SLAM"
+ li "VINE WHIP"
+ li "STOMP"
+ li "DOUBLE KICK"
+ li "MEGA KICK"
+ li "JUMP KICK"
+ li "ROLLING KICK"
+ li "SAND-ATTACK"
+ li "HEADBUTT"
+ li "HORN ATTACK"
+ li "FURY ATTACK"
+ li "HORN DRILL"
+ li "TACKLE"
+ li "BODY SLAM"
+ li "WRAP"
+ li "TAKE DOWN"
+ li "THRASH"
+ li "DOUBLE-EDGE"
+ li "TAIL WHIP"
+ li "POISON STING"
+ li "TWINEEDLE"
+ li "PIN MISSILE"
+ li "LEER"
+ li "BITE"
+ li "GROWL"
+ li "ROAR"
+ li "SING"
+ li "SUPERSONIC"
+ li "SONICBOOM"
+ li "DISABLE"
+ li "ACID"
+ li "EMBER"
+ li "FLAMETHROWER"
+ li "MIST"
+ li "WATER GUN"
+ li "HYDRO PUMP"
+ li "SURF"
+ li "ICE BEAM"
+ li "BLIZZARD"
+ li "PSYBEAM"
+ li "BUBBLEBEAM"
+ li "AURORA BEAM"
+ li "HYPER BEAM"
+ li "PECK"
+ li "DRILL PECK"
+ li "SUBMISSION"
+ li "LOW KICK"
+ li "COUNTER"
+ li "SEISMIC TOSS"
+ li "STRENGTH"
+ li "ABSORB"
+ li "MEGA DRAIN"
+ li "LEECH SEED"
+ li "GROWTH"
+ li "RAZOR LEAF"
+ li "SOLARBEAM"
+ li "POISONPOWDER"
+ li "STUN SPORE"
+ li "SLEEP POWDER"
+ li "PETAL DANCE"
+ li "STRING SHOT"
+ li "DRAGON RAGE"
+ li "FIRE SPIN"
+ li "THUNDERSHOCK"
+ li "THUNDERBOLT"
+ li "THUNDER WAVE"
+ li "THUNDER"
+ li "ROCK THROW"
+ li "EARTHQUAKE"
+ li "FISSURE"
+ li "DIG"
+ li "TOXIC"
+ li "CONFUSION"
+ li "PSYCHIC"
+ li "HYPNOSIS"
+ li "MEDITATE"
+ li "AGILITY"
+ li "QUICK ATTACK"
+ li "RAGE"
+ li "TELEPORT"
+ li "NIGHT SHADE"
+ li "MIMIC"
+ li "SCREECH"
+ li "DOUBLE TEAM"
+ li "RECOVER"
+ li "HARDEN"
+ li "MINIMIZE"
+ li "SMOKESCREEN"
+ li "CONFUSE RAY"
+ li "WITHDRAW"
+ li "DEFENSE CURL"
+ li "BARRIER"
+ li "LIGHT SCREEN"
+ li "HAZE"
+ li "REFLECT"
+ li "FOCUS ENERGY"
+ li "BIDE"
+ li "METRONOME"
+ li "MIRROR MOVE"
+ li "SELFDESTRUCT"
+ li "EGG BOMB"
+ li "LICK"
+ li "SMOG"
+ li "SLUDGE"
+ li "BONE CLUB"
+ li "FIRE BLAST"
+ li "WATERFALL"
+ li "CLAMP"
+ li "SWIFT"
+ li "SKULL BASH"
+ li "SPIKE CANNON"
+ li "CONSTRICT"
+ li "AMNESIA"
+ li "KINESIS"
+ li "SOFTBOILED"
+ li "HI JUMP KICK"
+ li "GLARE"
+ li "DREAM EATER"
+ li "POISON GAS"
+ li "BARRAGE"
+ li "LEECH LIFE"
+ li "LOVELY KISS"
+ li "SKY ATTACK"
+ li "TRANSFORM"
+ li "BUBBLE"
+ li "DIZZY PUNCH"
+ li "SPORE"
+ li "FLASH"
+ li "PSYWAVE"
+ li "SPLASH"
+ li "ACID ARMOR"
+ li "CRABHAMMER"
+ li "EXPLOSION"
+ li "FURY SWIPES"
+ li "BONEMERANG"
+ li "REST"
+ li "ROCK SLIDE"
+ li "HYPER FANG"
+ li "SHARPEN"
+ li "CONVERSION"
+ li "TRI ATTACK"
+ li "SUPER FANG"
+ li "SLASH"
+ li "SUBSTITUTE"
+ li "STRUGGLE"
+ assert_list_length NUM_ATTACKS
diff --git a/data/moves/sfx.asm b/data/moves/sfx.asm
index c1f12084..c3f01f4e 100644
--- a/data/moves/sfx.asm
+++ b/data/moves/sfx.asm
@@ -1,4 +1,5 @@
MoveSoundTable:
+ table_width 3, MoveSoundTable
; ID, pitch mod, tempo mod
db SFX_POUND, $00, $80 ; POUND
db SFX_BATTLE_0C, $10, $80 ; KARATE_CHOP
@@ -165,4 +166,5 @@ MoveSoundTable:
db SFX_NOT_VERY_EFFECTIVE, $01, $ff ; SLASH
db SFX_BATTLE_2C, $d8, $04 ; SUBSTITUTE
db SFX_BATTLE_0B, $00, $80 ; STRUGGLE
+ assert_table_length NUM_ATTACKS
db SFX_BATTLE_0B, $00, $80
diff --git a/data/moves/tmhm_moves.asm b/data/moves/tmhm_moves.asm
index a5b0bfec..123df8c6 100644
--- a/data/moves/tmhm_moves.asm
+++ b/data/moves/tmhm_moves.asm
@@ -2,6 +2,7 @@
; define constants for the item IDs and for the corresponding move values.
TechnicalMachines:
+ table_width 1, TechnicalMachines
n = 1
REPT NUM_TMS
@@ -14,6 +15,7 @@ ENDC
PURGE MOVE_FOR_TM
n = n + 1
ENDR
+ assert_table_length NUM_TMS
n = 1
REPT NUM_HMS
@@ -26,3 +28,4 @@ ENDC
PURGE MOVE_FOR_HM
n = n + 1
ENDR
+ assert_table_length NUM_TM_HM
diff --git a/data/pokemon/base_stats.asm b/data/pokemon/base_stats.asm
index 91ccbe08..691e75b0 100644
--- a/data/pokemon/base_stats.asm
+++ b/data/pokemon/base_stats.asm
@@ -1,7 +1,6 @@
BaseStats::
-MonBaseStats::
+ table_width BASE_DATA_SIZE, BaseStats
INCLUDE "data/pokemon/base_stats/bulbasaur.asm"
-MonBaseStatsEnd::
INCLUDE "data/pokemon/base_stats/ivysaur.asm"
INCLUDE "data/pokemon/base_stats/venusaur.asm"
INCLUDE "data/pokemon/base_stats/charmander.asm"
@@ -151,5 +150,4 @@ INCLUDE "data/pokemon/base_stats/dratini.asm"
INCLUDE "data/pokemon/base_stats/dragonair.asm"
INCLUDE "data/pokemon/base_stats/dragonite.asm"
INCLUDE "data/pokemon/base_stats/mewtwo.asm"
-BaseStatsEnd::
- assert BaseStatsEnd - BaseStats == (wMonHeaderEnd - wMonHeader) * (NUM_POKEMON - 1) ; discount Mew
+ assert_table_length NUM_POKEMON - 1 ; discount Mew
diff --git a/data/pokemon/cries.asm b/data/pokemon/cries.asm
index e4bf07d9..f823cdef 100644
--- a/data/pokemon/cries.asm
+++ b/data/pokemon/cries.asm
@@ -4,6 +4,7 @@ mon_cry: MACRO
ENDM
CryData::
+ table_width 3, CryData
; base cry, pitch, length
mon_cry SFX_CRY_11, $00, $80 ; Rhydon
mon_cry SFX_CRY_03, $00, $80 ; Kangaskhan
@@ -195,3 +196,4 @@ CryData::
mon_cry SFX_CRY_21, $55, $01 ; Bellsprout
mon_cry SFX_CRY_25, $44, $20 ; Weepinbell
mon_cry SFX_CRY_25, $66, $CC ; Victreebel
+ assert_table_length NUM_POKEMON_INDEXES
diff --git a/data/pokemon/dex_entries.asm b/data/pokemon/dex_entries.asm
index 931793df..c99087e2 100644
--- a/data/pokemon/dex_entries.asm
+++ b/data/pokemon/dex_entries.asm
@@ -1,4 +1,5 @@
PokedexEntryPointers:
+ table_width 2, PokedexEntryPointers
dw RhydonDexEntry
dw KangaskhanDexEntry
dw NidoranMDexEntry
@@ -189,6 +190,7 @@ PokedexEntryPointers:
dw BellsproutDexEntry
dw WeepinbellDexEntry
dw VictreebelDexEntry
+ assert_table_length NUM_POKEMON_INDEXES
; string: species name
; height in feet, inches
diff --git a/data/pokemon/dex_order.asm b/data/pokemon/dex_order.asm
index 0e293946..32e7a79b 100644
--- a/data/pokemon/dex_order.asm
+++ b/data/pokemon/dex_order.asm
@@ -1,4 +1,5 @@
PokedexOrder:
+ table_width 1, PokedexOrder
db DEX_RHYDON
db DEX_KANGASKHAN
db DEX_NIDORAN_M
@@ -189,3 +190,4 @@ PokedexOrder:
db DEX_BELLSPROUT
db DEX_WEEPINBELL
db DEX_VICTREEBEL
+ assert_table_length NUM_POKEMON_INDEXES
diff --git a/data/pokemon/evos_moves.asm b/data/pokemon/evos_moves.asm
index 51f6b244..c5fcc292 100644
--- a/data/pokemon/evos_moves.asm
+++ b/data/pokemon/evos_moves.asm
@@ -2,6 +2,7 @@
; The max number of evolutions per monster is MAX_EVOLUTIONS
EvosMovesPointerTable:
+ table_width 2, EvosMovesPointerTable
dw RhydonEvosMoves
dw KangaskhanEvosMoves
dw NidoranMEvosMoves
@@ -192,6 +193,7 @@ EvosMovesPointerTable:
dw BellsproutEvosMoves
dw WeepinbellEvosMoves
dw VictreebelEvosMoves
+ assert_table_length NUM_POKEMON_INDEXES
RhydonEvosMoves:
; Evolutions
diff --git a/data/pokemon/menu_icons.asm b/data/pokemon/menu_icons.asm
index 471ee846..80a45e49 100644
--- a/data/pokemon/menu_icons.asm
+++ b/data/pokemon/menu_icons.asm
@@ -1,4 +1,5 @@
MonPartyData:
+ table_width 1, MonPartyData
dn ICON_GRASS, ICON_GRASS ; Bulbasaur / Ivysaur
dn ICON_GRASS, ICON_MON ; Venusaur / Charmander
dn ICON_MON, ICON_MON ; Charmeleon / Charizard
@@ -75,3 +76,4 @@ MonPartyData:
dn ICON_SNAKE, ICON_SNAKE ; Dratini / Dragonair
dn ICON_SNAKE, ICON_MON ; Dragonite / Mewtwo
dn ICON_MON, 0 ; Mew / padding
+ assert_table_length (NUM_POKEMON + 1) / 2
diff --git a/data/pokemon/names.asm b/data/pokemon/names.asm
index 83a45b77..56aa9f5d 100644
--- a/data/pokemon/names.asm
+++ b/data/pokemon/names.asm
@@ -1,4 +1,5 @@
MonsterNames::
+ table_width NAME_LENGTH - 1, MonsterNames
db "RHYDON@@@@"
db "KANGASKHAN"
db "NIDORAN♂@@"
@@ -189,3 +190,4 @@ MonsterNames::
db "BELLSPROUT"
db "WEEPINBELL"
db "VICTREEBEL"
+ assert_table_length NUM_POKEMON_INDEXES
diff --git a/data/pokemon/palettes.asm b/data/pokemon/palettes.asm
index 8c4d0bc0..2ce500aa 100644
--- a/data/pokemon/palettes.asm
+++ b/data/pokemon/palettes.asm
@@ -1,4 +1,5 @@
MonsterPalettes:
+ table_width 1, MonsterPalettes
db PAL_MEWMON ; MISSINGNO
db PAL_GREENMON ; BULBASAUR
db PAL_GREENMON ; IVYSAUR
@@ -151,3 +152,4 @@ MonsterPalettes:
db PAL_BROWNMON ; DRAGONITE
db PAL_MEWMON ; MEWTWO
db PAL_MEWMON ; MEW
+ assert_table_length NUM_POKEMON + 1
diff --git a/data/sgb/sgb_palettes.asm b/data/sgb/sgb_palettes.asm
index 7029b4e8..58aba757 100644
--- a/data/sgb/sgb_palettes.asm
+++ b/data/sgb/sgb_palettes.asm
@@ -1,5 +1,6 @@
SuperPalettes:
; entries correspond to PAL_* constants
+ table_width 2 * 4, SuperPalettes
RGB 31,29,31, 21,28,11, 20,26,31, 03,02,02 ; PAL_ROUTE
RGB 31,29,31, 25,28,27, 20,26,31, 03,02,02 ; PAL_PALLET
RGB 31,29,31, 17,26,03, 20,26,31, 03,02,02 ; PAL_VIRIDIAN
@@ -49,3 +50,4 @@ ENDC
RGB 31,29,31, 30,22,17, 11,15,23, 03,02,02 ; PAL_BADGE
RGB 31,29,31, 21,14,09, 18,24,22, 03,02,02 ; PAL_CAVE
RGB 31,29,31, 31,28,14, 24,20,10, 03,02,02 ; PAL_GAMEFREAK
+ assert_table_length NUM_SGB_PALS
diff --git a/data/sprites/sprites.asm b/data/sprites/sprites.asm
index 6b4f2ba0..1cd793c1 100644
--- a/data/sprites/sprites.asm
+++ b/data/sprites/sprites.asm
@@ -5,6 +5,7 @@ overworld_sprite: MACRO
ENDM
SpriteSheetPointerTable:
+ table_width 4, SpriteSheetPointerTable
; graphics, tile count
overworld_sprite RedSprite, 12 ; SPRITE_RED
overworld_sprite BlueSprite, 12 ; SPRITE_BLUE
@@ -78,3 +79,4 @@ SpriteSheetPointerTable:
overworld_sprite GamblerAsleepSprite, 4 ; SPRITE_UNUSED_GAMBLER_ASLEEP_1
overworld_sprite GamblerAsleepSprite, 4 ; SPRITE_UNUSED_GAMBLER_ASLEEP_2
overworld_sprite GamblerAsleepSprite, 4 ; SPRITE_GAMBLER_ASLEEP
+ assert_table_length NUM_SPRITES
diff --git a/data/tilemaps.asm b/data/tilemaps.asm
index 97e687fd..3b1e24c9 100644
--- a/data/tilemaps.asm
+++ b/data/tilemaps.asm
@@ -5,6 +5,7 @@ ENDM
TileIDListPointerTable:
; entries correspond to TILEMAP_* constants (see constants/gfx_constants.asm)
+ table_width 3, TileIDListPointerTable
; tilemap pointer, width, height
tile_ids MonTiles, 7, 7
tile_ids SlideDownMonTiles_7x5, 7, 5
@@ -14,6 +15,7 @@ TileIDListPointerTable:
tile_ids GengarIntroTiles3, 7, 7
tile_ids GameBoyTiles, 6, 8
tile_ids LinkCableTiles, 12, 3
+ assert_table_length NUM_TILEMAPS
DownscaledMonTiles_5x5:
INCBIN "gfx/pokemon/downscaled_5x5.tilemap"
diff --git a/data/tilesets/tileset_headers.asm b/data/tilesets/tileset_headers.asm
index 65fc4fa9..fc1f34e8 100644
--- a/data/tilesets/tileset_headers.asm
+++ b/data/tilesets/tileset_headers.asm
@@ -7,6 +7,7 @@ tileset: MACRO
ENDM
Tilesets:
+ table_width 12, Tilesets
; block, gfx, coll, 3 counter tiles, grass tile, animations
tileset Overworld_Block, Overworld_GFX, Overworld_Coll, $FF,$FF,$FF, $52, TILEANIM_WATER_FLOWER
tileset RedsHouse1_Block, RedsHouse1_GFX, RedsHouse1_Coll, $FF,$FF,$FF, $FF, TILEANIM_NONE
@@ -32,3 +33,4 @@ Tilesets:
tileset Club_Block, Club_GFX, Club_Coll, $07,$17,$FF, $FF, TILEANIM_NONE
tileset Facility_Block, Facility_GFX, Facility_Coll, $12,$FF,$FF, $FF, TILEANIM_WATER
tileset Plateau_Block, Plateau_GFX, Plateau_Coll, $FF,$FF,$FF, $45, TILEANIM_WATER
+ assert_table_length NUM_TILESETS
diff --git a/data/tilesets/warp_tile_ids.asm b/data/tilesets/warp_tile_ids.asm
index db005dcf..94c5397c 100644
--- a/data/tilesets/warp_tile_ids.asm
+++ b/data/tilesets/warp_tile_ids.asm
@@ -1,4 +1,5 @@
WarpTileIDPointers:
+ table_width 2, WarpTileIDPointers
dw .OverworldWarpTileIDs
dw .RedsHouse1WarpTileIDs
dw .MartWarpTileIDs
@@ -23,6 +24,7 @@ WarpTileIDPointers:
dw .ClubWarpTileIDs
dw .FacilityWarpTileIDs
dw .PlateauWarpTileIDs
+ assert_table_length NUM_TILESETS
warp_tiles: MACRO
REPT _NARG
diff --git a/data/trainers/ai_pointers.asm b/data/trainers/ai_pointers.asm
index a3c7a657..a2c6975b 100644
--- a/data/trainers/ai_pointers.asm
+++ b/data/trainers/ai_pointers.asm
@@ -1,4 +1,5 @@
TrainerAIPointers:
+ table_width 3, TrainerAIPointers
; one entry per trainer class
; first byte, number of times (per Pokémon) it can occur
; next two bytes, pointer to AI subroutine for trainer class
@@ -50,3 +51,4 @@ TrainerAIPointers:
dbw 3, GenericAI
dbw 2, AgathaAI ; agatha
dbw 1, LanceAI ; lance
+ assert_table_length NUM_TRAINERS
diff --git a/data/trainers/move_choices.asm b/data/trainers/move_choices.asm
index 6e6df63c..d4900c9f 100644
--- a/data/trainers/move_choices.asm
+++ b/data/trainers/move_choices.asm
@@ -4,10 +4,12 @@ REPT _NARG
shift
ENDR
db 0 ; end
+list_index = list_index + 1
ENDM
; move choice modification methods that are applied for each trainer class
TrainerClassMoveChoiceModifications:
+ list_start TrainerClassMoveChoiceModifications
move_choices ; YOUNGSTER
move_choices 1 ; BUG CATCHER
move_choices 1 ; LASS
@@ -55,3 +57,4 @@ TrainerClassMoveChoiceModifications:
move_choices 1 ; CHANNELER
move_choices 1 ; AGATHA
move_choices 1, 3 ; LANCE
+ assert_list_length NUM_TRAINERS
diff --git a/data/trainers/parties.asm b/data/trainers/parties.asm
index 005cb1dd..dddcf653 100644
--- a/data/trainers/parties.asm
+++ b/data/trainers/parties.asm
@@ -269,7 +269,7 @@ BikerData:
; Route 17
; From https://www.smogon.com/smog/issue27/glitch:
; 0E:5FC2 is offset of the ending 0 for this first Biker on Route 17.
- ; BaseStats + (MonBaseStatsEnd - MonBaseStats) * (000 - 1) = $5FC2;
+ ; BaseStats + (BASE_DATA_SIZE) * (000 - 1) = $5FC2;
; that's the formula from GetMonHeader for the base stats of mon #000.
; (BaseStats = $43DE and BANK(BaseStats) = $0E.)
; Finally, PokedexOrder lists 0 as the dex ID for every MissingNo.
diff --git a/data/trainers/pic_pointers_money.asm b/data/trainers/pic_pointers_money.asm
index d4007394..3143095c 100644
--- a/data/trainers/pic_pointers_money.asm
+++ b/data/trainers/pic_pointers_money.asm
@@ -4,6 +4,7 @@ pic_money: MACRO
ENDM
TrainerPicAndMoneyPointers::
+ table_width 5, TrainerPicAndMoneyPointers
; pic pointer, base reward money
; money received after battle = base money × level of highest-level enemy mon
pic_money YoungsterPic, 1500
@@ -53,3 +54,4 @@ TrainerPicAndMoneyPointers::
pic_money ChannelerPic, 3000
pic_money AgathaPic, 9900
pic_money LancePic, 9900
+ assert_table_length NUM_TRAINERS
diff --git a/data/types/names.asm b/data/types/names.asm
index b1c35f65..b63c072e 100644
--- a/data/types/names.asm
+++ b/data/types/names.asm
@@ -1,4 +1,5 @@
TypeNames:
+ table_width 2, TypeNames
dw .Normal
dw .Fighting
@@ -22,6 +23,8 @@ ENDR
dw .Ice
dw .Dragon
+ assert_table_length NUM_TYPES
+
.Normal: db "NORMAL@"
.Fighting: db "FIGHTING@"
.Flying: db "FLYING@"
diff --git a/data/wild/grass_water.asm b/data/wild/grass_water.asm
index 56ef25c4..1dd8e049 100644
--- a/data/wild/grass_water.asm
+++ b/data/wild/grass_water.asm
@@ -1,4 +1,5 @@
WildDataPointers:
+ table_width 2, WildDataPointers
dw NoMons ; PALLET_TOWN
dw NoMons ; VIRIDIAN_CITY
dw NoMons ; PEWTER_CITY
@@ -247,6 +248,7 @@ WildDataPointers:
dw NoMons
dw NoMons
dw NoMons
+ assert_table_length NUM_MAPS
dw -1 ; end
; wild pokemon data is divided into two parts.
diff --git a/data/wild/maps/CeruleanCave1F.asm b/data/wild/maps/CeruleanCave1F.asm
index eb39c525..ae593741 100644
--- a/data/wild/maps/CeruleanCave1F.asm
+++ b/data/wild/maps/CeruleanCave1F.asm
@@ -1,5 +1,5 @@
DungeonMons1:
- db 10 ; grass encounter rate
+ def_grass_wildmons 10 ; encounter rate
db 46, GOLBAT
db 46, HYPNO
db 46, MAGNETON
@@ -15,5 +15,7 @@ ENDC
db 52, PARASECT
db 53, RAICHU
db 53, DITTO
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/CeruleanCave2F.asm b/data/wild/maps/CeruleanCave2F.asm
index cbdb2eaf..f2648150 100644
--- a/data/wild/maps/CeruleanCave2F.asm
+++ b/data/wild/maps/CeruleanCave2F.asm
@@ -1,5 +1,5 @@
DungeonMons2:
- db 15 ; grass encounter rate
+ def_grass_wildmons 15 ; encounter rate
db 51, DODRIO
db 51, VENOMOTH
db 51, KADABRA
@@ -10,5 +10,7 @@ DungeonMons2:
db 54, WIGGLYTUFF
db 55, DITTO
db 60, DITTO
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/CeruleanCaveB1F.asm b/data/wild/maps/CeruleanCaveB1F.asm
index 86e8fba2..10752548 100644
--- a/data/wild/maps/CeruleanCaveB1F.asm
+++ b/data/wild/maps/CeruleanCaveB1F.asm
@@ -1,5 +1,5 @@
DungeonMonsB1:
- db 25 ; grass encounter rate
+ def_grass_wildmons 25 ; encounter rate
db 55, RHYDON
db 55, MAROWAK
db 55, ELECTRODE
@@ -15,5 +15,7 @@ ENDC
db 65, DITTO
db 63, DITTO
db 67, DITTO
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/DiglettsCave.asm b/data/wild/maps/DiglettsCave.asm
index d1e73af4..e5ba5fa5 100644
--- a/data/wild/maps/DiglettsCave.asm
+++ b/data/wild/maps/DiglettsCave.asm
@@ -1,5 +1,5 @@
CaveMons:
- db 20 ; grass encounter rate
+ def_grass_wildmons 20 ; encounter rate
db 18, DIGLETT
db 19, DIGLETT
db 17, DIGLETT
@@ -10,5 +10,7 @@ CaveMons:
db 22, DIGLETT
db 29, DUGTRIO
db 31, DUGTRIO
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/MtMoon1F.asm b/data/wild/maps/MtMoon1F.asm
index d8c9ba1b..6ecc8f35 100644
--- a/data/wild/maps/MtMoon1F.asm
+++ b/data/wild/maps/MtMoon1F.asm
@@ -1,5 +1,5 @@
MoonMons1:
- db 10 ; grass encounter rate
+ def_grass_wildmons 10 ; encounter rate
db 8, ZUBAT
db 7, ZUBAT
db 9, ZUBAT
@@ -10,5 +10,7 @@ MoonMons1:
db 8, PARAS
db 11, ZUBAT
db 8, CLEFAIRY
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/MtMoonB1F.asm b/data/wild/maps/MtMoonB1F.asm
index 875a7256..ab793cf9 100644
--- a/data/wild/maps/MtMoonB1F.asm
+++ b/data/wild/maps/MtMoonB1F.asm
@@ -1,5 +1,5 @@
MoonMonsB1:
- db 10 ; grass encounter rate
+ def_grass_wildmons 10 ; encounter rate
db 8, ZUBAT
db 7, ZUBAT
db 7, GEODUDE
@@ -10,5 +10,7 @@ MoonMonsB1:
db 11, ZUBAT
db 9, CLEFAIRY
db 9, GEODUDE
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/MtMoonB2F.asm b/data/wild/maps/MtMoonB2F.asm
index ae90ed1e..119b414e 100644
--- a/data/wild/maps/MtMoonB2F.asm
+++ b/data/wild/maps/MtMoonB2F.asm
@@ -1,5 +1,5 @@
MoonMonsB2:
- db 10 ; grass encounter rate
+ def_grass_wildmons 10 ; encounter rate
db 9, ZUBAT
db 9, GEODUDE
db 10, ZUBAT
@@ -10,5 +10,7 @@ MoonMonsB2:
db 10, CLEFAIRY
db 12, ZUBAT
db 12, CLEFAIRY
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/PokemonMansion1F.asm b/data/wild/maps/PokemonMansion1F.asm
index 3be7fb18..d67ceb07 100644
--- a/data/wild/maps/PokemonMansion1F.asm
+++ b/data/wild/maps/PokemonMansion1F.asm
@@ -1,5 +1,5 @@
MansionMons1:
- db 10 ; grass encounter rate
+ def_grass_wildmons 10 ; encounter rate
IF DEF(_RED)
db 32, KOFFING
db 30, KOFFING
@@ -24,5 +24,7 @@ IF DEF(_BLUE)
db 37, MUK
db 39, WEEZING
ENDC
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/PokemonMansion2F.asm b/data/wild/maps/PokemonMansion2F.asm
index 494973b2..01a48f1c 100644
--- a/data/wild/maps/PokemonMansion2F.asm
+++ b/data/wild/maps/PokemonMansion2F.asm
@@ -1,5 +1,5 @@
MansionMons2:
- db 10 ; grass encounter rate
+ def_grass_wildmons 10 ; encounter rate
IF DEF(_RED)
db 32, GROWLITHE
db 34, KOFFING
@@ -24,5 +24,7 @@ IF DEF(_BLUE)
db 39, MUK
db 37, WEEZING
ENDC
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/PokemonMansion3F.asm b/data/wild/maps/PokemonMansion3F.asm
index bbb14213..28c3bf88 100644
--- a/data/wild/maps/PokemonMansion3F.asm
+++ b/data/wild/maps/PokemonMansion3F.asm
@@ -1,5 +1,5 @@
MansionMons3:
- db 10 ; grass encounter rate
+ def_grass_wildmons 10 ; encounter rate
IF DEF(_RED)
db 31, KOFFING
db 33, GROWLITHE
@@ -24,5 +24,7 @@ IF DEF(_BLUE)
db 36, PONYTA
db 42, WEEZING
ENDC
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/PokemonMansionB1F.asm b/data/wild/maps/PokemonMansionB1F.asm
index 77f989b2..2d0312af 100644
--- a/data/wild/maps/PokemonMansionB1F.asm
+++ b/data/wild/maps/PokemonMansionB1F.asm
@@ -1,5 +1,5 @@
MansionMonsB1:
- db 10 ; grass encounter rate
+ def_grass_wildmons 10 ; encounter rate
IF DEF(_RED)
db 33, KOFFING
db 31, KOFFING
@@ -24,5 +24,7 @@ IF DEF(_BLUE)
db 38, MAGMAR
db 42, WEEZING
ENDC
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/PokemonTower1F.asm b/data/wild/maps/PokemonTower1F.asm
index 95bef4a3..5e061298 100644
--- a/data/wild/maps/PokemonTower1F.asm
+++ b/data/wild/maps/PokemonTower1F.asm
@@ -1,4 +1,6 @@
TowerMons1:
- db 0 ; grass encounter rate
+ def_grass_wildmons 0 ; encounter rate
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/PokemonTower2F.asm b/data/wild/maps/PokemonTower2F.asm
index 77b7d415..39794a20 100644
--- a/data/wild/maps/PokemonTower2F.asm
+++ b/data/wild/maps/PokemonTower2F.asm
@@ -1,4 +1,6 @@
TowerMons2:
- db 0 ; grass encounter rate
+ def_grass_wildmons 0 ; encounter rate
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/PokemonTower3F.asm b/data/wild/maps/PokemonTower3F.asm
index 177497e9..ef52127d 100644
--- a/data/wild/maps/PokemonTower3F.asm
+++ b/data/wild/maps/PokemonTower3F.asm
@@ -1,5 +1,5 @@
TowerMons3:
- db 10 ; grass encounter rate
+ def_grass_wildmons 10 ; encounter rate
db 20, GASTLY
db 21, GASTLY
db 22, GASTLY
@@ -10,5 +10,7 @@ TowerMons3:
db 20, CUBONE
db 22, CUBONE
db 25, HAUNTER
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/PokemonTower4F.asm b/data/wild/maps/PokemonTower4F.asm
index b6e82d14..da578f90 100644
--- a/data/wild/maps/PokemonTower4F.asm
+++ b/data/wild/maps/PokemonTower4F.asm
@@ -1,5 +1,5 @@
TowerMons4:
- db 10 ; grass encounter rate
+ def_grass_wildmons 10 ; encounter rate
db 20, GASTLY
db 21, GASTLY
db 22, GASTLY
@@ -10,5 +10,7 @@ TowerMons4:
db 20, CUBONE
db 22, CUBONE
db 24, GASTLY
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/PokemonTower5F.asm b/data/wild/maps/PokemonTower5F.asm
index 03c41eba..cbfc5b7b 100644
--- a/data/wild/maps/PokemonTower5F.asm
+++ b/data/wild/maps/PokemonTower5F.asm
@@ -1,5 +1,5 @@
TowerMons5:
- db 10 ; grass encounter rate
+ def_grass_wildmons 10 ; encounter rate
db 20, GASTLY
db 21, GASTLY
db 22, GASTLY
@@ -10,5 +10,7 @@ TowerMons5:
db 20, CUBONE
db 22, CUBONE
db 24, GASTLY
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/PokemonTower6F.asm b/data/wild/maps/PokemonTower6F.asm
index 38898de1..c8596bbd 100644
--- a/data/wild/maps/PokemonTower6F.asm
+++ b/data/wild/maps/PokemonTower6F.asm
@@ -1,5 +1,5 @@
TowerMons6:
- db 15 ; grass encounter rate
+ def_grass_wildmons 15 ; encounter rate
db 21, GASTLY
db 22, GASTLY
db 23, GASTLY
@@ -10,5 +10,7 @@ TowerMons6:
db 22, CUBONE
db 24, CUBONE
db 28, HAUNTER
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/PokemonTower7F.asm b/data/wild/maps/PokemonTower7F.asm
index b2faa100..85289ad1 100644
--- a/data/wild/maps/PokemonTower7F.asm
+++ b/data/wild/maps/PokemonTower7F.asm
@@ -1,5 +1,5 @@
TowerMons7:
- db 15 ; grass encounter rate
+ def_grass_wildmons 15 ; encounter rate
db 21, GASTLY
db 22, GASTLY
db 23, GASTLY
@@ -10,5 +10,7 @@ TowerMons7:
db 24, CUBONE
db 28, HAUNTER
db 30, HAUNTER
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/PowerPlant.asm b/data/wild/maps/PowerPlant.asm
index f70dfbcb..9950a866 100644
--- a/data/wild/maps/PowerPlant.asm
+++ b/data/wild/maps/PowerPlant.asm
@@ -1,5 +1,5 @@
PowerPlantMons:
- db 10 ; grass encounter rate
+ def_grass_wildmons 10 ; encounter rate
db 21, VOLTORB
db 21, MAGNEMITE
db 20, PIKACHU
@@ -16,5 +16,7 @@ IF DEF(_BLUE)
db 33, RAICHU
db 36, RAICHU
ENDC
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/RockTunnel1F.asm b/data/wild/maps/RockTunnel1F.asm
index 42a6d58b..0b6b07bd 100644
--- a/data/wild/maps/RockTunnel1F.asm
+++ b/data/wild/maps/RockTunnel1F.asm
@@ -1,5 +1,5 @@
TunnelMonsB1:
- db 15 ; grass encounter rate
+ def_grass_wildmons 15 ; encounter rate
db 16, ZUBAT
db 17, ZUBAT
db 17, GEODUDE
@@ -10,5 +10,7 @@ TunnelMonsB1:
db 17, MACHOP
db 13, ONIX
db 15, ONIX
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/RockTunnelB1F.asm b/data/wild/maps/RockTunnelB1F.asm
index 2f970332..f4dad48d 100644
--- a/data/wild/maps/RockTunnelB1F.asm
+++ b/data/wild/maps/RockTunnelB1F.asm
@@ -1,5 +1,5 @@
TunnelMonsB2:
- db 15 ; grass encounter rate
+ def_grass_wildmons 15 ; encounter rate
db 16, ZUBAT
db 17, ZUBAT
db 17, GEODUDE
@@ -10,5 +10,7 @@ TunnelMonsB2:
db 17, ONIX
db 13, ONIX
db 18, GEODUDE
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/Route1.asm b/data/wild/maps/Route1.asm
index e75ded3b..481650a8 100644
--- a/data/wild/maps/Route1.asm
+++ b/data/wild/maps/Route1.asm
@@ -1,5 +1,5 @@
Route1Mons:
- db 25 ; grass encounter rate
+ def_grass_wildmons 25 ; encounter rate
db 3, PIDGEY
db 3, RATTATA
db 3, RATTATA
@@ -10,5 +10,7 @@ Route1Mons:
db 4, RATTATA
db 4, PIDGEY
db 5, PIDGEY
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/Route10.asm b/data/wild/maps/Route10.asm
index 603dc389..5e5a0a95 100644
--- a/data/wild/maps/Route10.asm
+++ b/data/wild/maps/Route10.asm
@@ -1,5 +1,5 @@
Route10Mons:
- db 15 ; grass encounter rate
+ def_grass_wildmons 15 ; encounter rate
db 16, VOLTORB
db 16, SPEAROW
db 14, VOLTORB
@@ -21,5 +21,7 @@ IF DEF(_BLUE)
db 13, SANDSHREW
db 17, SANDSHREW
ENDC
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/Route11.asm b/data/wild/maps/Route11.asm
index ea053c07..853daebf 100644
--- a/data/wild/maps/Route11.asm
+++ b/data/wild/maps/Route11.asm
@@ -1,5 +1,5 @@
Route11Mons:
- db 15 ; grass encounter rate
+ def_grass_wildmons 15 ; encounter rate
IF DEF(_RED)
db 14, EKANS
db 15, SPEAROW
@@ -21,5 +21,7 @@ ENDC
db 17, SPEAROW
db 11, DROWZEE
db 15, DROWZEE
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/Route12.asm b/data/wild/maps/Route12.asm
index acdfe6b6..f4c7911c 100644
--- a/data/wild/maps/Route12.asm
+++ b/data/wild/maps/Route12.asm
@@ -1,5 +1,5 @@
Route12Mons:
- db 15 ; grass encounter rate
+ def_grass_wildmons 15 ; encounter rate
IF DEF(_RED)
db 24, ODDISH
db 25, PIDGEY
@@ -24,5 +24,7 @@ IF DEF(_BLUE)
db 28, WEEPINBELL
db 30, WEEPINBELL
ENDC
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/Route13.asm b/data/wild/maps/Route13.asm
index 4d0c0a46..1af1b533 100644
--- a/data/wild/maps/Route13.asm
+++ b/data/wild/maps/Route13.asm
@@ -1,5 +1,5 @@
Route13Mons:
- db 20 ; grass encounter rate
+ def_grass_wildmons 20 ; encounter rate
IF DEF(_RED)
db 24, ODDISH
db 25, PIDGEY
@@ -24,5 +24,7 @@ IF DEF(_BLUE)
db 28, WEEPINBELL
db 30, WEEPINBELL
ENDC
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/Route14.asm b/data/wild/maps/Route14.asm
index a91631a8..839834ce 100644
--- a/data/wild/maps/Route14.asm
+++ b/data/wild/maps/Route14.asm
@@ -1,5 +1,5 @@
Route14Mons:
- db 15 ; grass encounter rate
+ def_grass_wildmons 15 ; encounter rate
IF DEF(_RED)
db 24, ODDISH
db 26, PIDGEY
@@ -22,5 +22,7 @@ IF DEF(_BLUE)
ENDC
db 28, PIDGEOTTO
db 30, PIDGEOTTO
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/Route15.asm b/data/wild/maps/Route15.asm
index 13bd7f32..7c2a23a5 100644
--- a/data/wild/maps/Route15.asm
+++ b/data/wild/maps/Route15.asm
@@ -1,5 +1,5 @@
Route15Mons:
- db 15 ; grass encounter rate
+ def_grass_wildmons 15 ; encounter rate
IF DEF(_RED)
db 24, ODDISH
db 26, DITTO
@@ -22,5 +22,7 @@ IF DEF(_BLUE)
ENDC
db 28, PIDGEOTTO
db 30, PIDGEOTTO
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/Route16.asm b/data/wild/maps/Route16.asm
index ecab87c1..d9556d72 100644
--- a/data/wild/maps/Route16.asm
+++ b/data/wild/maps/Route16.asm
@@ -1,5 +1,5 @@
Route16Mons:
- db 25 ; grass encounter rate
+ def_grass_wildmons 25 ; encounter rate
db 20, SPEAROW
db 22, SPEAROW
db 18, RATTATA
@@ -10,5 +10,7 @@ Route16Mons:
db 22, RATTATA
db 23, RATICATE
db 25, RATICATE
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/Route17.asm b/data/wild/maps/Route17.asm
index 762b5449..a7a0acc3 100644
--- a/data/wild/maps/Route17.asm
+++ b/data/wild/maps/Route17.asm
@@ -1,5 +1,5 @@
Route17Mons:
- db 25 ; grass encounter rate
+ def_grass_wildmons 25 ; encounter rate
db 20, SPEAROW
db 22, SPEAROW
db 25, RATICATE
@@ -10,5 +10,7 @@ Route17Mons:
db 29, RATICATE
db 25, FEAROW
db 27, FEAROW
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/Route18.asm b/data/wild/maps/Route18.asm
index d8123c5e..66c203cf 100644
--- a/data/wild/maps/Route18.asm
+++ b/data/wild/maps/Route18.asm
@@ -1,5 +1,5 @@
Route18Mons:
- db 25 ; grass encounter rate
+ def_grass_wildmons 25 ; encounter rate
db 20, SPEAROW
db 22, SPEAROW
db 25, RATICATE
@@ -10,5 +10,7 @@ Route18Mons:
db 29, RATICATE
db 27, FEAROW
db 29, FEAROW
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/Route2.asm b/data/wild/maps/Route2.asm
index 035e5b28..7696f5af 100644
--- a/data/wild/maps/Route2.asm
+++ b/data/wild/maps/Route2.asm
@@ -1,5 +1,5 @@
Route2Mons:
- db 25 ; grass encounter rate
+ def_grass_wildmons 25 ; encounter rate
db 3, RATTATA
db 3, PIDGEY
db 4, PIDGEY
@@ -19,5 +19,7 @@ IF DEF(_BLUE)
db 4, CATERPIE
db 5, CATERPIE
ENDC
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/Route21.asm b/data/wild/maps/Route21.asm
index 13ffe445..d1ed0288 100644
--- a/data/wild/maps/Route21.asm
+++ b/data/wild/maps/Route21.asm
@@ -1,5 +1,5 @@
Route21Mons:
- db 25 ; grass encounter rate
+ def_grass_wildmons 25 ; encounter rate
db 21, RATTATA
db 23, PIDGEY
db 30, RATICATE
@@ -10,8 +10,9 @@ Route21Mons:
db 28, TANGELA
db 30, TANGELA
db 32, TANGELA
+ end_grass_wildmons
- db 5 ; water encounter rate
+ def_water_wildmons 5 ; encounter rate
db 5, TENTACOOL
db 10, TENTACOOL
db 15, TENTACOOL
@@ -22,3 +23,4 @@ Route21Mons:
db 30, TENTACOOL
db 35, TENTACOOL
db 40, TENTACOOL
+ end_water_wildmons
diff --git a/data/wild/maps/Route22.asm b/data/wild/maps/Route22.asm
index c8f72608..387130f7 100644
--- a/data/wild/maps/Route22.asm
+++ b/data/wild/maps/Route22.asm
@@ -1,5 +1,5 @@
Route22Mons:
- db 25 ; grass encounter rate
+ def_grass_wildmons 25 ; encounter rate
db 3, RATTATA
IF DEF(_RED)
db 3, NIDORAN_M
@@ -23,5 +23,7 @@ IF DEF(_BLUE)
db 3, NIDORAN_M
db 4, NIDORAN_M
ENDC
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/Route23.asm b/data/wild/maps/Route23.asm
index 77f019a3..36620813 100644
--- a/data/wild/maps/Route23.asm
+++ b/data/wild/maps/Route23.asm
@@ -1,5 +1,5 @@
Route23Mons:
- db 10 ; grass encounter rate
+ def_grass_wildmons 10 ; encounter rate
IF DEF(_RED)
db 26, EKANS
ENDC
@@ -20,5 +20,7 @@ ENDC
db 43, DITTO
db 41, FEAROW
db 43, FEAROW
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/Route24.asm b/data/wild/maps/Route24.asm
index 8ba7d232..63633831 100644
--- a/data/wild/maps/Route24.asm
+++ b/data/wild/maps/Route24.asm
@@ -1,5 +1,5 @@
Route24Mons:
- db 25 ; grass encounter rate
+ def_grass_wildmons 25 ; encounter rate
IF DEF(_RED)
db 7, WEEDLE
db 8, KAKUNA
@@ -21,5 +21,7 @@ ENDC
db 13, PIDGEY
db 8, ABRA
db 12, ABRA
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/Route25.asm b/data/wild/maps/Route25.asm
index 7e0ded65..944e28a8 100644
--- a/data/wild/maps/Route25.asm
+++ b/data/wild/maps/Route25.asm
@@ -1,5 +1,5 @@
Route25Mons:
- db 15 ; grass encounter rate
+ def_grass_wildmons 15 ; encounter rate
IF DEF(_RED)
db 8, WEEDLE
db 9, KAKUNA
@@ -24,5 +24,7 @@ IF DEF(_BLUE)
db 7, KAKUNA
db 8, WEEDLE
ENDC
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/Route3.asm b/data/wild/maps/Route3.asm
index b397b1d1..ebb9e4b4 100644
--- a/data/wild/maps/Route3.asm
+++ b/data/wild/maps/Route3.asm
@@ -1,5 +1,5 @@
Route3Mons:
- db 20 ; grass encounter rate
+ def_grass_wildmons 20 ; encounter rate
db 6, PIDGEY
db 5, SPEAROW
db 7, PIDGEY
@@ -10,5 +10,7 @@ Route3Mons:
db 3, JIGGLYPUFF
db 5, JIGGLYPUFF
db 7, JIGGLYPUFF
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/Route4.asm b/data/wild/maps/Route4.asm
index d4f4763b..4f94a21a 100644
--- a/data/wild/maps/Route4.asm
+++ b/data/wild/maps/Route4.asm
@@ -1,5 +1,5 @@
Route4Mons:
- db 20 ; grass encounter rate
+ def_grass_wildmons 20 ; encounter rate
db 10, RATTATA
db 10, SPEAROW
db 8, RATTATA
@@ -21,4 +21,7 @@ IF DEF(_BLUE)
db 8, SANDSHREW
db 12, SANDSHREW
ENDC
- db 0 ; water encounter rate
+ end_grass_wildmons
+
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/Route5.asm b/data/wild/maps/Route5.asm
index dd200378..6414eefe 100644
--- a/data/wild/maps/Route5.asm
+++ b/data/wild/maps/Route5.asm
@@ -1,5 +1,5 @@
Route5Mons:
- db 15 ; grass encounter rate
+ def_grass_wildmons 15 ; encounter rate
IF DEF(_RED)
db 13, ODDISH
db 13, PIDGEY
@@ -24,5 +24,7 @@ IF DEF(_BLUE)
db 14, MEOWTH
db 16, MEOWTH
ENDC
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/Route6.asm b/data/wild/maps/Route6.asm
index 15585ea4..5c843ec9 100644
--- a/data/wild/maps/Route6.asm
+++ b/data/wild/maps/Route6.asm
@@ -1,5 +1,5 @@
Route6Mons:
- db 15 ; grass encounter rate
+ def_grass_wildmons 15 ; encounter rate
IF DEF(_RED)
db 13, ODDISH
db 13, PIDGEY
@@ -24,5 +24,7 @@ IF DEF(_BLUE)
db 14, MEOWTH
db 16, MEOWTH
ENDC
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/Route7.asm b/data/wild/maps/Route7.asm
index 39508bf0..c0bf1193 100644
--- a/data/wild/maps/Route7.asm
+++ b/data/wild/maps/Route7.asm
@@ -1,5 +1,5 @@
Route7Mons:
- db 15 ; grass encounter rate
+ def_grass_wildmons 15 ; encounter rate
db 19, PIDGEY
IF DEF(_RED)
db 19, ODDISH
@@ -23,5 +23,7 @@ IF DEF(_BLUE)
db 19, MEOWTH
db 20, MEOWTH
ENDC
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/Route8.asm b/data/wild/maps/Route8.asm
index 005ee677..8d2771af 100644
--- a/data/wild/maps/Route8.asm
+++ b/data/wild/maps/Route8.asm
@@ -1,5 +1,5 @@
Route8Mons:
- db 15 ; grass encounter rate
+ def_grass_wildmons 15 ; encounter rate
db 18, PIDGEY
IF DEF(_RED)
db 18, MANKEY
@@ -23,5 +23,7 @@ IF DEF(_BLUE)
db 15, VULPIX
db 18, VULPIX
ENDC
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/Route9.asm b/data/wild/maps/Route9.asm
index a38fc35f..6a1cdca5 100644
--- a/data/wild/maps/Route9.asm
+++ b/data/wild/maps/Route9.asm
@@ -1,5 +1,5 @@
Route9Mons:
- db 15 ; grass encounter rate
+ def_grass_wildmons 15 ; encounter rate
db 16, RATTATA
db 16, SPEAROW
db 14, RATTATA
@@ -21,5 +21,7 @@ IF DEF(_BLUE)
db 13, SANDSHREW
db 17, SANDSHREW
ENDC
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/SafariZoneCenter.asm b/data/wild/maps/SafariZoneCenter.asm
index 4661b927..72be93e0 100644
--- a/data/wild/maps/SafariZoneCenter.asm
+++ b/data/wild/maps/SafariZoneCenter.asm
@@ -1,5 +1,5 @@
ZoneMonsCenter:
- db 30 ; grass encounter rate
+ def_grass_wildmons 30 ; encounter rate
IF DEF(_RED)
db 22, NIDORAN_M
db 25, RHYHORN
@@ -23,5 +23,7 @@ IF DEF(_BLUE)
db 23, PINSIR
ENDC
db 23, CHANSEY
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/SafariZoneEast.asm b/data/wild/maps/SafariZoneEast.asm
index 9910bf12..ea7cbc22 100644
--- a/data/wild/maps/SafariZoneEast.asm
+++ b/data/wild/maps/SafariZoneEast.asm
@@ -1,5 +1,5 @@
ZoneMons1:
- db 30 ; grass encounter rate
+ def_grass_wildmons 30 ; encounter rate
IF DEF(_RED)
db 24, NIDORAN_M
db 26, DODUO
@@ -24,5 +24,7 @@ IF DEF(_BLUE)
db 25, KANGASKHAN
db 28, PINSIR
ENDC
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/SafariZoneNorth.asm b/data/wild/maps/SafariZoneNorth.asm
index 4482571b..864124c3 100644
--- a/data/wild/maps/SafariZoneNorth.asm
+++ b/data/wild/maps/SafariZoneNorth.asm
@@ -1,5 +1,5 @@
ZoneMons2:
- db 30 ; grass encounter rate
+ def_grass_wildmons 30 ; encounter rate
IF DEF(_RED)
db 22, NIDORAN_M
db 26, RHYHORN
@@ -21,5 +21,7 @@ ENDC
db 32, VENOMOTH
db 26, CHANSEY
db 28, TAUROS
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/SafariZoneWest.asm b/data/wild/maps/SafariZoneWest.asm
index c9989cc9..fb8962da 100644
--- a/data/wild/maps/SafariZoneWest.asm
+++ b/data/wild/maps/SafariZoneWest.asm
@@ -1,5 +1,5 @@
ZoneMons3:
- db 30 ; grass encounter rate
+ def_grass_wildmons 30 ; encounter rate
IF DEF(_RED)
db 25, NIDORAN_M
db 26, DODUO
@@ -21,5 +21,7 @@ ENDC
db 31, VENOMOTH
db 26, TAUROS
db 28, KANGASKHAN
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/SeaRoutes.asm b/data/wild/maps/SeaRoutes.asm
index 72ea781d..27793b10 100644
--- a/data/wild/maps/SeaRoutes.asm
+++ b/data/wild/maps/SeaRoutes.asm
@@ -1,7 +1,8 @@
WaterMons:
- db 0 ; grass encounter rate
+ def_grass_wildmons 0 ; encounter rate
+ end_grass_wildmons
- db 5 ; water encounter rate
+ def_water_wildmons 5 ; encounter rate
db 5, TENTACOOL
db 10, TENTACOOL
db 15, TENTACOOL
diff --git a/data/wild/maps/SeafoamIslands1F.asm b/data/wild/maps/SeafoamIslands1F.asm
index b191de13..67c87ce2 100644
--- a/data/wild/maps/SeafoamIslands1F.asm
+++ b/data/wild/maps/SeafoamIslands1F.asm
@@ -1,5 +1,5 @@
IslandMons1:
- db 15 ; grass encounter rate
+ def_grass_wildmons 15 ; encounter rate
db 30, SEEL
IF DEF(_RED)
db 30, SLOWPOKE
@@ -23,5 +23,7 @@ IF DEF(_BLUE)
db 28, STARYU
db 38, SLOWBRO
ENDC
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/SeafoamIslandsB1F.asm b/data/wild/maps/SeafoamIslandsB1F.asm
index 79762821..b2f0f699 100644
--- a/data/wild/maps/SeafoamIslandsB1F.asm
+++ b/data/wild/maps/SeafoamIslandsB1F.asm
@@ -1,5 +1,5 @@
IslandMonsB1:
- db 10 ; grass encounter rate
+ def_grass_wildmons 10 ; encounter rate
IF DEF(_RED)
db 30, STARYU
db 30, HORSEA
@@ -24,5 +24,7 @@ IF DEF(_BLUE)
db 38, DEWGONG
db 37, KINGLER
ENDC
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/SeafoamIslandsB2F.asm b/data/wild/maps/SeafoamIslandsB2F.asm
index e68d71cc..4237fcd1 100644
--- a/data/wild/maps/SeafoamIslandsB2F.asm
+++ b/data/wild/maps/SeafoamIslandsB2F.asm
@@ -1,5 +1,5 @@
IslandMonsB2:
- db 10 ; grass encounter rate
+ def_grass_wildmons 10 ; encounter rate
db 30, SEEL
IF DEF(_RED)
db 30, SLOWPOKE
@@ -23,5 +23,7 @@ IF DEF(_BLUE)
db 30, GOLBAT
db 37, GOLDUCK
ENDC
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/SeafoamIslandsB3F.asm b/data/wild/maps/SeafoamIslandsB3F.asm
index 35319df9..3d29664f 100644
--- a/data/wild/maps/SeafoamIslandsB3F.asm
+++ b/data/wild/maps/SeafoamIslandsB3F.asm
@@ -1,5 +1,5 @@
IslandMonsB3:
- db 10 ; grass encounter rate
+ def_grass_wildmons 10 ; encounter rate
IF DEF(_RED)
db 31, SLOWPOKE
db 31, SEEL
@@ -23,5 +23,7 @@ IF DEF(_BLUE)
db 39, KINGLER
ENDC
db 37, DEWGONG
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/SeafoamIslandsB4F.asm b/data/wild/maps/SeafoamIslandsB4F.asm
index c5e3766b..9bc08333 100644
--- a/data/wild/maps/SeafoamIslandsB4F.asm
+++ b/data/wild/maps/SeafoamIslandsB4F.asm
@@ -1,5 +1,5 @@
IslandMonsB4:
- db 10 ; grass encounter rate
+ def_grass_wildmons 10 ; encounter rate
IF DEF(_RED)
db 31, HORSEA
db 31, SHELLDER
@@ -23,5 +23,7 @@ IF DEF(_BLUE)
db 39, GOLDUCK
ENDC
db 32, GOLBAT
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/VictoryRoad1F.asm b/data/wild/maps/VictoryRoad1F.asm
index 71adde2e..162fef86 100644
--- a/data/wild/maps/VictoryRoad1F.asm
+++ b/data/wild/maps/VictoryRoad1F.asm
@@ -1,5 +1,5 @@
PlateauMons1:
- db 15 ; grass encounter rate
+ def_grass_wildmons 15 ; encounter rate
db 24, MACHOP
db 26, GEODUDE
db 22, ZUBAT
@@ -10,5 +10,7 @@ PlateauMons1:
db 41, GOLBAT
db 42, MACHOKE
db 43, MAROWAK
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/VictoryRoad2F.asm b/data/wild/maps/VictoryRoad2F.asm
index ee660e3a..4cb9e8da 100644
--- a/data/wild/maps/VictoryRoad2F.asm
+++ b/data/wild/maps/VictoryRoad2F.asm
@@ -1,5 +1,5 @@
PlateauMons2:
- db 10 ; grass encounter rate
+ def_grass_wildmons 10 ; encounter rate
db 22, MACHOP
db 24, GEODUDE
db 26, ZUBAT
@@ -10,5 +10,7 @@ PlateauMons2:
db 40, GOLBAT
db 40, MAROWAK
db 43, GRAVELER
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/VictoryRoad3F.asm b/data/wild/maps/VictoryRoad3F.asm
index 754557bf..c525839c 100644
--- a/data/wild/maps/VictoryRoad3F.asm
+++ b/data/wild/maps/VictoryRoad3F.asm
@@ -1,5 +1,5 @@
PlateauMons3:
- db 15 ; grass encounter rate
+ def_grass_wildmons 15 ; encounter rate
db 24, MACHOP
db 26, GEODUDE
db 22, ZUBAT
@@ -10,5 +10,7 @@ PlateauMons3:
db 41, GOLBAT
db 42, MACHOKE
db 45, MACHOKE
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/ViridianForest.asm b/data/wild/maps/ViridianForest.asm
index d11fc34e..71319e71 100644
--- a/data/wild/maps/ViridianForest.asm
+++ b/data/wild/maps/ViridianForest.asm
@@ -1,5 +1,5 @@
ForestMons:
- db 8 ; grass encounter rate
+ def_grass_wildmons 8 ; encounter rate
IF DEF(_RED)
db 4, WEEDLE
db 5, KAKUNA
@@ -22,5 +22,7 @@ IF DEF(_BLUE)
ENDC
db 3, PIKACHU
db 5, PIKACHU
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/wild/maps/nothing.asm b/data/wild/maps/nothing.asm
index 19570b50..1ccba991 100644
--- a/data/wild/maps/nothing.asm
+++ b/data/wild/maps/nothing.asm
@@ -1,4 +1,6 @@
NoMons:
- db 0 ; grass encounter rate
+ def_grass_wildmons 0 ; encounter rate
+ end_grass_wildmons
- db 0 ; water encounter rate
+ def_water_wildmons 0 ; encounter rate
+ end_water_wildmons
diff --git a/data/yes_no_menu_strings.asm b/data/yes_no_menu_strings.asm
index db2eeb4c..e6e23279 100644
--- a/data/yes_no_menu_strings.asm
+++ b/data/yes_no_menu_strings.asm
@@ -5,6 +5,7 @@ ENDM
TwoOptionMenuStrings:
; entries correspond to *_MENU constants
+ table_width 5, TwoOptionMenuStrings
; width, height, blank line before first menu item?, text pointer
two_option_menu 4, 3, FALSE, .YesNoMenu
two_option_menu 6, 3, FALSE, .NorthWestMenu
@@ -14,6 +15,7 @@ TwoOptionMenuStrings:
two_option_menu 7, 3, FALSE, .TradeCancelMenu
two_option_menu 7, 4, TRUE, .HealCancelMenu
two_option_menu 4, 3, FALSE, .NoYesMenu
+ assert_table_length NUM_TWO_OPTION_MENUS
.NoYesMenu:
db "NO"
diff --git a/engine/battle/core.asm b/engine/battle/core.asm
index 433c62df..d9bcdddb 100644
--- a/engine/battle/core.asm
+++ b/engine/battle/core.asm
@@ -1633,7 +1633,7 @@ LoadBattleMonFromParty:
ld bc, wPartyMon1DVs - wPartyMon1OTID
add hl, bc
ld de, wBattleMonDVs
- ld bc, NUM_DVS
+ ld bc, wPartyMon1PP - wPartyMon1DVs
call CopyData
ld de, wBattleMonPP
ld bc, NUM_MOVES
@@ -1677,7 +1677,7 @@ LoadEnemyMonFromParty:
ld bc, wEnemyMon1DVs - wEnemyMon1OTID
add hl, bc
ld de, wEnemyMonDVs
- ld bc, NUM_DVS
+ ld bc, wEnemyMon1PP - wEnemyMon1DVs
call CopyData
ld de, wEnemyMonPP
ld bc, NUM_MOVES
@@ -5101,7 +5101,7 @@ ReloadMoveData:
ld [wd11e], a
dec a
ld hl, Moves
- ld bc, MoveEnd - Moves
+ ld bc, MOVE_LENGTH
call AddNTimes
ld a, BANK(Moves)
call FarCopyData ; copy the move's stats
@@ -5133,7 +5133,7 @@ MetronomePickMove:
call BattleRandom
and a
jr z, .pickMoveLoop
- cp NUM_ATTACKS + 1 ; max normal move number + 1 (this is Struggle's move number)
+ cp NUM_ATTACKS ; max move number (including Struggle)
jr nc, .pickMoveLoop
cp METRONOME
jr z, .pickMoveLoop
@@ -6077,7 +6077,7 @@ GetCurrentMove:
ld [wd0b5], a
dec a
ld hl, Moves
- ld bc, MoveEnd - Moves
+ ld bc, MOVE_LENGTH
call AddNTimes
ld a, BANK(Moves)
call FarCopyData
diff --git a/engine/battle/effects.asm b/engine/battle/effects.asm
index d9690f27..067c096e 100644
--- a/engine/battle/effects.asm
+++ b/engine/battle/effects.asm
@@ -740,7 +740,7 @@ FellText:
text_end
PrintStatText:
- ld hl, StatsTextStrings
+ ld hl, StatModTextStrings
ld c, "@"
.findStatName_outer
dec b
@@ -755,7 +755,7 @@ PrintStatText:
ld bc, $a
jp CopyData
-INCLUDE "data/battle/stat_names.asm"
+INCLUDE "data/battle/stat_mod_names.asm"
INCLUDE "data/battle/stat_modifiers.asm"
diff --git a/engine/battle/trainer_ai.asm b/engine/battle/trainer_ai.asm
index d70f98a1..0117a057 100644
--- a/engine/battle/trainer_ai.asm
+++ b/engine/battle/trainer_ai.asm
@@ -264,7 +264,7 @@ ReadMove:
push bc
dec a
ld hl, Moves
- ld bc, MoveEnd - Moves
+ ld bc, MOVE_LENGTH
call AddNTimes
ld de, wEnemyMoveNum
call CopyData
diff --git a/engine/events/heal_party.asm b/engine/events/heal_party.asm
index 7aaa1bd1..b26bc90f 100644
--- a/engine/events/heal_party.asm
+++ b/engine/events/heal_party.asm
@@ -35,7 +35,7 @@ HealParty:
push bc
ld hl, Moves
- ld bc, MoveEnd - Moves
+ ld bc, MOVE_LENGTH
call AddNTimes
ld de, wcd6d
ld a, BANK(Moves)
diff --git a/engine/items/item_effects.asm b/engine/items/item_effects.asm
index 804a316d..0448866e 100644
--- a/engine/items/item_effects.asm
+++ b/engine/items/item_effects.asm
@@ -1292,7 +1292,7 @@ ItemUseMedicine:
ld [hl], a
pop hl
call .recalculateStats
- ld hl, VitaminText
+ ld hl, VitaminStats
ld a, [wcf91]
sub HP_UP - 1
ld c, a
@@ -1425,12 +1425,7 @@ VitaminNoEffectText:
text_far _VitaminNoEffectText
text_end
-VitaminText:
- db "HEALTH@"
- db "ATTACK@"
- db "DEFENSE@"
- db "SPEED@"
- db "SPECIAL@"
+INCLUDE "data/battle/stat_names.asm"
ItemUseBait:
ld hl, ThrewBaitText
@@ -2490,7 +2485,7 @@ GetMaxPP:
dec a
push hl
ld hl, Moves
- ld bc, MoveEnd - Moves
+ ld bc, MOVE_LENGTH
call AddNTimes
ld de, wcd6d
ld a, BANK(Moves)
diff --git a/engine/pokemon/add_mon.asm b/engine/pokemon/add_mon.asm
index c49a0a77..46a8b2b9 100644
--- a/engine/pokemon/add_mon.asm
+++ b/engine/pokemon/add_mon.asm
@@ -259,7 +259,7 @@ AddPartyMon_WriteMovePP:
push de
push bc
ld hl, Moves
- ld bc, MoveEnd - Moves
+ ld bc, MOVE_LENGTH
call AddNTimes
ld de, wcd6d
ld a, BANK(Moves)
diff --git a/engine/pokemon/evos_moves.asm b/engine/pokemon/evos_moves.asm
index 21b1c9f4..7d5fd469 100644
--- a/engine/pokemon/evos_moves.asm
+++ b/engine/pokemon/evos_moves.asm
@@ -161,7 +161,7 @@ Evolution_PartyMonLoop: ; loop over party mons
ld a, [wd11e]
dec a
ld hl, BaseStats
- ld bc, MonBaseStatsEnd - MonBaseStats
+ ld bc, BASE_DATA_SIZE
call AddNTimes
ld de, wMonHeader
call CopyData
@@ -479,7 +479,7 @@ WriteMonMoves:
push hl
dec a
ld hl, Moves
- ld bc, MoveEnd - Moves
+ ld bc, MOVE_LENGTH
call AddNTimes
ld de, wBuffer
ld a, BANK(Moves)
diff --git a/engine/pokemon/learn_move.asm b/engine/pokemon/learn_move.asm
index 4deb3f0b..fd92ec57 100644
--- a/engine/pokemon/learn_move.asm
+++ b/engine/pokemon/learn_move.asm
@@ -44,7 +44,7 @@ DontAbandonLearning:
push de
dec a
ld hl, Moves
- ld bc, MoveEnd - Moves
+ ld bc, MOVE_LENGTH
call AddNTimes
ld de, wBuffer
ld a, BANK(Moves)
diff --git a/home/pokemon.asm b/home/pokemon.asm
index af83f7a0..4e6e080b 100644
--- a/home/pokemon.asm
+++ b/home/pokemon.asm
@@ -401,11 +401,11 @@ GetMonHeader::
predef IndexToPokedex ; convert pokemon ID in [wd11e] to pokedex number
ld a, [wd11e]
dec a
- ld bc, MonBaseStatsEnd - MonBaseStats
+ ld bc, BASE_DATA_SIZE
ld hl, BaseStats
call AddNTimes
ld de, wMonHeader
- ld bc, MonBaseStatsEnd - MonBaseStats
+ ld bc, BASE_DATA_SIZE
call CopyData
jr .done
.specialID
@@ -419,7 +419,7 @@ GetMonHeader::
.mew
ld hl, MewBaseStats
ld de, wMonHeader
- ld bc, MonBaseStatsEnd - MonBaseStats
+ ld bc, BASE_DATA_SIZE
ld a, BANK(MewBaseStats)
call FarCopyData
.done
diff --git a/macros.asm b/macros.asm
index e8d30a67..4eacddaf 100644
--- a/macros.asm
+++ b/macros.asm
@@ -1,3 +1,4 @@
+INCLUDE "macros/asserts.asm"
INCLUDE "macros/const.asm"
INCLUDE "macros/predef.asm"
INCLUDE "macros/farcall.asm"
diff --git a/macros/asserts.asm b/macros/asserts.asm
new file mode 100644
index 00000000..d04c7942
--- /dev/null
+++ b/macros/asserts.asm
@@ -0,0 +1,87 @@
+; Macros to verify assumptions about the data or code
+
+table_width: MACRO
+CURRENT_TABLE_WIDTH = \1
+IF DEF(CURRENT_TABLE_START)
+PURGE CURRENT_TABLE_START
+ENDC
+IF _NARG == 2
+CURRENT_TABLE_START EQUS "\2"
+ELSE
+CURRENT_TABLE_START EQUS "._table_width\@"
+CURRENT_TABLE_START:
+ENDC
+ENDM
+
+assert_table_length: MACRO
+x = \1
+ ASSERT x * CURRENT_TABLE_WIDTH == @ - CURRENT_TABLE_START, \
+ "{CURRENT_TABLE_START}: expected {d:x} entries, each {d:CURRENT_TABLE_WIDTH} bytes"
+ENDM
+
+list_start: MACRO
+list_index = 0
+IF DEF(CURRENT_LIST_START)
+PURGE CURRENT_LIST_START
+ENDC
+IF _NARG == 1
+CURRENT_LIST_START EQUS "\1"
+ELSE
+CURRENT_LIST_START EQUS "._list_start\@"
+CURRENT_LIST_START:
+ENDC
+ENDM
+
+li: MACRO
+ ASSERT !STRIN(\1, "@"), STRCAT("String terminator \"@\" in list entry: ", \1)
+ db \1, "@"
+list_index = list_index + 1
+ENDM
+
+assert_list_length: MACRO
+x = \1
+ ASSERT x == list_index, \
+ "{CURRENT_LIST_START}: expected {d:x} entries, got {d:list_index}"
+ENDM
+
+def_grass_wildmons: MACRO
+;\1: encounter rate
+if DEF(CURRENT_GRASS_WILDMONS_LABEL)
+PURGE CURRENT_GRASS_WILDMONS_LABEL
+endc
+CURRENT_GRASS_WILDMONS_RATE = \1
+CURRENT_GRASS_WILDMONS_LABEL EQUS "._def_grass_wildmons_\1"
+CURRENT_GRASS_WILDMONS_LABEL:
+ db \1
+ENDM
+
+end_grass_wildmons: MACRO
+ IF CURRENT_GRASS_WILDMONS_RATE == 0
+ assert 1 == @ - CURRENT_GRASS_WILDMONS_LABEL, \
+ "def_grass_wildmons {d:CURRENT_GRASS_WILDMONS_RATE}: expected 1 byte"
+ ELSE
+ assert WILDDATA_LENGTH == @ - CURRENT_GRASS_WILDMONS_LABEL, \
+ "def_grass_wildmons {d:CURRENT_GRASS_WILDMONS_RATE}: expected {d:WILDDATA_LENGTH} bytes"
+ ENDC
+ENDM
+
+def_water_wildmons: MACRO
+;\1: encounter rate
+if DEF(CURRENT_WATER_WILDMONS_LABEL)
+PURGE CURRENT_WATER_WILDMONS_LABEL
+endc
+CURRENT_WATER_WILDMONS_RATE = \1
+CURRENT_WATER_WILDMONS_LABEL EQUS "._def_water_wildmons_\1"
+CURRENT_WATER_WILDMONS_LABEL:
+ db \1
+ENDM
+
+end_water_wildmons: MACRO
+ IF CURRENT_WATER_WILDMONS_RATE == 0
+ assert 1 == @ - CURRENT_WATER_WILDMONS_LABEL, \
+ "def_water_wildmons {d:CURRENT_WATER_WILDMONS_RATE}: expected 1 byte"
+ ELSE
+ assert WILDDATA_LENGTH == @ - CURRENT_WATER_WILDMONS_LABEL, \
+ "def_water_wildmons {d:CURRENT_WATER_WILDMONS_RATE}: expected {d:WILDDATA_LENGTH} bytes"
+ ENDC
+ENDM
diff --git a/macros/const.asm b/macros/const.asm
index 57380e97..3df9ecd8 100644
--- a/macros/const.asm
+++ b/macros/const.asm
@@ -38,3 +38,11 @@ else
const_value = \1
endc
ENDM
+
+rb_skip: MACRO
+IF _NARG == 1
+rsset _RS + \1
+ELSE
+rsset _RS + 1
+ENDC
+ENDM
diff --git a/wram.asm b/wram.asm
index 3b1052d9..26f6f053 100644
--- a/wram.asm
+++ b/wram.asm
@@ -703,7 +703,10 @@ wPlayerMonAccuracyMod::
wPlayerMonEvasionMod::
ds 1
- ds 3
+ ds 2
+wPlayerMonStatModsEnd::
+
+ ds 1
wEnemyMonUnmodifiedLevel::
ds 1
@@ -748,7 +751,10 @@ wEnemyMonEvasionMod::
wInGameTradeReceiveMonSpecies::
ds 1
- ds 2
+ ds 1
+wEnemyMonStatModsEnd::
+
+ ds 1
wNPCMovementDirections2Index::
@@ -1997,6 +2003,7 @@ wMonHGrowthRate::
wMonHLearnset::
; bit field
flag_array NUM_TMS + NUM_HMS
+
ds 1
wMonHeaderEnd::