~moody/pokecrystal

c5f16c86c80b1b486c534ec855e46d455721c813 — Jacob Moody 5 months ago 2137f0b + 354fefa front
merge from upstream
M .github/workflows/main.yml => .github/workflows/main.yml +1 -2
@@ 69,9 69,8 @@ jobs:

      - name: Update symbols
        if: ${{ github.event_name == 'push' && github.repository_owner == 'pret' }}
        uses: EndBug/add-and-commit@v7
        uses: EndBug/add-and-commit@v9
        with:
          branch: symbols
          cwd: "./symbols"
          add: "*.sym"
          message: ${{ github.event.commits[0].message }}

M constants/item_data_constants.asm => constants/item_data_constants.asm +8 -0
@@ 59,6 59,14 @@ DEF MAILBOX_CAPACITY      EQU 10
DEF MAIL_STRUCT_LENGTH    EQU $2f ; mailmsg struct
DEF MAIL_STRUCT_LENGTH_JP EQU $2a ; mailmsg_jp struct

; mail languages
	const_def
	const MAIL_LANG_ENGLISH
	const MAIL_LANG_FRENCH
	const MAIL_LANG_GERMAN
	const MAIL_LANG_ITALIAN
	const MAIL_LANG_SPANISH

; held item effects
	const_def
	const HELD_NONE

M constants/serial_constants.asm => constants/serial_constants.asm +14 -10
@@ 19,8 19,10 @@ DEF USING_EXTERNAL_CLOCK       EQU $01
DEF USING_INTERNAL_CLOCK       EQU $02
DEF CONNECTION_NOT_ESTABLISHED EQU $ff

; length of a patch list (less than any of the signal bytes)
DEF SERIAL_PATCH_LIST_LENGTH          EQU $fc
; length of a patch list
DEF SERIAL_PATCH_LIST_LENGTH          EQU 200
; size of the patch area (offsets into this area may not have special values)
DEF SERIAL_PATCH_DATA_SIZE            EQU $fc
; signals the start of an array of bytes transferred over the link cable
DEF SERIAL_PREAMBLE_BYTE              EQU $fd
; this byte is used when there is no data to send


@@ 30,15 32,17 @@ DEF SERIAL_PATCH_LIST_PART_TERMINATOR EQU $ff
; used to replace SERIAL_NO_DATA_BYTE
DEF SERIAL_PATCH_REPLACEMENT_BYTE     EQU $ff

DEF SERIAL_PREAMBLE_LENGTH            EQU 6
DEF SERIAL_RN_PREAMBLE_LENGTH         EQU 7
DEF SERIAL_RNS_LENGTH                 EQU 10
DEF SERIAL_PREAMBLE_LENGTH       EQU 6
DEF SERIAL_RN_PREAMBLE_LENGTH    EQU 7
DEF SERIAL_PATCH_PREAMBLE_LENGTH EQU 3
DEF SERIAL_RNS_LENGTH            EQU 10

DEF SERIAL_MAIL_PREAMBLE_BYTE         EQU $20
DEF SERIAL_MAIL_REPLACEMENT_BYTE      EQU $21
DEF SERIAL_MAIL_PREAMBLE_LENGTH       EQU 5
DEF SERIAL_MAIL_PREAMBLE_BYTE    EQU $20
DEF SERIAL_MAIL_PREAMBLE_LENGTH  EQU 5
; used to replace SERIAL_NO_DATA_BYTE
DEF SERIAL_MAIL_REPLACEMENT_BYTE EQU $21

; timeout duration after exchanging a byte
DEF SERIAL_LINK_BYTE_TIMEOUT          EQU $5000
DEF SERIAL_LINK_BYTE_TIMEOUT EQU $5000

DEF MAX_MYSTERY_GIFT_PARTNERS         EQU 5
DEF MAX_MYSTERY_GIFT_PARTNERS EQU 5

M docs/bugs_and_glitches.md => docs/bugs_and_glitches.md +9 -4
@@ 614,10 614,15 @@ This bug affects Attract, Curse, Foresight, Mean Look, Mimic, Nightmare, Spider 
```diff
 CheckHiddenOpponent:
-; BUG: Lock-On and Mind Reader don't always bypass Fly and Dig (see docs/bugs_and_glitches.md)
-	ld a, BATTLE_VARS_SUBSTATUS3_OPP
-	call GetBattleVar
-	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
+	xor a
+	ld a, BATTLE_VARS_SUBSTATUS5_OPP
+	call GetBattleVar
+	cpl
+	and 1 << SUBSTATUS_LOCK_ON
+	ret z
+
 	ld a, BATTLE_VARS_SUBSTATUS3_OPP
 	call GetBattleVar
 	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
 	ret
```


M engine/link/link.asm => engine/link/link.asm +83 -67
@@ 90,7 90,7 @@ endc

	ld hl, wLinkData
	ld de, wOTPartyData
	ld bc, SERIAL_PREAMBLE_LENGTH + NAME_LENGTH + 1 + PARTY_LENGTH + 1 + (REDMON_STRUCT_LENGTH + NAME_LENGTH * 2) * PARTY_LENGTH + 3
	ld bc, SERIAL_PREAMBLE_LENGTH + NAME_LENGTH + (1 + PARTY_LENGTH + 1) + (REDMON_STRUCT_LENGTH + NAME_LENGTH * 2) * PARTY_LENGTH + 3
	vc_hook Wireless_ExchangeBytes_Gen2toGen1_party_structs
	call Serial_ExchangeBytes
	ld a, SERIAL_NO_DATA_BYTE


@@ 98,7 98,7 @@ endc

	ld hl, wPlayerPatchLists
	ld de, wOTPatchLists
	ld bc, 200
	ld bc, SERIAL_PATCH_LIST_LENGTH
	vc_hook Wireless_ExchangeBytes_Gen2toGen1_patch_lists
	call Serial_ExchangeBytes



@@ 122,11 122,11 @@ endc
	jp nc, ExitLinkCommunications

	ld de, wLinkData
	ld bc, NAME_LENGTH + 1 + PARTY_LENGTH + 1 + (REDMON_STRUCT_LENGTH + NAME_LENGTH * 2) * PARTY_LENGTH + 3
	ld bc, NAME_LENGTH + (1 + PARTY_LENGTH + 1) + (REDMON_STRUCT_LENGTH + NAME_LENGTH * 2) * PARTY_LENGTH + 3
	call Link_CopyOTData

	ld de, wOTPatchLists
	ld hl, wLinkPatchList1
	ld hl, wTimeCapsulePlayerData
	ld c, 2
.loop
	ld a, [de]


@@ 152,11 152,11 @@ endc
	jr .loop

.next
	ld hl, wLinkPatchList2
	ld hl, wTimeCapsulePlayerData + SERIAL_PATCH_DATA_SIZE
	dec c
	jr nz, .loop

	ld hl, wLinkPlayerName
	ld hl, wLinkData
	ld de, wOTPlayerName
	ld bc, NAME_LENGTH
	call CopyBytes


@@ 247,7 247,7 @@ endc
	ldh [rIE], a

	ld hl, wLinkBattleRNPreamble
	ld de, wEnemyMon
	ld de, wOTLinkBattleRNData
	ld bc, SERIAL_RN_PREAMBLE_LENGTH + SERIAL_RNS_LENGTH
	vc_hook Wireless_ExchangeBytes_RNG_state
	call Serial_ExchangeBytes


@@ 256,7 256,7 @@ endc

	ld hl, wLinkData
	ld de, wOTPartyData
	ld bc, SERIAL_PREAMBLE_LENGTH + NAME_LENGTH + 1 + PARTY_LENGTH + 1 + 2 + (PARTYMON_STRUCT_LENGTH + NAME_LENGTH * 2) * PARTY_LENGTH + 3
	ld bc, SERIAL_PREAMBLE_LENGTH + NAME_LENGTH + (1 + PARTY_LENGTH + 1) + 2 + (PARTYMON_STRUCT_LENGTH + NAME_LENGTH * 2) * PARTY_LENGTH + 3
	vc_hook Wireless_ExchangeBytes_party_structs
	call Serial_ExchangeBytes
	ld a, SERIAL_NO_DATA_BYTE


@@ 264,7 264,7 @@ endc

	ld hl, wPlayerPatchLists
	ld de, wOTPatchLists
	ld bc, 200
	ld bc, SERIAL_PATCH_LIST_LENGTH
	vc_hook Wireless_ExchangeBytes_patch_lists
	call Serial_ExchangeBytes



@@ 276,8 276,8 @@ endc
	ld bc, wLinkPlayerMailEnd - wLinkPlayerMail
	vc_hook Wireless_ExchangeBytes_mail
	call ExchangeBytes

.not_trading

	xor a
	ldh [rIF], a
	ld a, (1 << JOYPAD) | (1 << SERIAL) | (1 << TIMER) | (1 << VBLANK)


@@ 293,8 293,8 @@ endc
	ld bc, NAME_LENGTH + 1 + PARTY_LENGTH + 1 + 2 + (PARTYMON_STRUCT_LENGTH + NAME_LENGTH * 2) * PARTY_LENGTH
	call Link_CopyOTData

	ld de, wPlayerTrademon
	ld hl, wLinkPatchList1
	ld de, wOTPatchLists
	ld hl, wLinkPlayerData
	ld c, 2
.loop1
	ld a, [de]


@@ 320,7 320,7 @@ endc
	jr .loop1

.next1
	ld hl, wLinkPatchList2
	ld hl, wLinkPlayerData + SERIAL_PATCH_DATA_SIZE
	dec c
	jr nz, .loop1



@@ 339,10 339,14 @@ endc
	cp SERIAL_MAIL_PREAMBLE_BYTE
	jr z, .loop3
	dec hl

	ld de, wLinkOTMail
	ld bc, wLinkDataEnd - wLinkOTMail ; should be wLinkOTMailEnd - wLinkOTMail
	call CopyBytes
	ld hl, wLinkOTMail

; Replace SERIAL_MAIL_REPLACEMENT_BYTE with SERIAL_NO_DATA_BYTE across all mail
; message bodies.
	ld hl, wLinkOTMailMessages
	ld bc, (MAIL_MSG_LENGTH + 1) * PARTY_LENGTH
.loop4
	ld a, [hl]


@@ 355,7 359,8 @@ endc
	ld a, b
	or c
	jr nz, .loop4
	ld de, wOTPlayerMailPatchSet

	ld de, wLinkOTMailPatchSet
.loop5
	ld a, [de]
	inc de


@@ 406,7 411,7 @@ endc
.fix_mail_loop
	push bc
	push de
	farcall IsMailEuropean
	farcall ParseMailLanguage
	ld a, c
	or a
	jr z, .next


@@ 434,7 439,7 @@ endc
	ld [de], a

.skip_mail
	ld hl, wLinkPlayerName
	ld hl, wLinkData
	ld de, wOTPlayerName
	ld bc, NAME_LENGTH
	call CopyBytes


@@ 615,6 620,7 @@ FixDataForLinkTransfer:
	dec b
	jr nz, .preamble_loop

; Initialize random seed, making sure special bytes are omitted
	assert wLinkBattleRNPreamble + SERIAL_RN_PREAMBLE_LENGTH == wLinkBattleRNs
	ld b, SERIAL_RNS_LENGTH
.rn_loop


@@ 625,60 631,66 @@ FixDataForLinkTransfer:
	dec b
	jr nz, .rn_loop

; Clear the patch list
	ld hl, wPlayerPatchLists
	ld a, SERIAL_PREAMBLE_BYTE
rept SERIAL_PATCH_PREAMBLE_LENGTH
	ld [hli], a
	ld [hli], a
	ld [hli], a

	ld b, 200
endr
	ld b, SERIAL_PATCH_LIST_LENGTH
	xor a
.loop1
.clear_loop
	ld [hli], a
	dec b
	jr nz, .loop1
	jr nz, .clear_loop

	ld hl, (wLinkData + SERIAL_PREAMBLE_LENGTH + NAME_LENGTH + 1 + PARTY_LENGTH + 1) - 1
	ld de, wPlayerPatchLists + 10 ; ???
; Loop through all the patchable link data
	ld hl, wLinkData + SERIAL_PREAMBLE_LENGTH + NAME_LENGTH + (1 + PARTY_LENGTH + 1) - 1
	ld de, wPlayerPatchLists + SERIAL_RNS_LENGTH ; ???
	lb bc, 0, 0
.loop2
.patch_loop
; Check if we've gone over the entire area
	inc c
	ld a, c
	cp SERIAL_PATCH_LIST_LENGTH + 1
	jr z, .next1
	cp SERIAL_PATCH_DATA_SIZE + 1
	jr z, .data1_done

; If we're processing the second patch area, check if we've reached the end
	ld a, b
	dec a
	jr nz, .next2
	jr nz, .process
	push bc
	ld a, [wLinkMode]
	cp LINK_TIMECAPSULE
	ld b, REDMON_STRUCT_LENGTH * PARTY_LENGTH - SERIAL_PATCH_LIST_LENGTH + 1
	jr z, .got_value
	ld b, 2 + PARTYMON_STRUCT_LENGTH * PARTY_LENGTH - SERIAL_PATCH_LIST_LENGTH + 1
.got_value
	ld b, REDMON_STRUCT_LENGTH * PARTY_LENGTH - SERIAL_PATCH_DATA_SIZE + 1
	jr z, .got_size
	ld b, 2 + PARTYMON_STRUCT_LENGTH * PARTY_LENGTH - SERIAL_PATCH_DATA_SIZE + 1
.got_size
	ld a, c
	cp b
	pop bc
	jr z, .done
.next2
	jr z, .data2_done

.process
; Replace the "no data" byte, and record it in the array
	inc hl
	ld a, [hl]
	cp SERIAL_NO_DATA_BYTE
	jr nz, .loop2
	jr nz, .patch_loop
	ld a, c
	ld [de], a
	inc de
	ld [hl], SERIAL_PATCH_REPLACEMENT_BYTE
	jr .loop2
	jr .patch_loop

.next1
.data1_done
	ld a, SERIAL_PATCH_LIST_PART_TERMINATOR
	ld [de], a
	inc de
	lb bc, 1, 0
	jr .loop2
	jr .patch_loop

.done
.data2_done
	ld a, SERIAL_PATCH_LIST_PART_TERMINATOR
	ld [de], a
	ret


@@ 857,11 869,11 @@ Link_PrepPartyData_Gen2:
	ld de, wLinkData
	ld a, SERIAL_PREAMBLE_BYTE
	ld b, SERIAL_PREAMBLE_LENGTH
.loop1
.preamble_loop
	ld [de], a
	inc de
	dec b
	jr nz, .loop1
	jr nz, .preamble_loop

	ld hl, wPlayerName
	ld bc, NAME_LENGTH


@@ 893,7 905,7 @@ Link_PrepPartyData_Gen2:
	ret nz

; Fill 5 bytes at wLinkPlayerMailPreamble with $20
	ld de, wLinkPlayerMailPreamble
	ld de, wLinkPlayerMail
	ld a, SERIAL_MAIL_PREAMBLE_BYTE
	call Link_CopyMailPreamble



@@ 902,7 914,7 @@ Link_PrepPartyData_Gen2:
	call OpenSRAM
	ld hl, sPartyMail
	ld b, PARTY_LENGTH
.loop2
.message_loop
	push bc
	ld bc, MAIL_MSG_LENGTH + 1
	call CopyBytes


@@ 910,11 922,12 @@ Link_PrepPartyData_Gen2:
	add hl, bc
	pop bc
	dec b
	jr nz, .loop2
	jr nz, .message_loop

; Copy the mail data to wLinkPlayerMailMetadata
	ld hl, sPartyMail
	ld b, PARTY_LENGTH
.loop3
.metadata_loop
	push bc
	ld bc, MAIL_MSG_LENGTH + 1
	add hl, bc


@@ 922,29 935,31 @@ Link_PrepPartyData_Gen2:
	call CopyBytes
	pop bc
	dec b
	jr nz, .loop3
	jr nz, .metadata_loop

; Translate the messages if necessary
	ld b, PARTY_LENGTH
	ld de, sPartyMail
	ld hl, wLinkPlayerMailMessages
.loop4
.translate_loop
	push bc
	push hl
	push de
	push hl
	farcall IsMailEuropean
	farcall ParseMailLanguage
	pop de
	ld a, c
	or a
	jr z, .next
	sub $3
	or a ; MAIL_LANG_ENGLISH
	jr z, .translate_next
	sub MAIL_LANG_ITALIAN
	jr nc, .italian_spanish
	farcall ConvertFrenchGermanMailToEnglish
	jr .next
	jr .translate_next
.italian_spanish
	cp $2
	jr nc, .next
	cp (MAIL_LANG_SPANISH + 1) - MAIL_LANG_ITALIAN
	jr nc, .translate_next
	farcall ConvertSpanishItalianMailToEnglish
.next
.translate_next
	pop de
	ld hl, MAIL_STRUCT_LENGTH
	add hl, de


@@ 955,41 970,42 @@ Link_PrepPartyData_Gen2:
	add hl, bc
	pop bc
	dec b
	jr nz, .loop4
	jr nz, .translate_loop
	call CloseSRAM

; The SERIAL_NO_DATA_BYTE value isn't allowed anywhere in message text
	ld hl, wLinkPlayerMailMessages
	ld bc, (MAIL_MSG_LENGTH + 1) * PARTY_LENGTH
.loop5
.message_patch_loop
	ld a, [hl]
	cp SERIAL_NO_DATA_BYTE
	jr nz, .skip2
	jr nz, .message_patch_skip
	ld [hl], SERIAL_MAIL_REPLACEMENT_BYTE
.skip2
.message_patch_skip
	inc hl
	dec bc
	ld a, b
	or c
	jr nz, .loop5
	jr nz, .message_patch_loop

; Calculate the patch offsets for the mail metadata
	ld hl, wLinkPlayerMailMetadata
	ld de, wLinkPlayerMailPatchSet
	ld b, (MAIL_STRUCT_LENGTH - (MAIL_MSG_LENGTH + 1)) * PARTY_LENGTH
	ld c, 0
.loop6
.metadata_patch_loop
	inc c
	ld a, [hl]
	cp SERIAL_NO_DATA_BYTE
	jr nz, .skip3
	jr nz, .metadata_patch_skip
	ld [hl], SERIAL_PATCH_REPLACEMENT_BYTE
	ld a, c
	ld [de], a
	inc de
.skip3
.metadata_patch_skip
	inc hl
	dec b
	jr nz, .loop6

	jr nz, .metadata_patch_loop
	ld a, SERIAL_PATCH_LIST_PART_TERMINATOR
	ld [de], a
	ret


@@ 1193,7 1209,7 @@ Link_CopyRandomNumbers:
	ldh a, [hSerialConnectionStatus]
	cp USING_INTERNAL_CLOCK
	ret z
	ld hl, wEnemyMonSpecies
	ld hl, wOTLinkBattleRNData
	call Link_FindFirstNonControlCharacter_AllowZero
	ld de, wLinkBattleRNs
	ld c, 10

M engine/link/mystery_gift.asm => engine/link/mystery_gift.asm +6 -6
@@ 76,7 76,7 @@ endc
	jp z, .LinkCanceled
	cp MG_OKAY
	jp nz, .CommunicationError
	ld a, [wMysteryGiftGameVersion]
	ld a, [wMysteryGiftPartnerGameVersion]
	cp POKEMON_PIKACHU_2_VERSION
	jr z, .skip_checks
	call .CheckAlreadyGotFiveGiftsToday


@@ 92,11 92,11 @@ endc
	ld a, [wMysteryGiftPartnerBackupItem]
	and a
	jp nz, .FriendNotReady
	ld a, [wMysteryGiftGameVersion]
	ld a, [wMysteryGiftPartnerGameVersion]
	cp POKEMON_PIKACHU_2_VERSION
	jr z, .skip_append_save
	call .AddMysteryGiftPartnerID
	ld a, [wMysteryGiftGameVersion]
	ld a, [wMysteryGiftPartnerGameVersion]
	cp RESERVED_GAME_VERSION
	jr z, .skip_append_save
	call .SaveMysteryGiftTrainerName


@@ 307,7 307,7 @@ endc
	ldh a, [hMGRole]
	cp IR_SENDER
	jr z, SenderExchangeMysteryGiftDataPayloads
; receiver

	ld hl, hMGExchangedByte
	ld b, 1
	call TryReceivingIRDataBlock


@@ 522,7 522,7 @@ EndOrContinueMysteryGiftIRCommunication:
	ldh a, [hMGRole]
	cp IR_SENDER
	jr z, .sender
; receiver

	call BeginReceivingIRCommunication
	jr nz, EndOrContinueMysteryGiftIRCommunication
	jp ReceiverExchangeMysteryGiftDataPayloads


@@ 563,7 563,7 @@ ExchangeNameCardData:
	ldh a, [hMGRole]
	cp IR_SENDER
	jr z, .sender
; receiver

	; Receive the data payload
	call ReceiveNameCardDataPayload
	jp nz, EndNameCardIRCommunication

M engine/pokemon/european_mail.asm => engine/pokemon/european_mail.asm +7 -12
@@ 1,29 1,24 @@
IsMailEuropean:
; return 1 if French
; return 2 if German
; return 3 if Italian
; return 4 if Spanish
; return 0 if none of the above
	ld c, $0
ParseMailLanguage:
	ld c, MAIL_LANG_ENGLISH
	ld hl, sPartyMon1MailNationality - sPartyMon1Mail
	add hl, de
	ld a, [hli]
	cp "E"
	ret nz
	ld a, [hli]
	inc c
	inc c ; MAIL_LANG_FRENCH
	cp "F"
	ret z
	inc c
	inc c ; MAIL_LANG_GERMAN
	cp "G"
	ret z
	inc c
	inc c ; MAIL_LANG_ITALIAN
	cp "I"
	ret z
	inc c
	inc c ; MAIL_LANG_SPANISH
	cp "S"
	ret z
	ld c, $0
	ld c, MAIL_LANG_ENGLISH
	ret

; The regular font.

M engine/pokemon/mail_2.asm => engine/pokemon/mail_2.asm +3 -3
@@ 31,14 31,14 @@ ReadAnyMail:
	push de
	ld a, BANK(sPartyMail)
	call OpenSRAM
	farcall IsMailEuropean
	farcall ParseMailLanguage
	call CloseSRAM
	ld a, c
	ld de, StandardEnglishFont
	or a
	or a ; MAIL_LANG_ENGLISH
	jr z, .got_font
	ld de, FrenchGermanFont
	sub $3
	sub MAIL_LANG_ITALIAN
	jr c, .got_font
	ld de, SpanishItalianFont


M home/serial.asm => home/serial.asm +1 -1
@@ 114,7 114,7 @@ Serial_ExchangeBytes::
	dec hl
	cp SERIAL_PREAMBLE_BYTE
	jr nz, .loop
	xor a
	xor a ; FALSE
	ldh [hSerialIgnoringInitialData], a
	jr .loop


M ram/wram.asm => ram/wram.asm +20 -12
@@ 617,8 617,8 @@ wBattleEnd::
SECTION UNION "Miscellaneous", WRAM0

; link patch lists
wPlayerPatchLists:: ds 200
wOTPatchLists:: ds 200
wPlayerPatchLists:: ds SERIAL_PATCH_LIST_LENGTH
wOTPatchLists:: ds SERIAL_PATCH_LIST_LENGTH


SECTION UNION "Miscellaneous", WRAM0


@@ 1006,10 1006,6 @@ 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




@@ 1034,13 1030,14 @@ 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
wLinkPlayerMailPatchSet:: ds 100 + SERIAL_PATCH_PREAMBLE_LENGTH
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
wLinkOTMailPatchSet:: ds 100 + SERIAL_PATCH_PREAMBLE_LENGTH
wLinkOTMailPadding:: ds SERIAL_MAIL_PREAMBLE_LENGTH
wLinkOTMailEnd::
	ds 10



@@ 1073,7 1070,7 @@ ENDU
	ds 138

wMysteryGiftPartnerData::
wMysteryGiftGameVersion:: db
wMysteryGiftPartnerGameVersion:: db
wMysteryGiftPartnerID:: dw
wMysteryGiftPartnerName:: ds NAME_LENGTH
wMysteryGiftPartnerDexCaught:: db


@@ 1087,7 1084,7 @@ wMysteryGiftPartnerDataEnd::
	ds 60

wMysteryGiftPlayerData::
	ds 1
wMysteryGiftPlayerGameVersion:: db
wMysteryGiftPlayerID:: dw
wMysteryGiftPlayerName:: ds NAME_LENGTH
wMysteryGiftPlayerDexCaught:: db


@@ 2002,8 1999,15 @@ 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
; may store a name, partymon, or mail
wSwitchMonBuffer::
UNION
	ds NAME_LENGTH
NEXTU
	ds PARTYMON_STRUCT_LENGTH
NEXTU
	ds MAIL_STRUCT_LENGTH
ENDU


SECTION UNION "Miscellaneous WRAM 1", WRAMX


@@ 2624,11 2628,15 @@ ENDU
wTempEnemyMonSpecies::  db
wTempBattleMonSpecies:: db

UNION
wOTLinkBattleRNData:: ds SERIAL_RN_PREAMBLE_LENGTH + SERIAL_RNS_LENGTH
NEXTU
wEnemyMon:: battle_struct wEnemyMon
wEnemyMonBaseStats:: ds NUM_EXP_STATS
wEnemyMonCatchRate:: db
wEnemyMonBaseExp::   db
wEnemyMonEnd::
ENDU

wBattleMode::
; 0: overworld