aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordannye <33dannye@gmail.com>2025-09-06 16:54:17 -0500
committerdannye <33dannye@gmail.com>2025-09-06 16:54:17 -0500
commit377749ca4efac05b6c57dfed049899891af6c35a (patch)
tree4b429403935c4a7c2de710a6cbf7310246874539
parentFix .tilemap file extension, fix some typos (#138) (diff)
parentDocument visual glitch with Pewter City Gym guy (#526) (diff)
downloadpokeyellow-377749ca4efac05b6c57dfed049899891af6c35a.tar.gz
pokeyellow-377749ca4efac05b6c57dfed049899891af6c35a.tar.xz
pokeyellow-377749ca4efac05b6c57dfed049899891af6c35a.zip
Merge branch 'master' of https://github.com/pret/pokered
-rw-r--r--Makefile20
-rw-r--r--constants/hardware.inc46
-rw-r--r--constants/item_constants.asm3
-rw-r--r--constants/misc_constants.asm3
-rw-r--r--constants/ram_constants.asm4
-rw-r--r--data/events/trades.asm27
-rw-r--r--data/maps/hide_show_data.asm6
-rw-r--r--data/maps/objects/Route2Gate.asm4
-rw-r--r--data/pokemon/names.asm380
-rw-r--r--data/predef_pointers.asm12
-rw-r--r--engine/battle/core.asm47
-rw-r--r--engine/battle/effects.asm12
-rw-r--r--engine/battle/init_battle.asm4
-rw-r--r--engine/battle/read_trainer_party.asm8
-rw-r--r--engine/battle/trainer_ai.asm8
-rw-r--r--engine/debug/debug_menu.asm2
-rw-r--r--engine/events/give_pokemon.asm2
-rw-r--r--engine/events/hidden_objects/bench_guys.asm9
-rw-r--r--engine/events/in_game_trades.asm2
-rw-r--r--engine/events/prize_menu.asm12
-rw-r--r--engine/gfx/palettes.asm46
-rw-r--r--engine/link/cable_club.asm2
-rw-r--r--engine/link/cable_club_npc.asm2
-rw-r--r--engine/menus/display_text_id_init.asm2
-rw-r--r--engine/menus/main_menu.asm4
-rw-r--r--engine/menus/save.asm148
-rw-r--r--engine/menus/start_sub_menus.asm36
-rw-r--r--engine/movie/hall_of_fame.asm2
-rw-r--r--engine/movie/oak_speech/clear_save.asm2
-rw-r--r--engine/movie/title.asm2
-rw-r--r--engine/movie/trade.asm12
-rw-r--r--engine/pokemon/bills_pc.asm5
-rw-r--r--engine/pokemon/status_screen.asm2
-rw-r--r--home/init.asm13
-rw-r--r--home/map_objects.asm10
-rw-r--r--home/text_script.asm4
-rw-r--r--home/vcopy.asm4
-rw-r--r--macros/asserts.asm34
-rw-r--r--macros/data.asm17
-rw-r--r--scripts/CeruleanBadgeHouse.asm4
-rw-r--r--scripts/HallOfFame.asm2
-rw-r--r--scripts/PewterCity.asm2
-rw-r--r--scripts/PokemonMansionB1F.asm16
-rw-r--r--scripts/SeafoamIslandsB4F.asm2
-rw-r--r--scripts/VermilionDock.asm10
45 files changed, 532 insertions, 462 deletions
diff --git a/Makefile b/Makefile
index bd6fff9b..673af35d 100644
--- a/Makefile
+++ b/Makefile
@@ -119,9 +119,6 @@ $(foreach obj, $(pokeyellow_vc_obj), $(eval $(call DEP,$(obj),$(obj:_vc.o=.asm))
endif
-%.asm: ;
-
-
pokeyellow_pad = 0x00
pokeyellow_debug_pad = 0xff
pokeyellow_vc_pad = 0x00
@@ -157,8 +154,6 @@ gfx/surfing_pikachu/surfing_pikachu_3.2bpp: tools/gfx += --trim-whitespace
### Catch-all graphics rules
-%.png: ;
-
%.2bpp: %.png
$(RGBGFX) --colors dmg=e4 $(rgbgfx) -o $@ $<
$(if $(tools/gfx),\
@@ -175,7 +170,18 @@ gfx/surfing_pikachu/surfing_pikachu_3.2bpp: tools/gfx += --trim-whitespace
### Catch-all audio rules
-%.wav: ;
-
%.pcm: %.wav
tools/pcm $< $@
+
+
+### File extensions that are never generated and should be manually created
+
+%.asm: ;
+%.inc: ;
+%.png: ;
+%.pal: ;
+%.bin: ;
+%.blk: ;
+%.bst: ;
+%.rle: ;
+%.wav: ;
diff --git a/constants/hardware.inc b/constants/hardware.inc
index e77034fe..e1e3b2cc 100644
--- a/constants/hardware.inc
+++ b/constants/hardware.inc
@@ -22,7 +22,7 @@ endc
; Define the include guard and the current hardware.inc version
; (do this after the RGBDS version check since the `def` syntax depends on it)
def HARDWARE_INC equ 1
-def HARDWARE_INC_VERSION equs "5.2.0"
+def HARDWARE_INC_VERSION equs "5.3.0"
; Usage: rev_Check_hardware_inc <min_ver>
; Examples:
@@ -76,6 +76,14 @@ def B_JOYP_RIGHT equ 0 ; 0 = Right is pressed (if reading Control Pad) [ro]
def JOYP_LEFT equ 1 << B_JOYP_LEFT
def JOYP_RIGHT equ 1 << B_JOYP_RIGHT
+; SGB command packet transfer uses for JOYP bits
+def B_JOYP_SGB_ONE equ 5 ; 0 = sending 1 bit
+def B_JOYP_SGB_ZERO equ 4 ; 0 = sending 0 bit
+ def JOYP_SGB_START equ %00_00_0000 ; start SGB packet transfer
+ def JOYP_SGB_ONE equ %00_01_0000 ; send 1 bit
+ def JOYP_SGB_ZERO equ %00_10_0000 ; send 0 bit
+ def JOYP_SGB_FINISH equ %00_11_0000 ; finish SGB packet transfer
+
; Combined input byte, with Control Pad in high nybble (conventional order)
def B_PAD_DOWN equ 7
def B_PAD_UP equ 6
@@ -96,7 +104,6 @@ def B_PAD_A equ 0
def PAD_B equ 1 << B_PAD_B
def PAD_A equ 1 << B_PAD_A
-
; Combined input byte, with Control Pad in low nybble (swapped order)
def B_PAD_SWAP_START equ 7
def B_PAD_SWAP_SELECT equ 6
@@ -222,7 +229,7 @@ def AUD1ENV_PACE equ %00000_111 ; how long between envelope iterations
; (in 64 Hz ticks, ~15.6 ms apart) [r/w]
; -- AUD1LOW / NR13 ($FF13) ---------------------------------------------------
-; Audio channel 1 period (low 8 bits) [r/w]
+; Audio channel 1 period (low 8 bits) [wo]
def rAUD1LOW equ $FF13
; -- AUD1HIGH / NR14 ($FF14) --------------------------------------------------
@@ -266,7 +273,7 @@ def AUD2ENV_PACE equ %00000_111 ; how long between envelope iterations
; (in 64 Hz ticks, ~15.6 ms apart) [r/w]
; -- AUD2LOW / NR23 ($FF18) ---------------------------------------------------
-; Audio channel 2 period (low 8 bits) [r/w]
+; Audio channel 2 period (low 8 bits) [wo]
def rAUD2LOW equ $FF18
; -- AUD2HIGH / NR24 ($FF19) --------------------------------------------------
@@ -304,7 +311,7 @@ def AUD3LEVEL_VOLUME equ %0_11_00000 ; volume level [r/w]
def AUD3LEVEL_25 equ %0_11_00000 ; 25%
; -- AUD3LOW / NR33 ($FF1D) ---------------------------------------------------
-; Audio channel 3 period (low 8 bits) [r/w]
+; Audio channel 3 period (low 8 bits) [wo]
def rAUD3LOW equ $FF1D
; -- AUD3HIGH / NR34 ($FF1E) --------------------------------------------------
@@ -927,15 +934,18 @@ def TILE_HEIGHT equ 8 ; height of tile in pixels
def TILE_SIZE equ 16 ; size of tile in bytes (2 bits/pixel)
def COLOR_SIZE equ 2 ; size of color in bytes (little-endian BGR555)
- def B_COLOR_RED equ 0 ; bits 4-0
- def B_COLOR_GREEN equ 5 ; bits 9-5
- def B_COLOR_BLUE equ 10 ; bits 14-10
+def PAL_COLORS equ 4 ; colors per palette
+def PAL_SIZE equ COLOR_SIZE * PAL_COLORS ; size of palette in bytes
+
+def COLOR_CH_WIDTH equ 5 ; bits per RGB color channel
+def COLOR_CH_MAX equ (1 << COLOR_CH_WIDTH) - 1
+ def B_COLOR_RED equ COLOR_CH_WIDTH * 0 ; bits 4-0
+ def B_COLOR_GREEN equ COLOR_CH_WIDTH * 1 ; bits 9-5
+ def B_COLOR_BLUE equ COLOR_CH_WIDTH * 2 ; bits 14-10
def COLOR_RED equ %000_11111 ; for the low byte
def COLOR_GREEN_LOW equ %111_00000 ; for the low byte
def COLOR_GREEN_HIGH equ %0_00000_11 ; for the high byte
def COLOR_BLUE equ %0_11111_00 ; for the high byte
-def PAL_COLORS equ 4 ; colors per palette
-def PAL_SIZE equ COLOR_SIZE * PAL_COLORS ; size of palette in bytes
; (DMG only) grayscale shade indexes for BGP, OBP0, and OBP1
def SHADE_WHITE equ %00
@@ -1032,6 +1042,22 @@ def B_BOOTUP_B_AGB equ 0
def BOOTUP_B_CGB equ 0 << B_BOOTUP_B_AGB
def BOOTUP_B_AGB equ 1 << B_BOOTUP_B_AGB
+; Register C = CPU qualifier
+def BOOTUP_C_DMG equ $13
+def BOOTUP_C_SGB equ $14
+def BOOTUP_C_CGB equ $00 ; CGB or AGB
+
+; Register D = color qualifier
+def BOOTUP_D_MONO equ $00 ; DMG, MGB, SGB, or CGB or AGB in DMG mode
+def BOOTUP_D_COLOR equ $FF ; CGB or AGB
+
+; Register E = CPU qualifier (distinguishes DMG variants)
+def BOOTUP_E_DMG0 equ $C1
+def BOOTUP_E_DMG equ $C8
+def BOOTUP_E_SGB equ $00
+def BOOTUP_E_CGB_DMGMODE equ $08 ; CGB or AGB in DMG mode
+def BOOTUP_E_CGB equ $56 ; CGB or AGB
+
;******************************************************************************
; Aliases
diff --git a/constants/item_constants.asm b/constants/item_constants.asm
index e99aa2a0..06f60a8b 100644
--- a/constants/item_constants.asm
+++ b/constants/item_constants.asm
@@ -27,6 +27,7 @@
const HYPER_POTION ; $12
const SUPER_POTION ; $13
const POTION ; $14
+; badges use item IDs (see scripts/CeruleanBadgeHouse.asm)
const BOULDERBADGE ; $15
DEF SAFARI_BAIT EQU BOULDERBADGE ; overload
const CASCADEBADGE ; $16
@@ -94,7 +95,7 @@ DEF SAFARI_ROCK EQU CASCADEBADGE ; overload
const MAX_ELIXER ; $53
DEF NUM_ITEMS EQU const_value - 1
-; elevator floors use item IDs
+; elevator floors use item IDs (see scripts/CeladonMartElevator.asm and scripts/SilphCoElevator.asm)
const FLOOR_B2F ; $54
const FLOOR_B1F ; $55
const FLOOR_1F ; $56
diff --git a/constants/misc_constants.asm b/constants/misc_constants.asm
index a542b4a7..8bd6f223 100644
--- a/constants/misc_constants.asm
+++ b/constants/misc_constants.asm
@@ -10,3 +10,6 @@ DEF TRUE EQU 1
; input
DEF NO_INPUT EQU 0
+
+; SGB command MLT_REQ can be used to detect SGB hardware
+DEF JOYP_SGB_MLT_REQ EQU %00000011
diff --git a/constants/ram_constants.asm b/constants/ram_constants.asm
index 0d6abb74..5325340e 100644
--- a/constants/ram_constants.asm
+++ b/constants/ram_constants.asm
@@ -57,6 +57,7 @@ DEF BIT_NO_PREVIOUS_MAP EQU 7
; wCurrentBoxNum
DEF BIT_HAS_CHANGED_BOXES EQU 7
+DEF BOX_NUM_MASK EQU %01111111
; wObtainedBadges, wBeatGymFlags
const_def
@@ -161,3 +162,6 @@ DEF NUM_BADGES EQU const_value
const_def
const BIT_PLAYER_LOWER_Y ; 0
const BIT_PLAYER_LOWER_X ; 1
+
+; rLCDC
+DEF LCDC_DEFAULT EQU LCDC_ON | LCDC_WIN_9C00 | LCDC_WIN_ON | LCDC_BLOCK21 | LCDC_BG_9800 | LCDC_OBJ_8 | LCDC_OBJ_ON | LCDC_BG_ON
diff --git a/data/events/trades.asm b/data/events/trades.asm
index 1da0036c..0341a87f 100644
--- a/data/events/trades.asm
+++ b/data/events/trades.asm
@@ -1,7 +1,12 @@
+MACRO npctrade
+; give mon, get mon, dialog id, nickname
+ db \1, \2, \3
+ dname \4, NAME_LENGTH
+ENDM
+
TradeMons:
; entries correspond to TRADE_FOR_* constants
table_width 3 + NAME_LENGTH
- ; give mon, get mon, dialog id, nickname
; The two instances of TRADE_DIALOGSET_EVOLUTION are a leftover
; from the Japanese Blue trades, which used species that evolve.
; TRADE_DIALOGSET_EVOLUTION did not refer to evolution in Japanese
@@ -9,14 +14,14 @@ TradeMons:
; "went and evolved" and also changed the trades to match. English
; Red/Blue uses the original JP Red/Green trades but with the JP Blue
; post-trade text.
- db LICKITUNG, DUGTRIO, TRADE_DIALOGSET_CASUAL, "GURIO@@@@@@"
- db CLEFAIRY, MR_MIME, TRADE_DIALOGSET_CASUAL, "MILES@@@@@@"
- db BUTTERFREE, BEEDRILL, TRADE_DIALOGSET_HAPPY, "STINGER@@@@" ; unused
- db KANGASKHAN, MUK, TRADE_DIALOGSET_CASUAL, "STICKY@@@@@"
- db MEW, MEW, TRADE_DIALOGSET_HAPPY, "BART@@@@@@@" ; unused
- db TANGELA, PARASECT, TRADE_DIALOGSET_CASUAL, "SPIKE@@@@@@"
- db PIDGEOT, PIDGEOT, TRADE_DIALOGSET_EVOLUTION, "MARTY@@@@@@" ; unused
- db GOLDUCK, RHYDON, TRADE_DIALOGSET_EVOLUTION, "BUFFY@@@@@@"
- db GROWLITHE, DEWGONG, TRADE_DIALOGSET_HAPPY, "CEZANNE@@@@"
- db CUBONE, MACHOKE, TRADE_DIALOGSET_HAPPY, "RICKY@@@@@@"
+ npctrade LICKITUNG, DUGTRIO, TRADE_DIALOGSET_CASUAL, "GURIO"
+ npctrade CLEFAIRY, MR_MIME, TRADE_DIALOGSET_CASUAL, "MILES"
+ npctrade BUTTERFREE, BEEDRILL, TRADE_DIALOGSET_HAPPY, "STINGER" ; unused
+ npctrade KANGASKHAN, MUK, TRADE_DIALOGSET_CASUAL, "STICKY"
+ npctrade MEW, MEW, TRADE_DIALOGSET_HAPPY, "BART" ; unused
+ npctrade TANGELA, PARASECT, TRADE_DIALOGSET_CASUAL, "SPIKE"
+ npctrade PIDGEOT, PIDGEOT, TRADE_DIALOGSET_EVOLUTION, "MARTY" ; unused
+ npctrade GOLDUCK, RHYDON, TRADE_DIALOGSET_EVOLUTION, "BUFFY"
+ npctrade GROWLITHE, DEWGONG, TRADE_DIALOGSET_HAPPY, "CEZANNE"
+ npctrade CUBONE, MACHOKE, TRADE_DIALOGSET_HAPPY, "RICKY"
assert_table_length NUM_NPC_TRADES
diff --git a/data/maps/hide_show_data.asm b/data/maps/hide_show_data.asm
index 72e3add9..de9eb979 100644
--- a/data/maps/hide_show_data.asm
+++ b/data/maps/hide_show_data.asm
@@ -256,7 +256,7 @@ MapHSPointers:
dw -1 ; end
NoHS:
- db $FF, $FF, $FF
+ db -1, -1, -1 ; end
MissableObjects:
; entries correspond to HS_* constants (see constants/hide_show_constants)
@@ -578,5 +578,5 @@ BluesHouseHSCopy: ; unreferenced
db BLUES_HOUSE, BLUESHOUSE_DAISY1, SHOW
db BLUES_HOUSE, BLUESHOUSE_DAISY2, HIDE
db BLUES_HOUSE, BLUESHOUSE_TOWN_MAP, SHOW
- db $FF, $01, SHOW ; end
- assert_table_length NUM_HS_OBJECTS + 1
+ assert_table_length NUM_HS_OBJECTS
+ db -1, 1, SHOW ; end
diff --git a/data/maps/objects/Route2Gate.asm b/data/maps/objects/Route2Gate.asm
index 6c46736d..44e4aa67 100644
--- a/data/maps/objects/Route2Gate.asm
+++ b/data/maps/objects/Route2Gate.asm
@@ -1,6 +1,6 @@
object_const_def
- const_export ROUTE2_OAKS_AIDE
- const_export ROUTE2_YOUNGSTER
+ const_export ROUTE2GATE_OAKS_AIDE
+ const_export ROUTE2GATE_YOUNGSTER
Route2Gate_Object:
db $a ; border block
diff --git a/data/pokemon/names.asm b/data/pokemon/names.asm
index 5d447c92..8e8d1120 100644
--- a/data/pokemon/names.asm
+++ b/data/pokemon/names.asm
@@ -1,193 +1,193 @@
MonsterNames::
table_width NAME_LENGTH - 1
- db "RHYDON@@@@"
- db "KANGASKHAN"
- db "NIDORAN♂@@"
- db "CLEFAIRY@@"
- db "SPEAROW@@@"
- db "VOLTORB@@@"
- db "NIDOKING@@"
- db "SLOWBRO@@@"
- db "IVYSAUR@@@"
- db "EXEGGUTOR@"
- db "LICKITUNG@"
- db "EXEGGCUTE@"
- db "GRIMER@@@@"
- db "GENGAR@@@@"
- db "NIDORAN♀@@"
- db "NIDOQUEEN@"
- db "CUBONE@@@@"
- db "RHYHORN@@@"
- db "LAPRAS@@@@"
- db "ARCANINE@@"
- db "MEW@@@@@@@"
- db "GYARADOS@@"
- db "SHELLDER@@"
- db "TENTACOOL@"
- db "GASTLY@@@@"
- db "SCYTHER@@@"
- db "STARYU@@@@"
- db "BLASTOISE@"
- db "PINSIR@@@@"
- db "TANGELA@@@"
- db "MISSINGNO."
- db "MISSINGNO."
- db "GROWLITHE@"
- db "ONIX@@@@@@"
- db "FEAROW@@@@"
- db "PIDGEY@@@@"
- db "SLOWPOKE@@"
- db "KADABRA@@@"
- db "GRAVELER@@"
- db "CHANSEY@@@"
- db "MACHOKE@@@"
- db "MR.MIME@@@"
- db "HITMONLEE@"
- db "HITMONCHAN"
- db "ARBOK@@@@@"
- db "PARASECT@@"
- db "PSYDUCK@@@"
- db "DROWZEE@@@"
- db "GOLEM@@@@@"
- db "MISSINGNO."
- db "MAGMAR@@@@"
- db "MISSINGNO."
- db "ELECTABUZZ"
- db "MAGNETON@@"
- db "KOFFING@@@"
- db "MISSINGNO."
- db "MANKEY@@@@"
- db "SEEL@@@@@@"
- db "DIGLETT@@@"
- db "TAUROS@@@@"
- db "MISSINGNO."
- db "MISSINGNO."
- db "MISSINGNO."
- db "FARFETCH'D"
- db "VENONAT@@@"
- db "DRAGONITE@"
- db "MISSINGNO."
- db "MISSINGNO."
- db "MISSINGNO."
- db "DODUO@@@@@"
- db "POLIWAG@@@"
- db "JYNX@@@@@@"
- db "MOLTRES@@@"
- db "ARTICUNO@@"
- db "ZAPDOS@@@@"
- db "DITTO@@@@@"
- db "MEOWTH@@@@"
- db "KRABBY@@@@"
- db "MISSINGNO."
- db "MISSINGNO."
- db "MISSINGNO."
- db "VULPIX@@@@"
- db "NINETALES@"
- db "PIKACHU@@@"
- db "RAICHU@@@@"
- db "MISSINGNO."
- db "MISSINGNO."
- db "DRATINI@@@"
- db "DRAGONAIR@"
- db "KABUTO@@@@"
- db "KABUTOPS@@"
- db "HORSEA@@@@"
- db "SEADRA@@@@"
- db "MISSINGNO."
- db "MISSINGNO."
- db "SANDSHREW@"
- db "SANDSLASH@"
- db "OMANYTE@@@"
- db "OMASTAR@@@"
- db "JIGGLYPUFF"
- db "WIGGLYTUFF"
- db "EEVEE@@@@@"
- db "FLAREON@@@"
- db "JOLTEON@@@"
- db "VAPOREON@@"
- db "MACHOP@@@@"
- db "ZUBAT@@@@@"
- db "EKANS@@@@@"
- db "PARAS@@@@@"
- db "POLIWHIRL@"
- db "POLIWRATH@"
- db "WEEDLE@@@@"
- db "KAKUNA@@@@"
- db "BEEDRILL@@"
- db "MISSINGNO."
- db "DODRIO@@@@"
- db "PRIMEAPE@@"
- db "DUGTRIO@@@"
- db "VENOMOTH@@"
- db "DEWGONG@@@"
- db "MISSINGNO."
- db "MISSINGNO."
- db "CATERPIE@@"
- db "METAPOD@@@"
- db "BUTTERFREE"
- db "MACHAMP@@@"
- db "MISSINGNO."
- db "GOLDUCK@@@"
- db "HYPNO@@@@@"
- db "GOLBAT@@@@"
- db "MEWTWO@@@@"
- db "SNORLAX@@@"
- db "MAGIKARP@@"
- db "MISSINGNO."
- db "MISSINGNO."
- db "MUK@@@@@@@"
- db "MISSINGNO."
- db "KINGLER@@@"
- db "CLOYSTER@@"
- db "MISSINGNO."
- db "ELECTRODE@"
- db "CLEFABLE@@"
- db "WEEZING@@@"
- db "PERSIAN@@@"
- db "MAROWAK@@@"
- db "MISSINGNO."
- db "HAUNTER@@@"
- db "ABRA@@@@@@"
- db "ALAKAZAM@@"
- db "PIDGEOTTO@"
- db "PIDGEOT@@@"
- db "STARMIE@@@"
- db "BULBASAUR@"
- db "VENUSAUR@@"
- db "TENTACRUEL"
- db "MISSINGNO."
- db "GOLDEEN@@@"
- db "SEAKING@@@"
- db "MISSINGNO."
- db "MISSINGNO."
- db "MISSINGNO."
- db "MISSINGNO."
- db "PONYTA@@@@"
- db "RAPIDASH@@"
- db "RATTATA@@@"
- db "RATICATE@@"
- db "NIDORINO@@"
- db "NIDORINA@@"
- db "GEODUDE@@@"
- db "PORYGON@@@"
- db "AERODACTYL"
- db "MISSINGNO."
- db "MAGNEMITE@"
- db "MISSINGNO."
- db "MISSINGNO."
- db "CHARMANDER"
- db "SQUIRTLE@@"
- db "CHARMELEON"
- db "WARTORTLE@"
- db "CHARIZARD@"
- db "MISSINGNO."
- db "MISSINGNO."
- db "MISSINGNO."
- db "MISSINGNO."
- db "ODDISH@@@@"
- db "GLOOM@@@@@"
- db "VILEPLUME@"
- db "BELLSPROUT"
- db "WEEPINBELL"
- db "VICTREEBEL"
+ dname "RHYDON"
+ dname "KANGASKHAN"
+ dname "NIDORAN♂"
+ dname "CLEFAIRY"
+ dname "SPEAROW"
+ dname "VOLTORB"
+ dname "NIDOKING"
+ dname "SLOWBRO"
+ dname "IVYSAUR"
+ dname "EXEGGUTOR"
+ dname "LICKITUNG"
+ dname "EXEGGCUTE"
+ dname "GRIMER"
+ dname "GENGAR"
+ dname "NIDORAN♀"
+ dname "NIDOQUEEN"
+ dname "CUBONE"
+ dname "RHYHORN"
+ dname "LAPRAS"
+ dname "ARCANINE"
+ dname "MEW"
+ dname "GYARADOS"
+ dname "SHELLDER"
+ dname "TENTACOOL"
+ dname "GASTLY"
+ dname "SCYTHER"
+ dname "STARYU"
+ dname "BLASTOISE"
+ dname "PINSIR"
+ dname "TANGELA"
+ dname "MISSINGNO."
+ dname "MISSINGNO."
+ dname "GROWLITHE"
+ dname "ONIX"
+ dname "FEAROW"
+ dname "PIDGEY"
+ dname "SLOWPOKE"
+ dname "KADABRA"
+ dname "GRAVELER"
+ dname "CHANSEY"
+ dname "MACHOKE"
+ dname "MR.MIME"
+ dname "HITMONLEE"
+ dname "HITMONCHAN"
+ dname "ARBOK"
+ dname "PARASECT"
+ dname "PSYDUCK"
+ dname "DROWZEE"
+ dname "GOLEM"
+ dname "MISSINGNO."
+ dname "MAGMAR"
+ dname "MISSINGNO."
+ dname "ELECTABUZZ"
+ dname "MAGNETON"
+ dname "KOFFING"
+ dname "MISSINGNO."
+ dname "MANKEY"
+ dname "SEEL"
+ dname "DIGLETT"
+ dname "TAUROS"
+ dname "MISSINGNO."
+ dname "MISSINGNO."
+ dname "MISSINGNO."
+ dname "FARFETCH'D"
+ dname "VENONAT"
+ dname "DRAGONITE"
+ dname "MISSINGNO."
+ dname "MISSINGNO."
+ dname "MISSINGNO."
+ dname "DODUO"
+ dname "POLIWAG"
+ dname "JYNX"
+ dname "MOLTRES"
+ dname "ARTICUNO"
+ dname "ZAPDOS"
+ dname "DITTO"
+ dname "MEOWTH"
+ dname "KRABBY"
+ dname "MISSINGNO."
+ dname "MISSINGNO."
+ dname "MISSINGNO."
+ dname "VULPIX"
+ dname "NINETALES"
+ dname "PIKACHU"
+ dname "RAICHU"
+ dname "MISSINGNO."
+ dname "MISSINGNO."
+ dname "DRATINI"
+ dname "DRAGONAIR"
+ dname "KABUTO"
+ dname "KABUTOPS"
+ dname "HORSEA"
+ dname "SEADRA"
+ dname "MISSINGNO."
+ dname "MISSINGNO."
+ dname "SANDSHREW"
+ dname "SANDSLASH"
+ dname "OMANYTE"
+ dname "OMASTAR"
+ dname "JIGGLYPUFF"
+ dname "WIGGLYTUFF"
+ dname "EEVEE"
+ dname "FLAREON"
+ dname "JOLTEON"
+ dname "VAPOREON"
+ dname "MACHOP"
+ dname "ZUBAT"
+ dname "EKANS"
+ dname "PARAS"
+ dname "POLIWHIRL"
+ dname "POLIWRATH"
+ dname "WEEDLE"
+ dname "KAKUNA"
+ dname "BEEDRILL"
+ dname "MISSINGNO."
+ dname "DODRIO"
+ dname "PRIMEAPE"
+ dname "DUGTRIO"
+ dname "VENOMOTH"
+ dname "DEWGONG"
+ dname "MISSINGNO."
+ dname "MISSINGNO."
+ dname "CATERPIE"
+ dname "METAPOD"
+ dname "BUTTERFREE"
+ dname "MACHAMP"
+ dname "MISSINGNO."
+ dname "GOLDUCK"
+ dname "HYPNO"
+ dname "GOLBAT"
+ dname "MEWTWO"
+ dname "SNORLAX"
+ dname "MAGIKARP"
+ dname "MISSINGNO."
+ dname "MISSINGNO."
+ dname "MUK"
+ dname "MISSINGNO."
+ dname "KINGLER"
+ dname "CLOYSTER"
+ dname "MISSINGNO."
+ dname "ELECTRODE"
+ dname "CLEFABLE"
+ dname "WEEZING"
+ dname "PERSIAN"
+ dname "MAROWAK"
+ dname "MISSINGNO."
+ dname "HAUNTER"
+ dname "ABRA"
+ dname "ALAKAZAM"
+ dname "PIDGEOTTO"
+ dname "PIDGEOT"
+ dname "STARMIE"
+ dname "BULBASAUR"
+ dname "VENUSAUR"
+ dname "TENTACRUEL"
+ dname "MISSINGNO."
+ dname "GOLDEEN"
+ dname "SEAKING"
+ dname "MISSINGNO."
+ dname "MISSINGNO."
+ dname "MISSINGNO."
+ dname "MISSINGNO."
+ dname "PONYTA"
+ dname "RAPIDASH"
+ dname "RATTATA"
+ dname "RATICATE"
+ dname "NIDORINO"
+ dname "NIDORINA"
+ dname "GEODUDE"
+ dname "PORYGON"
+ dname "AERODACTYL"
+ dname "MISSINGNO."
+ dname "MAGNEMITE"
+ dname "MISSINGNO."
+ dname "MISSINGNO."
+ dname "CHARMANDER"
+ dname "SQUIRTLE"
+ dname "CHARMELEON"
+ dname "WARTORTLE"
+ dname "CHARIZARD"
+ dname "MISSINGNO."
+ dname "MISSINGNO."
+ dname "MISSINGNO."
+ dname "MISSINGNO."
+ dname "ODDISH"
+ dname "GLOOM"
+ dname "VILEPLUME"
+ dname "BELLSPROUT"
+ dname "WEEPINBELL"
+ dname "VICTREEBEL"
assert_table_length NUM_POKEMON_INDEXES
diff --git a/data/predef_pointers.asm b/data/predef_pointers.asm
index ebf81847..e6968c46 100644
--- a/data/predef_pointers.asm
+++ b/data/predef_pointers.asm
@@ -53,7 +53,7 @@ PredefPointers::
add_predef DoubleOrHalveSelectedStats
add_predef ShowPokedexMenu
add_predef EvolutionAfterBattle
- add_predef SaveSAVtoSRAM0
+ add_predef SaveMainData
add_predef InitOpponent
add_predef CableClub_Run
add_predef DrawBadges
@@ -73,7 +73,7 @@ PredefPointers::
add_predef UsedCut
add_predef ShowPokedexData
add_predef WriteMonMoves
- add_predef SaveSAV
+ add_predef SaveMenu
add_predef LoadSGB
add_predef MarkTownVisitedAndLoadMissableObjects
add_predef SetPartyMonTypes
@@ -90,10 +90,10 @@ PredefPointers::
add_predef EmptyFunc ; return immediately
add_predef AskName
add_predef PewterGuys
- add_predef SaveSAVtoSRAM2
- add_predef LoadSAV2
- add_predef LoadSAV
- add_predef SaveSAVtoSRAM1
+ add_predef SavePartyAndDexData
+ add_predef LoadPartyAndDexData
+ add_predef TryLoadSaveFile
+ add_predef SaveCurrentBoxData
add_predef DoInGameTradeDialogue
add_predef HallOfFamePC
add_predef DisplayDexRating
diff --git a/engine/battle/core.asm b/engine/battle/core.asm
index 8024fb9e..ca5dcec9 100644
--- a/engine/battle/core.asm
+++ b/engine/battle/core.asm
@@ -1869,7 +1869,8 @@ AnimateRetreatingPlayerMon:
call ClearScreenArea
ret
-; reads player's current mon's HP into wBattleMonHP
+; Copies player's current pokemon's current HP and status into the party
+; struct data so it stays after battle or switching
ReadPlayerMonCurHPAndStatus:
ld a, [wPlayerMonNumber]
ld hl, wPartyMon1HP
@@ -3308,30 +3309,30 @@ PlayerCalcMoveDamage:
jp c, .moveHitTest ; SetDamageEffects moves (e.g. Seismic Toss and Super Fang) skip damage calculation
call CriticalHitTest
call HandleCounterMove
- jr z, handleIfPlayerMoveMissed
+ jr z, HandleIfPlayerMoveMissed
call GetDamageVarsForPlayerAttack
call CalculateDamage
- jp z, playerCheckIfFlyOrChargeEffect ; for moves with 0 BP, skip any further damage calculation and, for now, skip MoveHitTest
+ jp z, PlayerCheckIfFlyOrChargeEffect ; for moves with 0 BP, skip any further damage calculation and, for now, skip MoveHitTest
; for these moves, accuracy tests will only occur if they are called as part of the effect itself
call AdjustDamageForMoveType
call RandomizeDamage
.moveHitTest
call MoveHitTest
-handleIfPlayerMoveMissed:
+HandleIfPlayerMoveMissed:
ld a, [wMoveMissed]
and a
- jr z, getPlayerAnimationType
+ jr z, GetPlayerAnimationType
ld a, [wPlayerMoveEffect]
sub EXPLODE_EFFECT
- jr z, playPlayerMoveAnimation ; don't play any animation if the move missed, unless it was EXPLODE_EFFECT
- jr playerCheckIfFlyOrChargeEffect
-getPlayerAnimationType:
+ jr z, PlayPlayerMoveAnimation ; don't play any animation if the move missed, unless it was EXPLODE_EFFECT
+ jr PlayerCheckIfFlyOrChargeEffect
+GetPlayerAnimationType:
ld a, [wPlayerMoveEffect]
and a
ld a, ANIMATIONTYPE_BLINK_ENEMY_MON_SPRITE ; move has no effect other than dealing damage
- jr z, playPlayerMoveAnimation
+ jr z, PlayPlayerMoveAnimation
ld a, ANIMATIONTYPE_SHAKE_SCREEN_HORIZONTALLY_LIGHT ; move has effect
-playPlayerMoveAnimation:
+PlayPlayerMoveAnimation:
push af
ld a, [wPlayerBattleStatus2]
bit HAS_SUBSTITUTE_UP, a
@@ -3350,7 +3351,7 @@ playPlayerMoveAnimation:
ld b, BANK(ReshowSubstituteAnim)
call nz, Bankswitch
jr MirrorMoveCheck
-playerCheckIfFlyOrChargeEffect:
+PlayerCheckIfFlyOrChargeEffect:
ld c, 30
call DelayFrames
ld a, [wPlayerMoveEffect]
@@ -3417,7 +3418,7 @@ MirrorMoveCheck:
ld a, [wPlayerNumAttacksLeft]
dec a
ld [wPlayerNumAttacksLeft], a
- jp nz, getPlayerAnimationType ; for multi-hit moves, apply attack until PlayerNumAttacksLeft hits 0 or the enemy faints.
+ jp nz, GetPlayerAnimationType ; for multi-hit moves, apply attack until PlayerNumAttacksLeft hits 0 or the enemy faints.
; damage calculation and accuracy tests only happen for the first hit
res ATTACKING_MULTIPLE_TIMES, [hl] ; clear attacking multiple times status when all attacks are over
ld hl, MultiHitText
@@ -3694,7 +3695,7 @@ CheckPlayerStatusConditions:
ld [hl], a
ld a, BIDE
ld [wPlayerMoveNum], a
- ld hl, handleIfPlayerMoveMissed ; skip damage calculation, DecrementPP and MoveHitTest
+ ld hl, HandleIfPlayerMoveMissed ; skip damage calculation, DecrementPP and MoveHitTest
jp .returnToHL
.ThrashingAboutCheck
@@ -3728,7 +3729,7 @@ CheckPlayerStatusConditions:
ld a, [wPlayerNumAttacksLeft]
dec a ; did multi-turn move end?
ld [wPlayerNumAttacksLeft], a
- ld hl, getPlayerAnimationType ; if it didn't, skip damage calculation (deal damage equal to last hit),
+ ld hl, GetPlayerAnimationType ; if it didn't, skip damage calculation (deal damage equal to last hit),
; DecrementPP and MoveHitTest
jp nz, .returnToHL
jp .returnToHL
@@ -5749,7 +5750,7 @@ RandomizeDamage:
.loop
call BattleRandom
rrca
- cp 217
+ cp 85 percent + 1
jr c, .loop
ldh [hMultiplier], a
call Multiply ; multiply damage by the random number, which is in the range [217, 255]
@@ -5842,7 +5843,7 @@ EnemyCalcMoveDamage:
jp c, EnemyMoveHitTest
call CriticalHitTest
call HandleCounterMove
- jr z, handleIfEnemyMoveMissed
+ jr z, HandleIfEnemyMoveMissed
call SwapPlayerAndEnemyLevels
call GetDamageVarsForEnemyAttack
call SwapPlayerAndEnemyLevels
@@ -5853,13 +5854,13 @@ EnemyCalcMoveDamage:
EnemyMoveHitTest:
call MoveHitTest
-handleIfEnemyMoveMissed:
+HandleIfEnemyMoveMissed:
ld a, [wMoveMissed]
and a
jr z, .moveDidNotMiss
ld a, [wEnemyMoveEffect]
cp EXPLODE_EFFECT
- jr z, handleExplosionMiss
+ jr z, HandleExplosionMiss
jr EnemyCheckIfFlyOrChargeEffect
.moveDidNotMiss
call SwapPlayerAndEnemyLevels
@@ -5868,13 +5869,13 @@ GetEnemyAnimationType:
ld a, [wEnemyMoveEffect]
and a
ld a, ANIMATIONTYPE_SHAKE_SCREEN_VERTICALLY
- jr z, playEnemyMoveAnimation
+ jr z, PlayEnemyMoveAnimation
ld a, ANIMATIONTYPE_SHAKE_SCREEN_HORIZONTALLY_HEAVY
- jr playEnemyMoveAnimation
-handleExplosionMiss:
+ jr PlayEnemyMoveAnimation
+HandleExplosionMiss:
call SwapPlayerAndEnemyLevels
xor a
-playEnemyMoveAnimation:
+PlayEnemyMoveAnimation:
push af
ld a, [wEnemyBattleStatus2]
bit HAS_SUBSTITUTE_UP, a ; does mon have a substitute?
@@ -6213,7 +6214,7 @@ CheckEnemyStatusConditions:
ld a, BIDE
ld [wEnemyMoveNum], a
call SwapPlayerAndEnemyLevels
- ld hl, handleIfEnemyMoveMissed ; skip damage calculation, DecrementPP and MoveHitTest
+ ld hl, HandleIfEnemyMoveMissed ; skip damage calculation, DecrementPP and MoveHitTest
jp .enemyReturnToHL
.checkIfThrashingAbout
bit THRASHING_ABOUT, [hl] ; is mon using thrash or petal dance?
diff --git a/engine/battle/effects.asm b/engine/battle/effects.asm
index b2976a64..6a674ec5 100644
--- a/engine/battle/effects.asm
+++ b/engine/battle/effects.asm
@@ -7,9 +7,9 @@ _JumpMoveEffect:
ldh a, [hWhoseTurn]
and a
ld a, [wPlayerMoveEffect]
- jr z, .next1
+ jr z, .next
ld a, [wEnemyMoveEffect]
-.next1
+.next
dec a ; subtract 1, there is no special effect for 00
add a ; x2, 16bit pointers
ld hl, MoveEffectPointerTable
@@ -716,14 +716,14 @@ UpdateLoweredStatDone:
call PrintStatText
pop de
ld a, [de]
- cp $44
+ cp ATTACK_DOWN_SIDE_EFFECT ; for all side effects, move animation has already played, skip it
jr nc, .ApplyBadgeBoostsAndStatusPenalties
call PlayCurrentMoveAnimation2
.ApplyBadgeBoostsAndStatusPenalties
ldh a, [hWhoseTurn]
and a
call nz, ApplyBadgeStatBoosts ; whenever the player uses a stat-down move, badge boosts get reapplied again to every stat,
- ; even to those not affected by the stat-up move (will be boosted further)
+ ; even to those not affected by the stat-down move (will be boosted further)
ld hl, MonsStatsFellText
call PrintText
@@ -1494,9 +1494,9 @@ CheckTargetSubstitute:
ld hl, wEnemyBattleStatus2
ldh a, [hWhoseTurn]
and a
- jr z, .next1
+ jr z, .next
ld hl, wPlayerBattleStatus2
-.next1
+.next
bit HAS_SUBSTITUTE_UP, [hl]
pop hl
ret
diff --git a/engine/battle/init_battle.asm b/engine/battle/init_battle.asm
index fabff3e3..629ae7b0 100644
--- a/engine/battle/init_battle.asm
+++ b/engine/battle/init_battle.asm
@@ -117,12 +117,12 @@ _InitBattleCommon:
call PrintText
call SaveScreenTilesToBuffer1
call ClearScreen
- ld a, $98
+ ld a, HIGH(vBGMap0)
ldh [hAutoBGTransferDest + 1], a
ld a, $1
ldh [hAutoBGTransferEnabled], a
call Delay3
- ld a, $9c
+ ld a, HIGH(vBGMap1)
ldh [hAutoBGTransferDest + 1], a
call LoadScreenTilesFromBuffer1
hlcoord 9, 7
diff --git a/engine/battle/read_trainer_party.asm b/engine/battle/read_trainer_party.asm
index 6a46759e..c8ee8fda 100644
--- a/engine/battle/read_trainer_party.asm
+++ b/engine/battle/read_trainer_party.asm
@@ -31,14 +31,14 @@ ReadTrainer:
; and hl points to the trainer class.
; Our next task is to iterate through the trainers,
; decrementing b each time, until we get to the right one.
-.outer
+.CheckNextTrainer
dec b
jr z, .IterateTrainer
-.inner
+.SkipTrainer
ld a, [hli]
and a
- jr nz, .inner
- jr .outer
+ jr nz, .SkipTrainer
+ jr .CheckNextTrainer
; if the first byte of trainer data is FF,
; - each pokemon has a specific level
diff --git a/engine/battle/trainer_ai.asm b/engine/battle/trainer_ai.asm
index 7843b1e2..7081fdfd 100644
--- a/engine/battle/trainer_ai.asm
+++ b/engine/battle/trainer_ai.asm
@@ -692,22 +692,22 @@ AICheckIfHPBelowFraction:
ret
AIUseXAttack:
- ld b, $A
+ ld b, ATTACK_UP1_EFFECT
ld a, X_ATTACK
jr AIIncreaseStat
AIUseXDefend:
- ld b, $B
+ ld b, DEFENSE_UP1_EFFECT
ld a, X_DEFEND
jr AIIncreaseStat
AIUseXSpeed:
- ld b, $C
+ ld b, SPEED_UP1_EFFECT
ld a, X_SPEED
jr AIIncreaseStat
AIUseXSpecial:
- ld b, $D
+ ld b, SPECIAL_UP1_EFFECT
ld a, X_SPECIAL
; fallthrough
diff --git a/engine/debug/debug_menu.asm b/engine/debug/debug_menu.asm
index 5cd07d53..a8f147a6 100644
--- a/engine/debug/debug_menu.asm
+++ b/engine/debug/debug_menu.asm
@@ -1568,7 +1568,7 @@ Func_ff295:
push af
ld a, 1 << BIT_FAST_TEXT_DELAY
ld [wLetterPrintingDelayFlags], a
- callfar SaveSAVtoSRAM
+ callfar SaveGameData
pop af
ld [wLetterPrintingDelayFlags], a
pop de
diff --git a/engine/events/give_pokemon.asm b/engine/events/give_pokemon.asm
index e33d5165..5d7d0661 100644
--- a/engine/events/give_pokemon.asm
+++ b/engine/events/give_pokemon.asm
@@ -20,7 +20,7 @@ _GivePokemon::
callfar SendNewMonToBox
ld hl, wStringBuffer
ld a, [wCurrentBoxNum]
- and $7f
+ and BOX_NUM_MASK
cp 9
jr c, .singleDigitBoxNum
sub 9
diff --git a/engine/events/hidden_objects/bench_guys.asm b/engine/events/hidden_objects/bench_guys.asm
index 55090c01..e5a2a724 100644
--- a/engine/events/hidden_objects/bench_guys.asm
+++ b/engine/events/hidden_objects/bench_guys.asm
@@ -17,6 +17,15 @@ PrintBenchGuyText:
ld b, a
ld a, [wSpritePlayerStateData1FacingDirection]
cp b
+
+ ; bug: an 'inc hl' instruction is needed before looping back. When trying to
+ ; talk to a bench guy from above, this Sprite Facing test will fail, and the
+ ; next loop iteration will be misaligned within BenchGuyTextPointers table.
+ ; As a result, the routine will miss the terminator byte, and continue to
+ ; process data beyond the table boundary.
+ ; It seems that it will only return after starting to read data from VRAM
+ ; (According to Pan Docs, during PPU mode 3, reads return garbage value,
+ ; usually $FF).
jr nz, .loop ; player isn't facing the bench guy
ld a, [hl]
jp PrintPredefTextID
diff --git a/engine/events/in_game_trades.asm b/engine/events/in_game_trades.asm
index 3671dba8..8c5f4e5c 100644
--- a/engine/events/in_game_trades.asm
+++ b/engine/events/in_game_trades.asm
@@ -259,7 +259,7 @@ InGameTrade_CheckForTradeEvo:
jp PlayDefaultMusic
InGameTrade_TrainerString:
- db "<TRAINER>@@@@@@@@@@"
+ dname "<TRAINER>", NAME_LENGTH
InGameTradeTextPointers:
; entries correspond to TRADE_DIALOGSET_* constants
diff --git a/engine/events/prize_menu.asm b/engine/events/prize_menu.asm
index 4285b7d6..16ada216 100644
--- a/engine/events/prize_menu.asm
+++ b/engine/events/prize_menu.asm
@@ -2,12 +2,12 @@ CeladonPrizeMenu::
ld b, COIN_CASE
call IsItemInBag
jr nz, .havingCoinCase
- ld hl, RequireCoinCaseTextPtr
+ ld hl, RequireCoinCaseText
jp PrintText
.havingCoinCase
ld hl, wStatusFlags5
set BIT_NO_TEXT_DELAY, [hl]
- ld hl, ExchangeCoinsForPrizesTextPtr
+ ld hl, ExchangeCoinsForPrizesText
call PrintText
; the following are the menu settings
xor a
@@ -27,7 +27,7 @@ CeladonPrizeMenu::
call TextBoxBorder
call GetPrizeMenuId
call UpdateSprites
- ld hl, WhichPrizeTextPtr
+ ld hl, WhichPrizeText
call PrintText
call HandleMenuInput ; menu choice handler
bit B_PAD_B, a
@@ -41,16 +41,16 @@ CeladonPrizeMenu::
res BIT_NO_TEXT_DELAY, [hl]
ret
-RequireCoinCaseTextPtr:
+RequireCoinCaseText:
text_far _RequireCoinCaseText
text_waitbutton
text_end
-ExchangeCoinsForPrizesTextPtr:
+ExchangeCoinsForPrizesText:
text_far _ExchangeCoinsForPrizesText
text_end
-WhichPrizeTextPtr:
+WhichPrizeText:
text_far _WhichPrizeText
text_end
diff --git a/engine/gfx/palettes.asm b/engine/gfx/palettes.asm
index e2924c91..e46c6715 100644
--- a/engine/gfx/palettes.asm
+++ b/engine/gfx/palettes.asm
@@ -491,30 +491,30 @@ _SendSGBPacket:
; save B for later use
push bc
; send RESET signal (P14=LOW, P15=LOW)
- xor a
+ xor a ; JOYP_SGB_START
ldh [rJOYP], a
; set P14=HIGH, P15=HIGH
- ld a, $30
+ ld a, JOYP_SGB_FINISH
ldh [rJOYP], a
;load length of packets (16 bytes)
- ld b, $10
+ ld b, 16
.nextByte
;set bit counter (8 bits per byte)
- ld e, $08
+ ld e, 8
; get next byte in the packet
ld a, [hli]
ld d, a
.nextBit0
bit 0, d
; if 0th bit is not zero set P14=HIGH, P15=LOW (send bit 1)
- ld a, $10
+ ld a, JOYP_SGB_ONE
jr nz, .next0
; else (if 0th bit is zero) set P14=LOW, P15=HIGH (send bit 0)
- ld a, $20
+ ld a, JOYP_SGB_ZERO
.next0
ldh [rJOYP], a
; must set P14=HIGH,P15=HIGH between each "pulse"
- ld a, $30
+ ld a, JOYP_SGB_FINISH
ldh [rJOYP], a
; rotation will put next bit in 0th position (so we can always use command
; "bit 0, d" to fetch the bit that has to be sent)
@@ -524,11 +524,11 @@ _SendSGBPacket:
jr nz, .nextBit0
dec b
jr nz, .nextByte
-; send bit 1 as a "stop bit" (end of parameter data)
- ld a, $20
+; send bit 0 as a "stop bit" (end of parameter data)
+ ld a, JOYP_SGB_ZERO
ldh [rJOYP], a
; set P14=HIGH,P15=HIGH
- ld a, $30
+ ld a, JOYP_SGB_FINISH
ldh [rJOYP], a
; wait for about 70000 cycles
call Wait7000
@@ -612,20 +612,20 @@ CheckSGB:
call SendSGBPacket
call Wait7000
ldh a, [rJOYP]
- and $3
- cp $3
+ and JOYP_SGB_MLT_REQ
+ cp JOYP_SGB_MLT_REQ
jr nz, .isSGB
- ld a, $20
+ ld a, JOYP_SGB_ZERO
ldh [rJOYP], a
ldh a, [rJOYP]
ldh a, [rJOYP]
call Wait7000
call Wait7000
- ld a, $30
+ ld a, JOYP_SGB_FINISH
ldh [rJOYP], a
call Wait7000
call Wait7000
- ld a, $10
+ ld a, JOYP_SGB_ONE
ldh [rJOYP], a
ldh a, [rJOYP]
ldh a, [rJOYP]
@@ -635,7 +635,7 @@ CheckSGB:
ldh a, [rJOYP]
call Wait7000
call Wait7000
- ld a, $30
+ ld a, JOYP_SGB_FINISH
ldh [rJOYP], a
ldh a, [rJOYP]
ldh a, [rJOYP]
@@ -643,8 +643,8 @@ CheckSGB:
call Wait7000
call Wait7000
ldh a, [rJOYP]
- and $3
- cp $3
+ and JOYP_SGB_MLT_REQ
+ cp JOYP_SGB_MLT_REQ
jr nz, .isSGB
call SendMltReq1Packet
and a
@@ -674,15 +674,15 @@ CopyGfxToSuperNintendoVRAM:
call CopySGBBorderTiles
jr .next
.notCopyingTileData
- ld bc, $1000
+ ld bc, 256 tiles
call CopyData
.next
ld hl, vBGMap0
- ld de, $c
+ ld de, TILEMAP_WIDTH - SCREEN_WIDTH
ld a, $80
- ld c, $d
+ ld c, (256 + SCREEN_WIDTH - 1) / SCREEN_WIDTH ; enough rows to fit 256 tiles
.loop
- ld b, $14
+ ld b, SCREEN_WIDTH
.innerLoop
ld [hli], a
inc a
@@ -691,7 +691,7 @@ CopyGfxToSuperNintendoVRAM:
add hl, de
dec c
jr nz, .loop
- ld a, $e3
+ ld a, LCDC_DEFAULT
ldh [rLCDC], a
pop hl
call SendSGBPacket
diff --git a/engine/link/cable_club.asm b/engine/link/cable_club.asm
index ce6c582b..f7539bdb 100644
--- a/engine/link/cable_club.asm
+++ b/engine/link/cable_club.asm
@@ -867,7 +867,7 @@ TradeCenter_Trade:
hlcoord 1, 14
ld de, TradeCompleted
call PlaceString
- predef SaveSAVtoSRAM2
+ predef SavePartyAndDexData ; this allows reset into Pokecenter
vc_hook Trade_save_game_end
ld c, 50
call DelayFrames
diff --git a/engine/link/cable_club_npc.asm b/engine/link/cable_club_npc.asm
index ba29ca06..fda27dd9 100644
--- a/engine/link/cable_club_npc.asm
+++ b/engine/link/cable_club_npc.asm
@@ -67,7 +67,7 @@ CableClubNPC::
and a
jr nz, .choseNo
vc_hook Wireless_TryQuickSave_block_input
- callfar SaveSAVtoSRAM
+ callfar SaveGameData
call WaitForSoundToFinish
ld a, SFX_SAVE
call PlaySoundWaitForCurrent
diff --git a/engine/menus/display_text_id_init.asm b/engine/menus/display_text_id_init.asm
index 74fb5800..ca828006 100644
--- a/engine/menus/display_text_id_init.asm
+++ b/engine/menus/display_text_id_init.asm
@@ -66,7 +66,7 @@ DisplayTextIDInit::
add hl, de
dec c
jr nz, .spriteStandStillLoop
- ld b, $9c ; window background address
+ ld b, HIGH(vBGMap1)
call CopyScreenTileBufferToVRAM ; transfer background in WRAM to VRAM
xor a
ldh [hWY], a ; put the window on the screen
diff --git a/engine/menus/main_menu.asm b/engine/menus/main_menu.asm
index d739e560..262250a3 100644
--- a/engine/menus/main_menu.asm
+++ b/engine/menus/main_menu.asm
@@ -8,7 +8,7 @@ MainMenu:
call CheckForPlayerNameInSRAM
jr nc, .mainMenuLoop
- predef LoadSAV
+ predef TryLoadSaveFile
.mainMenuLoop
ld c, 20
@@ -278,7 +278,7 @@ CheckForPlayerNameInSRAM:
ld [rRAMG], a
ld a, BMODE_ADVANCED
ld [rBMODE], a
- ASSERT BMODE_ADVANCED == BANK("Save Data")
+ ASSERT BANK(sPlayerName) == BMODE_ADVANCED
ld [rRAMB], a
ld b, NAME_LENGTH
ld hl, sPlayerName
diff --git a/engine/menus/save.asm b/engine/menus/save.asm
index 51c6197a..0ad7eeac 100644
--- a/engine/menus/save.asm
+++ b/engine/menus/save.asm
@@ -1,16 +1,15 @@
-LoadSAV:
-; if carry, write "the file data is destroyed"
+TryLoadSaveFile:
call ClearScreen
call LoadFontTilePatterns
call LoadTextBoxTilePatterns
- call LoadSAV0
+ call LoadMainData
jr c, .badsum
- call LoadSAV1
+ call LoadCurrentBoxData
jr c, .badsum
- call LoadSAV2
+ call LoadPartyAndDexData
jr c, .badsum
ld a, $2 ; good checksum
- jr .goodsum
+ jr .done
.badsum
ld hl, wStatusFlags5
push hl
@@ -22,7 +21,7 @@ LoadSAV:
pop hl
res BIT_NO_TEXT_DELAY, [hl]
ld a, $1 ; bad checksum
-.goodsum
+.done
ld [wSaveFileStatus], a
ret
@@ -30,7 +29,7 @@ FileDataDestroyedText:
text_far _FileDataDestroyedText
text_end
-LoadSAV0:
+LoadMainData:
call EnableSRAM
ld a, BANK("Save Data")
ld [rRAMB], a
@@ -39,22 +38,22 @@ LoadSAV0:
vc_hook Unknown_save_limit
ld hl, sGameData
ld bc, sGameDataEnd - sGameData
- call SAVCheckSum
+ call CalcCheckSum
ld c, a
ld a, [sMainDataCheckSum]
cp c
- jp z, .checkSumsMatched
+ jp z, .checkSumMatched
; If the computed checksum didn't match the saved on, try again.
ld hl, sGameData
ld bc, sGameDataEnd - sGameData
- call SAVCheckSum
+ call CalcCheckSum
ld c, a
ld a, [sMainDataCheckSum]
cp c
- jp nz, SAVBadCheckSum
+ jp nz, CheckSumFailed
-.checkSumsMatched
+.checkSumMatched
ld hl, sPlayerName
ld de, wPlayerName
ld bc, NAME_LENGTH
@@ -71,42 +70,45 @@ LoadSAV0:
call CopyData
ld a, [sTileAnimations]
ldh [hTileAnimations], a
+
+; this part is redundant, LoadCurrentBoxData is always called next
ld hl, sCurBoxData
ld de, wBoxDataStart
ld bc, wBoxDataEnd - wBoxDataStart
call CopyData
+
and a
- jp SAVGoodChecksum
+ jp GoodCheckSum
-LoadSAV1:
+LoadCurrentBoxData:
call EnableSRAM
ld a, BANK("Save Data")
ld [rRAMB], a
ld hl, sGameData
ld bc, sGameDataEnd - sGameData
- call SAVCheckSum
+ call CalcCheckSum
ld c, a
ld a, [sMainDataCheckSum]
cp c
- jr nz, SAVBadCheckSum
+ jr nz, CheckSumFailed
ld hl, sCurBoxData
ld de, wBoxDataStart
ld bc, wBoxDataEnd - wBoxDataStart
call CopyData
and a
- jp SAVGoodChecksum
+ jp GoodCheckSum
-LoadSAV2:
+LoadPartyAndDexData:
call EnableSRAM
ld a, BANK("Save Data")
ld [rRAMB], a
ld hl, sGameData
ld bc, sGameDataEnd - sGameData
- call SAVCheckSum
+ call CalcCheckSum
ld c, a
ld a, [sMainDataCheckSum]
cp c
- jp nz, SAVBadCheckSum
+ jp nz, CheckSumFailed
ld hl, sPartyData
ld de, wPartyDataStart
ld bc, wPartyDataEnd - wPartyDataStart
@@ -116,27 +118,29 @@ LoadSAV2:
ld bc, wPokedexSeenEnd - wPokedexOwned
call CopyData
and a
- jp SAVGoodChecksum
+ jp GoodCheckSum
-SAVBadCheckSum:
+CheckSumFailed:
scf
+ ; fallthrough
-SAVGoodChecksum:
+GoodCheckSum:
call DisableSRAM
ret
-LoadSAVIgnoreBadCheckSum:
-; unused function that loads save data and ignores bad checksums
- call LoadSAV0
- call LoadSAV1
- jp LoadSAV2
+TryLoadSaveFileIgnoreChecksum: ; unreferenced
+; don't update wSaveFileStatus upon success or failure
+; don't display warning in case of failed checksum
+ call LoadMainData
+ call LoadCurrentBoxData
+ jp LoadPartyAndDexData
-SaveSAV:
+SaveMenu:
farcall PrintSaveScreenText
ld c, 10
call DelayFrames
ld hl, WouldYouLikeToSaveText
- call SaveSAVConfirm
+ call SaveTheGame_YesOrNo
and a ;|0 = Yes|1 = No|
ret nz
ld c, 10
@@ -144,14 +148,14 @@ SaveSAV:
ld a, [wSaveFileStatus]
cp $1
jr z, .save
- call SAVCheckRandomID
+ call CheckPreviousSaveFile
jr z, .save
ld hl, OlderFileWillBeErasedText
- call SaveSAVConfirm
+ call SaveTheGame_YesOrNo
and a
ret nz
.save
- call SaveSAVtoSRAM
+ call SaveGameData
ld hl, SavingText
call PrintText
ld c, 128
@@ -167,13 +171,13 @@ SaveSAV:
call DelayFrames
ret
-SaveSAVConfirm:
+SaveTheGame_YesOrNo:
call PrintText
hlcoord 0, 7
lb bc, 8, 1
ld a, TWO_OPTION_MENU
ld [wTextBoxID], a
- call DisplayTextBoxID ; yes/no menu
+ call DisplayTextBoxID
ld a, [wCurrentMenuItem]
ret
@@ -193,10 +197,11 @@ OlderFileWillBeErasedText:
text_far _OlderFileWillBeErasedText
text_end
-SaveSAVtoSRAM0:
+SaveMainData:
call EnableSRAM
ld a, BANK("Save Data")
ld [rRAMB], a
+
ld hl, wPlayerName
ld de, sPlayerName
ld bc, NAME_LENGTH
@@ -210,20 +215,22 @@ SaveSAVtoSRAM0:
ld bc, wSpriteDataEnd - wSpriteDataStart
call CopyData
ld hl, wBoxDataStart
+
+; this part is redundant, SaveCurrentBoxData is always called next
ld de, sCurBoxData
ld bc, wBoxDataEnd - wBoxDataStart
call CopyData
ldh a, [hTileAnimations]
ld [sTileAnimations], a
+
ld hl, sGameData
ld bc, sGameDataEnd - sGameData
- call SAVCheckSum
+ call CalcCheckSum
ld [sMainDataCheckSum], a
call DisableSRAM
ret
-SaveSAVtoSRAM1:
-; stored pokémon
+SaveCurrentBoxData:
call EnableSRAM
ld a, BANK("Save Data")
ld [rRAMB], a
@@ -233,12 +240,12 @@ SaveSAVtoSRAM1:
call CopyData
ld hl, sGameData
ld bc, sGameDataEnd - sGameData
- call SAVCheckSum
+ call CalcCheckSum
ld [sMainDataCheckSum], a
call DisableSRAM
ret
-SaveSAVtoSRAM2:
+SavePartyAndDexData:
call EnableSRAM
ld a, BANK("Save Data")
ld [rRAMB], a
@@ -259,19 +266,19 @@ SaveSAVtoSRAM2:
ld [de], a
ld hl, sGameData
ld bc, sGameDataEnd - sGameData
- call SAVCheckSum
+ call CalcCheckSum
ld [sMainDataCheckSum], a
call DisableSRAM
ret
-SaveSAVtoSRAM::
+SaveGameData::
ld a, $2
ld [wSaveFileStatus], a
- call SaveSAVtoSRAM0
- call SaveSAVtoSRAM1
- jp SaveSAVtoSRAM2
+ call SaveMainData
+ call SaveCurrentBoxData
+ jp SavePartyAndDexData
-SAVCheckSum:
+CalcCheckSum:
;Check Sum (result[1 byte] is complemented)
ld d, 0
.loop
@@ -294,7 +301,7 @@ CalcIndividualBoxCheckSums:
push bc
push de
ld bc, wBoxDataEnd - wBoxDataStart
- call SAVCheckSum
+ call CalcCheckSum
pop de
ld [de], a
inc de
@@ -308,7 +315,7 @@ GetBoxSRAMLocation:
; out: b = box SRAM bank, hl = pointer to start of box
ld hl, BoxSRAMPointerTable
ld a, [wCurrentBoxNum]
- and $7f
+ and BOX_NUM_MASK
cp NUM_BOXES / 2
ld b, 2
jr c, .next
@@ -373,7 +380,7 @@ ChangeBox::
ld a, [hl]
ld [de], a
call RestoreMapTextPointer
- call SaveSAVtoSRAM
+ call SaveGameData
ld hl, wChangeBoxSavedMapTextPointer
call SetMapTextPointer
ret
@@ -392,7 +399,7 @@ CopyBoxToOrFromSRAM:
call CopyData
pop hl
-; mark the memory that the box was copied from as am empty box
+; mark the source box as an empty box
xor a
ld [hli], a
dec a
@@ -400,7 +407,7 @@ CopyBoxToOrFromSRAM:
ld hl, sBox1 ; sBox7
ld bc, sBank2AllBoxesChecksum - sBox1
- call SAVCheckSum
+ call CalcCheckSum
ld [sBank2AllBoxesChecksum], a ; sBank3AllBoxesChecksum
call CalcIndividualBoxCheckSums
call DisableSRAM
@@ -420,7 +427,7 @@ DisplayChangeBoxMenu:
xor a
ld [wMenuWatchMovingOutOfBounds], a
ld a, [wCurrentBoxNum]
- and $7f
+ and BOX_NUM_MASK
ld [wCurrentMenuItem], a
ld [wLastMenuItem], a
hlcoord 0, 0
@@ -439,7 +446,7 @@ DisplayChangeBoxMenu:
ld hl, hUILayoutFlags
res BIT_SINGLE_SPACED_LINES, [hl]
ld a, [wCurrentBoxNum]
- and $7f
+ and BOX_NUM_MASK
cp 9
jr c, .singleDigitBoxNum
sub 9
@@ -458,7 +465,7 @@ DisplayChangeBoxMenu:
hlcoord 18, 1
ld de, wBoxMonCounts
ld bc, SCREEN_WIDTH
- ld a, $c
+ ld a, NUM_BOXES
.loop
push af
ld a, [de]
@@ -525,7 +532,7 @@ EmptySRAMBoxesInBank:
call EmptySRAMBox
ld hl, sBox1 ; sBox7
ld bc, sBank2AllBoxesChecksum - sBox1
- call SAVCheckSum
+ call CalcCheckSum
ld [sBank2AllBoxesChecksum], a ; sBank3AllBoxesChecksum
call CalcIndividualBoxCheckSums
ret
@@ -552,7 +559,7 @@ GetMonCountsForAllBoxes:
; copy the count for the current box from WRAM
ld a, [wCurrentBoxNum]
- and $7f
+ and BOX_NUM_MASK
ld c, a
ld b, 0
add hl, bc
@@ -576,10 +583,10 @@ GetMonCountsForBoxesInBank:
ld [hli], a
ret
-SAVCheckRandomID:
-; checks if Sav file is the same by checking player's name 1st letter
-; and the two random numbers generated at game beginning
-; (which are stored at wPlayerID)s
+; check if we're trying to save over a different playthrough
+; return result in zero flag
+; z set: a valid save file was found, and saved PlayerID is different from wPlayerID
+CheckPreviousSaveFile:
call EnableSRAM
ld a, BANK("Save Data")
ld [rRAMB], a
@@ -588,11 +595,11 @@ SAVCheckRandomID:
jr z, .next
ld hl, sGameData
ld bc, sGameDataEnd - sGameData
- call SAVCheckSum
+ call CalcCheckSum
ld c, a
ld a, [sMainDataCheckSum]
cp c
- jr nz, .next
+ jr nz, .next ; return z set if save data is corrupted
ld hl, sMainData + (wPlayerID - wMainDataStart) ; player ID
ld a, [hli]
ld h, [hl]
@@ -603,8 +610,9 @@ SAVCheckRandomID:
ld a, [wPlayerID + 1]
cp h
.next
- ld a, $00
+ ld a, BMODE_SIMPLE
ld [rBMODE], a
+ ASSERT RAMG_SRAM_DISABLE == BMODE_SIMPLE
ld [rRAMG], a
ret
@@ -651,19 +659,20 @@ HallOfFame_Copy:
call DisableSRAM
ret
-ClearSAV:
+; Fill SRAM with $ff, erasing save data. Used by DoClearSaveDialogue
+ClearAllSRAMBanks:
call EnableSRAM
ld a, $4
.loop
dec a
push af
- call PadSRAM_FF
+ call .PadSRAM_FF
pop af
jr nz, .loop
call DisableSRAM
ret
-PadSRAM_FF:
+.PadSRAM_FF
ld [rRAMB], a
ld hl, STARTOF(SRAM)
ld bc, SIZEOF(SRAM)
@@ -678,7 +687,8 @@ EnableSRAM:
ret
DisableSRAM:
- ld a, 0
+ ld a, BMODE_SIMPLE ; preserve flags
ld [rBMODE], a
+ ASSERT RAMG_SRAM_DISABLE == BMODE_SIMPLE
ld [rRAMG], a
ret
diff --git a/engine/menus/start_sub_menus.asm b/engine/menus/start_sub_menus.asm
index 9e8a181b..32258437 100644
--- a/engine/menus/start_sub_menus.asm
+++ b/engine/menus/start_sub_menus.asm
@@ -1,6 +1,6 @@
StartMenu_Pokedex::
predef ShowPokedexMenu
- call LoadScreenTilesFromBuffer2 ; restore saved screen
+ call LoadScreenTilesFromBuffer2
call Delay3
call LoadGBPal
call UpdateSprites
@@ -63,7 +63,7 @@ StartMenu_Pokemon::
ld [hl], a
call HandleMenuInput
push af
- call LoadScreenTilesFromBuffer1 ; restore saved screen
+ call LoadScreenTilesFromBuffer1
pop af
bit B_PAD_B, a
jp nz, .loop
@@ -117,7 +117,7 @@ StartMenu_Pokemon::
ld a, [hli]
ld h, [hl]
ld l, a
- ld a, [wObtainedBadges] ; badges obtained
+ ld a, [wObtainedBadges]
jp hl
.outOfBattleMovePointers
dw .cut
@@ -303,7 +303,7 @@ StartMenu_Pokemon::
; writes a blank tile to all possible menu cursor positions on the party menu
ErasePartyMenuCursors::
hlcoord 0, 1
- ld bc, 2 * 20 ; menu cursor positions are 2 rows apart
+ ld bc, 2 * SCREEN_WIDTH ; menu cursor positions are 2 rows apart
ld a, 6 ; 6 menu cursor positions
.loop
ld [hl], " "
@@ -313,7 +313,7 @@ ErasePartyMenuCursors::
ret
ItemMenuLoop:
- call LoadScreenTilesFromBuffer2DisableBGTransfer ; restore saved screen
+ call LoadScreenTilesFromBuffer2DisableBGTransfer
call RunDefaultPaletteCommand
StartMenu_Item::
@@ -340,7 +340,7 @@ StartMenu_Item::
ld [wBagSavedMenuItem], a
jr nc, .choseItem
.exitMenu
- call LoadScreenTilesFromBuffer2 ; restore saved screen
+ call LoadScreenTilesFromBuffer2
call LoadTextBoxTilePatterns
call UpdateSprites
jp RedisplayStartMenu
@@ -380,7 +380,7 @@ StartMenu_Item::
bit B_PAD_B, a
jr z, .useOrTossItem
jp ItemMenuLoop
-.useOrTossItem ; if the player made the choice to use or toss the item
+.useOrTossItem
ld a, [wCurItem]
ld [wNamedObjectIndex], a
call GetItemName
@@ -476,14 +476,14 @@ StartMenu_TrainerInfo::
xor a
ldh [hTileAnimations], a
call DrawTrainerInfo
- predef DrawBadges ; draw badges
+ predef DrawBadges
ld b, SET_PAL_TRAINER_CARD
call RunPaletteCommand
call GBPalNormal
- call WaitForTextScrollButtonPress ; wait for button press
+ call WaitForTextScrollButtonPress
call GBPalWhiteOut
call LoadFontTilePatterns
- call LoadScreenTilesFromBuffer2 ; restore saved screen
+ call LoadScreenTilesFromBuffer2
call RunDefaultPaletteCommand
call ReloadMapData
farcall DrawStartMenu ; XXX what difference does this make?
@@ -507,7 +507,7 @@ DrawTrainerInfo:
ld de, vChars2 tile $00
ld bc, $1c tiles
call CopyData
- ld hl, TrainerInfoTextBoxTileGraphics ; trainer info text box tile patterns
+ ld hl, TrainerInfoTextBoxTileGraphics
ld de, vChars2 tile $77
ld bc, 8 tiles
push bc
@@ -517,10 +517,10 @@ DrawTrainerInfo:
ld bc, $17 tiles
call TrainerInfo_FarCopyData
pop bc
- ld hl, BadgeNumbersTileGraphics ; badge number tile patterns
+ ld hl, BadgeNumbersTileGraphics
ld de, vChars1 tile $58
call TrainerInfo_FarCopyData
- ld hl, GymLeaderFaceAndBadgeTileGraphics ; gym leader face and badge tile patterns
+ ld hl, GymLeaderFaceAndBadgeTileGraphics
ld de, vChars2 tile $20
ld bc, 8 * 8 tiles
ld a, BANK(GymLeaderFaceAndBadgeTileGraphics)
@@ -573,12 +573,12 @@ DrawTrainerInfo:
ld c, 3 | LEADING_ZEROES | LEFT_ALIGN | MONEY_SIGN
call PrintBCDNumber
hlcoord 9, 6
- ld de, wPlayTimeHours ; hours
+ ld de, wPlayTimeHours
lb bc, LEFT_ALIGN | 1, 3
call PrintNumber
ld [hl], $d6 ; colon tile ID
inc hl
- ld de, wPlayTimeMinutes ; minutes
+ ld de, wPlayTimeMinutes
lb bc, LEADING_ZEROES | 1, 2
jp PrintNumber
@@ -660,8 +660,8 @@ StartMenu_SaveReset::
ld a, [wStatusFlags4]
bit BIT_LINK_CONNECTED, a
jp nz, Init
- predef SaveSAV ; save the game
- call LoadScreenTilesFromBuffer2 ; restore saved screen
+ predef SaveMenu
+ call LoadScreenTilesFromBuffer2
jp HoldTextDisplayOpen
StartMenu_Option::
@@ -670,7 +670,7 @@ StartMenu_Option::
call ClearScreen
call UpdateSprites
callfar DisplayOptionMenu
- call LoadScreenTilesFromBuffer2 ; restore saved screen
+ call LoadScreenTilesFromBuffer2
call LoadTextBoxTilePatterns
call UpdateSprites
jp RedisplayStartMenu
diff --git a/engine/movie/hall_of_fame.asm b/engine/movie/hall_of_fame.asm
index 025d6a03..38d937f6 100644
--- a/engine/movie/hall_of_fame.asm
+++ b/engine/movie/hall_of_fame.asm
@@ -7,7 +7,7 @@ AnimateHallOfFame:
call LoadTextBoxTilePatterns
call DisableLCD
ld hl, vBGMap0
- ld bc, $800
+ ld bc, 2 * TILEMAP_AREA
ld a, " "
call FillMemory
call EnableLCD
diff --git a/engine/movie/oak_speech/clear_save.asm b/engine/movie/oak_speech/clear_save.asm
index 4df2faa4..f44a12b9 100644
--- a/engine/movie/oak_speech/clear_save.asm
+++ b/engine/movie/oak_speech/clear_save.asm
@@ -19,7 +19,7 @@ DoClearSaveDialogue:
ld a, [wCurrentMenuItem]
and a
jp z, Init
- farcall ClearSAV
+ farcall ClearAllSRAMBanks
jp Init
ClearSaveDataText:
diff --git a/engine/movie/title.asm b/engine/movie/title.asm
index 7a4637ec..495c8cfe 100644
--- a/engine/movie/title.asm
+++ b/engine/movie/title.asm
@@ -240,7 +240,6 @@ ENDC
.doClearSaveDialogue
farjp DoClearSaveDialogue
-
TitleScreenCopyTileMapToVRAM:
ldh [hAutoBGTransferDest + 1], a
jp Delay3
@@ -283,7 +282,6 @@ DoTitleScreenFunction:
ld l, a
jp hl
-
.Jumptable:
dw .Nop
dw .BlinkHalf
diff --git a/engine/movie/trade.asm b/engine/movie/trade.asm
index 2cb51d98..852af717 100644
--- a/engine/movie/trade.asm
+++ b/engine/movie/trade.asm
@@ -168,7 +168,7 @@ LoadTradingGFXAndMonNames:
ld a, BANK(TradingAnimationGraphics2)
call FarCopyData
ld hl, vBGMap0
- ld bc, $800
+ ld bc, 2 * TILEMAP_AREA
ld a, " "
call FillMemory
call ClearSprites
@@ -226,7 +226,7 @@ Trade_Cleanup:
ret
Trade_ShowPlayerMon:
- ld a, %10101011
+ ld a, LCDC_ON | LCDC_WIN_9800 | LCDC_WIN_ON | LCDC_BLOCK21 | LCDC_BG_9C00 | LCDC_OBJ_8 | LCDC_OBJ_ON | LCDC_BG_ON
ldh [rLCDC], a
ld a, $50
ldh [hWY], a
@@ -281,7 +281,7 @@ Trade_DrawOpenEndOfLinkCable:
ld a, $a0
ldh [hSCX], a
call DelayFrame
- ld a, %10001011
+ ld a, LCDC_ON | LCDC_WIN_9800 | LCDC_WIN_OFF | LCDC_BLOCK21 | LCDC_BG_9C00 | LCDC_OBJ_8 | LCDC_OBJ_ON | LCDC_BG_ON
ldh [rLCDC], a
hlcoord 6, 2
ld b, TILEMAP_LINK_CABLE
@@ -341,7 +341,7 @@ Trade_AnimateBallEnteringLinkCable:
ld a, $1
ldh [hAutoBGTransferEnabled], a
call ClearScreen
- ld b, $98
+ ld b, HIGH(vBGMap0)
call CopyScreenTileBufferToVRAM
call Delay3
xor a
@@ -457,7 +457,7 @@ Trade_InitGameboyTransferGfx:
ldh [hAutoBGTransferEnabled], a
call Trade_LoadMonPartySpriteGfx
call DelayFrame
- ld a, %10101011
+ ld a, LCDC_ON | LCDC_WIN_9800 | LCDC_WIN_ON | LCDC_BLOCK21 | LCDC_BG_9C00 | LCDC_OBJ_8 | LCDC_OBJ_ON | LCDC_BG_ON
ldh [rLCDC], a
xor a
ldh [hSCX], a
@@ -761,7 +761,7 @@ Trade_ShowClearedWindow:
ld a, $1
ldh [hAutoBGTransferEnabled], a
call ClearScreen
- ld a, %11100011
+ ld a, LCDC_DEFAULT
ldh [rLCDC], a
ld a, $7
ldh [rWX], a
diff --git a/engine/pokemon/bills_pc.asm b/engine/pokemon/bills_pc.asm
index 09c04293..e5c0211d 100644
--- a/engine/pokemon/bills_pc.asm
+++ b/engine/pokemon/bills_pc.asm
@@ -148,7 +148,7 @@ BillsPCMenu:
lb bc, 2, 9
call TextBoxBorder
ld a, [wCurrentBoxNum]
- and $7f
+ and BOX_NUM_MASK
cp 9
jr c, .singleDigitBoxNum
; two digit box num
@@ -254,7 +254,7 @@ BillsPCDeposit:
call WaitForSoundToFinish
ld hl, wBoxNumString
ld a, [wCurrentBoxNum]
- and $7f
+ and BOX_NUM_MASK
cp 9
jr c, .singleDigitBoxNum
sub 9
@@ -582,6 +582,7 @@ JustAMomentText::
text_far _JustAMomentText
text_end
+UnusedOpenBillsPC: ; unreferenced
ld a, [wSpritePlayerStateData1FacingDirection]
cp SPRITE_FACING_UP
ret nz
diff --git a/engine/pokemon/status_screen.asm b/engine/pokemon/status_screen.asm
index d0952cb9..ec8cf1ee 100644
--- a/engine/pokemon/status_screen.asm
+++ b/engine/pokemon/status_screen.asm
@@ -441,7 +441,7 @@ StatusScreen2:
ld a, $1
ldh [hAutoBGTransferEnabled], a
call Delay3
- call WaitForTextScrollButtonPress ; wait for button
+ call WaitForTextScrollButtonPress
pop af
ldh [hTileAnimations], a
ld hl, wStatusFlags2
diff --git a/home/init.asm b/home/init.asm
index 0e5149a0..bef73b7e 100644
--- a/home/init.asm
+++ b/home/init.asm
@@ -7,17 +7,6 @@ SoftReset::
Init::
; Program init.
-
-; * LCD enabled
-; * Window tile map at $9C00
-; * Window display enabled
-; * BG and window tile data at $8800
-; * BG tile map at $9800
-; * 8x8 OBJ size
-; * OBJ display enabled
-; * BG display enabled
-DEF LCDC_DEFAULT EQU LCDC_ON | LCDC_WIN_9C00 | LCDC_WIN_ON | LCDC_BLOCK21 | LCDC_BG_9800 | LCDC_OBJ_8 | LCDC_OBJ_ON | LCDC_BG_ON
-
di
xor a
@@ -102,7 +91,7 @@ DEF LCDC_DEFAULT EQU LCDC_ON | LCDC_WIN_9C00 | LCDC_WIN_ON | LCDC_BLOCK21 | LCDC
ld a, BANK(SFX_Shooting_Star)
ld [wAudioROMBank], a
ld [wAudioSavedROMBank], a
- ld a, $9c
+ ld a, HIGH(vBGMap1)
ldh [hAutoBGTransferDest + 1], a
xor a
ldh [hAutoBGTransferDest], a
diff --git a/home/map_objects.asm b/home/map_objects.asm
index 737ad0c0..0988abae 100644
--- a/home/map_objects.asm
+++ b/home/map_objects.asm
@@ -30,27 +30,25 @@ TextScript_ItemStoragePC::
call SaveScreenTilesToBuffer2
ld b, BANK(PlayerPC)
ld hl, PlayerPC
- jr bankswitchAndContinue
+ jr BankswitchAndContinue
TextScript_BillsPC::
call SaveScreenTilesToBuffer2
ld b, BANK(BillsPC_)
ld hl, BillsPC_
- jr bankswitchAndContinue
+ jr BankswitchAndContinue
TextScript_GameCornerPrizeMenu::
-; XXX find a better name for this function
-; special_F7
ld b, BANK(CeladonPrizeMenu)
ld hl, CeladonPrizeMenu
-bankswitchAndContinue::
+BankswitchAndContinue::
call Bankswitch
jp HoldTextDisplayOpen ; continue to main text-engine function
TextScript_PokemonCenterPC::
ld b, BANK(ActivatePC)
ld hl, ActivatePC
- jr bankswitchAndContinue
+ jr BankswitchAndContinue
StartSimulatingJoypadStates::
xor a
diff --git a/home/text_script.asm b/home/text_script.asm
index 3d2bd34b..44ba4567 100644
--- a/home/text_script.asm
+++ b/home/text_script.asm
@@ -83,7 +83,7 @@ ENDM
dict TX_SCRIPT_PRIZE_VENDOR, TextScript_GameCornerPrizeMenu
dict2 TX_SCRIPT_CABLE_CLUB_RECEPTIONIST, callfar CableClubNPC
- call PrintText_NoCreatingTextBox ; display the text
+ call PrintText_NoCreatingTextBox
ld a, [wDoNotWaitForButtonPressAfterDisplayingText]
and a
jr nz, HoldTextDisplayOpen
@@ -92,7 +92,7 @@ AfterDisplayingTextID::
ld a, [wEnteringCableClub]
and a
jr nz, HoldTextDisplayOpen
- call WaitForTextScrollButtonPress ; wait for a button press after displaying all the text
+ call WaitForTextScrollButtonPress
; loop to hold the dialogue box open as long as the player keeps holding down the A button
HoldTextDisplayOpen::
diff --git a/home/vcopy.asm b/home/vcopy.asm
index 10d6ce20..25997fcc 100644
--- a/home/vcopy.asm
+++ b/home/vcopy.asm
@@ -136,7 +136,7 @@ AutoBgMapTransfer::
ld h, a
ldh a, [hAutoBGTransferDest]
ld l, a
- ld de, 12 * 32
+ ld de, 12 * TILEMAP_WIDTH
add hl, de
xor a ; TRANSFERTOP
jr .doTransfer
@@ -156,7 +156,7 @@ AutoBgMapTransfer::
ld h, a
ldh a, [hAutoBGTransferDest]
ld l, a
- ld de, 6 * 32
+ ld de, 6 * TILEMAP_WIDTH
add hl, de
ld a, TRANSFERBOTTOM
.doTransfer
diff --git a/macros/asserts.asm b/macros/asserts.asm
index 7ca47892..7b41a654 100644
--- a/macros/asserts.asm
+++ b/macros/asserts.asm
@@ -27,15 +27,19 @@ MACRO table_width
ENDM
MACRO assert_table_length
- DEF x = \1
- ASSERT x * CURRENT_TABLE_WIDTH == @ - {CURRENT_TABLE_START}, \
- "{CURRENT_TABLE_START}: expected {d:x} entries, each {d:CURRENT_TABLE_WIDTH} bytes"
+ DEF w = \1
+ DEF x = w * CURRENT_TABLE_WIDTH
+ DEF y = @ - {CURRENT_TABLE_START}
+ ASSERT x == y, "{CURRENT_TABLE_START}: expected {d:w} entries, each {d:CURRENT_TABLE_WIDTH} " ++ \
+ "bytes, for {d:x} total; but got {d:y} bytes"
ENDM
MACRO assert_max_table_length
- DEF x = \1
- ASSERT x * CURRENT_TABLE_WIDTH >= @ - {CURRENT_TABLE_START}, \
- "{CURRENT_TABLE_START}: expected a maximum of {d:x} entries, each {d:CURRENT_TABLE_WIDTH} bytes"
+ DEF w = \1
+ DEF x = w * CURRENT_TABLE_WIDTH
+ DEF y = @ - {CURRENT_TABLE_START}
+ ASSERT x >= y, "{CURRENT_TABLE_START}: expected a maximum of {d:w} entries, each " ++ \
+ "{d:CURRENT_TABLE_WIDTH} bytes, for maximum {d:x} total; but got {d:y} bytes"
ENDM
MACRO list_start
@@ -134,12 +138,13 @@ MACRO def_grass_wildmons
ENDM
MACRO end_grass_wildmons
+ DEF x = @ - {CURRENT_GRASS_WILDMONS_LABEL}
IF CURRENT_GRASS_WILDMONS_RATE == 0
- ASSERT 1 == @ - {CURRENT_GRASS_WILDMONS_LABEL}, \
- "def_grass_wildmons {d:CURRENT_GRASS_WILDMONS_RATE}: expected 1 byte"
+ ASSERT 1 == x, \
+ "def_grass_wildmons {d:CURRENT_GRASS_WILDMONS_RATE}: expected 1 byte, got {d:x}"
ELSE
- ASSERT WILDDATA_LENGTH == @ - {CURRENT_GRASS_WILDMONS_LABEL}, \
- "def_grass_wildmons {d:CURRENT_GRASS_WILDMONS_RATE}: expected {d:WILDDATA_LENGTH} bytes"
+ ASSERT WILDDATA_LENGTH == x, \
+ "def_grass_wildmons {d:CURRENT_GRASS_WILDMONS_RATE}: expected {d:WILDDATA_LENGTH} bytes, got {d:x}"
ENDC
ENDM
@@ -152,11 +157,12 @@ MACRO def_water_wildmons
ENDM
MACRO end_water_wildmons
+ DEF x = @ - {CURRENT_WATER_WILDMONS_LABEL}
IF CURRENT_WATER_WILDMONS_RATE == 0
- ASSERT 1 == @ - {CURRENT_WATER_WILDMONS_LABEL}, \
- "def_water_wildmons {d:CURRENT_WATER_WILDMONS_RATE}: expected 1 byte"
+ ASSERT 1 == x, \
+ "def_water_wildmons {d:CURRENT_WATER_WILDMONS_RATE}: expected 1 byte, got {d:x}"
ELSE
- ASSERT WILDDATA_LENGTH == @ - {CURRENT_WATER_WILDMONS_LABEL}, \
- "def_water_wildmons {d:CURRENT_WATER_WILDMONS_RATE}: expected {d:WILDDATA_LENGTH} bytes"
+ ASSERT WILDDATA_LENGTH == x, \
+ "def_water_wildmons {d:CURRENT_WATER_WILDMONS_RATE}: expected {d:WILDDATA_LENGTH} bytes, got {d:x}"
ENDC
ENDM
diff --git a/macros/data.asm b/macros/data.asm
index 808e920b..8033f306 100644
--- a/macros/data.asm
+++ b/macros/data.asm
@@ -21,6 +21,7 @@ MACRO tmhm
ENDR
; set bits of bytes
REPT _NARG
+ ASSERT FATAL, STRFIND("\1", " ") == -1, "Invalid move: \1"
IF DEF(\1_TMNUM)
DEF n = (\1_TMNUM - 1) / 8
DEF i = (\1_TMNUM - 1) % 8
@@ -81,9 +82,21 @@ MACRO dab ; dwb address, bank
ENDR
ENDM
+MACRO dname
+ IF _NARG == 2
+ DEF n = \2
+ ELSE
+ DEF n = NAME_LENGTH - 1
+ ENDC
+ ASSERT STRFIND(\1, "@") == -1, "String terminator \"@\" in name: \1"
+ ASSERT CHARLEN(\1) <= n, "Name longer than {d:n} characters: \1"
+ db \1
+ ds n - CHARLEN(\1), "@"
+ENDM
+
MACRO sine_table
; \1 samples of sin(x) from x=0 to x<0.5 turns (pi radians)
- for x, \1
+ FOR x, \1
dw sin(x * 0.5 / (\1))
- endr
+ ENDR
ENDM
diff --git a/scripts/CeruleanBadgeHouse.asm b/scripts/CeruleanBadgeHouse.asm
index 1c7e0200..65606a5e 100644
--- a/scripts/CeruleanBadgeHouse.asm
+++ b/scripts/CeruleanBadgeHouse.asm
@@ -53,8 +53,8 @@ CeruleanBadgeHouseMiddleAgedManText:
jp TextScriptEnd
.BadgeItemList:
- table_width 1
db NUM_BADGES ; #
+ table_width 1
db BOULDERBADGE
db CASCADEBADGE
db THUNDERBADGE
@@ -63,8 +63,8 @@ CeruleanBadgeHouseMiddleAgedManText:
db MARSHBADGE
db VOLCANOBADGE
db EARTHBADGE
+ assert_table_length NUM_BADGES
db -1 ; end
- assert_table_length NUM_BADGES + 2
.Text:
text_far _CeruleanBadgeHouseMiddleAgedManText
diff --git a/scripts/HallOfFame.asm b/scripts/HallOfFame.asm
index eb26afaf..31d56022 100644
--- a/scripts/HallOfFame.asm
+++ b/scripts/HallOfFame.asm
@@ -47,7 +47,7 @@ HallOfFameResetEventsAndSaveScript:
ld [wHallOfFameCurScript], a
ld a, PALLET_TOWN
ld [wLastBlackoutMap], a
- farcall SaveSAVtoSRAM
+ farcall SaveGameData
ld b, 5
.delayLoop
ld c, 600 / 5
diff --git a/scripts/PewterCity.asm b/scripts/PewterCity.asm
index 79c02f9a..ffe546ca 100644
--- a/scripts/PewterCity.asm
+++ b/scripts/PewterCity.asm
@@ -132,7 +132,7 @@ PewterCityYoungsterShowsPlayerGymScript:
call DisplayTextID
ld a, $3c
ldh [hSpriteScreenYCoord], a
- ld a, $40
+ ld a, $40 ; BUG: should load $50, using $40 causes sprite misalignment
ldh [hSpriteScreenXCoord], a
ld a, 22
ldh [hSpriteMapYCoord], a
diff --git a/scripts/PokemonMansionB1F.asm b/scripts/PokemonMansionB1F.asm
index e31bbd3e..176c243a 100644
--- a/scripts/PokemonMansionB1F.asm
+++ b/scripts/PokemonMansionB1F.asm
@@ -16,30 +16,30 @@ MansionB1FCheckReplaceSwitchDoorBlocks:
CheckEvent EVENT_MANSION_SWITCH_ON
jr nz, .switchTurnedOn
ld a, $e
- ld bc, $80d
+ lb bc, 8, 13
call Mansion2ReplaceBlock
ld a, $e
- ld bc, $b06
+ lb bc, 11, 6
call Mansion2ReplaceBlock
ld a, $5f
- ld bc, $304
+ lb bc, 3, 4
call Mansion2ReplaceBlock
ld a, $54
- ld bc, $808
+ lb bc, 8, 8
call Mansion2ReplaceBlock
ret
.switchTurnedOn
ld a, $2d
- ld bc, $80d
+ lb bc, 8, 13
call Mansion2ReplaceBlock
ld a, $5f
- ld bc, $b06
+ lb bc, 11, 6
call Mansion2ReplaceBlock
ld a, $e
- ld bc, $304
+ lb bc, 3, 4
call Mansion2ReplaceBlock
ld a, $e
- ld bc, $808
+ lb bc, 8, 8
call Mansion2ReplaceBlock
ret
diff --git a/scripts/SeafoamIslandsB4F.asm b/scripts/SeafoamIslandsB4F.asm
index 91ba9669..e4df261d 100644
--- a/scripts/SeafoamIslandsB4F.asm
+++ b/scripts/SeafoamIslandsB4F.asm
@@ -38,7 +38,7 @@ SeafoamIslandsB4FDefaultScript:
ld a, [wCoordIndex]
cp $3
jr nc, .only1UpInputNeeded
- ld a, NPC_MOVEMENT_UP
+ ld a, PAD_UP
ld [wSimulatedJoypadStatesEnd + 1], a
ld a, 2
jr .forcePlayerUpFromSurfExit
diff --git a/scripts/VermilionDock.asm b/scripts/VermilionDock.asm
index 6e8f6822..3cd26619 100644
--- a/scripts/VermilionDock.asm
+++ b/scripts/VermilionDock.asm
@@ -49,7 +49,7 @@ VermilionDockSSAnneLeavesScript:
ld [wSpritePlayerStateData1ImageIndex], a
ld c, 120
call DelayFrames
- ld b, $9c
+ ld b, HIGH(vBGMap1)
call CopyScreenTileBufferToVRAM
hlcoord 0, 10
ld bc, SCREEN_WIDTH * 6
@@ -156,10 +156,10 @@ VermilionDock_EmitSmokePuff:
VermilionDockOAMBlock:
; tile ID, attributes
- db $fc, $10
- db $fd, $10
- db $fe, $10
- db $ff, $10
+ db $fc, OAM_PAL1
+ db $fd, OAM_PAL1
+ db $fe, OAM_PAL1
+ db $ff, OAM_PAL1
VermilionDock_SyncScrollWithLY:
ld h, d