Merge pull request #271 from PikalaxALT/mystery_gift

mystery_gift.c
This commit is contained in:
Adrienn Tindall 2023-12-19 11:49:45 -05:00 committed by GitHub
commit 439efca963
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 508 additions and 886 deletions

View File

@ -213,21 +213,21 @@
.public GetIGTMinutes
.public Save_MysteryGift_Init
.public SaveMysteryGift_CardGetByIdx
.public sub_0202DC2C
.public sub_0202DCAC
.public sub_0202DD48
.public sub_0202DDB0
.public sub_0202DDEC
.public SaveMysteryGift_TryInsertGift
.public SaveMysteryGift_TryInsertCard
.public SaveMysteryGift_TrySetSpecialCard
.public SaveMysteryGift_ReceiveGiftAndClearCardByIndex
.public SaveMysteryGift_DeleteWonderCardByIndex
.public SaveMysteryGift_FindAvailable
.public SaveMysteryGift_CardFindAvailable
.public sub_0202DE90
.public sub_0202DEBC
.public sub_0202DED8
.public sub_0202DEF8
.public sub_0202DF7C
.public sub_0202DFAC
.public sub_0202E014
.public sub_0202E024
.public SaveMysteryGift_CardTagIsValid
.public SaveMysteryGift_SpecialCardTagIsValid
.public SaveMysteryGift_HasAnyCard
.public SaveMysteryGift_HasAnyGift
.public SaveMysteryGift_ReceivedFlagTest
.public SaveMysteryGift_ReceivedFlagSet
.public SaveMysteryGift_TestFlagx7FF
.public SaveMysteryGift_SetFlagx7FF
.public sub_0202EC14
.public sub_0202EC28
.public sub_0202EC98

View File

@ -30,12 +30,12 @@
.public GiveOrTakeSeal
.public SealCase_CheckSealQuantity
.public Save_SpecialRibbons_Get
.public GetStaticPointerToSaveMysteryGift
.public DeleteStaticPointerToMysteryGift
.public GetFirstQueuedMysteryGiftIdx
.public GetMysteryGiftTagByIdx
.public GetMysteryGiftDataByIdx
.public SetMysteryGiftReceivedByIdx
.public SaveMGDataPtr_Begin
.public SaveMGDataPtr_End
.public SaveMGDataPtr_GetFirstGiftIndex
.public SaveMGDataPtr_GetTagByIndex
.public SaveMGDataPtr_GetDataByIndex
.public SaveMGDataPtr_SetReceivedByIndex
.public UpdatePokedexWithReceivedSpecies
.public Save_PhotoAlbum_Get
.public PhotoAlbum_GetIndexOfFirstEmptySlot

View File

@ -6,21 +6,21 @@
.public Save_MysteryGift_sizeof
.public Save_MysteryGift_Init
.public SaveMysteryGift_CardGetByIdx
.public sub_0202DC2C
.public sub_0202DCAC
.public sub_0202DD48
.public sub_0202DDB0
.public sub_0202DDEC
.public SaveMysteryGift_TryInsertGift
.public SaveMysteryGift_TryInsertCard
.public SaveMysteryGift_TrySetSpecialCard
.public SaveMysteryGift_ReceiveGiftAndClearCardByIndex
.public SaveMysteryGift_DeleteWonderCardByIndex
.public SaveMysteryGift_FindAvailable
.public SaveMysteryGift_CardFindAvailable
.public sub_0202DE90
.public sub_0202DEBC
.public sub_0202DED8
.public sub_0202DEF8
.public sub_0202DF7C
.public sub_0202DFAC
.public sub_0202E014
.public sub_0202E024
.public SaveMysteryGift_CardTagIsValid
.public SaveMysteryGift_SpecialCardTagIsValid
.public SaveMysteryGift_HasAnyCard
.public SaveMysteryGift_HasAnyGift
.public SaveMysteryGift_ReceivedFlagTest
.public SaveMysteryGift_ReceivedFlagSet
.public SaveMysteryGift_TestFlagx7FF
.public SaveMysteryGift_SetFlagx7FF
.public GetStaticPointerToSaveMysteryGift
.public DeleteStaticPointerToMysteryGift
.public GetFirstQueuedMysteryGiftIdx

View File

@ -892,7 +892,7 @@ _022276D8:
mov r0, #0
str r0, [r4, #0x40]
ldr r0, [r4, #0x14]
bl sub_0202E014
bl SaveMysteryGift_TestFlagx7FF
cmp r0, #1
bne _0222779A
ldr r1, [r4, #0x40]
@ -2120,7 +2120,7 @@ ov74_MainMenu_PrintMysteryGiftButton: ; 0x022280B4
cmp r0, #0
bne _022280FC
ldr r0, [r5, #0x14]
bl sub_0202E014
bl SaveMysteryGift_TestFlagx7FF
cmp r0, #1
bne _022280D4
mov r0, #1
@ -2179,7 +2179,7 @@ _0222810C:
orr r0, r1
str r0, [r5, #0x38]
ldr r0, [r5, #0x14]
bl sub_0202E024
bl SaveMysteryGift_SetFlagx7FF
add sp, #8
mov r0, #1
pop {r3, r4, r5, r6, r7, pc}
@ -4656,7 +4656,7 @@ ov74_0222947C: ; 0x0222947C
add r1, r4, #0
ldr r0, [r5, r0]
mov r2, #3
bl sub_0202DC2C
bl SaveMysteryGift_TryInsertGift
mov r0, #1
mov r1, #0
bl GfGfx_EngineBTogglePlanes
@ -6258,7 +6258,7 @@ _0222A1CE:
add r1, #0x4c
ldrh r1, [r1]
add r7, r0, #0
bl sub_0202DFAC
bl SaveMysteryGift_ReceivedFlagSet
add r4, #0x4e
ldrb r0, [r4]
lsl r0, r0, #0x1d
@ -6274,7 +6274,7 @@ _0222A1CE:
bne _0222A204
add r0, r7, #0
add r1, r5, #0
bl sub_0202DD48
bl SaveMysteryGift_TrySetSpecialCard
b _0222A21C
_0222A204:
cmp r6, #0
@ -6282,12 +6282,12 @@ _0222A204:
add r0, r7, #0
add r1, r5, #0
mov r2, #3
bl sub_0202DC2C
bl SaveMysteryGift_TryInsertGift
b _0222A21C
_0222A214:
add r0, r7, #0
add r1, r5, #0
bl sub_0202DCAC
bl SaveMysteryGift_TryInsertCard
_0222A21C:
ldr r0, [sp]
bl ov74_022360A0
@ -7229,7 +7229,7 @@ ov74_0222A94C: ; 0x0222A94C
add r5, r5, #1
str r2, [sp, #0x24]
str r1, [sp, #0x28]
bl sub_0202DED8
bl SaveMysteryGift_HasAnyCard
cmp r0, #0
beq _0222A992
lsl r6, r5, #3
@ -7244,7 +7244,7 @@ ov74_0222A94C: ; 0x0222A94C
str r2, [r1, #4]
_0222A992:
ldr r0, [sp, #0x18]
bl sub_0202DEBC
bl SaveMysteryGift_SpecialCardTagIsValid
cmp r0, #0
beq _0222A9B0
lsl r6, r5, #3
@ -12330,7 +12330,7 @@ ov74_0222D308: ; 0x0222D308
ldr r0, [r4, r1]
add r1, #0x20
ldr r1, [r4, r1]
bl sub_0202DEF8
bl SaveMysteryGift_HasAnyGift
cmp r0, #1
ldr r0, _0222D350 ; =0x00002BD0
bne _0222D330
@ -12378,20 +12378,20 @@ ov74_0222D358: ; 0x0222D358
ldr r0, [r4, r1]
add r1, #0x20
ldr r1, [r4, r1]
bl sub_0202DEF8
bl SaveMysteryGift_HasAnyGift
cmp r0, #1
ldr r1, _0222D408 ; =0x00002BA0
bne _0222D39A
ldr r0, [r4, r1]
add r1, #0x20
ldr r1, [r4, r1]
bl sub_0202DDB0
bl SaveMysteryGift_ReceiveGiftAndClearCardByIndex
b _0222D3A4
_0222D39A:
ldr r0, [r4, r1]
add r1, #0x20
ldr r1, [r4, r1]
bl sub_0202DDEC
bl SaveMysteryGift_DeleteWonderCardByIndex
_0222D3A4:
ldr r0, _0222D40C ; =0x00002BA4
ldr r0, [r4, r0]
@ -12401,7 +12401,7 @@ _0222D3A4:
bl sub_0200F450
ldr r0, _0222D408 ; =0x00002BA0
ldr r0, [r4, r0]
bl sub_0202DED8
bl SaveMysteryGift_HasAnyCard
cmp r0, #0
bne _0222D3C4
mov r0, #0x1b
@ -12571,7 +12571,7 @@ _0222D50C:
ldr r0, [r4, r0]
cmp r0, #0
beq _0222D51C
bl sub_0202DEF8
bl SaveMysteryGift_HasAnyGift
cmp r0, #1
bne _0222D520
_0222D51C:
@ -13346,7 +13346,7 @@ _0222DB14:
ldr r0, _0222DB2C ; =0x00002BA0
add r1, r4, #0
ldr r0, [r5, r0]
bl sub_0202DE90
bl SaveMysteryGift_CardTagIsValid
cmp r0, #0
beq _0222DB02
_0222DB26:
@ -17618,7 +17618,7 @@ _0222FDF2:
cmp r0, #1
bne _0222FE0E
add r0, r6, #0
bl sub_0202DF7C
bl SaveMysteryGift_ReceivedFlagTest
cmp r0, #1
bne _0222FE0E
mov r0, #2

View File

@ -37,24 +37,24 @@ FieldSystem_InitGetMysteryGiftGmmState: ; 0x0204BD78
thumb_func_start FieldSystem_GetTagOfNextMG
FieldSystem_GetTagOfNextMG: ; 0x0204BD80
push {r3, lr}
bl GetFirstQueuedMysteryGiftIdx
bl GetMysteryGiftTagByIdx
bl SaveMGDataPtr_GetFirstGiftIndex
bl SaveMGDataPtr_GetTagByIndex
pop {r3, pc}
thumb_func_end FieldSystem_GetTagOfNextMG
thumb_func_start FieldSystem_GetDataOfNextMG
FieldSystem_GetDataOfNextMG: ; 0x0204BD8C
push {r3, lr}
bl GetFirstQueuedMysteryGiftIdx
bl GetMysteryGiftDataByIdx
bl SaveMGDataPtr_GetFirstGiftIndex
bl SaveMGDataPtr_GetDataByIndex
pop {r3, pc}
thumb_func_end FieldSystem_GetDataOfNextMG
thumb_func_start FieldSystem_SetQueuedMGReceived
FieldSystem_SetQueuedMGReceived: ; 0x0204BD98
push {r3, lr}
bl GetFirstQueuedMysteryGiftIdx
bl SetMysteryGiftReceivedByIdx
bl SaveMGDataPtr_GetFirstGiftIndex
bl SaveMGDataPtr_SetReceivedByIndex
pop {r3, pc}
thumb_func_end FieldSystem_SetQueuedMGReceived
@ -90,7 +90,7 @@ _0204BDD2:
ldr r0, [r4]
mov r1, #0x20
ldr r0, [r0, #0xc]
bl GetStaticPointerToSaveMysteryGift
bl SaveMGDataPtr_Begin
b _0204BF8C
_0204BDE0:
; End
@ -98,7 +98,7 @@ _0204BDE0:
ldr r0, [r4]
mov r1, #0
ldr r0, [r0, #0xc]
bl DeleteStaticPointerToMysteryGift
bl SaveMGDataPtr_End
b _0204BF8C
_0204BDEE:
; End.2
@ -106,7 +106,7 @@ _0204BDEE:
ldr r0, [r4]
mov r1, #1
ldr r0, [r0, #0xc]
bl DeleteStaticPointerToMysteryGift
bl SaveMGDataPtr_End
b _0204BF8C
_0204BDFC:
; Check bool

View File

@ -1,782 +0,0 @@
.include "asm/macros.inc"
.include "unk_0202DBA8.inc"
.include "global.inc"
.bss
sMysteryGiftData:
.space 0x4
.text
thumb_func_start Save_MysteryGift_sizeof
Save_MysteryGift_sizeof: ; 0x0202DBA8
mov r0, #0x5a
lsl r0, r0, #6
bx lr
.balign 4, 0
thumb_func_end Save_MysteryGift_sizeof
thumb_func_start Save_MysteryGift_Init
Save_MysteryGift_Init: ; 0x0202DBB0
ldr r3, _0202DBB8 ; =SaveSubstruct_UpdateCRC
mov r0, #0x1b
bx r3
nop
_0202DBB8: .word SaveSubstruct_UpdateCRC
thumb_func_end Save_MysteryGift_Init
thumb_func_start MysteryGiftTagIsValid
MysteryGiftTagIsValid: ; 0x0202DBBC
cmp r0, #0
beq _0202DBC8
cmp r0, #0x10
bhs _0202DBC8
mov r0, #1
bx lr
_0202DBC8:
mov r0, #0
bx lr
thumb_func_end MysteryGiftTagIsValid
thumb_func_start SaveMysteryGift_GetByIdx
SaveMysteryGift_GetByIdx: ; 0x0202DBCC
push {r3, r4, r5, lr}
cmp r1, #0
blt _0202DBF0
cmp r1, #8
bge _0202DBF0
mov r2, #1
lsl r2, r2, #8
add r4, r0, r2
lsl r0, r1, #6
add r0, r1, r0
lsl r5, r0, #2
ldrh r0, [r4, r5]
bl MysteryGiftTagIsValid
cmp r0, #0
beq _0202DBF0
add r0, r4, r5
pop {r3, r4, r5, pc}
_0202DBF0:
mov r0, #0
pop {r3, r4, r5, pc}
thumb_func_end SaveMysteryGift_GetByIdx
thumb_func_start SaveMysteryGift_CardGetByIdx
SaveMysteryGift_CardGetByIdx: ; 0x0202DBF4
push {r3, r4, r5, lr}
cmp r1, #0
blt _0202DC1A
cmp r1, #3
bge _0202DC1A
mov r2, #0x92
lsl r2, r2, #4
add r4, r0, r2
mov r0, #0xd6
lsl r0, r0, #2
add r5, r1, #0
mul r5, r0
ldrh r0, [r4, r5]
bl MysteryGiftTagIsValid
cmp r0, #0
beq _0202DC24
add r0, r4, r5
pop {r3, r4, r5, pc}
_0202DC1A:
cmp r1, #4
bne _0202DC24
ldr r1, _0202DC28 ; =0x00001328
add r0, r0, r1
pop {r3, r4, r5, pc}
_0202DC24:
mov r0, #0
pop {r3, r4, r5, pc}
.balign 4, 0
_0202DC28: .word 0x00001328
thumb_func_end SaveMysteryGift_CardGetByIdx
thumb_func_start sub_0202DC2C
sub_0202DC2C: ; 0x0202DC2C
push {r3, r4, r5, r6, r7, lr}
sub sp, #0x10
str r1, [sp, #4]
mov r1, #0
str r0, [sp]
str r2, [sp, #8]
str r1, [sp, #0xc]
bl SaveMysteryGift_FindAvailable
cmp r0, #0
bne _0202DC48
add sp, #0x10
mov r0, #0
pop {r3, r4, r5, r6, r7, pc}
_0202DC48:
mov r7, #0x41
lsl r7, r7, #2
ldr r5, [sp]
mov r4, #0
sub r6, r7, #4
_0202DC52:
ldrh r0, [r5, r6]
bl MysteryGiftTagIsValid
cmp r0, #0
bne _0202DC94
lsl r0, r4, #6
mov r2, #1
add r0, r4, r0
lsl r4, r0, #2
ldr r1, [sp]
lsl r2, r2, #8
add r1, r1, r2
ldr r0, [sp, #4]
add r1, r1, r4
add r2, r2, #4
bl MI_CpuCopy8
ldr r1, _0202DCA8 ; =0x00000102
ldr r0, [sp]
mov r2, #3
add r1, r0, r1
ldrh r0, [r1, r4]
bic r0, r2
ldr r2, [sp, #8]
lsl r2, r2, #0x10
lsr r3, r2, #0x10
mov r2, #3
and r2, r3
orr r0, r2
strh r0, [r1, r4]
mov r0, #1
str r0, [sp, #0xc]
b _0202DC9C
_0202DC94:
add r4, r4, #1
add r5, r5, r7
cmp r4, #8
blt _0202DC52
_0202DC9C:
mov r0, #0x1b
bl SaveSubstruct_UpdateCRC
ldr r0, [sp, #0xc]
add sp, #0x10
pop {r3, r4, r5, r6, r7, pc}
.balign 4, 0
_0202DCA8: .word 0x00000102
thumb_func_end sub_0202DC2C
thumb_func_start sub_0202DCAC
sub_0202DCAC: ; 0x0202DCAC
push {r4, r5, r6, r7, lr}
sub sp, #0xc
str r1, [sp, #4]
mov r1, #0
str r0, [sp]
str r1, [sp, #8]
bl SaveMysteryGift_CardFindAvailable
cmp r0, #0
bne _0202DCC6
add sp, #0xc
mov r0, #0
pop {r4, r5, r6, r7, pc}
_0202DCC6:
ldr r1, _0202DD44 ; =0x00000152
ldr r0, [sp, #4]
ldrb r0, [r0, r1]
lsl r0, r0, #0x1c
lsr r0, r0, #0x1f
cmp r0, #1
bne _0202DCE4
ldr r0, [sp]
bl SaveMysteryGift_FindAvailable
cmp r0, #0
bne _0202DCE4
add sp, #0xc
mov r0, #0
pop {r4, r5, r6, r7, pc}
_0202DCE4:
mov r7, #0xd6
mov r6, #0x92
ldr r5, [sp]
mov r4, #0
lsl r7, r7, #2
lsl r6, r6, #4
_0202DCF0:
ldrh r0, [r5, r6]
bl MysteryGiftTagIsValid
cmp r0, #0
bne _0202DD30
mov r2, #0x92
ldr r1, [sp]
lsl r2, r2, #4
add r3, r1, r2
mov r2, #0xd6
lsl r2, r2, #2
add r1, r4, #0
mul r1, r2
ldr r0, [sp, #4]
add r1, r3, r1
bl MI_CpuCopy8
ldr r1, _0202DD44 ; =0x00000152
ldr r0, [sp, #4]
ldrb r0, [r0, r1]
lsl r0, r0, #0x1c
lsr r0, r0, #0x1f
cmp r0, #1
bne _0202DD2A
ldr r0, [sp]
ldr r1, [sp, #4]
add r2, r4, #0
bl sub_0202DC2C
_0202DD2A:
mov r0, #1
str r0, [sp, #8]
b _0202DD38
_0202DD30:
add r4, r4, #1
add r5, r5, r7
cmp r4, #3
blt _0202DCF0
_0202DD38:
mov r0, #0x1b
bl SaveSubstruct_UpdateCRC
ldr r0, [sp, #8]
add sp, #0xc
pop {r4, r5, r6, r7, pc}
.balign 4, 0
_0202DD44: .word 0x00000152
thumb_func_end sub_0202DCAC
thumb_func_start sub_0202DD48
sub_0202DD48: ; 0x0202DD48
push {r3, r4, r5, lr}
add r5, r0, #0
ldr r0, _0202DD78 ; =0x00001328
add r4, r1, #0
ldrh r0, [r5, r0]
bl MysteryGiftTagIsValid
cmp r0, #1
bne _0202DD5E
mov r0, #0
pop {r3, r4, r5, pc}
_0202DD5E:
ldr r1, _0202DD78 ; =0x00001328
mov r2, #0xd6
add r0, r4, #0
add r1, r5, r1
lsl r2, r2, #2
bl MI_CpuCopy8
mov r0, #0x1b
bl SaveSubstruct_UpdateCRC
mov r0, #0
pop {r3, r4, r5, pc}
nop
_0202DD78: .word 0x00001328
thumb_func_end sub_0202DD48
thumb_func_start SaveMysteryGiftI_SetReceived
SaveMysteryGiftI_SetReceived: ; 0x0202DD7C
push {r3, r4, r5, lr}
add r5, r1, #0
add r4, r0, #0
cmp r5, #8
blt _0202DD8A
bl GF_AssertFail
_0202DD8A:
lsl r0, r5, #6
add r0, r5, r0
lsl r0, r0, #2
mov r1, #1
mov r3, #0
add r2, r4, r0
lsl r1, r1, #8
strh r3, [r2, r1]
add r1, r1, #2
add r3, r4, r1
ldrh r2, [r3, r0]
mov r1, #3
bic r2, r1
strh r2, [r3, r0]
mov r0, #0x1b
bl SaveSubstruct_UpdateCRC
mov r0, #1
pop {r3, r4, r5, pc}
thumb_func_end SaveMysteryGiftI_SetReceived
thumb_func_start sub_0202DDB0
sub_0202DDB0: ; 0x0202DDB0
push {r3, r4, r5, lr}
add r4, r1, #0
add r5, r0, #0
cmp r4, #3
blt _0202DDBE
bl GF_AssertFail
_0202DDBE:
mov r0, #0xd6
lsl r0, r0, #2
mul r0, r4
add r2, r5, r0
mov r0, #0x92
mov r1, #0
lsl r0, r0, #4
strh r1, [r2, r0]
mov r1, #0xa7
lsl r1, r1, #4
ldrh r1, [r2, r1]
add r0, r5, #0
bl sub_0202DFDC
add r0, r5, #0
add r1, r4, #0
bl sub_0202DF38
mov r0, #0x1b
bl SaveSubstruct_UpdateCRC
mov r0, #1
pop {r3, r4, r5, pc}
thumb_func_end sub_0202DDB0
thumb_func_start sub_0202DDEC
sub_0202DDEC: ; 0x0202DDEC
push {r3, r4, r5, lr}
add r4, r1, #0
add r5, r0, #0
cmp r4, #3
blt _0202DDFA
bl GF_AssertFail
_0202DDFA:
mov r0, #0xd6
lsl r0, r0, #2
mul r0, r4
add r1, r5, r0
mov r0, #0x92
mov r2, #0
lsl r0, r0, #4
strh r2, [r1, r0]
mov r0, #0x1b
bl SaveSubstruct_UpdateCRC
mov r0, #1
pop {r3, r4, r5, pc}
thumb_func_end sub_0202DDEC
thumb_func_start SaveMysteryGift_FindAvailable
SaveMysteryGift_FindAvailable: ; 0x0202DE14
push {r3, r4, r5, r6, r7, lr}
mov r7, #0x41
lsl r7, r7, #2
add r5, r0, #0
mov r4, #0
sub r6, r7, #4
_0202DE20:
ldrh r0, [r5, r6]
bl MysteryGiftTagIsValid
cmp r0, #0
bne _0202DE2E
mov r0, #1
pop {r3, r4, r5, r6, r7, pc}
_0202DE2E:
add r4, r4, #1
add r5, r5, r7
cmp r4, #8
blt _0202DE20
mov r0, #0
pop {r3, r4, r5, r6, r7, pc}
.balign 4, 0
thumb_func_end SaveMysteryGift_FindAvailable
thumb_func_start SaveMysteryGift_CardFindAvailable
SaveMysteryGift_CardFindAvailable: ; 0x0202DE3C
push {r3, r4, r5, r6, r7, lr}
mov r7, #0xd6
mov r6, #0x92
add r5, r0, #0
mov r4, #0
lsl r7, r7, #2
lsl r6, r6, #4
_0202DE4A:
ldrh r0, [r5, r6]
bl MysteryGiftTagIsValid
cmp r0, #0
bne _0202DE58
mov r0, #1
pop {r3, r4, r5, r6, r7, pc}
_0202DE58:
add r4, r4, #1
add r5, r5, r7
cmp r4, #3
blt _0202DE4A
mov r0, #0
pop {r3, r4, r5, r6, r7, pc}
thumb_func_end SaveMysteryGift_CardFindAvailable
thumb_func_start SaveMysteryGiftI_TagIsValid
SaveMysteryGiftI_TagIsValid: ; 0x0202DE64
push {r3, r4, r5, lr}
add r4, r1, #0
add r5, r0, #0
cmp r4, #8
blt _0202DE72
bl GF_AssertFail
_0202DE72:
lsl r0, r4, #6
add r0, r4, r0
lsl r0, r0, #2
add r1, r5, r0
mov r0, #1
lsl r0, r0, #8
ldrh r0, [r1, r0]
bl MysteryGiftTagIsValid
cmp r0, #0
beq _0202DE8C
mov r0, #1
pop {r3, r4, r5, pc}
_0202DE8C:
mov r0, #0
pop {r3, r4, r5, pc}
thumb_func_end SaveMysteryGiftI_TagIsValid
thumb_func_start sub_0202DE90
sub_0202DE90: ; 0x0202DE90
push {r3, r4, r5, lr}
add r4, r1, #0
add r5, r0, #0
cmp r4, #3
blt _0202DE9E
bl GF_AssertFail
_0202DE9E:
mov r0, #0xd6
lsl r0, r0, #2
mul r0, r4
add r1, r5, r0
mov r0, #0x92
lsl r0, r0, #4
ldrh r0, [r1, r0]
bl MysteryGiftTagIsValid
cmp r0, #0
beq _0202DEB8
mov r0, #1
pop {r3, r4, r5, pc}
_0202DEB8:
mov r0, #0
pop {r3, r4, r5, pc}
thumb_func_end sub_0202DE90
thumb_func_start sub_0202DEBC
sub_0202DEBC: ; 0x0202DEBC
push {r3, lr}
ldr r1, _0202DED4 ; =0x00001328
ldrh r0, [r0, r1]
bl MysteryGiftTagIsValid
cmp r0, #0
beq _0202DECE
mov r0, #1
pop {r3, pc}
_0202DECE:
mov r0, #0
pop {r3, pc}
nop
_0202DED4: .word 0x00001328
thumb_func_end sub_0202DEBC
thumb_func_start sub_0202DED8
sub_0202DED8: ; 0x0202DED8
push {r3, r4, r5, lr}
add r5, r0, #0
mov r4, #0
_0202DEDE:
add r0, r5, #0
add r1, r4, #0
bl sub_0202DE90
cmp r0, #1
bne _0202DEEE
mov r0, #1
pop {r3, r4, r5, pc}
_0202DEEE:
add r4, r4, #1
cmp r4, #3
blt _0202DEDE
mov r0, #0
pop {r3, r4, r5, pc}
thumb_func_end sub_0202DED8
thumb_func_start sub_0202DEF8
sub_0202DEF8: ; 0x0202DEF8
push {r3, r4, r5, r6, r7, lr}
add r5, r0, #0
ldr r0, _0202DF34 ; =0x00000102
add r7, r1, #0
mov r6, #0
add r4, r5, r0
_0202DF04:
mov r0, #1
lsl r0, r0, #8
ldrh r0, [r5, r0]
bl MysteryGiftTagIsValid
cmp r0, #0
beq _0202DF20
ldrh r0, [r4]
lsl r0, r0, #0x1e
lsr r0, r0, #0x1e
cmp r7, r0
bne _0202DF20
mov r0, #1
pop {r3, r4, r5, r6, r7, pc}
_0202DF20:
mov r0, #0x41
lsl r0, r0, #2
add r6, r6, #1
add r5, r5, r0
add r4, r4, r0
cmp r6, #8
blt _0202DF04
mov r0, #0
pop {r3, r4, r5, r6, r7, pc}
nop
_0202DF34: .word 0x00000102
thumb_func_end sub_0202DEF8
thumb_func_start sub_0202DF38
sub_0202DF38: ; 0x0202DF38
push {r3, r4, r5, r6, r7, lr}
add r7, r1, #0
ldr r1, _0202DF78 ; =0x00000102
str r0, [sp]
mov r6, #0
add r4, r0, #0
add r5, r0, r1
_0202DF46:
mov r0, #1
lsl r0, r0, #8
ldrh r0, [r4, r0]
bl MysteryGiftTagIsValid
cmp r0, #0
beq _0202DF68
ldrh r0, [r5]
lsl r0, r0, #0x1e
lsr r0, r0, #0x1e
cmp r7, r0
bne _0202DF68
ldr r0, [sp]
add r1, r6, #0
bl SaveMysteryGiftI_SetReceived
pop {r3, r4, r5, r6, r7, pc}
_0202DF68:
mov r0, #0x41
lsl r0, r0, #2
add r6, r6, #1
add r4, r4, r0
add r5, r5, r0
cmp r6, #8
blt _0202DF46
pop {r3, r4, r5, r6, r7, pc}
.balign 4, 0
_0202DF78: .word 0x00000102
thumb_func_end sub_0202DF38
thumb_func_start sub_0202DF7C
sub_0202DF7C: ; 0x0202DF7C
push {r3, r4, r5, lr}
add r5, r0, #0
mov r0, #2
add r4, r1, #0
lsl r0, r0, #0xa
cmp r4, r0
blt _0202DF8E
bl GF_AssertFail
_0202DF8E:
mov r0, #1
mov r1, #7
add r2, r4, #0
and r2, r1
add r1, r0, #0
lsl r1, r2
asr r2, r4, #2
lsr r2, r2, #0x1d
add r2, r4, r2
asr r2, r2, #3
ldrb r2, [r5, r2]
tst r1, r2
bne _0202DFAA
mov r0, #0
_0202DFAA:
pop {r3, r4, r5, pc}
thumb_func_end sub_0202DF7C
thumb_func_start sub_0202DFAC
sub_0202DFAC: ; 0x0202DFAC
push {r3, r4, r5, lr}
add r5, r0, #0
mov r0, #2
add r4, r1, #0
lsl r0, r0, #0xa
cmp r4, r0
blt _0202DFBE
bl GF_AssertFail
_0202DFBE:
asr r0, r4, #2
lsr r0, r0, #0x1d
add r0, r4, r0
asr r1, r0, #3
mov r2, #7
ldrb r0, [r5, r1]
mov r3, #1
and r2, r4
lsl r3, r2
orr r0, r3
strb r0, [r5, r1]
mov r0, #0x1b
bl SaveSubstruct_UpdateCRC
pop {r3, r4, r5, pc}
thumb_func_end sub_0202DFAC
thumb_func_start sub_0202DFDC
sub_0202DFDC: ; 0x0202DFDC
push {r4, r5, r6, lr}
add r5, r0, #0
add r4, r1, #0
mov r1, #1
mov r0, #7
and r0, r4
add r2, r1, #0
lsl r2, r0
mvn r0, r2
lsl r0, r0, #0x18
lsr r6, r0, #0x18
lsl r0, r1, #0xb
cmp r4, r0
blt _0202DFFC
bl GF_AssertFail
_0202DFFC:
asr r0, r4, #2
lsr r0, r0, #0x1d
add r0, r4, r0
asr r1, r0, #3
ldrb r0, [r5, r1]
and r0, r6
strb r0, [r5, r1]
mov r0, #0x1b
bl SaveSubstruct_UpdateCRC
pop {r4, r5, r6, pc}
.balign 4, 0
thumb_func_end sub_0202DFDC
thumb_func_start sub_0202E014
sub_0202E014: ; 0x0202E014
ldr r3, _0202E01C ; =sub_0202DF7C
ldr r1, _0202E020 ; =0x000007FF
bx r3
nop
_0202E01C: .word sub_0202DF7C
_0202E020: .word 0x000007FF
thumb_func_end sub_0202E014
thumb_func_start sub_0202E024
sub_0202E024: ; 0x0202E024
ldr r3, _0202E02C ; =sub_0202DFAC
ldr r1, _0202E030 ; =0x000007FF
bx r3
nop
_0202E02C: .word sub_0202DFAC
_0202E030: .word 0x000007FF
thumb_func_end sub_0202E024
thumb_func_start GetStaticPointerToSaveMysteryGift
GetStaticPointerToSaveMysteryGift: ; 0x0202E034
push {r3, lr}
ldr r1, _0202E050 ; =sMysteryGiftData
ldr r1, [r1]
cmp r1, #0
bne _0202E046
bl Save_MysteryGift_Get
ldr r1, _0202E050 ; =sMysteryGiftData
str r0, [r1]
_0202E046:
mov r0, #0x1b
bl SaveSubstruct_UpdateCRC
pop {r3, pc}
nop
_0202E050: .word sMysteryGiftData
thumb_func_end GetStaticPointerToSaveMysteryGift
thumb_func_start DeleteStaticPointerToMysteryGift
DeleteStaticPointerToMysteryGift: ; 0x0202E054
ldr r0, _0202E064 ; =sMysteryGiftData
ldr r1, [r0]
cmp r1, #0
beq _0202E060
mov r1, #0
str r1, [r0]
_0202E060:
bx lr
nop
_0202E064: .word sMysteryGiftData
thumb_func_end DeleteStaticPointerToMysteryGift
thumb_func_start GetFirstQueuedMysteryGiftIdx
GetFirstQueuedMysteryGiftIdx: ; 0x0202E068
push {r3, r4, r5, lr}
ldr r4, _0202E08C ; =sMysteryGiftData
mov r5, #0
_0202E06E:
ldr r0, [r4]
add r1, r5, #0
bl SaveMysteryGiftI_TagIsValid
cmp r0, #1
bne _0202E07E
add r0, r5, #0
pop {r3, r4, r5, pc}
_0202E07E:
add r5, r5, #1
cmp r5, #8
blt _0202E06E
mov r0, #0
mvn r0, r0
pop {r3, r4, r5, pc}
nop
_0202E08C: .word sMysteryGiftData
thumb_func_end GetFirstQueuedMysteryGiftIdx
thumb_func_start GetMysteryGiftTagByIdx
GetMysteryGiftTagByIdx: ; 0x0202E090
push {r3, lr}
add r1, r0, #0
ldr r0, _0202E0A8 ; =sMysteryGiftData
ldr r0, [r0]
bl SaveMysteryGift_GetByIdx
cmp r0, #0
beq _0202E0A4
ldrh r0, [r0]
pop {r3, pc}
_0202E0A4:
mov r0, #0
pop {r3, pc}
.balign 4, 0
_0202E0A8: .word sMysteryGiftData
thumb_func_end GetMysteryGiftTagByIdx
thumb_func_start GetMysteryGiftDataByIdx
GetMysteryGiftDataByIdx: ; 0x0202E0AC
push {r3, lr}
add r1, r0, #0
ldr r0, _0202E0C4 ; =sMysteryGiftData
ldr r0, [r0]
bl SaveMysteryGift_GetByIdx
cmp r0, #0
beq _0202E0C0
add r0, r0, #4
pop {r3, pc}
_0202E0C0:
mov r0, #0
pop {r3, pc}
.balign 4, 0
_0202E0C4: .word sMysteryGiftData
thumb_func_end GetMysteryGiftDataByIdx
thumb_func_start SetMysteryGiftReceivedByIdx
SetMysteryGiftReceivedByIdx: ; 0x0202E0C8
add r1, r0, #0
ldr r0, _0202E0D4 ; =sMysteryGiftData
ldr r3, _0202E0D8 ; =SaveMysteryGiftI_SetReceived
ldr r0, [r0]
bx r3
nop
_0202E0D4: .word sMysteryGiftData
_0202E0D8: .word SaveMysteryGiftI_SetReceived
thumb_func_end SetMysteryGiftReceivedByIdx

View File

@ -4,66 +4,187 @@
#include "pokemon_types_def.h"
#include "photo_album.h"
enum MysteryGiftTag {
MG_TAG_pokemon,
MG_TAG_egg,
MG_TAG_item,
MG_TAG_battle_rules,
MG_TAG_secret_base_deco, // disabled in hgss
MG_TAG_mon_deco,
MG_TAG_manaphy_egg,
MG_TAG_member_card, // disabled in hgss
MG_TAG_oaks_letter, // disabled in hgss
MG_TAG_azure_flute, // disabled in hgss
MG_TAG_poketch_app, // disabled in hgss
MG_TAG_secret_key, // disabled in hgss
MG_TAG_pokemon_movie,
MG_TAG_pokewalker_course,
MG_TAG_memorial_photo,
};
#define MG_TAG_INVALID 0
#define MG_TAG_POKEMON 1
#define MG_TAG_EGG 2
#define MG_TAG_ITEM 3
#define MG_TAG_BATTLE_RULES 4
#define MG_TAG_SECRET_BASE_DECO 5 // disabled in hgss
#define MG_TAG_MON_DECO 6
#define MG_TAG_MANAPHY_EGG 7
#define MG_TAG_MEMBER_CARD 8 // disabled in hgss
#define MG_TAG_OAKS_LETTER 9 // disabled in hgss
#define MG_TAG_AZURE_FLUTE 10 // disabled in hgss
#define MG_TAG_POKETCH_APP 11 // disabled in hgss
#define MG_TAG_SECRET_KEY 12 // disabled in hgss
#define MG_TAG_POKEMON_MOVIE 13
#define MG_TAG_POKEWALKER_COURSE 14
#define MG_TAG_MEMORIAL_PHOTO 15
#define MG_TAG_MAX 16
typedef struct MG_POKEMON_TAG {
#define NUM_SAVED_MYSTERY_GIFTS 8
#define NUM_SAVED_WONDER_CARDS 3
#define RECEIVED_WONDER_CARD_IDX 4
#define NUM_MYSTERY_GIFT_RECV_FLAGS 2048
typedef struct MysteryGiftPokemonTag {
BOOL fixedOT;
Pokemon mon;
u8 ribbons[10];
} MG_POKEMON_TAG;
} MysteryGiftPokemonTag;
typedef struct MG_MON_DECO_TAG {
typedef struct MysteryGiftMonDecorationTag {
int kind; // 1 = seal, 2 = fashion, 3 = background
int id;
} MG_MON_DECO_TAG;
} MysteryGiftMonDecorationTag;
typedef union {
MysteryGiftPokemonTag pokemon;
Pokemon egg;
u32 item;
u16 ruleset[24];
int baseDecoration;
MysteryGiftMonDecorationTag monDecoration;
u8 pokewalkerCourse;
PHOTO photo;
u8 raw[256];
} MysteryGiftData;
typedef struct UnkWonderCardSubstruct_104 {
u16 name[36];
u32 version; // 88
u16 id; // 8C
u8 unique:1; // 8E
u8 unk8E_1:1;
u8 unk8E_2:1;
u8 unk8E_3:1;
u8 unk8E_4:1;
u8 unk8E_5:1;
u8 unk8E_6:2;
} UnkWonderCardSubstruct_104;
typedef struct {
u16 tag;
u16 flag;
union {
MG_POKEMON_TAG pokemon;
Pokemon egg;
u32 item;
u16 ruleset[24];
int base_decoration;
MG_MON_DECO_TAG mon_decoration;
u8 pokewalkerCourse;
PHOTO photo;
u8 raw[256];
};
u16 flag : 2;
u16 dummy : 14;
MysteryGiftData data;
} MysteryGift;
typedef struct {
u16 tag;
u16 flag;
union {
u8 raw[852];
};
} WonderCard;
MysteryGiftData data;
UnkWonderCardSubstruct_104 unk104;
u16 text[250];
u8 shareMax;
u16 monIcon[3];
u8 shareCount;
s32 receiveDate;
} WonderCard; // size: 0x358
typedef struct {
u8 filler_000[0x100]; // 0000
MysteryGift gifts[8]; // 0100
WonderCard cards[4]; // 920
} MYSTERY_GIFT_SAVE; // size = 0x1680
u8 receivedFlags[NUM_MYSTERY_GIFT_RECV_FLAGS / 8]; // 0000
MysteryGift gifts[NUM_SAVED_MYSTERY_GIFTS]; // 0100
WonderCard cards[NUM_SAVED_WONDER_CARDS]; // 920
WonderCard specialWonderCard; // 1328
} MysteryGiftSave; // size = 0x1680
// Save block API
u32 Save_MysteryGift_sizeof(void);
void Save_MysteryGift_Init(MYSTERY_GIFT_SAVE *mg);
void Save_MysteryGift_Init(MysteryGiftSave *mg);
// Returns a pointer to the requested Wonder Card.
// If the index is 0, 1, or 2, will return a
// pointer to the corresponding Wonder Card slot,
// or NULL if that card slot is unoccupied or
// corrupted. Otherwise, if the index is 4,
// will return a non-nullable pointer to a
// special Wonder Card slot that's exclusive
// to HGSS. Otherwise, returns NULL.
WonderCard* SaveMysteryGift_CardGetByIdx(MysteryGiftSave* mg, int index);
// Returns TRUE if there is an open slot
// to receive a gift. The capacity is 8.
BOOL SaveMysteryGift_FindAvailable(const MysteryGiftSave* mg);
// Attempts to insert a Mystery Gift into an
// open slot. Returns TRUE on success.
BOOL SaveMysteryGift_TryInsertGift(MysteryGiftSave* mg, const MysteryGift* src, int cardIdx);
// Attempts to insert a Wonder Card into an
// open slot. Returns TRUE on success.
BOOL SaveMysteryGift_TryInsertCard(MysteryGiftSave* mg, const WonderCard* src);
// Attempts to set the special Wonder Card slot
// with the given data. Returns TRUE on success.
BOOL SaveMysteryGift_TrySetSpecialCard(MysteryGiftSave* mg, const WonderCard* src);
// Deletes the Wonder Card at the given slot,
// clears the corresponding event flag, and
// removes the corresponding gift. Returns TRUE.
BOOL SaveMysteryGift_ReceiveGiftAndClearCardByIndex(MysteryGiftSave* mg, int index);
// Deletes the Wonder Card at the given slot.
// Returns TRUE.
BOOL SaveMysteryGift_DeleteWonderCardByIndex(MysteryGiftSave* mg, int index);
// Returns TRUE if there is an open slot to add a
// new Wonder Card
BOOL SaveMysteryGift_CardFindAvailable(const MysteryGiftSave* mg);
// Returns TRUE if the given Wonder Card slot is
// occupied.
BOOL SaveMysteryGift_CardTagIsValid(const MysteryGiftSave* mg, int index);
// Returns TRUE if the special Wonder Card slot
// is occupied.
BOOL SaveMysteryGift_SpecialCardTagIsValid(const MysteryGiftSave* mg);
// Returns TRUE if any Wonder Card slot is
// occupied, excluding the special slot.
BOOL SaveMysteryGift_HasAnyCard(const MysteryGiftSave* mg);
// Returns TRUE if any Mystery Gift slot is
// occupied.
BOOL SaveMysteryGift_HasAnyGift(const MysteryGiftSave* mg, int index);
// Checks the event flag by index. Returns
// TRUE if set.
BOOL SaveMysteryGift_ReceivedFlagTest(const MysteryGiftSave* mg, int index);
// Sets the event flag by index.
void SaveMysteryGift_ReceivedFlagSet(MysteryGiftSave* mg, int index);
// Checks whether flag 0x7FF (2047) is set.
// Returns TRUE if so.
BOOL SaveMysteryGift_TestFlagx7FF(const MysteryGiftSave* mg);
// Sets flag 0x7FF (2047).
void SaveMysteryGift_SetFlagx7FF(MysteryGiftSave* mg);
// The following functions are used by script
// commands.
// Loads the internal MysteryGiftSave pointer.
void SaveMGDataPtr_Begin(SaveData* saveData);
// Unloads the internal MysteryGiftSave pointer.
void SaveMGDataPtr_End(void);
// Gets the index of the first occupied
// Mystery Gift slot.
int SaveMGDataPtr_GetFirstGiftIndex(void);
// Returns the Mystery Gift type at the
// given slot index.
u16 SaveMGDataPtr_GetTagByIndex(int index);
// Retrieves a pointer to the Mystery Gift data
// at the given slot index.
MysteryGiftData* SaveMGDataPtr_GetDataByIndex(int index);
// Flag the Mystery Gift at the given slot index
// as received.
void SaveMGDataPtr_SetReceivedByIndex(int index);
#endif //POKEHEARTGOLD_MYSTERY_GIFT_H

View File

@ -34,7 +34,7 @@ extern const int gNumExtraSaveChunkHeaders;
struct UnkStruct_0202E474 *sub_020270C4(SaveData *saveData);
PCStorage *SaveArray_PCStorage_Get(SaveData *saveData);
MYSTERY_GIFT_SAVE *Save_MysteryGift_Get(SaveData *saveData);
MysteryGiftSave *Save_MysteryGift_Get(SaveData *saveData);
struct MigratedPokemonSav *Save_MigratedPokemon_Get(SaveData *saveData);
HALL_OF_FAME *LoadHallOfFame(SaveData *saveData, HeapID heapId, int *ret_p);
int SaveHallOfFame(SaveData *saveData, HALL_OF_FAME *hallOfFame);

View File

@ -120,7 +120,7 @@ Static main
Object src/save_special_ribbons.o
Object src/roamer.o
Object asm/unk_0202DB34.o
Object asm/unk_0202DBA8.o
Object src/mystery_gift.o
Object src/hall_of_fame.o
Object asm/unk_0202E41C.o
Object asm/unk_0202E4B0.o

283
src/mystery_gift.c Normal file
View File

@ -0,0 +1,283 @@
#include "global.h"
#include "mystery_gift.h"
#include "save.h"
#include "save_arrays.h"
#include "constants/save_arrays.h"
BOOL MysteryGiftTagIsValid(u32 tag);
MysteryGift* SaveMysteryGift_GetByIdx(MysteryGiftSave* mg, int index);
BOOL SaveMysteryGift_SetReceivedByIdx(MysteryGiftSave* mg, int index);
void SaveMysteryGift_ReceivedFlagClear(MysteryGiftSave* mg, int index);
void SaveMysteryGift_SetReceivedByCardId(MysteryGiftSave* mg, int index);
BOOL SaveMysteryGift_TagAtIndexIsValid(const MysteryGiftSave* mg, int index);
void SaveMysteryGift_ReceivedFlagClear(MysteryGiftSave* mg, int index);
u32 Save_MysteryGift_sizeof(void) {
return sizeof(MysteryGiftSave);
}
void Save_MysteryGift_Init(MysteryGiftSave* mg) {
SaveSubstruct_UpdateCRC(SAVE_MYSTERY_GIFT);
}
BOOL MysteryGiftTagIsValid(u32 tag) {
return tag != MG_TAG_INVALID && tag < MG_TAG_MAX;
}
MysteryGift* SaveMysteryGift_GetByIdx(MysteryGiftSave* mg, int index) {
if (index >= 0 && index < NUM_SAVED_MYSTERY_GIFTS) {
MysteryGift* ret = &mg->gifts[index];
if (MysteryGiftTagIsValid(ret->tag)) {
return ret;
}
}
return NULL;
}
WonderCard* SaveMysteryGift_CardGetByIdx(MysteryGiftSave* mg, int index) {
if (index >= 0 && index < NUM_SAVED_WONDER_CARDS) {
WonderCard* ret = &mg->cards[index];
if (MysteryGiftTagIsValid(ret->tag)) {
return ret;
}
} else if (index == RECEIVED_WONDER_CARD_IDX) {
return &mg->specialWonderCard;
}
return NULL;
}
BOOL SaveMysteryGift_TryInsertGift(MysteryGiftSave* mg, const MysteryGift* src, int cardIdx) {
BOOL ret = FALSE;
int i;
if (!SaveMysteryGift_FindAvailable(mg)) {
return FALSE;
}
for (i = 0; i < NUM_SAVED_MYSTERY_GIFTS; ++i) {
if (!MysteryGiftTagIsValid(mg->gifts[i].tag)) {
MI_CpuCopy8(src, &mg->gifts[i], sizeof(MysteryGift));
mg->gifts[i].flag = cardIdx;
ret = TRUE;
break;
}
}
SaveSubstruct_UpdateCRC(SAVE_MYSTERY_GIFT);
return ret;
}
BOOL SaveMysteryGift_TryInsertCard(MysteryGiftSave* mg, const WonderCard* src) {
BOOL ret = FALSE;
int i;
if (!SaveMysteryGift_CardFindAvailable(mg)) {
return FALSE;
}
if (src->unk104.unk8E_3 == 1 && !SaveMysteryGift_FindAvailable(mg)) {
return FALSE;
}
for (i = 0; i < NUM_SAVED_WONDER_CARDS; ++i) {
if (!MysteryGiftTagIsValid(mg->cards[i].tag)) {
MI_CpuCopy8(src, &mg->cards[i], sizeof(WonderCard));
if (src->unk104.unk8E_3 == 1) {
SaveMysteryGift_TryInsertGift(mg, (const MysteryGift*)src, i);
}
ret = TRUE;
break;
}
}
SaveSubstruct_UpdateCRC(SAVE_MYSTERY_GIFT);
return ret;
}
BOOL SaveMysteryGift_TrySetSpecialCard(MysteryGiftSave* mg, const WonderCard* src) {
if (MysteryGiftTagIsValid(mg->specialWonderCard.tag) == TRUE) {
return FALSE;
}
MI_CpuCopy8(src, &mg->specialWonderCard, sizeof(WonderCard));
SaveSubstruct_UpdateCRC(SAVE_MYSTERY_GIFT);
return FALSE;
}
BOOL SaveMysteryGift_SetReceivedByIdx(MysteryGiftSave* mg, int index) {
GF_ASSERT(index < NUM_SAVED_MYSTERY_GIFTS);
mg->gifts[index].tag = MG_TAG_INVALID;
mg->gifts[index].flag = 0;
SaveSubstruct_UpdateCRC(SAVE_MYSTERY_GIFT);
return TRUE;
}
BOOL SaveMysteryGift_ReceiveGiftAndClearCardByIndex(MysteryGiftSave* mg, int index) {
GF_ASSERT(index < NUM_SAVED_WONDER_CARDS);
mg->cards[index].tag = MG_TAG_INVALID;
SaveMysteryGift_ReceivedFlagClear(mg, mg->cards[index].unk104.id);
SaveMysteryGift_SetReceivedByCardId(mg, index);
SaveSubstruct_UpdateCRC(SAVE_MYSTERY_GIFT);
return TRUE;
}
BOOL SaveMysteryGift_DeleteWonderCardByIndex(MysteryGiftSave* mg, int index) {
GF_ASSERT(index < NUM_SAVED_WONDER_CARDS);
mg->cards[index].tag = MG_TAG_INVALID;
SaveSubstruct_UpdateCRC(SAVE_MYSTERY_GIFT);
return TRUE;
}
BOOL SaveMysteryGift_FindAvailable(const MysteryGiftSave* mg) {
int i;
for (i = 0; i < NUM_SAVED_MYSTERY_GIFTS; ++i) {
if (!MysteryGiftTagIsValid(mg->gifts[i].tag)) {
return TRUE;
}
}
return FALSE;
}
BOOL SaveMysteryGift_CardFindAvailable(const MysteryGiftSave* mg) {
int i;
for (i = 0; i < NUM_SAVED_WONDER_CARDS; ++i) {
if (!MysteryGiftTagIsValid(mg->cards[i].tag)) {
return TRUE;
}
}
return FALSE;
}
BOOL SaveMysteryGift_TagAtIndexIsValid(const MysteryGiftSave* mg, int index) {
GF_ASSERT(index < NUM_SAVED_MYSTERY_GIFTS);
return MysteryGiftTagIsValid(mg->gifts[index].tag) != FALSE;
}
BOOL SaveMysteryGift_CardTagIsValid(const MysteryGiftSave* mg, int index) {
GF_ASSERT(index < NUM_SAVED_WONDER_CARDS);
return MysteryGiftTagIsValid(mg->cards[index].tag) != FALSE;
}
BOOL SaveMysteryGift_SpecialCardTagIsValid(const MysteryGiftSave* mg) {
return MysteryGiftTagIsValid(mg->specialWonderCard.tag) != FALSE;
}
BOOL SaveMysteryGift_HasAnyCard(const MysteryGiftSave* mg) {
int i;
for (i = 0; i < NUM_SAVED_WONDER_CARDS; ++i) {
if (SaveMysteryGift_CardTagIsValid(mg, i) == TRUE) {
return TRUE;
}
}
return FALSE;
}
BOOL SaveMysteryGift_HasAnyGift(const MysteryGiftSave* mg, int a1) {
int i;
for (i = 0; i < NUM_SAVED_MYSTERY_GIFTS; ++i) {
if (MysteryGiftTagIsValid(mg->gifts[i].tag) && a1 == mg->gifts[i].flag) {
return TRUE;
}
}
return FALSE;
}
void SaveMysteryGift_SetReceivedByCardId(MysteryGiftSave* mg, int a1) {
int i;
for (i = 0; i < NUM_SAVED_MYSTERY_GIFTS; ++i) {
if (MysteryGiftTagIsValid(mg->gifts[i].tag) && a1 == mg->gifts[i].flag) {
SaveMysteryGift_SetReceivedByIdx(mg, i);
break;
}
}
}
BOOL SaveMysteryGift_ReceivedFlagTest(const MysteryGiftSave* mg, int index) {
GF_ASSERT(index < NUM_MYSTERY_GIFT_RECV_FLAGS);
return mg->receivedFlags[index / 8] & (1 << (index & 7)) ? TRUE : FALSE;
}
void SaveMysteryGift_ReceivedFlagSet(MysteryGiftSave* mg, int index) {
GF_ASSERT(index < NUM_MYSTERY_GIFT_RECV_FLAGS);
mg->receivedFlags[index / 8] |= (1 << (index & 7));
SaveSubstruct_UpdateCRC(SAVE_MYSTERY_GIFT);
}
void SaveMysteryGift_ReceivedFlagClear(MysteryGiftSave* mg, int index) {
u8 mask = ~(1 << (index & 7));
GF_ASSERT(index < NUM_MYSTERY_GIFT_RECV_FLAGS);
mg->receivedFlags[index / 8] &= mask;
SaveSubstruct_UpdateCRC(SAVE_MYSTERY_GIFT);
}
BOOL SaveMysteryGift_TestFlagx7FF(const MysteryGiftSave* mg) {
return SaveMysteryGift_ReceivedFlagTest(mg, 0x7FF);
}
void SaveMysteryGift_SetFlagx7FF(MysteryGiftSave* mg) {
SaveMysteryGift_ReceivedFlagSet(mg, 0x7FF);
}
// ======================================
static MysteryGiftSave* sMysteryGiftSaveData;
void SaveMGDataPtr_Begin(SaveData* saveData) {
if (sMysteryGiftSaveData == NULL) {
sMysteryGiftSaveData = Save_MysteryGift_Get(saveData);
}
SaveSubstruct_UpdateCRC(SAVE_MYSTERY_GIFT);
}
void SaveMGDataPtr_End(void) {
if (sMysteryGiftSaveData != NULL) {
sMysteryGiftSaveData = NULL;
}
}
int SaveMGDataPtr_GetFirstGiftIndex(void) {
int i;
for (i = 0; i < NUM_SAVED_MYSTERY_GIFTS; ++i) {
if (SaveMysteryGift_TagAtIndexIsValid(sMysteryGiftSaveData, i) == TRUE) {
return i;
}
}
return -1;
}
u16 SaveMGDataPtr_GetTagByIndex(int index) {
MysteryGift* gift = SaveMysteryGift_GetByIdx(sMysteryGiftSaveData, index);
if (gift != NULL) {
return gift->tag;
}
return MG_TAG_INVALID;
}
MysteryGiftData* SaveMGDataPtr_GetDataByIndex(int index) {
MysteryGift* gift = SaveMysteryGift_GetByIdx(sMysteryGiftSaveData, index);
if (gift != NULL) {
return &gift->data;
}
return NULL;
}
void SaveMGDataPtr_SetReceivedByIndex(int index) {
SaveMysteryGift_SetReceivedByIdx(sMysteryGiftSaveData, index);
}

View File

@ -271,7 +271,7 @@ PCStorage *SaveArray_PCStorage_Get(SaveData *saveData) {
return SaveArray_Get(saveData, SAVE_PCSTORAGE);
}
MYSTERY_GIFT_SAVE *Save_MysteryGift_Get(SaveData *saveData) {
MysteryGiftSave *Save_MysteryGift_Get(SaveData *saveData) {
SaveSubstruct_AssertCRC(SAVE_MYSTERY_GIFT);
return SaveArray_Get(saveData, SAVE_MYSTERY_GIFT);
}