Thoroughly document debug code (#410)

This commit is contained in:
SatoMew 2023-07-15 23:36:59 +01:00 committed by GitHub
parent d001ced41b
commit f46db37d50
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 128 additions and 109 deletions

View File

@ -13,7 +13,7 @@
const POKE_BALL ; $04
const TOWN_MAP ; $05
const BICYCLE ; $06
const SURFBOARD ; $07 buggy?
const SURFBOARD ; $07
const SAFARI_BALL ; $08
const POKEDEX ; $09
const MOON_STONE ; $0A

View File

@ -16,3 +16,6 @@ DEF TEXT_DELAY_SLOW EQU %101 ; 5
const_def 6
const BIT_BATTLE_SHIFT ; 6
const BIT_BATTLE_ANIMATION ; 7
; wd732 flags
DEF BIT_DEBUG_MODE EQU 1

View File

@ -44,15 +44,15 @@ MACRO special_warp_spec
db \4
ENDM
FirstMapSpec:
NewGameWarp:
special_warp_spec REDS_HOUSE_2F, 3, 6, REDS_HOUSE_2
TradeCenterSpec1:
TradeCenterPlayerWarp:
special_warp_spec TRADE_CENTER, 3, 4, CLUB
TradeCenterSpec2:
TradeCenterFriendWarp:
special_warp_spec TRADE_CENTER, 6, 4, CLUB
ColosseumSpec1:
ColosseumPlayerWarp:
special_warp_spec COLOSSEUM, 3, 4, CLUB
ColosseumSpec2:
ColosseumFriendWarp:
special_warp_spec COLOSSEUM, 6, 4, CLUB

View File

@ -2493,9 +2493,9 @@ MoveSelectionMenu:
; so it is necessary to put the di ei block to not cause tearing
call TextBoxBorder
hlcoord 4, 12
ld [hl], $7a
ld [hl], "─"
hlcoord 10, 12
ld [hl], $7e
ld [hl], "┘"
ei
hlcoord 6, 13
call .writemoves
@ -2557,11 +2557,12 @@ MoveSelectionMenu:
ld a, [wLinkState]
cp LINK_STATE_BATTLING
jr z, .matchedkeyspicked
; Disable left, right, and START buttons in regular battles.
ld a, [wFlags_D733]
bit BIT_TEST_BATTLE, a
ld b, D_UP | D_DOWN | A_BUTTON | B_BUTTON | SELECT
jr z, .matchedkeyspicked
ld b, $ff
ld b, D_UP | D_DOWN | D_LEFT | D_RIGHT | A_BUTTON | B_BUTTON | SELECT | START
.matchedkeyspicked
ld a, b
ld [hli], a ; wMenuWatchedKeys
@ -2585,8 +2586,12 @@ SelectMenuItem:
call PlaceString
jr .select
.battleselect
; Hide move swap cursor in TestBattle.
ld a, [wFlags_D733]
bit BIT_TEST_BATTLE, a
; This causes PrintMenuItem to not run in TestBattle.
; MoveSelectionMenu still draws part of its window, an issue
; which did not seem to exist in the Japanese versions.
jr nz, .select
call PrintMenuItem
ld a, [wMenuItemToSwap]
@ -2648,8 +2653,9 @@ SelectMenuItem:
jr z, .disabled
ld a, [wPlayerBattleStatus3]
bit 3, a ; transformed
jr nz, .dummy ; game freak derp
.dummy
jr nz, .transformedMoveSelected
.transformedMoveSelected ; pointless
; Allow moves copied by Transform to be used.
ld a, [wCurrentMenuItem]
ld hl, wBattleMonMoves
ld c, a
@ -6085,6 +6091,7 @@ GetCurrentMove:
jr .selected
.player
ld de, wPlayerMoveNum
; Apply InitBattleVariables to TestBattle.
ld a, [wFlags_D733]
bit BIT_TEST_BATTLE, a
ld a, [wTestBattlePlayerSelectedMove]
@ -6768,12 +6775,12 @@ InitOpponent:
DetermineWildOpponent:
ld a, [wd732]
bit 1, a
jr z, .notDebug
bit BIT_DEBUG_MODE, a
jr z, .notDebugMode
ldh a, [hJoyHeld]
bit BIT_B_BUTTON, a
bit BIT_B_BUTTON, a ; disable wild encounters
ret nz
.notDebug
.notDebugMode
ld a, [wNumberOfNoRandomBattleStepsLeft]
and a
ret nz

View File

@ -20,7 +20,7 @@ InitBattleVariables:
ld [hli], a ; wPlayerHPBarColor
ld [hl], a ; wEnemyHPBarColor
ld hl, wCanEvolveFlags
ld b, $3c
ld b, wMiscBattleDataEnd - wMiscBattleData
.loop
ld [hli], a
dec b

View File

@ -56,7 +56,7 @@ IF DEF(_DEBUG)
; DEBUG
ld hl, wd732
set 1, [hl]
set BIT_DEBUG_MODE, [hl]
jp StartNewGameDebug
DebugBattlePlayerName:
@ -72,18 +72,23 @@ ELSE
ret
ENDC
TestBattle:
TestBattle: ; unreferenced except in _DEBUG
.loop
call GBPalNormal
; Don't mess around
; with obedience.
; Don't mess around with obedience.
ld a, 1 << BIT_EARTHBADGE
ld [wObtainedBadges], a
ld hl, wFlags_D733
set BIT_TEST_BATTLE, [hl]
; wNumBagItems and wBagItems are not initialized here,
; and their garbage values happen to act as if EXP_ALL
; is in the bag at the end of the test battle.
; pokeyellow fixes this by initializing them with a
; list of items.
; Reset the party.
ld hl, wPartyCount
xor a
@ -91,8 +96,7 @@ TestBattle:
dec a
ld [hl], a
; Give the player a
; level 20 Rhydon.
; Give the player a level 20 Rhydon.
ld a, RHYDON
ld [wcf91], a
ld a, 20
@ -102,15 +106,14 @@ TestBattle:
ld [wCurMap], a
call AddPartyMon
; Fight against a
; level 20 Rhydon.
; Fight against a level 20 Rhydon.
ld a, RHYDON
ld [wCurOpponent], a
predef InitOpponent
; When the battle ends,
; do it all again.
; When the battle ends, do it all again.
; There are some graphical quirks in SGB mode.
ld a, 1
ld [wUpdateSpritesEnabled], a
ldh [hAutoBGTransferEnabled], a

View File

@ -1,13 +1,5 @@
; This function is a debugging feature to give the player Tsunekazu Ishihara's
; favorite Pokemon. This is indicated by the overpowered Exeggutor, which
; Ishihara (president of Creatures Inc.) said was his favorite Pokemon in an ABC
; interview on February 8, 2000.
; "Exeggutor is my favorite. That's because I was always using this character
; while I was debugging the program."
; http://www.ign.com/articles/2000/02/09/abc-news-pokamon-chat-transcript
SetIshiharaTeam:
ld de, IshiharaTeam
SetDebugNewGameParty: ; unreferenced except in _DEBUG
ld de, DebugNewGameParty
.loop
ld a, [de]
cp -1
@ -20,7 +12,11 @@ SetIshiharaTeam:
call AddPartyMon
jr .loop
IshiharaTeam:
DebugNewGameParty: ; unreferenced except in _DEBUG
; Exeggutor is the only debug party member shared with Red, Green, and Japanese Blue.
; "Tsunekazu Ishihara: Exeggutor is my favorite. That's because I was
; always using this character while I was debugging the program."
; From https://web.archive.org/web/20000607152840/http://pocket.ign.com/news/14973.html
db EXEGGUTOR, 90
IF DEF(_DEBUG)
db MEW, 5
@ -35,13 +31,13 @@ IF DEF(_DEBUG)
ENDC
db -1 ; end
DebugStart:
PrepareNewGameDebug: ; dummy except in _DEBUG
IF DEF(_DEBUG)
xor a ; PLAYER_PARTY_DATA
ld [wMonDataLocation], a
; Fly anywhere.
dec a ; $ff
dec a ; $ff (all bits)
ld [wTownVisitedFlag], a
ld [wTownVisitedFlag + 1], a
@ -49,7 +45,7 @@ IF DEF(_DEBUG)
ld a, ~(1 << BIT_EARTHBADGE)
ld [wObtainedBadges], a
call SetIshiharaTeam
call SetDebugNewGameParty
; Exeggutor gets four HM moves.
ld hl, wPartyMon1Moves

View File

@ -121,7 +121,7 @@ MainMenu:
ld [wDestinationMap], a
ld hl, wd732
set 2, [hl] ; fly warp or dungeon warp
call SpecialWarpIn
call PrepareForSpecialWarp
jp SpecialEnterMap
InitOptions:
@ -268,10 +268,10 @@ LinkMenu:
ld c, 50
call DelayFrames
ld hl, wd732
res 1, [hl]
res BIT_DEBUG_MODE, [hl]
ld a, [wDefaultMap]
ld [wDestinationMap], a
call SpecialWarpIn
call PrepareForSpecialWarp
ld c, 20
call DelayFrames
xor a
@ -308,7 +308,12 @@ LinkCanceledText:
StartNewGame:
ld hl, wd732
res 1, [hl]
; Ensure debug mode is not used when
; starting a regular new game.
; Debug mode persists in saved games for
; both debug and non-debug builds, and is
; only reset here by the main menu.
res BIT_DEBUG_MODE, [hl]
; fallthrough
StartNewGameDebug:
call OakSpeech

View File

@ -3,6 +3,11 @@ PrepareOakSpeech:
push af
ld a, [wOptions]
push af
; Retrieve BIT_DEBUG_MODE set in DebugMenu for StartNewGameDebug.
; BUG: StartNewGame carries over bit 5 from previous save files,
; which causes CheckForceBikeOrSurf to not return.
; To fix this in debug builds, reset bit 5 here or in StartNewGame.
; In non-debug builds, the instructions can be removed.
ld a, [wd732]
push af
ld hl, wPlayerName
@ -24,6 +29,7 @@ PrepareOakSpeech:
call z, InitOptions
; These debug names are used for StartNewGameDebug.
; TestBattle uses the debug names from DebugMenu.
; A variant of this process is performed in PrepareTitleScreen.
ld hl, DebugNewGamePlayerName
ld de, wPlayerName
ld bc, NAME_LENGTH
@ -49,15 +55,15 @@ OakSpeech:
ld [wcf91], a
ld a, 1
ld [wItemQuantity], a
call AddItemToInventory ; give one potion
call AddItemToInventory
ld a, [wDefaultMap]
ld [wDestinationMap], a
call SpecialWarpIn
call PrepareForSpecialWarp
xor a
ldh [hTileAnimations], a
ld a, [wd732]
bit 1, a ; possibly a debug mode bit
jp nz, .skipChoosingNames
bit BIT_DEBUG_MODE, a
jp nz, .skipSpeech
ld de, ProfOakPic
lb bc, BANK(ProfOakPic), $00
call IntroDisplayPicCenteredOrUpperRight
@ -93,7 +99,7 @@ OakSpeech:
ld hl, IntroduceRivalText
call PrintText
call ChooseRivalName
.skipChoosingNames
.skipSpeech
call GBFadeOutToWhite
call ClearScreen
ld de, RedPicFront
@ -159,6 +165,7 @@ OakSpeechText1:
text_end
OakSpeechText2:
text_far _OakSpeechText2A
; BUG: The cry played does not match the sprite displayed.
sound_cry_nidorina
text_far _OakSpeechText2B
text_end

View File

@ -1,4 +1,4 @@
CopyDebugName:
CopyDebugName: ; unused
ld bc, NAME_LENGTH
jp CopyData
@ -42,10 +42,10 @@ DisplayTitleScreen:
ld bc, 5 tiles
ld a, BANK(NintendoCopyrightLogoGraphics)
call FarCopyData2
ld hl, GamefreakLogoGraphics
ld hl, GameFreakLogoGraphics
ld de, vTitleLogo2 tile (16 + 5)
ld bc, 9 tiles
ld a, BANK(GamefreakLogoGraphics)
ld a, BANK(GameFreakLogoGraphics)
call FarCopyData2
ld hl, PokemonLogoGraphics
ld de, vTitleLogo
@ -378,7 +378,7 @@ LoadCopyrightAndTextBoxTiles:
LoadCopyrightTiles:
ld de, NintendoCopyrightLogoGraphics
ld hl, vChars2 tile $60
lb bc, BANK(NintendoCopyrightLogoGraphics), (GamefreakLogoGraphicsEnd - NintendoCopyrightLogoGraphics) / $10
lb bc, BANK(NintendoCopyrightLogoGraphics), (GameFreakLogoGraphicsEnd - NintendoCopyrightLogoGraphics) / $10
call CopyVideoData
hlcoord 2, 7
ld de, CopyrightTextString

View File

@ -1,60 +1,60 @@
SpecialWarpIn::
PrepareForSpecialWarp::
call LoadSpecialWarpData
predef LoadTilesetHeader
ld hl, wd732
bit 2, [hl] ; dungeon warp or fly warp?
res 2, [hl]
jr z, .next
; if dungeon warp or fly warp
jr z, .debugNewGameWarp
ld a, [wDestinationMap]
jr .next2
jr .next
.debugNewGameWarp
bit BIT_DEBUG_MODE, [hl]
jr z, .setNewGameMatWarp ; apply to StartNewGameDebug only
call PrepareNewGameDebug
.setNewGameMatWarp
; This is called by OakSpeech during StartNewGame and
; loads the first warp event for the specified map index.
ld a, PALLET_TOWN
.next
bit 1, [hl]
jr z, .next3
call DebugStart
.next3
ld a, 0
.next2
ld b, a
ld a, [wd72d]
and a
jr nz, .next4
jr nz, .next2
ld a, b
.next4
.next2
ld hl, wd732
bit 4, [hl] ; dungeon warp?
bit 4, [hl] ; dungeon warp
ret nz
; if not dungeon warp
ld [wLastMap], a
ret
; gets the map ID, tile block map view pointer, tileset, and coordinates
LoadSpecialWarpData:
ld a, [wd72d]
cp TRADE_CENTER
jr nz, .notTradeCenter
ld hl, TradeCenterSpec1
ld hl, TradeCenterPlayerWarp
ldh a, [hSerialConnectionStatus]
cp USING_INTERNAL_CLOCK ; which gameboy is clocking determines who is on the left and who is on the right
cp USING_INTERNAL_CLOCK
jr z, .copyWarpData
ld hl, TradeCenterSpec2
ld hl, TradeCenterFriendWarp
jr .copyWarpData
.notTradeCenter
cp COLOSSEUM
jr nz, .notColosseum
ld hl, ColosseumSpec1
ld hl, ColosseumPlayerWarp
ldh a, [hSerialConnectionStatus]
cp USING_INTERNAL_CLOCK
jr z, .copyWarpData
ld hl, ColosseumSpec2
ld hl, ColosseumFriendWarp
jr .copyWarpData
.notColosseum
ld a, [wd732]
bit 1, a
jr nz, .notFirstMap
bit BIT_DEBUG_MODE, a
; warp to wLastMap (PALLET_TOWN) for StartNewGameDebug
jr nz, .notNewGameWarp
bit 2, a
jr nz, .notFirstMap
ld hl, FirstMapSpec
jr nz, .notNewGameWarp
ld hl, NewGameWarp
.copyWarpData
ld de, wCurMap
ld c, $7
@ -68,18 +68,17 @@ LoadSpecialWarpData:
ld [wCurMapTileset], a
xor a
jr .done
.notFirstMap
.notNewGameWarp
ld a, [wLastMap] ; this value is overwritten before it's ever read
ld hl, wd732
bit 4, [hl] ; used dungeon warp (jumped down hole/waterfall)?
jr nz, .usedDunegonWarp
bit 6, [hl] ; return to last pokemon center (or player's house)?
bit 4, [hl] ; dungeon warp
jr nz, .usedDungeonWarp
bit 6, [hl] ; blacked out
res 6, [hl]
jr z, .otherDestination
; return to last pokemon center or player's house
ld a, [wLastBlackoutMap]
jr .usedFlyWarp
.usedDunegonWarp
.usedDungeonWarp
ld hl, wd72d
res 4, [hl]
ld a, [wDungeonWarpDestinationMap]
@ -142,7 +141,7 @@ LoadSpecialWarpData:
.done
ld [wYOffsetSinceLastSpecialWarp], a
ld [wXOffsetSinceLastSpecialWarp], a
ld a, $ff ; the player's coordinates have already been updated using a special warp, so don't use any of the normal warps
ld a, -1 ; exclude normal warps
ld [wDestinationWarpID], a
ret

View File

@ -15,8 +15,8 @@ BattleHudTiles3End:
NintendoCopyrightLogoGraphics: INCBIN "gfx/splash/copyright.2bpp"
GamefreakLogoGraphics: INCBIN "gfx/title/gamefreak_inc.2bpp"
GamefreakLogoGraphicsEnd:
GameFreakLogoGraphics: INCBIN "gfx/title/gamefreak_inc.2bpp"
GameFreakLogoGraphicsEnd:
TextBoxGraphics:: INCBIN "gfx/font/font_extra.2bpp"
TextBoxGraphicsEnd::

View File

@ -50,10 +50,12 @@ RunNPCMovementScript::
EndNPCMovementScript::
farjp _EndNPCMovementScript
DebugPressedOrHeldB::
DebugPressedOrHeldB:: ; dummy except in _DEBUG
; This is used to skip Trainer battles, the
; Safari Game step counter, and some NPC scripts.
IF DEF(_DEBUG)
ld a, [wd732]
bit 1, a
bit BIT_DEBUG_MODE, a
ret z
ldh a, [hJoyHeld]
bit BIT_B_BUTTON, a

View File

@ -117,7 +117,7 @@ OverworldLoopLessDelay::
predef LoadSAV
ld a, [wCurMap]
ld [wDestinationMap], a
call SpecialWarpIn
call PrepareForSpecialWarp
ld a, [wCurMap]
call SwitchToMapRomBank ; switch to the ROM bank of the current map
ld hl, wCurMapTileset
@ -762,11 +762,11 @@ HandleBlackOut::
call StopMusic
ld hl, wd72e
res 5, [hl]
ld a, BANK(ResetStatusAndHalveMoneyOnBlackout) ; also BANK(SpecialWarpIn) and BANK(SpecialEnterMap)
ld a, BANK(ResetStatusAndHalveMoneyOnBlackout) ; also BANK(PrepareForSpecialWarp) and BANK(SpecialEnterMap)
ldh [hLoadedROMBank], a
ld [MBC1RomBank], a
call ResetStatusAndHalveMoneyOnBlackout
call SpecialWarpIn
call PrepareForSpecialWarp
call PlayDefaultMusicFadeOutCurrent
jp SpecialEnterMap
@ -793,10 +793,10 @@ HandleFlyWarpOrDungeonWarp::
set 2, [hl] ; fly warp or dungeon warp
res 5, [hl] ; forced to ride bike
call LeaveMapAnim
ld a, BANK(SpecialWarpIn)
ld a, BANK(PrepareForSpecialWarp)
ldh [hLoadedROMBank], a
ld [MBC1RomBank], a
call SpecialWarpIn
call PrepareForSpecialWarp
jp SpecialEnterMap
LeaveMapAnim::

View File

@ -111,10 +111,14 @@ NextChar::
inc de
jp PlaceNextChar
NullChar::
NullChar:: ; unused
ld b, h
ld c, l
pop hl
; A "<NULL>" character in a printed string
; displays an error message with the current value
; of hSpriteIndexOrTextID in decimal format.
; This is a debugging leftover.
ld de, TextIDErrorText
dec de
ret

View File

@ -135,7 +135,9 @@ ENDC
ld a, [wSpriteIndex]
cp $ff
jr nz, .trainerEngaging
IF DEF(_DEBUG)
.trainerNotEngaging
ENDC
xor a
ld [wSpriteIndex], a
ld [wTrainerHeaderFlagBit], a

View File

@ -420,6 +420,7 @@ wAddedToParty::
; The purpose of these flags is to track which mons levelled up during the
; current battle at the end of the battle when evolution occurs.
; Other methods of evolution simply set it by calling TryEvolvingMon.
wMiscBattleData::
wCanEvolveFlags:: db
wForceEvolution:: db
@ -433,8 +434,7 @@ wAILayer2Encouragement:: db
wPlayerSubstituteHP:: db
wEnemySubstituteHP:: db
; The player's selected move during a test battle.
; InitBattleVariables sets it to the move Pound.
; used for TestBattle (unused in non-debug builds)
wTestBattlePlayerSelectedMove:: db
ds 1
@ -502,6 +502,7 @@ wEnemyNumHits:: ; db
wEnemyBideAccumulatedDamage:: dw
ds 8
wMiscBattleDataEnd::
ENDU
; This union spans 39 bytes.
@ -2155,17 +2156,7 @@ wd730:: db
ds 1
; bit 0: play time being counted
; bit 1: remnant of debug mode; only set by the debug build.
; if it is set:
; 1. skips most of Prof. Oak's speech, and uses NINTEN as the player's name and SONY as the rival's name
; 2. does not have the player start in floor two of the player's house (instead sending them to [wLastMap])
; 3. allows wild battles to be avoided by holding down B
; furthermore, in the debug build:
; 4. allows trainers to be avoided by holding down B
; 5. skips Safari Zone step counter by holding down B
; 6. skips the NPC who blocks Route 3 before beating Brock by holding down B
; 7. skips Cerulean City rival battle by holding down B
; 8. skips Pokémon Tower rival battle by holding down B
; bit 1: debug mode (unused and incomplete in non-debug builds)
; bit 2: the target warp is a fly warp (bit 3 set or blacked out) or a dungeon warp (bit 4 set)
; bit 3: used warp pad, escape rope, dig, teleport, or fly, so the target warp is a "fly warp"
; bit 4: jumped into hole (Pokemon Mansion, Seafoam Islands, Victory Road) or went down waterfall (Seafoam Islands), so the target warp is a "dungeon warp"
@ -2173,7 +2164,7 @@ wd730:: db
; bit 6: map destination is [wLastBlackoutMap] (usually the last used pokemon center, but could be the player's house)
wd732:: db
; bit 0: running a test battle
; bit 0: running a test battle (unused in non-debug builds)
; bit 1: prevent music from changing when entering new map
; bit 2: skip the joypad check in CheckWarpsNoCollision (used for the forced warp down the waterfall in the Seafoam Islands)
; bit 3: trainer wants to battle

View File

@ -32,7 +32,7 @@ HallOfFameResetEventsAndSaveScript:
ld hl, wFlags_D733
res 1, [hl]
inc hl
set 0, [hl]
set BIT_TEST_BATTLE, [hl] ; debug, unused?
xor a ; SCRIPT_*_DEFAULT
ld hl, wLoreleisRoomCurScript
ld [hli], a ; wLoreleisRoomCurScript