shithub: pokecrystal

Download patch

ref: 4db344db89d8e36b0dd915cac570c9819f311146
parent: 5dd6985e8f4f25422e63bef41f25d26e9342b0fb
author: Rangi <remy.oukaour+rangi42@gmail.com>
date: Fri Jun 17 18:54:52 EDT 2022

Add a subdirectory for RAM files

Fixes #920

--- a/Makefile
+++ b/Makefile
@@ -10,7 +10,7 @@
 	audio.o \
 	home.o \
 	main.o \
-	wram.o \
+	ram.o \
 	data/text/common.o \
 	data/maps/map_data.o \
 	data/pokemon/dex_entries.o \
--- a/hram.asm
+++ /dev/null
@@ -1,178 +1,0 @@
-SECTION "HRAM", HRAM
-
-hROMBankBackup:: db
-hFarByte::
-hTempBank:: db
-hSRAMBank:: db
-
-hRTCDayHi::   db
-hRTCDayLo::   db
-hRTCHours::   db
-hRTCMinutes:: db
-hRTCSeconds:: db
-
-	ds 2
-
-hHours:: db
-	ds 1
-hMinutes:: db
-	ds 1
-hSeconds:: db
-	ds 1
-
-	ds 1
-
-hVBlankCounter:: db
-
-	ds 1
-
-hROMBank:: db
-hVBlank:: db
-hMapEntryMethod:: db
-
-hMenuReturn:: db
-hUnusedByte:: db
-
-hJoypadReleased:: db
-hJoypadPressed::  db
-hJoypadDown::     db
-hJoypadSum::      db
-hJoyReleased::    db
-hJoyPressed::     db
-hJoyDown::        db
-hJoyLast::        db
-
-hInMenu:: db
-
-	ds 1
-
-hPrinter:: db
-hGraphicStartTile:: db
-hMoveMon:: db
-
-UNION
-hMapObjectIndex:: db
-hObjectStructIndex:: db
-NEXTU
-hConnectionStripLength:: db
-hConnectedMapWidth:: db
-ENDU
-
-hEnemyMonSpeed:: dw
-
-UNION
-; math-related values
-
-UNION
-; inputs to Multiply
-	ds 1
-hMultiplicand:: ds 3
-hMultiplier::   db
-NEXTU
-; result of Multiply
-hProduct::      ds 4
-NEXTU
-; inputs to Divide
-hDividend::     ds 4
-hDivisor::      db
-NEXTU
-; results of Divide
-hQuotient::     ds 4
-hRemainder::    db
-ENDU
-
-hMathBuffer:: ds 5
-
-NEXTU
-; PrintNum scratch space
-hPrintNumBuffer:: ds 10
-
-NEXTU
-; Mystery Gift
-hMGExchangedByte:: db
-hMGExchangedWord:: dw
-hMGNumBits:: db
-hMGChecksum:: dw
-	ds 1
-hMGUnusedMsgLength:: db
-hMGRole:: db
-hMGStatusFlags:: db
-ENDU
-
-UNION
-hUsedSpriteIndex:: db
-hUsedSpriteTile::  db
-NEXTU
-hCurSpriteXCoord::   db
-hCurSpriteYCoord::   db
-hCurSpriteXPixel::   db
-hCurSpriteYPixel::   db
-hCurSpriteTile::     db
-hCurSpriteOAMFlags:: db
-ENDU
-
-UNION
-hMoneyTemp:: ds 3
-NEXTU
-hMGJoypadPressed::  db
-hMGJoypadReleased:: db
-hMGPrevTIMA::       db
-ENDU
-
-hLCDCPointer::     db
-hLYOverrideStart:: db
-hLYOverrideEnd::   db
-
-hMobileReceive::             db
-hSerialReceivedNewData::     db
-hSerialConnectionStatus::    db
-hSerialIgnoringInitialData:: db
-hSerialSend::                db
-hSerialReceive::             db
-
-hSCX::           db
-hSCY::           db
-hWX::            db
-hWY::            db
-hTilesPerCycle:: db
-hBGMapMode::     db
-hBGMapThird::    db
-hBGMapAddress::  dw
-
-hOAMUpdate:: db
-
-hSPBuffer::  dw
-
-hBGMapUpdate::    db
-hBGMapTileCount:: db
-
-	ds 1
-
-hMapAnims::      db
-hTileAnimFrame:: db
-
-hLastTalked:: db
-
-hRandomAdd:: db
-hRandomSub:: db
-
-hUnusedBackup:: db
-
-hBattleTurn::
-; Which trainer's turn is it? 0: player, 1: opponent trainer
-	db
-
-hCGBPalUpdate:: db
-hCGB::          db
-hSGB::          db
-
-hDMATransfer:: db
-hMobile:: db
-hSystemBooted:: db
-
-if DEF(_DEBUG)
-hDebugRoomMenuPage::
-endc
-hClockResetTrigger:: db
-
-	ds 19
--- /dev/null
+++ b/ram.asm
@@ -1,0 +1,9 @@
+INCLUDE "constants.asm"
+
+INCLUDE "macros/wram.asm"
+
+
+INCLUDE "ram/vram.asm"
+INCLUDE "ram/wram.asm"
+INCLUDE "ram/sram.asm"
+INCLUDE "ram/hram.asm"
--- /dev/null
+++ b/ram/hram.asm
@@ -1,0 +1,178 @@
+SECTION "HRAM", HRAM
+
+hROMBankBackup:: db
+hFarByte::
+hTempBank:: db
+hSRAMBank:: db
+
+hRTCDayHi::   db
+hRTCDayLo::   db
+hRTCHours::   db
+hRTCMinutes:: db
+hRTCSeconds:: db
+
+	ds 2
+
+hHours:: db
+	ds 1
+hMinutes:: db
+	ds 1
+hSeconds:: db
+	ds 1
+
+	ds 1
+
+hVBlankCounter:: db
+
+	ds 1
+
+hROMBank:: db
+hVBlank:: db
+hMapEntryMethod:: db
+
+hMenuReturn:: db
+hUnusedByte:: db
+
+hJoypadReleased:: db
+hJoypadPressed::  db
+hJoypadDown::     db
+hJoypadSum::      db
+hJoyReleased::    db
+hJoyPressed::     db
+hJoyDown::        db
+hJoyLast::        db
+
+hInMenu:: db
+
+	ds 1
+
+hPrinter:: db
+hGraphicStartTile:: db
+hMoveMon:: db
+
+UNION
+hMapObjectIndex:: db
+hObjectStructIndex:: db
+NEXTU
+hConnectionStripLength:: db
+hConnectedMapWidth:: db
+ENDU
+
+hEnemyMonSpeed:: dw
+
+UNION
+; math-related values
+
+UNION
+; inputs to Multiply
+	ds 1
+hMultiplicand:: ds 3
+hMultiplier::   db
+NEXTU
+; result of Multiply
+hProduct::      ds 4
+NEXTU
+; inputs to Divide
+hDividend::     ds 4
+hDivisor::      db
+NEXTU
+; results of Divide
+hQuotient::     ds 4
+hRemainder::    db
+ENDU
+
+hMathBuffer:: ds 5
+
+NEXTU
+; PrintNum scratch space
+hPrintNumBuffer:: ds 10
+
+NEXTU
+; Mystery Gift
+hMGExchangedByte:: db
+hMGExchangedWord:: dw
+hMGNumBits:: db
+hMGChecksum:: dw
+	ds 1
+hMGUnusedMsgLength:: db
+hMGRole:: db
+hMGStatusFlags:: db
+ENDU
+
+UNION
+hUsedSpriteIndex:: db
+hUsedSpriteTile::  db
+NEXTU
+hCurSpriteXCoord::   db
+hCurSpriteYCoord::   db
+hCurSpriteXPixel::   db
+hCurSpriteYPixel::   db
+hCurSpriteTile::     db
+hCurSpriteOAMFlags:: db
+ENDU
+
+UNION
+hMoneyTemp:: ds 3
+NEXTU
+hMGJoypadPressed::  db
+hMGJoypadReleased:: db
+hMGPrevTIMA::       db
+ENDU
+
+hLCDCPointer::     db
+hLYOverrideStart:: db
+hLYOverrideEnd::   db
+
+hMobileReceive::             db
+hSerialReceivedNewData::     db
+hSerialConnectionStatus::    db
+hSerialIgnoringInitialData:: db
+hSerialSend::                db
+hSerialReceive::             db
+
+hSCX::           db
+hSCY::           db
+hWX::            db
+hWY::            db
+hTilesPerCycle:: db
+hBGMapMode::     db
+hBGMapThird::    db
+hBGMapAddress::  dw
+
+hOAMUpdate:: db
+
+hSPBuffer::  dw
+
+hBGMapUpdate::    db
+hBGMapTileCount:: db
+
+	ds 1
+
+hMapAnims::      db
+hTileAnimFrame:: db
+
+hLastTalked:: db
+
+hRandomAdd:: db
+hRandomSub:: db
+
+hUnusedBackup:: db
+
+hBattleTurn::
+; Which trainer's turn is it? 0: player, 1: opponent trainer
+	db
+
+hCGBPalUpdate:: db
+hCGB::          db
+hSGB::          db
+
+hDMATransfer:: db
+hMobile:: db
+hSystemBooted:: db
+
+if DEF(_DEBUG)
+hDebugRoomMenuPage::
+endc
+hClockResetTrigger:: db
+
+	ds 19
--- /dev/null
+++ b/ram/sram.asm
@@ -1,0 +1,384 @@
+SECTION "Scratch", SRAM
+
+sScratch:: ds $60 tiles
+
+
+SECTION "SRAM Bank 0", SRAM
+
+sPartyMail::
+; sPartyMon1Mail - sPartyMon6Mail
+for n, 1, PARTY_LENGTH + 1
+sPartyMon{d:n}Mail:: mailmsg sPartyMon{d:n}Mail
+endr
+
+sPartyMailBackup::
+; sPartyMon1MailBackup - sPartyMon6MailBackup
+for n, 1, PARTY_LENGTH + 1
+sPartyMon{d:n}MailBackup:: mailmsg sPartyMon{d:n}MailBackup
+endr
+
+sMailboxCount:: db
+sMailboxes::
+; sMailbox1 - sMailbox10
+for n, 1, MAILBOX_CAPACITY + 1
+sMailbox{d:n}:: mailmsg sMailbox{d:n}
+endr
+
+sMailboxCountBackup:: db
+sMailboxesBackup::
+; sMailbox1Backup - sMailbox10Backup
+for n, 1, MAILBOX_CAPACITY + 1
+sMailbox{d:n}Backup:: mailmsg sMailbox{d:n}Backup
+endr
+
+sMysteryGiftData::
+sMysteryGiftItem:: db
+sMysteryGiftUnlocked:: db
+sBackupMysteryGiftItem:: db
+sNumDailyMysteryGiftPartnerIDs:: db
+sDailyMysteryGiftPartnerIDs:: ds MAX_MYSTERY_GIFT_PARTNERS * 2
+sMysteryGiftDecorationsReceived:: flag_array NUM_NON_TROPHY_DECOS
+	ds 4
+sMysteryGiftTimer:: dw
+	ds 1
+sMysteryGiftTrainerHouseFlag:: db
+sMysteryGiftPartnerName:: ds NAME_LENGTH
+sMysteryGiftUnusedFlag:: db
+sMysteryGiftTrainer:: ds wMysteryGiftTrainerEnd - wMysteryGiftTrainer
+sBackupMysteryGiftItemEnd::
+
+	ds $30
+
+sRTCStatusFlags:: db
+	ds 7
+sLuckyNumberDay:: db
+sLuckyIDNumber::  dw
+
+
+SECTION "Backup Save", SRAM
+
+sBackupOptions:: ds wOptionsEnd - wOptions
+
+sBackupCheckValue1:: db ; loaded with SAVE_CHECK_VALUE_1, used to check save corruption
+
+sBackupGameData::
+sBackupPlayerData::  ds wPlayerDataEnd - wPlayerData
+sBackupCurMapData::  ds wCurMapDataEnd - wCurMapData
+sBackupPokemonData:: ds wPokemonDataEnd - wPokemonData
+sBackupGameDataEnd::
+
+	ds $18a
+
+sBackupChecksum:: dw
+
+sBackupCheckValue2:: db ; loaded with SAVE_CHECK_VALUE_2, used to check save corruption
+
+sStackTop:: dw
+
+if DEF(_DEBUG)
+sRTCHaltCheckValue:: dw
+sSkipBattle:: db
+sDebugTimeCyclesSinceLastCall:: db
+sOpenedInvalidSRAM:: db
+sIsBugMon:: db
+endc
+
+
+SECTION "Save", SRAM
+
+sOptions:: ds wOptionsEnd - wOptions
+
+sCheckValue1:: db ; loaded with SAVE_CHECK_VALUE_1, used to check save corruption
+
+sGameData::
+sPlayerData::  ds wPlayerDataEnd - wPlayerData
+sCurMapData::  ds wCurMapDataEnd - wCurMapData
+sPokemonData:: ds wPokemonDataEnd - wPokemonData
+sGameDataEnd::
+
+	ds $18a
+
+sChecksum:: dw
+
+sCheckValue2:: db ; loaded with SAVE_CHECK_VALUE_2, used to check save corruption
+
+
+SECTION "Active Box", SRAM
+
+sBox:: box sBox
+
+	ds $100
+
+
+SECTION "Link Battle Data", SRAM
+
+sLinkBattleStats::
+sLinkBattleWins::   dw
+sLinkBattleLosses:: dw
+sLinkBattleDraws::  dw
+
+sLinkBattleRecord::
+; sLinkBattleRecord1 - sLinkBattleRecord5
+for n, 1, NUM_LINK_BATTLE_RECORDS + 1
+sLinkBattleRecord{d:n}:: link_battle_record sLinkBattleRecord{d:n}
+endr
+sLinkBattleStatsEnd::
+
+
+SECTION "SRAM Hall of Fame", SRAM
+
+sHallOfFame::
+; sHallOfFame1 - sHallOfFame30
+for n, 1, NUM_HOF_TEAMS + 1
+sHallOfFame{d:n}:: hall_of_fame sHallOfFame{d:n}
+endr
+sHallOfFameEnd::
+
+
+SECTION "SRAM Crystal Data", SRAM
+
+sMobileEventIndex:: db
+
+sCrystalData:: ds wCrystalDataEnd - wCrystalData
+
+sMobileEventIndexBackup:: db
+
+
+SECTION "SRAM Battle Tower", SRAM
+
+; Battle Tower data must be in SRAM because you can save and leave between battles
+sBattleTowerChallengeState::
+; 0: normal
+; 2: battle tower
+	db
+
+sNrOfBeatenBattleTowerTrainers:: db
+sBTChoiceOfLevelGroup:: db
+; Battle Tower trainers are saved here, so nobody appears more than once
+sBTTrainers:: ds BATTLETOWER_STREAK_LENGTH ; sbe48
+sBattleTowerSaveFileFlags:: db
+sBattleTowerReward:: db
+
+sBTMonOfTrainers::
+; team of previous trainer
+; sBTMonPrevTrainer1 - sBTMonPrevTrainer3
+for n, 1, BATTLETOWER_PARTY_LENGTH + 1
+sBTMonPrevTrainer{d:n}:: db
+endr
+; team of preprevious trainer
+; sBTMonPrevPrevTrainer1 - sBTMonPrevPrevTrainer3
+for n, 1, BATTLETOWER_PARTY_LENGTH + 1
+sBTMonPrevPrevTrainer{d:n}:: db
+endr
+
+
+; The PC boxes will not fit into one SRAM bank,
+; so they use multiple SECTIONs
+DEF box_n = 0
+MACRO boxes
+	rept \1
+		DEF box_n += 1
+	sBox{d:box_n}:: box sBox{d:box_n}
+	endr
+ENDM
+
+SECTION "Boxes 1-7", SRAM
+
+; sBox1 - sBox7
+	boxes 7
+
+SECTION "Boxes 8-14", SRAM
+
+; sBox8 - sBox14
+	boxes 7
+
+; All 14 boxes fit exactly within 2 SRAM banks
+	assert box_n == NUM_BOXES, \
+		"boxes: Expected {d:NUM_BOXES} total boxes, got {d:box_n}"
+
+
+SECTION "SRAM Mobile 1", SRAM
+
+	ds $7
+
+s4_a007:: ; struct size $30
+
+	ds $c
+
+s4_a013:: ds 36
+
+s4_a037:: ds 4
+
+s4_a03b:: ds 37 * 40
+
+s4_a603:: ds 8
+
+s4_a60b:: db
+s4_a60c:: db
+s4_a60d:: db
+
+s4_a60e:: dw
+
+	ds $1f0
+
+sMobileBattleTimer:: ds 3
+
+	ds $7fd
+
+s4_b000:: db
+
+
+SECTION "SRAM Mobile 2", SRAM
+
+	ds 1 ; JP: location of sMobileEventIndex
+
+sTrainerRankings::
+sTrainerRankingGameTimeHOF:: ds 4
+sTrainerRankingStepCountHOF:: ds 4
+sTrainerRankingHealingsHOF:: ds 4
+sTrainerRankingBattlesHOF:: ds 3
+sTrainerRankingStepCount:: ds 4
+sTrainerRankingBattleTowerWins:: ds 4
+sTrainerRankingTMsHMsTaught:: ds 3
+sTrainerRankingBattles:: ds 3
+sTrainerRankingWildBattles:: ds 3
+sTrainerRankingTrainerBattles:: ds 3
+sTrainerRankingUnused1:: ds 3
+sTrainerRankingHOFEntries:: ds 3
+sTrainerRankingWildMonsCaught:: ds 3
+sTrainerRankingHookedEncounters:: ds 3
+sTrainerRankingEggsHatched:: ds 3
+sTrainerRankingMonsEvolved:: ds 3
+sTrainerRankingFruitPicked:: ds 3
+sTrainerRankingHealings:: ds 3
+sTrainerRankingMysteryGift:: ds 3
+sTrainerRankingTrades:: ds 3
+sTrainerRankingFly:: ds 3
+sTrainerRankingSurf:: ds 3
+sTrainerRankingWaterfall:: ds 3
+sTrainerRankingWhiteOuts:: ds 3
+sTrainerRankingLuckyNumberShow:: ds 3
+sTrainerRankingPhoneCalls:: ds 3
+sTrainerRankingUnused2:: ds 3
+sTrainerRankingLinkBattles:: ds 3
+sTrainerRankingSplash:: ds 3
+sTrainerRankingTreeEncounters:: ds 3
+sTrainerRankingUnused3:: ds 3
+sTrainerRankingColosseumWins:: ds 3
+sTrainerRankingColosseumLosses:: ds 3
+sTrainerRankingColosseumDraws:: ds 3
+sTrainerRankingSelfdestruct:: ds 3
+sTrainerRankingCurrentSlotsStreak:: ds 2
+sTrainerRankingLongestSlotsStreak:: ds 2
+sTrainerRankingTotalSlotsPayouts:: ds 4
+sTrainerRankingTotalBattlePayouts:: ds 4
+sTrainerRankingLongestMagikarp:: ds 2
+sTrainerRankingShortestMagikarp:: ds 2
+sTrainerRankingBugContestScore:: ds 2
+sTrainerRankingsChecksum:: ds 2
+sTrainerRankingsEnd::
+
+	ds 1 ; JP: location of sMobileEventIndexBackup
+
+sTrainerRankingsBackup:: ds sTrainerRankingsEnd - sTrainerRankings
+
+	ds $6fa
+
+s5_a800:: db
+
+	ds $24
+
+s5_a825:: db
+s5_a826:: db
+
+	ds $6d
+
+s5_a894:: ds 6
+s5_a89a:: dw
+s5_a89c:: ds 22
+s5_a8b2:: ds 150
+
+s5_a948:: ds 246
+
+	ds $3
+
+s5_aa41:: ds 4
+
+	ds $2
+
+s5_aa47:: db
+s5_aa48:: db
+
+	ds $1
+
+s5_aa4a:: db
+
+sMobileLoginPassword:: ds MOBILE_LOGIN_PASSWORD_LENGTH
+
+	ds $1
+
+s5_aa5d:: ds MOBILE_LOGIN_PASSWORD_LENGTH
+
+	ds $4
+
+s5_aa72:: db
+s5_aa73:: ds 12
+s5_aa7f:: ds 12
+
+s5_aa8b:: db
+s5_aa8c:: db
+s5_aa8d:: db
+s5_aa8e:: ds 7 * $cc
+
+	ds $1
+
+s5_b023:: ds 105
+s5_b08c:: ds 4
+s5_b090:: db
+s5_b091:: db
+s5_b092:: ds 31
+
+	ds $100
+
+s5_b1b1:: db
+s5_b1b2:: db
+s5_b1b3:: db
+s5_b1b4:: db
+
+	ds $1e
+
+s5_b1d3::
+
+	ds $120
+
+s5_b2f3:: db
+s5_b2f4:: ds 4
+
+	ds $1
+
+s5_b2f9:: db
+s5_b2fa:: db
+s5_b2fb:: db
+
+	ds $b49
+
+s5_be45:: db
+s5_be46:: db
+
+	ds $1b8
+
+s5_bfff:: db
+
+
+SECTION "SRAM Mobile 3", SRAM
+
+s6_a000::
+
+
+SECTION "SRAM Mobile 4", SRAM
+
+s7_a000::
+
+	ds $800
+
+s7_a800:: db
--- /dev/null
+++ b/ram/vram.asm
@@ -1,0 +1,16 @@
+SECTION "VRAM0", VRAM
+
+vTiles0:: ds $80 tiles
+vTiles1:: ds $80 tiles
+vTiles2:: ds $80 tiles
+vBGMap0:: ds BG_MAP_WIDTH * BG_MAP_HEIGHT
+vBGMap1:: ds BG_MAP_WIDTH * BG_MAP_HEIGHT
+
+
+SECTION "VRAM1", VRAM
+
+vTiles3:: ds $80 tiles
+vTiles4:: ds $80 tiles
+vTiles5:: ds $80 tiles
+vBGMap2:: ds BG_MAP_WIDTH * BG_MAP_HEIGHT
+vBGMap3:: ds BG_MAP_WIDTH * BG_MAP_HEIGHT
--- /dev/null
+++ b/ram/wram.asm
@@ -1,0 +1,3608 @@
+SECTION "Stack", WRAM0
+
+wStackBottom::
+	ds $100 - 1
+wStackTop::
+	ds 1
+
+
+SECTION "Audio RAM", WRAM0
+
+; nonzero if playing
+wMusicPlaying:: db
+
+wAudio::
+; wChannel1 - wChannel8
+for n, 1, NUM_CHANNELS + 1
+wChannel{d:n}:: channel_struct wChannel{d:n}
+endr
+
+	ds 1
+
+wCurTrackDuty:: db
+wCurTrackVolumeEnvelope:: db
+wCurTrackFrequency:: dw
+wUnusedBCDNumber:: db ; BCD value, dummied out
+wCurNoteDuration:: db ; used in MusicE0 and LoadNote
+
+wCurMusicByte:: db
+wCurChannel:: db
+wVolume::
+; corresponds to rNR50
+; Channel control / ON-OFF / Volume (R/W)
+;   bit 7 - Vin->SO2 ON/OFF
+;   bit 6-4 - SO2 output level (volume) (# 0-7)
+;   bit 3 - Vin->SO1 ON/OFF
+;   bit 2-0 - SO1 output level (volume) (# 0-7)
+	db
+wSoundOutput::
+; corresponds to rNR51
+; bit 4-7: ch1-4 so2 on/off
+; bit 0-3: ch1-4 so1 on/off
+	db
+wPitchSweep::
+; corresponds to rNR10
+; bit 7:   unused
+; bit 4-6: sweep time
+; bit 3:   sweep direction
+; but 0-2: sweep shift
+	db
+
+wMusicID:: dw
+wMusicBank:: db
+wNoiseSampleAddress:: dw
+wNoiseSampleDelay:: db
+	ds 1
+wMusicNoiseSampleSet:: db
+wSFXNoiseSampleSet:: db
+
+wLowHealthAlarm::
+; bit 7: on/off
+; bit 4: pitch
+; bit 0-3: counter
+	db
+
+wMusicFade::
+; fades volume over x frames
+; bit 7: fade in/out
+; bit 0-5: number of frames for each volume level
+; $00 = none (default)
+	db
+wMusicFadeCount:: db
+wMusicFadeID:: dw
+
+	ds 5
+
+wCryPitch:: dw
+wCryLength:: dw
+
+wLastVolume:: db
+wUnusedMusicF9Flag:: db
+
+wSFXPriority::
+; if nonzero, turn off music when playing sfx
+	db
+
+	ds 1
+
+wChannel1JumpCondition:: db
+wChannel2JumpCondition:: db
+wChannel3JumpCondition:: db
+wChannel4JumpCondition:: db
+
+wStereoPanningMask:: db
+
+wCryTracks::
+; plays only in left or right track depending on what side the monster is on
+; both tracks active outside of battle
+	db
+
+wSFXDuration:: db
+wCurSFX::
+; id of sfx currently playing
+	db
+
+wAudioEnd::
+
+wMapMusic:: db
+
+wDontPlayMapMusicOnReload:: db
+
+
+SECTION "WRAM", WRAM0
+
+wLZAddress:: dw
+wLZBank::    db
+
+	ds 1
+
+wBoxAlignment:: db
+
+wInputType::        db
+wAutoInputAddress:: dw
+wAutoInputBank::    db
+wAutoInputLength::  db
+
+wDebugFlags:: db
+wGameLogicPaused:: db
+wSpriteUpdatesEnabled:: db
+
+wUnusedScriptByte:: db
+
+wMapTimeOfDay:: db
+
+	ds 3
+
+wPrinterConnectionOpen:: db
+wPrinterOpcode:: db
+wPrevDexEntry:: db
+wDisableTextAcceleration:: db
+wPrevLandmark:: db
+wCurLandmark:: db
+wLandmarkSignTimer:: dw
+
+wLinkMode::
+; a LINK_* value for the link type
+	db
+
+wScriptVar:: db
+
+wPlayerNextMovement:: db
+wPlayerMovement:: db
+
+	ds 2
+
+wMovementObject::
+	db
+wMovementDataBank:: db
+wMovementDataAddress:: dw
+wIndexedMovement2Pointer:: dw
+
+	ds 2
+
+wMovementByteWasControlSwitch:: db
+
+UNION
+wObjectPriorities:: ds NUM_OBJECT_STRUCTS
+
+NEXTU
+wMovementPointer:: dw
+	ds 3
+wTempObjectCopyMapObjectIndex:: db
+wTempObjectCopySprite:: db
+wTempObjectCopySpriteVTile:: db
+wTempObjectCopyPalette:: db
+wTempObjectCopyMovement:: db
+wTempObjectCopyRange:: db
+wTempObjectCopyX:: db
+wTempObjectCopyY:: db
+wTempObjectCopyRadius:: db
+ENDU
+
+	ds 1
+
+wTileDown::  db
+wTileUp::    db
+wTileLeft::  db
+wTileRight:: db
+
+wTilePermissions::
+; set if tile behavior prevents
+; you from walking in that direction
+; bit 3: down
+; bit 2: up
+; bit 1: left
+; bit 0: right
+	db
+
+
+SECTION "wSpriteAnims", WRAM0
+
+UNION
+wSpriteAnimData::
+
+wSpriteAnimDict::
+; wSpriteAnimDict pairs keys with values
+; keys: SPRITE_ANIM_DICT_* indexes (taken from SpriteAnimSeqData)
+; values: vTiles0 offsets
+	ds NUM_SPRITEANIMDICT_ENTRIES * 2
+
+wSpriteAnimationStructs::
+; wSpriteAnim1 - wSpriteAnim10
+for n, 1, NUM_SPRITE_ANIM_STRUCTS + 1
+; field  0:   index
+; fields 1-3: loaded from SpriteAnimSeqData
+wSpriteAnim{d:n}:: sprite_anim_struct wSpriteAnim{d:n}
+endr
+wSpriteAnimationStructsEnd::
+
+NEXTU
+; mobile data
+wMobileWRAM::
+wMobileErrorCodeBuffer:: ds 3
+wc303:: ds 2
+wc305:: ds 1
+wc306:: ds 1
+wc307:: ds 1
+wc308:: ds 1
+wc309:: ds 1
+wc30a:: ds 1
+wc30b:: ds 1
+wc30c:: ds 1
+wc30d:: ds 1
+wc30e:: ds 1
+wc30f:: ds 1
+wc310:: ds 1
+wc311:: ds 1
+wc312:: ds 1
+wc313:: ds 1
+wc314:: ds 5
+wc319:: db
+wc31a:: db
+wc31b:: db
+wc31c:: db
+wc31d:: db
+wc31e:: db
+wc31f:: db
+wc320:: ds 38
+wc346:: ds 102
+wc3ac:: ds 8
+ENDU
+
+wSpriteAnimCount:: db
+wCurSpriteOAMAddr:: db
+
+wCurIcon:: db
+
+wCurIconTile:: db
+UNION
+wSpriteAnimID::
+wCurSpriteOAMFlags:: db
+NEXTU
+wSpriteAnimAddrBackup:: dw
+ENDU
+wCurAnimVTile:: db
+wCurAnimXCoord:: db
+wCurAnimYCoord:: db
+wCurAnimXOffset:: db
+wCurAnimYOffset:: db
+wGlobalAnimYOffset:: db
+wGlobalAnimXOffset:: db
+
+wSpriteAnimDataEnd::
+
+	ds 11
+
+; mobile data
+wc3cc:: ds 1
+wc3cd:: ds 31
+wc3ec:: ds 1
+wc3ed:: ds 1
+wc3ee:: ds 1
+wc3ef:: ds 1
+wc3f0:: ds 1
+wc3f1:: ds 1
+wc3f2:: ds 1
+wc3f3:: ds 1
+wc3f4:: ds 1
+wc3f5:: ds 1
+wc3f6:: ds 1
+wc3f7:: ds 1
+wc3f8:: ds 1
+wc3f9:: ds 1
+wc3fa:: ds 1
+wc3fb:: ds 1
+wc3fc:: ds 1
+	ds 3
+wMobileWRAMEnd::
+
+
+SECTION "Sprites", WRAM0
+
+wVirtualOAM::
+; wVirtualOAMSprite00 - wVirtualOAMSprite39
+for n, NUM_SPRITE_OAM_STRUCTS
+wVirtualOAMSprite{02d:n}:: sprite_oam_struct wVirtualOAMSprite{02d:n}
+endr
+wVirtualOAMEnd::
+
+
+SECTION "Tilemap", WRAM0
+
+wTilemap::
+; 20x18 grid of 8x8 tiles
+	ds SCREEN_WIDTH * SCREEN_HEIGHT
+wTilemapEnd::
+
+
+; This union spans 480 bytes.
+SECTION UNION "Miscellaneous", WRAM0
+
+; surrounding tiles
+; This buffer determines the size for the rest of the union;
+; it uses exactly 480 bytes.
+wSurroundingTiles:: ds SURROUNDING_WIDTH * SURROUNDING_HEIGHT
+
+
+SECTION UNION "Miscellaneous", WRAM0
+
+; box save buffer
+; SaveBoxAddress uses this buffer in three steps because it
+; needs more space than the buffer can hold.
+wBoxPartialData:: ds 480
+wBoxPartialDataEnd::
+
+
+SECTION UNION "Miscellaneous", WRAM0
+
+; battle tower temp struct
+wBT_OTTemp:: battle_tower_struct wBT_OTTemp
+
+
+SECTION UNION "Miscellaneous", WRAM0
+
+; battle data
+wBattle::
+wEnemyMoveStruct::  move_struct wEnemyMoveStruct
+wPlayerMoveStruct:: move_struct wPlayerMoveStruct
+
+wEnemyMonNickname::  ds MON_NAME_LENGTH
+wBattleMonNickname:: ds MON_NAME_LENGTH
+
+wBattleMon:: battle_struct wBattleMon
+
+	ds 2
+
+wWildMon:: db
+	ds 1
+
+wEnemyTrainerItem1:: db
+wEnemyTrainerItem2:: db
+wEnemyTrainerBaseReward:: db
+wEnemyTrainerAIFlags:: ds 3
+wOTClassName:: ds TRAINER_CLASS_NAME_LENGTH
+
+wCurOTMon:: db
+
+wBattleParticipantsNotFainted::
+; Bit array.  Bits 0 - 5 correspond to party members 1 - 6.
+; Bit set if the mon appears in battle.
+; Bit cleared if the mon faints.
+; Backed up if the enemy switches.
+; All bits cleared if the enemy faints.
+	db
+
+wTypeModifier::
+; >10: super-effective
+;  10: normal
+; <10: not very effective
+; bit 7: stab
+	db
+
+wCriticalHit::
+; 0 if not critical
+; 1 for a critical hit
+; 2 for a OHKO
+	db
+
+wAttackMissed::
+; nonzero for a miss
+	db
+
+wPlayerSubStatus1:: db
+wPlayerSubStatus2:: db
+wPlayerSubStatus3:: db
+wPlayerSubStatus4:: db
+wPlayerSubStatus5:: db
+
+wEnemySubStatus1:: db
+wEnemySubStatus2:: db
+wEnemySubStatus3:: db
+wEnemySubStatus4:: db
+wEnemySubStatus5:: db
+
+wPlayerRolloutCount:: db
+wPlayerConfuseCount:: db
+wPlayerToxicCount:: db
+wPlayerDisableCount:: db
+wPlayerEncoreCount:: db
+wPlayerPerishCount:: db
+wPlayerFuryCutterCount:: db
+wPlayerProtectCount:: db
+
+wEnemyRolloutCount:: db
+wEnemyConfuseCount:: db
+wEnemyToxicCount:: db
+wEnemyDisableCount:: db
+wEnemyEncoreCount:: db
+wEnemyPerishCount:: db
+wEnemyFuryCutterCount:: db
+wEnemyProtectCount:: db
+
+wPlayerDamageTaken:: dw
+wEnemyDamageTaken::  dw
+
+wBattleReward:: ds 3
+
+wBattleAnimParam:: db
+
+wBattleScriptBuffer:: ds 40
+
+wBattleScriptBufferAddress:: dw
+
+wTurnEnded:: db
+
+	ds 1
+
+wPlayerStats::
+wPlayerAttack::  dw
+wPlayerDefense:: dw
+wPlayerSpeed::   dw
+wPlayerSpAtk::   dw
+wPlayerSpDef::   dw
+	ds 1
+
+wEnemyStats::
+wEnemyAttack::  dw
+wEnemyDefense:: dw
+wEnemySpeed::   dw
+wEnemySpAtk::   dw
+wEnemySpDef::   dw
+	ds 1
+
+wPlayerStatLevels::
+wPlayerAtkLevel::  db
+wPlayerDefLevel::  db
+wPlayerSpdLevel::  db
+wPlayerSAtkLevel:: db
+wPlayerSDefLevel:: db
+wPlayerAccLevel::  db
+wPlayerEvaLevel::  db
+	ds 1
+
+wEnemyStatLevels::
+wEnemyAtkLevel::  db
+wEnemyDefLevel::  db
+wEnemySpdLevel::  db
+wEnemySAtkLevel:: db
+wEnemySDefLevel:: db
+wEnemyAccLevel::  db
+wEnemyEvaLevel::  db
+	ds 1
+
+wEnemyTurnsTaken::  db
+wPlayerTurnsTaken:: db
+	ds 1
+
+wPlayerSubstituteHP:: db
+wEnemySubstituteHP::  db
+
+wUnusedPlayerLockedMove:: db
+	ds 1
+
+wCurPlayerMove:: db
+wCurEnemyMove::  db
+
+wLinkBattleRNCount::
+; how far through the prng stream
+	db
+
+wEnemyItemState:: db
+	ds 2
+wCurEnemyMoveNum:: db
+
+wEnemyHPAtTimeOfPlayerSwitch:: dw
+wPayDayMoney:: ds 3
+
+wSafariMonAngerCount:: db ; unreferenced
+wSafariMonEating:: db
+	ds 1
+wEnemyBackupDVs:: dw ; used when enemy is transformed
+wAlreadyDisobeyed:: db
+
+wDisabledMove:: db
+wEnemyDisabledMove:: db
+wWhichMonFaintedFirst:: db
+
+; exists so you can't counter on switch
+wLastPlayerCounterMove:: db
+wLastEnemyCounterMove:: db
+
+wEnemyMinimized:: db
+
+wAlreadyFailed:: db
+
+wBattleParticipantsIncludingFainted:: db
+wBattleLowHealthAlarm:: db
+wPlayerMinimized:: db
+wPlayerScreens::
+; bit
+; 0 spikes
+; 1
+; 2 safeguard
+; 3 light screen
+; 4 reflect
+; 5-7 unused
+	db
+
+wEnemyScreens::
+; see wPlayerScreens
+	db
+
+wPlayerSafeguardCount:: db
+wPlayerLightScreenCount:: db
+wPlayerReflectCount:: db
+	ds 1
+
+wEnemySafeguardCount:: db
+wEnemyLightScreenCount:: db
+wEnemyReflectCount:: db
+	ds 1
+
+	ds 1
+
+wBattleWeather::
+; 00 normal
+; 01 rain
+; 02 sun
+; 03 sandstorm
+; 04 rain stopped
+; 05 sunliight faded
+; 06 sandstorm subsided
+	db
+
+wWeatherCount::
+; # turns remaining
+	db
+
+wLoweredStat:: db
+wEffectFailed:: db
+wFailedMessage:: db
+wEnemyGoesFirst:: db
+
+wPlayerIsSwitching:: db
+wEnemyIsSwitching::  db
+
+wPlayerUsedMoves::
+; add a move that has been used once by the player
+; added in order of use
+	ds NUM_MOVES
+
+wEnemyAISwitchScore:: db
+wEnemySwitchMonParam:: db
+wEnemySwitchMonIndex:: db
+wTempLevel:: db
+wLastPlayerMon:: db
+wLastPlayerMove:: db
+wLastEnemyMove:: db
+
+wPlayerFutureSightCount:: db
+wEnemyFutureSightCount:: db
+
+wGivingExperienceToExpShareHolders:: db
+
+wBackupEnemyMonBaseStats:: ds NUM_EXP_STATS
+wBackupEnemyMonCatchRate:: db
+wBackupEnemyMonBaseExp:: db
+
+wPlayerFutureSightDamage:: dw
+wEnemyFutureSightDamage:: dw
+wPlayerRageCounter:: db
+wEnemyRageCounter:: db
+
+wBeatUpHitAtLeastOnce:: db
+
+wPlayerTrappingMove:: db
+wEnemyTrappingMove:: db
+wPlayerWrapCount:: db
+wEnemyWrapCount:: db
+wPlayerCharging:: db
+wEnemyCharging:: db
+
+wBattleEnded:: db
+
+wWildMonMoves:: ds NUM_MOVES
+wWildMonPP:: ds NUM_MOVES
+
+wAmuletCoin:: db
+
+wSomeoneIsRampaging:: db
+
+wPlayerJustGotFrozen:: db
+wEnemyJustGotFrozen:: db
+wBattleEnd::
+
+
+SECTION UNION "Miscellaneous", WRAM0
+
+; link patch lists
+wPlayerPatchLists:: ds 200
+wOTPatchLists:: ds 200
+
+
+SECTION UNION "Miscellaneous", WRAM0
+
+; mobile
+wMobileTransferData:: ds 480
+
+
+SECTION UNION "Miscellaneous", WRAM0
+
+; This union spans 200 bytes.
+UNION
+; timeset temp storage
+wTimeSetBuffer::
+	ds 20
+wInitHourBuffer:: db
+	ds 9
+wInitMinuteBuffer:: db
+	ds 19
+wTimeSetBufferEnd::
+
+NEXTU
+; hall of fame temp struct
+wHallOfFameTemp:: hall_of_fame wHallOfFameTemp
+
+NEXTU
+; odd egg
+wOddEgg:: party_struct wOddEgg
+wOddEggName:: ds MON_NAME_LENGTH
+wOddEggOT:: ds NAME_LENGTH
+
+NEXTU
+; debug mon color picker
+wDebugMiddleColors::
+wDebugLightColor:: ds 2
+wDebugDarkColor::  ds 2
+	ds 6
+wDebugRedChannel::   db
+wDebugGreenChannel:: db
+wDebugBlueChannel::  db
+
+NEXTU
+; debug tileset color picker
+wDebugPalette::
+wDebugWhiteTileColor:: ds 2
+wDebugLightTileColor:: ds 2
+wDebugDarkTileColor::  ds 2
+wDebugBlackTileColor:: ds 2
+
+NEXTU
+wc608:: ds 16
+wc618:: ds 37
+wc63d:: ds 5
+wc642:: ds 5
+wc647:: ds 1
+wc648:: ds 2
+wc64a:: ds 30
+wc668:: ds 32
+wc688:: ds 2
+wc68a:: ds 30
+wc6a8:: ds 40
+ENDU
+
+; This union spans 280 bytes.
+UNION
+; pokedex
+wPokedexDataStart::
+wPokedexOrder:: ds $100 ; >= NUM_POKEMON
+wPokedexOrderEnd::
+wDexListingScrollOffset:: db ; offset of the first displayed entry from the start
+wDexListingCursor:: db ; Dex cursor
+wDexListingEnd:: db ; Last mon to display
+wDexListingHeight:: db ; number of entries displayed at once in the dex listing
+wCurDexMode:: db ; Pokedex Mode
+wDexSearchMonType1:: db ; first type to search
+wDexSearchMonType2:: db ; second type to search
+wDexSearchResultCount:: db
+wDexArrowCursorPosIndex:: db
+wDexArrowCursorDelayCounter:: db
+wDexArrowCursorBlinkCounter:: db
+wDexSearchSlowpokeFrame:: db
+wUnlockedUnownMode:: db
+wDexCurUnownIndex:: db
+wDexUnownCount:: db
+wDexConvertedMonType:: db ; mon type converted from dex search mon type
+wDexListingScrollOffsetBackup:: db
+wDexListingCursorBackup:: db
+wBackupDexListingCursor:: db
+wBackupDexListingPage:: db
+wDexCurLocation:: db
+if DEF(_CRYSTAL11)
+wPokedexStatus:: db
+wPokedexDataEnd::
+else
+wPokedexDataEnd:: ds 1
+endc
+	ds 2
+
+NEXTU
+; pokegear
+wPokegearPhoneDisplayPosition:: db
+wPokegearPhoneCursorPosition:: db
+wPokegearPhoneScrollPosition:: db
+wPokegearPhoneSelectedPerson:: db
+wPokegearPhoneSubmenuCursor:: db
+wPokegearMapCursorObjectPointer:: dw
+wPokegearMapCursorLandmark:: db
+wPokegearMapPlayerIconLandmark:: db
+wPokegearRadioChannelBank:: db
+wPokegearRadioChannelAddr:: dw
+wPokegearRadioMusicPlaying:: db
+
+NEXTU
+; trade
+wPlayerTrademon:: trademon wPlayerTrademon
+wOTTrademon::     trademon wOTTrademon
+wTradeAnimAddress:: dw
+wLinkPlayer1Name:: ds NAME_LENGTH
+wLinkPlayer2Name:: ds NAME_LENGTH
+wLinkTradeSendmonSpecies:: db
+wLinkTradeGetmonSpecies::  db
+
+NEXTU
+; naming screen
+wNamingScreenDestinationPointer:: dw
+wNamingScreenCurNameLength:: db
+wNamingScreenMaxNameLength:: db
+wNamingScreenType:: db
+wNamingScreenCursorObjectPointer:: dw
+wNamingScreenLastCharacter:: db
+wNamingScreenStringEntryCoord:: dw
+
+NEXTU
+; slot machine
+wSlots::
+wReel1:: slot_reel wReel1
+wReel2:: slot_reel wReel2
+wReel3:: slot_reel wReel3
+wReel1Stopped:: ds 3
+wReel2Stopped:: ds 3
+wReel3Stopped:: ds 3
+wSlotBias:: db
+wSlotBet:: db
+wFirstTwoReelsMatching:: db
+wFirstTwoReelsMatchingSevens:: db
+wSlotMatched:: db
+wCurReelStopped:: ds 3
+wPayout:: dw
+wCurReelXCoord:: db
+wCurReelYCoord:: db
+	ds 2
+wSlotBuildingMatch:: db
+wSlotsDataEnd::
+	ds 28
+wSlotsEnd::
+
+NEXTU
+; card flip
+wDeck:: ds 4 * 6
+wDeckEnd::
+wCardFlipNumCardsPlayed:: db
+wCardFlipFaceUpCard:: db
+wDiscardPile:: ds 4 * 6
+wDiscardPileEnd::
+
+; beta poker game
+wBetaPokerSGBPals:: dw
+	ds 1
+wBetaPokerSGBAttr:: db
+wBetaPokerSGBCol:: db
+wBetaPokerSGBRow:: db
+
+NEXTU
+; unused memory game
+wMemoryGameCards:: ds 9 * 5
+wMemoryGameCardsEnd::
+wMemoryGameLastCardPicked:: db
+wMemoryGameCard1:: db
+wMemoryGameCard2:: db
+wMemoryGameCard1Location:: db
+wMemoryGameCard2Location:: db
+wMemoryGameNumberTriesRemaining:: db
+wMemoryGameLastMatches:: ds 5
+wMemoryGameCounter:: db
+wMemoryGameNumCardsMatched:: db
+
+NEXTU
+; unown puzzle
+wPuzzlePieces:: ds 6 * 6
+
+NEXTU
+; mobile data
+wc6d0:: ds 56
+wc708:: db
+wc709:: db
+wc70a:: db
+wc70b:: db
+wc70c:: db
+wc70d:: db
+wc70e:: db
+wc70f:: db
+wc710:: db
+wc711:: db
+wc712:: ds 7
+wc719:: ds 53
+wc74e:: ds 107
+wc7b9:: ds 1
+wc7ba:: ds 1
+wc7bb:: ds 2
+wc7bd:: ds 19
+wc7d0:: ds 1
+wc7d1:: ds 1
+wc7d2:: ds 1
+wc7d3:: ds 2
+ENDU
+
+
+SECTION "Unused Map Buffer", WRAM0
+
+; This was a buffer for map-related pointers in the 1997 G/S prototype.
+; See wMapBuffer in pokegold-spaceworld's wram.asm.
+wUnusedMapBuffer:: ds 24
+wUnusedMapBufferEnd::
+
+
+SECTION UNION "Overworld Map", WRAM0
+
+; overworld map blocks
+wOverworldMapBlocks:: ds 1300
+wOverworldMapBlocksEnd::
+
+
+SECTION UNION "Overworld Map", WRAM0
+
+; GB Printer data
+wGameboyPrinterRAM::
+wGameboyPrinter2bppSource:: ds 40 tiles
+wGameboyPrinter2bppSourceEnd::
+wUnusedGameboyPrinterSafeCancelFlag:: db
+wPrinterRowIndex:: db
+
+; Printer data
+wPrinterData:: ds 4
+wPrinterChecksum:: dw
+wPrinterHandshake:: db
+wPrinterStatusFlags::
+; bit 7: set if error 1 (battery low)
+; bit 6: set if error 4 (too hot or cold)
+; bit 5: set if error 3 (paper jammed or empty)
+; if this and the previous byte are both $ff: error 2 (connection error)
+	db
+
+wHandshakeFrameDelay:: db
+wPrinterSerialFrameDelay:: db
+wPrinterSendByteOffset:: dw
+wPrinterSendByteCounter:: dw
+
+; tilemap backup?
+wPrinterTilemapBuffer:: ds SCREEN_HEIGHT * SCREEN_WIDTH
+wPrinterStatus:: db
+	ds 1
+; High nibble is for margin before the image, low nibble is for after.
+wPrinterMargins:: db
+wPrinterExposureTime:: db
+	ds 16
+wGameboyPrinterRAMEnd::
+
+
+SECTION UNION "Overworld Map", WRAM0
+
+; bill's pc data
+wBillsPCData::
+wBillsPCPokemonList::
+; (species, box number, list index) x30
+	ds 3 * 30
+	ds 720
+wBillsPC_ScrollPosition:: db
+wBillsPC_CursorPosition:: db
+wBillsPC_NumMonsInBox:: db
+wBillsPC_NumMonsOnScreen:: db
+wBillsPC_LoadedBox:: db ; 0 if party, 1 - 14 if box, 15 if active box
+wBillsPC_BackupScrollPosition:: db
+wBillsPC_BackupCursorPosition:: db
+wBillsPC_BackupLoadedBox:: db
+wBillsPC_MonHasMail:: db
+	ds 5
+wBillsPCDataEnd::
+
+
+SECTION UNION "Overworld Map", WRAM0
+
+; Hall of Fame data
+wHallOfFamePokemonList:: hall_of_fame wHallOfFamePokemonList
+
+
+SECTION UNION "Overworld Map", WRAM0
+
+; debug color picker
+wDebugOriginalColors:: ds 256 * 4
+
+
+SECTION UNION "Overworld Map", WRAM0
+
+; raw link data
+wLinkData:: ds 1300
+wLinkDataEnd::
+
+
+SECTION UNION "Overworld Map", WRAM0
+
+; link data members
+wLinkPlayerName:: ds NAME_LENGTH
+wLinkPartyCount:: db
+wLinkPartySpecies:: ds PARTY_LENGTH
+wLinkPartyEnd:: db ; older code doesn't check PartyCount
+
+UNION
+; link player data
+wLinkPlayerData::
+; wLinkPlayerPartyMon1 - wLinkPlayerPartyMon6
+for n, 1, PARTY_LENGTH + 1
+wLinkPlayerPartyMon{d:n}:: party_struct wLinkPlayerPartyMon{d:n}
+endr
+
+wLinkPlayerPartyMonOTs::
+; wLinkPlayerPartyMon1OT - wLinkPlayerPartyMon6OT
+for n, 1, PARTY_LENGTH + 1
+wLinkPlayerPartyMon{d:n}OT:: ds NAME_LENGTH
+endr
+
+wLinkPlayerPartyMonNicknames::
+; wLinkPlayerPartyMon1Nickname - wLinkPlayerPartyMon6Nickname
+for n, 1, PARTY_LENGTH + 1
+wLinkPlayerPartyMon{d:n}Nickname:: ds MON_NAME_LENGTH
+endr
+
+NEXTU
+; time capsule party data
+wTimeCapsulePlayerData::
+; wTimeCapsulePartyMon1 - wTimeCapsulePartyMon6
+for n, 1, PARTY_LENGTH + 1
+wTimeCapsulePartyMon{d:n}:: red_party_struct wTimeCapsulePartyMon{d:n}
+endr
+
+wTimeCapsulePartyMonOTs::
+; wTimeCapsulePartyMon1OT - wTimeCapsulePartyMon6OT
+for n, 1, PARTY_LENGTH + 1
+wTimeCapsulePartyMon{d:n}OT:: ds NAME_LENGTH
+endr
+
+wTimeCapsulePartyMonNicknames::
+; wTimeCapsulePartyMon1Nickname - wTimeCapsulePartyMon6Nickname
+for n, 1, PARTY_LENGTH + 1
+wTimeCapsulePartyMon{d:n}Nickname:: ds MON_NAME_LENGTH
+endr
+
+NEXTU
+; link patch lists
+wLinkPatchList1:: ds SERIAL_PATCH_LIST_LENGTH
+wLinkPatchList2:: ds SERIAL_PATCH_LIST_LENGTH
+ENDU
+
+
+SECTION UNION "Overworld Map", WRAM0
+
+; link data prep
+	ds 1000
+wCurLinkOTPartyMonTypePointer:: dw
+
+wLinkOTPartyMonTypes::
+; wLinkOTPartyMon1Type - wLinkOTPartyMon6Type
+for n, 1, PARTY_LENGTH + 1
+wLinkOTPartyMon{d:n}Type:: dw
+endr
+
+
+SECTION UNION "Overworld Map", WRAM0
+
+; link mail data
+	ds 500
+wLinkPlayerMail::
+wLinkPlayerMailPreamble:: ds SERIAL_MAIL_PREAMBLE_LENGTH
+wLinkPlayerMailMessages:: ds (MAIL_MSG_LENGTH + 1) * PARTY_LENGTH
+wLinkPlayerMailMetadata:: ds (MAIL_STRUCT_LENGTH - (MAIL_MSG_LENGTH + 1)) * PARTY_LENGTH
+wLinkPlayerMailPatchSet:: ds 103
+wLinkPlayerMailEnd::
+	ds 10
+wLinkOTMail::
+wLinkOTMailMessages:: ds (MAIL_MSG_LENGTH + 1) * PARTY_LENGTH
+wLinkOTMailMetadata:: ds (MAIL_STRUCT_LENGTH - (MAIL_MSG_LENGTH + 1)) * PARTY_LENGTH
+wOTPlayerMailPatchSet:: ds 103 + SERIAL_MAIL_PREAMBLE_LENGTH
+wLinkOTMailEnd::
+	ds 10
+
+
+SECTION UNION "Overworld Map", WRAM0
+
+; received link mail data
+	ds 500
+wLinkReceivedMail:: ds MAIL_STRUCT_LENGTH * PARTY_LENGTH
+wLinkReceivedMailEnd:: db
+
+
+SECTION UNION "Overworld Map", WRAM0
+
+; mystery gift data
+wMysteryGiftStaging:: ds 80
+
+UNION
+wMysteryGiftTrainer:: ds 1 + (1 + 1 + NUM_MOVES) * PARTY_LENGTH + 1
+wMysteryGiftTrainerEnd::
+
+NEXTU
+wNameCardData:: ds NAME_LENGTH + 2 + 2 + 1 + 8 + 12
+wNameCardDataEnd::
+
+NEXTU
+wMysteryGiftCardHolderName:: ds PLAYER_NAME_LENGTH
+ENDU
+
+	ds 138
+
+wMysteryGiftPartnerData::
+wMysteryGiftGameVersion:: db
+wMysteryGiftPartnerID:: dw
+wMysteryGiftPartnerName:: ds NAME_LENGTH
+wMysteryGiftPartnerDexCaught:: db
+wMysteryGiftPartnerSentDeco:: db
+wMysteryGiftPartnerWhichItem:: db
+wMysteryGiftPartnerWhichDeco:: db
+wMysteryGiftPartnerBackupItem:: db
+	ds 1
+wMysteryGiftPartnerDataEnd::
+
+	ds 60
+
+wMysteryGiftPlayerData::
+	ds 1
+wMysteryGiftPlayerID:: dw
+wMysteryGiftPlayerName:: ds NAME_LENGTH
+wMysteryGiftPlayerDexCaught:: db
+wMysteryGiftPlayerSentDeco:: db
+wMysteryGiftPlayerWhichItem:: db
+wMysteryGiftPlayerWhichDeco:: db
+wMysteryGiftPlayerBackupItem:: db
+	ds 1
+wMysteryGiftPlayerDataEnd::
+
+
+SECTION UNION "Overworld Map", WRAM0
+
+	ds $200
+
+; mystery gift data
+wUnusedMysteryGiftStagedDataLength:: db
+wMysteryGiftMessageCount:: db
+wMysteryGiftStagedDataLength:: db
+
+
+SECTION UNION "Overworld Map", WRAM0
+
+	ds $200
+
+; blank credits tile buffer
+wCreditsBlankFrame2bpp:: ds 4 * 4 tiles
+wCreditsBlankFrame2bppEnd::
+
+
+SECTION UNION "Overworld Map", WRAM0
+
+; mobile
+wc800:: db
+wc801:: db
+wc802:: db
+wc803:: db
+wc804:: db
+wc805:: db
+wc806:: db
+wc807:: db
+wc808:: dw
+wc80a:: db
+wc80b:: db
+wc80c:: dw
+wc80e:: db
+wc80f:: db
+wc810:: db
+wc811:: db
+wMobileSDK_PacketChecksum:: dw
+wc814:: db
+wc815:: db
+wc816:: dw
+wMobileSDK_AdapterType:: db
+wc819:: db
+wc81a:: db
+wc81b:: db
+wc81c:: db
+wc81d:: db
+wMobileSDK_SendCommandID:: db
+wc81f:: db
+wc820:: db
+wc821:: db
+wc822:: db
+wc823:: ds 4
+wc827:: dw
+wc829:: db
+wc82a:: db
+wc82b:: db
+wc82c:: db
+wc82d:: db
+wc82e:: db
+wc82f:: ds 3
+wc832:: db
+wc833:: db
+wc834:: db
+wc835:: db
+wc836:: ds 8
+wc83e:: ds 20
+wc852:: ds 20
+wc866:: ds 4
+wc86a:: db
+wc86b:: db
+wc86c:: db
+wc86d:: db
+wc86e:: db
+wc86f:: db
+wc870:: db
+wc871:: db
+wc872:: db
+wc873:: db
+wc874:: db
+wc875:: db
+wc876:: db
+wc877:: db
+wc878:: dw
+wc87a:: db
+wc87b:: db
+wc87c:: db
+wc87d:: db
+wc87e:: db
+wc87f:: db
+wc880:: db
+wc881:: db
+wc882:: db
+wc883:: db
+wc884:: ds 8
+wc88c:: ds 32
+wc8ac:: ds 26
+wc8c6:: db
+wc8c7:: db
+wc8c8:: db
+wc8c9:: db
+wc8ca:: ds 44
+wc8f6:: ds 8
+wc8fe:: db
+wc8ff:: ds 15
+wc90e:: ds 8
+wc916:: ds 16
+wc926:: ds 8
+wc92e:: ds 75
+wc979:: db
+wc97a:: ds 5
+wc97f:: db
+wc980:: db
+wc981:: db
+wc982:: db
+wc983:: dw
+wc985:: db
+wc986:: db
+wc987:: db
+wMobileAPIIndex:: db
+wc989:: db
+wc98a:: db
+wc98b:: db
+wc98c:: db
+wc98d:: db
+wc98e:: db
+wc98f:: db
+wc990:: db
+wc991:: db
+wc992:: db
+wc993:: db
+wc994:: db
+wc995:: ds 16
+wc9a5:: ds 5
+wc9aa:: db
+wc9ab:: db
+wc9ac:: db
+wc9ad:: db
+wc9ae:: db
+wc9af:: dw
+wc9b1:: db
+wc9b2:: ds 3
+wc9b5:: db
+wc9b6:: ds 121
+
+wMobileSDK_ReceivePacketBufferAlt:: ds 11
+wMobileSDK_ReceivedBytes:: dw
+wMobileSDK_ReceivePacketBuffer:: ds 250
+wcb36:: db
+	ds 16
+wMobileSDK_PacketBuffer:: ds 281
+wcc60:: ds 1
+wcc61:: ds 1
+wcc62:: ds 2
+wcc64:: ds 1
+wcc65:: ds 57
+	ds 22
+wccb4:: ds 1
+wccb5:: ds 3
+wccb8:: ds 1
+wccb9:: ds 1
+wccba:: ds 90
+
+
+if DEF(_DEBUG)
+SECTION UNION "Overworld Map", WRAM0
+
+; debug room RTC values
+wDebugRoomRTCSec::  db
+wDebugRoomRTCMin::  db
+wDebugRoomRTCHour:: db
+wDebugRoomRTCDay::  dw
+wDebugRoomRTCCurSec::  db
+wDebugRoomRTCCurMin::  db
+wDebugRoomRTCCurHour:: db
+wDebugRoomRTCCurDay::  dw
+
+; debug room paged values
+wDebugRoomCurPage::        db
+wDebugRoomCurValue::       db
+wDebugRoomAFunction::      dw
+wDebugRoomStartFunction::  dw
+wDebugRoomSelectFunction:: dw
+wDebugRoomAutoFunction::   dw
+wDebugRoomPageCount::      db
+wDebugRoomPagesPointer::   dw
+
+wDebugRoomROMChecksum:: dw
+wDebugRoomCurChecksumBank:: db
+
+UNION
+; debug room new item values
+wDebugRoomItemID::       db
+wDebugRoomItemQuantity:: db
+NEXTU
+; debug room new pokemon values
+wDebugRoomMon::    box_struct wDebugRoomMon
+wDebugRoomMonBox:: db
+NEXTU
+; debug room GB ID values
+wDebugRoomGBID:: dw
+ENDU
+
+endc
+
+
+SECTION "Video", WRAM0
+
+UNION
+; bg map
+wBGMapBuffer::    ds 40
+wBGMapPalBuffer:: ds 40
+wBGMapBufferPointers:: ds 20 * 2
+wBGMapBufferEnd::
+
+NEXTU
+; credits
+wCreditsPos:: dw
+wCreditsTimer:: db
+
+NEXTU
+; mobile data
+wMobileMonSpeciesPointer:: dw
+wMobileMonStructPointer:: dw
+wMobileMonOTPointer:: dw
+wMobileMonNicknamePointer:: dw
+wMobileMonMailPointer:: dw
+
+NEXTU
+; more mobile data
+wcd20:: ds 1
+wcd21:: ds 1
+wcd22:: ds 1
+wcd23:: ds 1
+wcd24:: ds 1
+wMobileCommsJumptableIndex:: ds 1
+wcd26:: ds 1
+wcd27:: ds 1
+wcd28:: ds 1
+wcd29:: ds 1
+
+wMobileMonSpecies::
+wcd2a:: db
+
+UNION
+wTempOddEggNickname:: ds MON_NAME_LENGTH
+NEXTU
+wcd2b:: ds 1
+wcd2c:: ds 1
+wcd2d:: ds 1
+wcd2e:: ds 1
+wcd2f:: ds 1
+wcd30:: ds 1
+wcd31:: ds 1
+wcd32:: ds 1
+wcd33:: ds 1
+wcd34:: ds 1
+wcd35:: ds 1
+ENDU
+
+; current time for link/mobile?
+wcd36:: db ; hours
+wcd37:: db ; mins
+wcd38:: db ; secs
+
+wcd39:: ds 1
+wcd3a:: ds 1
+wcd3b:: ds 1
+wBattleTowerRoomMenu2JumptableIndex:: ds 1
+wcd3d:: ds 1
+wcd3e:: ds 1
+wcd3f:: ds 1
+wcd40:: ds 1
+wcd41:: ds 1
+wcd42:: ds 1
+wcd43:: ds 1
+
+; some sort of timer in link battles
+wMobileInactivityTimerMinutes:: db ; mins
+wMobileInactivityTimerSeconds:: db ; secs
+wMobileInactivityTimerFrames:: db ; frames
+wcd47:: ds 1
+
+	ds 1
+
+wBTTempOTSprite::
+wcd49:: db
+
+wcd4a:: ds 1
+wcd4b:: ds 1
+
+wEZChatCursorXCoord::
+wcd4c:: db
+wEZChatCursorYCoord::
+wcd4d:: db
+
+wcd4e:: ds 1
+wcd4f:: ds 1
+wcd50:: ds 1
+wcd51:: ds 1
+wcd52:: ds 1
+
+wMobileOpponentBattleMessage:: ; ds 12
+wcd53:: ds 1
+wcd54:: ds 1
+wcd55:: ds 1
+wcd56:: ds 1
+wcd57:: ds 1
+wcd58:: ds 1
+wcd59:: ds 1
+wcd5a:: ds 1
+wcd5b:: ds 1
+wcd5c:: ds 1
+wcd5d:: ds 1
+wcd5e:: ds 1
+wcd5f:: ds 1
+wcd60:: ds 2
+wcd62:: ds 1
+wcd63:: ds 1
+wcd64:: ds 1
+wcd65:: ds 1
+wcd66:: ds 1
+wcd67:: ds 1
+wcd68:: ds 1
+wcd69:: ds 1
+wcd6a:: ds 1
+wcd6b:: ds 1
+wcd6c:: ds 1
+wcd6d:: ds 1
+wcd6e:: ds 1
+wcd6f:: ds 1
+wcd70:: ds 1
+wcd71:: ds 1
+wcd72:: ds 1
+wcd73:: ds 1
+wcd74:: ds 1
+
+wOTMonSelection:: ds 2 ; ds BATTLETOWER_PARTY_LENGTH
+wcd77:: ds 1
+
+wMobileCrashCheckPointer:: dw
+wcd7a:: ds 2
+wcd7c:: ds 3
+wcd7f:: ds 1
+wcd80:: ds 1
+wcd81:: ds 1
+wcd82:: ds 1
+wcd83:: ds 1
+wcd84:: ds 1
+wcd85:: ds 4
+wcd89:: ds 1
+wcd8a:: ds 1
+wcd8b:: ds 1
+wcd8c:: ds 1
+wcd8d:: ds 11
+ENDU
+
+wDefaultSGBLayout:: db
+
+wPlayerHPPal:: db
+wEnemyHPPal:: db
+
+wHPPals:: ds PARTY_LENGTH
+wCurHPPal:: db
+
+	ds 7
+
+wSGBPals:: ds 48
+
+wAttrmap::
+; 20x18 grid of bg tile attributes for 8x8 tiles
+; read horizontally from the top row
+;		bit 7: priority
+;		bit 6: y flip
+;		bit 5: x flip
+;		bit 4: pal # (non-cgb)
+;		bit 3: vram bank (cgb only)
+;		bit 2-0: pal # (cgb only)
+	ds SCREEN_WIDTH * SCREEN_HEIGHT
+wAttrmapEnd::
+
+UNION
+; addresses dealing with serial comms
+	ds 1
+wcf42:: db
+	ds 1
+wcf44:: db
+wcf45:: db
+
+NEXTU
+wTileAnimBuffer:: ds 1 tiles
+ENDU
+
+; link data
+UNION
+wOtherPlayerLinkMode:: db
+wOtherPlayerLinkAction:: db
+	ds 3
+wPlayerLinkAction:: db
+wUnusedLinkAction:: db
+	ds 3
+NEXTU
+wLinkReceivedSyncBuffer:: ds 5
+wLinkPlayerSyncBuffer:: ds 5
+ENDU
+wLinkTimeoutFrames:: dw
+wLinkByteTimeout:: dw
+
+wMonType:: db
+
+wCurSpecies:: db
+
+wNamedObjectType:: db
+
+	ds 1
+
+wJumptableIndex::
+wBattleTowerBattleEnded::
+	db
+
+UNION
+; intro data
+wIntroSceneFrameCounter:: db
+wIntroSceneTimer:: db
+
+NEXTU
+; title data
+wTitleScreenSelectedOption:: db
+wTitleScreenTimer:: dw
+
+NEXTU
+; credits data
+wCreditsBorderFrame:: db
+wCreditsBorderMon:: db
+wCreditsLYOverride:: db
+
+NEXTU
+; pokedex
+wPrevDexEntryJumptableIndex:: db
+if DEF(_CRYSTAL11)
+wPrevDexEntryBackup:: db
+else
+wPrevDexEntryBackup::
+wPokedexStatus:: db
+endc
+wUnusedPokedexByte:: db
+
+NEXTU
+; pokegear
+wPokegearCard:: db
+wPokegearMapRegion:: db
+wUnusedPokegearByte:: db
+
+NEXTU
+; pack
+wPackJumptableIndex:: db
+wCurPocket:: db
+wPackUsedItem:: db
+
+NEXTU
+; trainer card badges
+wTrainerCardBadgeFrameCounter:: db
+wTrainerCardBadgeTileID:: db
+wTrainerCardBadgeAttributes:: db
+
+NEXTU
+; slot machine
+wSlotsDelay:: db
+	ds 1
+wUnusedSlotReelIconDelay:: db
+
+NEXTU
+; card flip
+wCardFlipCursorY:: db
+wCardFlipCursorX:: db
+wCardFlipWhichCard:: db
+
+NEXTU
+; unused memory game
+wMemoryGameCardChoice:: db
+
+NEXTU
+; magnet train
+wMagnetTrainOffset:: db
+wMagnetTrainPosition:: db
+wMagnetTrainWaitCounter:: db
+
+NEXTU
+; unown puzzle data
+wHoldingUnownPuzzlePiece:: db
+wUnownPuzzleCursorPosition:: db
+wUnownPuzzleHeldPiece:: db
+
+NEXTU
+; battle transitions
+wBattleTransitionCounter:: db
+wBattleTransitionSineWaveOffset::
+wBattleTransitionSpinQuadrant:: db
+
+NEXTU
+; bill's pc
+wUnusedBillsPCData:: ds 3
+
+NEXTU
+; debug mon color picker
+wDebugColorRGBJumptableIndex:: db
+wDebugColorCurColor:: db
+wDebugColorCurMon:: db
+
+NEXTU
+; debug tileset color picker
+wDebugTilesetCurPalette:: db
+wDebugTilesetRGBJumptableIndex:: db
+wDebugTilesetCurColor:: db
+
+NEXTU
+; stats screen
+wStatsScreenFlags:: db
+
+NEXTU
+; battle tower
+wNrOfBeatenBattleTowerTrainers:: db
+	ds 1
+wBattleTowerRoomMenuJumptableIndex:: db
+
+NEXTU
+; miscellaneous
+wFrameCounter::
+wMomBankDigitCursorPosition::
+wNamingScreenLetterCase::
+wHallOfFameMonCounter::
+wTradeDialog::
+	db
+wFrameCounter2::
+wPrinterQueueLength::
+wUnusedSGB1eColorOffset::
+	db
+wUnusedTradeAnimPlayEvolutionMusic:: db
+
+NEXTU
+; mobile
+wcf64:: db
+wcf65:: db
+wcf66:: db
+ENDU
+
+wRequested2bppSize:: db
+wRequested2bppSource:: dw
+wRequested2bppDest:: dw
+
+wRequested1bppSize:: db
+wRequested1bppSource:: dw
+wRequested1bppDest:: dw
+
+wMenuMetadata::
+wWindowStackPointer:: dw
+wMenuJoypad:: db
+wMenuSelection:: db
+wMenuSelectionQuantity:: db
+wWhichIndexSet:: db
+wScrollingMenuCursorPosition:: db
+wWindowStackSize:: db
+	ds 8
+wMenuMetadataEnd::
+
+; menu header
+wMenuHeader::
+wMenuFlags:: db
+wMenuBorderTopCoord:: db
+wMenuBorderLeftCoord:: db
+wMenuBorderBottomCoord:: db
+wMenuBorderRightCoord:: db
+wMenuDataPointer:: dw
+wMenuCursorPosition:: db
+	ds 1
+wMenuDataBank:: db
+	ds 6
+wMenuHeaderEnd::
+
+wMenuData::
+wMenuDataFlags:: db
+
+UNION
+; Vertical Menu/DoNthMenu/SetUpMenu
+wMenuDataItems:: db
+wMenuDataIndicesPointer:: dw
+wMenuDataDisplayFunctionPointer:: dw
+wMenuDataPointerTableAddr:: dw
+
+NEXTU
+; 2D Menu
+wMenuData_2DMenuDimensions:: db
+wMenuData_2DMenuSpacing:: db
+wMenuData_2DMenuItemStringsBank:: db
+wMenuData_2DMenuItemStringsAddr:: dw
+wMenuData_2DMenuFunctionBank:: db
+wMenuData_2DMenuFunctionAddr:: dw
+
+NEXTU
+; Scrolling Menu
+wMenuData_ScrollingMenuHeight:: db
+wMenuData_ScrollingMenuWidth:: db
+wMenuData_ScrollingMenuItemFormat:: db
+wMenuData_ItemsPointerBank:: db
+wMenuData_ItemsPointerAddr:: dw
+wMenuData_ScrollingMenuFunction1:: ds 3
+wMenuData_ScrollingMenuFunction2:: ds 3
+wMenuData_ScrollingMenuFunction3:: ds 3
+ENDU
+wMenuDataEnd::
+
+wMoreMenuData::
+w2DMenuData::
+w2DMenuCursorInitY:: db
+w2DMenuCursorInitX:: db
+w2DMenuNumRows:: db
+w2DMenuNumCols:: db
+w2DMenuFlags1::
+; bit 7: Disable checking of wMenuJoypadFilter
+; bit 6: Enable sprite animations
+; bit 5: Wrap around vertically
+; bit 4: Wrap around horizontally
+; bit 3: Set bit 7 in w2DMenuFlags2 and exit the loop if bit 5 is disabled and we tried to go too far down
+; bit 2: Set bit 7 in w2DMenuFlags2 and exit the loop if bit 5 is disabled and we tried to go too far up
+; bit 1: Set bit 7 in w2DMenuFlags2 and exit the loop if bit 4 is disabled and we tried to go too far left
+; bit 0: Set bit 7 in w2DMenuFlags2 and exit the loop if bit 4 is disabled and we tried to go too far right
+	db
+w2DMenuFlags2:: db
+w2DMenuCursorOffsets:: db
+wMenuJoypadFilter:: db
+w2DMenuDataEnd::
+
+wMenuCursorY:: db
+wMenuCursorX:: db
+wCursorOffCharacter:: db
+wCursorCurrentTile:: dw
+	ds 3
+wMoreMenuDataEnd::
+
+wOverworldDelay:: db
+wTextDelayFrames:: db
+wVBlankOccurred:: db
+
+wPredefID:: db
+wPredefHL:: dw
+wPredefAddress:: dw
+wFarCallBC:: dw
+
+wUnusedLinkCommunicationByte:: db
+
+wGameTimerPaused::
+; bit 0: game timer paused
+; bit 7: something mobile
+	db
+
+	ds 1
+
+wJoypadDisable::
+; bits 4, 6, or 7 can be used to disable joypad input
+; bit 4
+; bit 6: ongoing mon faint animation
+; bit 7: ongoing sgb data transfer
+	db
+
+	ds 1
+
+wInBattleTowerBattle::
+; 0 not in BattleTower-Battle
+; 1 BattleTower-Battle
+	db
+
+	ds 1
+
+wFXAnimID:: dw
+
+wPlaceBallsX:: db
+wPlaceBallsY:: db
+
+wTileAnimationTimer:: db
+
+; palette backups?
+wBGP:: db
+wOBP0:: db
+wOBP1:: db
+
+wNumHits:: db
+
+	ds 1
+
+wOptions::
+; bit 0-2: number of frames to delay when printing text
+;   fast 1; mid 3; slow 5
+; bit 3: ?
+; bit 4: no text delay
+; bit 5: stereo off/on
+; bit 6: battle style shift/set
+; bit 7: battle scene off/on
+	db
+wSaveFileExists:: db
+wTextboxFrame::
+; bits 0-2: textbox frame 0-7
+	db
+wTextboxFlags::
+; bit 0: 1-frame text delay
+; bit 4: no text delay
+	db
+wGBPrinterBrightness::
+; bit 0-6: brightness
+;   lightest: $00
+;   lighter:  $20
+;   normal:   $40 (default)
+;   darker:   $60
+;   darkest:  $7F
+	db
+wOptions2::
+; bit 1: menu account off/on
+	db
+	ds 2
+wOptionsEnd::
+
+; Time buffer, for counting the amount of time since
+; an event began.
+wSecondsSince:: db
+wMinutesSince:: db
+wHoursSince:: db
+wDaysSince:: db
+
+
+SECTION "WRAM 1", WRAMX
+
+wGBCOnlyDecompressBuffer:: ; a $540-byte buffer that continues past this SECTION
+
+wBetaTitleSequenceOpeningType::
+; This selected the title screen animation (fire/notes) in pokegold-spaceworld.
+	db
+
+wDefaultSpawnpoint:: db
+
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; mon buffer
+wBufferMonNickname:: ds MON_NAME_LENGTH
+wBufferMonOT:: ds NAME_LENGTH
+wBufferMon:: party_struct wBufferMon
+	ds 8
+wMonOrItemNameBuffer:: ds NAME_LENGTH
+	ds NAME_LENGTH
+
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; poke seer
+wSeerAction:: db
+wSeerNickname:: ds MON_NAME_LENGTH
+wSeerCaughtLocation:: ds 17
+wSeerTimeOfDay:: ds NAME_LENGTH
+wSeerOT:: ds NAME_LENGTH
+wSeerOTGrammar:: db
+wSeerCaughtLevelString:: ds 4
+wSeerCaughtLevel:: db
+wSeerCaughtData:: db
+wSeerCaughtGender:: db
+
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; mail temp storage
+wTempMail:: mailmsg wTempMail
+
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; bug-catching contest
+wBugContestResults::
+	bugcontestwinner wBugContestFirstPlace
+	bugcontestwinner wBugContestSecondPlace
+	bugcontestwinner wBugContestThirdPlace
+wBugContestWinnersEnd::
+	bugcontestwinner wBugContestTemp
+	ds 4
+wBugContestWinnerName:: ds NAME_LENGTH
+
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; mart items
+wMartItem1BCD:: ds 3
+wMartItem2BCD:: ds 3
+wMartItem3BCD:: ds 3
+wMartItem4BCD:: ds 3
+wMartItem5BCD:: ds 3
+wMartItem6BCD:: ds 3
+wMartItem7BCD:: ds 3
+wMartItem8BCD:: ds 3
+wMartItem9BCD:: ds 3
+wMartItem10BCD:: ds 3
+
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; town map data
+wTownMapPlayerIconLandmark:: db
+UNION
+wTownMapCursorLandmark:: db
+wTownMapCursorObjectPointer:: dw
+NEXTU
+wTownMapCursorCoordinates:: dw
+wStartFlypoint:: db
+wEndFlypoint:: db
+ENDU
+
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; phone call data
+wPhoneScriptBank:: db
+wPhoneCaller:: dw
+
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; radio data
+wCurRadioLine:: db
+wNextRadioLine:: db
+wRadioTextDelay:: db
+wNumRadioLinesPrinted:: db
+wOaksPKMNTalkSegmentCounter:: db
+	ds 5
+wRadioText:: ds 2 * SCREEN_WIDTH
+
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; lucky number show
+wLuckyNumberDigitsBuffer:: ds 5
+
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; movement buffer data
+wMovementBufferCount:: db
+wMovementBufferObject:: db
+wUnusedMovementBufferBank:: db
+wUnusedMovementBufferPointer:: dw
+wMovementBuffer:: ds 55
+
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; box printing
+wWhichBoxMonToPrint:: db
+wFinishedPrintingBox:: db
+wAddrOfBoxToPrint:: dw
+wBankOfBoxToPrint:: db
+wWhichBoxToPrint:: db
+
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; Unown printing
+wPrintedUnownTileSource:: ds 1 tiles
+wPrintedUnownTileDest:: ds 1 tiles
+
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; trainer HUD data
+	ds 1
+wPlaceBallsDirection:: db
+wTrainerHUDTiles:: ds 4
+
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; mobile participant nicknames
+	ds 4
+wMobileParticipant1Nickname:: ds NAME_LENGTH_JAPANESE
+wMobileParticipant2Nickname:: ds NAME_LENGTH_JAPANESE
+wMobileParticipant3Nickname:: ds NAME_LENGTH_JAPANESE
+
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; battle exp gain
+wExperienceGained:: ds 3
+
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; earthquake data buffer
+wEarthquakeMovementDataBuffer:: ds 5
+
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; switching items in pack
+wSwitchItemBuffer:: ds 2 ; may store 1 or 2 bytes
+
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; switching pokemon in party
+; may store NAME_LENGTH, PARTYMON_STRUCT_LENGTH, or MAIL_STRUCT_LENGTH bytes
+wSwitchMonBuffer:: ds 48
+
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; giving pokemon mail
+wMonMailMessageBuffer:: ds MAIL_MSG_LENGTH + 1
+
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; bill's pc
+UNION
+wBoxNameBuffer:: ds BOX_NAME_LENGTH
+NEXTU
+	ds 1
+wBillsPCTempListIndex:: db
+wBillsPCTempBoxCount:: db
+ENDU
+
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; prof. oak's pc
+wTempPokedexSeenCount:: db
+wTempPokedexCaughtCount:: db
+
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; player's room pc
+UNION
+wDecoNameBuffer:: ds ITEM_NAME_LENGTH
+NEXTU
+wNumOwnedDecoCategories:: db
+wOwnedDecoCategories:: ds 16
+ENDU
+
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; trade
+wCurTradePartyMon:: db
+wCurOTTradePartyMon:: db
+wBufferTrademonNickname:: ds MON_NAME_LENGTH
+
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; link battle record data
+wLinkBattleRecordBuffer::
+wLinkBattleRecordName::   ds NAME_LENGTH
+wLinkBattleRecordWins::   dw
+wLinkBattleRecordLosses:: dw
+wLinkBattleRecordDraws::  dw
+
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; miscellaneous
+wTempDayOfWeek::
+wPrevPartyLevel::
+wCurBeatUpPartyMon::
+wUnownPuzzleCornerTile::
+wKeepSevenBiasChance::
+wPokeFluteCuredSleep::
+wTempRestorePPItem::
+wApricorns::
+wSuicuneFrame::
+	db
+
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; debug color picker
+wDebugColorIsTrainer:: db
+wDebugColorIsShiny:: db
+wDebugColorCurTMHM:: db
+
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; mobile?
+wd002:: ds 1
+wd003:: ds 1
+wd004:: ds 1
+	ds 3
+wd008:: ds 2
+	ds 6
+wd010:: ds 1
+wd011:: ds 1
+wd012:: ds 1
+wd013:: ds 1
+wd014:: ds 2
+	ds 1
+wd017:: ds 1
+wd018:: ds 1
+wd019:: ds 1
+	ds 19
+wd02d:: ds 1
+wd02e:: ds 1
+wd02f:: ds 1
+wd030:: ds 1
+wd031:: ds 1
+wd032:: ds 1
+wd033:: ds 1
+wd034:: ds 2
+wd036:: ds 2
+
+
+SECTION UNION "Miscellaneous WRAM 1", WRAMX
+
+; Every previous SECTION UNION takes up 60 or fewer bytes,
+; except the initial "mon buffer" one.
+	ds 60
+
+UNION
+; trainer data
+wSeenTrainerBank:: db
+wSeenTrainerDistance:: db
+wSeenTrainerDirection:: db
+wTempTrainer::
+wTempTrainerEventFlag:: dw
+wTempTrainerClass:: db
+wTempTrainerID:: db
+wSeenTextPointer:: dw
+wWinTextPointer:: dw
+wLossTextPointer:: dw
+wScriptAfterPointer:: dw
+wRunningTrainerBattleScript:: db
+wTempTrainerEnd::
+
+NEXTU
+; menu items list
+wMenuItemsList:: ds 16
+wMenuItemsListEnd::
+
+NEXTU
+; fruit tree data
+wCurFruitTree:: db
+wCurFruit:: db
+
+NEXTU
+; item ball data
+wItemBallData::
+wItemBallItemID:: db
+wItemBallQuantity:: db
+wItemBallDataEnd::
+
+NEXTU
+; hidden item data
+wHiddenItemData::
+wHiddenItemEvent:: dw
+wHiddenItemID:: db
+wHiddenItemDataEnd::
+
+NEXTU
+; elevator data
+wElevatorData::
+wElevatorPointerBank:: db
+wElevatorPointer:: dw
+wElevatorOriginFloor:: db
+wElevatorDataEnd::
+
+NEXTU
+; coord event data
+wCurCoordEvent::
+wCurCoordEventSceneID:: db
+wCurCoordEventMapY:: db
+wCurCoordEventMapX:: db
+	ds 1
+wCurCoordEventScriptAddr:: dw
+
+NEXTU
+; BG event data
+wCurBGEvent::
+wCurBGEventYCoord:: db
+wCurBGEventXCoord:: db
+wCurBGEventType:: db
+wCurBGEventScriptAddr:: dw
+
+NEXTU
+; mart data
+wMartType:: db
+wMartPointerBank:: db
+wMartPointer:: dw
+wMartJumptableIndex:: db
+wBargainShopFlags:: db
+
+NEXTU
+; player movement data
+wCurInput::
+wFacingTileID:: db
+wWalkingIntoNPC:: db
+wWalkingIntoLand:: db
+wWalkingIntoEdgeWarp:: db
+wMovementAnimation:: db
+wWalkingDirection:: db
+wFacingDirection:: db
+wWalkingX:: db
+wWalkingY:: db
+wWalkingTile:: db
+	ds 6
+wPlayerTurningDirection:: db
+
+NEXTU
+; std script buffer
+	ds 1
+wJumpStdScriptBuffer:: ds 3
+
+NEXTU
+; phone script data
+wCheckedTime:: db
+wPhoneListIndex:: db
+wNumAvailableCallers:: db
+wAvailableCallers:: ds CONTACT_LIST_SIZE
+
+NEXTU
+; phone caller contact
+	ds 1
+wCallerContact:: ds PHONE_CONTACT_SIZE
+
+NEXTU
+; backup menu data
+	ds 7
+wMenuCursorPositionBackup:: db
+wMenuScrollPositionBackup:: db
+
+NEXTU
+; poison step data
+wPoisonStepData::
+wPoisonStepFlagSum:: db
+wPoisonStepPartyFlags:: ds PARTY_LENGTH
+wPoisonStepDataEnd::
+ENDU
+
+	ds 23
+
+
+SECTION "More WRAM 1", WRAMX
+
+wTMHMMoveNameBackup:: ds MOVE_NAME_LENGTH
+
+wStringBuffer1:: ds STRING_BUFFER_LENGTH
+wStringBuffer2:: ds STRING_BUFFER_LENGTH
+wStringBuffer3:: ds STRING_BUFFER_LENGTH
+wStringBuffer4:: ds STRING_BUFFER_LENGTH
+wStringBuffer5:: ds STRING_BUFFER_LENGTH
+
+wBattleMenuCursorPosition:: db
+
+	ds 1
+
+wCurBattleMon::
+; index of the player's mon currently in battle (0-5)
+	db
+
+wCurMoveNum:: db
+
+wLastPocket:: db
+
+wPCItemsCursor::        db
+wPartyMenuCursor::      db
+wItemsPocketCursor::    db
+wKeyItemsPocketCursor:: db
+wBallsPocketCursor::    db
+wTMHMPocketCursor::     db
+
+wPCItemsScrollPosition::        db
+	ds 1
+wItemsPocketScrollPosition::    db
+wKeyItemsPocketScrollPosition:: db
+wBallsPocketScrollPosition::    db
+wTMHMPocketScrollPosition::     db
+
+wSwitchMon::
+wSwitchItem::
+wSwappingMove::
+wd0e3:: ; mobile
+	db
+
+wMenuScrollPosition:: ds 4
+
+wQueuedScriptBank:: db
+wQueuedScriptAddr:: dw
+
+wNumMoves:: db
+
+wFieldMoveSucceeded::
+wItemEffectSucceeded::
+wBattlePlayerAction::
+; 0 - use move
+; 1 - use item
+; 2 - switch
+wSolvedUnownPuzzle::
+	db
+
+wVramState::
+; bit 0: overworld sprite updating on/off
+; bit 1: something to do with sprite updates
+; bit 6: something to do with text
+; bit 7: on when surf initiates
+;        flickers when climbing waterfall
+	db
+
+wBattleResult::
+; WIN, LOSE, or DRAW
+; bit 6: caught celebi
+; bit 7: box full
+	db
+wUsingItemWithSelect:: db
+
+UNION
+; mart data
+wCurMartCount:: db
+wCurMartItems:: ds 15
+
+NEXTU
+; elevator data
+wCurElevatorCount:: db
+wCurElevatorFloors:: ds 15
+
+NEXTU
+; mailbox data
+wCurMessageScrollPosition:: db
+wCurMessageIndex:: db
+wMailboxCount:: db
+wMailboxItems:: ds MAILBOX_CAPACITY
+ENDU
+
+wListPointer:: dw
+wUnusedNamesPointer:: dw
+
+wItemAttributesPointer:: dw
+
+wCurItem:: db
+wCurItemQuantity::
+wMartItemID::
+	db
+
+wCurPartySpecies:: db
+
+wCurPartyMon::
+; index of mon's party location (0-5)
+	db
+
+wWhichHPBar::
+; 0: Enemy
+; 1: Player
+; 2: Party Menu
+	db
+
+wPokemonWithdrawDepositParameter::
+; 0: Take from PC
+; 1: Put into PC
+; 2: Take from Day-Care
+; 3: Put into Day-Care
+	db
+
+wItemQuantityChange:: db
+wItemQuantity:: db
+
+wTempMon:: party_struct wTempMon
+
+wSpriteFlags:: db
+
+wHandlePlayerStep:: db
+
+	ds 1
+
+wPartyMenuActionText:: db
+
+wItemAttributeValue:: db
+
+wCurPartyLevel:: db
+
+wScrollingMenuListSize:: db
+
+	ds 1
+
+; used when following a map warp
+wNextWarp:: db
+wNextMapGroup:: db
+wNextMapNumber:: db
+wPrevWarp:: db
+wPrevMapGroup:: db
+wPrevMapNumber:: db
+
+wPlayerBGMapOffsetX:: db ; used in FollowNotExact; unit is pixels
+wPlayerBGMapOffsetY:: db ; used in FollowNotExact; unit is pixels
+
+; Player movement
+wPlayerStepVectorX:: db
+wPlayerStepVectorY:: db
+wPlayerStepFlags:: db
+wPlayerStepDirection:: db
+
+wBGMapAnchor:: dw
+
+UNION
+wUsedSprites:: ds SPRITE_GFX_LIST_CAPACITY * 2
+wUsedSpritesEnd::
+
+NEXTU
+	ds 31
+wd173:: db ; related to command queue type 3
+ENDU
+
+wOverworldMapAnchor:: dw
+wMetatileStandingY:: db
+wMetatileStandingX:: db
+
+wMapPartial::
+wMapAttributesBank:: db
+wMapTileset:: db
+wEnvironment:: db
+wMapAttributesPointer:: dw
+wMapPartialEnd::
+
+wMapAttributes::
+wMapBorderBlock:: db
+; width/height are in blocks (2x2 walkable tiles, 4x4 graphics tiles)
+wMapHeight:: db
+wMapWidth:: db
+wMapBlocksBank:: db
+wMapBlocksPointer:: dw
+wMapScriptsBank:: db
+wMapScriptsPointer:: dw
+wMapEventsPointer:: dw
+; bit set
+wMapConnections:: db
+wMapAttributesEnd::
+
+wNorthMapConnection:: map_connection_struct wNorth
+wSouthMapConnection:: map_connection_struct wSouth
+wWestMapConnection::  map_connection_struct wWest
+wEastMapConnection::  map_connection_struct wEast
+
+wTileset::
+wTilesetBank:: db
+wTilesetAddress:: dw
+wTilesetBlocksBank:: db
+wTilesetBlocksAddress:: dw
+wTilesetCollisionBank:: db
+wTilesetCollisionAddress:: dw
+wTilesetAnim:: dw ; bank 3f
+	ds 2 ; unused
+wTilesetPalettes:: dw ; bank 3f
+wTilesetEnd::
+	assert wTilesetEnd - wTileset == TILESET_LENGTH
+
+wEvolvableFlags:: flag_array PARTY_LENGTH
+
+wForceEvolution:: db
+
+UNION
+; general-purpose HP buffers
+wHPBuffer1:: dw
+wHPBuffer2:: dw
+wHPBuffer3:: dw
+
+NEXTU
+; HP bar animations
+wCurHPAnimMaxHP::   dw
+wCurHPAnimOldHP::   dw
+wCurHPAnimNewHP::   dw
+wCurHPAnimPal::     db
+wCurHPBarPixels::   db
+wNewHPBarPixels::   db
+wCurHPAnimDeltaHP:: dw
+wCurHPAnimLowHP::   db
+wCurHPAnimHighHP::  db
+
+NEXTU
+; move AI
+wEnemyAIMoveScores:: ds NUM_MOVES
+
+NEXTU
+; switch AI
+wEnemyEffectivenessVsPlayerMons:: flag_array PARTY_LENGTH
+wPlayerEffectivenessVsEnemyMons:: flag_array PARTY_LENGTH
+
+NEXTU
+; battle HUD
+wBattleHUDTiles:: ds PARTY_LENGTH
+
+NEXTU
+; thrown ball data
+wFinalCatchRate:: db
+wThrownBallWobbleCount:: db
+
+NEXTU
+; evolution data
+wEvolutionOldSpecies:: db
+wEvolutionNewSpecies:: db
+wEvolutionPicOffset::  db
+wEvolutionCanceled::   db
+
+NEXTU
+; experience
+wExpToNextLevel:: ds 3
+
+NEXTU
+; PP Up
+wPPUpPPBuffer:: ds NUM_MOVES
+
+NEXTU
+; lucky number show
+wMonIDDigitsBuffer:: ds 5
+
+NEXTU
+; mon submenu
+wMonSubmenuCount:: db
+wMonSubmenuItems:: ds NUM_MONMENU_ITEMS + 1
+
+NEXTU
+; field move data
+wFieldMoveData::
+wFieldMoveJumptableIndex:: db
+wEscapeRopeOrDigType::
+wSurfingPlayerState::
+wFishingRodUsed:: db
+wCutWhirlpoolOverworldBlockAddr:: dw
+wCutWhirlpoolReplacementBlock:: db
+wCutWhirlpoolAnimationType::
+wStrengthSpecies::
+wFishingResult:: db
+	ds 1
+wFieldMoveDataEnd::
+
+NEXTU
+; hidden items
+wCurMapScriptBank:: db
+wRemainingBGEventCount:: db
+wBottomRightYCoord:: db
+wBottomRightXCoord:: db
+
+NEXTU
+; heal machine anim
+wHealMachineAnimType::  db
+wHealMachineTempOBP1::  db
+wHealMachineAnimState:: db
+
+NEXTU
+; decorations
+wCurDecoration::          db
+wSelectedDecorationSide:: db
+wSelectedDecoration::     db
+wOtherDecoration::        db
+wChangedDecorations::     db
+wCurDecorationCategory::  db
+
+NEXTU
+; withdraw/deposit items
+wPCItemQuantityChange:: db
+wPCItemQuantity:: db
+
+NEXTU
+; mail
+wCurMailAuthorID:: dw
+wCurMailIndex:: db
+
+NEXTU
+; kurt
+wKurtApricornCount:: db
+wKurtApricornItems:: ds 10
+
+NEXTU
+; tree mons
+wTreeMonCoordScore:: db
+wTreeMonOTIDScore::  db
+
+NEXTU
+; restart clock
+wRestartClockCurDivision::   db
+wRestartClockPrevDivision::  db
+wRestartClockUpArrowYCoord:: db
+wRestartClockDay::  db
+wRestartClockHour:: db
+wRestartClockMin::  db
+
+NEXTU
+; link
+	ds 9
+wLinkBattleRNPreamble:: ds SERIAL_RN_PREAMBLE_LENGTH
+wLinkBattleRNs:: ds SERIAL_RNS_LENGTH
+
+NEXTU
+; mobile
+wd1ea:: ds 1
+wd1eb:: ds 1
+wd1ec:: ds 1
+wd1ed:: ds 1
+wd1ee:: ds 1
+wd1ef:: ds 1
+wd1f0:: ds 1
+wd1f1:: ds 1
+wd1f2:: ds 1
+wd1f3:: ds 1
+	ds 6
+
+NEXTU
+; miscellaneous bytes
+wSkipMovesBeforeLevelUp::
+wRegisteredPhoneNumbers::
+wListMovesLineSpacing:: db
+wSwitchMonTo:: db
+wSwitchMonFrom:: db
+	ds 4
+wCurEnemyItem:: db
+
+NEXTU
+; miscellaneous words
+wBuySellItemPrice::
+wTempMysteryGiftTimer::
+wMagikarpLength:: dw
+ENDU
+
+wTempEnemyMonSpecies::  db
+wTempBattleMonSpecies:: db
+
+wEnemyMon:: battle_struct wEnemyMon
+wEnemyMonBaseStats:: ds NUM_EXP_STATS
+wEnemyMonCatchRate:: db
+wEnemyMonBaseExp::   db
+wEnemyMonEnd::
+
+wBattleMode::
+; 0: overworld
+; 1: wild battle
+; 2: trainer battle
+	db
+
+wTempWildMonSpecies:: db
+
+wOtherTrainerClass::
+; class (Youngster, Bug Catcher, etc.) of opposing trainer
+; 0 if opponent is a wild Pokémon, not a trainer
+	db
+
+; BATTLETYPE_* values
+wBattleType:: db
+
+wOtherTrainerID::
+; which trainer of the class that you're fighting
+; (Joey, Mikey, Albert, etc.)
+	db
+
+wForcedSwitch:: db
+
+wTrainerClass:: db
+
+wUnownLetter:: db
+
+wMoveSelectionMenuType:: db
+
+; corresponds to the data/pokemon/base_stats/*.asm contents
+wCurBaseData::
+wBaseDexNo:: db
+wBaseStats::
+wBaseHP:: db
+wBaseAttack:: db
+wBaseDefense:: db
+wBaseSpeed:: db
+wBaseSpecialAttack:: db
+wBaseSpecialDefense:: db
+wBaseType::
+wBaseType1:: db
+wBaseType2:: db
+wBaseCatchRate:: db
+wBaseExp:: db
+wBaseItems::
+wBaseItem1:: db
+wBaseItem2:: db
+wBaseGender:: db
+wBaseUnknown1:: db
+wBaseEggSteps:: db
+wBaseUnknown2:: db
+wBasePicSize:: db
+wBaseUnusedFrontpic:: dw
+wBaseUnusedBackpic:: dw
+wBaseGrowthRate:: db
+wBaseEggGroups:: db
+wBaseTMHM:: flag_array NUM_TM_HM_TUTOR
+wCurBaseDataEnd::
+	assert wCurBaseDataEnd - wCurBaseData == BASE_DATA_SIZE
+
+wCurDamage:: dw
+
+	ds 2
+
+wMornEncounterRate::  db
+wDayEncounterRate::   db
+wNiteEncounterRate::  db
+wWaterEncounterRate:: db
+wListMoves_MoveIndicesBuffer:: ds NUM_MOVES
+wPutativeTMHMMove:: db
+wInitListType:: db
+wBattleHasJustStarted:: db
+
+wNamedObjectIndex::
+wTextDecimalByte::
+wTempByteValue::
+wNumSetBits::
+wTypeMatchup::
+wCurType::
+wTempSpecies::
+wTempIconSpecies::
+wTempTMHM::
+wTempPP::
+wNextBoxOrPartyIndex::
+wChosenCableClubRoom::
+wBreedingCompatibility::
+wMoveGrammar::
+wApplyStatLevelMultipliersToEnemy::
+wUsePPUp::
+wd265:: ; mobile
+	db
+
+wFailedToFlee:: db
+wNumFleeAttempts:: db
+wMonTriedToEvolve:: db
+
+wTimeOfDay:: db
+
+	ds 1
+
+
+SECTION "Enemy Party", WRAMX
+
+UNION
+wPokedexShowPointerAddr:: dw
+wPokedexShowPointerBank:: db
+	ds 3
+wd271:: dw ; mobile
+
+NEXTU
+wUnusedEggHatchFlag:: db
+
+NEXTU
+; enemy party
+wOTPartyData::
+wOTPlayerName:: ds NAME_LENGTH
+wOTPlayerID:: dw
+	ds 8
+wOTPartyCount::   db
+wOTPartySpecies:: ds PARTY_LENGTH
+wOTPartyEnd::     db ; older code doesn't check PartyCount
+ENDU
+
+UNION
+; ot party mons
+wOTPartyMons::
+; wOTPartyMon1 - wOTPartyMon6
+for n, 1, PARTY_LENGTH + 1
+wOTPartyMon{d:n}:: party_struct wOTPartyMon{d:n}
+endr
+
+wOTPartyMonOTs::
+; wOTPartyMon1OT - wOTPartyMon6OT
+for n, 1, PARTY_LENGTH + 1
+wOTPartyMon{d:n}OT:: ds NAME_LENGTH
+endr
+
+wOTPartyMonNicknames::
+; wOTPartyMon1Nickname - wOTPartyMon6Nickname
+for n, 1, PARTY_LENGTH + 1
+wOTPartyMon{d:n}Nickname:: ds MON_NAME_LENGTH
+endr
+wOTPartyDataEnd::
+
+NEXTU
+; catch tutorial dude pack
+wDudeNumItems:: db
+wDudeItems:: ds 2 * 4 + 1
+
+wDudeNumKeyItems:: db
+wDudeKeyItems:: ds 18 + 1
+
+wDudeNumBalls:: db
+wDudeBalls:: ds 2 * 4 + 1
+ENDU
+
+	ds 4
+
+wd430:: ; mobile
+wBattleAction:: db
+
+wLinkBattleSentAction:: db
+wMapStatus:: db
+wMapEventStatus:: db
+
+wScriptFlags::
+; bit 3: run deferred script
+	db
+	ds 1
+wScriptFlags2::
+; bit 0: count steps
+; bit 1: coord events
+; bit 2: warps and connections
+; bit 4: wild encounters
+; bit 5: unknown
+	db
+
+wScriptMode:: db
+wScriptRunning:: db
+wScriptBank:: db
+wScriptPos:: dw
+
+wScriptStackSize:: db
+wScriptStack:: ds 3 * 5
+	ds 1
+wScriptDelay:: db
+
+wDeferredScriptBank::
+wScriptTextBank::
+	db
+wDeferredScriptAddr::
+wScriptTextAddr::
+	dw
+	ds 1
+wWildEncounterCooldown:: db
+
+wXYComparePointer:: dw
+	ds 4
+
+wBattleScriptFlags:: db
+	ds 1
+wPlayerSpriteSetupFlags::
+; bit 7: if set, cancel wPlayerAction
+; bit 6: RefreshMapSprites doesn't reload player sprite
+; bit 5: if set, set facing according to bits 0-1
+; bit 2: female player has been transformed into male
+; bits 0-1: direction facing
+	db
+
+wMapReentryScriptQueueFlag:: db
+wMapReentryScriptBank:: db
+wMapReentryScriptAddress:: dw
+
+	ds 4
+
+wTimeCyclesSinceLastCall:: db
+wReceiveCallDelay_MinsRemaining:: db
+wReceiveCallDelay_StartTime:: ds 3
+
+	ds 3
+
+wBugContestMinsRemaining:: db
+wBugContestSecsRemaining:: db
+
+	ds 2
+
+wMapStatusEnd::
+
+	ds 2
+
+wCrystalData::
+wPlayerGender::
+; bit 0:
+;	0 male
+;	1 female
+	db
+wd473:: ds 1
+wd474:: ds 1
+wd475:: ds 1
+wd476:: ds 1
+wd477:: ds 1
+wd478:: ds 1
+wCrystalDataEnd::
+
+wd479:: ds 2
+
+wGameData::
+wPlayerData::
+wPlayerID:: dw
+
+wPlayerName:: ds NAME_LENGTH
+wMomsName::   ds NAME_LENGTH
+wRivalName::  ds NAME_LENGTH
+wRedsName::   ds NAME_LENGTH
+wGreensName:: ds NAME_LENGTH
+
+wSavedAtLeastOnce:: db
+wSpawnAfterChampion:: db
+
+; init time set at newgame
+wStartDay::    db
+wStartHour::   db
+wStartMinute:: db
+wStartSecond:: db
+
+wRTC:: ds 4
+
+	ds 4
+
+wDST::
+; bit 7: dst
+	db
+
+wGameTime:: ; used only for BANK(wGameTime)
+wGameTimeCap::     db
+wGameTimeHours::   dw
+wGameTimeMinutes:: db
+wGameTimeSeconds:: db
+wGameTimeFrames::  db
+
+	ds 2
+
+wCurDay:: db
+
+	ds 1
+
+wObjectFollow_Leader:: db
+wObjectFollow_Follower:: db
+wCenteredObject:: db
+wFollowerMovementQueueLength:: db
+wFollowMovementQueue:: ds 5
+
+wObjectStructs::
+wPlayerStruct:: object_struct wPlayer ; player is object struct 0
+; wObjectStruct1 - wObjectStruct12
+for n, 1, NUM_OBJECT_STRUCTS
+wObject{d:n}Struct:: object_struct wObject{d:n}
+endr
+
+wCmdQueue:: ds CMDQUEUE_CAPACITY * CMDQUEUE_ENTRY_SIZE
+
+	ds 40
+
+wMapObjects::
+wPlayerObject:: map_object wPlayer ; player is map object 0
+; wMap1Object - wMap15Object
+for n, 1, NUM_OBJECTS
+wMap{d:n}Object:: map_object wMap{d:n}
+endr
+
+wObjectMasks:: ds NUM_OBJECTS
+
+wVariableSprites:: ds $100 - SPRITE_VARS
+
+wEnteredMapFromContinue:: db
+	ds 2
+wTimeOfDayPal:: db
+	ds 4
+wTimeOfDayPalFlags:: db
+wTimeOfDayPalset:: db
+wCurTimeOfDay:: db
+
+	ds 1
+
+wSecretID:: dw
+wStatusFlags::
+; bit 0: pokedex
+; bit 1: unown dex
+; bit 2: flash
+; bit 3: caught pokerus
+; bit 4: rocket signal
+; bit 5: wild encounters on/off
+; bit 6: hall of fame
+; bit 7: bug contest on
+	db
+
+wStatusFlags2::
+; bit 0: rockets
+; bit 1: safari game (unused)
+; bit 2: bug contest timer
+; bit 3: unused
+; bit 4: bike shop call
+; bit 5: can use sweet scent
+; bit 6: reached goldenrod
+; bit 7: rockets in mahogany
+	db
+
+wMoney:: ds 3
+wMomsMoney:: ds 3
+
+wMomSavingMoney::
+; bit 0: saving some money
+; bit 1: saving half money (unused)
+; bit 2: saving all money (unused)
+; bit 7: active
+	db
+
+wCoins:: dw
+
+wBadges::
+wJohtoBadges:: flag_array NUM_JOHTO_BADGES
+wKantoBadges:: flag_array NUM_KANTO_BADGES
+
+wTMsHMs:: ds NUM_TMS + NUM_HMS
+
+wNumItems:: db
+wItems:: ds MAX_ITEMS * 2 + 1
+
+wNumKeyItems:: db
+wKeyItems:: ds MAX_KEY_ITEMS + 1
+
+wNumBalls:: db
+wBalls:: ds MAX_BALLS * 2 + 1
+
+wNumPCItems:: db
+wPCItems:: ds MAX_PC_ITEMS * 2 + 1
+
+wPokegearFlags::
+; bit 0: map
+; bit 1: radio
+; bit 2: phone
+; bit 3: expn
+; bit 7: on/off
+	db
+wRadioTuningKnob:: db
+wLastDexMode:: db
+	ds 1
+wWhichRegisteredItem:: db
+wRegisteredItem:: db
+
+wPlayerState:: db
+
+wHallOfFameCount:: db
+	ds 1
+wTradeFlags:: flag_array NUM_NPC_TRADES
+	ds 1
+wMooMooBerries:: db
+wUndergroundSwitchPositions:: db
+wFarfetchdPosition:: db
+
+	ds 13
+
+; map scene ids
+wPokecenter2FSceneID::                            db
+wTradeCenterSceneID::                             db
+wColosseumSceneID::                               db
+wTimeCapsuleSceneID::                             db
+wPowerPlantSceneID::                              db
+wCeruleanGymSceneID::                             db
+wRoute25SceneID::                                 db
+wTrainerHouseB1FSceneID::                         db
+wVictoryRoadGateSceneID::                         db
+wSaffronMagnetTrainStationSceneID::               db
+wRoute16GateSceneID::                             db
+wRoute17Route18GateSceneID::                      db
+wIndigoPlateauPokecenter1FSceneID::               db
+wWillsRoomSceneID::                               db
+wKogasRoomSceneID::                               db
+wBrunosRoomSceneID::                              db
+wKarensRoomSceneID::                              db
+wLancesRoomSceneID::                              db
+wHallOfFameSceneID::                              db
+wRoute27SceneID::                                 db
+wNewBarkTownSceneID::                             db
+wElmsLabSceneID::                                 db
+wPlayersHouse1FSceneID::                          db
+wRoute29SceneID::                                 db
+wCherrygroveCitySceneID::                         db
+wMrPokemonsHouseSceneID::                         db
+wRoute32SceneID::                                 db
+wRoute35NationalParkGateSceneID::                 db
+wRoute36SceneID::                                 db
+wRoute36NationalParkGateSceneID::                 db
+wAzaleaTownSceneID::                              db
+wGoldenrodGymSceneID::                            db
+wGoldenrodMagnetTrainStationSceneID::             db
+wGoldenrodPokecenter1FSceneID::                   db
+wOlivineCitySceneID::                             db
+wRoute34SceneID::                                 db
+wRoute34IlexForestGateSceneID::                   db
+wEcruteakTinTowerEntranceSceneID::                db
+wWiseTriosRoomSceneID::                           db
+wEcruteakPokecenter1FSceneID::                    db
+wEcruteakGymSceneID::                             db
+wMahoganyTownSceneID::                            db
+wRoute42SceneID::                                 db
+wCianwoodCitySceneID::                            db
+wBattleTower1FSceneID::                           db
+wBattleTowerBattleRoomSceneID::                   db
+wBattleTowerElevatorSceneID::                     db
+wBattleTowerHallwaySceneID::                      db
+wBattleTowerOutsideSceneID::                      db
+wRoute43GateSceneID::                             db
+wMountMoonSceneID::                               db
+wSproutTower3FSceneID::                           db
+wTinTower1FSceneID::                              db
+wBurnedTower1FSceneID::                           db
+wBurnedTowerB1FSceneID::                          db
+wRadioTower5FSceneID::                            db
+wRuinsOfAlphOutsideSceneID::                      db
+wRuinsOfAlphResearchCenterSceneID::               db
+wRuinsOfAlphHoOhChamberSceneID::                  db
+wRuinsOfAlphKabutoChamberSceneID::                db
+wRuinsOfAlphOmanyteChamberSceneID::               db
+wRuinsOfAlphAerodactylChamberSceneID::            db
+wRuinsOfAlphInnerChamberSceneID::                 db
+wMahoganyMart1FSceneID::                          db
+wTeamRocketBaseB1FSceneID::                       db
+wTeamRocketBaseB2FSceneID::                       db
+wTeamRocketBaseB3FSceneID::                       db
+wGoldenrodUndergroundSwitchRoomEntrancesSceneID:: db
+wSilverCaveRoom3SceneID::                         db
+wVictoryRoadSceneID::                             db
+wDragonsDenB1FSceneID::                           db
+wDragonShrineSceneID::                            db
+wOlivinePortSceneID::                             db
+wVermilionPortSceneID::                           db
+wFastShip1FSceneID::                              db
+wFastShipB1FSceneID::                             db
+wMountMoonSquareSceneID::                         db
+wMobileTradeRoomSceneID::                         db
+wMobileBattleRoomSceneID::                        db
+
+	ds 49
+
+; fight counts
+wJackFightCount::    db
+wBeverlyFightCount:: db ; unreferenced
+wHueyFightCount::    db
+wGavenFightCount::   db
+wBethFightCount::    db
+wJoseFightCount::    db
+wReenaFightCount::   db
+wJoeyFightCount::    db
+wWadeFightCount::    db
+wRalphFightCount::   db
+wLizFightCount::     db
+wAnthonyFightCount:: db
+wToddFightCount::    db
+wGinaFightCount::    db
+wIrwinFightCount::   db ; unreferenced
+wArnieFightCount::   db
+wAlanFightCount::    db
+wDanaFightCount::    db
+wChadFightCount::    db
+wDerekFightCount::   db ; unreferenced
+wTullyFightCount::   db
+wBrentFightCount::   db
+wTiffanyFightCount:: db
+wVanceFightCount::   db
+wWiltonFightCount::  db
+wKenjiFightCount::   db ; unreferenced
+wParryFightCount::   db
+wErinFightCount::    db
+
+	ds 100
+
+wEventFlags:: flag_array NUM_EVENTS
+
+wCurBox:: db
+
+	ds 2
+
+wBoxNames:: ds BOX_NAME_LENGTH * NUM_BOXES
+
+wCelebiEvent::
+; bit 2: forest is restless
+	db
+
+	ds 1
+
+wBikeFlags::
+; bit 0: using strength
+; bit 1: always on bike
+; bit 2: downhill
+	db
+	ds 1 ; cleared along with wBikeFlags by ResetBikeFlags
+
+wCurMapSceneScriptPointer:: dw
+
+wCurCaller:: dw
+wCurMapWarpCount:: db
+wCurMapWarpsPointer:: dw
+wCurMapCoordEventCount:: db
+wCurMapCoordEventsPointer:: dw
+wCurMapBGEventCount:: db
+wCurMapBGEventsPointer:: dw
+wCurMapObjectEventCount:: db
+wCurMapObjectEventsPointer:: dw
+wCurMapSceneScriptCount:: db
+wCurMapSceneScriptsPointer:: dw
+wCurMapCallbackCount:: db
+wCurMapCallbacksPointer:: dw
+
+	ds 2
+
+; Sprite id of each decoration
+wDecoBed::           db
+wDecoCarpet::        db
+wDecoPlant::         db
+wDecoPoster::        db
+wDecoConsole::       db
+wDecoLeftOrnament::  db
+wDecoRightOrnament:: db
+wDecoBigDoll::       db
+
+; Items bought from Mom
+wWhichMomItem:: db
+wWhichMomItemSet:: db
+wMomItemTriggerBalance:: ds 3
+
+wDailyResetTimer:: dw
+wDailyFlags1:: db
+wDailyFlags2:: db
+wSwarmFlags:: db
+	ds 2
+wTimerEventStartDay:: db
+	ds 3
+
+wFruitTreeFlags:: flag_array NUM_FRUIT_TREES
+
+	ds 2
+
+wLuckyNumberDayTimer:: dw
+	ds 2
+wSpecialPhoneCallID:: db
+	ds 3
+wBugContestStartTime:: ds 4 ; day, hour, min, sec
+wUnusedTwoDayTimerOn:: db
+wUnusedTwoDayTimer:: db
+wUnusedTwoDayTimerStartDate:: db
+	ds 4
+wMobileOrCable_LastSelection:: db
+wdc41:: ds 1
+wdc42:: ds 8
+wBuenasPassword:: db
+wBlueCardBalance:: db
+wDailyRematchFlags:: ds 4
+wDailyPhoneItemFlags:: ds 4
+wDailyPhoneTimeOfDayFlags:: ds 4
+wKenjiBreakTimer:: ds 2 ; Kenji
+wYanmaMapGroup:: db
+wYanmaMapNumber:: db
+wPlayerMonSelection:: ds 3
+wdc5f:: db
+wdc60:: db
+
+	ds 18
+
+wStepCount:: db
+wPoisonStepCount:: db
+	ds 2
+wHappinessStepCount:: db
+	ds 1
+
+wParkBallsRemaining::
+wSafariBallsRemaining:: db
+wSafariTimeRemaining:: dw
+
+wPhoneList:: ds CONTACT_LIST_SIZE + 1
+
+	ds 22
+
+wLuckyNumberShowFlag:: db
+	ds 1
+wLuckyIDNumber:: dw
+
+wRepelEffect:: db ; If a Repel is in use, it contains the nr of steps it's still active
+wBikeStep:: dw
+wKurtApricornQuantity:: db
+
+wPlayerDataEnd::
+
+wCurMapData::
+
+wVisitedSpawns:: flag_array NUM_SPAWNS
+
+wDigWarpNumber:: db
+wDigMapGroup::   db
+wDigMapNumber::  db
+
+; used on maps like second floor pokécenter, which are reused, so we know which
+; map to return to
+wBackupWarpNumber:: db
+wBackupMapGroup::   db
+wBackupMapNumber::  db
+
+	ds 3
+
+wLastSpawnMapGroup:: db
+wLastSpawnMapNumber:: db
+
+wWarpNumber:: db
+wMapGroup:: db
+wMapNumber:: db
+wYCoord:: db
+wXCoord:: db
+wScreenSave:: ds SCREEN_META_WIDTH * SCREEN_META_HEIGHT
+
+wCurMapDataEnd::
+
+
+SECTION "Party", WRAMX
+
+wPokemonData::
+
+wPartyCount::   db
+wPartySpecies:: ds PARTY_LENGTH
+wPartyEnd::     db ; older code doesn't check wPartyCount
+
+wPartyMons::
+; wPartyMon1 - wPartyMon6
+for n, 1, PARTY_LENGTH + 1
+wPartyMon{d:n}:: party_struct wPartyMon{d:n}
+endr
+
+wPartyMonOTs::
+; wPartyMon1OT - wPartyMon6OT
+for n, 1, PARTY_LENGTH + 1
+wPartyMon{d:n}OT:: ds NAME_LENGTH
+endr
+
+wPartyMonNicknames::
+; wPartyMon1Nickname - wPartyMon6Nickname
+for n, 1, PARTY_LENGTH + 1
+wPartyMon{d:n}Nickname:: ds MON_NAME_LENGTH
+endr
+wPartyMonNicknamesEnd::
+
+	ds 22
+
+wPokedexCaught:: flag_array NUM_POKEMON
+wEndPokedexCaught::
+
+wPokedexSeen:: flag_array NUM_POKEMON
+wEndPokedexSeen::
+
+wUnownDex:: ds NUM_UNOWN
+wUnlockedUnowns:: db
+wFirstUnownSeen:: db
+
+wDayCareMan::
+; bit 7: active
+; bit 6: egg ready
+; bit 5: monsters are compatible
+; bit 0: monster 1 in day-care
+	db
+
+wBreedMon1Nickname:: ds MON_NAME_LENGTH
+wBreedMon1OT:: ds NAME_LENGTH
+wBreedMon1:: box_struct wBreedMon1
+
+wDayCareLady::
+; bit 7: active
+; bit 0: monster 2 in day-care
+	db
+
+wStepsToEgg::
+	db
+wBreedMotherOrNonDitto::
+;  z: yes
+; nz: no
+	db
+
+wBreedMon2Nickname:: ds MON_NAME_LENGTH
+wBreedMon2OT:: ds NAME_LENGTH
+wBreedMon2:: box_struct wBreedMon2
+
+wEggMonNickname:: ds MON_NAME_LENGTH
+wEggMonOT:: ds NAME_LENGTH
+wEggMon:: box_struct wEggMon
+
+wBugContestSecondPartySpecies:: db
+wContestMon:: party_struct wContestMon
+
+wDunsparceMapGroup:: db
+wDunsparceMapNumber:: db
+wFishingSwarmFlag:: db
+
+wRoamMon1:: roam_struct wRoamMon1
+wRoamMon2:: roam_struct wRoamMon2
+wRoamMon3:: roam_struct wRoamMon3
+
+wRoamMons_CurMapNumber:: db
+wRoamMons_CurMapGroup:: db
+wRoamMons_LastMapNumber:: db
+wRoamMons_LastMapGroup:: db
+
+wBestMagikarpLengthFeet:: db
+wBestMagikarpLengthInches:: db
+wMagikarpRecordHoldersName:: ds NAME_LENGTH
+
+wPokemonDataEnd::
+wGameDataEnd::
+
+
+SECTION "Pic Animations", WRAMX
+
+wTempTilemap::
+; 20x18 grid of 8x8 tiles
+	ds SCREEN_WIDTH * SCREEN_HEIGHT
+
+; PokeAnim data
+wPokeAnimStruct::
+wPokeAnimSceneIndex:: db
+wPokeAnimPointer:: dw
+wPokeAnimSpecies:: db
+wPokeAnimUnownLetter:: db
+wPokeAnimSpeciesOrUnown:: db
+wPokeAnimGraphicStartTile:: db
+wPokeAnimCoord:: dw
+wPokeAnimFrontpicHeight:: db
+wPokeAnimIdleFlag:: db
+wPokeAnimSpeed:: db
+wPokeAnimPointerBank:: db
+wPokeAnimPointerAddr:: dw
+wPokeAnimFramesBank:: db
+wPokeAnimFramesAddr:: dw
+wPokeAnimBitmaskBank:: db
+wPokeAnimBitmaskAddr:: dw
+wPokeAnimFrame:: db
+wPokeAnimJumptableIndex:: db
+wPokeAnimRepeatTimer:: db
+wPokeAnimCurBitmask:: db
+wPokeAnimWaitCounter:: db
+wPokeAnimCommand:: db
+wPokeAnimParameter:: db
+	ds 1
+wPokeAnimBitmaskCurCol:: db
+wPokeAnimBitmaskCurRow:: db
+wPokeAnimBitmaskCurBit:: db
+wPokeAnimBitmaskBuffer:: ds 7
+	ds 2
+wPokeAnimStructEnd::
+
+
+SECTION "Battle Tower RAM", WRAMX
+
+w3_d000:: ds 1
+w3_d001:: ds 1
+w3_d002:: ds 16
+w3_d012:: ds $6e
+w3_d080:: ds 1
+w3_d081:: ds $f
+w3_d090:: ds $70
+
+w3_d100::
+wBT_OTTrainer:: battle_tower_struct wBT_OT
+	ds $20
+wBT_TrainerTextIndex:: db
+	ds 1
+w3_d202:: battle_tower_struct w3_d202
+w3_d2e2:: battle_tower_struct w3_d2e2
+w3_d3c2:: battle_tower_struct w3_d3c2
+w3_d4a2:: battle_tower_struct w3_d4a2
+w3_d582:: battle_tower_struct w3_d582
+w3_d662:: battle_tower_struct w3_d662
+
+UNION
+w3_d742:: battle_tower_struct w3_d742
+
+NEXTU
+	ds $be
+w3_d800:: ds BG_MAP_WIDTH * SCREEN_HEIGHT
+
+NEXTU
+	ds $be
+wBTChoiceOfLvlGroup:: db
+	ds $1
+w3_d802:: ds 12
+w3_d80e:: db
+	ds $1
+w3_d810::
+	ds $59
+w3_d869:: ds $17
+w3_d880:: ds 1
+w3_d881:: ds 8
+w3_d889:: ds 1
+w3_d88a:: ds 4
+w3_d88e:: ds 1
+w3_d88f:: ds 4
+w3_d893:: ds 1
+w3_d894:: ds 1
+w3_d895:: ds 11
+w3_d8a0:: ds 1
+w3_d8a1:: ds 1
+w3_d8a2:: ds 1
+w3_d8a3:: ds 1
+ENDU
+
+	ds $1c0
+
+w3_dc00:: ds SCREEN_WIDTH * SCREEN_HEIGHT
+UNION
+w3_dd68:: ds SCREEN_WIDTH * SCREEN_HEIGHT
+
+	ds $11c
+
+w3_dfec:: ds $10
+w3_dffc:: ds 4
+NEXTU
+	ds $98
+w3_de00:: ds $200
+ENDU
+
+
+SECTION "GBC Video", WRAMX, ALIGN[8]
+
+; eight 4-color palettes each
+wGBCPalettes:: ; used only for BANK(wGBCPalettes)
+wBGPals1:: ds 8 palettes
+wOBPals1:: ds 8 palettes
+wBGPals2:: ds 8 palettes
+wOBPals2:: ds 8 palettes
+
+	align 8
+wLYOverrides:: ds SCREEN_HEIGHT_PX
+wLYOverridesEnd::
+
+	ds 1
+
+wMagnetTrain:: ; used only for BANK(wMagnetTrain)
+wMagnetTrainDirection:: db
+wMagnetTrainInitPosition:: db
+wMagnetTrainHoldPosition:: db
+wMagnetTrainFinalPosition:: db
+wMagnetTrainPlayerSpriteInitX:: db
+
+	ds 106
+
+	align 8
+wLYOverridesBackup:: ds SCREEN_HEIGHT_PX
+wLYOverridesBackupEnd::
+
+
+SECTION "Battle Animations", WRAMX
+
+wBattleAnimTileDict::
+; wBattleAnimTileDict pairs keys with values
+; keys: ANIM_GFX_* indexes (taken from anim_*gfx arguments)
+; values: vTiles0 offsets
+	ds NUM_BATTLEANIMTILEDICT_ENTRIES * 2
+
+wActiveAnimObjects::
+; wAnimObject1 - wAnimObject10
+for n, 1, NUM_ANIM_OBJECTS + 1
+wAnimObject{d:n}:: battle_anim_struct wAnimObject{d:n}
+endr
+
+wActiveBGEffects::
+; wBGEffect1 - wBGEffect5
+for n, 1, NUM_BG_EFFECTS + 1
+wBGEffect{d:n}:: battle_bg_effect wBGEffect{d:n}
+endr
+
+wLastAnimObjectIndex:: db
+
+wBattleAnimFlags:: db
+wBattleAnimAddress:: dw
+wBattleAnimDelay:: db
+wBattleAnimParent:: dw
+wBattleAnimLoops:: db
+wBattleAnimVar:: db
+wBattleAnimByte:: db
+wBattleAnimOAMPointerLo:: db
+
+UNION
+wBattleObjectTempID:: db
+wBattleObjectTempXCoord:: db
+wBattleObjectTempYCoord:: db
+wBattleObjectTempParam:: db
+
+NEXTU
+wBattleBGEffectTempID:: db
+wBattleBGEffectTempJumptableIndex:: db
+wBattleBGEffectTempTurn:: db
+wBattleBGEffectTempParam:: db
+
+NEXTU
+wBattleAnimTempOAMFlags:: db
+wBattleAnimTempFixY:: db
+wBattleAnimTempTileID:: db
+wBattleAnimTempXCoord:: db
+wBattleAnimTempYCoord:: db
+wBattleAnimTempXOffset:: db
+wBattleAnimTempYOffset:: db
+wBattleAnimTempFrameOAMFlags:: db
+wBattleAnimTempPalette:: db
+
+NEXTU
+wBattleAnimGFXTempTileID::
+wBattleAnimGFXTempPicHeight:: db
+
+NEXTU
+wBattleSineWaveTempProgress:: db
+wBattleSineWaveTempOffset:: db
+wBattleSineWaveTempAmplitude:: db
+wBattleSineWaveTempTimer:: db
+
+NEXTU
+wBattlePicResizeTempBaseTileID:: db
+wBattlePicResizeTempPointer:: dw
+ENDU
+
+UNION
+	ds 50
+wBattleAnimEnd::
+
+NEXTU
+wSurfWaveBGEffect:: ds $40
+wSurfWaveBGEffectEnd::
+ENDU
+
+
+SECTION "Mobile RAM", WRAMX
+
+w5_d800:: ds $200
+w5_da00:: ds $200
+w5_dc00:: ds $d
+w5_dc0d:: ds 4
+w5_dc11:: ds 9
+w5_MobileOpponentBattleMessages:: ds $c
+w5_MobileOpponentBattleStartMessage:: ds $c
+w5_MobileOpponentBattleWinMessage:: ds $c
+w5_MobileOpponentBattleLossMessage:: ds $c
+
+
+SECTION "Scratch RAM", WRAMX
+
+UNION
+wScratchTilemap:: ds BG_MAP_WIDTH * BG_MAP_HEIGHT
+wScratchAttrmap:: ds BG_MAP_WIDTH * BG_MAP_HEIGHT
+
+NEXTU
+wDecompressScratch:: ds $80 tiles
+wDecompressEnemyFrontpic:: ds $80 tiles
+
+NEXTU
+; unidentified uses
+w6_d000:: ds $1000
+ENDU
+
+
+SECTION "Stack RAM", WRAMX
+
+wWindowStack:: ds $1000 - 1
+wWindowStackBottom:: ds 1
--- a/sram.asm
+++ /dev/null
@@ -1,384 +1,0 @@
-SECTION "Scratch", SRAM
-
-sScratch:: ds $60 tiles
-
-
-SECTION "SRAM Bank 0", SRAM
-
-sPartyMail::
-; sPartyMon1Mail - sPartyMon6Mail
-for n, 1, PARTY_LENGTH + 1
-sPartyMon{d:n}Mail:: mailmsg sPartyMon{d:n}Mail
-endr
-
-sPartyMailBackup::
-; sPartyMon1MailBackup - sPartyMon6MailBackup
-for n, 1, PARTY_LENGTH + 1
-sPartyMon{d:n}MailBackup:: mailmsg sPartyMon{d:n}MailBackup
-endr
-
-sMailboxCount:: db
-sMailboxes::
-; sMailbox1 - sMailbox10
-for n, 1, MAILBOX_CAPACITY + 1
-sMailbox{d:n}:: mailmsg sMailbox{d:n}
-endr
-
-sMailboxCountBackup:: db
-sMailboxesBackup::
-; sMailbox1Backup - sMailbox10Backup
-for n, 1, MAILBOX_CAPACITY + 1
-sMailbox{d:n}Backup:: mailmsg sMailbox{d:n}Backup
-endr
-
-sMysteryGiftData::
-sMysteryGiftItem:: db
-sMysteryGiftUnlocked:: db
-sBackupMysteryGiftItem:: db
-sNumDailyMysteryGiftPartnerIDs:: db
-sDailyMysteryGiftPartnerIDs:: ds MAX_MYSTERY_GIFT_PARTNERS * 2
-sMysteryGiftDecorationsReceived:: flag_array NUM_NON_TROPHY_DECOS
-	ds 4
-sMysteryGiftTimer:: dw
-	ds 1
-sMysteryGiftTrainerHouseFlag:: db
-sMysteryGiftPartnerName:: ds NAME_LENGTH
-sMysteryGiftUnusedFlag:: db
-sMysteryGiftTrainer:: ds wMysteryGiftTrainerEnd - wMysteryGiftTrainer
-sBackupMysteryGiftItemEnd::
-
-	ds $30
-
-sRTCStatusFlags:: db
-	ds 7
-sLuckyNumberDay:: db
-sLuckyIDNumber::  dw
-
-
-SECTION "Backup Save", SRAM
-
-sBackupOptions:: ds wOptionsEnd - wOptions
-
-sBackupCheckValue1:: db ; loaded with SAVE_CHECK_VALUE_1, used to check save corruption
-
-sBackupGameData::
-sBackupPlayerData::  ds wPlayerDataEnd - wPlayerData
-sBackupCurMapData::  ds wCurMapDataEnd - wCurMapData
-sBackupPokemonData:: ds wPokemonDataEnd - wPokemonData
-sBackupGameDataEnd::
-
-	ds $18a
-
-sBackupChecksum:: dw
-
-sBackupCheckValue2:: db ; loaded with SAVE_CHECK_VALUE_2, used to check save corruption
-
-sStackTop:: dw
-
-if DEF(_DEBUG)
-sRTCHaltCheckValue:: dw
-sSkipBattle:: db
-sDebugTimeCyclesSinceLastCall:: db
-sOpenedInvalidSRAM:: db
-sIsBugMon:: db
-endc
-
-
-SECTION "Save", SRAM
-
-sOptions:: ds wOptionsEnd - wOptions
-
-sCheckValue1:: db ; loaded with SAVE_CHECK_VALUE_1, used to check save corruption
-
-sGameData::
-sPlayerData::  ds wPlayerDataEnd - wPlayerData
-sCurMapData::  ds wCurMapDataEnd - wCurMapData
-sPokemonData:: ds wPokemonDataEnd - wPokemonData
-sGameDataEnd::
-
-	ds $18a
-
-sChecksum:: dw
-
-sCheckValue2:: db ; loaded with SAVE_CHECK_VALUE_2, used to check save corruption
-
-
-SECTION "Active Box", SRAM
-
-sBox:: box sBox
-
-	ds $100
-
-
-SECTION "Link Battle Data", SRAM
-
-sLinkBattleStats::
-sLinkBattleWins::   dw
-sLinkBattleLosses:: dw
-sLinkBattleDraws::  dw
-
-sLinkBattleRecord::
-; sLinkBattleRecord1 - sLinkBattleRecord5
-for n, 1, NUM_LINK_BATTLE_RECORDS + 1
-sLinkBattleRecord{d:n}:: link_battle_record sLinkBattleRecord{d:n}
-endr
-sLinkBattleStatsEnd::
-
-
-SECTION "SRAM Hall of Fame", SRAM
-
-sHallOfFame::
-; sHallOfFame1 - sHallOfFame30
-for n, 1, NUM_HOF_TEAMS + 1
-sHallOfFame{d:n}:: hall_of_fame sHallOfFame{d:n}
-endr
-sHallOfFameEnd::
-
-
-SECTION "SRAM Crystal Data", SRAM
-
-sMobileEventIndex:: db
-
-sCrystalData:: ds wCrystalDataEnd - wCrystalData
-
-sMobileEventIndexBackup:: db
-
-
-SECTION "SRAM Battle Tower", SRAM
-
-; Battle Tower data must be in SRAM because you can save and leave between battles
-sBattleTowerChallengeState::
-; 0: normal
-; 2: battle tower
-	db
-
-sNrOfBeatenBattleTowerTrainers:: db
-sBTChoiceOfLevelGroup:: db
-; Battle Tower trainers are saved here, so nobody appears more than once
-sBTTrainers:: ds BATTLETOWER_STREAK_LENGTH ; sbe48
-sBattleTowerSaveFileFlags:: db
-sBattleTowerReward:: db
-
-sBTMonOfTrainers::
-; team of previous trainer
-; sBTMonPrevTrainer1 - sBTMonPrevTrainer3
-for n, 1, BATTLETOWER_PARTY_LENGTH + 1
-sBTMonPrevTrainer{d:n}:: db
-endr
-; team of preprevious trainer
-; sBTMonPrevPrevTrainer1 - sBTMonPrevPrevTrainer3
-for n, 1, BATTLETOWER_PARTY_LENGTH + 1
-sBTMonPrevPrevTrainer{d:n}:: db
-endr
-
-
-; The PC boxes will not fit into one SRAM bank,
-; so they use multiple SECTIONs
-DEF box_n = 0
-MACRO boxes
-	rept \1
-		DEF box_n += 1
-	sBox{d:box_n}:: box sBox{d:box_n}
-	endr
-ENDM
-
-SECTION "Boxes 1-7", SRAM
-
-; sBox1 - sBox7
-	boxes 7
-
-SECTION "Boxes 8-14", SRAM
-
-; sBox8 - sBox14
-	boxes 7
-
-; All 14 boxes fit exactly within 2 SRAM banks
-	assert box_n == NUM_BOXES, \
-		"boxes: Expected {d:NUM_BOXES} total boxes, got {d:box_n}"
-
-
-SECTION "SRAM Mobile 1", SRAM
-
-	ds $7
-
-s4_a007:: ; struct size $30
-
-	ds $c
-
-s4_a013:: ds 36
-
-s4_a037:: ds 4
-
-s4_a03b:: ds 37 * 40
-
-s4_a603:: ds 8
-
-s4_a60b:: db
-s4_a60c:: db
-s4_a60d:: db
-
-s4_a60e:: dw
-
-	ds $1f0
-
-sMobileBattleTimer:: ds 3
-
-	ds $7fd
-
-s4_b000:: db
-
-
-SECTION "SRAM Mobile 2", SRAM
-
-	ds 1 ; JP: location of sMobileEventIndex
-
-sTrainerRankings::
-sTrainerRankingGameTimeHOF:: ds 4
-sTrainerRankingStepCountHOF:: ds 4
-sTrainerRankingHealingsHOF:: ds 4
-sTrainerRankingBattlesHOF:: ds 3
-sTrainerRankingStepCount:: ds 4
-sTrainerRankingBattleTowerWins:: ds 4
-sTrainerRankingTMsHMsTaught:: ds 3
-sTrainerRankingBattles:: ds 3
-sTrainerRankingWildBattles:: ds 3
-sTrainerRankingTrainerBattles:: ds 3
-sTrainerRankingUnused1:: ds 3
-sTrainerRankingHOFEntries:: ds 3
-sTrainerRankingWildMonsCaught:: ds 3
-sTrainerRankingHookedEncounters:: ds 3
-sTrainerRankingEggsHatched:: ds 3
-sTrainerRankingMonsEvolved:: ds 3
-sTrainerRankingFruitPicked:: ds 3
-sTrainerRankingHealings:: ds 3
-sTrainerRankingMysteryGift:: ds 3
-sTrainerRankingTrades:: ds 3
-sTrainerRankingFly:: ds 3
-sTrainerRankingSurf:: ds 3
-sTrainerRankingWaterfall:: ds 3
-sTrainerRankingWhiteOuts:: ds 3
-sTrainerRankingLuckyNumberShow:: ds 3
-sTrainerRankingPhoneCalls:: ds 3
-sTrainerRankingUnused2:: ds 3
-sTrainerRankingLinkBattles:: ds 3
-sTrainerRankingSplash:: ds 3
-sTrainerRankingTreeEncounters:: ds 3
-sTrainerRankingUnused3:: ds 3
-sTrainerRankingColosseumWins:: ds 3
-sTrainerRankingColosseumLosses:: ds 3
-sTrainerRankingColosseumDraws:: ds 3
-sTrainerRankingSelfdestruct:: ds 3
-sTrainerRankingCurrentSlotsStreak:: ds 2
-sTrainerRankingLongestSlotsStreak:: ds 2
-sTrainerRankingTotalSlotsPayouts:: ds 4
-sTrainerRankingTotalBattlePayouts:: ds 4
-sTrainerRankingLongestMagikarp:: ds 2
-sTrainerRankingShortestMagikarp:: ds 2
-sTrainerRankingBugContestScore:: ds 2
-sTrainerRankingsChecksum:: ds 2
-sTrainerRankingsEnd::
-
-	ds 1 ; JP: location of sMobileEventIndexBackup
-
-sTrainerRankingsBackup:: ds sTrainerRankingsEnd - sTrainerRankings
-
-	ds $6fa
-
-s5_a800:: db
-
-	ds $24
-
-s5_a825:: db
-s5_a826:: db
-
-	ds $6d
-
-s5_a894:: ds 6
-s5_a89a:: dw
-s5_a89c:: ds 22
-s5_a8b2:: ds 150
-
-s5_a948:: ds 246
-
-	ds $3
-
-s5_aa41:: ds 4
-
-	ds $2
-
-s5_aa47:: db
-s5_aa48:: db
-
-	ds $1
-
-s5_aa4a:: db
-
-sMobileLoginPassword:: ds MOBILE_LOGIN_PASSWORD_LENGTH
-
-	ds $1
-
-s5_aa5d:: ds MOBILE_LOGIN_PASSWORD_LENGTH
-
-	ds $4
-
-s5_aa72:: db
-s5_aa73:: ds 12
-s5_aa7f:: ds 12
-
-s5_aa8b:: db
-s5_aa8c:: db
-s5_aa8d:: db
-s5_aa8e:: ds 7 * $cc
-
-	ds $1
-
-s5_b023:: ds 105
-s5_b08c:: ds 4
-s5_b090:: db
-s5_b091:: db
-s5_b092:: ds 31
-
-	ds $100
-
-s5_b1b1:: db
-s5_b1b2:: db
-s5_b1b3:: db
-s5_b1b4:: db
-
-	ds $1e
-
-s5_b1d3::
-
-	ds $120
-
-s5_b2f3:: db
-s5_b2f4:: ds 4
-
-	ds $1
-
-s5_b2f9:: db
-s5_b2fa:: db
-s5_b2fb:: db
-
-	ds $b49
-
-s5_be45:: db
-s5_be46:: db
-
-	ds $1b8
-
-s5_bfff:: db
-
-
-SECTION "SRAM Mobile 3", SRAM
-
-s6_a000::
-
-
-SECTION "SRAM Mobile 4", SRAM
-
-s7_a000::
-
-	ds $800
-
-s7_a800:: db
--- a/vram.asm
+++ /dev/null
@@ -1,16 +1,0 @@
-SECTION "VRAM0", VRAM
-
-vTiles0:: ds $80 tiles
-vTiles1:: ds $80 tiles
-vTiles2:: ds $80 tiles
-vBGMap0:: ds BG_MAP_WIDTH * BG_MAP_HEIGHT
-vBGMap1:: ds BG_MAP_WIDTH * BG_MAP_HEIGHT
-
-
-SECTION "VRAM1", VRAM
-
-vTiles3:: ds $80 tiles
-vTiles4:: ds $80 tiles
-vTiles5:: ds $80 tiles
-vBGMap2:: ds BG_MAP_WIDTH * BG_MAP_HEIGHT
-vBGMap3:: ds BG_MAP_WIDTH * BG_MAP_HEIGHT
--- a/wram.asm
+++ /dev/null
@@ -1,3621 +1,0 @@
-INCLUDE "constants.asm"
-
-INCLUDE "macros/wram.asm"
-
-
-INCLUDE "vram.asm"
-
-
-SECTION "Stack", WRAM0
-
-wStackBottom::
-	ds $100 - 1
-wStackTop::
-	ds 1
-
-
-SECTION "Audio RAM", WRAM0
-
-; nonzero if playing
-wMusicPlaying:: db
-
-wAudio::
-; wChannel1 - wChannel8
-for n, 1, NUM_CHANNELS + 1
-wChannel{d:n}:: channel_struct wChannel{d:n}
-endr
-
-	ds 1
-
-wCurTrackDuty:: db
-wCurTrackVolumeEnvelope:: db
-wCurTrackFrequency:: dw
-wUnusedBCDNumber:: db ; BCD value, dummied out
-wCurNoteDuration:: db ; used in MusicE0 and LoadNote
-
-wCurMusicByte:: db
-wCurChannel:: db
-wVolume::
-; corresponds to rNR50
-; Channel control / ON-OFF / Volume (R/W)
-;   bit 7 - Vin->SO2 ON/OFF
-;   bit 6-4 - SO2 output level (volume) (# 0-7)
-;   bit 3 - Vin->SO1 ON/OFF
-;   bit 2-0 - SO1 output level (volume) (# 0-7)
-	db
-wSoundOutput::
-; corresponds to rNR51
-; bit 4-7: ch1-4 so2 on/off
-; bit 0-3: ch1-4 so1 on/off
-	db
-wPitchSweep::
-; corresponds to rNR10
-; bit 7:   unused
-; bit 4-6: sweep time
-; bit 3:   sweep direction
-; but 0-2: sweep shift
-	db
-
-wMusicID:: dw
-wMusicBank:: db
-wNoiseSampleAddress:: dw
-wNoiseSampleDelay:: db
-	ds 1
-wMusicNoiseSampleSet:: db
-wSFXNoiseSampleSet:: db
-
-wLowHealthAlarm::
-; bit 7: on/off
-; bit 4: pitch
-; bit 0-3: counter
-	db
-
-wMusicFade::
-; fades volume over x frames
-; bit 7: fade in/out
-; bit 0-5: number of frames for each volume level
-; $00 = none (default)
-	db
-wMusicFadeCount:: db
-wMusicFadeID:: dw
-
-	ds 5
-
-wCryPitch:: dw
-wCryLength:: dw
-
-wLastVolume:: db
-wUnusedMusicF9Flag:: db
-
-wSFXPriority::
-; if nonzero, turn off music when playing sfx
-	db
-
-	ds 1
-
-wChannel1JumpCondition:: db
-wChannel2JumpCondition:: db
-wChannel3JumpCondition:: db
-wChannel4JumpCondition:: db
-
-wStereoPanningMask:: db
-
-wCryTracks::
-; plays only in left or right track depending on what side the monster is on
-; both tracks active outside of battle
-	db
-
-wSFXDuration:: db
-wCurSFX::
-; id of sfx currently playing
-	db
-
-wAudioEnd::
-
-wMapMusic:: db
-
-wDontPlayMapMusicOnReload:: db
-
-
-SECTION "WRAM", WRAM0
-
-wLZAddress:: dw
-wLZBank::    db
-
-	ds 1
-
-wBoxAlignment:: db
-
-wInputType::        db
-wAutoInputAddress:: dw
-wAutoInputBank::    db
-wAutoInputLength::  db
-
-wDebugFlags:: db
-wGameLogicPaused:: db
-wSpriteUpdatesEnabled:: db
-
-wUnusedScriptByte:: db
-
-wMapTimeOfDay:: db
-
-	ds 3
-
-wPrinterConnectionOpen:: db
-wPrinterOpcode:: db
-wPrevDexEntry:: db
-wDisableTextAcceleration:: db
-wPrevLandmark:: db
-wCurLandmark:: db
-wLandmarkSignTimer:: dw
-
-wLinkMode::
-; a LINK_* value for the link type
-	db
-
-wScriptVar:: db
-
-wPlayerNextMovement:: db
-wPlayerMovement:: db
-
-	ds 2
-
-wMovementObject::
-	db
-wMovementDataBank:: db
-wMovementDataAddress:: dw
-wIndexedMovement2Pointer:: dw
-
-	ds 2
-
-wMovementByteWasControlSwitch:: db
-
-UNION
-wObjectPriorities:: ds NUM_OBJECT_STRUCTS
-
-NEXTU
-wMovementPointer:: dw
-	ds 3
-wTempObjectCopyMapObjectIndex:: db
-wTempObjectCopySprite:: db
-wTempObjectCopySpriteVTile:: db
-wTempObjectCopyPalette:: db
-wTempObjectCopyMovement:: db
-wTempObjectCopyRange:: db
-wTempObjectCopyX:: db
-wTempObjectCopyY:: db
-wTempObjectCopyRadius:: db
-ENDU
-
-	ds 1
-
-wTileDown::  db
-wTileUp::    db
-wTileLeft::  db
-wTileRight:: db
-
-wTilePermissions::
-; set if tile behavior prevents
-; you from walking in that direction
-; bit 3: down
-; bit 2: up
-; bit 1: left
-; bit 0: right
-	db
-
-
-SECTION "wSpriteAnims", WRAM0
-
-UNION
-wSpriteAnimData::
-
-wSpriteAnimDict::
-; wSpriteAnimDict pairs keys with values
-; keys: SPRITE_ANIM_DICT_* indexes (taken from SpriteAnimSeqData)
-; values: vTiles0 offsets
-	ds NUM_SPRITEANIMDICT_ENTRIES * 2
-
-wSpriteAnimationStructs::
-; wSpriteAnim1 - wSpriteAnim10
-for n, 1, NUM_SPRITE_ANIM_STRUCTS + 1
-; field  0:   index
-; fields 1-3: loaded from SpriteAnimSeqData
-wSpriteAnim{d:n}:: sprite_anim_struct wSpriteAnim{d:n}
-endr
-wSpriteAnimationStructsEnd::
-
-NEXTU
-; mobile data
-wMobileWRAM::
-wMobileErrorCodeBuffer:: ds 3
-wc303:: ds 2
-wc305:: ds 1
-wc306:: ds 1
-wc307:: ds 1
-wc308:: ds 1
-wc309:: ds 1
-wc30a:: ds 1
-wc30b:: ds 1
-wc30c:: ds 1
-wc30d:: ds 1
-wc30e:: ds 1
-wc30f:: ds 1
-wc310:: ds 1
-wc311:: ds 1
-wc312:: ds 1
-wc313:: ds 1
-wc314:: ds 5
-wc319:: db
-wc31a:: db
-wc31b:: db
-wc31c:: db
-wc31d:: db
-wc31e:: db
-wc31f:: db
-wc320:: ds 38
-wc346:: ds 102
-wc3ac:: ds 8
-ENDU
-
-wSpriteAnimCount:: db
-wCurSpriteOAMAddr:: db
-
-wCurIcon:: db
-
-wCurIconTile:: db
-UNION
-wSpriteAnimID::
-wCurSpriteOAMFlags:: db
-NEXTU
-wSpriteAnimAddrBackup:: dw
-ENDU
-wCurAnimVTile:: db
-wCurAnimXCoord:: db
-wCurAnimYCoord:: db
-wCurAnimXOffset:: db
-wCurAnimYOffset:: db
-wGlobalAnimYOffset:: db
-wGlobalAnimXOffset:: db
-
-wSpriteAnimDataEnd::
-
-	ds 11
-
-; mobile data
-wc3cc:: ds 1
-wc3cd:: ds 31
-wc3ec:: ds 1
-wc3ed:: ds 1
-wc3ee:: ds 1
-wc3ef:: ds 1
-wc3f0:: ds 1
-wc3f1:: ds 1
-wc3f2:: ds 1
-wc3f3:: ds 1
-wc3f4:: ds 1
-wc3f5:: ds 1
-wc3f6:: ds 1
-wc3f7:: ds 1
-wc3f8:: ds 1
-wc3f9:: ds 1
-wc3fa:: ds 1
-wc3fb:: ds 1
-wc3fc:: ds 1
-	ds 3
-wMobileWRAMEnd::
-
-
-SECTION "Sprites", WRAM0
-
-wVirtualOAM::
-; wVirtualOAMSprite00 - wVirtualOAMSprite39
-for n, NUM_SPRITE_OAM_STRUCTS
-wVirtualOAMSprite{02d:n}:: sprite_oam_struct wVirtualOAMSprite{02d:n}
-endr
-wVirtualOAMEnd::
-
-
-SECTION "Tilemap", WRAM0
-
-wTilemap::
-; 20x18 grid of 8x8 tiles
-	ds SCREEN_WIDTH * SCREEN_HEIGHT
-wTilemapEnd::
-
-
-; This union spans 480 bytes.
-SECTION UNION "Miscellaneous", WRAM0
-
-; surrounding tiles
-; This buffer determines the size for the rest of the union;
-; it uses exactly 480 bytes.
-wSurroundingTiles:: ds SURROUNDING_WIDTH * SURROUNDING_HEIGHT
-
-
-SECTION UNION "Miscellaneous", WRAM0
-
-; box save buffer
-; SaveBoxAddress uses this buffer in three steps because it
-; needs more space than the buffer can hold.
-wBoxPartialData:: ds 480
-wBoxPartialDataEnd::
-
-
-SECTION UNION "Miscellaneous", WRAM0
-
-; battle tower temp struct
-wBT_OTTemp:: battle_tower_struct wBT_OTTemp
-
-
-SECTION UNION "Miscellaneous", WRAM0
-
-; battle data
-wBattle::
-wEnemyMoveStruct::  move_struct wEnemyMoveStruct
-wPlayerMoveStruct:: move_struct wPlayerMoveStruct
-
-wEnemyMonNickname::  ds MON_NAME_LENGTH
-wBattleMonNickname:: ds MON_NAME_LENGTH
-
-wBattleMon:: battle_struct wBattleMon
-
-	ds 2
-
-wWildMon:: db
-	ds 1
-
-wEnemyTrainerItem1:: db
-wEnemyTrainerItem2:: db
-wEnemyTrainerBaseReward:: db
-wEnemyTrainerAIFlags:: ds 3
-wOTClassName:: ds TRAINER_CLASS_NAME_LENGTH
-
-wCurOTMon:: db
-
-wBattleParticipantsNotFainted::
-; Bit array.  Bits 0 - 5 correspond to party members 1 - 6.
-; Bit set if the mon appears in battle.
-; Bit cleared if the mon faints.
-; Backed up if the enemy switches.
-; All bits cleared if the enemy faints.
-	db
-
-wTypeModifier::
-; >10: super-effective
-;  10: normal
-; <10: not very effective
-; bit 7: stab
-	db
-
-wCriticalHit::
-; 0 if not critical
-; 1 for a critical hit
-; 2 for a OHKO
-	db
-
-wAttackMissed::
-; nonzero for a miss
-	db
-
-wPlayerSubStatus1:: db
-wPlayerSubStatus2:: db
-wPlayerSubStatus3:: db
-wPlayerSubStatus4:: db
-wPlayerSubStatus5:: db
-
-wEnemySubStatus1:: db
-wEnemySubStatus2:: db
-wEnemySubStatus3:: db
-wEnemySubStatus4:: db
-wEnemySubStatus5:: db
-
-wPlayerRolloutCount:: db
-wPlayerConfuseCount:: db
-wPlayerToxicCount:: db
-wPlayerDisableCount:: db
-wPlayerEncoreCount:: db
-wPlayerPerishCount:: db
-wPlayerFuryCutterCount:: db
-wPlayerProtectCount:: db
-
-wEnemyRolloutCount:: db
-wEnemyConfuseCount:: db
-wEnemyToxicCount:: db
-wEnemyDisableCount:: db
-wEnemyEncoreCount:: db
-wEnemyPerishCount:: db
-wEnemyFuryCutterCount:: db
-wEnemyProtectCount:: db
-
-wPlayerDamageTaken:: dw
-wEnemyDamageTaken::  dw
-
-wBattleReward:: ds 3
-
-wBattleAnimParam:: db
-
-wBattleScriptBuffer:: ds 40
-
-wBattleScriptBufferAddress:: dw
-
-wTurnEnded:: db
-
-	ds 1
-
-wPlayerStats::
-wPlayerAttack::  dw
-wPlayerDefense:: dw
-wPlayerSpeed::   dw
-wPlayerSpAtk::   dw
-wPlayerSpDef::   dw
-	ds 1
-
-wEnemyStats::
-wEnemyAttack::  dw
-wEnemyDefense:: dw
-wEnemySpeed::   dw
-wEnemySpAtk::   dw
-wEnemySpDef::   dw
-	ds 1
-
-wPlayerStatLevels::
-wPlayerAtkLevel::  db
-wPlayerDefLevel::  db
-wPlayerSpdLevel::  db
-wPlayerSAtkLevel:: db
-wPlayerSDefLevel:: db
-wPlayerAccLevel::  db
-wPlayerEvaLevel::  db
-	ds 1
-
-wEnemyStatLevels::
-wEnemyAtkLevel::  db
-wEnemyDefLevel::  db
-wEnemySpdLevel::  db
-wEnemySAtkLevel:: db
-wEnemySDefLevel:: db
-wEnemyAccLevel::  db
-wEnemyEvaLevel::  db
-	ds 1
-
-wEnemyTurnsTaken::  db
-wPlayerTurnsTaken:: db
-	ds 1
-
-wPlayerSubstituteHP:: db
-wEnemySubstituteHP::  db
-
-wUnusedPlayerLockedMove:: db
-	ds 1
-
-wCurPlayerMove:: db
-wCurEnemyMove::  db
-
-wLinkBattleRNCount::
-; how far through the prng stream
-	db
-
-wEnemyItemState:: db
-	ds 2
-wCurEnemyMoveNum:: db
-
-wEnemyHPAtTimeOfPlayerSwitch:: dw
-wPayDayMoney:: ds 3
-
-wSafariMonAngerCount:: db ; unreferenced
-wSafariMonEating:: db
-	ds 1
-wEnemyBackupDVs:: dw ; used when enemy is transformed
-wAlreadyDisobeyed:: db
-
-wDisabledMove:: db
-wEnemyDisabledMove:: db
-wWhichMonFaintedFirst:: db
-
-; exists so you can't counter on switch
-wLastPlayerCounterMove:: db
-wLastEnemyCounterMove:: db
-
-wEnemyMinimized:: db
-
-wAlreadyFailed:: db
-
-wBattleParticipantsIncludingFainted:: db
-wBattleLowHealthAlarm:: db
-wPlayerMinimized:: db
-wPlayerScreens::
-; bit
-; 0 spikes
-; 1
-; 2 safeguard
-; 3 light screen
-; 4 reflect
-; 5-7 unused
-	db
-
-wEnemyScreens::
-; see wPlayerScreens
-	db
-
-wPlayerSafeguardCount:: db
-wPlayerLightScreenCount:: db
-wPlayerReflectCount:: db
-	ds 1
-
-wEnemySafeguardCount:: db
-wEnemyLightScreenCount:: db
-wEnemyReflectCount:: db
-	ds 1
-
-	ds 1
-
-wBattleWeather::
-; 00 normal
-; 01 rain
-; 02 sun
-; 03 sandstorm
-; 04 rain stopped
-; 05 sunliight faded
-; 06 sandstorm subsided
-	db
-
-wWeatherCount::
-; # turns remaining
-	db
-
-wLoweredStat:: db
-wEffectFailed:: db
-wFailedMessage:: db
-wEnemyGoesFirst:: db
-
-wPlayerIsSwitching:: db
-wEnemyIsSwitching::  db
-
-wPlayerUsedMoves::
-; add a move that has been used once by the player
-; added in order of use
-	ds NUM_MOVES
-
-wEnemyAISwitchScore:: db
-wEnemySwitchMonParam:: db
-wEnemySwitchMonIndex:: db
-wTempLevel:: db
-wLastPlayerMon:: db
-wLastPlayerMove:: db
-wLastEnemyMove:: db
-
-wPlayerFutureSightCount:: db
-wEnemyFutureSightCount:: db
-
-wGivingExperienceToExpShareHolders:: db
-
-wBackupEnemyMonBaseStats:: ds NUM_EXP_STATS
-wBackupEnemyMonCatchRate:: db
-wBackupEnemyMonBaseExp:: db
-
-wPlayerFutureSightDamage:: dw
-wEnemyFutureSightDamage:: dw
-wPlayerRageCounter:: db
-wEnemyRageCounter:: db
-
-wBeatUpHitAtLeastOnce:: db
-
-wPlayerTrappingMove:: db
-wEnemyTrappingMove:: db
-wPlayerWrapCount:: db
-wEnemyWrapCount:: db
-wPlayerCharging:: db
-wEnemyCharging:: db
-
-wBattleEnded:: db
-
-wWildMonMoves:: ds NUM_MOVES
-wWildMonPP:: ds NUM_MOVES
-
-wAmuletCoin:: db
-
-wSomeoneIsRampaging:: db
-
-wPlayerJustGotFrozen:: db
-wEnemyJustGotFrozen:: db
-wBattleEnd::
-
-
-SECTION UNION "Miscellaneous", WRAM0
-
-; link patch lists
-wPlayerPatchLists:: ds 200
-wOTPatchLists:: ds 200
-
-
-SECTION UNION "Miscellaneous", WRAM0
-
-; mobile
-wMobileTransferData:: ds 480
-
-
-SECTION UNION "Miscellaneous", WRAM0
-
-; This union spans 200 bytes.
-UNION
-; timeset temp storage
-wTimeSetBuffer::
-	ds 20
-wInitHourBuffer:: db
-	ds 9
-wInitMinuteBuffer:: db
-	ds 19
-wTimeSetBufferEnd::
-
-NEXTU
-; hall of fame temp struct
-wHallOfFameTemp:: hall_of_fame wHallOfFameTemp
-
-NEXTU
-; odd egg
-wOddEgg:: party_struct wOddEgg
-wOddEggName:: ds MON_NAME_LENGTH
-wOddEggOT:: ds NAME_LENGTH
-
-NEXTU
-; debug mon color picker
-wDebugMiddleColors::
-wDebugLightColor:: ds 2
-wDebugDarkColor::  ds 2
-	ds 6
-wDebugRedChannel::   db
-wDebugGreenChannel:: db
-wDebugBlueChannel::  db
-
-NEXTU
-; debug tileset color picker
-wDebugPalette::
-wDebugWhiteTileColor:: ds 2
-wDebugLightTileColor:: ds 2
-wDebugDarkTileColor::  ds 2
-wDebugBlackTileColor:: ds 2
-
-NEXTU
-wc608:: ds 16
-wc618:: ds 37
-wc63d:: ds 5
-wc642:: ds 5
-wc647:: ds 1
-wc648:: ds 2
-wc64a:: ds 30
-wc668:: ds 32
-wc688:: ds 2
-wc68a:: ds 30
-wc6a8:: ds 40
-ENDU
-
-; This union spans 280 bytes.
-UNION
-; pokedex
-wPokedexDataStart::
-wPokedexOrder:: ds $100 ; >= NUM_POKEMON
-wPokedexOrderEnd::
-wDexListingScrollOffset:: db ; offset of the first displayed entry from the start
-wDexListingCursor:: db ; Dex cursor
-wDexListingEnd:: db ; Last mon to display
-wDexListingHeight:: db ; number of entries displayed at once in the dex listing
-wCurDexMode:: db ; Pokedex Mode
-wDexSearchMonType1:: db ; first type to search
-wDexSearchMonType2:: db ; second type to search
-wDexSearchResultCount:: db
-wDexArrowCursorPosIndex:: db
-wDexArrowCursorDelayCounter:: db
-wDexArrowCursorBlinkCounter:: db
-wDexSearchSlowpokeFrame:: db
-wUnlockedUnownMode:: db
-wDexCurUnownIndex:: db
-wDexUnownCount:: db
-wDexConvertedMonType:: db ; mon type converted from dex search mon type
-wDexListingScrollOffsetBackup:: db
-wDexListingCursorBackup:: db
-wBackupDexListingCursor:: db
-wBackupDexListingPage:: db
-wDexCurLocation:: db
-if DEF(_CRYSTAL11)
-wPokedexStatus:: db
-wPokedexDataEnd::
-else
-wPokedexDataEnd:: ds 1
-endc
-	ds 2
-
-NEXTU
-; pokegear
-wPokegearPhoneDisplayPosition:: db
-wPokegearPhoneCursorPosition:: db
-wPokegearPhoneScrollPosition:: db
-wPokegearPhoneSelectedPerson:: db
-wPokegearPhoneSubmenuCursor:: db
-wPokegearMapCursorObjectPointer:: dw
-wPokegearMapCursorLandmark:: db
-wPokegearMapPlayerIconLandmark:: db
-wPokegearRadioChannelBank:: db
-wPokegearRadioChannelAddr:: dw
-wPokegearRadioMusicPlaying:: db
-
-NEXTU
-; trade
-wPlayerTrademon:: trademon wPlayerTrademon
-wOTTrademon::     trademon wOTTrademon
-wTradeAnimAddress:: dw
-wLinkPlayer1Name:: ds NAME_LENGTH
-wLinkPlayer2Name:: ds NAME_LENGTH
-wLinkTradeSendmonSpecies:: db
-wLinkTradeGetmonSpecies::  db
-
-NEXTU
-; naming screen
-wNamingScreenDestinationPointer:: dw
-wNamingScreenCurNameLength:: db
-wNamingScreenMaxNameLength:: db
-wNamingScreenType:: db
-wNamingScreenCursorObjectPointer:: dw
-wNamingScreenLastCharacter:: db
-wNamingScreenStringEntryCoord:: dw
-
-NEXTU
-; slot machine
-wSlots::
-wReel1:: slot_reel wReel1
-wReel2:: slot_reel wReel2
-wReel3:: slot_reel wReel3
-wReel1Stopped:: ds 3
-wReel2Stopped:: ds 3
-wReel3Stopped:: ds 3
-wSlotBias:: db
-wSlotBet:: db
-wFirstTwoReelsMatching:: db
-wFirstTwoReelsMatchingSevens:: db
-wSlotMatched:: db
-wCurReelStopped:: ds 3
-wPayout:: dw
-wCurReelXCoord:: db
-wCurReelYCoord:: db
-	ds 2
-wSlotBuildingMatch:: db
-wSlotsDataEnd::
-	ds 28
-wSlotsEnd::
-
-NEXTU
-; card flip
-wDeck:: ds 4 * 6
-wDeckEnd::
-wCardFlipNumCardsPlayed:: db
-wCardFlipFaceUpCard:: db
-wDiscardPile:: ds 4 * 6
-wDiscardPileEnd::
-
-; beta poker game
-wBetaPokerSGBPals:: dw
-	ds 1
-wBetaPokerSGBAttr:: db
-wBetaPokerSGBCol:: db
-wBetaPokerSGBRow:: db
-
-NEXTU
-; unused memory game
-wMemoryGameCards:: ds 9 * 5
-wMemoryGameCardsEnd::
-wMemoryGameLastCardPicked:: db
-wMemoryGameCard1:: db
-wMemoryGameCard2:: db
-wMemoryGameCard1Location:: db
-wMemoryGameCard2Location:: db
-wMemoryGameNumberTriesRemaining:: db
-wMemoryGameLastMatches:: ds 5
-wMemoryGameCounter:: db
-wMemoryGameNumCardsMatched:: db
-
-NEXTU
-; unown puzzle
-wPuzzlePieces:: ds 6 * 6
-
-NEXTU
-; mobile data
-wc6d0:: ds 56
-wc708:: db
-wc709:: db
-wc70a:: db
-wc70b:: db
-wc70c:: db
-wc70d:: db
-wc70e:: db
-wc70f:: db
-wc710:: db
-wc711:: db
-wc712:: ds 7
-wc719:: ds 53
-wc74e:: ds 107
-wc7b9:: ds 1
-wc7ba:: ds 1
-wc7bb:: ds 2
-wc7bd:: ds 19
-wc7d0:: ds 1
-wc7d1:: ds 1
-wc7d2:: ds 1
-wc7d3:: ds 2
-ENDU
-
-
-SECTION "Unused Map Buffer", WRAM0
-
-; This was a buffer for map-related pointers in the 1997 G/S prototype.
-; See wMapBuffer in pokegold-spaceworld's wram.asm.
-wUnusedMapBuffer:: ds 24
-wUnusedMapBufferEnd::
-
-
-SECTION UNION "Overworld Map", WRAM0
-
-; overworld map blocks
-wOverworldMapBlocks:: ds 1300
-wOverworldMapBlocksEnd::
-
-
-SECTION UNION "Overworld Map", WRAM0
-
-; GB Printer data
-wGameboyPrinterRAM::
-wGameboyPrinter2bppSource:: ds 40 tiles
-wGameboyPrinter2bppSourceEnd::
-wUnusedGameboyPrinterSafeCancelFlag:: db
-wPrinterRowIndex:: db
-
-; Printer data
-wPrinterData:: ds 4
-wPrinterChecksum:: dw
-wPrinterHandshake:: db
-wPrinterStatusFlags::
-; bit 7: set if error 1 (battery low)
-; bit 6: set if error 4 (too hot or cold)
-; bit 5: set if error 3 (paper jammed or empty)
-; if this and the previous byte are both $ff: error 2 (connection error)
-	db
-
-wHandshakeFrameDelay:: db
-wPrinterSerialFrameDelay:: db
-wPrinterSendByteOffset:: dw
-wPrinterSendByteCounter:: dw
-
-; tilemap backup?
-wPrinterTilemapBuffer:: ds SCREEN_HEIGHT * SCREEN_WIDTH
-wPrinterStatus:: db
-	ds 1
-; High nibble is for margin before the image, low nibble is for after.
-wPrinterMargins:: db
-wPrinterExposureTime:: db
-	ds 16
-wGameboyPrinterRAMEnd::
-
-
-SECTION UNION "Overworld Map", WRAM0
-
-; bill's pc data
-wBillsPCData::
-wBillsPCPokemonList::
-; (species, box number, list index) x30
-	ds 3 * 30
-	ds 720
-wBillsPC_ScrollPosition:: db
-wBillsPC_CursorPosition:: db
-wBillsPC_NumMonsInBox:: db
-wBillsPC_NumMonsOnScreen:: db
-wBillsPC_LoadedBox:: db ; 0 if party, 1 - 14 if box, 15 if active box
-wBillsPC_BackupScrollPosition:: db
-wBillsPC_BackupCursorPosition:: db
-wBillsPC_BackupLoadedBox:: db
-wBillsPC_MonHasMail:: db
-	ds 5
-wBillsPCDataEnd::
-
-
-SECTION UNION "Overworld Map", WRAM0
-
-; Hall of Fame data
-wHallOfFamePokemonList:: hall_of_fame wHallOfFamePokemonList
-
-
-SECTION UNION "Overworld Map", WRAM0
-
-; debug color picker
-wDebugOriginalColors:: ds 256 * 4
-
-
-SECTION UNION "Overworld Map", WRAM0
-
-; raw link data
-wLinkData:: ds 1300
-wLinkDataEnd::
-
-
-SECTION UNION "Overworld Map", WRAM0
-
-; link data members
-wLinkPlayerName:: ds NAME_LENGTH
-wLinkPartyCount:: db
-wLinkPartySpecies:: ds PARTY_LENGTH
-wLinkPartyEnd:: db ; older code doesn't check PartyCount
-
-UNION
-; link player data
-wLinkPlayerData::
-; wLinkPlayerPartyMon1 - wLinkPlayerPartyMon6
-for n, 1, PARTY_LENGTH + 1
-wLinkPlayerPartyMon{d:n}:: party_struct wLinkPlayerPartyMon{d:n}
-endr
-
-wLinkPlayerPartyMonOTs::
-; wLinkPlayerPartyMon1OT - wLinkPlayerPartyMon6OT
-for n, 1, PARTY_LENGTH + 1
-wLinkPlayerPartyMon{d:n}OT:: ds NAME_LENGTH
-endr
-
-wLinkPlayerPartyMonNicknames::
-; wLinkPlayerPartyMon1Nickname - wLinkPlayerPartyMon6Nickname
-for n, 1, PARTY_LENGTH + 1
-wLinkPlayerPartyMon{d:n}Nickname:: ds MON_NAME_LENGTH
-endr
-
-NEXTU
-; time capsule party data
-wTimeCapsulePlayerData::
-; wTimeCapsulePartyMon1 - wTimeCapsulePartyMon6
-for n, 1, PARTY_LENGTH + 1
-wTimeCapsulePartyMon{d:n}:: red_party_struct wTimeCapsulePartyMon{d:n}
-endr
-
-wTimeCapsulePartyMonOTs::
-; wTimeCapsulePartyMon1OT - wTimeCapsulePartyMon6OT
-for n, 1, PARTY_LENGTH + 1
-wTimeCapsulePartyMon{d:n}OT:: ds NAME_LENGTH
-endr
-
-wTimeCapsulePartyMonNicknames::
-; wTimeCapsulePartyMon1Nickname - wTimeCapsulePartyMon6Nickname
-for n, 1, PARTY_LENGTH + 1
-wTimeCapsulePartyMon{d:n}Nickname:: ds MON_NAME_LENGTH
-endr
-
-NEXTU
-; link patch lists
-wLinkPatchList1:: ds SERIAL_PATCH_LIST_LENGTH
-wLinkPatchList2:: ds SERIAL_PATCH_LIST_LENGTH
-ENDU
-
-
-SECTION UNION "Overworld Map", WRAM0
-
-; link data prep
-	ds 1000
-wCurLinkOTPartyMonTypePointer:: dw
-
-wLinkOTPartyMonTypes::
-; wLinkOTPartyMon1Type - wLinkOTPartyMon6Type
-for n, 1, PARTY_LENGTH + 1
-wLinkOTPartyMon{d:n}Type:: dw
-endr
-
-
-SECTION UNION "Overworld Map", WRAM0
-
-; link mail data
-	ds 500
-wLinkPlayerMail::
-wLinkPlayerMailPreamble:: ds SERIAL_MAIL_PREAMBLE_LENGTH
-wLinkPlayerMailMessages:: ds (MAIL_MSG_LENGTH + 1) * PARTY_LENGTH
-wLinkPlayerMailMetadata:: ds (MAIL_STRUCT_LENGTH - (MAIL_MSG_LENGTH + 1)) * PARTY_LENGTH
-wLinkPlayerMailPatchSet:: ds 103
-wLinkPlayerMailEnd::
-	ds 10
-wLinkOTMail::
-wLinkOTMailMessages:: ds (MAIL_MSG_LENGTH + 1) * PARTY_LENGTH
-wLinkOTMailMetadata:: ds (MAIL_STRUCT_LENGTH - (MAIL_MSG_LENGTH + 1)) * PARTY_LENGTH
-wOTPlayerMailPatchSet:: ds 103 + SERIAL_MAIL_PREAMBLE_LENGTH
-wLinkOTMailEnd::
-	ds 10
-
-
-SECTION UNION "Overworld Map", WRAM0
-
-; received link mail data
-	ds 500
-wLinkReceivedMail:: ds MAIL_STRUCT_LENGTH * PARTY_LENGTH
-wLinkReceivedMailEnd:: db
-
-
-SECTION UNION "Overworld Map", WRAM0
-
-; mystery gift data
-wMysteryGiftStaging:: ds 80
-
-UNION
-wMysteryGiftTrainer:: ds 1 + (1 + 1 + NUM_MOVES) * PARTY_LENGTH + 1
-wMysteryGiftTrainerEnd::
-
-NEXTU
-wNameCardData:: ds NAME_LENGTH + 2 + 2 + 1 + 8 + 12
-wNameCardDataEnd::
-
-NEXTU
-wMysteryGiftCardHolderName:: ds PLAYER_NAME_LENGTH
-ENDU
-
-	ds 138
-
-wMysteryGiftPartnerData::
-wMysteryGiftGameVersion:: db
-wMysteryGiftPartnerID:: dw
-wMysteryGiftPartnerName:: ds NAME_LENGTH
-wMysteryGiftPartnerDexCaught:: db
-wMysteryGiftPartnerSentDeco:: db
-wMysteryGiftPartnerWhichItem:: db
-wMysteryGiftPartnerWhichDeco:: db
-wMysteryGiftPartnerBackupItem:: db
-	ds 1
-wMysteryGiftPartnerDataEnd::
-
-	ds 60
-
-wMysteryGiftPlayerData::
-	ds 1
-wMysteryGiftPlayerID:: dw
-wMysteryGiftPlayerName:: ds NAME_LENGTH
-wMysteryGiftPlayerDexCaught:: db
-wMysteryGiftPlayerSentDeco:: db
-wMysteryGiftPlayerWhichItem:: db
-wMysteryGiftPlayerWhichDeco:: db
-wMysteryGiftPlayerBackupItem:: db
-	ds 1
-wMysteryGiftPlayerDataEnd::
-
-
-SECTION UNION "Overworld Map", WRAM0
-
-	ds $200
-
-; mystery gift data
-wUnusedMysteryGiftStagedDataLength:: db
-wMysteryGiftMessageCount:: db
-wMysteryGiftStagedDataLength:: db
-
-
-SECTION UNION "Overworld Map", WRAM0
-
-	ds $200
-
-; blank credits tile buffer
-wCreditsBlankFrame2bpp:: ds 4 * 4 tiles
-wCreditsBlankFrame2bppEnd::
-
-
-SECTION UNION "Overworld Map", WRAM0
-
-; mobile
-wc800:: db
-wc801:: db
-wc802:: db
-wc803:: db
-wc804:: db
-wc805:: db
-wc806:: db
-wc807:: db
-wc808:: dw
-wc80a:: db
-wc80b:: db
-wc80c:: dw
-wc80e:: db
-wc80f:: db
-wc810:: db
-wc811:: db
-wMobileSDK_PacketChecksum:: dw
-wc814:: db
-wc815:: db
-wc816:: dw
-wMobileSDK_AdapterType:: db
-wc819:: db
-wc81a:: db
-wc81b:: db
-wc81c:: db
-wc81d:: db
-wMobileSDK_SendCommandID:: db
-wc81f:: db
-wc820:: db
-wc821:: db
-wc822:: db
-wc823:: ds 4
-wc827:: dw
-wc829:: db
-wc82a:: db
-wc82b:: db
-wc82c:: db
-wc82d:: db
-wc82e:: db
-wc82f:: ds 3
-wc832:: db
-wc833:: db
-wc834:: db
-wc835:: db
-wc836:: ds 8
-wc83e:: ds 20
-wc852:: ds 20
-wc866:: ds 4
-wc86a:: db
-wc86b:: db
-wc86c:: db
-wc86d:: db
-wc86e:: db
-wc86f:: db
-wc870:: db
-wc871:: db
-wc872:: db
-wc873:: db
-wc874:: db
-wc875:: db
-wc876:: db
-wc877:: db
-wc878:: dw
-wc87a:: db
-wc87b:: db
-wc87c:: db
-wc87d:: db
-wc87e:: db
-wc87f:: db
-wc880:: db
-wc881:: db
-wc882:: db
-wc883:: db
-wc884:: ds 8
-wc88c:: ds 32
-wc8ac:: ds 26
-wc8c6:: db
-wc8c7:: db
-wc8c8:: db
-wc8c9:: db
-wc8ca:: ds 44
-wc8f6:: ds 8
-wc8fe:: db
-wc8ff:: ds 15
-wc90e:: ds 8
-wc916:: ds 16
-wc926:: ds 8
-wc92e:: ds 75
-wc979:: db
-wc97a:: ds 5
-wc97f:: db
-wc980:: db
-wc981:: db
-wc982:: db
-wc983:: dw
-wc985:: db
-wc986:: db
-wc987:: db
-wMobileAPIIndex:: db
-wc989:: db
-wc98a:: db
-wc98b:: db
-wc98c:: db
-wc98d:: db
-wc98e:: db
-wc98f:: db
-wc990:: db
-wc991:: db
-wc992:: db
-wc993:: db
-wc994:: db
-wc995:: ds 16
-wc9a5:: ds 5
-wc9aa:: db
-wc9ab:: db
-wc9ac:: db
-wc9ad:: db
-wc9ae:: db
-wc9af:: dw
-wc9b1:: db
-wc9b2:: ds 3
-wc9b5:: db
-wc9b6:: ds 121
-
-wMobileSDK_ReceivePacketBufferAlt:: ds 11
-wMobileSDK_ReceivedBytes:: dw
-wMobileSDK_ReceivePacketBuffer:: ds 250
-wcb36:: db
-	ds 16
-wMobileSDK_PacketBuffer:: ds 281
-wcc60:: ds 1
-wcc61:: ds 1
-wcc62:: ds 2
-wcc64:: ds 1
-wcc65:: ds 57
-	ds 22
-wccb4:: ds 1
-wccb5:: ds 3
-wccb8:: ds 1
-wccb9:: ds 1
-wccba:: ds 90
-
-
-if DEF(_DEBUG)
-SECTION UNION "Overworld Map", WRAM0
-
-; debug room RTC values
-wDebugRoomRTCSec::  db
-wDebugRoomRTCMin::  db
-wDebugRoomRTCHour:: db
-wDebugRoomRTCDay::  dw
-wDebugRoomRTCCurSec::  db
-wDebugRoomRTCCurMin::  db
-wDebugRoomRTCCurHour:: db
-wDebugRoomRTCCurDay::  dw
-
-; debug room paged values
-wDebugRoomCurPage::        db
-wDebugRoomCurValue::       db
-wDebugRoomAFunction::      dw
-wDebugRoomStartFunction::  dw
-wDebugRoomSelectFunction:: dw
-wDebugRoomAutoFunction::   dw
-wDebugRoomPageCount::      db
-wDebugRoomPagesPointer::   dw
-
-wDebugRoomROMChecksum:: dw
-wDebugRoomCurChecksumBank:: db
-
-UNION
-; debug room new item values
-wDebugRoomItemID::       db
-wDebugRoomItemQuantity:: db
-NEXTU
-; debug room new pokemon values
-wDebugRoomMon::    box_struct wDebugRoomMon
-wDebugRoomMonBox:: db
-NEXTU
-; debug room GB ID values
-wDebugRoomGBID:: dw
-ENDU
-
-endc
-
-
-SECTION "Video", WRAM0
-
-UNION
-; bg map
-wBGMapBuffer::    ds 40
-wBGMapPalBuffer:: ds 40
-wBGMapBufferPointers:: ds 20 * 2
-wBGMapBufferEnd::
-
-NEXTU
-; credits
-wCreditsPos:: dw
-wCreditsTimer:: db
-
-NEXTU
-; mobile data
-wMobileMonSpeciesPointer:: dw
-wMobileMonStructPointer:: dw
-wMobileMonOTPointer:: dw
-wMobileMonNicknamePointer:: dw
-wMobileMonMailPointer:: dw
-
-NEXTU
-; more mobile data
-wcd20:: ds 1
-wcd21:: ds 1
-wcd22:: ds 1
-wcd23:: ds 1
-wcd24:: ds 1
-wMobileCommsJumptableIndex:: ds 1
-wcd26:: ds 1
-wcd27:: ds 1
-wcd28:: ds 1
-wcd29:: ds 1
-
-wMobileMonSpecies::
-wcd2a:: db
-
-UNION
-wTempOddEggNickname:: ds MON_NAME_LENGTH
-NEXTU
-wcd2b:: ds 1
-wcd2c:: ds 1
-wcd2d:: ds 1
-wcd2e:: ds 1
-wcd2f:: ds 1
-wcd30:: ds 1
-wcd31:: ds 1
-wcd32:: ds 1
-wcd33:: ds 1
-wcd34:: ds 1
-wcd35:: ds 1
-ENDU
-
-; current time for link/mobile?
-wcd36:: db ; hours
-wcd37:: db ; mins
-wcd38:: db ; secs
-
-wcd39:: ds 1
-wcd3a:: ds 1
-wcd3b:: ds 1
-wBattleTowerRoomMenu2JumptableIndex:: ds 1
-wcd3d:: ds 1
-wcd3e:: ds 1
-wcd3f:: ds 1
-wcd40:: ds 1
-wcd41:: ds 1
-wcd42:: ds 1
-wcd43:: ds 1
-
-; some sort of timer in link battles
-wMobileInactivityTimerMinutes:: db ; mins
-wMobileInactivityTimerSeconds:: db ; secs
-wMobileInactivityTimerFrames:: db ; frames
-wcd47:: ds 1
-
-	ds 1
-
-wBTTempOTSprite::
-wcd49:: db
-
-wcd4a:: ds 1
-wcd4b:: ds 1
-
-wEZChatCursorXCoord::
-wcd4c:: db
-wEZChatCursorYCoord::
-wcd4d:: db
-
-wcd4e:: ds 1
-wcd4f:: ds 1
-wcd50:: ds 1
-wcd51:: ds 1
-wcd52:: ds 1
-
-wMobileOpponentBattleMessage:: ; ds 12
-wcd53:: ds 1
-wcd54:: ds 1
-wcd55:: ds 1
-wcd56:: ds 1
-wcd57:: ds 1
-wcd58:: ds 1
-wcd59:: ds 1
-wcd5a:: ds 1
-wcd5b:: ds 1
-wcd5c:: ds 1
-wcd5d:: ds 1
-wcd5e:: ds 1
-wcd5f:: ds 1
-wcd60:: ds 2
-wcd62:: ds 1
-wcd63:: ds 1
-wcd64:: ds 1
-wcd65:: ds 1
-wcd66:: ds 1
-wcd67:: ds 1
-wcd68:: ds 1
-wcd69:: ds 1
-wcd6a:: ds 1
-wcd6b:: ds 1
-wcd6c:: ds 1
-wcd6d:: ds 1
-wcd6e:: ds 1
-wcd6f:: ds 1
-wcd70:: ds 1
-wcd71:: ds 1
-wcd72:: ds 1
-wcd73:: ds 1
-wcd74:: ds 1
-
-wOTMonSelection:: ds 2 ; ds BATTLETOWER_PARTY_LENGTH
-wcd77:: ds 1
-
-wMobileCrashCheckPointer:: dw
-wcd7a:: ds 2
-wcd7c:: ds 3
-wcd7f:: ds 1
-wcd80:: ds 1
-wcd81:: ds 1
-wcd82:: ds 1
-wcd83:: ds 1
-wcd84:: ds 1
-wcd85:: ds 4
-wcd89:: ds 1
-wcd8a:: ds 1
-wcd8b:: ds 1
-wcd8c:: ds 1
-wcd8d:: ds 11
-ENDU
-
-wDefaultSGBLayout:: db
-
-wPlayerHPPal:: db
-wEnemyHPPal:: db
-
-wHPPals:: ds PARTY_LENGTH
-wCurHPPal:: db
-
-	ds 7
-
-wSGBPals:: ds 48
-
-wAttrmap::
-; 20x18 grid of bg tile attributes for 8x8 tiles
-; read horizontally from the top row
-;		bit 7: priority
-;		bit 6: y flip
-;		bit 5: x flip
-;		bit 4: pal # (non-cgb)
-;		bit 3: vram bank (cgb only)
-;		bit 2-0: pal # (cgb only)
-	ds SCREEN_WIDTH * SCREEN_HEIGHT
-wAttrmapEnd::
-
-UNION
-; addresses dealing with serial comms
-	ds 1
-wcf42:: db
-	ds 1
-wcf44:: db
-wcf45:: db
-
-NEXTU
-wTileAnimBuffer:: ds 1 tiles
-ENDU
-
-; link data
-UNION
-wOtherPlayerLinkMode:: db
-wOtherPlayerLinkAction:: db
-	ds 3
-wPlayerLinkAction:: db
-wUnusedLinkAction:: db
-	ds 3
-NEXTU
-wLinkReceivedSyncBuffer:: ds 5
-wLinkPlayerSyncBuffer:: ds 5
-ENDU
-wLinkTimeoutFrames:: dw
-wLinkByteTimeout:: dw
-
-wMonType:: db
-
-wCurSpecies:: db
-
-wNamedObjectType:: db
-
-	ds 1
-
-wJumptableIndex::
-wBattleTowerBattleEnded::
-	db
-
-UNION
-; intro data
-wIntroSceneFrameCounter:: db
-wIntroSceneTimer:: db
-
-NEXTU
-; title data
-wTitleScreenSelectedOption:: db
-wTitleScreenTimer:: dw
-
-NEXTU
-; credits data
-wCreditsBorderFrame:: db
-wCreditsBorderMon:: db
-wCreditsLYOverride:: db
-
-NEXTU
-; pokedex
-wPrevDexEntryJumptableIndex:: db
-if DEF(_CRYSTAL11)
-wPrevDexEntryBackup:: db
-else
-wPrevDexEntryBackup::
-wPokedexStatus:: db
-endc
-wUnusedPokedexByte:: db
-
-NEXTU
-; pokegear
-wPokegearCard:: db
-wPokegearMapRegion:: db
-wUnusedPokegearByte:: db
-
-NEXTU
-; pack
-wPackJumptableIndex:: db
-wCurPocket:: db
-wPackUsedItem:: db
-
-NEXTU
-; trainer card badges
-wTrainerCardBadgeFrameCounter:: db
-wTrainerCardBadgeTileID:: db
-wTrainerCardBadgeAttributes:: db
-
-NEXTU
-; slot machine
-wSlotsDelay:: db
-	ds 1
-wUnusedSlotReelIconDelay:: db
-
-NEXTU
-; card flip
-wCardFlipCursorY:: db
-wCardFlipCursorX:: db
-wCardFlipWhichCard:: db
-
-NEXTU
-; unused memory game
-wMemoryGameCardChoice:: db
-
-NEXTU
-; magnet train
-wMagnetTrainOffset:: db
-wMagnetTrainPosition:: db
-wMagnetTrainWaitCounter:: db
-
-NEXTU
-; unown puzzle data
-wHoldingUnownPuzzlePiece:: db
-wUnownPuzzleCursorPosition:: db
-wUnownPuzzleHeldPiece:: db
-
-NEXTU
-; battle transitions
-wBattleTransitionCounter:: db
-wBattleTransitionSineWaveOffset::
-wBattleTransitionSpinQuadrant:: db
-
-NEXTU
-; bill's pc
-wUnusedBillsPCData:: ds 3
-
-NEXTU
-; debug mon color picker
-wDebugColorRGBJumptableIndex:: db
-wDebugColorCurColor:: db
-wDebugColorCurMon:: db
-
-NEXTU
-; debug tileset color picker
-wDebugTilesetCurPalette:: db
-wDebugTilesetRGBJumptableIndex:: db
-wDebugTilesetCurColor:: db
-
-NEXTU
-; stats screen
-wStatsScreenFlags:: db
-
-NEXTU
-; battle tower
-wNrOfBeatenBattleTowerTrainers:: db
-	ds 1
-wBattleTowerRoomMenuJumptableIndex:: db
-
-NEXTU
-; miscellaneous
-wFrameCounter::
-wMomBankDigitCursorPosition::
-wNamingScreenLetterCase::
-wHallOfFameMonCounter::
-wTradeDialog::
-	db
-wFrameCounter2::
-wPrinterQueueLength::
-wUnusedSGB1eColorOffset::
-	db
-wUnusedTradeAnimPlayEvolutionMusic:: db
-
-NEXTU
-; mobile
-wcf64:: db
-wcf65:: db
-wcf66:: db
-ENDU
-
-wRequested2bppSize:: db
-wRequested2bppSource:: dw
-wRequested2bppDest:: dw
-
-wRequested1bppSize:: db
-wRequested1bppSource:: dw
-wRequested1bppDest:: dw
-
-wMenuMetadata::
-wWindowStackPointer:: dw
-wMenuJoypad:: db
-wMenuSelection:: db
-wMenuSelectionQuantity:: db
-wWhichIndexSet:: db
-wScrollingMenuCursorPosition:: db
-wWindowStackSize:: db
-	ds 8
-wMenuMetadataEnd::
-
-; menu header
-wMenuHeader::
-wMenuFlags:: db
-wMenuBorderTopCoord:: db
-wMenuBorderLeftCoord:: db
-wMenuBorderBottomCoord:: db
-wMenuBorderRightCoord:: db
-wMenuDataPointer:: dw
-wMenuCursorPosition:: db
-	ds 1
-wMenuDataBank:: db
-	ds 6
-wMenuHeaderEnd::
-
-wMenuData::
-wMenuDataFlags:: db
-
-UNION
-; Vertical Menu/DoNthMenu/SetUpMenu
-wMenuDataItems:: db
-wMenuDataIndicesPointer:: dw
-wMenuDataDisplayFunctionPointer:: dw
-wMenuDataPointerTableAddr:: dw
-
-NEXTU
-; 2D Menu
-wMenuData_2DMenuDimensions:: db
-wMenuData_2DMenuSpacing:: db
-wMenuData_2DMenuItemStringsBank:: db
-wMenuData_2DMenuItemStringsAddr:: dw
-wMenuData_2DMenuFunctionBank:: db
-wMenuData_2DMenuFunctionAddr:: dw
-
-NEXTU
-; Scrolling Menu
-wMenuData_ScrollingMenuHeight:: db
-wMenuData_ScrollingMenuWidth:: db
-wMenuData_ScrollingMenuItemFormat:: db
-wMenuData_ItemsPointerBank:: db
-wMenuData_ItemsPointerAddr:: dw
-wMenuData_ScrollingMenuFunction1:: ds 3
-wMenuData_ScrollingMenuFunction2:: ds 3
-wMenuData_ScrollingMenuFunction3:: ds 3
-ENDU
-wMenuDataEnd::
-
-wMoreMenuData::
-w2DMenuData::
-w2DMenuCursorInitY:: db
-w2DMenuCursorInitX:: db
-w2DMenuNumRows:: db
-w2DMenuNumCols:: db
-w2DMenuFlags1::
-; bit 7: Disable checking of wMenuJoypadFilter
-; bit 6: Enable sprite animations
-; bit 5: Wrap around vertically
-; bit 4: Wrap around horizontally
-; bit 3: Set bit 7 in w2DMenuFlags2 and exit the loop if bit 5 is disabled and we tried to go too far down
-; bit 2: Set bit 7 in w2DMenuFlags2 and exit the loop if bit 5 is disabled and we tried to go too far up
-; bit 1: Set bit 7 in w2DMenuFlags2 and exit the loop if bit 4 is disabled and we tried to go too far left
-; bit 0: Set bit 7 in w2DMenuFlags2 and exit the loop if bit 4 is disabled and we tried to go too far right
-	db
-w2DMenuFlags2:: db
-w2DMenuCursorOffsets:: db
-wMenuJoypadFilter:: db
-w2DMenuDataEnd::
-
-wMenuCursorY:: db
-wMenuCursorX:: db
-wCursorOffCharacter:: db
-wCursorCurrentTile:: dw
-	ds 3
-wMoreMenuDataEnd::
-
-wOverworldDelay:: db
-wTextDelayFrames:: db
-wVBlankOccurred:: db
-
-wPredefID:: db
-wPredefHL:: dw
-wPredefAddress:: dw
-wFarCallBC:: dw
-
-wUnusedLinkCommunicationByte:: db
-
-wGameTimerPaused::
-; bit 0: game timer paused
-; bit 7: something mobile
-	db
-
-	ds 1
-
-wJoypadDisable::
-; bits 4, 6, or 7 can be used to disable joypad input
-; bit 4
-; bit 6: ongoing mon faint animation
-; bit 7: ongoing sgb data transfer
-	db
-
-	ds 1
-
-wInBattleTowerBattle::
-; 0 not in BattleTower-Battle
-; 1 BattleTower-Battle
-	db
-
-	ds 1
-
-wFXAnimID:: dw
-
-wPlaceBallsX:: db
-wPlaceBallsY:: db
-
-wTileAnimationTimer:: db
-
-; palette backups?
-wBGP:: db
-wOBP0:: db
-wOBP1:: db
-
-wNumHits:: db
-
-	ds 1
-
-wOptions::
-; bit 0-2: number of frames to delay when printing text
-;   fast 1; mid 3; slow 5
-; bit 3: ?
-; bit 4: no text delay
-; bit 5: stereo off/on
-; bit 6: battle style shift/set
-; bit 7: battle scene off/on
-	db
-wSaveFileExists:: db
-wTextboxFrame::
-; bits 0-2: textbox frame 0-7
-	db
-wTextboxFlags::
-; bit 0: 1-frame text delay
-; bit 4: no text delay
-	db
-wGBPrinterBrightness::
-; bit 0-6: brightness
-;   lightest: $00
-;   lighter:  $20
-;   normal:   $40 (default)
-;   darker:   $60
-;   darkest:  $7F
-	db
-wOptions2::
-; bit 1: menu account off/on
-	db
-	ds 2
-wOptionsEnd::
-
-; Time buffer, for counting the amount of time since
-; an event began.
-wSecondsSince:: db
-wMinutesSince:: db
-wHoursSince:: db
-wDaysSince:: db
-
-
-SECTION "WRAM 1", WRAMX
-
-wGBCOnlyDecompressBuffer:: ; a $540-byte buffer that continues past this SECTION
-
-wBetaTitleSequenceOpeningType::
-; This selected the title screen animation (fire/notes) in pokegold-spaceworld.
-	db
-
-wDefaultSpawnpoint:: db
-
-
-SECTION UNION "Miscellaneous WRAM 1", WRAMX
-
-; mon buffer
-wBufferMonNickname:: ds MON_NAME_LENGTH
-wBufferMonOT:: ds NAME_LENGTH
-wBufferMon:: party_struct wBufferMon
-	ds 8
-wMonOrItemNameBuffer:: ds NAME_LENGTH
-	ds NAME_LENGTH
-
-
-SECTION UNION "Miscellaneous WRAM 1", WRAMX
-
-; poke seer
-wSeerAction:: db
-wSeerNickname:: ds MON_NAME_LENGTH
-wSeerCaughtLocation:: ds 17
-wSeerTimeOfDay:: ds NAME_LENGTH
-wSeerOT:: ds NAME_LENGTH
-wSeerOTGrammar:: db
-wSeerCaughtLevelString:: ds 4
-wSeerCaughtLevel:: db
-wSeerCaughtData:: db
-wSeerCaughtGender:: db
-
-
-SECTION UNION "Miscellaneous WRAM 1", WRAMX
-
-; mail temp storage
-wTempMail:: mailmsg wTempMail
-
-
-SECTION UNION "Miscellaneous WRAM 1", WRAMX
-
-; bug-catching contest
-wBugContestResults::
-	bugcontestwinner wBugContestFirstPlace
-	bugcontestwinner wBugContestSecondPlace
-	bugcontestwinner wBugContestThirdPlace
-wBugContestWinnersEnd::
-	bugcontestwinner wBugContestTemp
-	ds 4
-wBugContestWinnerName:: ds NAME_LENGTH
-
-
-SECTION UNION "Miscellaneous WRAM 1", WRAMX
-
-; mart items
-wMartItem1BCD:: ds 3
-wMartItem2BCD:: ds 3
-wMartItem3BCD:: ds 3
-wMartItem4BCD:: ds 3
-wMartItem5BCD:: ds 3
-wMartItem6BCD:: ds 3
-wMartItem7BCD:: ds 3
-wMartItem8BCD:: ds 3
-wMartItem9BCD:: ds 3
-wMartItem10BCD:: ds 3
-
-
-SECTION UNION "Miscellaneous WRAM 1", WRAMX
-
-; town map data
-wTownMapPlayerIconLandmark:: db
-UNION
-wTownMapCursorLandmark:: db
-wTownMapCursorObjectPointer:: dw
-NEXTU
-wTownMapCursorCoordinates:: dw
-wStartFlypoint:: db
-wEndFlypoint:: db
-ENDU
-
-
-SECTION UNION "Miscellaneous WRAM 1", WRAMX
-
-; phone call data
-wPhoneScriptBank:: db
-wPhoneCaller:: dw
-
-
-SECTION UNION "Miscellaneous WRAM 1", WRAMX
-
-; radio data
-wCurRadioLine:: db
-wNextRadioLine:: db
-wRadioTextDelay:: db
-wNumRadioLinesPrinted:: db
-wOaksPKMNTalkSegmentCounter:: db
-	ds 5
-wRadioText:: ds 2 * SCREEN_WIDTH
-
-
-SECTION UNION "Miscellaneous WRAM 1", WRAMX
-
-; lucky number show
-wLuckyNumberDigitsBuffer:: ds 5
-
-
-SECTION UNION "Miscellaneous WRAM 1", WRAMX
-
-; movement buffer data
-wMovementBufferCount:: db
-wMovementBufferObject:: db
-wUnusedMovementBufferBank:: db
-wUnusedMovementBufferPointer:: dw
-wMovementBuffer:: ds 55
-
-
-SECTION UNION "Miscellaneous WRAM 1", WRAMX
-
-; box printing
-wWhichBoxMonToPrint:: db
-wFinishedPrintingBox:: db
-wAddrOfBoxToPrint:: dw
-wBankOfBoxToPrint:: db
-wWhichBoxToPrint:: db
-
-
-SECTION UNION "Miscellaneous WRAM 1", WRAMX
-
-; Unown printing
-wPrintedUnownTileSource:: ds 1 tiles
-wPrintedUnownTileDest:: ds 1 tiles
-
-
-SECTION UNION "Miscellaneous WRAM 1", WRAMX
-
-; trainer HUD data
-	ds 1
-wPlaceBallsDirection:: db
-wTrainerHUDTiles:: ds 4
-
-
-SECTION UNION "Miscellaneous WRAM 1", WRAMX
-
-; mobile participant nicknames
-	ds 4
-wMobileParticipant1Nickname:: ds NAME_LENGTH_JAPANESE
-wMobileParticipant2Nickname:: ds NAME_LENGTH_JAPANESE
-wMobileParticipant3Nickname:: ds NAME_LENGTH_JAPANESE
-
-
-SECTION UNION "Miscellaneous WRAM 1", WRAMX
-
-; battle exp gain
-wExperienceGained:: ds 3
-
-
-SECTION UNION "Miscellaneous WRAM 1", WRAMX
-
-; earthquake data buffer
-wEarthquakeMovementDataBuffer:: ds 5
-
-
-SECTION UNION "Miscellaneous WRAM 1", WRAMX
-
-; switching items in pack
-wSwitchItemBuffer:: ds 2 ; may store 1 or 2 bytes
-
-
-SECTION UNION "Miscellaneous WRAM 1", WRAMX
-
-; switching pokemon in party
-; may store NAME_LENGTH, PARTYMON_STRUCT_LENGTH, or MAIL_STRUCT_LENGTH bytes
-wSwitchMonBuffer:: ds 48
-
-
-SECTION UNION "Miscellaneous WRAM 1", WRAMX
-
-; giving pokemon mail
-wMonMailMessageBuffer:: ds MAIL_MSG_LENGTH + 1
-
-
-SECTION UNION "Miscellaneous WRAM 1", WRAMX
-
-; bill's pc
-UNION
-wBoxNameBuffer:: ds BOX_NAME_LENGTH
-NEXTU
-	ds 1
-wBillsPCTempListIndex:: db
-wBillsPCTempBoxCount:: db
-ENDU
-
-
-SECTION UNION "Miscellaneous WRAM 1", WRAMX
-
-; prof. oak's pc
-wTempPokedexSeenCount:: db
-wTempPokedexCaughtCount:: db
-
-
-SECTION UNION "Miscellaneous WRAM 1", WRAMX
-
-; player's room pc
-UNION
-wDecoNameBuffer:: ds ITEM_NAME_LENGTH
-NEXTU
-wNumOwnedDecoCategories:: db
-wOwnedDecoCategories:: ds 16
-ENDU
-
-
-SECTION UNION "Miscellaneous WRAM 1", WRAMX
-
-; trade
-wCurTradePartyMon:: db
-wCurOTTradePartyMon:: db
-wBufferTrademonNickname:: ds MON_NAME_LENGTH
-
-
-SECTION UNION "Miscellaneous WRAM 1", WRAMX
-
-; link battle record data
-wLinkBattleRecordBuffer::
-wLinkBattleRecordName::   ds NAME_LENGTH
-wLinkBattleRecordWins::   dw
-wLinkBattleRecordLosses:: dw
-wLinkBattleRecordDraws::  dw
-
-
-SECTION UNION "Miscellaneous WRAM 1", WRAMX
-
-; miscellaneous
-wTempDayOfWeek::
-wPrevPartyLevel::
-wCurBeatUpPartyMon::
-wUnownPuzzleCornerTile::
-wKeepSevenBiasChance::
-wPokeFluteCuredSleep::
-wTempRestorePPItem::
-wApricorns::
-wSuicuneFrame::
-	db
-
-
-SECTION UNION "Miscellaneous WRAM 1", WRAMX
-
-; debug color picker
-wDebugColorIsTrainer:: db
-wDebugColorIsShiny:: db
-wDebugColorCurTMHM:: db
-
-
-SECTION UNION "Miscellaneous WRAM 1", WRAMX
-
-; mobile?
-wd002:: ds 1
-wd003:: ds 1
-wd004:: ds 1
-	ds 3
-wd008:: ds 2
-	ds 6
-wd010:: ds 1
-wd011:: ds 1
-wd012:: ds 1
-wd013:: ds 1
-wd014:: ds 2
-	ds 1
-wd017:: ds 1
-wd018:: ds 1
-wd019:: ds 1
-	ds 19
-wd02d:: ds 1
-wd02e:: ds 1
-wd02f:: ds 1
-wd030:: ds 1
-wd031:: ds 1
-wd032:: ds 1
-wd033:: ds 1
-wd034:: ds 2
-wd036:: ds 2
-
-
-SECTION UNION "Miscellaneous WRAM 1", WRAMX
-
-; Every previous SECTION UNION takes up 60 or fewer bytes,
-; except the initial "mon buffer" one.
-	ds 60
-
-UNION
-; trainer data
-wSeenTrainerBank:: db
-wSeenTrainerDistance:: db
-wSeenTrainerDirection:: db
-wTempTrainer::
-wTempTrainerEventFlag:: dw
-wTempTrainerClass:: db
-wTempTrainerID:: db
-wSeenTextPointer:: dw
-wWinTextPointer:: dw
-wLossTextPointer:: dw
-wScriptAfterPointer:: dw
-wRunningTrainerBattleScript:: db
-wTempTrainerEnd::
-
-NEXTU
-; menu items list
-wMenuItemsList:: ds 16
-wMenuItemsListEnd::
-
-NEXTU
-; fruit tree data
-wCurFruitTree:: db
-wCurFruit:: db
-
-NEXTU
-; item ball data
-wItemBallData::
-wItemBallItemID:: db
-wItemBallQuantity:: db
-wItemBallDataEnd::
-
-NEXTU
-; hidden item data
-wHiddenItemData::
-wHiddenItemEvent:: dw
-wHiddenItemID:: db
-wHiddenItemDataEnd::
-
-NEXTU
-; elevator data
-wElevatorData::
-wElevatorPointerBank:: db
-wElevatorPointer:: dw
-wElevatorOriginFloor:: db
-wElevatorDataEnd::
-
-NEXTU
-; coord event data
-wCurCoordEvent::
-wCurCoordEventSceneID:: db
-wCurCoordEventMapY:: db
-wCurCoordEventMapX:: db
-	ds 1
-wCurCoordEventScriptAddr:: dw
-
-NEXTU
-; BG event data
-wCurBGEvent::
-wCurBGEventYCoord:: db
-wCurBGEventXCoord:: db
-wCurBGEventType:: db
-wCurBGEventScriptAddr:: dw
-
-NEXTU
-; mart data
-wMartType:: db
-wMartPointerBank:: db
-wMartPointer:: dw
-wMartJumptableIndex:: db
-wBargainShopFlags:: db
-
-NEXTU
-; player movement data
-wCurInput::
-wFacingTileID:: db
-wWalkingIntoNPC:: db
-wWalkingIntoLand:: db
-wWalkingIntoEdgeWarp:: db
-wMovementAnimation:: db
-wWalkingDirection:: db
-wFacingDirection:: db
-wWalkingX:: db
-wWalkingY:: db
-wWalkingTile:: db
-	ds 6
-wPlayerTurningDirection:: db
-
-NEXTU
-; std script buffer
-	ds 1
-wJumpStdScriptBuffer:: ds 3
-
-NEXTU
-; phone script data
-wCheckedTime:: db
-wPhoneListIndex:: db
-wNumAvailableCallers:: db
-wAvailableCallers:: ds CONTACT_LIST_SIZE
-
-NEXTU
-; phone caller contact
-	ds 1
-wCallerContact:: ds PHONE_CONTACT_SIZE
-
-NEXTU
-; backup menu data
-	ds 7
-wMenuCursorPositionBackup:: db
-wMenuScrollPositionBackup:: db
-
-NEXTU
-; poison step data
-wPoisonStepData::
-wPoisonStepFlagSum:: db
-wPoisonStepPartyFlags:: ds PARTY_LENGTH
-wPoisonStepDataEnd::
-ENDU
-
-	ds 23
-
-
-SECTION "More WRAM 1", WRAMX
-
-wTMHMMoveNameBackup:: ds MOVE_NAME_LENGTH
-
-wStringBuffer1:: ds STRING_BUFFER_LENGTH
-wStringBuffer2:: ds STRING_BUFFER_LENGTH
-wStringBuffer3:: ds STRING_BUFFER_LENGTH
-wStringBuffer4:: ds STRING_BUFFER_LENGTH
-wStringBuffer5:: ds STRING_BUFFER_LENGTH
-
-wBattleMenuCursorPosition:: db
-
-	ds 1
-
-wCurBattleMon::
-; index of the player's mon currently in battle (0-5)
-	db
-
-wCurMoveNum:: db
-
-wLastPocket:: db
-
-wPCItemsCursor::        db
-wPartyMenuCursor::      db
-wItemsPocketCursor::    db
-wKeyItemsPocketCursor:: db
-wBallsPocketCursor::    db
-wTMHMPocketCursor::     db
-
-wPCItemsScrollPosition::        db
-	ds 1
-wItemsPocketScrollPosition::    db
-wKeyItemsPocketScrollPosition:: db
-wBallsPocketScrollPosition::    db
-wTMHMPocketScrollPosition::     db
-
-wSwitchMon::
-wSwitchItem::
-wSwappingMove::
-wd0e3:: ; mobile
-	db
-
-wMenuScrollPosition:: ds 4
-
-wQueuedScriptBank:: db
-wQueuedScriptAddr:: dw
-
-wNumMoves:: db
-
-wFieldMoveSucceeded::
-wItemEffectSucceeded::
-wBattlePlayerAction::
-; 0 - use move
-; 1 - use item
-; 2 - switch
-wSolvedUnownPuzzle::
-	db
-
-wVramState::
-; bit 0: overworld sprite updating on/off
-; bit 1: something to do with sprite updates
-; bit 6: something to do with text
-; bit 7: on when surf initiates
-;        flickers when climbing waterfall
-	db
-
-wBattleResult::
-; WIN, LOSE, or DRAW
-; bit 6: caught celebi
-; bit 7: box full
-	db
-wUsingItemWithSelect:: db
-
-UNION
-; mart data
-wCurMartCount:: db
-wCurMartItems:: ds 15
-
-NEXTU
-; elevator data
-wCurElevatorCount:: db
-wCurElevatorFloors:: ds 15
-
-NEXTU
-; mailbox data
-wCurMessageScrollPosition:: db
-wCurMessageIndex:: db
-wMailboxCount:: db
-wMailboxItems:: ds MAILBOX_CAPACITY
-ENDU
-
-wListPointer:: dw
-wUnusedNamesPointer:: dw
-
-wItemAttributesPointer:: dw
-
-wCurItem:: db
-wCurItemQuantity::
-wMartItemID::
-	db
-
-wCurPartySpecies:: db
-
-wCurPartyMon::
-; index of mon's party location (0-5)
-	db
-
-wWhichHPBar::
-; 0: Enemy
-; 1: Player
-; 2: Party Menu
-	db
-
-wPokemonWithdrawDepositParameter::
-; 0: Take from PC
-; 1: Put into PC
-; 2: Take from Day-Care
-; 3: Put into Day-Care
-	db
-
-wItemQuantityChange:: db
-wItemQuantity:: db
-
-wTempMon:: party_struct wTempMon
-
-wSpriteFlags:: db
-
-wHandlePlayerStep:: db
-
-	ds 1
-
-wPartyMenuActionText:: db
-
-wItemAttributeValue:: db
-
-wCurPartyLevel:: db
-
-wScrollingMenuListSize:: db
-
-	ds 1
-
-; used when following a map warp
-wNextWarp:: db
-wNextMapGroup:: db
-wNextMapNumber:: db
-wPrevWarp:: db
-wPrevMapGroup:: db
-wPrevMapNumber:: db
-
-wPlayerBGMapOffsetX:: db ; used in FollowNotExact; unit is pixels
-wPlayerBGMapOffsetY:: db ; used in FollowNotExact; unit is pixels
-
-; Player movement
-wPlayerStepVectorX:: db
-wPlayerStepVectorY:: db
-wPlayerStepFlags:: db
-wPlayerStepDirection:: db
-
-wBGMapAnchor:: dw
-
-UNION
-wUsedSprites:: ds SPRITE_GFX_LIST_CAPACITY * 2
-wUsedSpritesEnd::
-
-NEXTU
-	ds 31
-wd173:: db ; related to command queue type 3
-ENDU
-
-wOverworldMapAnchor:: dw
-wMetatileStandingY:: db
-wMetatileStandingX:: db
-
-wMapPartial::
-wMapAttributesBank:: db
-wMapTileset:: db
-wEnvironment:: db
-wMapAttributesPointer:: dw
-wMapPartialEnd::
-
-wMapAttributes::
-wMapBorderBlock:: db
-; width/height are in blocks (2x2 walkable tiles, 4x4 graphics tiles)
-wMapHeight:: db
-wMapWidth:: db
-wMapBlocksBank:: db
-wMapBlocksPointer:: dw
-wMapScriptsBank:: db
-wMapScriptsPointer:: dw
-wMapEventsPointer:: dw
-; bit set
-wMapConnections:: db
-wMapAttributesEnd::
-
-wNorthMapConnection:: map_connection_struct wNorth
-wSouthMapConnection:: map_connection_struct wSouth
-wWestMapConnection::  map_connection_struct wWest
-wEastMapConnection::  map_connection_struct wEast
-
-wTileset::
-wTilesetBank:: db
-wTilesetAddress:: dw
-wTilesetBlocksBank:: db
-wTilesetBlocksAddress:: dw
-wTilesetCollisionBank:: db
-wTilesetCollisionAddress:: dw
-wTilesetAnim:: dw ; bank 3f
-	ds 2 ; unused
-wTilesetPalettes:: dw ; bank 3f
-wTilesetEnd::
-	assert wTilesetEnd - wTileset == TILESET_LENGTH
-
-wEvolvableFlags:: flag_array PARTY_LENGTH
-
-wForceEvolution:: db
-
-UNION
-; general-purpose HP buffers
-wHPBuffer1:: dw
-wHPBuffer2:: dw
-wHPBuffer3:: dw
-
-NEXTU
-; HP bar animations
-wCurHPAnimMaxHP::   dw
-wCurHPAnimOldHP::   dw
-wCurHPAnimNewHP::   dw
-wCurHPAnimPal::     db
-wCurHPBarPixels::   db
-wNewHPBarPixels::   db
-wCurHPAnimDeltaHP:: dw
-wCurHPAnimLowHP::   db
-wCurHPAnimHighHP::  db
-
-NEXTU
-; move AI
-wEnemyAIMoveScores:: ds NUM_MOVES
-
-NEXTU
-; switch AI
-wEnemyEffectivenessVsPlayerMons:: flag_array PARTY_LENGTH
-wPlayerEffectivenessVsEnemyMons:: flag_array PARTY_LENGTH
-
-NEXTU
-; battle HUD
-wBattleHUDTiles:: ds PARTY_LENGTH
-
-NEXTU
-; thrown ball data
-wFinalCatchRate:: db
-wThrownBallWobbleCount:: db
-
-NEXTU
-; evolution data
-wEvolutionOldSpecies:: db
-wEvolutionNewSpecies:: db
-wEvolutionPicOffset::  db
-wEvolutionCanceled::   db
-
-NEXTU
-; experience
-wExpToNextLevel:: ds 3
-
-NEXTU
-; PP Up
-wPPUpPPBuffer:: ds NUM_MOVES
-
-NEXTU
-; lucky number show
-wMonIDDigitsBuffer:: ds 5
-
-NEXTU
-; mon submenu
-wMonSubmenuCount:: db
-wMonSubmenuItems:: ds NUM_MONMENU_ITEMS + 1
-
-NEXTU
-; field move data
-wFieldMoveData::
-wFieldMoveJumptableIndex:: db
-wEscapeRopeOrDigType::
-wSurfingPlayerState::
-wFishingRodUsed:: db
-wCutWhirlpoolOverworldBlockAddr:: dw
-wCutWhirlpoolReplacementBlock:: db
-wCutWhirlpoolAnimationType::
-wStrengthSpecies::
-wFishingResult:: db
-	ds 1
-wFieldMoveDataEnd::
-
-NEXTU
-; hidden items
-wCurMapScriptBank:: db
-wRemainingBGEventCount:: db
-wBottomRightYCoord:: db
-wBottomRightXCoord:: db
-
-NEXTU
-; heal machine anim
-wHealMachineAnimType::  db
-wHealMachineTempOBP1::  db
-wHealMachineAnimState:: db
-
-NEXTU
-; decorations
-wCurDecoration::          db
-wSelectedDecorationSide:: db
-wSelectedDecoration::     db
-wOtherDecoration::        db
-wChangedDecorations::     db
-wCurDecorationCategory::  db
-
-NEXTU
-; withdraw/deposit items
-wPCItemQuantityChange:: db
-wPCItemQuantity:: db
-
-NEXTU
-; mail
-wCurMailAuthorID:: dw
-wCurMailIndex:: db
-
-NEXTU
-; kurt
-wKurtApricornCount:: db
-wKurtApricornItems:: ds 10
-
-NEXTU
-; tree mons
-wTreeMonCoordScore:: db
-wTreeMonOTIDScore::  db
-
-NEXTU
-; restart clock
-wRestartClockCurDivision::   db
-wRestartClockPrevDivision::  db
-wRestartClockUpArrowYCoord:: db
-wRestartClockDay::  db
-wRestartClockHour:: db
-wRestartClockMin::  db
-
-NEXTU
-; link
-	ds 9
-wLinkBattleRNPreamble:: ds SERIAL_RN_PREAMBLE_LENGTH
-wLinkBattleRNs:: ds SERIAL_RNS_LENGTH
-
-NEXTU
-; mobile
-wd1ea:: ds 1
-wd1eb:: ds 1
-wd1ec:: ds 1
-wd1ed:: ds 1
-wd1ee:: ds 1
-wd1ef:: ds 1
-wd1f0:: ds 1
-wd1f1:: ds 1
-wd1f2:: ds 1
-wd1f3:: ds 1
-	ds 6
-
-NEXTU
-; miscellaneous bytes
-wSkipMovesBeforeLevelUp::
-wRegisteredPhoneNumbers::
-wListMovesLineSpacing:: db
-wSwitchMonTo:: db
-wSwitchMonFrom:: db
-	ds 4
-wCurEnemyItem:: db
-
-NEXTU
-; miscellaneous words
-wBuySellItemPrice::
-wTempMysteryGiftTimer::
-wMagikarpLength:: dw
-ENDU
-
-wTempEnemyMonSpecies::  db
-wTempBattleMonSpecies:: db
-
-wEnemyMon:: battle_struct wEnemyMon
-wEnemyMonBaseStats:: ds NUM_EXP_STATS
-wEnemyMonCatchRate:: db
-wEnemyMonBaseExp::   db
-wEnemyMonEnd::
-
-wBattleMode::
-; 0: overworld
-; 1: wild battle
-; 2: trainer battle
-	db
-
-wTempWildMonSpecies:: db
-
-wOtherTrainerClass::
-; class (Youngster, Bug Catcher, etc.) of opposing trainer
-; 0 if opponent is a wild Pokémon, not a trainer
-	db
-
-; BATTLETYPE_* values
-wBattleType:: db
-
-wOtherTrainerID::
-; which trainer of the class that you're fighting
-; (Joey, Mikey, Albert, etc.)
-	db
-
-wForcedSwitch:: db
-
-wTrainerClass:: db
-
-wUnownLetter:: db
-
-wMoveSelectionMenuType:: db
-
-; corresponds to the data/pokemon/base_stats/*.asm contents
-wCurBaseData::
-wBaseDexNo:: db
-wBaseStats::
-wBaseHP:: db
-wBaseAttack:: db
-wBaseDefense:: db
-wBaseSpeed:: db
-wBaseSpecialAttack:: db
-wBaseSpecialDefense:: db
-wBaseType::
-wBaseType1:: db
-wBaseType2:: db
-wBaseCatchRate:: db
-wBaseExp:: db
-wBaseItems::
-wBaseItem1:: db
-wBaseItem2:: db
-wBaseGender:: db
-wBaseUnknown1:: db
-wBaseEggSteps:: db
-wBaseUnknown2:: db
-wBasePicSize:: db
-wBaseUnusedFrontpic:: dw
-wBaseUnusedBackpic:: dw
-wBaseGrowthRate:: db
-wBaseEggGroups:: db
-wBaseTMHM:: flag_array NUM_TM_HM_TUTOR
-wCurBaseDataEnd::
-	assert wCurBaseDataEnd - wCurBaseData == BASE_DATA_SIZE
-
-wCurDamage:: dw
-
-	ds 2
-
-wMornEncounterRate::  db
-wDayEncounterRate::   db
-wNiteEncounterRate::  db
-wWaterEncounterRate:: db
-wListMoves_MoveIndicesBuffer:: ds NUM_MOVES
-wPutativeTMHMMove:: db
-wInitListType:: db
-wBattleHasJustStarted:: db
-
-wNamedObjectIndex::
-wTextDecimalByte::
-wTempByteValue::
-wNumSetBits::
-wTypeMatchup::
-wCurType::
-wTempSpecies::
-wTempIconSpecies::
-wTempTMHM::
-wTempPP::
-wNextBoxOrPartyIndex::
-wChosenCableClubRoom::
-wBreedingCompatibility::
-wMoveGrammar::
-wApplyStatLevelMultipliersToEnemy::
-wUsePPUp::
-wd265:: ; mobile
-	db
-
-wFailedToFlee:: db
-wNumFleeAttempts:: db
-wMonTriedToEvolve:: db
-
-wTimeOfDay:: db
-
-	ds 1
-
-
-SECTION "Enemy Party", WRAMX
-
-UNION
-wPokedexShowPointerAddr:: dw
-wPokedexShowPointerBank:: db
-	ds 3
-wd271:: dw ; mobile
-
-NEXTU
-wUnusedEggHatchFlag:: db
-
-NEXTU
-; enemy party
-wOTPartyData::
-wOTPlayerName:: ds NAME_LENGTH
-wOTPlayerID:: dw
-	ds 8
-wOTPartyCount::   db
-wOTPartySpecies:: ds PARTY_LENGTH
-wOTPartyEnd::     db ; older code doesn't check PartyCount
-ENDU
-
-UNION
-; ot party mons
-wOTPartyMons::
-; wOTPartyMon1 - wOTPartyMon6
-for n, 1, PARTY_LENGTH + 1
-wOTPartyMon{d:n}:: party_struct wOTPartyMon{d:n}
-endr
-
-wOTPartyMonOTs::
-; wOTPartyMon1OT - wOTPartyMon6OT
-for n, 1, PARTY_LENGTH + 1
-wOTPartyMon{d:n}OT:: ds NAME_LENGTH
-endr
-
-wOTPartyMonNicknames::
-; wOTPartyMon1Nickname - wOTPartyMon6Nickname
-for n, 1, PARTY_LENGTH + 1
-wOTPartyMon{d:n}Nickname:: ds MON_NAME_LENGTH
-endr
-wOTPartyDataEnd::
-
-NEXTU
-; catch tutorial dude pack
-wDudeNumItems:: db
-wDudeItems:: ds 2 * 4 + 1
-
-wDudeNumKeyItems:: db
-wDudeKeyItems:: ds 18 + 1
-
-wDudeNumBalls:: db
-wDudeBalls:: ds 2 * 4 + 1
-ENDU
-
-	ds 4
-
-wd430:: ; mobile
-wBattleAction:: db
-
-wLinkBattleSentAction:: db
-wMapStatus:: db
-wMapEventStatus:: db
-
-wScriptFlags::
-; bit 3: run deferred script
-	db
-	ds 1
-wScriptFlags2::
-; bit 0: count steps
-; bit 1: coord events
-; bit 2: warps and connections
-; bit 4: wild encounters
-; bit 5: unknown
-	db
-
-wScriptMode:: db
-wScriptRunning:: db
-wScriptBank:: db
-wScriptPos:: dw
-
-wScriptStackSize:: db
-wScriptStack:: ds 3 * 5
-	ds 1
-wScriptDelay:: db
-
-wDeferredScriptBank::
-wScriptTextBank::
-	db
-wDeferredScriptAddr::
-wScriptTextAddr::
-	dw
-	ds 1
-wWildEncounterCooldown:: db
-
-wXYComparePointer:: dw
-	ds 4
-
-wBattleScriptFlags:: db
-	ds 1
-wPlayerSpriteSetupFlags::
-; bit 7: if set, cancel wPlayerAction
-; bit 6: RefreshMapSprites doesn't reload player sprite
-; bit 5: if set, set facing according to bits 0-1
-; bit 2: female player has been transformed into male
-; bits 0-1: direction facing
-	db
-
-wMapReentryScriptQueueFlag:: db
-wMapReentryScriptBank:: db
-wMapReentryScriptAddress:: dw
-
-	ds 4
-
-wTimeCyclesSinceLastCall:: db
-wReceiveCallDelay_MinsRemaining:: db
-wReceiveCallDelay_StartTime:: ds 3
-
-	ds 3
-
-wBugContestMinsRemaining:: db
-wBugContestSecsRemaining:: db
-
-	ds 2
-
-wMapStatusEnd::
-
-	ds 2
-
-wCrystalData::
-wPlayerGender::
-; bit 0:
-;	0 male
-;	1 female
-	db
-wd473:: ds 1
-wd474:: ds 1
-wd475:: ds 1
-wd476:: ds 1
-wd477:: ds 1
-wd478:: ds 1
-wCrystalDataEnd::
-
-wd479:: ds 2
-
-wGameData::
-wPlayerData::
-wPlayerID:: dw
-
-wPlayerName:: ds NAME_LENGTH
-wMomsName::   ds NAME_LENGTH
-wRivalName::  ds NAME_LENGTH
-wRedsName::   ds NAME_LENGTH
-wGreensName:: ds NAME_LENGTH
-
-wSavedAtLeastOnce:: db
-wSpawnAfterChampion:: db
-
-; init time set at newgame
-wStartDay::    db
-wStartHour::   db
-wStartMinute:: db
-wStartSecond:: db
-
-wRTC:: ds 4
-
-	ds 4
-
-wDST::
-; bit 7: dst
-	db
-
-wGameTime:: ; used only for BANK(wGameTime)
-wGameTimeCap::     db
-wGameTimeHours::   dw
-wGameTimeMinutes:: db
-wGameTimeSeconds:: db
-wGameTimeFrames::  db
-
-	ds 2
-
-wCurDay:: db
-
-	ds 1
-
-wObjectFollow_Leader:: db
-wObjectFollow_Follower:: db
-wCenteredObject:: db
-wFollowerMovementQueueLength:: db
-wFollowMovementQueue:: ds 5
-
-wObjectStructs::
-wPlayerStruct:: object_struct wPlayer ; player is object struct 0
-; wObjectStruct1 - wObjectStruct12
-for n, 1, NUM_OBJECT_STRUCTS
-wObject{d:n}Struct:: object_struct wObject{d:n}
-endr
-
-wCmdQueue:: ds CMDQUEUE_CAPACITY * CMDQUEUE_ENTRY_SIZE
-
-	ds 40
-
-wMapObjects::
-wPlayerObject:: map_object wPlayer ; player is map object 0
-; wMap1Object - wMap15Object
-for n, 1, NUM_OBJECTS
-wMap{d:n}Object:: map_object wMap{d:n}
-endr
-
-wObjectMasks:: ds NUM_OBJECTS
-
-wVariableSprites:: ds $100 - SPRITE_VARS
-
-wEnteredMapFromContinue:: db
-	ds 2
-wTimeOfDayPal:: db
-	ds 4
-wTimeOfDayPalFlags:: db
-wTimeOfDayPalset:: db
-wCurTimeOfDay:: db
-
-	ds 1
-
-wSecretID:: dw
-wStatusFlags::
-; bit 0: pokedex
-; bit 1: unown dex
-; bit 2: flash
-; bit 3: caught pokerus
-; bit 4: rocket signal
-; bit 5: wild encounters on/off
-; bit 6: hall of fame
-; bit 7: bug contest on
-	db
-
-wStatusFlags2::
-; bit 0: rockets
-; bit 1: safari game (unused)
-; bit 2: bug contest timer
-; bit 3: unused
-; bit 4: bike shop call
-; bit 5: can use sweet scent
-; bit 6: reached goldenrod
-; bit 7: rockets in mahogany
-	db
-
-wMoney:: ds 3
-wMomsMoney:: ds 3
-
-wMomSavingMoney::
-; bit 0: saving some money
-; bit 1: saving half money (unused)
-; bit 2: saving all money (unused)
-; bit 7: active
-	db
-
-wCoins:: dw
-
-wBadges::
-wJohtoBadges:: flag_array NUM_JOHTO_BADGES
-wKantoBadges:: flag_array NUM_KANTO_BADGES
-
-wTMsHMs:: ds NUM_TMS + NUM_HMS
-
-wNumItems:: db
-wItems:: ds MAX_ITEMS * 2 + 1
-
-wNumKeyItems:: db
-wKeyItems:: ds MAX_KEY_ITEMS + 1
-
-wNumBalls:: db
-wBalls:: ds MAX_BALLS * 2 + 1
-
-wNumPCItems:: db
-wPCItems:: ds MAX_PC_ITEMS * 2 + 1
-
-wPokegearFlags::
-; bit 0: map
-; bit 1: radio
-; bit 2: phone
-; bit 3: expn
-; bit 7: on/off
-	db
-wRadioTuningKnob:: db
-wLastDexMode:: db
-	ds 1
-wWhichRegisteredItem:: db
-wRegisteredItem:: db
-
-wPlayerState:: db
-
-wHallOfFameCount:: db
-	ds 1
-wTradeFlags:: flag_array NUM_NPC_TRADES
-	ds 1
-wMooMooBerries:: db
-wUndergroundSwitchPositions:: db
-wFarfetchdPosition:: db
-
-	ds 13
-
-; map scene ids
-wPokecenter2FSceneID::                            db
-wTradeCenterSceneID::                             db
-wColosseumSceneID::                               db
-wTimeCapsuleSceneID::                             db
-wPowerPlantSceneID::                              db
-wCeruleanGymSceneID::                             db
-wRoute25SceneID::                                 db
-wTrainerHouseB1FSceneID::                         db
-wVictoryRoadGateSceneID::                         db
-wSaffronMagnetTrainStationSceneID::               db
-wRoute16GateSceneID::                             db
-wRoute17Route18GateSceneID::                      db
-wIndigoPlateauPokecenter1FSceneID::               db
-wWillsRoomSceneID::                               db
-wKogasRoomSceneID::                               db
-wBrunosRoomSceneID::                              db
-wKarensRoomSceneID::                              db
-wLancesRoomSceneID::                              db
-wHallOfFameSceneID::                              db
-wRoute27SceneID::                                 db
-wNewBarkTownSceneID::                             db
-wElmsLabSceneID::                                 db
-wPlayersHouse1FSceneID::                          db
-wRoute29SceneID::                                 db
-wCherrygroveCitySceneID::                         db
-wMrPokemonsHouseSceneID::                         db
-wRoute32SceneID::                                 db
-wRoute35NationalParkGateSceneID::                 db
-wRoute36SceneID::                                 db
-wRoute36NationalParkGateSceneID::                 db
-wAzaleaTownSceneID::                              db
-wGoldenrodGymSceneID::                            db
-wGoldenrodMagnetTrainStationSceneID::             db
-wGoldenrodPokecenter1FSceneID::                   db
-wOlivineCitySceneID::                             db
-wRoute34SceneID::                                 db
-wRoute34IlexForestGateSceneID::                   db
-wEcruteakTinTowerEntranceSceneID::                db
-wWiseTriosRoomSceneID::                           db
-wEcruteakPokecenter1FSceneID::                    db
-wEcruteakGymSceneID::                             db
-wMahoganyTownSceneID::                            db
-wRoute42SceneID::                                 db
-wCianwoodCitySceneID::                            db
-wBattleTower1FSceneID::                           db
-wBattleTowerBattleRoomSceneID::                   db
-wBattleTowerElevatorSceneID::                     db
-wBattleTowerHallwaySceneID::                      db
-wBattleTowerOutsideSceneID::                      db
-wRoute43GateSceneID::                             db
-wMountMoonSceneID::                               db
-wSproutTower3FSceneID::                           db
-wTinTower1FSceneID::                              db
-wBurnedTower1FSceneID::                           db
-wBurnedTowerB1FSceneID::                          db
-wRadioTower5FSceneID::                            db
-wRuinsOfAlphOutsideSceneID::                      db
-wRuinsOfAlphResearchCenterSceneID::               db
-wRuinsOfAlphHoOhChamberSceneID::                  db
-wRuinsOfAlphKabutoChamberSceneID::                db
-wRuinsOfAlphOmanyteChamberSceneID::               db
-wRuinsOfAlphAerodactylChamberSceneID::            db
-wRuinsOfAlphInnerChamberSceneID::                 db
-wMahoganyMart1FSceneID::                          db
-wTeamRocketBaseB1FSceneID::                       db
-wTeamRocketBaseB2FSceneID::                       db
-wTeamRocketBaseB3FSceneID::                       db
-wGoldenrodUndergroundSwitchRoomEntrancesSceneID:: db
-wSilverCaveRoom3SceneID::                         db
-wVictoryRoadSceneID::                             db
-wDragonsDenB1FSceneID::                           db
-wDragonShrineSceneID::                            db
-wOlivinePortSceneID::                             db
-wVermilionPortSceneID::                           db
-wFastShip1FSceneID::                              db
-wFastShipB1FSceneID::                             db
-wMountMoonSquareSceneID::                         db
-wMobileTradeRoomSceneID::                         db
-wMobileBattleRoomSceneID::                        db
-
-	ds 49
-
-; fight counts
-wJackFightCount::    db
-wBeverlyFightCount:: db ; unreferenced
-wHueyFightCount::    db
-wGavenFightCount::   db
-wBethFightCount::    db
-wJoseFightCount::    db
-wReenaFightCount::   db
-wJoeyFightCount::    db
-wWadeFightCount::    db
-wRalphFightCount::   db
-wLizFightCount::     db
-wAnthonyFightCount:: db
-wToddFightCount::    db
-wGinaFightCount::    db
-wIrwinFightCount::   db ; unreferenced
-wArnieFightCount::   db
-wAlanFightCount::    db
-wDanaFightCount::    db
-wChadFightCount::    db
-wDerekFightCount::   db ; unreferenced
-wTullyFightCount::   db
-wBrentFightCount::   db
-wTiffanyFightCount:: db
-wVanceFightCount::   db
-wWiltonFightCount::  db
-wKenjiFightCount::   db ; unreferenced
-wParryFightCount::   db
-wErinFightCount::    db
-
-	ds 100
-
-wEventFlags:: flag_array NUM_EVENTS
-
-wCurBox:: db
-
-	ds 2
-
-wBoxNames:: ds BOX_NAME_LENGTH * NUM_BOXES
-
-wCelebiEvent::
-; bit 2: forest is restless
-	db
-
-	ds 1
-
-wBikeFlags::
-; bit 0: using strength
-; bit 1: always on bike
-; bit 2: downhill
-	db
-	ds 1 ; cleared along with wBikeFlags by ResetBikeFlags
-
-wCurMapSceneScriptPointer:: dw
-
-wCurCaller:: dw
-wCurMapWarpCount:: db
-wCurMapWarpsPointer:: dw
-wCurMapCoordEventCount:: db
-wCurMapCoordEventsPointer:: dw
-wCurMapBGEventCount:: db
-wCurMapBGEventsPointer:: dw
-wCurMapObjectEventCount:: db
-wCurMapObjectEventsPointer:: dw
-wCurMapSceneScriptCount:: db
-wCurMapSceneScriptsPointer:: dw
-wCurMapCallbackCount:: db
-wCurMapCallbacksPointer:: dw
-
-	ds 2
-
-; Sprite id of each decoration
-wDecoBed::           db
-wDecoCarpet::        db
-wDecoPlant::         db
-wDecoPoster::        db
-wDecoConsole::       db
-wDecoLeftOrnament::  db
-wDecoRightOrnament:: db
-wDecoBigDoll::       db
-
-; Items bought from Mom
-wWhichMomItem:: db
-wWhichMomItemSet:: db
-wMomItemTriggerBalance:: ds 3
-
-wDailyResetTimer:: dw
-wDailyFlags1:: db
-wDailyFlags2:: db
-wSwarmFlags:: db
-	ds 2
-wTimerEventStartDay:: db
-	ds 3
-
-wFruitTreeFlags:: flag_array NUM_FRUIT_TREES
-
-	ds 2
-
-wLuckyNumberDayTimer:: dw
-	ds 2
-wSpecialPhoneCallID:: db
-	ds 3
-wBugContestStartTime:: ds 4 ; day, hour, min, sec
-wUnusedTwoDayTimerOn:: db
-wUnusedTwoDayTimer:: db
-wUnusedTwoDayTimerStartDate:: db
-	ds 4
-wMobileOrCable_LastSelection:: db
-wdc41:: ds 1
-wdc42:: ds 8
-wBuenasPassword:: db
-wBlueCardBalance:: db
-wDailyRematchFlags:: ds 4
-wDailyPhoneItemFlags:: ds 4
-wDailyPhoneTimeOfDayFlags:: ds 4
-wKenjiBreakTimer:: ds 2 ; Kenji
-wYanmaMapGroup:: db
-wYanmaMapNumber:: db
-wPlayerMonSelection:: ds 3
-wdc5f:: db
-wdc60:: db
-
-	ds 18
-
-wStepCount:: db
-wPoisonStepCount:: db
-	ds 2
-wHappinessStepCount:: db
-	ds 1
-
-wParkBallsRemaining::
-wSafariBallsRemaining:: db
-wSafariTimeRemaining:: dw
-
-wPhoneList:: ds CONTACT_LIST_SIZE + 1
-
-	ds 22
-
-wLuckyNumberShowFlag:: db
-	ds 1
-wLuckyIDNumber:: dw
-
-wRepelEffect:: db ; If a Repel is in use, it contains the nr of steps it's still active
-wBikeStep:: dw
-wKurtApricornQuantity:: db
-
-wPlayerDataEnd::
-
-wCurMapData::
-
-wVisitedSpawns:: flag_array NUM_SPAWNS
-
-wDigWarpNumber:: db
-wDigMapGroup::   db
-wDigMapNumber::  db
-
-; used on maps like second floor pokécenter, which are reused, so we know which
-; map to return to
-wBackupWarpNumber:: db
-wBackupMapGroup::   db
-wBackupMapNumber::  db
-
-	ds 3
-
-wLastSpawnMapGroup:: db
-wLastSpawnMapNumber:: db
-
-wWarpNumber:: db
-wMapGroup:: db
-wMapNumber:: db
-wYCoord:: db
-wXCoord:: db
-wScreenSave:: ds SCREEN_META_WIDTH * SCREEN_META_HEIGHT
-
-wCurMapDataEnd::
-
-
-SECTION "Party", WRAMX
-
-wPokemonData::
-
-wPartyCount::   db
-wPartySpecies:: ds PARTY_LENGTH
-wPartyEnd::     db ; older code doesn't check wPartyCount
-
-wPartyMons::
-; wPartyMon1 - wPartyMon6
-for n, 1, PARTY_LENGTH + 1
-wPartyMon{d:n}:: party_struct wPartyMon{d:n}
-endr
-
-wPartyMonOTs::
-; wPartyMon1OT - wPartyMon6OT
-for n, 1, PARTY_LENGTH + 1
-wPartyMon{d:n}OT:: ds NAME_LENGTH
-endr
-
-wPartyMonNicknames::
-; wPartyMon1Nickname - wPartyMon6Nickname
-for n, 1, PARTY_LENGTH + 1
-wPartyMon{d:n}Nickname:: ds MON_NAME_LENGTH
-endr
-wPartyMonNicknamesEnd::
-
-	ds 22
-
-wPokedexCaught:: flag_array NUM_POKEMON
-wEndPokedexCaught::
-
-wPokedexSeen:: flag_array NUM_POKEMON
-wEndPokedexSeen::
-
-wUnownDex:: ds NUM_UNOWN
-wUnlockedUnowns:: db
-wFirstUnownSeen:: db
-
-wDayCareMan::
-; bit 7: active
-; bit 6: egg ready
-; bit 5: monsters are compatible
-; bit 0: monster 1 in day-care
-	db
-
-wBreedMon1Nickname:: ds MON_NAME_LENGTH
-wBreedMon1OT:: ds NAME_LENGTH
-wBreedMon1:: box_struct wBreedMon1
-
-wDayCareLady::
-; bit 7: active
-; bit 0: monster 2 in day-care
-	db
-
-wStepsToEgg::
-	db
-wBreedMotherOrNonDitto::
-;  z: yes
-; nz: no
-	db
-
-wBreedMon2Nickname:: ds MON_NAME_LENGTH
-wBreedMon2OT:: ds NAME_LENGTH
-wBreedMon2:: box_struct wBreedMon2
-
-wEggMonNickname:: ds MON_NAME_LENGTH
-wEggMonOT:: ds NAME_LENGTH
-wEggMon:: box_struct wEggMon
-
-wBugContestSecondPartySpecies:: db
-wContestMon:: party_struct wContestMon
-
-wDunsparceMapGroup:: db
-wDunsparceMapNumber:: db
-wFishingSwarmFlag:: db
-
-wRoamMon1:: roam_struct wRoamMon1
-wRoamMon2:: roam_struct wRoamMon2
-wRoamMon3:: roam_struct wRoamMon3
-
-wRoamMons_CurMapNumber:: db
-wRoamMons_CurMapGroup:: db
-wRoamMons_LastMapNumber:: db
-wRoamMons_LastMapGroup:: db
-
-wBestMagikarpLengthFeet:: db
-wBestMagikarpLengthInches:: db
-wMagikarpRecordHoldersName:: ds NAME_LENGTH
-
-wPokemonDataEnd::
-wGameDataEnd::
-
-
-SECTION "Pic Animations", WRAMX
-
-wTempTilemap::
-; 20x18 grid of 8x8 tiles
-	ds SCREEN_WIDTH * SCREEN_HEIGHT
-
-; PokeAnim data
-wPokeAnimStruct::
-wPokeAnimSceneIndex:: db
-wPokeAnimPointer:: dw
-wPokeAnimSpecies:: db
-wPokeAnimUnownLetter:: db
-wPokeAnimSpeciesOrUnown:: db
-wPokeAnimGraphicStartTile:: db
-wPokeAnimCoord:: dw
-wPokeAnimFrontpicHeight:: db
-wPokeAnimIdleFlag:: db
-wPokeAnimSpeed:: db
-wPokeAnimPointerBank:: db
-wPokeAnimPointerAddr:: dw
-wPokeAnimFramesBank:: db
-wPokeAnimFramesAddr:: dw
-wPokeAnimBitmaskBank:: db
-wPokeAnimBitmaskAddr:: dw
-wPokeAnimFrame:: db
-wPokeAnimJumptableIndex:: db
-wPokeAnimRepeatTimer:: db
-wPokeAnimCurBitmask:: db
-wPokeAnimWaitCounter:: db
-wPokeAnimCommand:: db
-wPokeAnimParameter:: db
-	ds 1
-wPokeAnimBitmaskCurCol:: db
-wPokeAnimBitmaskCurRow:: db
-wPokeAnimBitmaskCurBit:: db
-wPokeAnimBitmaskBuffer:: ds 7
-	ds 2
-wPokeAnimStructEnd::
-
-
-SECTION "Battle Tower RAM", WRAMX
-
-w3_d000:: ds 1
-w3_d001:: ds 1
-w3_d002:: ds 16
-w3_d012:: ds $6e
-w3_d080:: ds 1
-w3_d081:: ds $f
-w3_d090:: ds $70
-
-w3_d100::
-wBT_OTTrainer:: battle_tower_struct wBT_OT
-	ds $20
-wBT_TrainerTextIndex:: db
-	ds 1
-w3_d202:: battle_tower_struct w3_d202
-w3_d2e2:: battle_tower_struct w3_d2e2
-w3_d3c2:: battle_tower_struct w3_d3c2
-w3_d4a2:: battle_tower_struct w3_d4a2
-w3_d582:: battle_tower_struct w3_d582
-w3_d662:: battle_tower_struct w3_d662
-
-UNION
-w3_d742:: battle_tower_struct w3_d742
-
-NEXTU
-	ds $be
-w3_d800:: ds BG_MAP_WIDTH * SCREEN_HEIGHT
-
-NEXTU
-	ds $be
-wBTChoiceOfLvlGroup:: db
-	ds $1
-w3_d802:: ds 12
-w3_d80e:: db
-	ds $1
-w3_d810::
-	ds $59
-w3_d869:: ds $17
-w3_d880:: ds 1
-w3_d881:: ds 8
-w3_d889:: ds 1
-w3_d88a:: ds 4
-w3_d88e:: ds 1
-w3_d88f:: ds 4
-w3_d893:: ds 1
-w3_d894:: ds 1
-w3_d895:: ds 11
-w3_d8a0:: ds 1
-w3_d8a1:: ds 1
-w3_d8a2:: ds 1
-w3_d8a3:: ds 1
-ENDU
-
-	ds $1c0
-
-w3_dc00:: ds SCREEN_WIDTH * SCREEN_HEIGHT
-UNION
-w3_dd68:: ds SCREEN_WIDTH * SCREEN_HEIGHT
-
-	ds $11c
-
-w3_dfec:: ds $10
-w3_dffc:: ds 4
-NEXTU
-	ds $98
-w3_de00:: ds $200
-ENDU
-
-
-SECTION "GBC Video", WRAMX, ALIGN[8]
-
-; eight 4-color palettes each
-wGBCPalettes:: ; used only for BANK(wGBCPalettes)
-wBGPals1:: ds 8 palettes
-wOBPals1:: ds 8 palettes
-wBGPals2:: ds 8 palettes
-wOBPals2:: ds 8 palettes
-
-	align 8
-wLYOverrides:: ds SCREEN_HEIGHT_PX
-wLYOverridesEnd::
-
-	ds 1
-
-wMagnetTrain:: ; used only for BANK(wMagnetTrain)
-wMagnetTrainDirection:: db
-wMagnetTrainInitPosition:: db
-wMagnetTrainHoldPosition:: db
-wMagnetTrainFinalPosition:: db
-wMagnetTrainPlayerSpriteInitX:: db
-
-	ds 106
-
-	align 8
-wLYOverridesBackup:: ds SCREEN_HEIGHT_PX
-wLYOverridesBackupEnd::
-
-
-SECTION "Battle Animations", WRAMX
-
-wBattleAnimTileDict::
-; wBattleAnimTileDict pairs keys with values
-; keys: ANIM_GFX_* indexes (taken from anim_*gfx arguments)
-; values: vTiles0 offsets
-	ds NUM_BATTLEANIMTILEDICT_ENTRIES * 2
-
-wActiveAnimObjects::
-; wAnimObject1 - wAnimObject10
-for n, 1, NUM_ANIM_OBJECTS + 1
-wAnimObject{d:n}:: battle_anim_struct wAnimObject{d:n}
-endr
-
-wActiveBGEffects::
-; wBGEffect1 - wBGEffect5
-for n, 1, NUM_BG_EFFECTS + 1
-wBGEffect{d:n}:: battle_bg_effect wBGEffect{d:n}
-endr
-
-wLastAnimObjectIndex:: db
-
-wBattleAnimFlags:: db
-wBattleAnimAddress:: dw
-wBattleAnimDelay:: db
-wBattleAnimParent:: dw
-wBattleAnimLoops:: db
-wBattleAnimVar:: db
-wBattleAnimByte:: db
-wBattleAnimOAMPointerLo:: db
-
-UNION
-wBattleObjectTempID:: db
-wBattleObjectTempXCoord:: db
-wBattleObjectTempYCoord:: db
-wBattleObjectTempParam:: db
-
-NEXTU
-wBattleBGEffectTempID:: db
-wBattleBGEffectTempJumptableIndex:: db
-wBattleBGEffectTempTurn:: db
-wBattleBGEffectTempParam:: db
-
-NEXTU
-wBattleAnimTempOAMFlags:: db
-wBattleAnimTempFixY:: db
-wBattleAnimTempTileID:: db
-wBattleAnimTempXCoord:: db
-wBattleAnimTempYCoord:: db
-wBattleAnimTempXOffset:: db
-wBattleAnimTempYOffset:: db
-wBattleAnimTempFrameOAMFlags:: db
-wBattleAnimTempPalette:: db
-
-NEXTU
-wBattleAnimGFXTempTileID::
-wBattleAnimGFXTempPicHeight:: db
-
-NEXTU
-wBattleSineWaveTempProgress:: db
-wBattleSineWaveTempOffset:: db
-wBattleSineWaveTempAmplitude:: db
-wBattleSineWaveTempTimer:: db
-
-NEXTU
-wBattlePicResizeTempBaseTileID:: db
-wBattlePicResizeTempPointer:: dw
-ENDU
-
-UNION
-	ds 50
-wBattleAnimEnd::
-
-NEXTU
-wSurfWaveBGEffect:: ds $40
-wSurfWaveBGEffectEnd::
-ENDU
-
-
-SECTION "Mobile RAM", WRAMX
-
-w5_d800:: ds $200
-w5_da00:: ds $200
-w5_dc00:: ds $d
-w5_dc0d:: ds 4
-w5_dc11:: ds 9
-w5_MobileOpponentBattleMessages:: ds $c
-w5_MobileOpponentBattleStartMessage:: ds $c
-w5_MobileOpponentBattleWinMessage:: ds $c
-w5_MobileOpponentBattleLossMessage:: ds $c
-
-
-SECTION "Scratch RAM", WRAMX
-
-UNION
-wScratchTilemap:: ds BG_MAP_WIDTH * BG_MAP_HEIGHT
-wScratchAttrmap:: ds BG_MAP_WIDTH * BG_MAP_HEIGHT
-
-NEXTU
-wDecompressScratch:: ds $80 tiles
-wDecompressEnemyFrontpic:: ds $80 tiles
-
-NEXTU
-; unidentified uses
-w6_d000:: ds $1000
-ENDU
-
-
-SECTION "Stack RAM", WRAMX
-
-wWindowStack:: ds $1000 - 1
-wWindowStackBottom:: ds 1
-
-
-INCLUDE "sram.asm"
-
-INCLUDE "hram.asm"