ref: 43a92957899b0f14c1c60cb533f298d08c16a72b
parent: ddf1163a2135f23ec3edf51086f8cb5f83147b21
author: Rangi <remy.oukaour+rangi42@gmail.com>
date: Mon Jul 6 12:53:05 EDT 2020
add_tm, add_hm, and add_mt define TM##_MOVE, HM##_MOVE, and MT##_MOVE constants, to avoid repeating the move names in tmhm_moves.asm
--- a/constants.asm
+++ b/constants.asm
@@ -19,8 +19,6 @@
INCLUDE "constants/engine_flags.asm"
INCLUDE "constants/event_flags.asm"
INCLUDE "constants/icon_constants.asm"
-INCLUDE "constants/item_constants.asm"
-INCLUDE "constants/item_data_constants.asm"
INCLUDE "constants/landmark_constants.asm"
INCLUDE "constants/map_constants.asm"
INCLUDE "constants/map_data_constants.asm"
@@ -31,6 +29,8 @@
INCLUDE "constants/mobile_constants.asm"
INCLUDE "constants/move_constants.asm"
INCLUDE "constants/move_effect_constants.asm"
+INCLUDE "constants/item_constants.asm"
+INCLUDE "constants/item_data_constants.asm"
INCLUDE "constants/music_constants.asm"
INCLUDE "constants/npc_trade_constants.asm"
INCLUDE "constants/phone_constants.asm"
--- a/constants/item_constants.asm
+++ b/constants/item_constants.asm
@@ -198,10 +198,22 @@
const ITEM_BE ; be
add_tm: MACRO
+; Defines three constants:
+; - TM_\1: the item id, starting at $bf
+; - \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
@@ -259,12 +271,26 @@
add_tm FIRE_PUNCH ; f0
add_tm FURY_CUTTER ; f1
add_tm NIGHTMARE ; f2
-NUM_TMS EQU const_value - TM01 - 2 ; discount ITEM_C3 and ITEM_DC
+NUM_TMS EQU __enum__ - 1
add_hm: MACRO
+; Defines three constants:
+; - HM_\1: the item id, starting at $f3
+; - \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 TM item id.
if !DEF(HM01)
HM01 EQU const_value
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
@@ -276,9 +302,21 @@
add_hm FLASH ; f7
add_hm WHIRLPOOL ; f8
add_hm WATERFALL ; f9
-NUM_HMS EQU const_value - HM01
+NUM_HMS EQU __enum__ - NUM_TMS - 1
add_mt: MACRO
+; Defines two constants:
+; - \1_TMNUM: the learnable TM/HM flag, starting at 58
+; - MT##_MOVE: alias for the move id, equal to the value of \1
+MT_VALUE EQU __enum__ - NUM_TMS - NUM_HMS
+if MT_VALUE < 10
+MOVE_FOR_MT EQUS "MT0{d:MT_VALUE}_MOVE"
+else
+MOVE_FOR_MT EQUS "MT{d:MT_VALUE}_MOVE"
+endc
+MOVE_FOR_MT = \1
+PURGE MOVE_FOR_MT
+PURGE MT_VALUE
enum \1_TMNUM
ENDM
@@ -285,6 +323,8 @@
add_mt FLAMETHROWER
add_mt THUNDERBOLT
add_mt ICE_BEAM
+NUM_TUTORS = __enum__ - NUM_TMS - NUM_HMS - 1
+
NUM_TM_HM_TUTOR EQU __enum__ - 1
const ITEM_FA ; fa
--- a/data/moves/tmhm_moves.asm
+++ b/data/moves/tmhm_moves.asm
@@ -1,66 +1,46 @@
+; The add_tm, add_hm, and add_mt macros in constants/item_constants.asm simultaneously
+; define constants for the item IDs and for the corresponding move values.
+
TMHMMoves:
; entries correspond to *_TMNUM enums (see constants/item_constants.asm)
+
; TMs
- db DYNAMICPUNCH
- db HEADBUTT
- db CURSE
- db ROLLOUT
- db ROAR
- db TOXIC
- db ZAP_CANNON
- db ROCK_SMASH
- db PSYCH_UP
- db HIDDEN_POWER
- db SUNNY_DAY
- db SWEET_SCENT
- db SNORE
- db BLIZZARD
- db HYPER_BEAM
- db ICY_WIND
- db PROTECT
- db RAIN_DANCE
- db GIGA_DRAIN
- db ENDURE
- db FRUSTRATION
- db SOLARBEAM
- db IRON_TAIL
- db DRAGONBREATH
- db THUNDER
- db EARTHQUAKE
- db RETURN
- db DIG
- db PSYCHIC_M
- db SHADOW_BALL
- db MUD_SLAP
- db DOUBLE_TEAM
- db ICE_PUNCH
- db SWAGGER
- db SLEEP_TALK
- db SLUDGE_BOMB
- db SANDSTORM
- db FIRE_BLAST
- db SWIFT
- db DEFENSE_CURL
- db THUNDERPUNCH
- db DREAM_EATER
- db DETECT
- db REST
- db ATTRACT
- db THIEF
- db STEEL_WING
- db FIRE_PUNCH
- db FURY_CUTTER
- db NIGHTMARE
+n = 1
+rept NUM_TMS
+if n < 10
+MOVE_FOR_TM EQUS "TM0{d:n}_MOVE"
+else
+MOVE_FOR_TM EQUS "TM{d:n}_MOVE"
+endc
+ db MOVE_FOR_TM
+PURGE MOVE_FOR_TM
+n = n + 1
+endr
+
; HMs
- db CUT
- db FLY
- db SURF
- db STRENGTH
- db FLASH
- db WHIRLPOOL
- db WATERFALL
+n = 1
+rept NUM_HMS
+if n < 10
+MOVE_FOR_HM EQUS "HM0{d:n}_MOVE"
+else
+MOVE_FOR_HM EQUS "HM{d:n}_MOVE"
+endc
+ db MOVE_FOR_HM
+PURGE MOVE_FOR_HM
+n = n + 1
+endr
+
; Move tutor
- db FLAMETHROWER
- db THUNDERBOLT
- db ICE_BEAM
+n = 1
+rept NUM_TUTORS
+if n < 10
+MOVE_FOR_MT EQUS "MT0{d:n}_MOVE"
+else
+MOVE_FOR_MT EQUS "MT{d:n}_MOVE"
+endc
+ db MOVE_FOR_MT
+PURGE MOVE_FOR_MT
+n = n + 1
+endr
+
db 0 ; end
--- a/engine/events/move_tutor.asm
+++ b/engine/events/move_tutor.asm
@@ -40,15 +40,15 @@
cp MOVETUTOR_THUNDERBOLT
jr z, .thunderbolt
; MOVETUTOR_ICE_BEAM
- ld a, ICE_BEAM
+ ld a, MT03_MOVE ; ICE_BEAM
ret
.flamethrower
- ld a, FLAMETHROWER
+ ld a, MT01_MOVE ; FLAMETHROWER
ret
.thunderbolt
- ld a, THUNDERBOLT
+ ld a, MT02_MOVE ; THUNDERBOLT
ret
CheckCanLearnMoveTutorMove: