shithub: pokered

Download patch

ref: 122d715484b79aba71d79caf148bac4a2ec441a5
parent: c57c93d2b2fb06cadafefda37c0974ba1ec9e6c0
parent: 43e0e40d5a4af369661fd6c7aa44d7265b9f6e59
author: Rangi <35663410+Rangi42@users.noreply.github.com>
date: Mon Jul 6 07:52:24 EDT 2020

Merge pull request #261 from Rangi42/master

Port pokecrystal's base data and tmhm structure

--- a/constants.asm
+++ b/constants.asm
@@ -16,12 +16,12 @@
 INCLUDE "constants/pokedex_constants.asm"
 INCLUDE "constants/pokemon_data_constants.asm"
 INCLUDE "constants/trainer_constants.asm"
-INCLUDE "constants/item_constants.asm"
 INCLUDE "constants/type_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/icon_constants.asm"
 INCLUDE "constants/sprite_constants.asm"
 INCLUDE "constants/sprite_data_constants.asm"
--- a/constants/item_constants.asm
+++ b/constants/item_constants.asm
@@ -102,58 +102,115 @@
 
 const_value = $C4
 
-	const HM_01         ; $C4
-	const HM_02         ; $C5
-	const HM_03         ; $C6
-	const HM_04         ; $C7
-	const HM_05         ; $C8
-	const TM_01         ; $C9
-	const TM_02         ; $CA
-	const TM_03         ; $CB
-	const TM_04         ; $CC
-	const TM_05         ; $CD
-	const TM_06         ; $CE
-	const TM_07         ; $CF
-	const TM_08         ; $D0
-	const TM_09         ; $D1
-	const TM_10         ; $D2
-	const TM_11         ; $D3
-	const TM_12         ; $D4
-	const TM_13         ; $D5
-	const TM_14         ; $D6
-	const TM_15         ; $D7
-	const TM_16         ; $D8
-	const TM_17         ; $D9
-	const TM_18         ; $DA
-	const TM_19         ; $DB
-	const TM_20         ; $DC
-	const TM_21         ; $DD
-	const TM_22         ; $DE
-	const TM_23         ; $DF
-	const TM_24         ; $E0
-	const TM_25         ; $E1
-	const TM_26         ; $E2
-	const TM_27         ; $E3
-	const TM_28         ; $E4
-	const TM_29         ; $E5
-	const TM_30         ; $E6
-	const TM_31         ; $E7
-	const TM_32         ; $E8
-	const TM_33         ; $E9
-	const TM_34         ; $EA
-	const TM_35         ; $EB
-	const TM_36         ; $EC
-	const TM_37         ; $ED
-	const TM_38         ; $EE
-	const TM_39         ; $EF
-	const TM_40         ; $F0
-	const TM_41         ; $F1
-	const TM_42         ; $F2
-	const TM_43         ; $F3
-	const TM_44         ; $F4
-	const TM_45         ; $F5
-	const TM_46         ; $F6
-	const TM_47         ; $F7
-	const TM_48         ; $F8
-	const TM_49         ; $F9
-	const TM_50         ; $FA
+; HMs are defined before TMs, so the actual number of TM definitions
+; is not yet available. The TM quantity is hard-coded here and must
+; match the actual number below.
+NUM_TMS EQU 50
+
+add_hm: MACRO
+; Defines three constants:
+; - HM_\1: the item id, starting at $C4
+; - \1_TMNUM: the learnable TM/HM flag, starting at 51
+; - HM##_MOVE: alias for the move id, equal to the value of \1
+; The first usage also defines HM01 as the first HM item id.
+IF !DEF(HM01)
+HM01 EQU const_value
+	enum_start NUM_TMS + 1
+ENDC
+HM_VALUE EQU __enum__ - NUM_TMS
+IF HM_VALUE < 10
+MOVE_FOR_HM EQUS "HM0{d:HM_VALUE}_MOVE"
+ELSE
+MOVE_FOR_HM EQUS "HM{d:HM_VALUE}_MOVE"
+ENDC
+MOVE_FOR_HM = \1
+PURGE MOVE_FOR_HM
+PURGE HM_VALUE
+	const HM_\1
+	enum \1_TMNUM
+ENDM
+
+	add_hm CUT          ; $C4
+	add_hm FLY          ; $C5
+	add_hm SURF         ; $C6
+	add_hm STRENGTH     ; $C7
+	add_hm FLASH        ; $C8
+NUM_HMS EQU const_value - HM01
+
+add_tm: MACRO
+; Defines three constants:
+; - TM_\1: the item id, starting at $C9
+; - \1_TMNUM: the learnable TM/HM flag, starting at 1
+; - TM##_MOVE: alias for the move id, equal to the value of \1
+; The first usage also defines TM01 as the first TM item id.
+IF !DEF(TM01)
+TM01 EQU const_value
+	enum_start 1
+ENDC
+IF __enum__ < 10
+MOVE_FOR_TM EQUS "TM0{d:__enum__}_MOVE"
+ELSE
+MOVE_FOR_TM EQUS "TM{d:__enum__}_MOVE"
+ENDC
+MOVE_FOR_TM = \1
+PURGE MOVE_FOR_TM
+	const TM_\1
+	enum \1_TMNUM
+ENDM
+
+	add_tm MEGA_PUNCH   ; $C9
+	add_tm RAZOR_WIND   ; $CA
+	add_tm SWORDS_DANCE ; $CB
+	add_tm WHIRLWIND    ; $CC
+	add_tm MEGA_KICK    ; $CD
+	add_tm TOXIC        ; $CE
+	add_tm HORN_DRILL   ; $CF
+	add_tm BODY_SLAM    ; $D0
+	add_tm TAKE_DOWN    ; $D1
+	add_tm DOUBLE_EDGE  ; $D2
+	add_tm BUBBLEBEAM   ; $D3
+	add_tm WATER_GUN    ; $D4
+	add_tm ICE_BEAM     ; $D5
+	add_tm BLIZZARD     ; $D6
+	add_tm HYPER_BEAM   ; $D7
+	add_tm PAY_DAY      ; $D8
+	add_tm SUBMISSION   ; $D9
+	add_tm COUNTER      ; $DA
+	add_tm SEISMIC_TOSS ; $DB
+	add_tm RAGE         ; $DC
+	add_tm MEGA_DRAIN   ; $DD
+	add_tm SOLARBEAM    ; $DE
+	add_tm DRAGON_RAGE  ; $DF
+	add_tm THUNDERBOLT  ; $E0
+	add_tm THUNDER      ; $E1
+	add_tm EARTHQUAKE   ; $E2
+	add_tm FISSURE      ; $E3
+	add_tm DIG          ; $E4
+	add_tm PSYCHIC_M    ; $E5
+	add_tm TELEPORT     ; $E6
+	add_tm MIMIC        ; $E7
+	add_tm DOUBLE_TEAM  ; $E8
+	add_tm REFLECT      ; $E9
+	add_tm BIDE         ; $EA
+	add_tm METRONOME    ; $EB
+	add_tm SELFDESTRUCT ; $EC
+	add_tm EGG_BOMB     ; $ED
+	add_tm FIRE_BLAST   ; $EE
+	add_tm SWIFT        ; $EF
+	add_tm SKULL_BASH   ; $F0
+	add_tm SOFTBOILED   ; $F1
+	add_tm DREAM_EATER  ; $F2
+	add_tm SKY_ATTACK   ; $F3
+	add_tm REST         ; $F4
+	add_tm THUNDER_WAVE ; $F5
+	add_tm PSYWAVE      ; $F6
+	add_tm EXPLOSION    ; $F7
+	add_tm ROCK_SLIDE   ; $F8
+	add_tm TRI_ATTACK   ; $F9
+	add_tm SUBSTITUTE   ; $FA
+assert NUM_TMS == const_value - TM01, "NUM_TMS ({d:NUM_TMS}) does not match the number of add_tm definitions"
+
+; 50 TMs + 5 HMs = 55 learnable TM/HM flags per Pokémon.
+; These fit in 7 bytes, with one unused bit left over.
+	enum_start NUM_TMS + NUM_HMS + 1
+	enum UNUSED_TMNUM
--- a/data/events/prizes.asm
+++ b/data/events/prizes.asm
@@ -60,9 +60,9 @@
 	db "@"
 
 PrizeMenuTMsEntries:
-	db TM_23
-	db TM_15
-	db TM_50
+	db TM_DRAGON_RAGE
+	db TM_HYPER_BEAM
+	db TM_SUBSTITUTE
 	db "@"
 
 PrizeMenuTMsCost:
--- a/data/items/marts.asm
+++ b/data/items/marts.asm
@@ -30,7 +30,7 @@
 
 ; Celadon Dept. Store 2F (2)
 CeladonMart2Clerk2Text::
-	script_mart TM_32, TM_33, TM_02, TM_07, TM_37, TM_01, TM_05, TM_09, TM_17
+	script_mart TM_DOUBLE_TEAM, TM_REFLECT, TM_RAZOR_WIND, TM_HORN_DRILL, TM_EGG_BOMB, TM_MEGA_PUNCH, TM_MEGA_KICK, TM_TAKE_DOWN, TM_SUBMISSION
 
 ; Celadon Dept. Store 4F
 CeladonMart4ClerkText::
--- a/data/items/tm_prices.asm
+++ b/data/items/tm_prices.asm
@@ -1,27 +1,27 @@
 TechnicalMachinePrices:
 ; In thousands (nybbles).
-	dn 3, 2  ; TM_01, TM_02
-	dn 2, 1  ; TM_03, TM_04
-	dn 3, 4  ; TM_05, TM_06
-	dn 2, 4  ; TM_07, TM_08
-	dn 3, 4  ; TM_09, TM_10
-	dn 2, 1  ; TM_11, TM_12
-	dn 4, 5  ; TM_13, TM_14
-	dn 5, 5  ; TM_15, TM_16
-	dn 3, 2  ; TM_17, TM_18
-	dn 3, 2  ; TM_19, TM_20
-	dn 5, 5  ; TM_21, TM_22
-	dn 5, 2  ; TM_23, TM_24
-	dn 5, 4  ; TM_25, TM_26
-	dn 5, 2  ; TM_27, TM_28
-	dn 4, 1  ; TM_29, TM_30
-	dn 2, 1  ; TM_31, TM_32
-	dn 1, 2  ; TM_33, TM_34
-	dn 4, 2  ; TM_35, TM_36
-	dn 2, 5  ; TM_37, TM_38
-	dn 2, 4  ; TM_39, TM_40
-	dn 2, 2  ; TM_41, TM_42
-	dn 5, 2  ; TM_43, TM_44
-	dn 2, 4  ; TM_45, TM_46
-	dn 3, 4  ; TM_47, TM_48
-	dn 4, 2  ; TM_49, TM_50
+	dn 3, 2  ; TM01, TM02
+	dn 2, 1  ; TM03, TM04
+	dn 3, 4  ; TM05, TM06
+	dn 2, 4  ; TM07, TM08
+	dn 3, 4  ; TM09, TM10
+	dn 2, 1  ; TM11, TM12
+	dn 4, 5  ; TM13, TM14
+	dn 5, 5  ; TM15, TM16
+	dn 3, 2  ; TM17, TM18
+	dn 3, 2  ; TM19, TM20
+	dn 5, 5  ; TM21, TM22
+	dn 5, 2  ; TM23, TM24
+	dn 5, 4  ; TM25, TM26
+	dn 5, 2  ; TM27, TM28
+	dn 4, 1  ; TM29, TM30
+	dn 2, 1  ; TM31, TM32
+	dn 1, 2  ; TM33, TM34
+	dn 4, 2  ; TM35, TM36
+	dn 2, 5  ; TM37, TM38
+	dn 2, 4  ; TM39, TM40
+	dn 2, 2  ; TM41, TM42
+	dn 5, 2  ; TM43, TM44
+	dn 2, 4  ; TM45, TM46
+	dn 3, 4  ; TM47, TM48
+	dn 4, 2  ; TM49, TM50
--- a/data/maps/objects/MtMoon1F.asm
+++ b/data/maps/objects/MtMoon1F.asm
@@ -24,7 +24,7 @@
 	object SPRITE_BALL, 35, 31, STAY, NONE, 10, RARE_CANDY
 	object SPRITE_BALL, 36, 23, STAY, NONE, 11, ESCAPE_ROPE
 	object SPRITE_BALL, 20, 33, STAY, NONE, 12, POTION
-	object SPRITE_BALL, 5, 32, STAY, NONE, 13, TM_12
+	object SPRITE_BALL, 5, 32, STAY, NONE, 13, TM_WATER_GUN
 
 	; warp-to
 	warp_to 14, 35, MT_MOON_1F_WIDTH
--- a/data/maps/objects/MtMoonB2F.asm
+++ b/data/maps/objects/MtMoonB2F.asm
@@ -18,7 +18,7 @@
 	object SPRITE_OMANYTE, 12, 6, STAY, NONE, 6 ; person
 	object SPRITE_OMANYTE, 13, 6, STAY, NONE, 7 ; person
 	object SPRITE_BALL, 25, 21, STAY, NONE, 8, HP_UP
-	object SPRITE_BALL, 29, 5, STAY, NONE, 9, TM_01
+	object SPRITE_BALL, 29, 5, STAY, NONE, 9, TM_MEGA_PUNCH
 
 	; warp-to
 	warp_to 25, 9, MT_MOON_B2F_WIDTH ; MT_MOON_B1F
--- a/data/maps/objects/PokemonMansionB1F.asm
+++ b/data/maps/objects/PokemonMansionB1F.asm
@@ -11,8 +11,8 @@
 	object SPRITE_OAK_AIDE, 27, 11, STAY, DOWN, 2, OPP_SCIENTIST, 13
 	object SPRITE_BALL, 10, 2, STAY, NONE, 3, RARE_CANDY
 	object SPRITE_BALL, 1, 22, STAY, NONE, 4, FULL_RESTORE
-	object SPRITE_BALL, 19, 25, STAY, NONE, 5, TM_14
-	object SPRITE_BALL, 5, 4, STAY, NONE, 6, TM_22
+	object SPRITE_BALL, 19, 25, STAY, NONE, 5, TM_BLIZZARD
+	object SPRITE_BALL, 5, 4, STAY, NONE, 6, TM_SOLARBEAM
 	object SPRITE_BOOK_MAP_DEX, 16, 20, STAY, NONE, 7 ; person
 	object SPRITE_BALL, 5, 13, STAY, NONE, 8, SECRET_KEY
 
--- a/data/maps/objects/PowerPlant.asm
+++ b/data/maps/objects/PowerPlant.asm
@@ -21,8 +21,8 @@
 	object SPRITE_BALL, 7, 25, STAY, NONE, 10, CARBOS
 	object SPRITE_BALL, 28, 3, STAY, NONE, 11, HP_UP
 	object SPRITE_BALL, 34, 3, STAY, NONE, 12, RARE_CANDY
-	object SPRITE_BALL, 26, 32, STAY, NONE, 13, TM_25
-	object SPRITE_BALL, 20, 32, STAY, NONE, 14, TM_33
+	object SPRITE_BALL, 26, 32, STAY, NONE, 13, TM_THUNDER
+	object SPRITE_BALL, 20, 32, STAY, NONE, 14, TM_REFLECT
 
 	; warp-to
 	warp_to 4, 35, POWER_PLANT_WIDTH
--- a/data/maps/objects/RocketHideoutB2F.asm
+++ b/data/maps/objects/RocketHideoutB2F.asm
@@ -14,7 +14,7 @@
 	object SPRITE_ROCKET, 20, 12, STAY, DOWN, 1, OPP_ROCKET, 13
 	object SPRITE_BALL, 1, 11, STAY, NONE, 2, MOON_STONE
 	object SPRITE_BALL, 16, 8, STAY, NONE, 3, NUGGET
-	object SPRITE_BALL, 6, 12, STAY, NONE, 4, TM_07
+	object SPRITE_BALL, 6, 12, STAY, NONE, 4, TM_HORN_DRILL
 	object SPRITE_BALL, 3, 21, STAY, NONE, 5, SUPER_POTION
 
 	; warp-to
--- a/data/maps/objects/RocketHideoutB3F.asm
+++ b/data/maps/objects/RocketHideoutB3F.asm
@@ -10,7 +10,7 @@
 	db 4 ; objects
 	object SPRITE_ROCKET, 10, 22, STAY, RIGHT, 1, OPP_ROCKET, 14
 	object SPRITE_ROCKET, 26, 12, STAY, UP, 2, OPP_ROCKET, 15
-	object SPRITE_BALL, 26, 17, STAY, NONE, 3, TM_10
+	object SPRITE_BALL, 26, 17, STAY, NONE, 3, TM_DOUBLE_EDGE
 	object SPRITE_BALL, 20, 14, STAY, NONE, 4, RARE_CANDY
 
 	; warp-to
--- a/data/maps/objects/RocketHideoutB4F.asm
+++ b/data/maps/objects/RocketHideoutB4F.asm
@@ -14,7 +14,7 @@
 	object SPRITE_ROCKET, 26, 12, STAY, DOWN, 3, OPP_ROCKET, 17
 	object SPRITE_ROCKET, 11, 2, STAY, DOWN, 4, OPP_ROCKET, 18
 	object SPRITE_BALL, 10, 12, STAY, NONE, 5, HP_UP
-	object SPRITE_BALL, 9, 4, STAY, NONE, 6, TM_02
+	object SPRITE_BALL, 9, 4, STAY, NONE, 6, TM_RAZOR_WIND
 	object SPRITE_BALL, 12, 20, STAY, NONE, 7, IRON
 	object SPRITE_BALL, 25, 2, STAY, NONE, 8, SILPH_SCOPE
 	object SPRITE_BALL, 10, 2, STAY, NONE, 9, LIFT_KEY
--- a/data/maps/objects/Route12.asm
+++ b/data/maps/objects/Route12.asm
@@ -20,7 +20,7 @@
 	object SPRITE_FISHER2, 12, 40, STAY, LEFT, 6, OPP_FISHER, 5
 	object SPRITE_FISHER2, 9, 52, STAY, RIGHT, 7, OPP_FISHER, 6
 	object SPRITE_FISHER2, 6, 87, STAY, DOWN, 8, OPP_FISHER, 11
-	object SPRITE_BALL, 14, 35, STAY, NONE, 9, TM_16
+	object SPRITE_BALL, 14, 35, STAY, NONE, 9, TM_PAY_DAY
 	object SPRITE_BALL, 5, 89, STAY, NONE, 10, IRON
 
 	; warp-to
--- a/data/maps/objects/Route15.asm
+++ b/data/maps/objects/Route15.asm
@@ -21,7 +21,7 @@
 	object SPRITE_BIKER, 46, 10, STAY, DOWN, 8, OPP_BIKER, 4
 	object SPRITE_LASS, 37, 5, STAY, RIGHT, 9, OPP_JR_TRAINER_F, 22
 	object SPRITE_LASS, 18, 13, STAY, UP, 10, OPP_JR_TRAINER_F, 23
-	object SPRITE_BALL, 18, 5, STAY, NONE, 11, TM_20
+	object SPRITE_BALL, 18, 5, STAY, NONE, 11, TM_RAGE
 
 	; warp-to
 	warp_to 7, 8, ROUTE_15_WIDTH ; ROUTE_15_GATE_1F
--- a/data/maps/objects/Route24.asm
+++ b/data/maps/objects/Route24.asm
@@ -13,4 +13,4 @@
 	object SPRITE_BUG_CATCHER, 11, 25, STAY, LEFT, 5, OPP_YOUNGSTER, 4
 	object SPRITE_LASS, 10, 28, STAY, RIGHT, 6, OPP_LASS, 8
 	object SPRITE_BUG_CATCHER, 11, 31, STAY, LEFT, 7, OPP_BUG_CATCHER, 9
-	object SPRITE_BALL, 10, 5, STAY, NONE, 8, TM_45
+	object SPRITE_BALL, 10, 5, STAY, NONE, 8, TM_THUNDER_WAVE
--- a/data/maps/objects/Route25.asm
+++ b/data/maps/objects/Route25.asm
@@ -17,7 +17,7 @@
 	object SPRITE_HIKER, 8, 4, STAY, RIGHT, 7, OPP_HIKER, 2
 	object SPRITE_HIKER, 23, 9, STAY, UP, 8, OPP_HIKER, 3
 	object SPRITE_HIKER, 13, 7, STAY, RIGHT, 9, OPP_HIKER, 4
-	object SPRITE_BALL, 22, 2, STAY, NONE, 10, TM_19
+	object SPRITE_BALL, 22, 2, STAY, NONE, 10, TM_SEISMIC_TOSS
 
 	; warp-to
 	warp_to 45, 3, ROUTE_25_WIDTH ; BILLS_HOUSE
--- a/data/maps/objects/Route4.asm
+++ b/data/maps/objects/Route4.asm
@@ -14,7 +14,7 @@
 	db 3 ; objects
 	object SPRITE_LASS, 9, 8, WALK, 0, 1 ; person
 	object SPRITE_LASS, 63, 3, STAY, RIGHT, 2, OPP_LASS, 4
-	object SPRITE_BALL, 57, 3, STAY, NONE, 3, TM_04
+	object SPRITE_BALL, 57, 3, STAY, NONE, 3, TM_WHIRLWIND
 
 	; warp-to
 	warp_to 11, 5, ROUTE_4_WIDTH ; MT_MOON_POKECENTER
--- a/data/maps/objects/Route9.asm
+++ b/data/maps/objects/Route9.asm
@@ -16,4 +16,4 @@
 	object SPRITE_BUG_CATCHER, 22, 2, STAY, DOWN, 7, OPP_BUG_CATCHER, 13
 	object SPRITE_HIKER, 45, 15, STAY, RIGHT, 8, OPP_HIKER, 5
 	object SPRITE_BUG_CATCHER, 40, 8, STAY, RIGHT, 9, OPP_BUG_CATCHER, 14
-	object SPRITE_BALL, 10, 15, STAY, NONE, 10, TM_30
+	object SPRITE_BALL, 10, 15, STAY, NONE, 10, TM_TELEPORT
--- a/data/maps/objects/SSAnne1FRooms.asm
+++ b/data/maps/objects/SSAnne1FRooms.asm
@@ -21,7 +21,7 @@
 	object SPRITE_LITTLE_GIRL, 2, 11, STAY, DOWN, 7 ; person
 	object SPRITE_CLEFAIRY, 3, 11, STAY, DOWN, 8 ; person
 	object SPRITE_GIRL, 10, 13, STAY, RIGHT, 9 ; person
-	object SPRITE_BALL, 12, 15, STAY, NONE, 10, TM_08
+	object SPRITE_BALL, 12, 15, STAY, NONE, 10, TM_BODY_SLAM
 	object SPRITE_GENTLEMAN, 21, 13, WALK, 2, 11 ; person
 
 	; warp-to
--- a/data/maps/objects/SSAnneB1FRooms.asm
+++ b/data/maps/objects/SSAnneB1FRooms.asm
@@ -25,7 +25,7 @@
 	object SPRITE_BLACK_HAIR_BOY_2, 10, 13, STAY, RIGHT, 7 ; person
 	object SPRITE_SLOWBRO, 11, 12, STAY, NONE, 8 ; person
 	object SPRITE_BALL, 20, 2, STAY, NONE, 9, ETHER
-	object SPRITE_BALL, 10, 2, STAY, NONE, 10, TM_44
+	object SPRITE_BALL, 10, 2, STAY, NONE, 10, TM_REST
 	object SPRITE_BALL, 12, 11, STAY, NONE, 11, MAX_POTION
 
 	; warp-to
--- a/data/maps/objects/SafariZoneEast.asm
+++ b/data/maps/objects/SafariZoneEast.asm
@@ -17,7 +17,7 @@
 	object SPRITE_BALL, 21, 10, STAY, NONE, 1, FULL_RESTORE
 	object SPRITE_BALL, 3, 7, STAY, NONE, 2, MAX_POTION
 	object SPRITE_BALL, 20, 13, STAY, NONE, 3, CARBOS
-	object SPRITE_BALL, 15, 12, STAY, NONE, 4, TM_37
+	object SPRITE_BALL, 15, 12, STAY, NONE, 4, TM_EGG_BOMB
 
 	; warp-to
 	warp_to 0, 4, SAFARI_ZONE_EAST_WIDTH ; SAFARI_ZONE_NORTH
--- a/data/maps/objects/SafariZoneNorth.asm
+++ b/data/maps/objects/SafariZoneNorth.asm
@@ -21,7 +21,7 @@
 
 	db 2 ; objects
 	object SPRITE_BALL, 25, 1, STAY, NONE, 1, PROTEIN
-	object SPRITE_BALL, 19, 7, STAY, NONE, 2, TM_40
+	object SPRITE_BALL, 19, 7, STAY, NONE, 2, TM_SKULL_BASH
 
 	; warp-to
 	warp_to 2, 35, SAFARI_ZONE_NORTH_WIDTH ; SAFARI_ZONE_WEST
--- a/data/maps/objects/SafariZoneWest.asm
+++ b/data/maps/objects/SafariZoneWest.asm
@@ -19,7 +19,7 @@
 
 	db 4 ; objects
 	object SPRITE_BALL, 8, 20, STAY, NONE, 1, MAX_POTION
-	object SPRITE_BALL, 9, 7, STAY, NONE, 2, TM_32
+	object SPRITE_BALL, 9, 7, STAY, NONE, 2, TM_DOUBLE_TEAM
 	object SPRITE_BALL, 18, 18, STAY, NONE, 3, MAX_REVIVE
 	object SPRITE_BALL, 19, 7, STAY, NONE, 4, GOLD_TEETH
 
--- a/data/maps/objects/SilphCo10F.asm
+++ b/data/maps/objects/SilphCo10F.asm
@@ -15,7 +15,7 @@
 	object SPRITE_ROCKET, 1, 9, STAY, RIGHT, 1, OPP_ROCKET, 39
 	object SPRITE_OAK_AIDE, 10, 2, STAY, LEFT, 2, OPP_SCIENTIST, 11
 	object SPRITE_ERIKA, 9, 15, WALK, 0, 3 ; person
-	object SPRITE_BALL, 2, 12, STAY, NONE, 4, TM_26
+	object SPRITE_BALL, 2, 12, STAY, NONE, 4, TM_EARTHQUAKE
 	object SPRITE_BALL, 4, 14, STAY, NONE, 5, RARE_CANDY
 	object SPRITE_BALL, 5, 11, STAY, NONE, 6, CARBOS
 
--- a/data/maps/objects/SilphCo5F.asm
+++ b/data/maps/objects/SilphCo5F.asm
@@ -18,7 +18,7 @@
 	object SPRITE_OAK_AIDE, 8, 3, STAY, RIGHT, 3, OPP_SCIENTIST, 6
 	object SPRITE_ROCKER, 18, 10, STAY, UP, 4, OPP_JUGGLER, 1
 	object SPRITE_ROCKET, 28, 4, STAY, UP, 5, OPP_ROCKET, 29
-	object SPRITE_BALL, 2, 13, STAY, NONE, 6, TM_09
+	object SPRITE_BALL, 2, 13, STAY, NONE, 6, TM_TAKE_DOWN
 	object SPRITE_BALL, 4, 6, STAY, NONE, 7, PROTEIN
 	object SPRITE_BALL, 21, 16, STAY, NONE, 8, CARD_KEY
 	object SPRITE_CLIPBOARD, 22, 12, STAY, NONE, 9 ; person
--- a/data/maps/objects/SilphCo7F.asm
+++ b/data/maps/objects/SilphCo7F.asm
@@ -22,7 +22,7 @@
 	object SPRITE_ROCKET, 19, 14, STAY, RIGHT, 8, OPP_ROCKET, 34
 	object SPRITE_BLUE, 3, 7, STAY, UP, 9 ; person
 	object SPRITE_BALL, 1, 9, STAY, NONE, 10, CALCIUM
-	object SPRITE_BALL, 24, 11, STAY, NONE, 11, TM_03
+	object SPRITE_BALL, 24, 11, STAY, NONE, 11, TM_SWORDS_DANCE
 
 	; warp-to
 	warp_to 16, 0, SILPH_CO_7F_WIDTH ; SILPH_CO_8F
--- a/data/maps/objects/VictoryRoad1F.asm
+++ b/data/maps/objects/VictoryRoad1F.asm
@@ -11,7 +11,7 @@
 	db 7 ; objects
 	object SPRITE_LASS, 7, 5, STAY, RIGHT, 1, OPP_COOLTRAINER_F, 5
 	object SPRITE_BLACK_HAIR_BOY_1, 3, 2, STAY, DOWN, 2, OPP_COOLTRAINER_M, 5
-	object SPRITE_BALL, 11, 0, STAY, NONE, 3, TM_43
+	object SPRITE_BALL, 11, 0, STAY, NONE, 3, TM_SKY_ATTACK
 	object SPRITE_BALL, 9, 2, STAY, NONE, 4, RARE_CANDY
 	object SPRITE_BOULDER, 5, 15, STAY, BOULDER_MOVEMENT_BYTE_2, 5 ; person
 	object SPRITE_BOULDER, 14, 2, STAY, BOULDER_MOVEMENT_BYTE_2, 6 ; person
--- a/data/maps/objects/VictoryRoad2F.asm
+++ b/data/maps/objects/VictoryRoad2F.asm
@@ -19,9 +19,9 @@
 	object SPRITE_BLACK_HAIR_BOY_2, 4, 2, STAY, DOWN, 4, OPP_POKEMANIAC, 6
 	object SPRITE_BLACK_HAIR_BOY_2, 26, 3, STAY, LEFT, 5, OPP_JUGGLER, 5
 	object SPRITE_BIRD, 11, 5, STAY, UP, 6, MOLTRES, 50
-	object SPRITE_BALL, 27, 5, STAY, NONE, 7, TM_17
+	object SPRITE_BALL, 27, 5, STAY, NONE, 7, TM_SUBMISSION
 	object SPRITE_BALL, 18, 9, STAY, NONE, 8, FULL_HEAL
-	object SPRITE_BALL, 9, 11, STAY, NONE, 9, TM_05
+	object SPRITE_BALL, 9, 11, STAY, NONE, 9, TM_MEGA_KICK
 	object SPRITE_BALL, 11, 0, STAY, NONE, 10, GUARD_SPEC
 	object SPRITE_BOULDER, 4, 14, STAY, BOULDER_MOVEMENT_BYTE_2, 11 ; person
 	object SPRITE_BOULDER, 5, 5, STAY, BOULDER_MOVEMENT_BYTE_2, 12 ; person
--- a/data/maps/objects/VictoryRoad3F.asm
+++ b/data/maps/objects/VictoryRoad3F.asm
@@ -15,7 +15,7 @@
 	object SPRITE_BLACK_HAIR_BOY_1, 6, 14, STAY, LEFT, 3, OPP_COOLTRAINER_M, 3
 	object SPRITE_LASS, 13, 3, STAY, RIGHT, 4, OPP_COOLTRAINER_F, 3
 	object SPRITE_BALL, 26, 5, STAY, NONE, 5, MAX_REVIVE
-	object SPRITE_BALL, 7, 7, STAY, NONE, 6, TM_47
+	object SPRITE_BALL, 7, 7, STAY, NONE, 6, TM_EXPLOSION
 	object SPRITE_BOULDER, 22, 3, STAY, BOULDER_MOVEMENT_BYTE_2, 7 ; person
 	object SPRITE_BOULDER, 13, 12, STAY, BOULDER_MOVEMENT_BYTE_2, 8 ; person
 	object SPRITE_BOULDER, 24, 10, STAY, BOULDER_MOVEMENT_BYTE_2, 9 ; person
--- a/data/moves/tmhm_moves.asm
+++ b/data/moves/tmhm_moves.asm
@@ -1,56 +1,59 @@
+; The add_hm and add_tm macros in constants/item_constants.asm simultaneously
+; define constants for the item IDs and for the corresponding move values.
+
 TechnicalMachines:
-	db MEGA_PUNCH
-	db RAZOR_WIND
-	db SWORDS_DANCE
-	db WHIRLWIND
-	db MEGA_KICK
-	db TOXIC
-	db HORN_DRILL
-	db BODY_SLAM
-	db TAKE_DOWN
-	db DOUBLE_EDGE
-	db BUBBLEBEAM
-	db WATER_GUN
-	db ICE_BEAM
-	db BLIZZARD
-	db HYPER_BEAM
-	db PAY_DAY
-	db SUBMISSION
-	db COUNTER
-	db SEISMIC_TOSS
-	db RAGE
-	db MEGA_DRAIN
-	db SOLARBEAM
-	db DRAGON_RAGE
-	db THUNDERBOLT
-	db THUNDER
-	db EARTHQUAKE
-	db FISSURE
-	db DIG
-	db PSYCHIC_M
-	db TELEPORT
-	db MIMIC
-	db DOUBLE_TEAM
-	db REFLECT
-	db BIDE
-	db METRONOME
-	db SELFDESTRUCT
-	db EGG_BOMB
-	db FIRE_BLAST
-	db SWIFT
-	db SKULL_BASH
-	db SOFTBOILED
-	db DREAM_EATER
-	db SKY_ATTACK
-	db REST
-	db THUNDER_WAVE
-	db PSYWAVE
-	db EXPLOSION
-	db ROCK_SLIDE
-	db TRI_ATTACK
-	db SUBSTITUTE
-	db CUT
-	db FLY
-	db SURF
-	db STRENGTH
-	db FLASH
+	db TM01_MOVE
+	db TM02_MOVE
+	db TM03_MOVE
+	db TM04_MOVE
+	db TM05_MOVE
+	db TM06_MOVE
+	db TM07_MOVE
+	db TM08_MOVE
+	db TM09_MOVE
+	db TM10_MOVE
+	db TM11_MOVE
+	db TM12_MOVE
+	db TM13_MOVE
+	db TM14_MOVE
+	db TM15_MOVE
+	db TM16_MOVE
+	db TM17_MOVE
+	db TM18_MOVE
+	db TM19_MOVE
+	db TM20_MOVE
+	db TM21_MOVE
+	db TM22_MOVE
+	db TM23_MOVE
+	db TM24_MOVE
+	db TM25_MOVE
+	db TM26_MOVE
+	db TM27_MOVE
+	db TM28_MOVE
+	db TM29_MOVE
+	db TM30_MOVE
+	db TM31_MOVE
+	db TM32_MOVE
+	db TM33_MOVE
+	db TM34_MOVE
+	db TM35_MOVE
+	db TM36_MOVE
+	db TM37_MOVE
+	db TM38_MOVE
+	db TM39_MOVE
+	db TM40_MOVE
+	db TM41_MOVE
+	db TM42_MOVE
+	db TM43_MOVE
+	db TM44_MOVE
+	db TM45_MOVE
+	db TM46_MOVE
+	db TM47_MOVE
+	db TM48_MOVE
+	db TM49_MOVE
+	db TM50_MOVE
+	db HM01_MOVE
+	db HM02_MOVE
+	db HM03_MOVE
+	db HM04_MOVE
+	db HM05_MOVE
--- a/data/pokemon/base_stats/abra.asm
+++ b/data/pokemon/base_stats/abra.asm
@@ -1,28 +1,24 @@
-db DEX_ABRA ; pokedex id
-db 25 ; base hp
-db 20 ; base attack
-db 15 ; base defense
-db 90 ; base speed
-db 105 ; base special
-db PSYCHIC ; species type 1
-db PSYCHIC ; species type 2
-db 200 ; catch rate
-db 73 ; base exp yield
-INCBIN "gfx/pokemon/front/abra.pic",0,1 ; 55, sprite dimensions
-dw AbraPicFront
-dw AbraPicBack
-; attacks known at lvl 0
-db TELEPORT
-db 0
-db 0
-db 0
-db 3 ; growth rate
-; learnset
-	tmlearn 1,5,6,8
-	tmlearn 9,10
-	tmlearn 17,18,19,20
-	tmlearn 29,30,31,32
-	tmlearn 33,34,35,40
-	tmlearn 44,45,46
-	tmlearn 49,50,55
-db 0 ; padding
+	db DEX_ABRA ; pokedex id
+
+	db  25,  20,  15,  90, 105
+	;   hp  atk  def  spd  spc
+
+	db PSYCHIC, PSYCHIC ; type
+	db 200 ; catch rate
+	db 73 ; base exp
+
+	INCBIN "gfx/pokemon/front/abra.pic", 0, 1 ; sprite dimensions
+	dw AbraPicFront, AbraPicBack
+
+	db TELEPORT, NO_MOVE, NO_MOVE, NO_MOVE ; level 1 learnset
+	db 3 ; growth rate
+
+	; tm/hm learnset
+	tmhm MEGA_PUNCH,   MEGA_KICK,    TOXIC,        BODY_SLAM,    TAKE_DOWN,    \
+	     DOUBLE_EDGE,  SUBMISSION,   COUNTER,      SEISMIC_TOSS, RAGE,         \
+	     PSYCHIC_M,    TELEPORT,     MIMIC,        DOUBLE_TEAM,  REFLECT,      \
+	     BIDE,         METRONOME,    SKULL_BASH,   REST,         THUNDER_WAVE, \
+	     PSYWAVE,      TRI_ATTACK,   SUBSTITUTE,   FLASH
+	; end
+
+	db 0 ; padding
--- a/data/pokemon/base_stats/aerodactyl.asm
+++ b/data/pokemon/base_stats/aerodactyl.asm
@@ -1,28 +1,23 @@
-db DEX_AERODACTYL ; pokedex id
-db 80 ; base hp
-db 105 ; base attack
-db 65 ; base defense
-db 130 ; base speed
-db 60 ; base special
-db ROCK ; species type 1
-db FLYING ; species type 2
-db 45 ; catch rate
-db 202 ; base exp yield
-INCBIN "gfx/pokemon/front/aerodactyl.pic",0,1 ; 77, sprite dimensions
-dw AerodactylPicFront
-dw AerodactylPicBack
-; attacks known at lvl 0
-db WING_ATTACK
-db AGILITY
-db 0
-db 0
-db 5 ; growth rate
-; learnset
-	tmlearn 2,4,6
-	tmlearn 9,10,15
-	tmlearn 20,23
-	tmlearn 31,32
-	tmlearn 33,34,38,39
-	tmlearn 43,44
-	tmlearn 50,52
-db 0 ; padding
+	db DEX_AERODACTYL ; pokedex id
+
+	db  80, 105,  65, 130,  60
+	;   hp  atk  def  spd  spc
+
+	db ROCK, FLYING ; type
+	db 45 ; catch rate
+	db 202 ; base exp
+
+	INCBIN "gfx/pokemon/front/aerodactyl.pic", 0, 1 ; sprite dimensions
+	dw AerodactylPicFront, AerodactylPicBack
+
+	db WING_ATTACK, AGILITY, NO_MOVE, NO_MOVE ; level 1 learnset
+	db 5 ; growth rate
+
+	; tm/hm learnset
+	tmhm RAZOR_WIND,   WHIRLWIND,    TOXIC,        TAKE_DOWN,    DOUBLE_EDGE,  \
+	     HYPER_BEAM,   RAGE,         DRAGON_RAGE,  MIMIC,        DOUBLE_TEAM,  \
+	     REFLECT,      BIDE,         FIRE_BLAST,   SWIFT,        SKY_ATTACK,   \
+	     REST,         SUBSTITUTE,   FLY
+	; end
+
+	db 0 ; padding
--- a/data/pokemon/base_stats/alakazam.asm
+++ b/data/pokemon/base_stats/alakazam.asm
@@ -1,28 +1,25 @@
-db DEX_ALAKAZAM ; pokedex id
-db 55 ; base hp
-db 50 ; base attack
-db 45 ; base defense
-db 120 ; base speed
-db 135 ; base special
-db PSYCHIC ; species type 1
-db PSYCHIC ; species type 2
-db 50 ; catch rate
-db 186 ; base exp yield
-INCBIN "gfx/pokemon/front/alakazam.pic",0,1 ; 77, sprite dimensions
-dw AlakazamPicFront
-dw AlakazamPicBack
-; attacks known at lvl 0
-db TELEPORT
-db CONFUSION
-db DISABLE
-db 0
-db 3 ; growth rate
-; learnset
-	tmlearn 1,5,6,8
-	tmlearn 9,10,15
-	tmlearn 17,18,19,20
-	tmlearn 28,29,30,31,32
-	tmlearn 33,34,35,40
-	tmlearn 44,45,46
-	tmlearn 49,50,55
-db 0 ; padding
+	db DEX_ALAKAZAM ; pokedex id
+
+	db  55,  50,  45, 120, 135
+	;   hp  atk  def  spd  spc
+
+	db PSYCHIC, PSYCHIC ; type
+	db 50 ; catch rate
+	db 186 ; base exp
+
+	INCBIN "gfx/pokemon/front/alakazam.pic", 0, 1 ; sprite dimensions
+	dw AlakazamPicFront, AlakazamPicBack
+
+	db TELEPORT, CONFUSION, DISABLE, NO_MOVE ; level 1 learnset
+	db 3 ; growth rate
+
+	; tm/hm learnset
+	tmhm MEGA_PUNCH,   MEGA_KICK,    TOXIC,        BODY_SLAM,    TAKE_DOWN,    \
+	     DOUBLE_EDGE,  HYPER_BEAM,   SUBMISSION,   COUNTER,      SEISMIC_TOSS, \
+	     RAGE,         DIG,          PSYCHIC_M,    TELEPORT,     MIMIC,        \
+	     DOUBLE_TEAM,  REFLECT,      BIDE,         METRONOME,    SKULL_BASH,   \
+	     REST,         THUNDER_WAVE, PSYWAVE,      TRI_ATTACK,   SUBSTITUTE,   \
+	     FLASH
+	; end
+
+	db 0 ; padding
--- a/data/pokemon/base_stats/arbok.asm
+++ b/data/pokemon/base_stats/arbok.asm
@@ -1,28 +1,23 @@
-db DEX_ARBOK ; pokedex id
-db 60 ; base hp
-db 85 ; base attack
-db 69 ; base defense
-db 80 ; base speed
-db 65 ; base special
-db POISON ; species type 1
-db POISON ; species type 2
-db 90 ; catch rate
-db 147 ; base exp yield
-INCBIN "gfx/pokemon/front/arbok.pic",0,1 ; 77, sprite dimensions
-dw ArbokPicFront
-dw ArbokPicBack
-; attacks known at lvl 0
-db WRAP
-db LEER
-db POISON_STING
-db 0
-db 0 ; growth rate
-; learnset
-	tmlearn 6,8
-	tmlearn 9,10,15
-	tmlearn 20,21
-	tmlearn 26,27,28,31,32
-	tmlearn 34,40
-	tmlearn 44,48
-	tmlearn 50,54
-db 0 ; padding
+	db DEX_ARBOK ; pokedex id
+
+	db  60,  85,  69,  80,  65
+	;   hp  atk  def  spd  spc
+
+	db POISON, POISON ; type
+	db 90 ; catch rate
+	db 147 ; base exp
+
+	INCBIN "gfx/pokemon/front/arbok.pic", 0, 1 ; sprite dimensions
+	dw ArbokPicFront, ArbokPicBack
+
+	db WRAP, LEER, POISON_STING, NO_MOVE ; level 1 learnset
+	db 0 ; growth rate
+
+	; tm/hm learnset
+	tmhm TOXIC,        BODY_SLAM,    TAKE_DOWN,    DOUBLE_EDGE,  HYPER_BEAM,   \
+	     RAGE,         MEGA_DRAIN,   EARTHQUAKE,   FISSURE,      DIG,          \
+	     MIMIC,        DOUBLE_TEAM,  BIDE,         SKULL_BASH,   REST,         \
+	     ROCK_SLIDE,   SUBSTITUTE,   STRENGTH
+	; end
+
+	db 0 ; padding
--- a/data/pokemon/base_stats/arcanine.asm
+++ b/data/pokemon/base_stats/arcanine.asm
@@ -1,28 +1,23 @@
-db DEX_ARCANINE ; pokedex id
-db 90 ; base hp
-db 110 ; base attack
-db 80 ; base defense
-db 95 ; base speed
-db 80 ; base special
-db FIRE ; species type 1
-db FIRE ; species type 2
-db 75 ; catch rate
-db 213 ; base exp yield
-INCBIN "gfx/pokemon/front/arcanine.pic",0,1 ; 77, sprite dimensions
-dw ArcaninePicFront
-dw ArcaninePicBack
-; attacks known at lvl 0
-db ROAR
-db EMBER
-db LEER
-db TAKE_DOWN
-db 5 ; growth rate
-; learnset
-	tmlearn 6,8
-	tmlearn 9,10,15
-	tmlearn 20,23
-	tmlearn 28,30,31,32
-	tmlearn 33,34,38,39,40
-	tmlearn 44
-	tmlearn 50
-db 0 ; padding
+	db DEX_ARCANINE ; pokedex id
+
+	db  90, 110,  80,  95,  80
+	;   hp  atk  def  spd  spc
+
+	db FIRE, FIRE ; type
+	db 75 ; catch rate
+	db 213 ; base exp
+
+	INCBIN "gfx/pokemon/front/arcanine.pic", 0, 1 ; sprite dimensions
+	dw ArcaninePicFront, ArcaninePicBack
+
+	db ROAR, EMBER, LEER, TAKE_DOWN ; level 1 learnset
+	db 5 ; growth rate
+
+	; tm/hm learnset
+	tmhm TOXIC,        BODY_SLAM,    TAKE_DOWN,    DOUBLE_EDGE,  HYPER_BEAM,   \
+	     RAGE,         DRAGON_RAGE,  DIG,          TELEPORT,     MIMIC,        \
+	     DOUBLE_TEAM,  REFLECT,      BIDE,         FIRE_BLAST,   SWIFT,        \
+	     SKULL_BASH,   REST,         SUBSTITUTE
+	; end
+
+	db 0 ; padding
--- a/data/pokemon/base_stats/articuno.asm
+++ b/data/pokemon/base_stats/articuno.asm
@@ -1,28 +1,23 @@
-db DEX_ARTICUNO ; pokedex id
-db 90 ; base hp
-db 85 ; base attack
-db 100 ; base defense
-db 85 ; base speed
-db 125 ; base special
-db ICE ; species type 1
-db FLYING ; species type 2
-db 3 ; catch rate
-db 215 ; base exp yield
-INCBIN "gfx/pokemon/front/articuno.pic",0,1 ; 77, sprite dimensions
-dw ArticunoPicFront
-dw ArticunoPicBack
-; attacks known at lvl 0
-db PECK
-db ICE_BEAM
-db 0
-db 0
-db 5 ; growth rate
-; learnset
-	tmlearn 2,4,6
-	tmlearn 9,10,11,12,13,14,15
-	tmlearn 20
-	tmlearn 31,32
-	tmlearn 33,34,39
-	tmlearn 43,44
-	tmlearn 50,52
-db 0 ; padding
+	db DEX_ARTICUNO ; pokedex id
+
+	db  90,  85, 100,  85, 125
+	;   hp  atk  def  spd  spc
+
+	db ICE, FLYING ; type
+	db 3 ; catch rate
+	db 215 ; base exp
+
+	INCBIN "gfx/pokemon/front/articuno.pic", 0, 1 ; sprite dimensions
+	dw ArticunoPicFront, ArticunoPicBack
+
+	db PECK, ICE_BEAM, NO_MOVE, NO_MOVE ; level 1 learnset
+	db 5 ; growth rate
+
+	; tm/hm learnset
+	tmhm RAZOR_WIND,   WHIRLWIND,    TOXIC,        TAKE_DOWN,    DOUBLE_EDGE,  \
+	     BUBBLEBEAM,   WATER_GUN,    ICE_BEAM,     BLIZZARD,     HYPER_BEAM,   \
+	     RAGE,         MIMIC,        DOUBLE_TEAM,  REFLECT,      BIDE,         \
+	     SWIFT,        SKY_ATTACK,   REST,         SUBSTITUTE,   FLY
+	; end
+
+	db 0 ; padding
--- a/data/pokemon/base_stats/beedrill.asm
+++ b/data/pokemon/base_stats/beedrill.asm
@@ -1,28 +1,23 @@
-db DEX_BEEDRILL ; pokedex id
-db 65 ; base hp
-db 80 ; base attack
-db 40 ; base defense
-db 75 ; base speed
-db 45 ; base special
-db BUG ; species type 1
-db POISON ; species type 2
-db 45 ; catch rate
-db 159 ; base exp yield
-INCBIN "gfx/pokemon/front/beedrill.pic",0,1 ; 77, sprite dimensions
-dw BeedrillPicFront
-dw BeedrillPicBack
-; attacks known at lvl 0
-db FURY_ATTACK
-db 0
-db 0
-db 0
-db 0 ; growth rate
-; learnset
-	tmlearn 3,6
-	tmlearn 9,10,15
-	tmlearn 20,21
-	tmlearn 31,32
-	tmlearn 33,34,39,40
-	tmlearn 44
-	tmlearn 50,51
-db 0 ; padding
+	db DEX_BEEDRILL ; pokedex id
+
+	db  65,  80,  40,  75,  45
+	;   hp  atk  def  spd  spc
+
+	db BUG, POISON ; type
+	db 45 ; catch rate
+	db 159 ; base exp
+
+	INCBIN "gfx/pokemon/front/beedrill.pic", 0, 1 ; sprite dimensions
+	dw BeedrillPicFront, BeedrillPicBack
+
+	db FURY_ATTACK, NO_MOVE, NO_MOVE, NO_MOVE ; level 1 learnset
+	db 0 ; growth rate
+
+	; tm/hm learnset
+	tmhm SWORDS_DANCE, TOXIC,        TAKE_DOWN,    DOUBLE_EDGE,  HYPER_BEAM,   \
+	     RAGE,         MEGA_DRAIN,   MIMIC,        DOUBLE_TEAM,  REFLECT,      \
+	     BIDE,         SWIFT,        SKULL_BASH,   REST,         SUBSTITUTE,   \
+	     CUT
+	; end
+
+	db 0 ; padding
--- a/data/pokemon/base_stats/bellsprout.asm
+++ b/data/pokemon/base_stats/bellsprout.asm
@@ -1,28 +1,22 @@
-db DEX_BELLSPROUT ; pokedex id
-db 50 ; base hp
-db 75 ; base attack
-db 35 ; base defense
-db 40 ; base speed
-db 70 ; base special
-db GRASS ; species type 1
-db POISON ; species type 2
-db 255 ; catch rate
-db 84 ; base exp yield
-INCBIN "gfx/pokemon/front/bellsprout.pic",0,1 ; 55, sprite dimensions
-dw BellsproutPicFront
-dw BellsproutPicBack
-; attacks known at lvl 0
-db VINE_WHIP
-db GROWTH
-db 0
-db 0
-db 3 ; growth rate
-; learnset
-	tmlearn 3,6
-	tmlearn 9,10
-	tmlearn 20,21,22
-	tmlearn 31,32
-	tmlearn 33,34
-	tmlearn 44
-	tmlearn 50,51
-db 0 ; padding
+	db DEX_BELLSPROUT ; pokedex id
+
+	db  50,  75,  35,  40,  70
+	;   hp  atk  def  spd  spc
+
+	db GRASS, POISON ; type
+	db 255 ; catch rate
+	db 84 ; base exp
+
+	INCBIN "gfx/pokemon/front/bellsprout.pic", 0, 1 ; sprite dimensions
+	dw BellsproutPicFront, BellsproutPicBack
+
+	db VINE_WHIP, GROWTH, NO_MOVE, NO_MOVE ; level 1 learnset
+	db 3 ; growth rate
+
+	; tm/hm learnset
+	tmhm SWORDS_DANCE, TOXIC,        TAKE_DOWN,    DOUBLE_EDGE,  RAGE,         \
+	     MEGA_DRAIN,   SOLARBEAM,    MIMIC,        DOUBLE_TEAM,  REFLECT,      \
+	     BIDE,         REST,         SUBSTITUTE,   CUT
+	; end
+
+	db 0 ; padding
--- a/data/pokemon/base_stats/blastoise.asm
+++ b/data/pokemon/base_stats/blastoise.asm
@@ -1,28 +1,25 @@
-db DEX_BLASTOISE ; pokedex id
-db 79 ; base hp
-db 83 ; base attack
-db 100 ; base defense
-db 78 ; base speed
-db 85 ; base special
-db WATER ; species type 1
-db WATER ; species type 2
-db 45 ; catch rate
-db 210 ; base exp yield
-INCBIN "gfx/pokemon/front/blastoise.pic",0,1 ; 77, sprite dimensions
-dw BlastoisePicFront
-dw BlastoisePicBack
-; attacks known at lvl 0
-db TACKLE
-db TAIL_WHIP
-db BUBBLE
-db WATER_GUN
-db 3 ; growth rate
-; learnset
-	tmlearn 1,5,6,8
-	tmlearn 9,10,11,12,13,14,15
-	tmlearn 17,18,19,20
-	tmlearn 26,27,28,31,32
-	tmlearn 33,34,40
-	tmlearn 44
-	tmlearn 50,53,54
-db 0 ; padding
+	db DEX_BLASTOISE ; pokedex id
+
+	db  79,  83, 100,  78,  85
+	;   hp  atk  def  spd  spc
+
+	db WATER, WATER ; type
+	db 45 ; catch rate
+	db 210 ; base exp
+
+	INCBIN "gfx/pokemon/front/blastoise.pic", 0, 1 ; sprite dimensions
+	dw BlastoisePicFront, BlastoisePicBack
+
+	db TACKLE, TAIL_WHIP, BUBBLE, WATER_GUN ; level 1 learnset
+	db 3 ; growth rate
+
+	; tm/hm learnset
+	tmhm MEGA_PUNCH,   MEGA_KICK,    TOXIC,        BODY_SLAM,    TAKE_DOWN,    \
+	     DOUBLE_EDGE,  BUBBLEBEAM,   WATER_GUN,    ICE_BEAM,     BLIZZARD,     \
+	     HYPER_BEAM,   SUBMISSION,   COUNTER,      SEISMIC_TOSS, RAGE,         \
+	     EARTHQUAKE,   FISSURE,      DIG,          MIMIC,        DOUBLE_TEAM,  \
+	     REFLECT,      BIDE,         SKULL_BASH,   REST,         SUBSTITUTE,   \
+	     SURF,         STRENGTH
+	; end
+
+	db 0 ; padding
--- a/data/pokemon/base_stats/bulbasaur.asm
+++ b/data/pokemon/base_stats/bulbasaur.asm
@@ -1,28 +1,22 @@
-db DEX_BULBASAUR ; pokedex id
-db 45 ; base hp
-db 49 ; base attack
-db 49 ; base defense
-db 45 ; base speed
-db 65 ; base special
-db GRASS ; species type 1
-db POISON ; species type 2
-db 45 ; catch rate
-db 64 ; base exp yield
-INCBIN "gfx/pokemon/front/bulbasaur.pic",0,1 ; 55, sprite dimensions
-dw BulbasaurPicFront
-dw BulbasaurPicBack
-; attacks known at lvl 0
-db TACKLE
-db GROWL
-db 0
-db 0
-db 3 ; growth rate
-; learnset
-	tmlearn 3,6,8
-	tmlearn 9,10
-	tmlearn 20,21,22
-	tmlearn 31,32
-	tmlearn 33,34
-	tmlearn 44
-	tmlearn 50,51
-db 0 ; padding
+	db DEX_BULBASAUR ; pokedex id
+
+	db  45,  49,  49,  45,  65
+	;   hp  atk  def  spd  spc
+
+	db GRASS, POISON ; type
+	db 45 ; catch rate
+	db 64 ; base exp
+
+	INCBIN "gfx/pokemon/front/bulbasaur.pic", 0, 1 ; sprite dimensions
+	dw BulbasaurPicFront, BulbasaurPicBack
+
+	db TACKLE, GROWL, NO_MOVE, NO_MOVE ; level 1 learnset
+	db 3 ; growth rate
+
+	; tm/hm learnset
+	tmhm SWORDS_DANCE, TOXIC,        BODY_SLAM,    TAKE_DOWN,    DOUBLE_EDGE,  \
+	     RAGE,         MEGA_DRAIN,   SOLARBEAM,    MIMIC,        DOUBLE_TEAM,  \
+	     REFLECT,      BIDE,         REST,         SUBSTITUTE,   CUT
+	; end
+
+	db 0 ; padding
--- a/data/pokemon/base_stats/butterfree.asm
+++ b/data/pokemon/base_stats/butterfree.asm
@@ -1,28 +1,23 @@
-db DEX_BUTTERFREE ; pokedex id
-db 60 ; base hp
-db 45 ; base attack
-db 50 ; base defense
-db 70 ; base speed
-db 80 ; base special
-db BUG ; species type 1
-db FLYING ; species type 2
-db 45 ; catch rate
-db 160 ; base exp yield
-INCBIN "gfx/pokemon/front/butterfree.pic",0,1 ; 77, sprite dimensions
-dw ButterfreePicFront
-dw ButterfreePicBack
-; attacks known at lvl 0
-db CONFUSION
-db 0
-db 0
-db 0
-db 0 ; growth rate
-; learnset
-	tmlearn 2,4,6
-	tmlearn 9,10,15
-	tmlearn 20,21,22
-	tmlearn 29,30,31,32
-	tmlearn 33,34,39
-	tmlearn 44,46
-	tmlearn 50
-db 0 ; padding
+	db DEX_BUTTERFREE ; pokedex id
+
+	db  60,  45,  50,  70,  80
+	;   hp  atk  def  spd  spc
+
+	db BUG, FLYING ; type
+	db 45 ; catch rate
+	db 160 ; base exp
+
+	INCBIN "gfx/pokemon/front/butterfree.pic", 0, 1 ; sprite dimensions
+	dw ButterfreePicFront, ButterfreePicBack
+
+	db CONFUSION, NO_MOVE, NO_MOVE, NO_MOVE ; level 1 learnset
+	db 0 ; growth rate
+
+	; tm/hm learnset
+	tmhm RAZOR_WIND,   WHIRLWIND,    TOXIC,        TAKE_DOWN,    DOUBLE_EDGE,  \
+	     HYPER_BEAM,   RAGE,         MEGA_DRAIN,   SOLARBEAM,    PSYCHIC_M,    \
+	     TELEPORT,     MIMIC,        DOUBLE_TEAM,  REFLECT,      BIDE,         \
+	     SWIFT,        REST,         PSYWAVE,      SUBSTITUTE
+	; end
+
+	db 0 ; padding
--- a/data/pokemon/base_stats/caterpie.asm
+++ b/data/pokemon/base_stats/caterpie.asm
@@ -1,28 +1,20 @@
-db DEX_CATERPIE ; pokedex id
-db 45 ; base hp
-db 30 ; base attack
-db 35 ; base defense
-db 45 ; base speed
-db 20 ; base special
-db BUG ; species type 1
-db BUG ; species type 2
-db 255 ; catch rate
-db 53 ; base exp yield
-INCBIN "gfx/pokemon/front/caterpie.pic",0,1 ; 55, sprite dimensions
-dw CaterpiePicFront
-dw CaterpiePicBack
-; attacks known at lvl 0
-db TACKLE
-db STRING_SHOT
-db 0
-db 0
-db 0 ; growth rate
-; learnset
-	tmlearn 0
-	tmlearn 0
-	tmlearn 0
-	tmlearn 0
-	tmlearn 0
-	tmlearn 0
-	tmlearn 0
-db 0 ; padding
+	db DEX_CATERPIE ; pokedex id
+
+	db  45,  30,  35,  45,  20
+	;   hp  atk  def  spd  spc
+
+	db BUG, BUG ; type
+	db 255 ; catch rate
+	db 53 ; base exp
+
+	INCBIN "gfx/pokemon/front/caterpie.pic", 0, 1 ; sprite dimensions
+	dw CaterpiePicFront, CaterpiePicBack
+
+	db TACKLE, STRING_SHOT, NO_MOVE, NO_MOVE ; level 1 learnset
+	db 0 ; growth rate
+
+	; tm/hm learnset
+	tmhm
+	; end
+
+	db 0 ; padding
--- a/data/pokemon/base_stats/chansey.asm
+++ b/data/pokemon/base_stats/chansey.asm
@@ -1,28 +1,27 @@
-db DEX_CHANSEY ; pokedex id
-db 250 ; base hp
-db 5 ; base attack
-db 5 ; base defense
-db 50 ; base speed
-db 105 ; base special
-db NORMAL ; species type 1
-db NORMAL ; species type 2
-db 30 ; catch rate
-db 255 ; base exp yield
-INCBIN "gfx/pokemon/front/chansey.pic",0,1 ; 66, sprite dimensions
-dw ChanseyPicFront
-dw ChanseyPicBack
-; attacks known at lvl 0
-db POUND
-db DOUBLESLAP
-db 0
-db 0
-db 4 ; growth rate
-; learnset
-	tmlearn 1,5,6,8
-	tmlearn 9,10,11,12,13,14,15
-	tmlearn 17,18,19,20,22,24
-	tmlearn 25,29,30,31,32
-	tmlearn 33,34,35,37,38,40
-	tmlearn 41,44,45,46
-	tmlearn 49,50,54,55
-db 0 ; padding
+	db DEX_CHANSEY ; pokedex id
+
+	db 250,   5,   5,  50, 105
+	;   hp  atk  def  spd  spc
+
+	db NORMAL, NORMAL ; type
+	db 30 ; catch rate
+	db 255 ; base exp
+
+	INCBIN "gfx/pokemon/front/chansey.pic", 0, 1 ; sprite dimensions
+	dw ChanseyPicFront, ChanseyPicBack
+
+	db POUND, DOUBLESLAP, NO_MOVE, NO_MOVE ; level 1 learnset
+	db 4 ; growth rate
+
+	; tm/hm learnset
+	tmhm MEGA_PUNCH,   MEGA_KICK,    TOXIC,        BODY_SLAM,    TAKE_DOWN,    \
+	     DOUBLE_EDGE,  BUBBLEBEAM,   WATER_GUN,    ICE_BEAM,     BLIZZARD,     \
+	     HYPER_BEAM,   SUBMISSION,   COUNTER,      SEISMIC_TOSS, RAGE,         \
+	     SOLARBEAM,    THUNDERBOLT,  THUNDER,      PSYCHIC_M,    TELEPORT,     \
+	     MIMIC,        DOUBLE_TEAM,  REFLECT,      BIDE,         METRONOME,    \
+	     EGG_BOMB,     FIRE_BLAST,   SKULL_BASH,   SOFTBOILED,   REST,         \
+	     THUNDER_WAVE, PSYWAVE,      TRI_ATTACK,   SUBSTITUTE,   STRENGTH,     \
+	     FLASH
+	; end
+
+	db 0 ; padding
--- a/data/pokemon/base_stats/charizard.asm
+++ b/data/pokemon/base_stats/charizard.asm
@@ -1,28 +1,25 @@
-db DEX_CHARIZARD ; pokedex id
-db 78 ; base hp
-db 84 ; base attack
-db 78 ; base defense
-db 100 ; base speed
-db 85 ; base special
-db FIRE ; species type 1
-db FLYING ; species type 2
-db 45 ; catch rate
-db 209 ; base exp yield
-INCBIN "gfx/pokemon/front/charizard.pic",0,1 ; 77, sprite dimensions
-dw CharizardPicFront
-dw CharizardPicBack
-; attacks known at lvl 0
-db SCRATCH
-db GROWL
-db EMBER
-db LEER
-db 3 ; growth rate
-; learnset
-	tmlearn 1,3,5,6,8
-	tmlearn 9,10,15
-	tmlearn 17,18,19,20,23
-	tmlearn 26,27,28,31,32
-	tmlearn 33,34,38,39,40
-	tmlearn 44
-	tmlearn 50,51,54
-db 0 ; padding
+	db DEX_CHARIZARD ; pokedex id
+
+	db  78,  84,  78, 100,  85
+	;   hp  atk  def  spd  spc
+
+	db FIRE, FLYING ; type
+	db 45 ; catch rate
+	db 209 ; base exp
+
+	INCBIN "gfx/pokemon/front/charizard.pic", 0, 1 ; sprite dimensions
+	dw CharizardPicFront, CharizardPicBack
+
+	db SCRATCH, GROWL, EMBER, LEER ; level 1 learnset
+	db 3 ; growth rate
+
+	; tm/hm learnset
+	tmhm MEGA_PUNCH,   SWORDS_DANCE, MEGA_KICK,    TOXIC,        BODY_SLAM,    \
+	     TAKE_DOWN,    DOUBLE_EDGE,  HYPER_BEAM,   SUBMISSION,   COUNTER,      \
+	     SEISMIC_TOSS, RAGE,         DRAGON_RAGE,  EARTHQUAKE,   FISSURE,      \
+	     DIG,          MIMIC,        DOUBLE_TEAM,  REFLECT,      BIDE,         \
+	     FIRE_BLAST,   SWIFT,        SKULL_BASH,   REST,         SUBSTITUTE,   \
+	     CUT,          STRENGTH
+	; end
+
+	db 0 ; padding
--- a/data/pokemon/base_stats/charmander.asm
+++ b/data/pokemon/base_stats/charmander.asm
@@ -1,28 +1,24 @@
-db DEX_CHARMANDER ; pokedex id
-db 39 ; base hp
-db 52 ; base attack
-db 43 ; base defense
-db 65 ; base speed
-db 50 ; base special
-db FIRE ; species type 1
-db FIRE ; species type 2
-db 45 ; catch rate
-db 65 ; base exp yield
-INCBIN "gfx/pokemon/front/charmander.pic",0,1 ; 55, sprite dimensions
-dw CharmanderPicFront
-dw CharmanderPicBack
-; attacks known at lvl 0
-db SCRATCH
-db GROWL
-db 0
-db 0
-db 3 ; growth rate
-; learnset
-	tmlearn 1,3,5,6,8
-	tmlearn 9,10
-	tmlearn 17,18,19,20,23
-	tmlearn 28,31,32
-	tmlearn 33,34,38,39,40
-	tmlearn 44
-	tmlearn 50,51,54
-db 0 ; padding
+	db DEX_CHARMANDER ; pokedex id
+
+	db  39,  52,  43,  65,  50
+	;   hp  atk  def  spd  spc
+
+	db FIRE, FIRE ; type
+	db 45 ; catch rate
+	db 65 ; base exp
+
+	INCBIN "gfx/pokemon/front/charmander.pic", 0, 1 ; sprite dimensions
+	dw CharmanderPicFront, CharmanderPicBack
+
+	db SCRATCH, GROWL, NO_MOVE, NO_MOVE ; level 1 learnset
+	db 3 ; growth rate
+
+	; tm/hm learnset
+	tmhm MEGA_PUNCH,   SWORDS_DANCE, MEGA_KICK,    TOXIC,        BODY_SLAM,    \
+	     TAKE_DOWN,    DOUBLE_EDGE,  SUBMISSION,   COUNTER,      SEISMIC_TOSS, \
+	     RAGE,         DRAGON_RAGE,  DIG,          MIMIC,        DOUBLE_TEAM,  \
+	     REFLECT,      BIDE,         FIRE_BLAST,   SWIFT,        SKULL_BASH,   \
+	     REST,         SUBSTITUTE,   CUT,          STRENGTH
+	; end
+
+	db 0 ; padding
--- a/data/pokemon/base_stats/charmeleon.asm
+++ b/data/pokemon/base_stats/charmeleon.asm
@@ -1,28 +1,24 @@
-db DEX_CHARMELEON ; pokedex id
-db 58 ; base hp
-db 64 ; base attack
-db 58 ; base defense
-db 80 ; base speed
-db 65 ; base special
-db FIRE ; species type 1
-db FIRE ; species type 2
-db 45 ; catch rate
-db 142 ; base exp yield
-INCBIN "gfx/pokemon/front/charmeleon.pic",0,1 ; 66, sprite dimensions
-dw CharmeleonPicFront
-dw CharmeleonPicBack
-; attacks known at lvl 0
-db SCRATCH
-db GROWL
-db EMBER
-db 0
-db 3 ; growth rate
-; learnset
-	tmlearn 1,3,5,6,8
-	tmlearn 9,10
-	tmlearn 17,18,19,20,23
-	tmlearn 28,31,32
-	tmlearn 33,34,38,39,40
-	tmlearn 44
-	tmlearn 50,51,54
-db 0 ; padding
+	db DEX_CHARMELEON ; pokedex id
+
+	db  58,  64,  58,  80,  65
+	;   hp  atk  def  spd  spc
+
+	db FIRE, FIRE ; type
+	db 45 ; catch rate
+	db 142 ; base exp
+
+	INCBIN "gfx/pokemon/front/charmeleon.pic", 0, 1 ; sprite dimensions
+	dw CharmeleonPicFront, CharmeleonPicBack
+
+	db SCRATCH, GROWL, EMBER, NO_MOVE ; level 1 learnset
+	db 3 ; growth rate
+
+	; tm/hm learnset
+	tmhm MEGA_PUNCH,   SWORDS_DANCE, MEGA_KICK,    TOXIC,        BODY_SLAM,    \
+	     TAKE_DOWN,    DOUBLE_EDGE,  SUBMISSION,   COUNTER,      SEISMIC_TOSS, \
+	     RAGE,         DRAGON_RAGE,  DIG,          MIMIC,        DOUBLE_TEAM,  \
+	     REFLECT,      BIDE,         FIRE_BLAST,   SWIFT,        SKULL_BASH,   \
+	     REST,         SUBSTITUTE,   CUT,          STRENGTH
+	; end
+
+	db 0 ; padding
--- a/data/pokemon/base_stats/clefable.asm
+++ b/data/pokemon/base_stats/clefable.asm
@@ -1,28 +1,26 @@
-db DEX_CLEFABLE ; pokedex id
-db 95 ; base hp
-db 70 ; base attack
-db 73 ; base defense
-db 60 ; base speed
-db 85 ; base special
-db NORMAL ; species type 1
-db NORMAL ; species type 2
-db 25 ; catch rate
-db 129 ; base exp yield
-INCBIN "gfx/pokemon/front/clefable.pic",0,1 ; 66, sprite dimensions
-dw ClefablePicFront
-dw ClefablePicBack
-; attacks known at lvl 0
-db SING
-db DOUBLESLAP
-db MINIMIZE
-db METRONOME
-db 4 ; growth rate
-; learnset
-	tmlearn 1,5,6,8
-	tmlearn 9,10,11,12,13,14,15
-	tmlearn 17,18,19,20,22,24
-	tmlearn 25,29,30,31,32
-	tmlearn 33,34,35,38,40
-	tmlearn 44,45,46
-	tmlearn 49,50,54,55
-db 0 ; padding
+	db DEX_CLEFABLE ; pokedex id
+
+	db  95,  70,  73,  60,  85
+	;   hp  atk  def  spd  spc
+
+	db NORMAL, NORMAL ; type
+	db 25 ; catch rate
+	db 129 ; base exp
+
+	INCBIN "gfx/pokemon/front/clefable.pic", 0, 1 ; sprite dimensions
+	dw ClefablePicFront, ClefablePicBack
+
+	db SING, DOUBLESLAP, MINIMIZE, METRONOME ; level 1 learnset
+	db 4 ; growth rate
+
+	; tm/hm learnset
+	tmhm MEGA_PUNCH,   MEGA_KICK,    TOXIC,        BODY_SLAM,    TAKE_DOWN,    \
+	     DOUBLE_EDGE,  BUBBLEBEAM,   WATER_GUN,    ICE_BEAM,     BLIZZARD,     \
+	     HYPER_BEAM,   SUBMISSION,   COUNTER,      SEISMIC_TOSS, RAGE,         \
+	     SOLARBEAM,    THUNDERBOLT,  THUNDER,      PSYCHIC_M,    TELEPORT,     \
+	     MIMIC,        DOUBLE_TEAM,  REFLECT,      BIDE,         METRONOME,    \
+	     FIRE_BLAST,   SKULL_BASH,   REST,         THUNDER_WAVE, PSYWAVE,      \
+	     TRI_ATTACK,   SUBSTITUTE,   STRENGTH,     FLASH
+	; end
+
+	db 0 ; padding
--- a/data/pokemon/base_stats/clefairy.asm
+++ b/data/pokemon/base_stats/clefairy.asm
@@ -1,28 +1,26 @@
-db DEX_CLEFAIRY ; pokedex id
-db 70 ; base hp
-db 45 ; base attack
-db 48 ; base defense
-db 35 ; base speed
-db 60 ; base special
-db NORMAL ; species type 1
-db NORMAL ; species type 2
-db 150 ; catch rate
-db 68 ; base exp yield
-INCBIN "gfx/pokemon/front/clefairy.pic",0,1 ; 55, sprite dimensions
-dw ClefairyPicFront
-dw ClefairyPicBack
-; attacks known at lvl 0
-db POUND
-db GROWL
-db 0
-db 0
-db 4 ; growth rate
-; learnset
-	tmlearn 1,5,6,8
-	tmlearn 9,10,11,12,13,14
-	tmlearn 17,18,19,20,22,24
-	tmlearn 25,29,30,31,32
-	tmlearn 33,34,35,38,40
-	tmlearn 44,45,46
-	tmlearn 49,50,54,55
-db 0 ; padding
+	db DEX_CLEFAIRY ; pokedex id
+
+	db  70,  45,  48,  35,  60
+	;   hp  atk  def  spd  spc
+
+	db NORMAL, NORMAL ; type
+	db 150 ; catch rate
+	db 68 ; base exp
+
+	INCBIN "gfx/pokemon/front/clefairy.pic", 0, 1 ; sprite dimensions
+	dw ClefairyPicFront, ClefairyPicBack
+
+	db POUND, GROWL, NO_MOVE, NO_MOVE ; level 1 learnset
+	db 4 ; growth rate
+
+	; tm/hm learnset
+	tmhm MEGA_PUNCH,   MEGA_KICK,    TOXIC,        BODY_SLAM,    TAKE_DOWN,    \
+	     DOUBLE_EDGE,  BUBBLEBEAM,   WATER_GUN,    ICE_BEAM,     BLIZZARD,     \
+	     SUBMISSION,   COUNTER,      SEISMIC_TOSS, RAGE,         SOLARBEAM,    \
+	     THUNDERBOLT,  THUNDER,      PSYCHIC_M,    TELEPORT,     MIMIC,        \
+	     DOUBLE_TEAM,  REFLECT,      BIDE,         METRONOME,    FIRE_BLAST,   \
+	     SKULL_BASH,   REST,         THUNDER_WAVE, PSYWAVE,      TRI_ATTACK,   \
+	     SUBSTITUTE,   STRENGTH,     FLASH
+	; end
+
+	db 0 ; padding
--- a/data/pokemon/base_stats/cloyster.asm
+++ b/data/pokemon/base_stats/cloyster.asm
@@ -1,28 +1,24 @@
-db DEX_CLOYSTER ; pokedex id
-db 50 ; base hp
-db 95 ; base attack
-db 180 ; base defense
-db 70 ; base speed
-db 85 ; base special
-db WATER ; species type 1
-db ICE ; species type 2
-db 60 ; catch rate
-db 203 ; base exp yield
-INCBIN "gfx/pokemon/front/cloyster.pic",0,1 ; 77, sprite dimensions
-dw CloysterPicFront
-dw CloysterPicBack
-; attacks known at lvl 0
-db WITHDRAW
-db SUPERSONIC
-db CLAMP
-db AURORA_BEAM
-db 5 ; growth rate
-; learnset
-	tmlearn 6
-	tmlearn 9,10,11,12,13,14,15
-	tmlearn 20
-	tmlearn 30,31,32
-	tmlearn 33,34,36,39
-	tmlearn 44,47
-	tmlearn 49,50,53
-db 0 ; padding
+	db DEX_CLOYSTER ; pokedex id
+
+	db  50,  95, 180,  70,  85
+	;   hp  atk  def  spd  spc
+
+	db WATER, ICE ; type
+	db 60 ; catch rate
+	db 203 ; base exp
+
+	INCBIN "gfx/pokemon/front/cloyster.pic", 0, 1 ; sprite dimensions
+	dw CloysterPicFront, CloysterPicBack
+
+	db WITHDRAW, SUPERSONIC, CLAMP, AURORA_BEAM ; level 1 learnset
+	db 5 ; growth rate
+
+	; tm/hm learnset
+	tmhm TOXIC,        TAKE_DOWN,    DOUBLE_EDGE,  BUBBLEBEAM,   WATER_GUN,    \
+	     ICE_BEAM,     BLIZZARD,     HYPER_BEAM,   RAGE,         TELEPORT,     \
+	     MIMIC,        DOUBLE_TEAM,  REFLECT,      BIDE,         SELFDESTRUCT, \
+	     SWIFT,        REST,         EXPLOSION,    TRI_ATTACK,   SUBSTITUTE,   \
+	     SURF
+	; end
+
+	db 0 ; padding
--- a/data/pokemon/base_stats/cubone.asm
+++ b/data/pokemon/base_stats/cubone.asm
@@ -1,28 +1,24 @@
-db DEX_CUBONE ; pokedex id
-db 50 ; base hp
-db 50 ; base attack
-db 95 ; base defense
-db 35 ; base speed
-db 40 ; base special
-db GROUND ; species type 1
-db GROUND ; species type 2
-db 190 ; catch rate
-db 87 ; base exp yield
-INCBIN "gfx/pokemon/front/cubone.pic",0,1 ; 55, sprite dimensions
-dw CubonePicFront
-dw CubonePicBack
-; attacks known at lvl 0
-db BONE_CLUB
-db GROWL
-db 0
-db 0
-db 0 ; growth rate
-; learnset
-	tmlearn 1,5,6,8
-	tmlearn 9,10,11,12,13,14
-	tmlearn 17,18,19,20
-	tmlearn 26,27,28,31,32
-	tmlearn 34,38,40
-	tmlearn 44
-	tmlearn 50,54
-db 0 ; padding
+	db DEX_CUBONE ; pokedex id
+
+	db  50,  50,  95,  35,  40
+	;   hp  atk  def  spd  spc
+
+	db GROUND, GROUND ; type
+	db 190 ; catch rate
+	db 87 ; base exp
+
+	INCBIN "gfx/pokemon/front/cubone.pic", 0, 1 ; sprite dimensions
+	dw CubonePicFront, CubonePicBack
+
+	db BONE_CLUB, GROWL, NO_MOVE, NO_MOVE ; level 1 learnset
+	db 0 ; growth rate
+
+	; tm/hm learnset
+	tmhm MEGA_PUNCH,   MEGA_KICK,    TOXIC,        BODY_SLAM,    TAKE_DOWN,    \
+	     DOUBLE_EDGE,  BUBBLEBEAM,   WATER_GUN,    ICE_BEAM,     BLIZZARD,     \
+	     SUBMISSION,   COUNTER,      SEISMIC_TOSS, RAGE,         EARTHQUAKE,   \
+	     FISSURE,      DIG,          MIMIC,        DOUBLE_TEAM,  BIDE,         \
+	     FIRE_BLAST,   SKULL_BASH,   REST,         SUBSTITUTE,   STRENGTH
+	; end
+
+	db 0 ; padding
--- a/data/pokemon/base_stats/dewgong.asm
+++ b/data/pokemon/base_stats/dewgong.asm
@@ -1,28 +1,23 @@
-db DEX_DEWGONG ; pokedex id
-db 90 ; base hp
-db 70 ; base attack
-db 80 ; base defense
-db 70 ; base speed
-db 95 ; base special
-db WATER ; species type 1
-db ICE ; species type 2
-db 75 ; catch rate
-db 176 ; base exp yield
-INCBIN "gfx/pokemon/front/dewgong.pic",0,1 ; 66, sprite dimensions
-dw DewgongPicFront
-dw DewgongPicBack
-; attacks known at lvl 0
-db HEADBUTT
-db GROWL
-db AURORA_BEAM
-db 0
-db 0 ; growth rate
-; learnset
-	tmlearn 6,7,8
-	tmlearn 9,10,11,12,13,14,15,16
-	tmlearn 20
-	tmlearn 31,32
-	tmlearn 34,40
-	tmlearn 44
-	tmlearn 50,53,54
-db 0 ; padding
+	db DEX_DEWGONG ; pokedex id
+
+	db  90,  70,  80,  70,  95
+	;   hp  atk  def  spd  spc
+
+	db WATER, ICE ; type
+	db 75 ; catch rate
+	db 176 ; base exp
+
+	INCBIN "gfx/pokemon/front/dewgong.pic", 0, 1 ; sprite dimensions
+	dw DewgongPicFront, DewgongPicBack
+
+	db HEADBUTT, GROWL, AURORA_BEAM, NO_MOVE ; level 1 learnset
+	db 0 ; growth rate
+
+	; tm/hm learnset
+	tmhm TOXIC,        HORN_DRILL,   BODY_SLAM,    TAKE_DOWN,    DOUBLE_EDGE,  \