Merge branch 'master' into master

This commit is contained in:
Adrienn Tindall 2023-12-19 13:53:31 -05:00 committed by GitHub
commit 4754b344c4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
29 changed files with 811 additions and 1158 deletions

View File

@ -73,7 +73,7 @@
.public GfGfx_EngineATogglePlanes
.public GfGfx_EngineASetPlanes
.public GfGfx_EngineBTogglePlanes
.public GfGfx_EngineBGetPlanes
.public GfGfx_EngineAGetPlanes
.public Camera_New
.public Camera_Delete
.public Camera_Copy

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

@ -6538,7 +6538,7 @@ _02257258: .word 0x00000283
ov03_0225725C: ; 0x0225725C
push {r4, lr}
add r4, r0, #0
bl GfGfx_EngineBGetPlanes
bl GfGfx_EngineAGetPlanes
mov r1, #0x9f
lsl r1, r1, #2
str r0, [r4, r1]

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

22
include/blackout.h Normal file
View File

@ -0,0 +1,22 @@
#ifndef POKEHEARTGOLD_BLACKOUT_H
#define POKEHEARTGOLD_BLACKOUT_H
#include "global.h"
#include "field_system.h"
#include "message_format.h"
#include "msgdata.h"
#include "task.h"
typedef struct BlackoutScreenEnvironment {
s32 state;
FieldSystem *fieldSystem;
BgConfig *bgConfig;
Window window;
MsgData *msgData;
MessageFormat *msgFmt;
} BlackoutScreenEnvironment;
BOOL Task_Blackout(TaskManager *taskManager);
void CallTask_Blackout(TaskManager *taskManager);
#endif //POKEHEARTGOLD_BLACKOUT_H

View File

@ -3,8 +3,8 @@
#include "script.h"
BOOL CheckUseEscapeRopeInAlphChamber(FieldSystem* fieldSystem);
BOOL CheckUseFlashInAlphChamber(FieldSystem* fieldSystem);
BOOL CheckUseWaterStoneInAlphChamber(FieldSystem* fieldSystem);
BOOL CheckUseEscapeRopeInAlphChamber(FieldSystem *fieldSystem);
BOOL CheckUseFlashInAlphChamber(FieldSystem *fieldSystem);
BOOL CheckUseWaterStoneInAlphChamber(FieldSystem *fieldSystem);
#endif //POKEHEARTGOLD_FIELD_ALPH_CHECKS_H

View File

@ -1,9 +0,0 @@
#ifndef POKEHEARTGOLD_FIELD_BLACK_OUT_H
#define POKEHEARTGOLD_FIELD_BLACK_OUT_H
#include "task.h"
BOOL FieldTask_BlackOut(TaskManager *taskManager);
void CallFieldTask_BlackOut(TaskManager *taskManager);
#endif //POKEHEARTGOLD_FIELD_BLACK_OUT_H

View File

@ -55,6 +55,6 @@ void GfGfx_EngineBTogglePlanes(GXPlaneMask planeMask, GFPlaneToggle enable);
void GfGfx_EngineBSetPlanes(u32 planes);
void GfGfx_BothDispOn(void);
void GfGfx_SwapDisplay(void);
u32 GfGfx_EngineBGetPlanes(void);
u32 GfGfx_EngineAGetPlanes(void);
#endif //POKEHEARTGOLD_GF_GFX_PLANES_H

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

@ -6,7 +6,7 @@
#include "options.h"
#include "text_0205B4EC.h"
#define MakeTextColor(fg, sh, bg) ((((fg) & 0xFF) << 16) | (((sh) & 0xFF) << 8) | (((bg) & 0xFF) << 0))
#define MAKE_TEXT_COLOR(fg, sh, bg) ((((fg) & 0xFF) << 16) | (((sh) & 0xFF) << 8) | (((bg) & 0xFF) << 0))
#define TEXT_SPEED_INSTANT 0 // Transfers to VRAM
#define TEXT_SPEED_NOTRANSFER 0xFF // Defers VRAM transfer

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
@ -190,7 +190,7 @@ Static main
Object src/encounter.o
Object asm/unk_020517A4.o
Object src/battle/battle_setup.o
Object src/field_black_out.o
Object src/blackout.o
Object src/game_clear.o
Object src/field_warp_tasks.o
Object src/script_pokemon_util.o

View File

@ -881,7 +881,7 @@ static void ov17_02202850(BerryPotsAppData *data, u32 seqNo) {
FillWindowPixelBuffer(&data->windows[0], 0);
u32 stringWidth = FontID_String_GetWidth(4, data->cancelString, 0);
AddTextPrinterParameterized2(&data->windows[0], 4, data->cancelString, (48 - stringWidth) / 2, 0, 0xFF, MakeTextColor(1, 2, 0), NULL);
AddTextPrinterParameterized2(&data->windows[0], 4, data->cancelString, (48 - stringWidth) / 2, 0, 0xFF, MAKE_TEXT_COLOR(1, 2, 0), NULL);
ScheduleWindowCopyToVram(&data->windows[0]);
}

243
src/blackout.c Normal file
View File

@ -0,0 +1,243 @@
#include "scrcmd.h"
#include "gf_gfx_loader.h"
#include "unk_0200FA24.h"
#include "blackout.h"
#include "system.h"
#include "render_window.h"
#include "font.h"
#include "text.h"
#include "save_local_field_data.h"
#include "unk_0203BA5C.h"
#include "field_warp_tasks.h"
#include "brightness.h"
#include "unk_0206793C.h"
#include "unk_0200B150.h"
#include "unk_02054E00.h"
#include "unk_020552A4.h"
#include "use_item_on_mon.h"
#include "sound.h"
#include "msgdata/msg/msg_0203.h"
#include "msgdata/msg.naix"
static void Blackout_InitDisplays(BgConfig *bgConfig);
static void Blackout_DrawMessage(FieldSystem *fieldSystem, TaskManager *taskManager);
static BOOL Task_ShowPrintedBlackoutMessage(TaskManager *taskManager);
static void Blackout_PrintMessage(BlackoutScreenEnvironment *environment, s32 msgNo, u8 x, u8 y);
static const struct GraphicsBanks sBlackoutGraphicsBanks = {
.bg = GX_VRAM_BG_128_B,
.bgextpltt = GX_VRAM_BGEXTPLTT_NONE,
.subbg = GX_VRAM_SUB_BG_128_C,
.subbgextpltt = GX_VRAM_SUB_BGEXTPLTT_NONE,
.obj = GX_VRAM_OBJ_64_E,
.objextpltt = GX_VRAM_OBJEXTPLTT_NONE,
.subobj = GX_VRAM_SUB_OBJ_16_I,
.subobjextpltt = GX_VRAM_SUB_OBJEXTPLTT_NONE,
.tex = GX_VRAM_TEX_0_A,
.texpltt = GX_VRAM_TEXPLTT_01_FG,
};
static const struct GraphicsModes sBlackoutGraphicsModes = {
.dispMode = GX_DISPMODE_GRAPHICS,
.bgMode = GX_BGMODE_0,
.subMode = GX_BGMODE_0,
._2d3dMode = GX_BG0_AS_2D,
};
static const BgTemplate sBlackoutBgTemplate = {
.x = 0,
.y = 0,
.bufferSize = 0x800,
.baseTile = 0,
.size = GF_BG_SCR_SIZE_256x256,
.colorMode = GX_BG_COLORMODE_16,
.screenBase = GX_BG_SCRBASE_0xf800,
.charBase = GX_BG_CHARBASE_0x00000,
.bgExtPltt = GX_BG_EXTPLTT_01,
.priority = 1,
.areaOver = GX_BG_AREAOVER_XLU,
.dummy = 0,
.mosaic = FALSE
};
static const WindowTemplate sBlackoutWindowTemplate = {
.bgId = GF_BG_LYR_MAIN_3,
.left = 4,
.top = 5,
.width = 25,
.height = 15,
.palette = 13,
.baseTile = 0x01
};
static void Blackout_InitDisplays(BgConfig *bgConfig) {
GfGfx_SetBanks(&sBlackoutGraphicsBanks);
SetBothScreensModesAndDisable(&sBlackoutGraphicsModes);
InitBgFromTemplate(bgConfig, GF_BG_LYR_MAIN_3, &sBlackoutBgTemplate, GF_BG_TYPE_TEXT);
GfGfxLoader_GXLoadPal(NARC_graphic_font, 7, GF_PAL_LOCATION_MAIN_BG, GF_PAL_SLOT_13_OFFSET, 0x20, HEAP_ID_FIELD);
BG_SetMaskColor(GF_BG_LYR_MAIN_3, RGB_WHITE);
}
static void Blackout_DrawMessage(FieldSystem *fieldSystem, TaskManager *taskManager) {
BlackoutScreenEnvironment *env = AllocFromHeap(HEAP_ID_FIELD, sizeof(BlackoutScreenEnvironment));
GF_ASSERT(env != NULL);
memset(env, 0, sizeof(BlackoutScreenEnvironment));
env->state = 0;
env->fieldSystem = fieldSystem;
env->bgConfig = BgConfig_Alloc(HEAP_ID_FIELD);
sub_0200FBF4(PM_LCD_TOP, RGB_WHITE); //are RGBs correct here?
sub_0200FBF4(PM_LCD_BOTTOM, RGB_WHITE);
sub_0200FBDC(0); //PM_LCD_TOP?
sub_0200FBDC(1); //PM_LCD_TOP?
Blackout_InitDisplays(env->bgConfig);
env->msgData = NewMsgDataFromNarc(MSGDATA_LOAD_LAZY, NARC_msgdata_msg, NARC_msg_msg_0203_bin, HEAP_ID_FIELD);
env->msgFmt = MessageFormat_New(HEAP_ID_FIELD);
AddWindow(env->bgConfig, &env->window, &sBlackoutWindowTemplate);
BufferPlayersName(env->msgFmt, 0, Save_PlayerData_GetProfileAddr(FieldSystem_GetSaveData(fieldSystem)));
if (fieldSystem->location->mapId == MAP_T20R0201) {
// {STRVAR_1 3, 0, 0} scurried back home, protecting the exhausted and fainted Pokémon from further harm...
Blackout_PrintMessage(env, msg_0203_00004, 0, 0);
} else {
// {STRVAR_1 3, 0, 0} scurried to a Pokémon Center, protecting the exhausted and fainted Pokémon from further harm...
Blackout_PrintMessage(env, msg_0203_00003, 0, 0);
}
CopyWindowToVram(&env->window);
TaskManager_Call(taskManager, Task_ShowPrintedBlackoutMessage, env);
}
enum {
STATE_SHOW_PRINTED_BLACKOUT_FADE_IN,
STATE_SHOW_PRINTED_BLACKOUT_FADE_IN_WAIT,
STATE_SHOW_PRINTED_BLACKOUT_FADE_OUT_INPUT,
STATE_SHOW_PRINTED_BLACKOUT_FADE_OUT_WAIT,
STATE_SHOW_PRINTED_BLACKOUT_CLEANUP,
};
static BOOL Task_ShowPrintedBlackoutMessage(TaskManager *taskManager) {
BlackoutScreenEnvironment *env = TaskManager_GetEnvironment(taskManager);
switch (env->state) {
case STATE_SHOW_PRINTED_BLACKOUT_FADE_IN:
BeginNormalPaletteFade(3, 1, 43, RGB_WHITE, 8, 1, HEAP_ID_32);
G2_BlendNone();
env->state++;
break;
case STATE_SHOW_PRINTED_BLACKOUT_FADE_IN_WAIT:
if (IsPaletteFadeFinished()) {
env->state++;
}
break;
case STATE_SHOW_PRINTED_BLACKOUT_FADE_OUT_INPUT:
if (gSystem.newKeys & PAD_BUTTON_A || gSystem.newKeys & PAD_BUTTON_B || gSystem.touchNew != 0) {
BeginNormalPaletteFade(0, 0, 0, RGB_BLACK, 8, 1, HEAP_ID_32);
env->state++;
}
break;
case STATE_SHOW_PRINTED_BLACKOUT_FADE_OUT_WAIT:
if (IsPaletteFadeFinished()) {
FillWindowPixelBuffer(&env->window, 0);
env->state++;
}
break;
case STATE_SHOW_PRINTED_BLACKOUT_CLEANUP:
ClearFrameAndWindow2(&env->window, FALSE);
RemoveWindow(&env->window);
MessageFormat_Delete(env->msgFmt);
DestroyMsgData(env->msgData);
FreeBgTilemapBuffer(env->bgConfig, GF_BG_LYR_MAIN_3);
FreeToHeap(env->bgConfig);
FreeToHeap(env);
return TRUE;
}
return FALSE;
}
static void Blackout_PrintMessage(BlackoutScreenEnvironment *environment, s32 msgNo, u8 x, u8 y) {
String *tmpStr = String_New(1024, HEAP_ID_FIELD);
String *finStr = String_New(1024, HEAP_ID_FIELD);
FillWindowPixelBuffer(&environment->window, 0);
ReadMsgDataIntoString(environment->msgData, msgNo, tmpStr);
StringExpandPlaceholders(environment->msgFmt, finStr, tmpStr);
u32 width = FontID_String_GetWidthMultiline(0, finStr, 0);
x = (environment->window.width * 8 - width);
x /= 2;
x -= 4;
AddTextPrinterParameterized2(&environment->window, 0, finStr, x, y, TEXT_SPEED_NOTRANSFER, MAKE_TEXT_COLOR(1, 2, 0), NULL);
String_Delete(tmpStr);
String_Delete(finStr);
}
enum {
STATE_BLACKOUT_TASK_INIT,
STATE_BLACKOUT_TASK_SOUND_FADE,
STATE_BLACKOUT_TASK_SOUND_FADE_WAIT,
STATE_BLACKOUT_TASK_DRAW,
STATE_BLACKOUT_TASK_RESTORE_OVERWORLD,
STATE_BLACKOUT_TASK_QUEUE_SCRIPT,
STATE_BLACKOUT_TASK_EXIT
};
BOOL Task_Blackout(TaskManager *taskManager) {
FieldSystem *fieldSystem = TaskManager_GetFieldSystem(taskManager);
u32 *state = TaskManager_GetStatePtr(taskManager);
LocalFieldData *localFieldData;
Location deathWarp;
u16 deathSpawn;
switch (*state) {
case STATE_BLACKOUT_TASK_INIT:
localFieldData = Save_LocalFieldData_Get(fieldSystem->saveData);
deathSpawn = LocalFieldData_GetBlackoutSpawn(localFieldData);
GetDeathWarpData(deathSpawn, &deathWarp);
GetSpecialSpawnWarpData(deathSpawn, LocalFieldData_GetSpecialSpawnWarpPtr(localFieldData));
sub_020537A8(taskManager, &deathWarp);
FieldSystem_ClearFollowingTrainer(fieldSystem);
HealParty(SaveArray_Party_Get(fieldSystem->saveData));
(*state)++;
break;
case STATE_BLACKOUT_TASK_SOUND_FADE:
GF_SndStartFadeOutBGM(0, 20);
(*state)++;
break;
case STATE_BLACKOUT_TASK_SOUND_FADE_WAIT:
if (GF_SndGetFadeTimer() == 0) {
sub_02054F14();
(*state)++;
}
break;
case STATE_BLACKOUT_TASK_DRAW:
SetBlendBrightness(-16, (GXBlendPlaneMask)(GX_BLEND_PLANEMASK_BD | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG1 | GX_BLEND_PLANEMASK_BG0), SCREEN_MASK_MAIN);
SetBlendBrightness(-16, (GXBlendPlaneMask)(GX_BLEND_PLANEMASK_BD | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG1 | GX_BLEND_PLANEMASK_BG0), SCREEN_MASK_SUB);
Blackout_DrawMessage(fieldSystem, taskManager);
(*state)++;
break;
case STATE_BLACKOUT_TASK_RESTORE_OVERWORLD:
CallTask_RestoreOverworld(taskManager);
(*state)++;
break;
case STATE_BLACKOUT_TASK_QUEUE_SCRIPT:
SetBlendBrightness(0, (GXBlendPlaneMask)(GX_BLEND_PLANEMASK_BD | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG1 | GX_BLEND_PLANEMASK_BG0), SCREEN_MASK_MAIN | SCREEN_MASK_SUB);
if (GetMomSpawnId() == LocalFieldData_GetBlackoutSpawn(Save_LocalFieldData_Get(fieldSystem->saveData))) {
QueueScript(taskManager, std_whited_out_to_mom, NULL, NULL);
} else {
QueueScript(taskManager, std_whited_out_to_pokecenter, NULL, NULL);
}
(*state)++;
break;
case STATE_BLACKOUT_TASK_EXIT:
return TRUE;
}
return FALSE;
}
void CallTask_Blackout(TaskManager *taskManager) {
TaskManager_Call(taskManager, Task_Blackout, NULL);
}

View File

@ -533,8 +533,8 @@ static void ov78_021E6068(CertificatesApp_Data *data) {
BufferPlayersName(data->msgFmt, 0, data->profile);
StringExpandPlaceholders(data->msgFmt, string, tempString);
AddTextPrinterParameterized2(&data->window1, 0, string, x1, y1, TEXT_SPEED_INSTANT, MakeTextColor(1, 2, 0), NULL);
AddTextPrinterParameterized2(&data->window2, 0, string, x1, y1, TEXT_SPEED_INSTANT, MakeTextColor(1, 2, 0), NULL);
AddTextPrinterParameterized2(&data->window1, 0, string, x1, y1, TEXT_SPEED_INSTANT, MAKE_TEXT_COLOR(1, 2, 0), NULL);
AddTextPrinterParameterized2(&data->window2, 0, string, x1, y1, TEXT_SPEED_INSTANT, MAKE_TEXT_COLOR(1, 2, 0), NULL);
String_Delete(tempString);
u32 msgNum;
@ -546,13 +546,13 @@ static void ov78_021E6068(CertificatesApp_Data *data) {
msgNum = msg_0004_00005;
}
ReadMsgDataIntoString(data->msgData, msgNum, string);
AddTextPrinterParameterized2(&data->window1, 0, string, x2, y2, TEXT_SPEED_INSTANT, MakeTextColor(1, 2, 0), NULL);
AddTextPrinterParameterized2(&data->window2, 0, string, x2, y2, TEXT_SPEED_INSTANT, MakeTextColor(1, 2, 0), NULL);
AddTextPrinterParameterized2(&data->window1, 0, string, x2, y2, TEXT_SPEED_INSTANT, MAKE_TEXT_COLOR(1, 2, 0), NULL);
AddTextPrinterParameterized2(&data->window2, 0, string, x2, y2, TEXT_SPEED_INSTANT, MAKE_TEXT_COLOR(1, 2, 0), NULL);
if (data->certificateId != CERTIFICATE_SHINY_LEAVES) {
ReadMsgDataIntoString(data->msgData, msg_0004_00003, string);
AddTextPrinterParameterized2(&data->window1, 0, string, 138, 144, TEXT_SPEED_INSTANT, MakeTextColor(1, 2, 0), NULL);
AddTextPrinterParameterized2(&data->window2, 0, string, 138, 144, TEXT_SPEED_INSTANT, MakeTextColor(1, 2, 0), NULL);
AddTextPrinterParameterized2(&data->window1, 0, string, 138, 144, TEXT_SPEED_INSTANT, MAKE_TEXT_COLOR(1, 2, 0), NULL);
AddTextPrinterParameterized2(&data->window2, 0, string, 138, 144, TEXT_SPEED_INSTANT, MAKE_TEXT_COLOR(1, 2, 0), NULL);
}
String_Delete(string);

View File

@ -329,13 +329,13 @@ BOOL ChooseStarterApplication_OvyExec(OVY_MANAGER *ovy, int *state) {
if (!IsCameraTranslationFinished(work->cameraTranslation)) {
break;
}
work->subPrinterId = printMsgOnWinEx(work->winTop, work->heapId, TRUE, NARC_msg_msg_0190_bin, msg_0190_00000, MakeTextColor(1, 2, 15), work->textSpeed, &work->strbuf);
work->subPrinterId = printMsgOnWinEx(work->winTop, work->heapId, TRUE, NARC_msg_msg_0190_bin, msg_0190_00000, MAKE_TEXT_COLOR(1, 2, 15), work->textSpeed, &work->strbuf);
GfGfx_EngineATogglePlanes(GX_PLANEMASK_BG1, GF_PLANE_TOGGLE_OFF);
GfGfx_EngineATogglePlanes(GX_PLANEMASK_BG2, GF_PLANE_TOGGLE_OFF);
*state = CHOOSE_STARTER_STATE_WAIT_INIT_MSG;
break;
case CHOOSE_STARTER_STATE_CONFIRM_MSG:
work->subPrinterId = printMsgOnWinEx(work->winTop, work->heapId, TRUE, NARC_msg_msg_0190_bin, msg_0190_00001 + work->curSelection, MakeTextColor(1, 2, 15), work->textSpeed, &work->strbuf);
work->subPrinterId = printMsgOnWinEx(work->winTop, work->heapId, TRUE, NARC_msg_msg_0190_bin, msg_0190_00001 + work->curSelection, MAKE_TEXT_COLOR(1, 2, 15), work->textSpeed, &work->strbuf);
printMsgOnBottom(work, msg_0190_00008);
GfGfx_EngineATogglePlanes(GX_PLANEMASK_BG1, GF_PLANE_TOGGLE_ON);
GfGfx_EngineATogglePlanes(GX_PLANEMASK_BG2, GF_PLANE_TOGGLE_ON);
@ -368,7 +368,7 @@ BOOL ChooseStarterApplication_OvyExec(OVY_MANAGER *ovy, int *state) {
{
String *baseTrans = NULL;
printMsgOnWinEx(work->winTop, work->heapId, FALSE, NARC_msg_msg_0190_bin, msg_0190_00004 + work->curSelection,
MakeTextColor(1, 2, 15), 0, &baseTrans);
MAKE_TEXT_COLOR(1, 2, 15), 0, &baseTrans);
String_Delete(baseTrans);
}
PlayCry(sSpecies[work->curSelection], FALSE);
@ -422,7 +422,7 @@ BOOL ChooseStarterApplication_OvyExec(OVY_MANAGER *ovy, int *state) {
work->modelAnimState = MODEL_ANM_STATE_BALL_ROCK;
{
String *sp10 = NULL;
printMsgOnWinEx(work->winTop, work->heapId, FALSE, NARC_msg_msg_0190_bin, msg_0190_00004 + work->curSelection, MakeTextColor(1, 2, 15), 0, &sp10);
printMsgOnWinEx(work->winTop, work->heapId, FALSE, NARC_msg_msg_0190_bin, msg_0190_00004 + work->curSelection, MAKE_TEXT_COLOR(1, 2, 15), 0, &sp10);
String_Delete(sp10);
}
PlayCry(sSpecies[work->curSelection], 0);
@ -1067,7 +1067,7 @@ static u8 printMsgOnWinEx(Window *window, HeapID heapId, BOOL makeFrame, s32 msg
static void printMsgOnBottom(struct ChooseStarterAppWork *work, int msgId) {
String *string = NULL;
printMsgOnWinEx(work->winBottom, work->heapId, FALSE, NARC_msg_msg_0190_bin, msgId, MakeTextColor(1, 2, 0), 0, &string);
printMsgOnWinEx(work->winBottom, work->heapId, FALSE, NARC_msg_msg_0190_bin, msgId, MAKE_TEXT_COLOR(1, 2, 0), 0, &string);
String_Delete(string);
}

View File

@ -1,7 +1,7 @@
#include "global.h"
#include "battle/battle_setup.h"
#include "encounter.h"
#include "field_black_out.h"
#include "blackout.h"
#include "field_map_object.h"
#include "field_system.h"
#include "field_warp_tasks.h"
@ -375,7 +375,7 @@ static BOOL Task_WildEncounter(TaskManager *taskManager) {
if (IsBattleResultWin(encounter->setup->winFlag) == FALSE) {
WildEncounter_Delete(encounter);
TaskManager_Jump(taskManager, FieldTask_BlackOut, NULL);
TaskManager_Jump(taskManager, Task_Blackout, NULL);
return FALSE;
}

View File

@ -2,8 +2,8 @@
#include "field_alph_checks.h"
#include "save_local_field_data.h"
BOOL CheckUseEscapeRopeInAlphChamber(FieldSystem* fieldSystem) {
Location* position = LocalFieldData_GetCurrentPosition(Save_LocalFieldData_Get(fieldSystem->saveData));
BOOL CheckUseEscapeRopeInAlphChamber(FieldSystem *fieldSystem) {
Location *position = LocalFieldData_GetCurrentPosition(Save_LocalFieldData_Get(fieldSystem->saveData));
if (position->mapId != MAP_D24R0202) {
return FALSE;
@ -16,8 +16,8 @@ BOOL CheckUseEscapeRopeInAlphChamber(FieldSystem* fieldSystem) {
return TRUE;
}
BOOL CheckUseFlashInAlphChamber(FieldSystem* fieldSystem) {
Location* position = LocalFieldData_GetCurrentPosition(Save_LocalFieldData_Get(fieldSystem->saveData));
BOOL CheckUseFlashInAlphChamber(FieldSystem *fieldSystem) {
Location *position = LocalFieldData_GetCurrentPosition(Save_LocalFieldData_Get(fieldSystem->saveData));
if (position->mapId != MAP_D24R0204) {
return FALSE;
@ -30,8 +30,8 @@ BOOL CheckUseFlashInAlphChamber(FieldSystem* fieldSystem) {
return TRUE;
}
BOOL CheckUseWaterStoneInAlphChamber(FieldSystem* fieldSystem) {
Location* position = LocalFieldData_GetCurrentPosition(Save_LocalFieldData_Get(fieldSystem->saveData));
BOOL CheckUseWaterStoneInAlphChamber(FieldSystem *fieldSystem) {
Location *position = LocalFieldData_GetCurrentPosition(Save_LocalFieldData_Get(fieldSystem->saveData));
if (position->mapId != MAP_D24R0206) {
return FALSE;

View File

@ -1,225 +0,0 @@
#include "scrcmd.h"
#include "gf_gfx_loader.h"
#include "unk_0200FA24.h"
#include "field_black_out.h"
#include "system.h"
#include "render_window.h"
#include "font.h"
#include "text.h"
#include "save_local_field_data.h"
#include "unk_0203BA5C.h"
#include "field_warp_tasks.h"
#include "brightness.h"
#include "unk_0206793C.h"
#include "unk_0200B150.h"
#include "unk_02054E00.h"
#include "unk_020552A4.h"
#include "use_item_on_mon.h"
#include "sound.h"
#include "msgdata/msg/msg_0203.h"
#include "msgdata/msg.naix"
struct BlackoutScreenWork {
int state;
FieldSystem *fieldSystem;
BgConfig *bgConfig;
Window window;
MsgData *msgData;
MessageFormat *msgFmt;
};
void _InitDisplays(BgConfig *bgConfig);
void DrawBlackoutMessage(FieldSystem *fieldSystem, TaskManager *taskManager);
BOOL FieldTask_ShowPrintedMessage(TaskManager *taskManager);
void _PrintMessage(struct BlackoutScreenWork *work, int msgno, u8 x, u8 y);
static void _InitDisplays(BgConfig *bgConfig) {
{
static const struct GraphicsBanks _020FC550 = {
GX_VRAM_BG_128_B,
GX_VRAM_BGEXTPLTT_NONE,
GX_VRAM_SUB_BG_128_C,
GX_VRAM_SUB_BGEXTPLTT_NONE,
GX_VRAM_OBJ_64_E,
GX_VRAM_OBJEXTPLTT_NONE,
GX_VRAM_SUB_OBJ_16_I,
GX_VRAM_SUB_OBJEXTPLTT_NONE,
GX_VRAM_TEX_0_A,
GX_VRAM_TEXPLTT_01_FG,
};
GfGfx_SetBanks(&_020FC550);
}
{
static const struct GraphicsModes _020FC524 = {
GX_DISPMODE_GRAPHICS,
GX_BGMODE_0,
GX_BGMODE_0,
GX_BG0_AS_2D,
};
SetBothScreensModesAndDisable(&_020FC524);
}
{
static const BgTemplate _020FC534 = {
0, 0, 0x800, 0,
GF_BG_SCR_SIZE_256x256, GF_BG_CLR_4BPP, 31, 0, 0, 1, 0, 0, 0
};
InitBgFromTemplate(bgConfig, 3, &_020FC534, GF_BG_TYPE_TEXT);
}
GfGfxLoader_GXLoadPal(NARC_graphic_font, 7, GF_PAL_LOCATION_MAIN_BG, GF_PAL_SLOT_13_OFFSET, 0x20, HEAP_ID_FIELD);
BG_SetMaskColor(3, RGB_WHITE);
}
static void DrawBlackoutMessage(FieldSystem *fieldSystem, TaskManager *taskManager) {
struct BlackoutScreenWork *env;
env = AllocFromHeap((HeapID)11, sizeof(struct BlackoutScreenWork));
GF_ASSERT(env != NULL);
memset(env, 0, sizeof(struct BlackoutScreenWork));
env->state = 0;
env->fieldSystem = fieldSystem;
env->bgConfig = BgConfig_Alloc((HeapID)11);
sub_0200FBF4(0, RGB_WHITE);
sub_0200FBF4(1, RGB_WHITE);
sub_0200FBDC(0);
sub_0200FBDC(1);
_InitDisplays(env->bgConfig);
env->msgData = NewMsgDataFromNarc(MSGDATA_LOAD_LAZY, NARC_msgdata_msg, NARC_msg_msg_0203_bin, (HeapID)11);
env->msgFmt = MessageFormat_New((HeapID)11);
{
static const WindowTemplate _020FC51C = {
3,
4,
5,
25,
15,
13,
0x001
};
AddWindow(env->bgConfig, &env->window, &_020FC51C);
}
BufferPlayersName(env->msgFmt, 0, Save_PlayerData_GetProfileAddr(FieldSystem_GetSaveData(fieldSystem)));
if (fieldSystem->location->mapId == MAP_T20R0201) {
_PrintMessage(env, msg_0203_00004, 0, 0);
} else {
_PrintMessage(env, msg_0203_00003, 0, 0);
}
CopyWindowToVram(&env->window);
TaskManager_Call(taskManager, FieldTask_ShowPrintedMessage, env);
}
static BOOL FieldTask_ShowPrintedMessage(TaskManager *taskManager) {
struct BlackoutScreenWork *work = TaskManager_GetEnvironment(taskManager);
switch (work->state) {
case 0:
BeginNormalPaletteFade(3, 1, 43, RGB_WHITE, 8, 1, (HeapID)32);
G2_BlendNone();
work->state++;
break;
case 1:
if (IsPaletteFadeFinished()) {
work->state++;
}
break;
case 2:
if (gSystem.newKeys & PAD_BUTTON_A || gSystem.newKeys & PAD_BUTTON_B || gSystem.touchNew != 0) {
BeginNormalPaletteFade(0, 0, 0, RGB_BLACK, 8, 1, (HeapID)32);
work->state++;
}
break;
case 3:
if (IsPaletteFadeFinished()) {
FillWindowPixelBuffer(&work->window, 0);
work->state++;
}
break;
case 4:
ClearFrameAndWindow2(&work->window, 0);
RemoveWindow(&work->window);
MessageFormat_Delete(work->msgFmt);
DestroyMsgData(work->msgData);
FreeBgTilemapBuffer(work->bgConfig, 3);
FreeToHeap(work->bgConfig);
FreeToHeap(work);
return TRUE;
}
return FALSE;
}
static void _PrintMessage(struct BlackoutScreenWork *work, int msgno, u8 x, u8 y) {
String *str0 = String_New(1024, (HeapID)11);
String *str1 = String_New(1024, (HeapID)11);
FillWindowPixelBuffer(&work->window, 0);
ReadMsgDataIntoString(work->msgData, msgno, str0);
StringExpandPlaceholders(work->msgFmt, str1, str0);
{
u32 width = FontID_String_GetWidthMultiline(0, str1, 0);
x = (work->window.width * 8 - width);
x /= 2;
x -= 4;
AddTextPrinterParameterized2(&work->window, 0, str1, x, y, TEXT_SPEED_NOTRANSFER, MakeTextColor(1, 2, 0), NULL);
}
String_Delete(str0);
String_Delete(str1);
}
BOOL FieldTask_BlackOut(TaskManager *taskManager) {
FieldSystem *fieldSystem = TaskManager_GetFieldSystem(taskManager);
u32 *state = TaskManager_GetStatePtr(taskManager);
LocalFieldData *localFieldData;
Location deathWarp;
u16 deathSpawn;
switch (*state) {
case 0:
localFieldData = Save_LocalFieldData_Get(fieldSystem->saveData);
deathSpawn = LocalFieldData_GetBlackoutSpawn(localFieldData);
GetDeathWarpData(deathSpawn, &deathWarp);
GetSpecialSpawnWarpData(deathSpawn, LocalFieldData_GetSpecialSpawnWarpPtr(localFieldData));
sub_020537A8(taskManager, &deathWarp);
FieldSystem_ClearFollowingTrainer(fieldSystem);
HealParty(SaveArray_Party_Get(fieldSystem->saveData));
(*state)++;
break;
case 1:
GF_SndStartFadeOutBGM(0, 20);
(*state)++;
break;
case 2:
if (GF_SndGetFadeTimer() == 0) {
sub_02054F14();
(*state)++;
}
break;
case 3:
SetBlendBrightness(-16, (GXBlendPlaneMask)(GX_BLEND_PLANEMASK_BD | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG1 | GX_BLEND_PLANEMASK_BG0), SCREEN_MASK_MAIN);
SetBlendBrightness(-16, (GXBlendPlaneMask)(GX_BLEND_PLANEMASK_BD | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG1 | GX_BLEND_PLANEMASK_BG0), SCREEN_MASK_SUB);
DrawBlackoutMessage(fieldSystem, taskManager);
(*state)++;
break;
case 4:
CallTask_RestoreOverworld(taskManager);
(*state)++;
break;
case 5:
SetBlendBrightness(0, (GXBlendPlaneMask)(GX_BLEND_PLANEMASK_BD | GX_BLEND_PLANEMASK_OBJ | GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_BG2 | GX_BLEND_PLANEMASK_BG1 | GX_BLEND_PLANEMASK_BG0), SCREEN_MASK_MAIN | SCREEN_MASK_SUB);
if (GetMomSpawnId() == LocalFieldData_GetBlackoutSpawn(Save_LocalFieldData_Get(fieldSystem->saveData))) {
QueueScript(taskManager, std_whited_out_to_mom, NULL, NULL);
} else {
QueueScript(taskManager, std_whited_out_to_pokecenter, NULL, NULL);
}
(*state)++;
break;
case 6:
return TRUE;
}
return FALSE;
}
void CallFieldTask_BlackOut(TaskManager *taskManager) {
TaskManager_Call(taskManager, FieldTask_BlackOut, NULL);
}

View File

@ -89,6 +89,6 @@ void GfGfx_SwapDisplay(void) {
}
}
u32 GfGfx_EngineBGetPlanes(void) {
u32 GfGfx_EngineAGetPlanes(void) {
return sEngineAPlanes;
}

View File

@ -30,7 +30,7 @@ struct ListMenu *ListMenuInit(const struct ListMenuTemplate *template, u16 curso
}
ListMenuCursorSetColor(
list->cursor,
MakeTextColor(list->template.cursorPal, list->template.cursorShadowPal, list->template.fillValue)
MAKE_TEXT_COLOR(list->template.cursorPal, list->template.cursorShadowPal, list->template.fillValue)
);
FillWindowPixelBuffer(list->template.window, list->template.fillValue);
ListMenuPrintEntries(list, list->cursorPos, 0, list->template.maxShowed);
@ -178,9 +178,9 @@ s32 ListMenuGetTemplateField(struct ListMenu *list, enum ListMenuAttr attr) {
static void ListMenuPrint(struct ListMenu *list, String *str, u8 x, u8 y) {
if (str != NULL) {
if (list->overrideEnabled) {
AddTextPrinterParameterized3(list->template.window, list->fontId, str, x, y, 0xFF, MakeTextColor(list->cursorPal, list->cursorShadowPal, list->fillValue), list->lettersSpacing, 0, NULL);
AddTextPrinterParameterized3(list->template.window, list->fontId, str, x, y, 0xFF, MAKE_TEXT_COLOR(list->cursorPal, list->cursorShadowPal, list->fillValue), list->lettersSpacing, 0, NULL);
} else {
AddTextPrinterParameterized3(list->template.window, list->template.fontId, str, x, y, 0xFF, MakeTextColor(list->template.cursorPal, list->template.cursorShadowPal, list->template.fillValue), list->template.lettersSpacing, 0, NULL);
AddTextPrinterParameterized3(list->template.window, list->template.fontId, str, x, y, 0xFF, MAKE_TEXT_COLOR(list->template.cursorPal, list->template.cursorShadowPal, list->template.fillValue), list->template.lettersSpacing, 0, NULL);
}
}
}

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);
}

View File

@ -6,7 +6,7 @@
#include "sys_vars.h"
#include "map_header.h"
#include "unk_02054E00.h"
#include "field_black_out.h"
#include "blackout.h"
#include "battle/battle_setup.h"
#include "script_pokemon_util.h"
#include "field_map_object.h"
@ -197,7 +197,7 @@ BOOL ScrCmd_EncounterMusic(ScriptContext *ctx) {
}
BOOL ScrCmd_WhiteOut(ScriptContext *ctx) {
CallFieldTask_BlackOut(ctx->taskman);
CallTask_Blackout(ctx->taskman);
return TRUE;
}

View File

@ -60,7 +60,7 @@
#include "unk_0205AC88.h"
#include "unk_02058AEC.h"
#include "unk_0205B3DC.h"
#include "field_black_out.h"
#include "blackout.h"
#include "use_item_on_mon.h"
#include "unk_02058034.h"
#include "unk_02056D7C.h"
@ -787,7 +787,7 @@ BOOL ScrCmd_DirectionSignpost(ScriptContext* ctx) {
ReadMsgDataIntoString(ctx->msgdata, msg_no, *tmp_str);
StringExpandPlaceholders(*msg_fmt, *unk1, *tmp_str);
Window* window = ov01_021F3D80(fieldSystem->unk68);
AddTextPrinterParameterized2(window, 1, *unk1, 0, 0, 0, MakeTextColor(2, 10, 15), NULL);
AddTextPrinterParameterized2(window, 1, *unk1, 0, 0, 0, MAKE_TEXT_COLOR(2, 10, 15), NULL);
return TRUE;
}
@ -846,7 +846,7 @@ BOOL ScrCmd_TrainerTips(ScriptContext* ctx) {
Window* window = ov01_021F3D80(fieldSystem->unk68);
u8 text_speed = Options_GetTextFrameDelay(Save_PlayerData_GetOptionsAddr(fieldSystem->saveData));
*printer_id_ptr = AddTextPrinterParameterized2(window, 1, *unk, 0, 0, text_speed, MakeTextColor(2, 10, 15), NULL);
*printer_id_ptr = AddTextPrinterParameterized2(window, 1, *unk, 0, 0, text_speed, MAKE_TEXT_COLOR(2, 10, 15), NULL);
ctx->data[0] = result_var_id;
SetupNativeScript(ctx, sub_02041520);
@ -2901,7 +2901,7 @@ BOOL ScrCmd_289(ScriptContext *ctx) {
}
BOOL ScrCmd_OverworldWhiteOut(ScriptContext *ctx) {
CallFieldTask_BlackOut(ctx->taskman);
CallTask_Blackout(ctx->taskman);
return TRUE;
}