diff options
| author | dannye <33dannye@gmail.com> | 2025-09-06 16:54:17 -0500 |
|---|---|---|
| committer | dannye <33dannye@gmail.com> | 2025-09-06 16:54:17 -0500 |
| commit | 377749ca4efac05b6c57dfed049899891af6c35a (patch) | |
| tree | 4b429403935c4a7c2de710a6cbf7310246874539 | |
| parent | Fix .tilemap file extension, fix some typos (#138) (diff) | |
| parent | Document visual glitch with Pewter City Gym guy (#526) (diff) | |
| download | pokeyellow-377749ca4efac05b6c57dfed049899891af6c35a.tar.gz pokeyellow-377749ca4efac05b6c57dfed049899891af6c35a.tar.xz pokeyellow-377749ca4efac05b6c57dfed049899891af6c35a.zip | |
Merge branch 'master' of https://github.com/pret/pokered
45 files changed, 532 insertions, 462 deletions
@@ -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 |
