Merge branch 'master' of https://github.com/pret/pokered
Some checks failed
CI / build (push) Has been cancelled

This commit is contained in:
dannye 2025-09-06 16:54:17 -05:00
commit 377749ca4e
45 changed files with 533 additions and 463 deletions

View File

@ -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: ;

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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?

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -259,7 +259,7 @@ InGameTrade_CheckForTradeEvo:
jp PlayDefaultMusic
InGameTrade_TrainerString:
db "<TRAINER>@@@@@@@@@@"
dname "<TRAINER>", NAME_LENGTH
InGameTradeTextPointers:
; entries correspond to TRADE_DIALOGSET_* constants

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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
LoadSAV1:
and a
jp GoodCheckSum
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

View File

@ -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

View File

@ -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

View File

@ -19,7 +19,7 @@ DoClearSaveDialogue:
ld a, [wCurrentMenuItem]
and a
jp z, Init
farcall ClearSAV
farcall ClearAllSRAMBanks
jp Init
ClearSaveDataText:

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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::

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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