Merge pull request #253 from PikalaxALT/add_arm_agbcc

librfu_intr
This commit is contained in:
PikalaxALT
2020-02-15 20:16:17 -05:00
committed by GitHub
117 changed files with 8573 additions and 8222 deletions
+3
View File
@@ -173,6 +173,9 @@ $(C_BUILDDIR)/isagbprn.o: CFLAGS := -mthumb-interwork
$(C_BUILDDIR)/trainer_tower.o: CFLAGS += -ffreestanding
$(C_BUILDDIR)/flying.o: CFLAGS += -ffreestanding
$(C_BUILDDIR)/librfu_intr.o: CC1 := tools/agbcc/bin/agbcc_arm
$(C_BUILDDIR)/librfu_intr.o: CFLAGS := -O2 -mthumb-interwork -quiet
ifeq ($(NODEP),1)
$(C_BUILDDIR)/%.o: c_dep :=
else
+2 -2
View File
@@ -1270,7 +1270,7 @@ _0800FBF8:
_0800FC00: .4byte gTrainers
_0800FC04: .4byte gTrainerBattleOpponent_A
_0800FC08:
bl sav1_map_get_battletype
bl GetCurrentMapBattleScene
lsls r0, 24
cmp r0, 0
bne _0800FC20
@@ -1341,7 +1341,7 @@ _0800FC88:
movs r0, 0x13
b _0800FCAA
_0800FC90:
bl sav1_map_get_battletype
bl GetCurrentMapBattleScene
lsls r0, 24
lsrs r0, 24
cmp r0, 0
+4 -4
View File
@@ -45,7 +45,7 @@ _0814B716:
ldr r0, _0814B74C @ =0x0000012f
bl PlayNewMapMusic
ldr r0, _0814B750 @ =sub_8056534
bl sub_80565E0
bl SetMainCallback1
_0814B73E:
movs r0, 0
_0814B740:
@@ -58,8 +58,8 @@ _0814B74C: .4byte 0x0000012f
_0814B750: .4byte sub_8056534
thumb_func_end sub_814B6FC
thumb_func_start sub_814B754
sub_814B754: @ 814B754
thumb_func_start StartBerryCrush
StartBerryCrush: @ 814B754
push {r4-r7,lr}
mov r7, r8
push {r7}
@@ -183,7 +183,7 @@ _0814B84C:
.align 2, 0
_0814B858: .4byte sub_814BA80
_0814B85C: .4byte sub_814BA98
thumb_func_end sub_814B754
thumb_func_end StartBerryCrush
thumb_func_start sub_814B860
sub_814B860: @ 814B860
+17 -17
View File
@@ -143,7 +143,7 @@ _0814BC30:
movs r0, 0x3
b _0814BC6A
_0814BC44:
bl sub_80FA42C
bl LinkRfu_SetRfuFuncToSend6600
b _0814BC66
_0814BC4A:
bl IsLinkTaskFinished
@@ -359,7 +359,7 @@ sub_814BDBC: @ 814BDBC
beq _0814BDD2
b _0814BDFC
_0814BDCC:
bl sub_80FA42C
bl LinkRfu_SetRfuFuncToSend6600
b _0814BDFC
_0814BDD2:
bl IsLinkTaskFinished
@@ -494,7 +494,7 @@ _0814BEB4:
bl sub_814BB4C
b _0814BFC6
_0814BED4:
bl sub_80FA42C
bl LinkRfu_SetRfuFuncToSend6600
b _0814BFC0
_0814BEDA:
bl IsLinkTaskFinished
@@ -650,7 +650,7 @@ _0814C008:
adds r1, r4, r0
adds r0, r4, 0
bl sub_814DA24
bl sub_80FA42C
bl LinkRfu_SetRfuFuncToSend6600
b _0814C108
_0814C01A:
bl IsLinkTaskFinished
@@ -720,7 +720,7 @@ _0814C080:
ldrb r0, [r2]
adds r0, 0x1
strb r0, [r2]
bl sub_80FA42C
bl LinkRfu_SetRfuFuncToSend6600
b _0814C108
.align 2, 0
_0814C0AC: .4byte sub_814DB84
@@ -748,7 +748,7 @@ _0814C0D2:
adds r1, r4, r3
adds r0, r4, 0
bl sub_814DC24
bl sub_80FA42C
bl LinkRfu_SetRfuFuncToSend6600
b _0814C108
_0814C0E4:
bl IsLinkTaskFinished
@@ -904,7 +904,7 @@ _0814C1FC:
movs r0, 0x1E
movs r1, 0
bl SetGpuReg
bl sub_80FA42C
bl LinkRfu_SetRfuFuncToSend6600
b _0814C23C
_0814C21E:
bl IsLinkTaskFinished
@@ -962,14 +962,14 @@ _0814C26C:
adds r0, r1, 0
movs r2, 0x78
movs r3, 0x50
bl sub_815F138
bl StartMinigameCountdown
b _0814C2EC
_0814C28A:
bl sub_815F198
bl IsMinigameCountdownRunning
cmp r0, 0
bne _0814C2F2
_0814C292:
bl sub_80FA42C
bl LinkRfu_SetRfuFuncToSend6600
b _0814C2EC
_0814C298:
bl IsLinkTaskFinished
@@ -1655,7 +1655,7 @@ _0814C77A:
movs r2, 0xC
bl memcpy
adds r0, r4, 0
bl sub_80F9E2C
bl RfuPrepareSend0x2f00
_0814C7AC:
pop {r3}
mov r8, r3
@@ -2065,7 +2065,7 @@ _0814CADA:
bl sub_814DE50
cmp r0, 0
beq _0814CB18
bl sub_80FA42C
bl LinkRfu_SetRfuFuncToSend6600
movs r0, 0
strh r0, [r4, 0x10]
b _0814CB12
@@ -2158,7 +2158,7 @@ _0814CB8A:
bl sub_814DE50
cmp r0, 0
beq _0814CC02
bl sub_80FA42C
bl LinkRfu_SetRfuFuncToSend6600
movs r0, 0
strh r0, [r5, 0x10]
movs r0, 0x12
@@ -2846,7 +2846,7 @@ _0814D0D6:
.align 2, 0
_0814D0FC: .4byte 0x00008c9f
_0814D100:
bl sub_80FA42C
bl LinkRfu_SetRfuFuncToSend6600
b _0814D178
_0814D106:
bl IsLinkTaskFinished
@@ -3028,7 +3028,7 @@ _0814D256:
beq _0814D296
b _0814D30C
_0814D260:
bl sub_80FA42C
bl LinkRfu_SetRfuFuncToSend6600
b _0814D30C
_0814D266:
bl IsLinkTaskFinished
@@ -3316,14 +3316,14 @@ _0814D47C:
beq _0814D498
b _0814D4B8
_0814D482:
bl sub_80FA42C
bl LinkRfu_SetRfuFuncToSend6600
b _0814D4B8
_0814D488:
bl IsLinkTaskFinished
lsls r0, 24
cmp r0, 0
beq _0814D4BE
bl sub_800AAC0
bl Link_TryStartSend5FFF
b _0814D4B8
_0814D498:
ldr r0, _0814D4B4 @ =gReceivedRemoteLinkPlayers
+15 -15
View File
@@ -63,7 +63,7 @@ _0814D63A:
ldr r0, _0814D65C @ =gReservedSpritePaletteCount
strb r4, [r0]
movs r0, 0x3
bl sub_815C980
bl DigitObjUtil_Init
b _0814D878
.align 2, 0
_0814D658: .4byte 0x01000200
@@ -338,7 +338,7 @@ _0814D8B4:
.4byte _0814D9A2
.4byte _0814D9B2
_0814D8D4:
bl sub_80FA42C
bl LinkRfu_SetRfuFuncToSend6600
b _0814D9BA
_0814D8DA:
bl IsLinkTaskFinished
@@ -427,7 +427,7 @@ _0814D9A2:
bl DestroyWirelessStatusIndicatorSprite
adds r0, r5, 0
bl sub_814EF10
bl sub_815C9F4
bl DigitObjUtil_Teardown
b _0814D9BA
_0814D9B2:
movs r0, 0
@@ -2578,15 +2578,15 @@ sub_814EAD4: @ 814EAD4
movs r0, 0x4
ldrsh r1, [r4, r0]
movs r0, 0
bl sub_815CD70
bl DigitObjUtil_PrintNumOn
movs r0, 0x6
ldrsh r1, [r4, r0]
movs r0, 0x1
bl sub_815CD70
bl DigitObjUtil_PrintNumOn
movs r0, 0x8
ldrsh r1, [r4, r0]
movs r0, 0x2
bl sub_815CD70
bl DigitObjUtil_PrintNumOn
pop {r4}
pop {r0}
bx r0
@@ -2608,13 +2608,13 @@ sub_814EB04: @ 814EB04
strb r0, [r1]
movs r0, 0x2
movs r1, 0x1
bl sub_815D1A8
bl DigitObjUtil_HideOrShow
movs r0, 0x1
movs r1, 0x1
bl sub_815D1A8
bl DigitObjUtil_HideOrShow
movs r0, 0
movs r1, 0x1
bl sub_815D1A8
bl DigitObjUtil_HideOrShow
pop {r0}
bx r0
thumb_func_end sub_814EB04
@@ -3060,17 +3060,17 @@ _0814EE3E:
movs r0, 0
movs r1, 0
adds r2, r4, 0
bl sub_815CA40
bl DigitObjUtil_CreatePrinter
adds r2, r4, 0
adds r2, 0x10
movs r0, 0x1
movs r1, 0
bl sub_815CA40
bl DigitObjUtil_CreatePrinter
adds r4, 0x20
movs r0, 0x2
movs r1, 0
adds r2, r4, 0
bl sub_815CA40
bl DigitObjUtil_CreatePrinter
ldrh r0, [r6, 0x12]
cmp r0, 0x1
bne _0814EED8
@@ -3130,11 +3130,11 @@ _0814EF46:
cmp r4, 0x1
bls _0814EF46
movs r0, 0x2
bl sub_815D108
bl DigitObjUtil_DeletePrinter
movs r0, 0x1
bl sub_815D108
bl DigitObjUtil_DeletePrinter
movs r0, 0
bl sub_815D108
bl DigitObjUtil_DeletePrinter
movs r4, 0
movs r1, 0xC2
lsls r1, 1
+18 -16
View File
@@ -751,7 +751,7 @@ sub_8080CDC: @ 8080CDC
lsrs r0, 16
cmp r0, 0x1
bhi _08080D3C
bl sub_800AAC0
bl Link_TryStartSend5FFF
bl HideFieldMessageBox
ldr r0, _08080D38 @ =sub_8080F78
b _08080D72
@@ -845,14 +845,14 @@ sub_8080DC0: @ 8080DC0
bl sub_8080D8C
cmp r0, 0x1
beq _08080DFE
bl sub_800AAC0
bl Link_TryStartSend5FFF
b _08080E02
.align 2, 0
_08080DE8: .4byte gSpecialVar_Result
_08080DEC:
cmp r0, 0x3
bne _08080DF6
bl sub_800AAC0
bl Link_TryStartSend5FFF
b _08080E02
_08080DF6:
cmp r0, 0x7
@@ -1010,7 +1010,7 @@ _08080F48: .4byte gLinkType
_08080F4C: .4byte 0x00004411
_08080F50: .4byte gTasks
_08080F54:
bl sub_800AAC0
bl Link_TryStartSend5FFF
ldr r0, _08080F70 @ =gTasks
mov r2, r8
adds r1, r2, r7
@@ -1564,7 +1564,7 @@ _0808138C:
ble _0808143A
b _080813AA
_0808139C:
bl sub_800AAC0
bl Link_TryStartSend5FFF
b _080813AA
_080813A2:
ldr r0, _080813B4 @ =gReceivedRemoteLinkPlayers
@@ -1756,7 +1756,7 @@ _08081510:
ldr r1, [r1]
str r1, [r0]
adds r0, r5, 0
bl sub_800B284
bl IntlConvertLinkPlayerName
lsls r0, r4, 24
lsrs r0, 24
bl ResetBlockReceivedFlag
@@ -1785,7 +1785,7 @@ _0808154C:
strh r0, [r6]
b _0808160A
_08081560:
bl sub_800AB9C
bl PrepareSendLinkCmd2FFE_or_RfuCmd6600
movs r0, 0x6
strh r0, [r6]
b _0808160A
@@ -1895,7 +1895,7 @@ sub_8081624: @ 8081624
.align 2, 0
_0808163C: .4byte gMain
_08081640:
bl sub_800AAC0
bl Link_TryStartSend5FFF
ldrb r0, [r4]
adds r0, 0x1
strb r0, [r4]
@@ -1942,9 +1942,9 @@ sub_8081668: @ 8081668
beq _0808170A
ldr r0, _080816C4 @ =gBattleOutcome
ldrb r0, [r0]
cmp r0, 0x1
cmp r0, 0x1 @ B_OUTCOME_WON
beq _080816C8
cmp r0, 0x2
cmp r0, 0x2 @ B_OUTCOME_LOST
beq _080816EC
b _0808170A
.align 2, 0
@@ -1955,6 +1955,7 @@ _080816BC: .4byte gLocalLinkPlayerId
_080816C0: .4byte gWirelessCommType
_080816C4: .4byte gBattleOutcome
_080816C8:
@ MEvent_RecordIdOfWonderCardSenderByEventType(0, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId);
ldr r4, _080816E8 @ =gLinkPlayers
bl GetMultiplayerId
eors r0, r5
@@ -1967,11 +1968,12 @@ _080816C8:
adds r1, r4
ldr r1, [r1]
movs r0, 0
bl sub_8144714
bl MEvent_RecordIdOfWonderCardSenderByEventType
b _0808170A
.align 2, 0
_080816E8: .4byte gLinkPlayers
_080816EC:
@ MEvent_RecordIdOfWonderCardSenderByEventType(1, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId);
ldr r4, _08081718 @ =gLinkPlayers
bl GetMultiplayerId
eors r0, r5
@@ -1984,7 +1986,7 @@ _080816EC:
adds r1, r4
ldr r1, [r1]
movs r0, 0x1
bl sub_8144714
bl MEvent_RecordIdOfWonderCardSenderByEventType
_0808170A:
bl InUnionRoom
cmp r0, 0x1
@@ -2198,7 +2200,7 @@ _080818A8:
strb r0, [r1]
strb r0, [r1, 0x1]
bl m4aMPlayAllStop
bl sub_800AAC0
bl Link_TryStartSend5FFF
_080818B8:
ldrh r0, [r4, 0x8]
adds r0, 0x1
@@ -2274,7 +2276,7 @@ _08081940:
strb r0, [r1]
strb r0, [r1, 0x1]
bl m4aMPlayAllStop
bl sub_800AB9C
bl PrepareSendLinkCmd2FFE_or_RfuCmd6600
_08081950:
ldrh r0, [r4]
adds r0, 0x1
@@ -2287,7 +2289,7 @@ _0808195C:
lsls r0, 24
cmp r0, 0
beq _08081970
bl sub_8117118
bl UnionRoom_CreateTask_CallBC2ReturnFromLinkTrade
adds r0, r5, 0
bl DestroyTask
_08081970:
@@ -2507,7 +2509,7 @@ sub_8081B08: @ 8081B08
adds r4, r0, 0
lsls r4, 24
lsrs r4, 24
bl sub_800AAC0
bl Link_TryStartSend5FFF
ldr r1, _08081B28 @ =gTasks
lsls r0, r4, 2
adds r0, r4
+8 -8
View File
@@ -5,8 +5,8 @@
.text
thumb_func_start sub_81507FC
sub_81507FC: @ 81507FC
thumb_func_start StartDodrioBerryPicking
StartDodrioBerryPicking: @ 81507FC
push {r4-r6,lr}
adds r5, r1, 0
lsls r0, 16
@@ -97,7 +97,7 @@ _081508D2:
pop {r4-r6}
pop {r0}
bx r0
thumb_func_end sub_81507FC
thumb_func_end StartDodrioBerryPicking
thumb_func_start sub_81508D8
sub_81508D8: @ 81508D8
@@ -382,7 +382,7 @@ _08150B08:
bl sub_8155E68
cmp r0, 0
bne _08150BFC
bl sub_80FA42C
bl LinkRfu_SetRfuFuncToSend6600
b _08150BDC
_08150B16:
bl IsLinkTaskFinished
@@ -649,7 +649,7 @@ _08150D28:
movs r1, 0x8
movs r2, 0x78
movs r3, 0x50
bl sub_815F138
bl StartMinigameCountdown
b _08150D52
_08150D3A:
bl IsLinkTaskFinished
@@ -658,11 +658,11 @@ _08150D3A:
beq _08150D74
b _08150D52
_08150D46:
bl sub_815F198
bl IsMinigameCountdownRunning
cmp r0, 0
bne _08150D74
_08150D4E:
bl sub_80FA42C
bl LinkRfu_SetRfuFuncToSend6600
_08150D52:
ldr r0, _08150D60 @ =gUnknown_203F3E0
ldr r1, [r0]
@@ -1611,7 +1611,7 @@ _081514A4:
beq _081514C0
b _081514D6
_081514AA:
bl sub_800AAC0
bl Link_TryStartSend5FFF
movs r0, 0x7
bl sub_81549D4
b _081514CC
+3 -3
View File
@@ -407,7 +407,7 @@ sub_815A61C: @ 815A61C
ands r5, r7
orrs r5, r4
strb r5, [r0, 0xB]
bl sub_80F9E2C
bl RfuPrepareSend0x2f00
add sp, 0x20
pop {r3-r5}
mov r8, r3
@@ -637,7 +637,7 @@ sub_815AAD8: @ 815AAD8
orrs r1, r0
str r1, [sp, 0x4]
mov r0, sp
bl sub_80F9E2C
bl RfuPrepareSend0x2f00
add sp, 0x8
pop {r0}
bx r0
@@ -692,7 +692,7 @@ sub_815AB3C: @ 815AB3C
str r1, [sp]
str r0, [sp, 0x4]
mov r0, sp
bl sub_80F9E2C
bl RfuPrepareSend0x2f00
add sp, 0x8
pop {r0}
bx r0
+3 -3
View File
@@ -334,8 +334,8 @@ sub_80FEE24: @ 80FEE24
bx r0
thumb_func_end sub_80FEE24
thumb_func_start sub_80FEE44
sub_80FEE44: @ 80FEE44
thumb_func_start ShowEasyChatScreen
ShowEasyChatScreen: @ 80FEE44
push {lr}
ldr r0, _080FEE58 @ =gSpecialVar_0x8004
ldrh r0, [r0]
@@ -431,7 +431,7 @@ _080FEF1C: .4byte gSpecialVar_0x8005
_080FEF20: .4byte 0x00002cd0
_080FEF24: .4byte gSpecialVar_0x8004
_080FEF28: .4byte sub_80568C4
thumb_func_end sub_80FEE44
thumb_func_end ShowEasyChatScreen
thumb_func_start sub_80FEF2C
sub_80FEF2C: @ 80FEF2C
-697
View File
@@ -1,697 +0,0 @@
.include "constants/gba_constants.inc"
.include "asm/macros.inc"
.syntax unified
.text
arm_func_start IntrSIO32
IntrSIO32: @ 81DFC50
mov r12, sp
stmdb sp!, {r11,r12,lr,pc}
ldr r3, _081DFCB0 @ =gSTWIStatus
ldr r0, [r3]
ldr r2, [r0]
sub r11, r12, 0x4
cmp r2, 0xA
bne _081DFC8C
ldr r0, [r0, 0x20]
cmp r0, 0
ldmdbeq r11, {r11,sp,lr}
bxeq lr
bl Callback_Dummy_ID
ldmdb r11, {r11,sp,lr}
bx lr
_081DFC8C:
ldrb r3, [r0, 0x14]
cmp r3, 0x1
bne _081DFCA4
bl sio32intr_clock_master
ldmdb r11, {r11,sp,lr}
bx lr
_081DFCA4:
bl sio32intr_clock_slave
ldmdb r11, {r11,sp,lr}
bx lr
.align 2, 0
_081DFCB0: .4byte gSTWIStatus
arm_func_end IntrSIO32
arm_func_start sio32intr_clock_master
sio32intr_clock_master: @ 81DFCB4
mov r12, sp
stmdb sp!, {r4-r6,r11,r12,lr,pc}
mov r0, 0x50
sub r11, r12, 0x4
bl STWI_set_timer_in_RAM
mov r4, 0x120
ldr r2, _081DFF28 @ =gSTWIStatus
add r4, r4, 0x4000000
ldr lr, [r4]
ldr r12, [r2]
ldr r3, [r12]
mov r6, r2
cmp r3, 0
bne _081DFD34
cmp lr, 0x80000000
bne _081DFDB4
ldrb r2, [r12, 0x5]
ldrb r3, [r12, 0x4]
cmp r2, r3
bhi _081DFD24
ldr r3, [r12, 0x24]
mov r1, r2
ldr r2, [r3, r1, lsl 2]
str r2, [r4]
ldrb r3, [r12, 0x5]
add r3, r3, 0x1
strb r3, [r12, 0x5]
b _081DFE10
_081DFD24:
mov r3, 0x1
str r3, [r12]
str lr, [r4]
b _081DFE10
_081DFD34:
ldr r3, [r12]
cmp r3, 0x1
bne _081DFDC4
mov r3, 0x99000000
add r3, r3, 0x660000
mov r5, 0x80000000
and r2, lr, r5, asr 15
cmp r2, r3
bne _081DFDB4
mov r3, 0
strb r3, [r12, 0x8]
ldr r1, [r6]
ldrb r0, [r1, 0x8]
ldr r2, [r1, 0x28]
str lr, [r2, r0, lsl 2]
ldrb r3, [r1, 0x8]
add r3, r3, 0x1
strb r3, [r1, 0x8]
ldr r2, [r6]
strb lr, [r2, 0x9]
ldr r3, [r6]
mov r2, lr, lsr 8
strb r2, [r3, 0x7]
ldr r1, [r6]
ldrb r2, [r1, 0x7]
ldrb r3, [r1, 0x8]
cmp r2, r3
bcc _081DFDFC
mov r3, 0x2
str r3, [r1]
str r5, [r4]
b _081DFE10
_081DFDB4:
bl STWI_stop_timer_in_RAM
mov r0, 0x82
bl STWI_set_timer_in_RAM
b _081DFF3C
_081DFDC4:
ldr r3, [r12]
cmp r3, 0x2
bne _081DFE10
ldrb r1, [r12, 0x8]
ldr r2, [r12, 0x28]
str lr, [r2, r1, lsl 2]
ldrb r3, [r12, 0x8]
add r3, r3, 0x1
strb r3, [r12, 0x8]
ldr r1, [r6]
ldrb r2, [r1, 0x7]
ldrb r3, [r1, 0x8]
cmp r2, r3
bcs _081DFE08
_081DFDFC:
mov r3, 0x3
str r3, [r1]
b _081DFE10
_081DFE08:
mov r3, 0x80000000
str r3, [r4]
_081DFE10:
mov r0, 0x1
bl handshake_wait
mov r0, r0, lsl 16
cmp r0, 0x10000
beq _081DFF3C
mov r4, 0x128
add r4, r4, 0x4000000
mov r5, 0x5000
add r3, r5, 0xB
strh r3, [r4]
mov r0, 0
bl handshake_wait
mov r0, r0, lsl 16
cmp r0, 0x10000
beq _081DFF3C
bl STWI_stop_timer_in_RAM
ldr r1, [r6]
ldr r0, [r1]
cmp r0, 0x3
bne _081DFF2C
ldrb r3, [r1, 0x9]
cmp r3, 0xA5
cmpne r3, 0xA7
beq _081DFE84
and r3, r3, 0xFF
cmp r3, 0xB5
beq _081DFE84
cmp r3, 0xB7
bne _081DFECC
_081DFE84:
mov r1, 0x120
add r1, r1, 0x4000000
mov r12, 0x128
add r12, r12, 0x4000000
ldr r0, [r6]
mov r3, 0
strb r3, [r0, 0x14]
mov r2, 0x80000000
str r2, [r1]
add r3, r3, 0x5000
add r2, r3, 0x2
strh r2, [r12]
add r3, r3, 0x82
strh r3, [r12]
ldr r2, [r6]
mov r3, 0x5
str r3, [r2]
b _081DFEFC
_081DFECC:
cmp r3, 0xEE
bne _081DFEEC
add r3, r5, 0x3
strh r3, [r4]
mov r2, 0x4
str r2, [r1]
strh r0, [r1, 0x12]
b _081DFEFC
_081DFEEC:
add r3, r5, 0x3
strh r3, [r4]
mov r2, 0x4
str r2, [r1]
_081DFEFC:
ldr r2, [r6]
mov r3, 0
strb r3, [r2, 0x2C]
ldr r0, [r6]
ldr r2, [r0, 0x18]
cmp r2, r3
beq _081DFF3C
ldrh r1, [r0, 0x12]
ldrb r0, [r0, 0x6]
bl Callback_Dummy_M
b _081DFF3C
.align 2, 0
_081DFF28: .4byte gSTWIStatus
_081DFF2C:
add r3, r5, 0x3
strh r3, [r4]
add r2, r5, 0x83
strh r2, [r4]
_081DFF3C:
ldmdb r11, {r4-r6,r11,sp,lr}
bx lr
arm_func_end sio32intr_clock_master
arm_func_start sio32intr_clock_slave
sio32intr_clock_slave: @ 81DFF44
mov r12, sp
stmdb sp!, {r4-r6,r11,r12,lr,pc}
ldr r4, _081E02F0 @ =gSTWIStatus
mov r0, 0x64
ldr r3, [r4]
mov r6, 0
strb r6, [r3, 0x10]
sub r11, r12, 0x4
bl STWI_set_timer_in_RAM
mov r0, r6
bl handshake_wait
mov r0, r0, lsl 16
cmp r0, 0x10000
mov r5, r4
beq _081E0348
mov r3, 0x128
add r3, r3, 0x4000000
mov r2, 0x5000
add r2, r2, 0xA
strh r2, [r3]
mov lr, 0x120
ldr r0, [r5]
add lr, lr, 0x4000000
ldr r12, [lr]
ldr r3, [r0]
cmp r3, 0x5
bne _081E0074
ldr r3, [r0, 0x28]
mov r4, 0x1
mov r0, 0x99000000
str r12, [r3]
add r0, r0, 0x660000
ldr r2, [r5]
mov r3, r0, lsr 16
strb r4, [r2, 0x5]
cmp r3, r12, lsr 16
bne _081E01C0
ldr r3, [r5]
mov r2, r12, lsr 8
strb r2, [r3, 0x4]
ldr r2, [r5]
strb r12, [r2, 0x6]
ldr r1, [r5]
ldrb r3, [r1, 0x4]
cmp r3, r6
bne _081E0058
ldrb r2, [r1, 0x6]
sub r3, r2, 0x27
cmp r2, 0x36
cmpne r3, 0x2
bhi _081E002C
add r3, r2, 0x80
strb r3, [r1, 0x9]
ldr r2, [r5]
ldrb r3, [r2, 0x9]
ldr r1, [r2, 0x24]
add r3, r3, r0
b _081E00DC
_081E002C:
ldr r2, [r1, 0x24]
ldr r3, _081E02F4 @ =0x996601ee
str r3, [r2]
ldr r2, [r5]
ldrb r3, [r2, 0x6]
sub r3, r3, 0x10
cmp r3, 0x2D
bhi _081E0114
ldr r3, [r2, 0x24]
str r4, [r3, 0x4]
b _081E0120
_081E0058:
mov r3, 0x80000000
str r3, [lr]
strb r4, [r1, 0x5]
ldr r2, [r5]
add r3, r3, 0x80000006
str r3, [r2]
b _081E01D0
_081E0074:
ldr r3, [r0]
cmp r3, 0x6
bne _081E0174
ldrb r1, [r0, 0x5]
ldr r2, [r0, 0x28]
str r12, [r2, r1, lsl 2]
ldrb r3, [r0, 0x5]
add r3, r3, 0x1
strb r3, [r0, 0x5]
ldr r1, [r5]
ldrb r2, [r1, 0x4]
ldrb r3, [r1, 0x5]
cmp r2, r3
bcs _081E0168
ldrb r2, [r1, 0x6]
sub r3, r2, 0x28
cmp r2, 0x36
cmpne r3, 0x1
bhi _081E00EC
add r3, r2, 0x80
strb r3, [r1, 0x9]
ldr r2, [r5]
ldrb r3, [r2, 0x9]
ldr r1, [r2, 0x24]
orr r3, r3, 0x99000000
orr r3, r3, 0x660000
_081E00DC:
str r3, [r1]
ldr r2, [r5]
strb r6, [r2, 0x7]
b _081E0138
_081E00EC:
ldr r2, [r1, 0x24]
ldr r3, _081E02F4 @ =0x996601ee
str r3, [r2]
ldr r2, [r5]
ldrb r3, [r2, 0x6]
sub r3, r3, 0x10
cmp r3, 0x2D
ldrls r2, [r2, 0x24]
movls r3, 0x1
bls _081E011C
_081E0114:
ldr r2, [r2, 0x24]
mov r3, 0x2
_081E011C:
str r3, [r2, 0x4]
_081E0120:
ldr r2, [r5]
mov r3, 0x1
strb r3, [r2, 0x7]
ldr r1, [r5]
add r3, r3, 0x2
strh r3, [r1, 0x12]
_081E0138:
ldr r0, [r5]
ldr r2, [r0, 0x24]
mov r3, 0x120
ldr r1, [r2]
add r3, r3, 0x4000000
str r1, [r3]
mov r2, 0x1
strb r2, [r0, 0x8]
ldr r1, [r5]
mov r3, 0x7
str r3, [r1]
b _081E01D0
_081E0168:
mov r3, 0x80000000
str r3, [lr]
b _081E01D0
_081E0174:
ldr r3, [r0]
cmp r3, 0x7
bne _081E01D0
cmp r12, 0x80000000
bne _081E01C0
ldrb r2, [r0, 0x7]
ldrb r3, [r0, 0x8]
cmp r2, r3
movcc r3, 0x8
strcc r3, [r0]
bcc _081E01D0
ldrb r1, [r0, 0x8]
ldr r3, [r0, 0x24]
ldr r2, [r3, r1, lsl 2]
str r2, [lr]
ldrb r3, [r0, 0x8]
add r3, r3, 0x1
strb r3, [r0, 0x8]
b _081E01D0
_081E01C0:
bl STWI_stop_timer_in_RAM
mov r0, 0x64
bl STWI_set_timer_in_RAM
b _081E0348
_081E01D0:
mov r0, 0x1
bl handshake_wait
mov r0, r0, lsl 16
cmp r0, 0x10000
beq _081E0348
mov r6, r5
ldr r3, [r6]
ldr r2, [r3]
cmp r2, 0x8
bne _081E0298
mov r4, 0x128
add r4, r4, 0x4000000
mov r3, 0x5000
add r3, r3, 0x2
strh r3, [r4]
bl STWI_stop_timer_in_RAM
ldr r0, [r6]
ldrh r3, [r0, 0x12]
cmp r3, 0x3
bne _081E0244
bl STWI_init_slave
ldr r3, [r6]
ldr r1, [r3, 0x1C]
cmp r1, 0
beq _081E0348
mov r0, 0x1EC
add r0, r0, 0x2
bl Callback_Dummy_S
b _081E0348
_081E0244:
mov r3, 0x120
add r3, r3, 0x4000000
mov r1, 0
str r1, [r3]
mov r2, 0x5000
strh r1, [r4]
add r2, r2, 0x3
strh r2, [r4]
mov r3, 0x1
strb r3, [r0, 0x14]
ldr r0, [r5]
ldr r2, [r0, 0x1C]
str r1, [r0]
cmp r2, r1
beq _081E0348
ldrb r3, [r0, 0x4]
ldrb r0, [r0, 0x6]
mov r1, r2
orr r0, r0, r3, lsl 8
bl Callback_Dummy_S
b _081E0348
_081E0298:
mov r3, 0x208
add r3, r3, 0x4000000
mov r2, 0
strh r2, [r3]
mov r1, 0x100
add r2, r1, 0x4000002
ldrh r3, [r2]
tst r3, 0x80
beq _081E031C
ldrh r3, [r2]
tst r3, 0x3
bne _081E02F8
mov r2, 0xFF00
add r1, r1, 0x4000000
ldrh r3, [r1]
add r2, r2, 0x9B
cmp r3, r2
bls _081E031C
_081E02E0:
ldrh r3, [r1]
cmp r3, r2
bhi _081E02E0
b _081E031C
.align 2, 0
_081E02F0: .4byte gSTWIStatus
_081E02F4: .4byte 0x996601ee
_081E02F8:
mov r2, 0xFF00
add r1, r1, 0x4000000
ldrh r3, [r1]
add r2, r2, 0xFE
cmp r3, r2
bls _081E031C
_081E0310:
ldrh r3, [r1]
cmp r3, r2
bhi _081E0310
_081E031C:
mov r1, 0x128
add r1, r1, 0x4000000
mov r0, 0x208
add r0, r0, 0x4000000
mov r3, 0x5000
add r2, r3, 0x2
strh r2, [r1]
add r3, r3, 0x82
strh r3, [r1]
mov r2, 0x1
strh r2, [r0]
_081E0348:
ldmdb r11, {r4-r6,r11,sp,lr}
bx lr
arm_func_end sio32intr_clock_slave
arm_func_start handshake_wait
handshake_wait: @ 81E0350
mov r12, sp
stmdb sp!, {r11,r12,lr,pc}
mov r1, 0x128
add r1, r1, 0x4000000
mov r0, r0, lsl 16
ldr r2, _081E03B4 @ =gSTWIStatus
sub r11, r12, 0x4
mov lr, r0, lsr 14
ldr r12, [r2]
_081E0374:
ldrb r3, [r12, 0x10]
and r0, r3, 0xFF
cmp r0, 0x1
beq _081E03A0
ldrh r3, [r1]
and r3, r3, 0x4
cmp r3, lr
bne _081E0374
mov r0, 0
ldmdb r11, {r11,sp,lr}
bx lr
_081E03A0:
ldr r2, [r2]
mov r3, 0
strb r3, [r2, 0x10]
ldmdb r11, {r11,sp,lr}
bx lr
.align 2, 0
_081E03B4: .4byte gSTWIStatus
arm_func_end handshake_wait
arm_func_start STWI_set_timer_in_RAM
STWI_set_timer_in_RAM: @ 81E03B8
mov r12, sp
stmdb sp!, {r4,r5,r11,r12,lr,pc}
mov r1, 0x208
add r1, r1, 0x4000000
mov r3, 0
sub r11, r12, 0x4
ldr r12, _081E0470 @ =gSTWIStatus
and lr, r0, 0xFF
ldr r2, [r12]
cmp lr, 0x50
ldrb r0, [r2, 0xA]
mov r4, r12
mov r2, lr
strh r3, [r1]
mov r0, r0, lsl 2
add r3, r3, 0x100
add r1, r3, 0x4000000
add r3, r3, 0x4000002
add r5, r0, r3
beq _081E0440
bgt _081E0418
cmp lr, 0x32
beq _081E042C
b _081E048C
_081E0418:
cmp r2, 0x64
beq _081E0458
cmp r2, 0x82
beq _081E0474
b _081E048C
_081E042C:
mvn r3, 0x334
strh r3, [r0, r1]
ldr r2, [r4]
mov r3, 0x1
b _081E0488
_081E0440:
mov r3, 0xAE000000
mov r3, r3, asr 20
strh r3, [r0, r1]
ldr r2, [r4]
mov r3, 0x2
b _081E0488
_081E0458:
mvn r3, 0x660
sub r3, r3, 0x9
strh r3, [r0, r1]
ldr r2, [r4]
mov r3, 0x3
b _081E0488
.align 2, 0
_081E0470: .4byte gSTWIStatus
_081E0474:
mvn r3, 0x850
sub r3, r3, 0x2
strh r3, [r0, r1]
ldr r2, [r4]
mov r3, 0x4
_081E0488:
str r3, [r2, 0xC]
_081E048C:
mov r12, 0x200
add r12, r12, 0x4000002
mov r3, 0xC3
strh r3, [r5]
mov r1, 0x208
ldr r2, [r4]
add r1, r1, 0x4000000
ldrb r0, [r2, 0xA]
sub r3, r3, 0xBB
mov r3, r3, lsl r0
strh r3, [r12]
mov r2, 0x1
strh r2, [r1]
ldmdb r11, {r4,r5,r11,sp,lr}
bx lr
arm_func_end STWI_set_timer_in_RAM
arm_func_start STWI_stop_timer_in_RAM
STWI_stop_timer_in_RAM: @ 81E04C8
mov r12, sp
stmdb sp!, {r11,r12,lr,pc}
mov r1, 0x100
ldr lr, _081E0514 @ =gSTWIStatus
add r0, r1, 0x4000000
ldr r2, [lr]
sub r11, r12, 0x4
ldrb r3, [r2, 0xA]
mov r12, 0
str r12, [r2, 0xC]
mov r3, r3, lsl 2
strh r12, [r3, r0]
ldr r2, [lr]
ldrb r3, [r2, 0xA]
add r1, r1, 0x4000002
mov r3, r3, lsl 2
strh r12, [r3, r1]
ldmdb r11, {r11,sp,lr}
bx lr
.align 2, 0
_081E0514: .4byte gSTWIStatus
arm_func_end STWI_stop_timer_in_RAM
arm_func_start STWI_init_slave
STWI_init_slave: @ 81E0518
mov r12, sp
stmdb sp!, {r11,r12,lr,pc}
ldr r0, _081E05A0 @ =gSTWIStatus
ldr r2, [r0]
mov r3, 0x5
str r3, [r2]
mov r1, 0
strb r1, [r2, 0x14]
ldr r3, [r0]
strb r1, [r3, 0x4]
ldr r2, [r0]
strb r1, [r2, 0x5]
ldr r3, [r0]
strb r1, [r3, 0x6]
ldr r2, [r0]
strb r1, [r2, 0x7]
ldr r3, [r0]
strb r1, [r3, 0x8]
ldr r2, [r0]
strb r1, [r2, 0x9]
ldr r3, [r0]
str r1, [r3, 0xC]
sub r11, r12, 0x4
strb r1, [r3, 0x10]
mov r2, 0x128
ldr r12, [r0]
add r2, r2, 0x4000000
strh r1, [r12, 0x12]
mov r3, 0x5000
strb r1, [r12, 0x15]
add r3, r3, 0x82
strh r3, [r2]
ldmdb r11, {r11,sp,lr}
bx lr
.align 2, 0
_081E05A0: .4byte gSTWIStatus
arm_func_end STWI_init_slave
arm_func_start Callback_Dummy_M
Callback_Dummy_M: @ 81E05A4
bx r2
arm_func_end Callback_Dummy_M
arm_func_start Callback_Dummy_S
Callback_Dummy_S: @ 81E05A8
bx r1
arm_func_end Callback_Dummy_S
arm_func_start Callback_Dummy_ID
Callback_Dummy_ID: @ 81E05AC
bx r0
arm_func_end Callback_Dummy_ID
+64 -64
View File
@@ -2597,7 +2597,7 @@ GetMapMusicFadeoutSpeed: @ 8055F68
push {lr}
bl warp1_get_mapheader
ldrb r0, [r0, 0x17]
bl is_light_level_8_or_9
bl IsMapTypeIndoors
lsls r0, 24
lsrs r0, 24
cmp r0, 0x1
@@ -2981,8 +2981,8 @@ _08056218:
bx r1
thumb_func_end Overworld_MapTypeAllowsTeleportAndFly
thumb_func_start is_light_level_8_or_9
is_light_level_8_or_9: @ 805621C
thumb_func_start IsMapTypeIndoors
IsMapTypeIndoors: @ 805621C
push {lr}
lsls r0, 24
movs r1, 0xF8
@@ -2998,10 +2998,10 @@ _08056230:
_08056232:
pop {r1}
bx r1
thumb_func_end is_light_level_8_or_9
thumb_func_end IsMapTypeIndoors
thumb_func_start sav1_saved_warp2_map_get_name
sav1_saved_warp2_map_get_name: @ 8056238
thumb_func_start GetSavedWarpRegionMapSectionId
GetSavedWarpRegionMapSectionId: @ 8056238
push {lr}
ldr r0, _0805625C @ =gSaveBlock1Ptr
ldr r1, [r0]
@@ -3020,7 +3020,7 @@ sav1_saved_warp2_map_get_name: @ 8056238
bx r1
.align 2, 0
_0805625C: .4byte gSaveBlock1Ptr
thumb_func_end sav1_saved_warp2_map_get_name
thumb_func_end GetSavedWarpRegionMapSectionId
thumb_func_start GetCurrentRegionMapSectionId
GetCurrentRegionMapSectionId: @ 8056260
@@ -3044,8 +3044,8 @@ GetCurrentRegionMapSectionId: @ 8056260
_08056284: .4byte gSaveBlock1Ptr
thumb_func_end GetCurrentRegionMapSectionId
thumb_func_start sav1_map_get_battletype
sav1_map_get_battletype: @ 8056288
thumb_func_start GetCurrentMapBattleScene
GetCurrentMapBattleScene: @ 8056288
push {lr}
ldr r0, _080562AC @ =gSaveBlock1Ptr
ldr r1, [r0]
@@ -3064,10 +3064,10 @@ sav1_map_get_battletype: @ 8056288
bx r1
.align 2, 0
_080562AC: .4byte gSaveBlock1Ptr
thumb_func_end sav1_map_get_battletype
thumb_func_end GetCurrentMapBattleScene
thumb_func_start sub_80562B0
sub_80562B0: @ 80562B0
thumb_func_start InitOverworldBgs
InitOverworldBgs: @ 80562B0
push {r4-r6,lr}
mov r6, r8
push {r6}
@@ -3130,7 +3130,7 @@ _08056344: .4byte gUnknown_826D320
_08056348: .4byte gUnknown_3005018
_0805634C: .4byte gUnknown_3005014
_08056350: .4byte gUnknown_300501C
thumb_func_end sub_80562B0
thumb_func_end InitOverworldBgs
thumb_func_start sub_8056354
sub_8056354: @ 8056354
@@ -3430,14 +3430,14 @@ _080565D4:
_080565DC: .4byte gPaletteFade
thumb_func_end sub_80565B4
thumb_func_start sub_80565E0
sub_80565E0: @ 80565E0
thumb_func_start SetMainCallback1
SetMainCallback1: @ 80565E0
ldr r1, _080565E8 @ =gMain
str r0, [r1]
bx lr
.align 2, 0
_080565E8: .4byte gMain
thumb_func_end sub_80565E0
thumb_func_end SetMainCallback1
thumb_func_start map_post_load_hook_exec
map_post_load_hook_exec: @ 80565EC
@@ -3490,7 +3490,7 @@ _08056640: .4byte gFieldCallback
thumb_func_start CB2_NewGame
CB2_NewGame: @ 8056644
push {lr}
bl sub_80569BC
bl FieldClearVBlankHBlankCallbacks
bl StopMapMusic
bl sub_8056420
bl NewGameInitData
@@ -3508,7 +3508,7 @@ CB2_NewGame: @ 8056644
bl do_load_map_stuff_loop
bl SetFieldVBlankCallback
ldr r0, _0805669C @ =sub_8056534
bl sub_80565E0
bl SetMainCallback1
ldr r0, _080566A0 @ =sub_80565B4
bl SetMainCallback2
pop {r0}
@@ -3537,7 +3537,7 @@ CB2_WhiteOut: @ 80566A4
lsrs r0, 24
cmp r0, 0x77
bls _08056702
bl sub_80569BC
bl FieldClearVBlankHBlankCallbacks
bl StopMapMusic
bl sub_8056420
bl sub_8054BC8
@@ -3556,7 +3556,7 @@ CB2_WhiteOut: @ 80566A4
bl sub_8112364
bl SetFieldVBlankCallback
ldr r0, _08056714 @ =sub_8056534
bl sub_80565E0
bl SetMainCallback1
ldr r0, _08056718 @ =sub_80565B4
bl SetMainCallback2
_08056702:
@@ -3574,11 +3574,11 @@ _08056718: .4byte sub_80565B4
thumb_func_start CB2_LoadMap
CB2_LoadMap: @ 805671C
push {lr}
bl sub_80569BC
bl FieldClearVBlankHBlankCallbacks
bl ScriptContext1_Init
bl ScriptContext2_Disable
movs r0, 0
bl sub_80565E0
bl SetMainCallback1
ldr r0, _08056740 @ =sub_80C9BFC
bl SetMainCallback2
ldr r1, _08056744 @ =gMain
@@ -3609,7 +3609,7 @@ _08056768: .4byte gMain + 0x438
_0805676C:
bl SetFieldVBlankCallback
ldr r0, _08056780 @ =sub_8056534
bl sub_80565E0
bl SetMainCallback1
ldr r0, _08056784 @ =sub_80565B4
bl SetMainCallback2
_0805677C:
@@ -3620,12 +3620,12 @@ _08056780: .4byte sub_8056534
_08056784: .4byte sub_80565B4
thumb_func_end sub_805674C
thumb_func_start sub_8056788
sub_8056788: @ 8056788
thumb_func_start CB2_ReturnToFieldCableClub
CB2_ReturnToFieldCableClub: @ 8056788
push {lr}
bl sub_80569BC
bl FieldClearVBlankHBlankCallbacks
ldr r0, _080567A0 @ =gFieldCallback
ldr r1, _080567A4 @ =sub_807DE58
ldr r1, _080567A4 @ =FieldCB_ReturnToFieldWirelessLink
str r1, [r0]
ldr r0, _080567A8 @ =c2_80567AC
bl SetMainCallback2
@@ -3633,20 +3633,20 @@ sub_8056788: @ 8056788
bx r0
.align 2, 0
_080567A0: .4byte gFieldCallback
_080567A4: .4byte sub_807DE58
_080567A4: .4byte FieldCB_ReturnToFieldWirelessLink
_080567A8: .4byte c2_80567AC
thumb_func_end sub_8056788
thumb_func_end CB2_ReturnToFieldCableClub
thumb_func_start c2_80567AC
c2_80567AC: @ 80567AC
push {lr}
ldr r0, _080567D0 @ =gMain + 0x438
bl sub_8056A5C
bl map_loading_iteration_3
cmp r0, 0
beq _080567CC
bl SetFieldVBlankCallback
ldr r0, _080567D4 @ =c1_link_related
bl sub_80565E0
bl SetMainCallback1
bl sub_80578D8
ldr r0, _080567D8 @ =sub_80565B4
bl SetMainCallback2
@@ -3671,7 +3671,7 @@ CB2_ReturnToField: @ 80567DC
.align 2, 0
_080567F0: .4byte c2_exit_to_overworld_2_link
_080567F4:
bl sub_80569BC
bl FieldClearVBlankHBlankCallbacks
ldr r0, _08056804 @ =c2_exit_to_overworld_2_local
bl SetMainCallback2
_080567FE:
@@ -3722,23 +3722,23 @@ _08056850: .4byte sub_80565B4
thumb_func_start c2_8056854
c2_8056854: @ 8056854
push {lr}
bl sub_80569BC
bl FieldClearVBlankHBlankCallbacks
bl StopMapMusic
ldr r0, _08056878 @ =c1_link_related
bl sub_80565E0
bl SetMainCallback1
bl sub_80578D8
ldr r0, _0805687C @ =gWirelessCommType
ldrb r0, [r0]
cmp r0, 0
beq _08056888
ldr r1, _08056880 @ =gFieldCallback
ldr r0, _08056884 @ =sub_807DE58
ldr r0, _08056884 @ =FieldCB_ReturnToFieldWirelessLink
b _0805688C
.align 2, 0
_08056878: .4byte c1_link_related
_0805687C: .4byte gWirelessCommType
_08056880: .4byte gFieldCallback
_08056884: .4byte sub_807DE58
_08056884: .4byte FieldCB_ReturnToFieldWirelessLink
_08056888:
ldr r1, _080568A0 @ =gFieldCallback
ldr r0, _080568A4 @ =sub_807DDD0
@@ -3757,7 +3757,7 @@ _080568A4: .4byte sub_807DDD0
thumb_func_start CB2_ReturnToFieldWithOpenMenu
CB2_ReturnToFieldWithOpenMenu: @ 80568A8
push {lr}
bl sub_80569BC
bl FieldClearVBlankHBlankCallbacks
ldr r1, _080568BC @ =gFieldCallback2
ldr r0, _080568C0 @ =FieldCB2_ReturnToStartMenuInit
str r0, [r1]
@@ -3772,7 +3772,7 @@ _080568C0: .4byte FieldCB2_ReturnToStartMenuInit
thumb_func_start sub_80568C4
sub_80568C4: @ 80568C4
push {lr}
bl sub_80569BC
bl FieldClearVBlankHBlankCallbacks
ldr r1, _080568D8 @ =gFieldCallback
ldr r0, _080568DC @ =sub_807DD44
str r0, [r1]
@@ -3787,7 +3787,7 @@ _080568DC: .4byte sub_807DD44
thumb_func_start CB2_ReturnToFieldContinueScriptPlayMapMusic
CB2_ReturnToFieldContinueScriptPlayMapMusic: @ 80568E0
push {lr}
bl sub_80569BC
bl FieldClearVBlankHBlankCallbacks
ldr r1, _080568F4 @ =gFieldCallback
ldr r0, _080568F8 @ =FieldCallback_ReturnToEventScript2
str r0, [r1]
@@ -3802,7 +3802,7 @@ _080568F8: .4byte FieldCallback_ReturnToEventScript2
thumb_func_start CB2_Overworld
CB2_Overworld: @ 80568FC
push {lr}
bl sub_80569BC
bl FieldClearVBlankHBlankCallbacks
ldr r1, _08056910 @ =gFieldCallback
ldr r0, _08056914 @ =sub_807DF7C
str r0, [r1]
@@ -3836,7 +3836,7 @@ _08056934: .4byte gMapHeader
thumb_func_start CB2_ContinueSavedGame
CB2_ContinueSavedGame: @ 8056938
push {lr}
bl sub_80569BC
bl FieldClearVBlankHBlankCallbacks
bl StopMapMusic
bl sub_8056420
bl set_current_map_header_from_sav1
@@ -3871,7 +3871,7 @@ _0805699C:
ldr r1, _080569B4 @ =sub_8056918
str r1, [r0]
ldr r0, _080569B8 @ =sub_8056534
bl sub_80565E0
bl SetMainCallback1
bl CB2_ReturnToField
_080569AC:
pop {r0}
@@ -3882,8 +3882,8 @@ _080569B4: .4byte sub_8056918
_080569B8: .4byte sub_8056534
thumb_func_end CB2_ContinueSavedGame
thumb_func_start sub_80569BC
sub_80569BC: @ 80569BC
thumb_func_start FieldClearVBlankHBlankCallbacks
FieldClearVBlankHBlankCallbacks: @ 80569BC
push {lr}
bl sub_80CC87C
lsls r0, 24
@@ -3915,7 +3915,7 @@ _080569F4:
bl SetHBlankCallback
pop {r0}
bx r0
thumb_func_end sub_80569BC
thumb_func_end FieldClearVBlankHBlankCallbacks
thumb_func_start SetFieldVBlankCallback
SetFieldVBlankCallback: @ 8056A04
@@ -3962,8 +3962,8 @@ _08056A52:
_08056A58: .4byte gFlashEffectParams
thumb_func_end InitCurrentFlashLevelScanlineEffect
thumb_func_start sub_8056A5C
sub_8056A5C: @ 8056A5C
thumb_func_start map_loading_iteration_3
map_loading_iteration_3: @ 8056A5C
push {r4,lr}
adds r4, r0, 0
ldrb r0, [r4]
@@ -3995,7 +3995,7 @@ _08056A78:
.4byte _08056B58
.4byte _08056B6A
_08056AB0:
bl sub_80562B0
bl InitOverworldBgs
bl ScriptContext1_Init
bl ScriptContext2_Disable
b _08056B62
@@ -4084,7 +4084,7 @@ _08056B70:
pop {r4}
pop {r1}
bx r1
thumb_func_end sub_8056A5C
thumb_func_end map_loading_iteration_3
thumb_func_start sub_8056B78
sub_8056B78: @ 8056B78
@@ -4121,8 +4121,8 @@ _08056B94:
.4byte _08056CC0
.4byte _08056BFA
_08056BD0:
bl sub_80562B0
bl sub_80569BC
bl InitOverworldBgs
bl FieldClearVBlankHBlankCallbacks
adds r0, r5, 0
bl sub_8055920
b _08056CCA
@@ -4266,7 +4266,7 @@ _08056CF0:
.4byte _08056D26
.4byte _08056D38
_08056D04:
bl sub_80562B0
bl InitOverworldBgs
bl sub_8111F14
movs r0, 0
bl sub_8057024
@@ -4331,8 +4331,8 @@ _08056D60:
.4byte _08056E34
.4byte _08056E46
_08056D98:
bl sub_80562B0
bl sub_80569BC
bl InitOverworldBgs
bl FieldClearVBlankHBlankCallbacks
b _08056E3E
_08056DA2:
bl sub_8111F14
@@ -4914,14 +4914,14 @@ _08057268: .4byte gLinkPlayers
thumb_func_start sub_805726C
sub_805726C: @ 805726C
push {lr}
bl sub_80569BC
bl FieldClearVBlankHBlankCallbacks
ldr r1, _08057298 @ =gUnknown_2036E28
movs r0, 0x1
strb r0, [r1]
bl ScriptContext1_Init
bl ScriptContext2_Disable
movs r0, 0
bl sub_80565E0
bl SetMainCallback1
ldr r0, _0805729C @ =sub_80C9BFC
bl SetMainCallback2
ldr r1, _080572A0 @ =gMain
@@ -4939,7 +4939,7 @@ _080572A4: .4byte sub_80572D8
thumb_func_start sub_80572A8
sub_80572A8: @ 80572A8
push {lr}
bl sub_80569BC
bl FieldClearVBlankHBlankCallbacks
ldr r0, _080572D0 @ =gUnknown_2036E28
movs r1, 0x1
strb r1, [r0]
@@ -4947,7 +4947,7 @@ sub_80572A8: @ 80572A8
bl ScriptContext1_Init
bl ScriptContext2_Disable
movs r0, 0
bl sub_80565E0
bl SetMainCallback1
ldr r0, _080572D4 @ =sub_80572D8
bl SetMainCallback2
pop {r0}
@@ -4964,7 +4964,7 @@ sub_80572D8: @ 80572D8
bl sub_8057300
bl SetFieldVBlankCallback
ldr r0, _080572F8 @ =sub_8056534
bl sub_80565E0
bl SetMainCallback1
ldr r0, _080572FC @ =sub_80565B4
bl SetMainCallback2
pop {r0}
@@ -5019,8 +5019,8 @@ _08057330:
.4byte _08057404
.4byte _0805740A
_0805735C:
bl sub_80562B0
bl sub_80569BC
bl InitOverworldBgs
bl FieldClearVBlankHBlankCallbacks
bl sub_8111F14
bl sub_81113E4
bl sub_8111438
@@ -5118,7 +5118,7 @@ _0805742A:
thumb_func_start sub_8057430
sub_8057430: @ 8057430
push {lr}
bl sub_80569BC
bl FieldClearVBlankHBlankCallbacks
bl StopMapMusic
ldr r1, _08057484 @ =gUnknown_2036E28
movs r0, 0x3
@@ -5149,7 +5149,7 @@ _08057488: .4byte gUnknown_2031DE0
_0805748C: .4byte CB2_LoadMap
_08057490:
ldr r0, _080574A0 @ =sub_8056534
bl sub_80565E0
bl SetMainCallback1
bl CB2_ReturnToField
_0805749A:
pop {r0}
@@ -5313,7 +5313,7 @@ _08057560:
bl ScriptContext1_Init
bl ScriptContext2_Disable
movs r0, 0
bl sub_80565E0
bl SetMainCallback1
ldr r1, _08057614 @ =gFieldCallback2
ldr r0, _08057618 @ =sub_80574EC
str r0, [r1]
+1 -1
View File
@@ -1839,7 +1839,7 @@ _08106478:
bl FillWindowPixelBuffer
movs r0, 0xB0
movs r1, 0x1
bl sub_8107D38
bl ListMenuLoadStdPalAt
mov r0, r10
cmp r0, 0
beq _08106504
+1 -1
View File
@@ -621,7 +621,7 @@ _08147A5C:
ldrh r0, [r4, 0x18]
strh r0, [r1, 0x2]
mov r0, sp
bl sub_80F9E2C
bl RfuPrepareSend0x2f00
b _08147A9E
.align 2, 0
_08147A88: .4byte gTasks+0x8
+20 -17
View File
@@ -5,8 +5,8 @@
.text
thumb_func_start sub_8147AA8
sub_8147AA8: @ 8147AA8
thumb_func_start StartPokemonJump
StartPokemonJump: @ 8147AA8
push {r4-r7,lr}
adds r6, r1, 0
lsls r0, 16
@@ -73,7 +73,7 @@ _08147B42:
pop {r4-r7}
pop {r0}
bx r0
thumb_func_end sub_8147AA8
thumb_func_end StartPokemonJump
thumb_func_start sub_8147B48
sub_8147B48: @ 8147B48
@@ -2535,7 +2535,7 @@ _08148DEA:
ands r0, r1
cmp r0, 0
bne _08148E20
bl sub_800AAC0
bl Link_TryStartSend5FFF
_08148DFA:
ldr r0, _08148E0C @ =gUnknown_203F3D4
ldr r1, [r0]
@@ -4302,7 +4302,7 @@ sub_8149A6C: @ 8149A6C
ldr r0, [r0, 0x8]
str r0, [sp, 0x4]
mov r0, sp
bl sub_80F9E2C
bl RfuPrepareSend0x2f00
add sp, 0xC
pop {r0}
bx r0
@@ -4363,7 +4363,7 @@ sub_8149AE0: @ 8149AE0
strb r1, [r2]
str r0, [sp, 0x4]
mov r0, sp
bl sub_80F9E2C
bl RfuPrepareSend0x2f00
add sp, 0xC
pop {r0}
bx r0
@@ -4425,7 +4425,7 @@ sub_8149AF8: @ 8149AF8
ldrh r0, [r0, 0xE]
strh r0, [r1, 0x4]
mov r0, sp
bl sub_80F9E2C
bl RfuPrepareSend0x2f00
add sp, 0xC
pop {r3}
mov r8, r3
@@ -4520,7 +4520,7 @@ sub_8149BF4: @ 8149BF4
mov r0, sp
strb r1, [r0, 0x6]
strh r2, [r0, 0x8]
bl sub_80F9E2C
bl RfuPrepareSend0x2f00
add sp, 0xC
pop {r4}
pop {r0}
@@ -4665,7 +4665,7 @@ _08149D20: .4byte sub_8149DC8
sub_8149D24: @ 8149D24
push {lr}
bl FreeAllWindowBuffers
bl sub_815C9F4
bl DigitObjUtil_Teardown
pop {r0}
bx r0
thumb_func_end sub_8149D24
@@ -6284,7 +6284,10 @@ sub_814A9C8: @ 814A9C8
push {r4,lr}
sub sp, 0x10
mov r1, sp
movs r0, 0x40
movs r0, 0x40 @ strConvMode = 0
@ shape = SPRITE_SHAPE(8x8)
@ size = SPRITE_SIZE(8x8)
@ priority = 1
strb r0, [r1]
movs r0, 0x5
strb r0, [r1, 0x1]
@@ -6299,11 +6302,11 @@ sub_814A9C8: @ 814A9C8
ldr r0, _0814AA20 @ =gUnknown_846D968
str r0, [sp, 0xC]
movs r0, 0x2
bl sub_815C980
bl DigitObjUtil_Init
movs r0, 0
movs r1, 0
mov r2, sp
bl sub_815CA40
bl DigitObjUtil_CreatePrinter
mov r1, sp
movs r0, 0x4
strb r0, [r1, 0x1]
@@ -6314,7 +6317,7 @@ sub_814A9C8: @ 814A9C8
movs r0, 0x1
movs r1, 0
mov r2, sp
bl sub_815CA40
bl DigitObjUtil_CreatePrinter
add sp, 0x10
pop {r4}
pop {r0}
@@ -6329,7 +6332,7 @@ sub_814AA24: @ 814AA24
push {lr}
adds r1, r0, 0
movs r0, 0
bl sub_815CD70
bl DigitObjUtil_PrintNumOn
pop {r0}
bx r0
thumb_func_end sub_814AA24
@@ -6341,7 +6344,7 @@ sub_814AA34: @ 814AA34
lsls r1, 16
lsrs r1, 16
movs r0, 0x1
bl sub_815CD70
bl DigitObjUtil_PrintNumOn
pop {r0}
bx r0
thumb_func_end sub_814AA34
@@ -7699,7 +7702,7 @@ sub_814B43C: @ 814B43C
movs r1, 0x7
movs r2, 0x78
movs r3, 0x50
bl sub_815F138
bl StartMinigameCountdown
adds r0, r4, 0
bl sub_814B134
add sp, 0x4
@@ -7711,7 +7714,7 @@ sub_814B43C: @ 814B43C
thumb_func_start sub_814B460
sub_814B460: @ 814B460
push {lr}
bl sub_815F198
bl IsMinigameCountdownRunning
pop {r1}
bx r1
thumb_func_end sub_814B460
+1 -1
View File
@@ -3187,7 +3187,7 @@ _08135FC8: .4byte gUnknown_8E9B310
_08135FCC:
movs r0, 0x60
movs r1, 0x1
bl sub_8107D38
bl ListMenuLoadStdPalAt
ldr r0, _08135FE0 @ =gUnknown_84636C0
movs r1, 0x70
_08135FD8:
+1
View File
@@ -0,0 +1 @@
lman
+1 -1
View File
@@ -1,2 +1,2 @@
gUnknown_3005E9C
sHelpSystemState
gSomeVariableBackup
+4 -4
View File
@@ -10,11 +10,11 @@ gFiller_3003EC0
gLinkHeldKeys
gRecvCmds
gLinkStatus
gUnknown_3003F24
gLinkAllAcked5FFF
gUnknown_3003F28
gUnknown_3003F2C
gUnknown_3003F30
gUnknown_3003F34
gLinkCommand2FFEAck
gLinkCommand5FFFAck
gLinkCmd5FFFparam
gSuppressLinkErrorMessage
gWirelessCommType
gSavedLinkPlayerCount
-1
View File
@@ -1 +0,0 @@
gUnknown_3005E10
+1 -1
View File
@@ -1 +1 @@
gUnknown_3005ED0
sMEventSendToEReaderManager
+19 -13
View File
@@ -339,22 +339,28 @@ gUnknown_846F458:: @ 846F458
gUnknown_846F470:: @ 846F470
spr_template 5, 5, gOamData_AffineDouble_ObjNormal_32x32, gUnknown_846F404, NULL, gUnknown_846F408, SpriteCallbackDummy
gUnknown_846F488:: @ 846F488 struct UnkStruct3? perhaps not
.byte 9, 2, 8
gUnknown_846F488:: @ 846F488 DigitObjUtilTemplate
@ strConvMode, shape, size, priority
.byte 1 | (2 /*ST_OAM_V_RECTANGLE*/ << 2) | (0 << 4) | (0 << 6) @ 9
.byte 2, 8 @ ndigits, width
.align 2
.2byte 0x9c, 0x00
.4byte gUnknown_846F2F8 + 0x18
.4byte gUnknown_846F320 + 0x10
.byte 8, 2, 8
.2byte 0x9c, 0x00 @ x, y
.4byte gUnknown_846F2F8 + 0x18 @ spriteSheet
.4byte gUnknown_846F320 + 0x10 @ spritePalette
@ strConvMode, shape, size, priority
.byte 0 | (2 /*ST_OAM_V_RECTANGLE*/ << 2) | (0 << 4) | (0 << 6) @ 8
.byte 2, 8 @ ndigits, width
.align 2
.2byte 0xb4, 0x00
.4byte gUnknown_846F2F8 + 0x18
.4byte gUnknown_846F320 + 0x10
.byte 8, 2, 8
.2byte 0xb4, 0x00 @ x, y
.4byte gUnknown_846F2F8 + 0x18 @ spriteSheet
.4byte gUnknown_846F320 + 0x10 @ spritePalette
@ strConvMode, shape, size, priority
.byte 0 | (2 /*ST_OAM_V_RECTANGLE*/ << 2) | (0 << 4) | (0 << 6) @ 8
.byte 2, 8 @ ndigits, width
.align 2
.2byte 0xcc, 0x00
.4byte gUnknown_846F2F8 + 0x18
.4byte gUnknown_846F320 + 0x10
.2byte 0xcc, 0x00 @ x, y
.4byte gUnknown_846F2F8 + 0x18 @ spriteSheet
.4byte gUnknown_846F320 + 0x10 @ spritePalette
gUnknown_846F4B8:: @ 846F4B8
.4byte gUnknown_841D034
-42
View File
@@ -174,52 +174,10 @@ gText_UnionRoomChatKeyboard_Emoji9::
gText_UnionRoomChatKeyboard_Emoji10::
.string "{EXTRA 210}{EXTRA 208}: $"
// trainer_tower (again?)
@ 847ABAC
.align 2
.include "data/trainer_tower/trainers.inc"
.align 2
gUnknown_84827AC:: @ 84827AC
.byte 0x08, 0x01
.align 2
.4byte 0
gUnknown_84827B4:: @ 84827B4
.4byte gUnknown_847F16C
.4byte gUnknown_847D26C
.4byte gUnknown_84808AC
.4byte gUnknown_847ABAC
.4byte gUnknown_847CAAC
.4byte gUnknown_847E9AC
.4byte gUnknown_847AF8C
.4byte gUnknown_847CE8C
.4byte gUnknown_847DA2C
.4byte gUnknown_847BF0C
.4byte gUnknown_847D64C
.4byte gUnknown_847DE0C
.4byte gUnknown_847B74C
.4byte gUnknown_847BB2C
.4byte gUnknown_848182C
.4byte gUnknown_847F92C
.4byte gUnknown_847C2EC
.4byte gUnknown_847C6CC
.4byte gUnknown_847E5CC
.4byte gUnknown_84804CC
.4byte gUnknown_84823CC
.4byte gUnknown_8481FEC
.4byte gUnknown_84800EC
.4byte gUnknown_847E1EC
.4byte gUnknown_847ED8C
.4byte gUnknown_848106C
.4byte gUnknown_8480C8C
.4byte gUnknown_847F92C
.4byte gUnknown_847F54C
.4byte gUnknown_847E1EC
.4byte gUnknown_847D64C
.4byte gUnknown_847C6CC
.include "data/text/move_descriptions.inc"
.align 2, 0
+5 -5
View File
@@ -30,6 +30,7 @@
#include "constants/trade.h"
#include "constants/quest_log.h"
#include "constants/daycare.h"
#include "constants/easy_chat.h"
.include "asm/macros.inc"
.include "asm/macros/event.inc"
.set FALSE, 0
@@ -1169,10 +1170,9 @@ EventScript_ResetEliteFour:: @ 81A6551
.include "data/scripts/obtain_item.inc"
.include "data/scripts/pc.inc"
@ DoEasyChatScreen?
EventScript_1A6AC0:: @ 81A6AC0
Common_ShowEasyChatScreen:: @ 81A6AC0
fadescreen FADE_TO_BLACK
special sub_80FEE44
special ShowEasyChatScreen
fadescreen FADE_FROM_BLACK
return
@@ -1332,8 +1332,8 @@ gUnknown_81A7702:: @ 81A7702
msgbox Text_FillOutQuestionnaire, MSGBOX_YESNO
compare VAR_RESULT, NO
goto_if_eq EventScript_1A778A
setvar VAR_0x8004, 14
call EventScript_1A6AC0
setvar VAR_0x8004, EASY_CHAT_TYPE_QUESTIONNAIRE
call Common_ShowEasyChatScreen
lock
faceplayer
specialvar VAR_0x8008, Special_GetMartClerkObjectId
+1 -1
View File
@@ -1149,7 +1149,7 @@ CableClub_EventScript_81BBFD8:: @ 81BBFD8
goto_if_eq CableClub_EventScript_AdapterNotConnected
special HelpSystem_Disable
fadescreen FADE_TO_BLACK
special sub_814F1D4
special Special_WirelessCommunicationScreen
waitstate
msgbox CableClub_Text_ParticipantsStepUpToCounter
special HelpSystem_Enable
+1 -1
View File
@@ -101,7 +101,7 @@ EventScript_GaveSpecialProfile: @ 81BEF3F
EventScript_GiveProfile: @ 81BEF5A
setvar VAR_0x8004, 0
call EventScript_1A6AC0
call Common_ShowEasyChatScreen
lock
faceplayer
compare VAR_0x8004, 0
+2 -2
View File
@@ -103,7 +103,7 @@ gSpecials:: @ 815FD60
def_special sub_8081128
def_special Field_AskSaveTheGame
def_special nullsub_56
def_special sub_80FEE44
def_special ShowEasyChatScreen
def_special Special_BufferEasyChatMessage
def_special nullsub_75
def_special nullsub_75
@@ -374,7 +374,7 @@ gSpecials:: @ 815FD60
def_special TryBecomeLinkLeader
def_special TryJoinLinkGroup
def_special UnionRoomSpecial
def_special sub_814F1D4
def_special Special_WirelessCommunicationScreen
def_special EnableNationalPokedex
def_special sub_80699E0
def_special sub_80699BC
+20 -20
View File
@@ -4230,51 +4230,51 @@ gJPText_MysteryGift:: @ 841DE50
gJPText_DecideStop:: @ 841DE51
.string "$"
gUnknown_841DE52:: @ 841DE52
gJPText_ReceiveMysteryGiftWithEReader:: @ 841DE52
.string "$"
gUnknown_841DE53:: @ 841DE53
gJPText_SelectConnectFromEReaderMenu:: @ 841DE53
.string "$"
gUnknown_841DE54:: @ 841DE54
gJPText_SelectConnectWithGBA:: @ 841DE54
.string "$"
gUnknown_841DE55:: @ 841DE55
gJPText_SelectConnectAndPressA:: @ 841DE55
.string "-e--{PLUS} '\n"
.string " A $"
gUnknown_841DE7C:: @ 841DE7C
gJPText_LinkIsIncorrect:: @ 841DE7C
.string "$"
gUnknown_841DE7D:: @ 841DE7D
gJPText_CardReadingHasBeenHalted:: @ 841DE7D
.string "$"
gUnknown_841DE7E:: @ 841DE7E
gJPText_UnableConnectWithEReader:: @ 841DE7E
.string "-e--{PLUS}\n"
.string " $"
gUnknown_841DE95:: @ 841DE95
gJPText_Connecting:: @ 841DE95
.string "$"
gUnknown_841DE96:: @ 841DE96
gJPText_ConnectionErrorCheckLink:: @ 841DE96
.string "$"
gUnknown_841DE97:: @ 841DE97
gJPText_ConnectionErrorTryAgain:: @ 841DE97
.string "$"
gUnknown_841DE98:: @ 841DE98
gJPText_AllowEReaderToLoadCard:: @ 841DE98
.string "$"
gUnknown_841DE99:: @ 841DE99
gJPText_ConnectionComplete:: @ 841DE99
.string "$"
gUnknown_841DE9A:: @ 841DE9A
gJPText_NewTrainerHasComeToSevii:: @ 841DE9A
.string "$"
gUnknown_841DE9B:: @ 841DE9B
gJPText_PleaseWaitAMoment:: @ 841DE9B
.string "$"
gUnknown_841DE9C:: @ 841DE9C
gJPText_WriteErrorUnableToSaveData:: @ 841DE9C
.string "$"
gText_CommErrorCheckConnections:: @ 841DE9D
@@ -4498,19 +4498,19 @@ gUnknown_841E243:: @ 841E243
gUnknown_841E244:: @ 841E244
.string "$"
gUnknown_841E245:: @ 841E245
gText_WirelessCommunicationStatus:: @ 841E245
.string "Wireless Communication Status$"
gUnknown_841E263:: @ 841E263
gText_PeopleTrading:: @ 841E263
.string "People trading:$"
gUnknown_841E273:: @ 841E273
gText_PeopleBattling:: @ 841E273
.string "People battling:$"
gUnknown_841E284:: @ 841E284
gText_PeopleInUnionRoom:: @ 841E284
.string "People in the UNION ROOM:$"
gUnknown_841E29E:: @ 841E29E
gText_PeopleCommunicating:: @ 841E29E
.string "People communicating:$"
gUnknown_841E2B4:: @ 841E2B4
+40
View File
@@ -5111,3 +5111,43 @@ gUnknown_84823CC::
.byte 255 @ friendship
.byte 0x80, 0x6b, 0x01
.align 2
gUnknown_84827AC:: @ 84827AC
.byte 0x08, 0x01
.2byte 0
.4byte 0
gUnknown_84827B4:: @ 84827B4
.4byte gUnknown_847F16C
.4byte gUnknown_847D26C
.4byte gUnknown_84808AC
.4byte gUnknown_847ABAC
.4byte gUnknown_847CAAC
.4byte gUnknown_847E9AC
.4byte gUnknown_847AF8C
.4byte gUnknown_847CE8C
.4byte gUnknown_847DA2C
.4byte gUnknown_847BF0C
.4byte gUnknown_847D64C
.4byte gUnknown_847DE0C
.4byte gUnknown_847B74C
.4byte gUnknown_847BB2C
.4byte gUnknown_848182C
.4byte gUnknown_847F92C
.4byte gUnknown_847C2EC
.4byte gUnknown_847C6CC
.4byte gUnknown_847E5CC
.4byte gUnknown_84804CC
.4byte gUnknown_84823CC
.4byte gUnknown_8481FEC
.4byte gUnknown_84800EC
.4byte gUnknown_847E1EC
.4byte gUnknown_847ED8C
.4byte gUnknown_848106C
.4byte gUnknown_8480C8C
.4byte gUnknown_847F92C
.4byte gUnknown_847F54C
.4byte gUnknown_847E1EC
.4byte gUnknown_847D64C
.4byte gUnknown_847C6CC
+245
View File
@@ -0,0 +1,245 @@
#ifndef GUARD_LINKMANAGER_H
#define GUARD_LINKMANAGER_H
//-----------------------------------------------------------------
// Constant definition
//-----------------------------------------------------------------
// Link Manager operation mode (specified by u8 parent_child argument of rfu_LMAN_establishConnection)
//#define MODE_CHILD 0 // Start Link Manager in CHILD mode
//#define MODE_PARENT 1 // Start Link Manager in PARENT mode
//Note: This value uses the item defined by AgbRFU_LL.h.
#define MODE_P_C_SWITCH 2 // Start Link Manager in parent-child switching mode.
// Value of lman.p_c_switch_flag
#define PCSWITCH_1ST_SC_START 0x01
#define PCSWITCH_1ST_SC 0x02
#define PCSWITCH_2ND_SP_START 0x03
#define PCSWITCH_2ND_SP 0x04
#define PCSWITCH_3RD_SC_START 0x05
#define PCSWITCH_3RD_SC 0x06
#define PCSWITCH_CP 0x07
#define PCSWITCH_SC_LOCK 0x08
#define PCSWITCH_FORCE_SP_START 0x09
// Period for which parent-child switching search specified
#define PCSWITCH_ALL_PERIOD 180 // Entire cycle 180 frames
#define PCSWITCH_SP_PERIOD 40 // Child period 40 frames
// Error code returned by Link Manager API (rfu_LMAN_...return value of function)
#define LMAN_ERROR_MANAGER_BUSY 1 // Link Manager is already running.
#define LMAN_ERROR_AGB_CLK_SLAVE 2 // AGB is clock slave so link manager cannot run.
#define LMAN_ERROR_PID_NOT_FOUND 3 // Parent device information of the specified PID does not exist in rfuLinkStatus->partner[0-3].
#define LMAN_ERROR_ILLEGAL_PARAMETER 4 // Specified argument is unusual.
#define LMAN_ERROR_NOW_LINK_RECOVERY 5 // New settings were ignored because link recovery was under way when current link recovery was ON and new settings turned link recovery OFF.
#define LMAN_ERROR_NOW_COMMUNICATION 6 // New settings were ignored because currently communicating with NI.
#define LMAN_ERROR_NOW_SEARCH_PARENT 7 // Parent search currently under way, so ignore new setting.
// Details of messages and the related parameters returned by the u8 msg, u8 param_count, and lman.param[0-1] arguments of the LMAN callback generated by the operation of the Link Manager.
// msg name msg No. param qty param[0] param[1] Description
#define LMAN_MSG_INITIALIZE_COMPLETED 0x00 // 0 - - Generated when RFU reset and initial settings are completed
#define LMAN_MSG_NEW_CHILD_CONNECT_DETECTED 0x10 // 1 Bit indicating slot - Generated when new child device connection was detected at RFU level.
// with detected connection
#define LMAN_MSG_NEW_CHILD_CONNECT_ACCEPTED 0x11 // 1 Bit indicating slot - Generated when game identification information from child device connected at RFU level is received and accepted (game serial numbers match).
// where connection was accepted
#define LMAN_MSG_NEW_CHILD_CONNECT_REJECTED 0x12 // 1 Bit indicating slot - Generated when the connection from the child device connected at RFU level is rejected (game identification information reception failed or game serial numbers do not match).
// where connection was rejected
#define LMAN_MSG_SEARCH_CHILD_PERIOD_EXPIRED 0x13 // 0 - - Generated when SearchChild operation time expires.
#define LMAN_MSG_END_WAIT_CHILD_NAME 0x14 // 0 - - Generated when reception of game identification information from all child devices completes after the SearchChild operation time expires.
#define LMAN_MSG_PARENT_FOUND 0x20 // 1 Bit indicating - Generated when valid (game serial numbers match) parent devices are found during SearchParent.
// rfuLinkStatus->partner[x] index number storing the valid parent devices (game serial number matches) from among the discovered parent devices.
#define LMAN_MSG_SEARCH_PARENT_PERIOD_EXPIRED 0x21 // 0 - - Generated when SearchParent time expires.
#define LMAN_MSG_CONNECT_PARENT_SUCCESSED 0x22 // 1 Connected slot number - Generated when connection with parent device at RFU level succeeds.
#define LMAN_MSG_CONNECT_PARENT_FAILED 0x23 // 1 Connection failure reason - Generated when connection with parent device at RFU level fails.
#define LMAN_MSG_CHILD_NAME_SEND_COMPLETED 0x24 // 0 - - Generated when transmission of the child's game identification information to the parent device succeeds after connection with parent device at RFU level succeeds.
#define LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED 0x25 // 0 - - Generated when transmission of the child's game identification information to the parent device fails after connection with parent device at RFU level succeeds.
#define LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED 0x30 // 1 Bit indicating slot - Generated when a link cut is detected and that slot disconnects. (Generated only when link recovery is OFF.)
// that was disconnected and where link cut was detected but link recover not attempted
#define LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY 0x31 // 1 Bit indicating slot - Generated when a link cut is detected and the link recovery process starts. (Generated only when link recovery is ON.)
// where link cut was detected and link recovery was started
#define LMAN_MSG_LINK_RECOVERY_SUCCESSED 0x32 // 1 Bit indicating slot - Generated when link recovery succeeds. (Generated only when link recovery is ON.)
// where link recovery succeeded
#define LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED 0x33 // 1 Bit indicating slot - Generated when link recovery fails and that slot disconnects. (Generated only when link recovery is ON.)
// where link recovery failed and that disconnected
#define LMAN_MSG_LINK_DISCONNECTED_BY_USER 0x40 // 1 Generated on disconnection by execution of rfu_REQ_disconnect by disconnected user.
// Slot indicated in bits *Note: If rfu_REQ_disconnect is used for disconnection during link recovery in the child device, the link recovery is also suspended, but the only message returned is DISCONNECTED_BY_USER.
#define LMAN_MSG_CHANGE_AGB_CLOCK_SLAVE 0x41 // 0 - - Generated when the AGB-RFU clock switches to AGB clock slave after a successful connection or link recovery in the child device. (This message is not generated when the AGB switches to a clock slave when an MSC callback completes.)
#define LMAN_MSG_CHANGE_AGB_CLOCK_MASTER 0x45 // 0 - - Generated when the AGB-RFU intercommunication clock is switched to the AGB clock master in the child device.
#define LMAN_MSG_RFU_POWER_DOWN 0x42 // 0 - - Generated when the RFU enters power conservation mode with rfu_LMAN_powerDownRFU.
#define LMAN_MSG_MANAGER_STOPPED 0x43 // 0 - - Generated when the Link Manager is halted by rfu_LMAN_stopLMAN(0). (This message is not generated during SearchChild, SearchParent, ConnectParent, and LinkRecovery. A message (-PERIOD_EXPIRED, -SUCCESSED, -FAILED) corresponding to the operation completion is returned.)
#define LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET 0x44 // 0 - - Generates when the Link Manager is forcibly halted by rfu_LMAN_stopLMAN(1) and RFU is reset.
#define LMAN_MSG_RECV_DATA_REQ_COMPLETED 0x50 // 0 - - Generated when the execution of rfu_REQ_recvData completes. (This message is not notification of data reception from a RFU.)
#define LMAN_MSG_REQ_API_ERROR 0xf0 // 2 REQ_commandID REQ_result REQ-API resulted in error. This message is also generated by an REQ-API executed by either the link manager or the user.
#define LMAN_MSG_WATCH_DOG_TIMER_ERROR 0xf1 // 0 - - Generated when a MSC callback does not occur even after 6 seconds pass when the AGB is the clock slave.
#define LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA 0xf2 // 0 - - Generated when an automatic starting DMA, such as HDMA, is issued at the same time the RFU attempts to send notification and to return the AGB to the clock master while the AGB is the clock slave and the exchange of that information (REQ command) fails.
#define LMAN_MSG_LMAN_API_ERROR_RETURN 0xf3 // 1 Return error code - Generated when LMAN-API execution returns an error.
#define LMAN_MSG_RFU_FATAL_ERROR 0xff // 0 - - Generated when the Link Manager cannot recongize a RFU because of the execution of rfu_REQBN_softReset_and_checkID.
// Value of lman.childClockSlave_flag
#define RFU_CHILD_CLOCK_SLAVE_OFF 0 // The child device is not operating in AGB clock slave mode. (The child device is in this mode in cases such as when the child has not established a connection or during link recovery.)
#define RFU_CHILD_CLOCK_SLAVE_ON 1 // The child device is operating in AGB clock slave mode. (Child automatically enters this mode when a connection is established.)
#define RFU_CHILD_CLOCK_SLAVE_OFF_REQ 2 // The child device has requested that AGB clock slave mode be halted.
// State of Link Manager (values of lman.state, lman.next_state)
#define LMAN_STATE_READY 0x00 // Waiting
#define LMAN_STATE_SOFT_RESET_AND_CHECK_ID 0x01 // Requesting execution of rfu_REQBN_softResetAndCheckID (same as below)
#define LMAN_STATE_RESET 0x02 // rfu_REQ_reset
#define LMAN_STATE_CONFIG_SYSTEM 0x03 // rfu_REQ_configSystem
#define LMAN_STATE_CONFIG_GAME_DATA 0x04 // rfu_REQ_configGameData
#define LMAN_STATE_START_SEARCH_CHILD 0x05 // rfu_REQ_startSearchChild
#define LMAN_STATE_POLL_SEARCH_CHILD 0x06 // rfu_REQ_pollSearchChild
#define LMAN_STATE_END_SEARCH_CHILD 0x07 // rfu_REQ_endSearchChild
#define LMAN_STATE_WAIT_RECV_CHILD_NAME 0x08 // Awaiting reception of game name from connected child device.
#define LMAN_STATE_START_SEARCH_PARENT 0x09 // rfu_REQ_startSearchParent
#define LMAN_STATE_POLL_SEARCH_PARENT 0x0a // rfu_REQ_pollSearchParent
#define LMAN_STATE_END_SEARCH_PARENT 0x0b // rfu_REQ_endSearchParent
#define LMAN_STATE_START_CONNECT_PARENT 0x0c // rfu_REQ_startConnectParent
#define LMAN_STATE_POLL_CONNECT_PARENT 0x0d // rfu_REQ_pollConnectParent
#define LMAN_STATE_END_CONNECT_PARENT 0x0e // rfu_REQ_endConnectParent
#define LMAN_STATE_SEND_CHILD_NAME 0x0f // Sending child game name.
#define LMAN_STATE_START_LINK_RECOVERY 0x10 // rfu_REQ_CHILD_startConnectRecovery
#define LMAN_STATE_POLL_LINK_RECOVERY 0x11 // rfu_REQ_CHILD_pollConnectRecovery
#define LMAN_STATE_END_LINK_RECOVERY 0x12 // rfu_REQ_CHILD_endConnectRecovery
#define LMAN_STATE_MS_CHANGE 0x13 // rfu_REQ_changeMasterSlave
#define LMAN_STATE_WAIT_CLOCK_MASTER 0x14 // Waiting for AGB-RFU intercommunication clock to become AGB clock master.
#define LMAN_STATE_STOP_MODE 0x15 // rfu_REQ_stopMode
#define LMAN_STATE_BACK_STATE 0x16 // Following the completion of link-recovery processing, return the Link Manager state to the state present before link-recovery processing was initiated.
#define LMAN_FORCED_STOP_AND_RFU_RESET 0x17 // Attempt to forcibly stop Link Manager using rfu_LMAN_stopLMAN(1).
#define LMAN_STATE_WAIT_CHANGE_CLOCK_MASTER 0x18 // Attempt to return to AGB clock master after child fails in sending game name.
// RfuTgtData.gname is read as these structs.
struct GFtgtGnameSub
{
u16 language:4;
u16 hasNews:1;
u16 hasCard:1;
u16 unk_00_6:1;
u16 isChampion:1;
u16 hasNationalDex:1;
u16 gameClear:1;
u16 version:4;
u16 unk_01_6:2;
u8 playerTrainerId[2];
};
struct __attribute__((packed, aligned(2))) GFtgtGname
{
struct GFtgtGnameSub unk_00;
u8 child_sprite_gender[RFU_CHILD_MAX]; // u8 sprite_idx:3;
// u8 gender:1;
// u8 unk_4:3
// u8 active:1
u16 species:10;
u16 type:6;
u8 activity:7;
u8 started:1;
u8 playerGender:1;
u8 level:7;
u8 padding;
}; // size: RFU_GNAME_SIZE
struct Padded_U8
{
u8 value;
};
// Parameter group used in initial setting run of the link manager (rfu_LMAN_initializeRFU)
typedef struct InitializeParametersTag {
// rfu_REQ_configSystem argument
u8 maxMFrame; // Maximum number of times to re-transmit of RFU level
u8 MC_TimerCount; // MC_Timer count (x16.7ms)
u16 availSlot_flag; // Use RFU-API constant "AVAIL_SLOT1-4" to specify the maximum number of child devices (1 - 4) that can be connected to a parent device.
// rfu_REQB_configGameData argument
u8 mboot_flag; // Multiplayer boot flag
u16 serialNo; // Game serial number
u8 *gameName; // Game name
u8 *userName; // User name
// ON/OFF flag for parent fast search operation by child.
u8 fastSearchParent_flag; // Flag indicating whether parent fast search operation to be performed by child.
// Link recovery settings
u8 linkRecovery_enable; // Determines whether or not to execute the link recovery process when a link cut occurs
u16 linkRecovery_period; // Time to spend on the link recovery process (x 16.7 ms) Note: Runs for unlimited time when specifying 0.
// Setting for NI-type data transmit/receive period
u16 NI_failCounter_limit; // Limit for failCounter during NI type data transmit/receive (x 16.7 ms) Note: Runs for unlimited time when specifying 0.
}INIT_PARAM;
// Timer that counts with the V-Blank cycle
typedef struct VblankTimerTag {
u8 active; // Timer ON/OFF (bits 0 - 3 indicate ON/OFF for each connected slot)
u16 count_max; // Maximum count value (x16.7ms)
u16 count[RFU_CHILD_MAX]; // Current count value (x 16.7 ms) for each connected slot
}VBL_TIMER;
struct UnkLinkRfuStruct_02022B44
{
u8 fill_00[6];
u16 unk_06;
u8 fill_08[6];
vu8 unk_0e;
u8 unk_0f;
u8 fill_10[0x54];
u16 unk_64;
u8 fill_66[0x1d];
u8 unk_83;
u8 fill_84[0x58];
};
typedef struct linkManagerTag
{
/* 0x000 */ u8 acceptSlot_flag;
/* 0x001 */ u8 acceptCount;
/* 0x002 */ vu8 childClockSlave_flag;
/* 0x003 */ vu8 parentAck_flag;
/* 0x004 */ u8 state;
/* 0x005 */ u8 next_state;
/* 0x006 */ u8 parent_child;
/* 0x007 */ u8 pcswitch_flag;
/* 0x008 */ u8 RFU_powerOn_flag;
/* 0x009 */ u8 linkRecovery_enable;
/* 0x00a */ u8 linkRecovery_start_flag;
/* 0x00b */ u8 fastSearchParent_flag;
/* 0x00c */ u8 connectSlot_flag_old;
/* 0x00d */ u8 reserveDisconnectSlot_flag;
/* 0x00e */ u8 active;
/* 0x00f */ u8 msc_exe_flag;
/* 0x010 */ u8 child_slot;
/* 0x011 */ u8 state_bak[2];
/* 0x014 */ u16 param[2];
/* 0x018 */ u16 NI_failCounter_limit;
/* 0x01a */ u16 connect_period;
/* 0x01c */ u16 pcswitch_period_bak;
/* 0x01e */ u16 work;
/* 0x020 */ u16 *acceptable_serialNo_list;
/* 0x024 */ VBL_TIMER nameAcceptTimer;
/* 0x030 */ VBL_TIMER linkRecoveryTimer;
/* 0x03c */ INIT_PARAM *init_param;
/* 0x040 */ void (*LMAN_callback)(u8, u8);
/* 0x044 */ void (*MSC_callback)(u16);
} LINK_MANAGER;
extern struct linkManagerTag lman;
u32 rfu_LMAN_REQBN_softReset_and_checkID(void);
void rfu_LMAN_requestChangeAgbClockMaster(void);
void rfu_LMAN_initializeRFU(INIT_PARAM *init_params);
u8 rfu_LMAN_establishConnection(u8 parent_child, u16 connect_period, u16 name_accept_period, u16 *acceptable_serialNo_list);
void rfu_LMAN_stopManager(bool8 forced_stop_and_RFU_reset_flag);
void rfu_LMAN_setMSCCallback(void (*MSC_callback_p)(u16));
void rfu_LMAN_REQ_sendData(bool8 clockChangeFlag);
void rfu_LMAN_powerDownRFU(void);
u8 rfu_LMAN_CHILD_connectParent(u16 parentId, u16 connect_period);
u8 rfu_LMAN_setLinkRecovery(u8 enable_flag, u16 recovery_period);
void rfu_LMAN_manager_entity(u32 rand);
void rfu_LMAN_syncVBlank(void);
u8 rfu_LMAN_initializeManager(void (*LMAN_callback_p)(u8, u8), void (*MSC_callback_p)(u16));
void rfu_LMAN_forceChangeSP(void);
#endif //GUARD_LINKMANAGER_H
+1 -1
View File
@@ -1,6 +1,6 @@
#ifndef GUARD_BERRY_CRUSH_H
#define GUARD_BERRY_CRUSH_H
void sub_814B754(MainCallback callback);
void StartBerryCrush(MainCallback callback);
#endif //GUARD_BERRY_CRUSH_H
+1 -16
View File
@@ -6,22 +6,7 @@
#define EASY_CHAT_TYPE_BATTLE_WON 2
#define EASY_CHAT_TYPE_BATTLE_LOST 3
#define EASY_CHAT_TYPE_MAIL 4
#define EASY_CHAT_TYPE_INTERVIEW 5
#define EASY_CHAT_TYPE_BARD_SONG 6
#define EASY_CHAT_TYPE_FAN_CLUB 7
#define EASY_CHAT_TYPE_UNK_8 8
#define EASY_CHAT_TYPE_TRENDY_PHRASE 9
#define EASY_CHAT_TYPE_GABBY_AND_TY 10
#define EASY_CHAT_TYPE_CONTEST_INTERVIEW 11
#define EASY_CHAT_TYPE_BATTLE_TOWER_INTERVIEW 12
#define EASY_CHAT_TYPE_GOOD_SAYING 13
#define EASY_CHAT_TYPE_FAN_QUESTION 14
#define EASY_CHAT_TYPE_QUIZ_ANSWER 15
#define EASY_CHAT_TYPE_QUIZ_QUESTION 16
#define EASY_CHAT_TYPE_QUIZ_SET_QUESTION 17
#define EASY_CHAT_TYPE_QUIZ_SET_ANSWER 18
#define EASY_CHAT_TYPE_APPRENTICE 19
#define EASY_CHAT_TYPE_QUESTIONNAIRE 20
#define EASY_CHAT_TYPE_QUESTIONNAIRE 14
#define EC_GROUP_POKEMON_2 0x0
#define EC_GROUP_TRAINER 0x1
+45
View File
@@ -1,6 +1,48 @@
#ifndef GUARD_CONSTANTS_UNION_ROOM_H
#define GUARD_CONSTANTS_UNION_ROOM_H
#define UNION_ROOM_SPAWN_NONE 0
#define UNION_ROOM_SPAWN_IN 1
#define UNION_ROOM_SPAWN_OUT 2
#define ACTIVITY_NONE 0
#define ACTIVITY_BATTLE 1
#define ACTIVITY_DBLBATTLE 2
#define ACTIVITY_MLTBATTLE 3
#define ACTIVITY_TRADE 4
#define ACTIVITY_CHAT 5
#define ACTIVITY_WCARD 6
#define ACTIVITY_WNEWS 7
#define ACTIVITY_CARD 8
#define ACTIVITY_PJUMP 9
#define ACTIVITY_BCRUSH 10
#define ACTIVITY_BPICK 11
#define ACTIVITY_SEARCH 12
#define ACTIVITY_SPINTRADE 13
#define ACTIVITY_ITEMTRADE 14
// Player response
#define ACTIVITY_ACCEPT 17
#define ACTIVITY_DECLINE 18
#define ACTIVITY_NPCTALK 19
#define ACTIVITY_PLYRTALK 20
// Duplicate IDs?
#define ACTIVITY_WCARD2 21
#define ACTIVITY_WNEWS2 22
#define IN_UNION_ROOM 0x40
// Used in UR_AddTextPrinterParameterized
#define UR_COLOR_DKE_WHT_LTE 0
#define UR_COLOR_RED_WHT_LTR 1
#define UR_COLOR_GRN_WHT_LTG 2
#define UR_COLOR_WHT_WHT_LTE 3
#define UR_COLOR_WHT_DKE_LTE 4
#define UR_COLOR_GRN_DN6_LTB 5
#define UR_COLOR_DN5_DN6_LTB 6
#define LINK_GROUP_SINGLE_BATTLE 0
#define LINK_GROUP_DOUBLE_BATTLE 1
#define LINK_GROUP_MULTI_BATTLE 2
@@ -12,4 +54,7 @@
#define LINK_GROUP_WONDER_NEWS 8
#define NUM_LINK_GROUP_TYPES 9
#define LINK_GROUP_UNION_ROOM_RESUME 9
#define LINK_GROUP_UNION_ROOM_INIT 10
#endif //GUARD_CONSTANTS_UNION_ROOM_H
+24
View File
@@ -0,0 +1,24 @@
#ifndef GUARD_DIGIT_OBJ_UTIL_H
#define GUARD_DIGIT_OBJ_UTIL_H
struct DigitObjUtilTemplate
{
u8 strConvMode:2;
u8 shape:2;
u8 size:2;
u8 priority:2;
u8 oamCount;
u8 xDelta;
s16 x;
s16 y;
const struct SpriteSheet *spriteSheet;
const struct SpritePalette *spritePal;
};
void DigitObjUtil_Teardown(void);
bool32 DigitObjUtil_CreatePrinter(u32 id, s32 num, const struct DigitObjUtilTemplate *template);
void DigitObjUtil_PrintNumOn(u32 id, s32 num);
void DigitObjUtil_DeletePrinter(u32 id);
void DigitObjUtil_HideOrShow(u32 id, bool32 hide);
#endif //GUARD_DIGIT_OBJ_UTIL_H
+1 -1
View File
@@ -1,6 +1,6 @@
#ifndef GUARD_DODRIO_BERRY_PICKING_H
#define GUARD_DODRIO_BERRY_PICKING_H
void sub_81507FC(u16 species, MainCallback callback);
void StartDodrioBerryPicking(u16 species, MainCallback callback);
#endif //GUARD_DODRIO_BERRY_PICKING_H
+36
View File
@@ -0,0 +1,36 @@
#ifndef GUARD_EREADER_HELPERS_H
#define GUARD_EREADER_HELPERS_H
enum {
EREADER_XFR_STATE_INIT = 0,
EREADER_XFR_STATE_HANDSHAKE,
EREADER_XFR_STATE_START,
EREADER_XFR_STATE_TRANSFER,
EREADER_XFR_STATE_TRANSFER_DONE,
EREADER_XFR_STATE_CHECKSUM,
EREADER_XFR_STATE_DONE
};
#define EREADER_XFER_EXE 1
#define EREADER_XFER_CHK 2
#define EREADER_XFER_SHIFT 0
#define EREADER_XFER_MASK 3
#define EREADER_CANCEL_TIMEOUT 1
#define EREADER_CANCEL_KEY 2
#define EREADER_CANCEL_MASK 0xC
#define EREADER_CANCEL_SHIFT 2
#define EREADER_CHECKSUM_OK 1
#define EREADER_CHECKSUM_ERR 2
#define EREADER_CHECKSUM_MASK 0x30
#define EREADER_CHECKSUM_SHIFT 4
void EReaderHelper_SerialCallback(void);
void EReaderHelper_Timer3Callback(void);
void EReaderHelper_SaveRegsState(void);
void EReaderHelper_ClearsSendRecvMgr(void);
void EReaderHelper_RestoreRegsState(void);
u16 EReaderHandleTransfer(u8 mode, size_t size, const void * src, void * dest);
#endif //GUARD_EREADER_HELPERS_H
+2 -2
View File
@@ -54,8 +54,8 @@ bool8 FlagGet(u16 id);
u16 * GetVarPointer(u16 id);
bool32 IsMysteryGiftEnabled(void);
void ResetSpecialVars(void);
void sub_806E2D0(void);
void sub_806E370(void);
void ResetMysteryEventFlags(void);
void ResetMysteryEventVars(void);
bool32 IsNationalPokedexEnabled(void);
void sub_806E190(void);
+5 -5
View File
@@ -6,10 +6,10 @@
void FreezeObjectEvents(void);
bool8 FreezeObjectEvent(struct ObjectEvent *);
void FreezeObjectEventsExceptOne(u8 objEventId);
void RfuUnionObjectToggleInvisibility(u8 a0, bool32 a1);
u32 RfuUnionObjectIsInvisible(u8 a0);
void RfuUnionObjectStartWarp(u8 a0, u8 a1);
void RfuUnionObjectSetFacingDirection(u8 a0, u8 a1);
bool32 RfuUnionObjectIsWarping(u8 a0);
void RfuUnionObjectSetFacingDirection(u8 objectEventId, u8 direction);
void RfuUnionObjectToggleInvisibility(u8 objectEventId, bool32 invisible);
bool32 RfuUnionObjectIsInvisible(u8 objectEventId);
void RfuUnionObjectStartWarp(u8 objectEventId, u8 animNo);
bool32 RfuUnionObjectIsWarping(u8 objectEventId);
#endif // GUARD_EVENT_OBJECT_80688E4_H
+1 -1
View File
@@ -11,6 +11,6 @@ void sub_8098630(void);
bool8 sub_8098734(void);
void sub_80696C0(void);
bool8 walkrun_is_standing_still(void);
void sub_80696F0(void);
void UnionRoom_UnlockPlayerAndChatPartner(void);
#endif // GUARD_EVENT_OBJECT_LOCK_H
+1 -1
View File
@@ -31,6 +31,6 @@ void sub_8059948(u8 a0, u8 a1);
void save_serialize_map(void);
u32 sub_8058F1C(u32 original, u8 bit);
u32 sub_8058F48(s16 x, s16 y, u8 z);
void sub_8059024(s32 x, s32 y, bool32 arg2);
void MapGridSetMetatileImpassabilityAt(s32 x, s32 y, bool32 arg2);
#endif //GUARD_FIELDMAP_H
+12 -11
View File
@@ -74,8 +74,8 @@
// GameFreak never ceases to amaze.
// TODO: Propagate use of this macro
#define TEST_BUTTON(field, button) ({(field) & (button);})
#define JOY_NEW(button) TEST_BUTTON(gMain.newKeys, button)
#define JOY_HELD(button) TEST_BUTTON(gMain.heldKeys, button)
#define JOY_NEW(button) TEST_BUTTON(gMain.newKeys, button)
#define JOY_HELD(button) TEST_BUTTON(gMain.heldKeys, button)
#define JOY_REPT(button) TEST_BUTTON(gMain.newAndRepeatedKeys, button)
extern u8 gStringVar1[];
@@ -658,8 +658,8 @@ struct FameCheckerSaveData
struct MEWonderNewsData
{
u16 unk_00;
u8 unk_02;
u16 newsId;
u8 shareState;
u8 unk_03;
u8 unk_04[40];
u8 unk_2C[10][40];
@@ -673,13 +673,13 @@ struct MEWonderNewsStruct
struct MEWonderCardData
{
u16 unk_00;
u16 cardId;
u16 unk_02;
u32 unk_04;
u8 unk_08_0:2;
u8 unk_08_2:4;
u8 unk_08_6:2;
u8 unk_09;
u8 shareState:2;
u8 recvMonCapacity;
u8 unk_0A[40];
u8 unk_32[40];
u8 unk_5A[4][40];
@@ -695,11 +695,12 @@ struct MEWonderCardStruct
struct MEventBuffer_3430_Sub
{
u16 unk_00;
u16 unk_02;
u16 unk_04;
u16 linkWins;
u16 linkLosses;
u16 linkTrades;
u16 unk_06;
u16 unk_08[2][7];
u16 distributedMons[2][7]; // [0][x] = species
// [1][x] = ???
};
struct MEventBuffer_3430
+17 -17
View File
@@ -17,16 +17,16 @@ struct HelpSystemListMenu_sub
struct HelpSystemListMenu
{
struct HelpSystemListMenu_sub sub;
u8 field_0C;
u8 field_0D;
u8 field_0E;
u8 itemsAbove;
u8 cursorPos;
u8 state;
u8 filler_10[0xC];
};
extern struct HelpSystemListMenu gHelpSystemListMenu;
extern struct ListMenuItem gHelpSystemListMenuItems[];
extern bool8 gHelpSystemEnabled;
extern u8 gUnknown_203F175;
extern bool8 gHelpSystemToggleWithRButtonDisabled;
// help_system_812B1E0
void HelpSystem_SetSomeVariable(u8);
@@ -35,19 +35,19 @@ bool8 sub_812B40C(void);
bool8 sub_812B45C(void);
void HelpSystem_Disable(void);
void HelpSystem_Enable(void);
void sub_812B4B8(void);
bool8 sub_812BB9C(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
bool8 sub_812BC54(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
bool8 sub_812BC80(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
bool8 sub_812BCA8(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
bool8 sub_812BCD0(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
bool8 sub_812BD2C(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
bool8 sub_812BD64(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
bool8 sub_812BD98(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
void HelpSystem_EnableToggleWithRButton(void);
bool8 RunHelpMenuSubroutine(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer);
bool8 HelpSystemSubroutine_PrintWelcomeMessage(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer);
bool8 HelpSystemSubroutine_WelcomeWaitButton(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer);
bool8 HelpSystemSubroutine_WelcomeEndGotoMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer);
bool8 HelpSystemSubroutine_MenuInputHandlerMain(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer);
bool8 HelpMenuSubroutine_InitSubmenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer);
bool8 HelpMenuSubroutine_ReturnFromSubmenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer);
bool8 HelpMenuSubroutine_SubmenuInputHandler(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer);
void sub_812BDEC(void);
bool8 sub_812BE10(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
bool8 sub_812BEEC(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
bool8 sub_812BF18(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
bool8 HelpMenuSubroutine_HelpItemPrint(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer);
bool8 HelpMenuSubroutine_ReturnFromHelpItem(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer);
bool8 HelpMenuSubroutine_HelpItemWaitButton(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer);
bool8 sub_812BF88(void);
// help_system
@@ -92,6 +92,6 @@ bool8 MoveCursor(u8 by, u8 dirn);
void HelpSystem_BackupSomeVariable(void);
void HelpSystem_RestoreSomeVariable(void);
void HelpSystemRenderText(u8 font, u8 * dest, const u8 * src, u8 x, u8 y, u8 width, u8 height);
void sub_812B4AC(void);
void HelpSystem_DisableToggleWithRButton(void);
#endif //GUARD_HELP_SYSTEM_H
+18 -37
View File
@@ -4,11 +4,8 @@
#include "global.h"
#include "main.h"
/* TODOs:
* - split files
/* TODOs:
* - documentation
* - decompile librfu_intr.s once arm support is back again
(for internal structs not documented in SDK)
* - check if any field needs to be volatile
* - check if field names make sense
*/
@@ -71,6 +68,7 @@
#define ID_CPR_POLL_REQ 0x0033
#define ID_CPR_END_REQ 0x0034
#define ID_UNK35_REQ 0x0035 // not defined in SDK header
#define ID_UNK36_REQ 0x0036 // not defined in SDK header
#define ID_RESUME_RETRANSMIT_AND_CHANGE_REQ 0x0037
#define ID_STOP_MODE_REQ 0x003d
#define ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ 0x00ff // When the AGB is the clock slave, the RFU generates an informational notice, and an automatically started DMA, such as HDMA, is generated at the instant the AGB is being returned as the clock master. This ID is notified by a REQ callback when the exchange of this information (REQ command) fails.
@@ -90,8 +88,13 @@
#define RFU_MBOOT_DOWNLOADER_SERIAL_NO 0x0000 // The game serial number of the multi-boot downloader (programs that boot without a Game Pak)
#if LIBRFU_VERSION >= 1028
#define RFU_API_BUFF_SIZE_RAM 0x0e8c // Necessary size for buffer specified by rfu_initializeAPI (fast communication version that operates the library SIO interrupt routines in RAM)
#define RFU_API_BUFF_SIZE_ROM 0x052c // Necessary size for buffer specified by rfu_initializeAPI (fast communication version that operates the library SIO interrupt routines in ROM)
#else
#define RFU_API_BUFF_SIZE_RAM 0x0e64 // Necessary size for buffer specified by rfu_initializeAPI (fast communication version that operates the library SIO interrupt routines in RAM)
#define RFU_API_BUFF_SIZE_ROM 0x0504 // Necessary size for buffer specified by rfu_initializeAPI (fast communication version that operates the library SIO interrupt routines in ROM)
#endif
#define RFU_CHILD_MAX 4 // Maximum number of slaves that can be connected to one parent device
@@ -314,10 +317,10 @@ struct STWIStatus
u8 unk_17;
void (*callbackM)();
void (*callbackS)(u16);
void (*unk_20)(void);
void (*callbackID)(void);
union RfuPacket *txPacket;
union RfuPacket *rxPacket;
vu8 unk_2c;
vu8 sending;
};
// This struct is used as u8 array in SDK.
@@ -452,54 +455,32 @@ struct RfuStatic
u8 nullFrameCount;
u8 emberCount;
u8 SCStartFlag;
u8 linkEmergencyFlag[4];
u8 lsFixedCount[4];
u16 cidBak[4];
u16 unk_1a;
u8 linkEmergencyFlag[RFU_CHILD_MAX];
u8 lsFixedCount[RFU_CHILD_MAX];
u16 cidBak[RFU_CHILD_MAX];
u16 linkEmergencyLimit;
u16 reqResult;
u16 tryPid;
u16 watchdogTimer;
u32 totalPacketSize;
};
struct RfuSIO32Id
{
u8 unk0;
u8 unk1;
u16 unk2;
u16 unk4;
u16 unk6;
u16 unk8; // unused
u16 unkA;
};
struct RfuAPIBuffer
{
struct RfuLinkStatus linkStatus;
struct RfuStatic static_;
struct RfuFixed fixed;
struct RfuSlotStatusNI NI[RFU_CHILD_MAX];
struct RfuSlotStatusUNI UNI[RFU_CHILD_MAX];
struct RfuIntrStruct intr;
};
extern struct STWIStatus *gSTWIStatus;
extern struct RfuLinkStatus *gRfuLinkStatus;
extern struct RfuStatic *gRfuStatic;
extern struct RfuFixed *gRfuFixed;
extern struct RfuSlotStatusNI *gRfuSlotStatusNI[RFU_CHILD_MAX];
extern struct RfuSlotStatusUNI *gRfuSlotStatusUNI[RFU_CHILD_MAX];
extern struct RfuSIO32Id gRfuSIO32Id;
// librfu_s32id
s32 AgbRFU_checkID(u8);
s32 AgbRFU_checkID(u8 maxTries);
// Arguments with "bm..." specify slots of the form (0x01 << slot number) that are the object of a function operation.
// librfu_rfu
// API Initialization and Initial Settings
// API Initialization
u16 rfu_initializeAPI(struct RfuAPIBuffer *APIBuffer, u16 buffByteSize, IntrFunc *sioIntrTable_p, bool8 copyInterruptToRam);
u16 rfu_initializeAPI(u32 *APIBuffer, u16 buffByteSize, IntrFunc *sioIntrTable_p, bool8 copyInterruptToRam);
// Set Timer Interrupt
void rfu_setTimerInterrupt(u8 timerNo, IntrFunc *timerIntrTable_p);
// Resident Function called from within a V-Blank Interrupt
@@ -600,7 +581,7 @@ u16 rfu_MBOOT_CHILD_inheritanceLinkStatus(void);
// For Debug
// Obtain address of the SWTI-layer receive buffer
struct RfuIntrStruct *rfu_getSTWIRecvBuffer(void);
u8 *rfu_getSTWIRecvBuffer(void);
// Obtain RFU state
void rfu_REQ_RFUStatus(void);
u16 rfu_getRFUStatus(u8 *rfuState);
@@ -626,14 +607,14 @@ void STWI_send_DataRxREQ(void);
void STWI_send_MS_ChangeREQ(void);
void STWI_send_StopModeREQ(void);
void STWI_send_SystemStatusREQ(void);
void STWI_send_GameConfigREQ(const u8 *unk1, const u8 *data);
void STWI_send_GameConfigREQ(const u8 *serial_uname, const u8 *gname);
void STWI_send_ResetREQ(void);
void STWI_send_LinkStatusREQ(void);
void STWI_send_VersionStatusREQ(void);
void STWI_send_SlotStatusREQ(void);
void STWI_send_ConfigStatusREQ(void);
void STWI_send_ResumeRetransmitAndChangeREQ(void);
void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3);
void STWI_send_SystemConfigREQ(u16 availSlotFlag, u8 maxMFrame, u8 mcTimer);
void STWI_send_SC_StartREQ(void);
void STWI_send_SC_PollingREQ(void);
void STWI_send_SC_EndREQ(void);
+11 -11
View File
@@ -246,38 +246,38 @@ void sub_800E0E8(void);
bool8 sub_800A520(void);
bool8 sub_8010500(void);
void sub_800DFB4(u8, u8);
void sub_800AB9C(void);
void sub_800B1F4(void);
void PrepareSendLinkCmd2FFE_or_RfuCmd6600(void);
void SetWirelessCommType1(void);
void sub_8009734(void);
void sub_800A620(void);
void sub_80FBB4C(void);
void LinkRfu_DestroyIdleTask(void);
u8 sub_800ABAC(void);
u8 sub_800ABBC(void);
void sub_800AAC0(void);
void Link_TryStartSend5FFF(void);
void OpenLink(void);
bool8 IsLinkMaster(void);
void CheckShouldAdvanceLinkState(void);
void sub_800AA80(u16 a0);
void Link_StartSend5FFFwithParam(u16 a0);
void sub_80098D8(void);
void CloseLink(void);
bool8 IsLinkTaskFinished(void);
bool32 sub_800B270(void);
void ResetSerial(void);
void sub_8054A28(void);
void sub_800B1F4(void);
void SetWirelessCommType1(void);
void LoadWirelessStatusIndicatorSpriteGfx(void);
void CreateWirelessStatusIndicatorSprite(u8, u8);
void sub_8009FE8(void);
void ClearLinkCallback_2(void);
void sub_80FA42C(void);
void sub_800B284(struct LinkPlayer * linkPlayer);
void LinkRfu_SetRfuFuncToSend6600(void);
void IntlConvertLinkPlayerName(struct LinkPlayer * linkPlayer);
bool8 IsWirelessAdapterConnected(void);
bool8 sub_800A474(u8 a0);
void LinkVSync(void);
bool8 HandleLinkConnection(void);
void sub_800B0B4(void);
void sub_800B110(u32 who);
void sub_800ACBC(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 unk_06);
void PrepareLocalLinkPlayerBlock(void);
void LinkPlayerFromBlock(u32 who);
void SetLinkErrorFromRfu(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 unk_06);
u8 sub_800A8D4(void);
#endif // GUARD_LINK_H
+110 -215
View File
@@ -3,169 +3,78 @@
#include "global.h"
#include "librfu.h"
#include "AgbRfu_LinkManager.h"
// RfuTgtData.gname is read as these structs.
struct GFtgtGnameSub
{
u16 unk_00_0:4;
u16 unk_00_4:1;
u16 unk_00_5:1;
u16 unk_00_6:1;
u16 isChampion:1;
u16 hasNationalDex:1;
u16 gameClear:1;
u16 unk_01_2:4;
u16 unk_01_6:2;
u8 playerTrainerId[2];
};
#define RFU_COMMAND_0x8800 0x8800
#define RFU_COMMAND_0x8900 0x8900
#define RFU_COMMAND_0xa100 0xa100
#define RFU_COMMAND_0x7700 0x7700
#define RFU_COMMAND_0x7800 0x7800
#define RFU_COMMAND_0x6600 0x6600
#define RFU_COMMAND_0x5f00 0x5f00
#define RFU_COMMAND_0x2f00 0x2f00
#define RFU_COMMAND_0xbe00 0xbe00
#define RFU_COMMAND_0xee00 0xee00
#define RFU_COMMAND_0xed00 0xed00
struct __attribute__((packed, aligned(2))) GFtgtGname
struct RfuBlockSend
{
struct GFtgtGnameSub unk_00;
u8 unk_04[4];
u16 species:10;
u16 type:6;
u8 unk_0a_0:7;
u8 unk_0a_7:1;
u8 playerGender:1;
u8 level:7;
u8 unk_0c;
};
struct Padded_U8
{
u8 value;
};
struct UnkLinkRfuStruct_02022B2C
{
u8 maxMFrame;
u8 mcTimer;
u16 availSlotFlag;
u8 mbootFlag;
u16 serialNo;
struct GFtgtGname *gname;
u8 *uname;
u8 unk_10;
u8 unk_11;
u16 unk_12;
u16 unk_14;
};
struct UnkLinkRfuStruct_02022B44
{
u8 fill_00[6];
u16 unk_06;
u8 fill_08[6];
vu8 unk_0e;
u8 unk_0f;
u8 fill_10[0x54];
u16 unk_64;
u8 fill_66[0x1d];
u8 unk_83;
u8 fill_84[0x58];
};
struct UnkRfuStruct_1
{
/* 0x000 */ u8 unk_00;
/* 0x001 */ u8 unk_01;
/* 0x002 */ vu8 unk_02;
/* 0x003 */ vu8 unk_03;
/* 0x004 */ u8 unk_04;
/* 0x005 */ u8 unk_05;
/* 0x006 */ u8 unk_06;
/* 0x007 */ u8 unk_07;
/* 0x008 */ u8 unk_08;
/* 0x009 */ u8 unk_09;
/* 0x00a */ u8 unk_0a;
/* 0x00b */ u8 unk_0b;
/* 0x00c */ u8 unk_0c;
/* 0x00d */ u8 unk_0d;
/* 0x00e */ u8 unk_0e;
/* 0x00f */ u8 unk_0f;
/* 0x010 */ u8 unk_10;
/* 0x011 */ u8 unk_11;
/* 0x012 */ u8 unk_12;
// aligned
/* 0x014 */ u16 unk_14;
/* 0x016 */ u16 unk_16;
/* 0x018 */ u16 unk_18;
/* 0x01a */ u16 unk_1a;
/* 0x01c */ u16 unk_1c;
/* 0x01e */ u16 unk_1e;
/* 0x020 */ const u16 *unk_20;
/* 0x024 */ u8 unk_24;
/* 0x026 */ u16 unk_26;
/* 0x028 */ u16 unk_28[RFU_CHILD_MAX];
/* 0x030 */ u8 unk_30;
// aligned
/* 0x032 */ u16 unk_32;
/* 0x034 */ u16 unk_34[RFU_CHILD_MAX];
/* 0x03c */ const struct UnkLinkRfuStruct_02022B2C *unk_3c;
/* 0x040 */ void (*unk_40)(u8, u8);
/* 0x044 */ void (*unk_44)(u16);
};
struct UnkRfuStruct_2_Sub_6c
{
/* 0x00 */ u16 unk_00;
/* 0x02 */ u16 unk_02;
/* 0x04 */ const u8 *unk_04;
/* 0x08 */ u32 unk_08;
/* 0x0c */ u32 unk_0c;
/* 0x10 */ u8 unk_10;
/* 0x11 */ u8 unk_11;
/* 0x12 */ u8 unk_12;
/* 0x00 */ u16 next;
/* 0x02 */ u16 count; // max 21
/* 0x04 */ const u8 *payload;
/* 0x08 */ u32 receivedFlags;
/* 0x0c */ u32 failedFlags;
/* 0x10 */ u8 sending;
/* 0x11 */ u8 owner;
/* 0x12 */ u8 receiving;
};
struct UnkRfuStruct_2_Sub_124
{
/* 0x000 */ u8 unk_00[20][70];
/* 0x578 */ vu8 unk_8c0;
/* 0x579 */ vu8 unk_8c1;
/* 0x57a */ vu8 unk_8c2;
/* 0x57b */ vu8 unk_8c3;
/* 0x000 */ u8 slots[20][70];
/* 0x578 */ vu8 recv_slot;
/* 0x579 */ vu8 send_slot;
/* 0x57a */ vu8 count;
/* 0x57b */ vu8 full;
};
struct UnkRfuStruct_2_Sub_9e8
{
/* 0x000 */ u8 unk_00[40][14];
/* 0x230 */ vu8 unk_230;
/* 0x231 */ vu8 unk_231;
/* 0x232 */ vu8 unk_232;
/* 0x233 */ vu8 unk_233;
/* 0x000 */ u8 slots[40][14];
/* 0x230 */ vu8 recv_slot;
/* 0x231 */ vu8 send_slot;
/* 0x232 */ vu8 count;
/* 0x233 */ vu8 full;
};
struct UnkRfuStruct_2_Sub_c1c
{
/* 0x00 */ u8 unk_00[2][14];
/* 0x1c */ vu8 unk_1c;
/* 0x1d */ vu8 unk_1d;
/* 0x1e */ vu8 unk_1e;
/* 0x00 */ u8 slots[2][14];
/* 0x1c */ vu8 recv_slot;
/* 0x1d */ vu8 send_slot;
/* 0x1e */ vu8 count;
};
struct UnkRfuStruct_Sub_Unused
{
/* 0x000 */ u8 unk_00[2][256];
/* 0x200 */ vu8 unk_200;
/* 0x201 */ vu8 unk_201;
/* 0x202 */ vu8 unk_202;
/* 0x203 */ vu8 unk_203;
/* 0x000 */ u8 slots[2][256];
/* 0x200 */ vu8 recv_slot;
/* 0x201 */ vu8 send_slot;
/* 0x202 */ vu8 count;
/* 0x203 */ vu8 full;
};
struct UnkRfuStruct_2
typedef struct UnkRfuStruct_2
{
/* 0x000 */ void (*RfuFunc)(void);
/* 0x004 */ u16 unk_04;
/* 0x004 */ u16 state;
/* 0x006 */ u8 filler_06[4];
/* 0x00a */ u16 unk_0a;
/* 0x00c */ u8 unk_0c; // parentChildMode?
/* 0x00a */ u16 linkman_msg;
/* 0x00c */ u8 parent_child;
/* 0x00d */ u8 playerCount;
/* 0x00e */ u8 unk_0e;
/* 0x00f */ u8 unk_0f;
/* 0x010 */ u16 unk_10;
/* 0x012 */ u16 unk_12;
/* 0x010 */ u16 linkman_param[2];
/* 0x014 */ u8 unk_14[RFU_CHILD_MAX][14];
/* 0x04c */ u8 unk_4c[14];
/* 0x05a */ u8 unk_5a;
@@ -175,30 +84,30 @@ struct UnkRfuStruct_2
/* 0x066 */ u8 unk_66;
/* 0x067 */ u8 unk_67;
/* 0x068 */ u8 filler_68[4];
/* 0x06c */ struct UnkRfuStruct_2_Sub_6c unk_6c;
/* 0x080 */ struct UnkRfuStruct_2_Sub_6c unk_80[5];
/* 0x0e4 */ u8 unk_e4[5];
/* 0x0e9 */ u8 unk_e9[5];
/* 0x0ee */ vu8 unk_ee;
/* 0x06c */ struct RfuBlockSend cmd_8800_sendbuf;
/* 0x080 */ struct RfuBlockSend cmd_8800_recvbuf[5];
/* 0x0e4 */ u8 cmd5f00Ack[5];
/* 0x0e9 */ u8 cmd_6600_recvd[5];
/* 0x0ee */ vu8 errorState;
/* 0x0ef */ u8 unk_ef;
/* 0x0f0 */ u8 unk_f0;
/* 0x0f0 */ u8 linkLossRecoveryState;
/* 0x0f1 */ u8 unk_f1;
/* 0x0f2 */ u16 unk_f2[6];
/* 0x0fe */ u16 unk_fe;
/* 0x100 */ u16 unk_100;
/* 0x0fe */ u16 cmd_6600_timer;
/* 0x100 */ u16 cmd_6600_count;
/* 0x102 */ u8 unk_102;
/* 0x104 */ struct RfuTgtData unk_104;
/* 0x124 */ struct UnkRfuStruct_2_Sub_124 unk_124;
/* 0x6a0 */ struct UnkRfuStruct_2_Sub_9e8 unk_9e8;
/* 0x8d4 */ struct UnkRfuStruct_2_Sub_c1c unk_c1c;
/* 0x8f4 */ vu8 unk_c3c;
/* 0x8f5 */ u8 unk_c3d;
/* 0x8f6 */ vu8 unk_c3e;
/* 0x8f5 */ u8 reconnectedParentIdx;
/* 0x8f6 */ vu8 child_slot;
/* 0x8f7 */ u8 unk_c3f[70];
/* 0x93d */ u8 unk_c85;
/* 0x93e */ u8 unk_c86;
/* 0x93f */ u8 unk_c87[5][7][2];
/* 0x985 */ u8 unk_ccd;
/* 0x93f */ u8 recvCmds[5][7][2];
/* 0x985 */ u8 parentId;
/* 0x986 */ u8 unk_cce; // childId
/* 0x987 */ u8 unk_ccf;
/* 0x988 */ vu8 unk_cd0;
@@ -209,43 +118,42 @@ struct UnkRfuStruct_2
/* 0x993 */ vu8 unk_cdb;
/* 0x994 */ vu8 unk_cdc;
/* 0x995 */ u8 unk_cdd;
/* 0x996 */ u8 unk_cde[RFU_CHILD_MAX];
/* 0x99a */ u8 unk_ce2;
/* 0x99b */ u8 unk_ce3;
/* 0x996 */ u8 linkPlayerIdx[RFU_CHILD_MAX];
/* 0x99a */ u8 bm_PartnerFlags;
/* 0x99b */ u8 bm_DisconnectSlot;
/* 0x99c */ u8 unk_ce4;
/* 0x99d */ u8 unk_ce5;
/* 0x99e */ u8 unk_ce6;
/* 0x99f */ u8 unk_ce7;
/* 0x99e */ u8 unionRoomChatters;
/* 0x99f */ u8 acceptSlot_flag;
/* 0x9a0 */ bool8 unk_ce8;
/* 0x9a1 */ u8 unk_ce9;
/* 0x9a2 */ u8 unk_cea[RFU_CHILD_MAX];
/* 0x9a6 */ u8 unk_cee[RFU_CHILD_MAX];
}; // size: 0x9AC
} GF_RFU_MANAGER; // size: 0x9AC
extern struct UnkRfuStruct_1 gUnknown_3005E10;
extern struct GFtgtGname gHostRFUtgtGnameBuffer;
extern u8 gHostRFUtgtUnameBuffer[];
// GameFreak signatures
void AddTextPrinterToWindow1(const u8 *str);
bool32 MG_PrintTextOnWindow1AndWaitButton(u8 * cmdPtr, const u8 * src);
void LinkRfu_FatalError(void);
void MG_DrawCheckerboardPattern(void);
void task_add_05_task_del_08FA224_when_no_RfuFunc(void);
void Rfu_BeginBuildAndSendCommand5F(void);
bool8 IsLinkRfuTaskFinished(void);
void DestroyWirelessStatusIndicatorSprite(void);
void MEvent_CreateTask_CardOrNewsWithFriend(u32 arg0);
void MEvent_CreateTask_CardOrNewsOverWireless(u32 arg0);
void MEvent_CreateTask_Leader(u32 arg0);
void sub_80F9E2C(void * data);
u8 sub_8116DE0(void);
void sub_80FBB4C(void);
void RfuPrepareSend0x2f00(void * data);
u8 CreateTask_ListenToWireless(void);
void LinkRfu_DestroyIdleTask(void);
void sub_80F86F4(void);
void sub_80FB128(bool32 a0);
u32 sub_80FD3A4(void);
bool32 IsSendingKeysToRfu(void);
void Rfu_set_zero(void);
u8 GetRfuPlayerCount(void);
void sub_80F9828(void);
void StartSendingKeysToRfu(void);
u8 LinkRfu_GetMultiplayerId(void);
bool32 Rfu_InitBlockSend(const u8 * src, size_t size);
bool8 sub_80FA0F8(u8 a0);
@@ -253,78 +161,65 @@ u8 Rfu_GetBlockReceivedStatus(void);
void Rfu_SetBlockReceivedFlag(u8 who);
void Rfu_ResetBlockReceivedFlag(u8 who);
bool8 Rfu_IsMaster(void);
void sub_80F85F8(void);
bool32 sub_80FAE94(void);
bool32 sub_80FAEF0(void);
void ResetLinkRfuGFLayer(void);
bool32 LinkRfuMain1(void);
bool32 LinkRfuMain2(void);
bool32 IsRfuRecvQueueEmpty(void);
u32 GetRfuRecvQueueLength(void);
void sub_80F8DC0(void);
void sub_80FBB20(void);
void LinkRfu_Shutdown(void);
void LinkRfu_CreateIdleTask(void);
bool8 sub_80FA484(bool32 a0);
void var_800D_set_xB(void);
struct GFtgtGname *sub_80F9800(void);
struct GFtgtGname *GetHostRFUtgtGname(void);
void UpdateWirelessStatusIndicatorSprite(void);
void InitRFU(void);
void sub_80FEB14(void);
bool32 sub_80FBA00(void);
bool32 RfuIsErrorStatus1or2(void);
void sub_80FC478(struct UnkRfuStruct_2_Sub_124 *ptr);
void sub_80FC4D4(struct UnkRfuStruct_2_Sub_9e8 *ptr);
void RFU_queue_20_70_reset(struct UnkRfuStruct_2_Sub_124 *ptr);
void RFU_queue_40_14_reset(struct UnkRfuStruct_2_Sub_9e8 *ptr);
void sub_80FD4B0(const struct UnkLinkRfuStruct_02022B2C *unk0);
u8 sub_80FD538(u8 r5, u16 r7, u16 r8, const u16 *r6);
void sub_80FD760(bool8 a0);
void sub_80FEA10(void (*func)(u16));
void sub_80FB9E4(u8 a0, u16 a1);
u8 sub_80FB9F4(void);
void LinkRfu_REQ_SendData_HandleParentRelationship(bool8 clockChangeFlag);
void sub_80FC588(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2);
void sub_80FD52C(void);
u8 sub_80FD610(u16 parentId, u16 unk_1a);
bool8 sub_80FC79C(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2);
bool8 sub_80FC888(struct UnkRfuStruct_2_Sub_c1c *q1, u8 *q2);
void sub_80FC828(struct UnkRfuStruct_2_Sub_c1c *q1, const u8 *q2);
bool8 sub_80FC6E8(struct UnkRfuStruct_2_Sub_124 * a0, u8 *a1);
void sub_80FC63C(struct UnkRfuStruct_2_Sub_9e8 * a0, u8 *a1);
u8 sub_80FEA34(u8 a0, u16 a1);
void sub_80FDA30(u32 a0);
void InitHostRFUtgtGname(struct GFtgtGname *data, u8 activity, bool32 r2, s32 r3);
void LinkRfu_syncVBlank_(void);
s32 sub_80FD430(void (*func1)(u8, u8), void (*func2)(u16));
void sub_80FEB3C(void);
void sub_80FAFE0(u8 a0);
bool32 sub_80FA44C(u32 a0);
void RfuSetErrorStatus(u8 a0, u16 msg);
u8 RfuGetErrorStatus(void);
void RFU_queue_20_70_recv(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2);
bool8 RFU_queue_40_14_send(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2);
bool8 RFU_queue_2_14_send(struct UnkRfuStruct_2_Sub_c1c *q1, u8 *q2);
void RFU_queue_2_14_recv(struct UnkRfuStruct_2_Sub_c1c *q1, const u8 *q2);
bool8 RFU_queue_20_70_send(struct UnkRfuStruct_2_Sub_124 * a0, u8 *a1);
void RFU_queue_40_14_recv(struct UnkRfuStruct_2_Sub_9e8 * a0, u8 *a1);
void InitHostRFUtgtGname(struct GFtgtGname *data, u8 activity, bool32 started, s32 child_sprite_genders);
void UpdateGameData_GroupLockedIn(bool8 started);
bool32 RfuSerialNumberIsValid(u32 a0);
bool8 sub_80FC1B0(void);
bool8 sub_80F8F40(void);
void sub_80F8F5C(void);
bool8 LmanAcceptSlotFlagIsNotZero(void);
void LinkRfu_StopManagerAndFinalizeSlots(void);
bool32 sub_80FA5D4(void);
bool32 sub_80FC1CC(void);
bool32 sub_80F8F7C(bool32 a0);
bool32 sub_80FA634(u16 a0, const u8 *a1);
void sub_80FA670(u8 a0, u16 a1, const u8 *a2);
u32 sub_80FA6FC(u16 a0, const u8 *a1);
void SetHostRFUtgtGname(u8 a0, u32 a1, u32 a2);
void sub_80FBB8C(u32 a0);
void sub_80FBD4C(const u8 *ptr, u16 a1);
bool32 WaitRfuState(bool32 a0);
bool32 TrainerIdAndNameStillInPartnersList(u16 trainerId, const u8 *trainerName);
void SendByteToPartnerByIdAndName(u8 a0, u16 a1, const u8 *a2);
u32 WaitSendByteToPartnerByIdAndName(u16 a0, const u8 *a1);
void SetHostRFUtgtGname(u8 activity, u32 child_sprite_genders, u32 a2);
void InitializeRfuLinkManager_LinkLeader(u32 availSlots);
void RequestDisconnectSlotByTrainerNameAndId(const u8 *trainerName, u16 trainerId);
void LinkRfu3_SetGnameUnameFromStaticBuffers(struct GFtgtGname *gname, u8 *uname);
void sub_80FBBD8(void);
void sub_80FA6BC(void);
void sub_80FBF54(const u8 *src, u16 trainerId);
void sub_80FB008(u8 a0, u32 a1, u32 a2);
void InitializeRfuLinkManager_JoinGroup(void);
void LinkRfuNIsend8(void);
void CreateTask_RfuReconnectWithParent(const u8 *src, u16 trainerId);
void UpdateGameDataWithActivitySpriteGendersFlag(u8 activity, u32 child_sprite_genders, u32 started);
void RecordMixTrainerNames(void);
void sub_80F8CFC();
void sub_80F8D14();
void sub_80FAF74(bool32 a0, bool32 a1);
void LinkRfu_CreateConnectionAsParent();
void LinkRfu_StopManagerBeforeEnteringChat();
void SetGnameBufferWonderFlags(bool32 hasNews, bool32 hasCard);
void ClearAndInitHostRFUtgtGname(void);
void sub_80F8FA0(void);
void sub_80FAFA0(u32 type, u32 species, u32 level);
bool32 sub_80FBB0C(void);
void sub_80FBC00(void);
void RfuUpdatePlayerGnameStateAndSend(u32 type, u32 species, u32 level);
bool32 IsUnionRoomListenTaskActive(void);
void InitializeRfuLinkManager_EnterUnionRoom(void);
void sub_80FBD6C(u32 a0);
void sub_80FC114(const u8 *name, struct GFtgtGname *structPtr, u8 a2);
bool32 PlayerHasMetTrainerBefore(u16 id, u8 *name);
bool8 sub_80FCC3C(struct GFtgtGname *gname, u8 *uname, u8 idx);
bool8 sub_80FCCF4(struct GFtgtGname *gname, u8 *uname, u8 idx);
bool8 LinkRfu_GetNameIfCompatible(struct GFtgtGname *gname, u8 *uname, u8 idx);
bool8 LinkRfu_GetNameIfSerial7F7D(struct GFtgtGname *gname, u8 *uname, u8 idx);
bool32 GetRfuUnkCE8(void);
void sub_80FA4A8(void);
void sub_80FB9D0(void);
+1 -1
View File
@@ -30,7 +30,7 @@ s8 sub_812EAE4(u16 species, u32 personality, u8 a2);
// list_menu
void sub_8107CD8(u8 palOffset, u16 speciesId);
void sub_8107CF8(u8 windowId, u16 speciesId, u32 personality, u16 x, u16 y);
void sub_8107D38(u8 palOffset, u8 palId);
void ListMenuLoadStdPalAt(u8 palOffset, u8 palId);
void BlitMoveInfoIcon(u8 windowId, u8 iconId, u16 x, u16 y);
// menu
+29 -12
View File
@@ -13,7 +13,7 @@ struct MEventClientHeaderStruct
u16 id;
u16 unk_16[4];
struct MEventBuffer_3430_Sub unk_20;
u8 unk_44;
u8 maxDistributionMons;
u8 playerName[7];
u8 playerTrainerId[4];
u16 easyChatProfile[6];
@@ -33,21 +33,38 @@ struct MEvent_Str_2
u8 fill_00[0x40];
};
struct UnkStruct_8467FB8
{
u8 textPal1:4;
u8 textPal2:4;
u8 textPal3:4;
u8 index:4;
const u8 * tiles;
const u8 * map;
const u16 * pal;
};
extern const u16 gCard1Pal[];
extern const u16 gCard2Pal[];
extern const u16 gCard3Pal[];
extern const u16 gCard4Pal[];
extern const u16 gCard5Pal[];
struct MEWonderNewsData * GetSavedWonderNews(void);
struct MEWonderCardData * GetSavedWonderCard(void);
struct MEventBuffer_3430_Sub * sav1_get_mevent_buffer_2(void);
struct MENewsJisanStruct * GetMENewsJisanStructPtr(void);
bool32 sub_8143DC8(const struct MEWonderNewsData * src);
bool32 OverwriteSavedWonderNewsWithReceivedNews(const struct MEWonderNewsData * src);
bool32 ValidateReceivedWonderNews(void);
bool32 ValidateReceivedWonderCard(void);
bool32 sub_8143EF4(const u8 * src);
bool32 sub_8143F68(const struct MEWonderCardData * data);
void sub_814410C(struct MEWonderCardData * buffer);
bool32 sub_8144254(const u16 * data);
bool32 MEvent_HaveAlreadyReceivedWonderNews(const u8 * src);
bool32 OverwriteSavedWonderCardWithReceivedCard(const struct MEWonderCardData * data);
void MEvent_WonderCardResetUnk08_6(struct MEWonderCardData * buffer);
bool32 MEvent_ReceiveDistributionMon(const u16 * data);
void BuildMEventClientHeader(struct MEventClientHeaderStruct * data);
bool32 ValidateMEventClientHeader(const struct MEventClientHeaderStruct * data);
u32 sub_8144418(const u16 * a0, const struct MEventClientHeaderStruct * a1, void * unused);
u32 sub_8144434(const u16 * a0, const struct MEventClientHeaderStruct * a1, void * unused);
u32 MEvent_CanPlayerReceiveDistributionMon(const u16 * a0, const struct MEventClientHeaderStruct * a1, void * unused);
bool32 sub_8144474(const struct MEventClientHeaderStruct * a0, const u16 * a1);
u16 sub_81444B0(const struct MEventClientHeaderStruct * a0, u32 command);
bool32 InitWonderCardResources(struct MEWonderCardData * r5, struct MEventBuffer_3430_Sub * r6);
@@ -66,12 +83,12 @@ void MENews_RemoveScrollIndicatorArrowPair(void);
bool32 WonderNews_Test_Unk_02(void);
bool32 WonderCard_Test_Unk_08_6(void);
u32 MENews_GetInput(u16 input);
void sub_8143D24(void);
u16 sub_81445C0(u32 command);
void sub_8144714(u32 a0, u32 a1);
void InitMEventData(void);
u16 MEvent_GetBattleCardCount(u32 command);
void MEvent_RecordIdOfWonderCardSenderByEventType(u32 eventId, u32 trainerId);
u16 *GetMEventProfileECWordsMaybe(void);
void sub_81446C4(void);
bool32 sub_81446D0(u16 a0);
void ResetReceivedWonderCardFlag(void);
bool32 MEventHandleReceivedWonderCard(u16 cardId);
u16 GetWonderCardFlagId(void);
#endif //GUARD_MEVENT_H
+1
View File
@@ -48,6 +48,7 @@ struct mevent_client_cmd
#define CLI_RECVBUF {.instr = 12, .parameter = 0}
#define CLI_REQWORD {.instr = 13, .parameter = 0}
#define CLI_SNDWORD {.instr = 14, .parameter = 0}
#define CLI_RECVMON {.instr = 16, .parameter = 0}
#define CLI_RECVRAM {.instr = 17, .parameter = 0}
#define CLI_SENDALL {.instr = 20, .parameter = 0}
+2 -2
View File
@@ -147,7 +147,7 @@ void Overworld_ResetStateAfterTeleport(void);
void Overworld_FadeOutMapMusic(void);
void CB2_LoadMap(void);
bool8 BGMusicStopped(void);
bool8 is_light_level_8_or_9(u8 mapType);
bool8 IsMapTypeIndoors(u8 mapType);
bool32 sub_8055C9C(void);
void Overworld_ResetStateAfterDigEscRope(void);
bool32 sub_8058244(void);
@@ -156,7 +156,7 @@ u8 GetCurrentMapType(void);
u8 get_map_light_from_warp0(void);
const struct MapHeader *warp1_get_mapheader(void);
void sub_8055F88(void);
void sub_8056788(void);
void CB2_ReturnToFieldCableClub(void);
void ResetGameStats(void);
void Overworld_CreditsMainCB(void);
+1 -1
View File
@@ -5,6 +5,6 @@
void ResetPokeJumpResults(void);
bool32 IsSpeciesAllowedInPokemonJump(u16 species);
void sub_8147AA8(u16 species, MainCallback callback);
void StartPokemonJump(u16 species, MainCallback callback);
#endif // GUARD_POKEMON_JUMP_H
+8 -9
View File
@@ -3,15 +3,14 @@
#include "union_room.h"
void sub_811C1C8(void);
void sub_811BAAC(u8 *spriteIds, s32 arg1);
void sub_811BB40(u8 *spriteIds);
void sub_811BB68(void);
void sub_811BECC(struct UnkStruct_URoom *arg0);
void sub_811BEDC(struct UnkStruct_URoom *arg0);
bool32 sub_811BF00(struct UnkStruct_Main0 *arg0, s16 *arg1, s16 *arg2, u8 *arg3);
void sub_811C028(u32 arg0, u32 arg1, struct UnkStruct_Main0 *arg2);
u8 ZeroUnionObjWork(struct UnionObj * ptr);
void sub_811BA78(void);
void DeleteUnionObjWorkAndStopTask(void);
void CreateGroupMemberObjectsInvisible(u8 *spriteIds, s32 group);
void DestroyGroupMemberObjects(u8 *spriteIds);
void MakeGroupAssemblyAreasPassable(void);
void ScheduleUnionRoomPlayerRefresh(struct UnkStruct_URoom *uroom_p);
void HandleUnionRoomPlayerRefresh(struct UnkStruct_URoom *uroom_p);
bool32 RfuUnionTool_GetGroupAndMemberInFrontOfPlayer(struct UnkStruct_Main0 *main0_p, s16 *member_p, s16 *group_p, u8 *spriteIds);
void UpdateUnionGroupMemberFacing(u32 member, u32 group, struct UnkStruct_Main0 *main0_p);
#endif //GUARD_UNION_ROOM_PLAYER_AVATAR_H
+1 -1
View File
@@ -62,7 +62,7 @@ u8 *GetRamScript(u8 objectId, u8 *script);
bool32 sub_80991F8(void);
u8 *sub_8099244(void);
void sub_80992A0(u8 *script, u16 scriptSize);
bool32 sub_8069DFC(void);
bool32 ValidateRamScript(void);
void MEventSetRamScript(u8 * script, u16 scriptSize);
u8 * sub_8069E48(void);
void sub_8069998(u8 var);
+1 -1
View File
@@ -315,6 +315,6 @@ void CopyFromSprites(u8 *dest);
u8 SpriteTileAllocBitmapOp(u16 bit, u8 op);
void ClearSpriteCopyRequests(void);
void ResetAffineAnimData(void);
void sub_8007FFC(struct Sprite* sprite, s16 a2, s16 a3);
void obj_pos2_update_enable(struct Sprite* sprite, s16 xmod, s16 ymod);
#endif //GUARD_SPRITE_H
+26
View File
@@ -1100,4 +1100,30 @@ extern const u8 gText_Symbols[];
extern const u8 gText_Register2[];
extern const u8 gText_Exit[];
// wireless_communication_status_screen
extern const u8 gUnknown_841E2B4[];
extern const u8 gUnknown_841E2BF[];
extern const u8 gUnknown_841E2C9[];
extern const u8 gUnknown_841E2D4[];
extern const u8 gText_WirelessCommunicationStatus[];
extern const u8 gText_PeopleTrading[];
extern const u8 gText_PeopleBattling[];
extern const u8 gText_PeopleInUnionRoom[];
extern const u8 gText_PeopleCommunicating[];
// mevent
extern const u8 gJPText_ReceiveMysteryGiftWithEReader[];
extern const u8 gJPText_SelectConnectFromEReaderMenu[];
extern const u8 gJPText_SelectConnectWithGBA[];
extern const u8 gJPText_LinkIsIncorrect[];
extern const u8 gJPText_CardReadingHasBeenHalted[];
extern const u8 gJPText_Connecting[];
extern const u8 gJPText_ConnectionErrorCheckLink[];
extern const u8 gJPText_ConnectionErrorTryAgain[];
extern const u8 gJPText_AllowEReaderToLoadCard[];
extern const u8 gJPText_ConnectionComplete[];
extern const u8 gJPText_NewTrainerHasComeToSevii[];
extern const u8 gJPText_PleaseWaitAMoment[];
extern const u8 gJPText_WriteErrorUnableToSaveData[];
#endif //GUARD_STRINGS_H
+45 -37
View File
@@ -4,28 +4,34 @@
#include "global.h"
#include "link_rfu.h"
struct UnkStruct_Shared
// Return value of IsRequestedTypeAndSpeciesInPlayerParty
#define UR_TRADE_MATCH 0
#define UR_TRADE_NOTYPE 1
#define UR_TRADE_NOEGG 2
#define UROOM_MAX_GROUP_COUNT 8
#define UROOM_MAX_PARTY_SIZE 5
struct UnionGnameUnamePair
{
struct GFtgtGname gname;
u8 ALIGNED(4) playerName[PLAYER_NAME_LENGTH + 1];
u8 ALIGNED(4) uname[PLAYER_NAME_LENGTH + 1];
};
struct UnkStruct_x1C
{
struct UnkStruct_Shared unk0;
u8 unk18:1;
struct UnionGnameUnamePair gname_uname;
u8 active:1;
};
struct UnkStruct_x20
{
struct UnkStruct_Shared unk;
struct UnionGnameUnamePair gname_uname;
u16 field_18;
u8 field_1A_0:2;
u8 field_1A_1:1;
u8 groupScheduledAnim:2;
bool8 field_1A_1:1;
u8 field_1B;
u8 field_1D;
u8 field_1E;
u8 field_1F;
u32 field_1C; // unused
};
// These arrays are dynamically allocated but must be
@@ -51,17 +57,17 @@ struct UnkStruct_Leader
struct UnkStruct_Main0 * field_8;
u8 state;
u8 textState;
u8 field_E;
u8 delayTimerAfterOk;
u8 listWindowId;
u8 field_10;
u8 field_11;
u8 bButtonCancelWindowId;
u8 nPlayerModeWindowId;
u8 listTaskId;
u8 field_13;
u8 field_14;
u8 playerCount;
u8 messageWindowId;
u8 field_15;
u8 field_16;
u8 field_17;
u8 field_18;
u8 listenTaskId;
u8 activity;
u8 field_19;
u16 field_1A;
};
@@ -72,18 +78,18 @@ struct UnkStruct_Group
struct UnkStruct_Main4 * field_4;
u8 state;
u8 textState;
u8 field_A;
u8 field_A; // unused
u8 listWindowId;
u8 field_C;
u8 field_D;
u8 bButtonCancelWindowId;
u8 playerNameAndIdWindowId;
u8 listTaskId;
u8 field_F;
u8 leaderId;
u8 field_10;
u8 field_11;
u8 field_12;
u8 field_13;
u8 field_14;
u8 field_15;
u8 listenTaskId;
u8 cardOrNews;
u8 field_13; // referenced but never set
u8 refreshTimer;
u8 delayBeforePrint;
};
struct UnionObj
@@ -109,19 +115,21 @@ struct UnkStruct_URoom
/* 0x018 */ u8 field_18;
/* 0x019 */ u8 field_19;
/* 0x01A */ u8 field_1A;
/* 0x01B */ u8 field_1B;
/* 0x01C */ u8 field_1C;
/* 0x01D */ u8 field_1D;
/* 0x01E */ u8 field_1E;
/* 0x01B */ u8 topListMenuWindowId;
/* 0x01C */ u8 topListMenuListMenuId;
/* 0x01D */ u8 tradeBoardSelectWindowId;
/* 0x01E */ u8 tradeBoardDetailsWindowId;
/* 0x01F */ u8 field_1F;
/* 0x020 */ u8 field_20;
/* 0x021 */ u8 spriteIds[40];
/* 0x049 */ u8 field_49;
/* 0x04A */ u8 field_4A;
/* 0x04C */ u16 field_4C[6];
/* 0x058 */ u8 field_58[4][11];
/* 0x084 */ u16 field_98;
/* 0x086 */ u16 field_9A[3];
/* 0x04A */ u8 tradeBoardListMenuId;
// For communication with potential link partners
/* 0x04C */ u16 playerSendBuffer[6];
/* 0x058 */ u8 activityRequestStrbufs[4][11];
/* 0x084 */ u16 partnerYesNoResponse;
/* 0x086 */ u16 recvActivityRequest[3]; // activity[, species, level]
/* 0x08C */ struct UnionObj unionObjs[8];
/* 0x0AC */ u8 trainerCardStrbufs[12][15];
/* 0x160 */ u8 field_174[48];
@@ -150,10 +158,10 @@ struct UnionRoomTrade
u32 personality;
};
extern struct GFtgtGnameSub gUnknown_203B064;
extern struct GFtgtGnameSub gPartnerTgtGnameSub;
extern u16 gUnionRoomOfferedSpecies;
extern u8 gUnionRoomRequestedMonType;
void sub_81173C0(u16 battleFlags);
void StartUnionRoomBattle(u16 battleFlags);
#endif //GUARD_UNION_ROOM_H
+6
View File
@@ -0,0 +1,6 @@
#ifndef GUARD_UNION_ROOM_BATTLE_H
#define GUARD_UNION_ROOM_BATTLE_H
void CB2_UnionRoomBattle(void);
#endif //GUARD_UNION_ROOM_BATTLE_H
+20 -20
View File
@@ -3,7 +3,7 @@
#include "global.h"
extern const u8 gUnknown_84571AC[];
extern const u8 gUnionRoomActivity_Blank[];
extern const u8 gUnknown_84571B0[];
extern const u8 gUnknown_84571B4[];
extern const u8 gUnknown_84571B8[];
@@ -31,8 +31,8 @@ extern const u8 gUnknown_84577BC[];
extern const u8 gUnknown_84577F8[];
extern const u8 *const gUnknown_8457838[];
extern const u8 gUnknown_84578BC[];
extern const u8 *const gUnknown_8457A34[];
extern const u8 *const gUnknown_8457B04[][2];
extern const u8 *const gURText_PleaseWaitMsgs[];
extern const u8 *const gURText_FriendPromptsForActivity[][2];
extern const u8 *const gUnknown_8457BCC[];
extern const u8 *const gUnknown_8457C20[];
extern const u8 gUnknown_8457C48[];
@@ -46,7 +46,7 @@ extern const u8 gUnknown_8457E44[];
extern const u8 gUnknown_8457E60[];
extern const u8 *const gUnknown_8457F80[][2];
extern const u8 gUnknown_8457F90[];
extern const u8 *const gUnknown_84580F4[][4];
extern const u8 *const gResponseToURoomActivityInviteStringPtrs[][4];
extern const u8 *const gUnknown_8458230[][2][3];
extern const u8 *const gUnknown_8458314[];
extern const u8 *const gUnknown_84583B4[];
@@ -63,7 +63,7 @@ extern const u8 *const gUnknown_8458A78[2][4];
extern const u8 gUnknown_8458A98[];
extern const u8 gUnknown_8458AB8[];
extern const u8 gUnknown_8458B44[];
extern const u8 gUnknown_8458CD4[];
extern const u8 gURText_PleaseChooseTypeOfMon[];
extern const u8 gUnknown_8458D1C[];
extern const u8 gUnknown_8458D54[];
extern const u8 gUnknown_8458D78[];
@@ -75,7 +75,7 @@ extern const u8 gUnknown_8458E70[];
extern const u8 gUnknown_8458ED0[];
extern const u8 gUnknown_8458F04[];
extern const u8 gUnknown_8458F9C[];
extern const u8 gUnknown_8458FBC[];
extern const u8 gText_EggTrade[];
extern const u8 gUnknown_8458FC8[];
extern const u8 gUnknown_8458FE4[];
extern const u8 gUnknown_84591DC[];
@@ -91,20 +91,20 @@ extern const u8 gUnknown_8459360[];
extern const u8 gUnknown_8459368[];
extern const u8 gUnknown_8459370[];
extern const u8 gUnknown_8459378[];
extern const u8 gUnknown_8459394[];
extern const u8 gUnknown_84593A4[];
extern const u8 gUnknown_84593B4[];
extern const u8 gUnknown_84593C4[];
extern const u8 gUnknown_84593D4[];
extern const u8 gUnknown_84593E4[];
extern const u8 gUnknown_84593F4[];
extern const u8 gUnknown_84593DC[];
extern const u8 gUnknown_8459400[];
extern const u8 gUnknown_8459410[];
extern const u8 gUnknown_845941C[];
extern const u8 gUnknown_845942C[];
extern const u8 gUnknown_8459434[];
extern const u8 gUnknown_8459440[];
extern const u8 gUnionRoomActivity_SingleBattle[];
extern const u8 gUnionRoomActivity_DoubleBattle[];
extern const u8 gUnionRoomActivity_MultiBattle[];
extern const u8 gUnionRoomActivity_PokemonTrades[];
extern const u8 gUnionRoomActivity_Chat[];
extern const u8 gUnionRoomActivity_WonderCards[];
extern const u8 gunionRoomActivity_WonderNews[];
extern const u8 gUnionRoomActivity_Cards[];
extern const u8 gUnionRoomActivity_PokemonJump[];
extern const u8 gUnionRoomActivity_BerryCrush[];
extern const u8 gUnionRoomActivity_BerryPicking[];
extern const u8 gUnionRoomActivity_Search[];
extern const u8 gUnionRoomActivity_SpinTradeJP[];
extern const u8 gUnionRoomActivity_ItemTradeJP[];
extern const u8 *const gUnknown_84594B0[];
extern const u8 gUnknown_84594C4[];
extern const u8 gUnknown_8459504[];
-26
View File
@@ -1,26 +0,0 @@
#ifndef GUARD_UNK_810C3A4_H
#define GUARD_UNK_810C3A4_H
#define GET_VS_SEEKER_COUNTER_0() (gSaveBlock1Ptr->trainerRematch.stepCounter & 0xFF)
#define GET_VS_SEEKER_COUNTER_1() (gSaveBlock1Ptr->trainerRematch.stepCounter >> 8)
#define SET_VS_SEEKER_COUNTER_0(x) ({\
gSaveBlock1Ptr->trainerRematch.stepCounter &= 0xFF00;\
gSaveBlock1Ptr->trainerRematch.stepCounter |= (x);\
})
#define SET_VS_SEEKER_COUNTER_1(x) ({\
gSaveBlock1Ptr->trainerRematch.stepCounter &= 0x00FF;\
gSaveBlock1Ptr->trainerRematch.stepCounter |= ((x) << 8);\
})
#define INC_VS_SEEKER_COUNTER_0() ({\
u8 x = GET_VS_SEEKER_COUNTER_0();\
if (x < 100) gSaveBlock1Ptr->trainerRematch.stepCounter++;\
})
#define INC_VS_SEEKER_COUNTER_1() ({\
u8 x = GET_VS_SEEKER_COUNTER_1();\
if (x < 100) {x++; SET_VS_SEEKER_COUNTER_1(x);}\
})
void sub_810C604(void);
void sub_810C640(void);
#endif //GUARD_UNK_810C3A4_H
-24
View File
@@ -1,24 +0,0 @@
#ifndef GUARD_UNK_815C980_H
#define GUARD_UNK_815C980_H
struct UnkStruct3
{
u8 field_0_0:2;
u8 shape:2;
u8 size:2;
u8 priority:2;
u8 field_1;
u8 xDelta;
s16 x;
s16 y;
const struct SpriteSheet *spriteSheet;
const struct SpritePalette *spritePal;
};
void sub_815C9F4(void);
void sub_815D108(u32 id);
void sub_815D1A8(u32 id, bool32 arg1);
bool32 sub_815CA40(u32 id, s32 arg1, const struct UnkStruct3 *arg2);
void sub_815CD70(u32 id, s32 arg1);
#endif //GUARD_UNK_815C980_H
-11
View File
@@ -1,11 +0,0 @@
#ifndef GUARD_UNK_815C27C_H
#define GUARD_UNK_815C27C_H
void EReaderHelper_SerialCallback(void);
void EReaderHelper_Timer3Callback(void);
void EReaderHelper_SaveRegsState(void);
void EReaderHelper_ClearsSendRecvMgr(void);
void EReaderHelper_RestoreRegsState(void);
u16 EReaderHandleTransfer(u8, size_t, const void *, void *);
#endif //GUARD_UNK_815C27C_H
+3
View File
@@ -3,6 +3,9 @@
#include "global.h"
void sub_810C604(void);
void sub_810C640(void);
void Task_VsSeeker_0(u8 taskId);
void sub_810CB90(void);
void sub_810CDE8(void);
+10 -8
View File
@@ -226,7 +226,7 @@ SECTIONS {
src/map_preview_screen.o(.text);
src/link_rfu_2.o(.text);
src/link_rfu_3.o(.text);
src/link_rfu.o(.text);
src/AgbRfu_LinkManager.o(.text);
asm/easy_chat_2.o(.text);
src/pokedex_screen.o(.text);
asm/pokedex_screen.o(.text);
@@ -270,7 +270,8 @@ SECTIONS {
src/mevent_server_helpers.o(.text);
src/mevent_client.o(.text);
src/mevent_server.o(.text);
src/mevent_8145654.o(.text);
src/mevent_show_card.o(.text);
src/mevent_show_news.o(.text);
src/menews_jisan.o(.text);
src/seagallop.o(.text);
asm/pokemon_jump.o(.text);
@@ -289,13 +290,13 @@ SECTIONS {
asm/dodrio_berry_picking_2.o(.text);
src/teachy_tv.o(.text);
src/ereader_helpers.o(.text);
src/unk_815C980.o(.text);
src/digit_obj_util.o(.text);
src/ss_anne.o(.text);
src/cereader_tool.o(.text);
src/renewable_hidden_items.o(.text);
src/trainer_tower.o(.text);
src/berry_powder.o(.text);
src/unk_815F138.o(.text);
src/minigame_countdown.o(.text);
src/berry_fix_program.o(.text);
} =0
@@ -322,7 +323,7 @@ SECTIONS {
src/agb_flash_mx.o(.text);
src/agb_flash_le.o(.text);
src/librfu_stwi.o(.text);
asm/librfu_intr.o(.text);
src/librfu_intr.o(.text);
src/librfu_rfu.o(.text);
src/librfu_sio32id.o(.text);
src/isagbprn.o(.text);
@@ -558,7 +559,8 @@ SECTIONS {
src/mevent_server_helpers.o(.rodata);
src/mevent_client.o(.rodata);
src/mevent_server.o(.rodata);
src/mevent_8145654.o(.rodata);
src/mevent_show_card.o(.rodata);
src/mevent_show_news.o(.rodata);
src/mevent_scripts.o(.rodata);
src/menews_jisan.o(.rodata);
src/menews_jisan.o(.rodata.str1.4);
@@ -573,13 +575,13 @@ SECTIONS {
src/dodrio_berry_picking.o(.rodata);
src/battle_controller_pokedude.o(.rodata);
src/teachy_tv.o(.rodata);
src/unk_815C980.o(.rodata);
src/digit_obj_util.o(.rodata);
data/data_8479668.o(.rodata);
src/ss_anne.o(.rodata);
src/cereader_tool.o(.rodata);
src/renewable_hidden_items.o(.rodata);
src/trainer_tower.o(.rodata);
src/unk_815F138.o(.rodata);
src/minigame_countdown.o(.rodata);
src/berry_fix_program.o(.rodata);
data/data_8479668.o(.rodata.after_trainer_tower);
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -831,9 +831,9 @@ void sub_802F6A8(void)
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
if (gWirelessCommType == 0)
sub_800AAC0();
Link_TryStartSend5FFF();
else
sub_800AB9C();
PrepareSendLinkCmd2FFE_or_RfuCmd6600();
gBattlerControllerFuncs[gActiveBattler] = sub_802F610;
}
else
+2 -2
View File
@@ -35,7 +35,7 @@ void HandleLinkBattleSetup(void)
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
if (gWirelessCommType)
sub_800B1F4();
SetWirelessCommType1();
if (!gReceivedRemoteLinkPlayers)
OpenLink();
CreateTask(sub_8081A90, 0);
@@ -491,7 +491,7 @@ void sub_800DD28(void)
if (gReceivedRemoteLinkPlayers && (gBattleTypeFlags & BATTLE_TYPE_20) && (gLinkPlayers[0].linkType == 0x2211))
{
sub_80FBB4C();
LinkRfu_DestroyIdleTask();
for (i = 0; i < GetLinkPlayerCount(); ++i)
{
if (GetBlockReceivedStatus() & gBitTable[i])
+2 -2
View File
@@ -1152,9 +1152,9 @@ static void CB2_PreInitMultiBattle(void)
{
++gBattleCommunication[MULTIUSE_STATE];
if (gWirelessCommType)
sub_800AB9C();
PrepareSendLinkCmd2FFE_or_RfuCmd6600();
else
sub_800AAC0();
Link_TryStartSend5FFF();
}
break;
case 3:
+449
View File
@@ -0,0 +1,449 @@
#include "global.h"
#include "malloc.h"
#include "decompress.h"
#include "digit_obj_util.h"
#include "main.h"
#include "battle.h"
struct DigitPrinterAlloc
{
u32 count;
struct DigitPrinter
{
bool8 isActive;
u8 firstOamId;
u8 strConvMode;
u8 oamCount;
u8 palTagIndex;
u8 size;
u8 shape;
u8 priority;
u8 xDelta;
u8 tilesPerImage;
u16 tileStart;
s16 x;
s16 y;
u16 tileTag;
u16 palTag;
u32 pow10;
s32 lastPrinted;
} *array;
};
// this file's functions
static u8 GetFirstOamId(u8 oamCount);
static void CopyWorkToOam(struct DigitPrinter *objWork);
static void DrawNumObjsLeadingZeros(struct DigitPrinter *objWork, s32 num, bool32 sign);
static void DrawNumObjsMinusInFront(struct DigitPrinter *objWork, s32 num, bool32 sign);
static void DrawNumObjsMinusInBack(struct DigitPrinter *objWork, s32 num, bool32 sign);
static bool32 SharesTileWithAnyActive(u32 id);
static bool32 SharesPalWithAnyActive(u32 id);
static u8 GetTilesPerImage(u32 shape, u32 size);
// ewram
static EWRAM_DATA struct DigitPrinterAlloc *sOamWork = {0};
// const rom data
static const u8 sTilesPerImage[4][4] =
{
[ST_OAM_SQUARE] = {
[ST_OAM_SIZE_0] = 0x01, // SPRITE_SIZE_8x8
[ST_OAM_SIZE_1] = 0x04, // SPRITE_SIZE_16x16
[ST_OAM_SIZE_2] = 0x10, // SPRITE_SIZE_32x32
[ST_OAM_SIZE_3] = 0x40 // SPRITE_SIZE_64x64
},
[ST_OAM_H_RECTANGLE] = {
[ST_OAM_SIZE_0] = 0x02, // SPRITE_SIZE_16x8
[ST_OAM_SIZE_1] = 0x04, // SPRITE_SIZE_32x8
[ST_OAM_SIZE_2] = 0x08, // SPRITE_SIZE_32x16
[ST_OAM_SIZE_3] = 0x20 // SPRITE_SIZE_64x32
},
[ST_OAM_V_RECTANGLE] = {
[ST_OAM_SIZE_0] = 0x02, // SPRITE_SIZE_8x16
[ST_OAM_SIZE_1] = 0x04, // SPRITE_SIZE_8x32
[ST_OAM_SIZE_2] = 0x08, // SPRITE_SIZE_16x32
[ST_OAM_SIZE_3] = 0x20 // SPRITE_SIZE_32x64
}
};
// code
bool32 DigitObjUtil_Init(u32 count)
{
u32 i;
if (sOamWork != NULL)
DigitObjUtil_Teardown();
sOamWork = Alloc(sizeof(*sOamWork));
if (sOamWork == NULL)
return FALSE;
sOamWork->array = Alloc(sizeof(struct DigitPrinter) * count);
if (sOamWork->array == NULL)
{
Free(sOamWork);
return FALSE;
}
sOamWork->count = count;
for (i = 0; i < count; i++)
{
sOamWork->array[i].isActive = FALSE;
sOamWork->array[i].firstOamId = 0xFF;
}
return TRUE;
}
void DigitObjUtil_Teardown(void)
{
if (sOamWork != NULL)
{
if (sOamWork->array != NULL)
{
u32 i;
for (i = 0; i < sOamWork->count; i++)
DigitObjUtil_DeletePrinter(i);
Free(sOamWork->array);
}
FREE_AND_SET_NULL(sOamWork);
}
}
bool32 DigitObjUtil_CreatePrinter(u32 id, s32 num, const struct DigitObjUtilTemplate *template)
{
u32 i;
if (sOamWork == NULL)
return FALSE;
if (sOamWork->array[id].isActive)
return FALSE;
sOamWork->array[id].firstOamId = GetFirstOamId(template->oamCount);
if (sOamWork->array[id].firstOamId == 0xFF)
return FALSE;
sOamWork->array[id].tileStart = GetSpriteTileStartByTag(template->spriteSheet->tag);
if (sOamWork->array[id].tileStart == 0xFFFF)
{
if (template->spriteSheet->size != 0)
{
sOamWork->array[id].tileStart = LoadSpriteSheet(template->spriteSheet);
}
else
{
struct CompressedSpriteSheet compObjectPic;
compObjectPic = *(struct CompressedSpriteSheet*)(template->spriteSheet);
compObjectPic.size = GetDecompressedDataSize(template->spriteSheet->data);
sOamWork->array[id].tileStart = LoadCompressedSpriteSheet(&compObjectPic);
}
if (sOamWork->array[id].tileStart == 0xFFFF)
return FALSE;
}
sOamWork->array[id].palTagIndex = IndexOfSpritePaletteTag(template->spritePal->tag);
if (sOamWork->array[id].palTagIndex == 0xFF)
sOamWork->array[id].palTagIndex = LoadSpritePalette(template->spritePal);
sOamWork->array[id].strConvMode = template->strConvMode;
sOamWork->array[id].oamCount = template->oamCount;
sOamWork->array[id].x = template->x;
sOamWork->array[id].y = template->y;
sOamWork->array[id].shape = template->shape;
sOamWork->array[id].size = template->size;
sOamWork->array[id].priority = template->priority;
sOamWork->array[id].xDelta = template->xDelta;
sOamWork->array[id].tilesPerImage = GetTilesPerImage(template->shape, template->size);
sOamWork->array[id].tileTag = template->spriteSheet->tag;
sOamWork->array[id].palTag = template->spritePal->tag;
sOamWork->array[id].isActive = TRUE;
// Decimal left shift
sOamWork->array[id].pow10 = 1;
for (i = 1; i < template->oamCount; i++)
sOamWork->array[id].pow10 *= 10;
CopyWorkToOam(&sOamWork->array[id]);
DigitObjUtil_PrintNumOn(id, num);
return TRUE;
}
static void CopyWorkToOam(struct DigitPrinter *objWork)
{
u32 i;
u32 oamId = objWork->firstOamId;
u32 x = objWork->x;
u32 oamCount = objWork->oamCount + 1;
CpuFill16(0, &gMain.oamBuffer[oamId], sizeof(struct OamData) * oamCount);
for (i = 0, oamId = objWork->firstOamId; i < oamCount; i++, oamId++)
{
gMain.oamBuffer[oamId].y = objWork->y;
gMain.oamBuffer[oamId].x = x;
gMain.oamBuffer[oamId].shape = objWork->shape;
gMain.oamBuffer[oamId].size = objWork->size;
gMain.oamBuffer[oamId].tileNum = objWork->tileStart;
gMain.oamBuffer[oamId].priority = objWork->priority;
gMain.oamBuffer[oamId].paletteNum = objWork->palTagIndex;
x += objWork->xDelta;
}
oamId--;
gMain.oamBuffer[oamId].x = objWork->x - objWork->xDelta;
gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;
gMain.oamBuffer[oamId].tileNum = objWork->tileStart + (objWork->tilesPerImage * 10);
}
void DigitObjUtil_PrintNumOn(u32 id, s32 num)
{
bool32 sign;
if (sOamWork == NULL)
return;
if (!sOamWork->array[id].isActive)
return;
sOamWork->array[id].lastPrinted = num;
if (num < 0)
{
sign = TRUE;
num *= -1;
}
else
{
sign = FALSE;
}
switch (sOamWork->array[id].strConvMode)
{
case 0:
default:
DrawNumObjsLeadingZeros(&sOamWork->array[id], num, sign);
break;
case 1:
DrawNumObjsMinusInFront(&sOamWork->array[id], num, sign);
break;
case 2:
DrawNumObjsMinusInBack(&sOamWork->array[id], num, sign);
break;
}
}
static void DrawNumObjsLeadingZeros(struct DigitPrinter *objWork, s32 num, bool32 sign)
{
u32 pow10 = objWork->pow10;
u32 oamId = objWork->firstOamId;
while (pow10 != 0)
{
u32 digit = num / pow10;
num -= (digit * pow10);
pow10 /= 10;
gMain.oamBuffer[oamId].tileNum = (digit * objWork->tilesPerImage) + objWork->tileStart;
oamId++;
}
if (sign)
gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF;
else
gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;
}
static void DrawNumObjsMinusInFront(struct DigitPrinter *objWork, s32 num, bool32 sign)
{
u32 pow10 = objWork->pow10;
static int oamId;
static int curDigit;
static int firstDigit;
oamId = objWork->firstOamId;
curDigit = 0;
firstDigit = -1;
while (pow10 != 0)
{
u32 digit = num / pow10;
num -= (digit * pow10);
pow10 /= 10;
if (digit != 0 || firstDigit != -1 || pow10 == 0)
{
gMain.oamBuffer[oamId].tileNum = (digit * objWork->tilesPerImage) + objWork->tileStart;
gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF;
if (firstDigit == -1)
firstDigit = curDigit;
}
else
{
gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;
}
oamId++;
curDigit++;
}
if (sign)
{
gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF;
gMain.oamBuffer[oamId].x = objWork->x + ((firstDigit - 1) * objWork->xDelta);
}
else
{
gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;
}
}
static void DrawNumObjsMinusInBack(struct DigitPrinter *objWork, s32 num, bool32 sign)
{
u32 pow10 = objWork->pow10;
u32 oamId = objWork->firstOamId;
u32 printingDigits = 0;
s32 nsprites = 0;
while (pow10 != 0)
{
u32 digit = num / pow10;
num -= (digit * pow10);
pow10 /= 10;
if (digit != 0 || printingDigits != 0 || pow10 == 0)
{
printingDigits = 1;
gMain.oamBuffer[oamId].tileNum = (digit * objWork->tilesPerImage) + objWork->tileStart;
gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF;
oamId++;
nsprites++;
}
}
while (nsprites < objWork->oamCount)
{
gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;
oamId++;
nsprites++;
}
if (sign)
gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF;
else
gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;
}
void DigitObjUtil_DeletePrinter(u32 id)
{
s32 oamId, oamCount, i;
if (sOamWork == NULL)
return;
if (!sOamWork->array[id].isActive)
return;
oamCount = sOamWork->array[id].oamCount + 1;
oamId = sOamWork->array[id].firstOamId;
for (i = 0; i < oamCount; i++, oamId++)
gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;
if (!SharesTileWithAnyActive(id))
FreeSpriteTilesByTag(sOamWork->array[id].tileTag);
if (!SharesPalWithAnyActive(id))
FreeSpritePaletteByTag(sOamWork->array[id].palTag);
sOamWork->array[id].isActive = FALSE;
}
void DigitObjUtil_HideOrShow(u32 id, bool32 hide)
{
s32 oamId, oamCount, i;
if (sOamWork == NULL)
return;
if (!sOamWork->array[id].isActive)
return;
oamCount = sOamWork->array[id].oamCount + 1;
oamId = sOamWork->array[id].firstOamId;
if (hide)
{
for (i = 0; i < oamCount; i++, oamId++)
gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_ERASE;
}
else
{
for (i = 0; i < oamCount; i++, oamId++)
gMain.oamBuffer[oamId].affineMode = ST_OAM_AFFINE_OFF;
DigitObjUtil_PrintNumOn(id, sOamWork->array[id].lastPrinted);
}
}
static u8 GetFirstOamId(u8 oamCount)
{
u32 i;
u16 firstOamId = 64;
for (i = 0; i < sOamWork->count; i++)
{
if (!sOamWork->array[i].isActive)
{
if (sOamWork->array[i].firstOamId != 0xFF && sOamWork->array[i].oamCount <= oamCount)
return sOamWork->array[i].firstOamId;
}
else
{
firstOamId += 1 + sOamWork->array[i].oamCount;
}
}
if (firstOamId + oamCount + 1 > 128)
return 0xFF;
else
return firstOamId;
}
static bool32 SharesTileWithAnyActive(u32 id)
{
u32 i;
for (i = 0; i < sOamWork->count; i++)
{
if (sOamWork->array[i].isActive && i != id
&& sOamWork->array[i].tileTag == sOamWork->array[id].tileTag)
{
return TRUE;
}
}
return FALSE;
}
static bool32 SharesPalWithAnyActive(u32 id)
{
u32 i;
for (i = 0; i < sOamWork->count; i++)
{
if (sOamWork->array[i].isActive && i != id
&& sOamWork->array[i].palTag == sOamWork->array[id].palTag)
{
return TRUE;
}
}
return FALSE;
}
static u8 GetTilesPerImage(u32 shape, u32 size)
{
return sTilesPerImage[shape][size];
}
+1 -1
View File
@@ -7,7 +7,7 @@ void sub_815A5BC(s32 a0)
struct Padded_U8 data[2];
data[0].value = 1;
data[1].value = a0;
sub_80F9E2C(data);
RfuPrepareSend0x2f00(data);
}
u8 sub_815A5E8(s32 a0)
+79 -6
View File
@@ -2,16 +2,89 @@
#include "text.h"
#include "dynamic_placeholder_text_util.h"
#include "string_util.h"
#include "constants/object_events.h"
static EWRAM_DATA const u8 *sStringPointers[8] = {0};
static const u8 sTextColorTable[] =
{
0, 0, 0, 16, 17, 17, 17, 16, 16, 0, 0, 17, 1, 0, 17, 16,
0, 16, 16, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0,
17, 1, 0, 0, 0, 16, 17, 0, 16, 16, 16, 0, 1, 0, 51, 51,
51, 51, 51, 51, 51, 51, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34,
34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 50,
// [LOW_NYBBLE / 2] = 0xXY, // HIGH_NYBBLE
[OBJECT_EVENT_GFX_RED_NORMAL / 2] = 0x00, // OBJECT_EVENT_GFX_RED_BIKE
[OBJECT_EVENT_GFX_RED_RUN / 2] = 0x00, // OBJECT_EVENT_GFX_RED_ITEM
[OBJECT_EVENT_GFX_RED_FISH / 2] = 0x00, // OBJECT_EVENT_GFX_RED_ITEM_COPY
[OBJECT_EVENT_GFX_RED_VS_SEEKER / 2] = 0x10, // OBJECT_EVENT_GFX_GREEN_NORMAL
[OBJECT_EVENT_GFX_GREEN_BIKE / 2] = 0x11, // OBJECT_EVENT_GFX_GREEN_RUN
[OBJECT_EVENT_GFX_GREEN_ITEM / 2] = 0x11, // OBJECT_EVENT_GFX_GREEN_FISH
[OBJECT_EVENT_GFX_GREEN_ITEM_COPY / 2] = 0x11, // OBJECT_EVENT_GFX_GREEN_VS_SEEKER
[OBJECT_EVENT_GFX_RS_BRENDAN / 2] = 0x10, // OBJECT_EVENT_GFX_RS_MAY
[OBJECT_EVENT_GFX_LITTLE_BOY / 2] = 0x10, // OBJECT_EVENT_GFX_LITTLE_GIRL
[OBJECT_EVENT_GFX_YOUNGSTER / 2] = 0x00, // OBJECT_EVENT_GFX_BOY
[OBJECT_EVENT_GFX_BUG_CATCHER / 2] = 0x00, // OBJECT_EVENT_GFX_SITTING_BOY
[OBJECT_EVENT_GFX_LASS / 2] = 0x11, // OBJECT_EVENT_GFX_WOMAN_1
[OBJECT_EVENT_GFX_BATTLE_GIRL / 2] = 0x01, // OBJECT_EVENT_GFX_MAN
[OBJECT_EVENT_GFX_ROCKER / 2] = 0x00, // OBJECT_EVENT_GFX_FAT_MAN
[OBJECT_EVENT_GFX_WOMAN_2 / 2] = 0x11, // OBJECT_EVENT_GFX_BEAUTY
[OBJECT_EVENT_GFX_BALDING_MAN / 2] = 0x10, // OBJECT_EVENT_GFX_WOMAN_3
[OBJECT_EVENT_GFX_OLD_MAN_1 / 2] = 0x00, // OBJECT_EVENT_GFX_OLD_MAN_2
[OBJECT_EVENT_GFX_OLD_MAN_LYING_DOWN / 2] = 0x10, // OBJECT_EVENT_GFX_OLD_WOMAN
[OBJECT_EVENT_GFX_TUBER_M_1 / 2] = 0x10, // OBJECT_EVENT_GFX_TUBER_F
[OBJECT_EVENT_GFX_TUBER_M_2 / 2] = 0x00, // OBJECT_EVENT_GFX_CAMPER
[OBJECT_EVENT_GFX_PICNICKER / 2] = 0x01, // OBJECT_EVENT_GFX_COOLTRAINER_M
[OBJECT_EVENT_GFX_COOLTRAINER_F / 2] = 0x01, // OBJECT_EVENT_GFX_SWIMMER_M_WATER
[OBJECT_EVENT_GFX_SWIMMER_F_WATER / 2] = 0x01, // OBJECT_EVENT_GFX_SWIMMER_M_LAND
[OBJECT_EVENT_GFX_SWIMMER_F_LAND / 2] = 0x01, // OBJECT_EVENT_GFX_WORKER_M
[OBJECT_EVENT_GFX_WORKER_F / 2] = 0x01, // OBJECT_EVENT_GFX_ROCKET_M
[OBJECT_EVENT_GFX_ROCKET_F / 2] = 0x01, // OBJECT_EVENT_GFX_GBA_KID
[OBJECT_EVENT_GFX_SUPER_NERD / 2] = 0x00, // OBJECT_EVENT_GFX_BIKER
[OBJECT_EVENT_GFX_BLACKBELT / 2] = 0x00, // OBJECT_EVENT_GFX_SCIENTIST
[OBJECT_EVENT_GFX_HIKER / 2] = 0x00, // OBJECT_EVENT_GFX_FISHER
[OBJECT_EVENT_GFX_CHANNELER / 2] = 0x01, // OBJECT_EVENT_GFX_CHEF
[OBJECT_EVENT_GFX_POLICEMAN / 2] = 0x00, // OBJECT_EVENT_GFX_GENTLEMAN
[OBJECT_EVENT_GFX_SAILOR / 2] = 0x00, // OBJECT_EVENT_GFX_CAPTAIN
[OBJECT_EVENT_GFX_NURSE / 2] = 0x11, // OBJECT_EVENT_GFX_CABLE_CLUB_RECEPTIONIST
[OBJECT_EVENT_GFX_UNION_ROOM_RECEPTIONIST / 2] = 0x01, // OBJECT_EVENT_GFX_UNUSED_MALE_RECEPTIONIST
[OBJECT_EVENT_GFX_CLERK / 2] = 0x00, // OBJECT_EVENT_GFX_MG_DELIVERYMAN
[OBJECT_EVENT_GFX_TRAINER_TOWER_DUDE / 2] = 0x00, // OBJECT_EVENT_GFX_PROF_OAK
[OBJECT_EVENT_GFX_BLUE / 2] = 0x00, // OBJECT_EVENT_GFX_BILL
[OBJECT_EVENT_GFX_LANCE / 2] = 0x10, // OBJECT_EVENT_GFX_AGATHA
[OBJECT_EVENT_GFX_DAISY / 2] = 0x11, // OBJECT_EVENT_GFX_LORELEI
[OBJECT_EVENT_GFX_MR_FUJI / 2] = 0x00, // OBJECT_EVENT_GFX_BRUNO
[OBJECT_EVENT_GFX_BROCK / 2] = 0x10, // OBJECT_EVENT_GFX_MISTY
[OBJECT_EVENT_GFX_LT_SURGE / 2] = 0x10, // OBJECT_EVENT_GFX_ERIKA
[OBJECT_EVENT_GFX_KOGA / 2] = 0x10, // OBJECT_EVENT_GFX_SABRINA
[OBJECT_EVENT_GFX_BLAINE / 2] = 0x00, // OBJECT_EVENT_GFX_GIOVANNI
[OBJECT_EVENT_GFX_MOM / 2] = 0x01, // OBJECT_EVENT_GFX_CELIO
[OBJECT_EVENT_GFX_TEACHY_TV_HOST / 2] = 0x00, // OBJECT_EVENT_GFX_GYM_GUY
[OBJECT_EVENT_GFX_ITEM_BALL / 2] = 0x33, // OBJECT_EVENT_GFX_TOWN_MAP
[OBJECT_EVENT_GFX_POKEDEX / 2] = 0x33, // OBJECT_EVENT_GFX_CUT_TREE
[OBJECT_EVENT_GFX_ROCK_SMASH_ROCK / 2] = 0x33, // OBJECT_EVENT_GFX_STRENGTH_BOULDER
[OBJECT_EVENT_GFX_FOSSIL / 2] = 0x33, // OBJECT_EVENT_GFX_RUBY
[OBJECT_EVENT_GFX_SAPPHIRE / 2] = 0x33, // OBJECT_EVENT_GFX_OLD_AMBER
[OBJECT_EVENT_GFX_GYM_SIGN / 2] = 0x33, // OBJECT_EVENT_GFX_SIGN
[OBJECT_EVENT_GFX_TRAINER_TIPS / 2] = 0x33, // OBJECT_EVENT_GFX_CLIPBOARD
[OBJECT_EVENT_GFX_METEORITE / 2] = 0x33, // OBJECT_EVENT_GFX_LAPRAS_DOLL
[OBJECT_EVENT_GFX_SEAGALLOP / 2] = 0x23, // OBJECT_EVENT_GFX_SNORLAX
[OBJECT_EVENT_GFX_SPEAROW / 2] = 0x22, // OBJECT_EVENT_GFX_CUBONE
[OBJECT_EVENT_GFX_POLIWRATH / 2] = 0x22, // OBJECT_EVENT_GFX_CLEFAIRY
[OBJECT_EVENT_GFX_PIDGEOT / 2] = 0x22, // OBJECT_EVENT_GFX_JIGGLYPUFF
[OBJECT_EVENT_GFX_PIDGEY / 2] = 0x22, // OBJECT_EVENT_GFX_CHANSEY
[OBJECT_EVENT_GFX_OMANYTE / 2] = 0x22, // OBJECT_EVENT_GFX_KANGASKHAN
[OBJECT_EVENT_GFX_PIKACHU / 2] = 0x22, // OBJECT_EVENT_GFX_PSYDUCK
[OBJECT_EVENT_GFX_NIDORAN_F / 2] = 0x22, // OBJECT_EVENT_GFX_NIDORAN_M
[OBJECT_EVENT_GFX_NIDORINO / 2] = 0x22, // OBJECT_EVENT_GFX_MEOWTH
[OBJECT_EVENT_GFX_SEEL / 2] = 0x22, // OBJECT_EVENT_GFX_VOLTORB
[OBJECT_EVENT_GFX_SLOWPOKE / 2] = 0x22, // OBJECT_EVENT_GFX_SLOWBRO
[OBJECT_EVENT_GFX_MACHOP / 2] = 0x22, // OBJECT_EVENT_GFX_WIGGLYTUFF
[OBJECT_EVENT_GFX_DODUO / 2] = 0x22, // OBJECT_EVENT_GFX_FEAROW
[OBJECT_EVENT_GFX_MACHOKE / 2] = 0x22, // OBJECT_EVENT_GFX_LAPRAS
[OBJECT_EVENT_GFX_ZAPDOS / 2] = 0x22, // OBJECT_EVENT_GFX_MOLTRES
[OBJECT_EVENT_GFX_ARTICUNO / 2] = 0x22, // OBJECT_EVENT_GFX_MEWTWO
[OBJECT_EVENT_GFX_MEW / 2] = 0x22, // OBJECT_EVENT_GFX_ENTEI
[OBJECT_EVENT_GFX_SUICUNE / 2] = 0x22, // OBJECT_EVENT_GFX_RAIKOU
[OBJECT_EVENT_GFX_LUGIA / 2] = 0x22, // OBJECT_EVENT_GFX_HO_OH
[OBJECT_EVENT_GFX_CELEBI / 2] = 0x22, // OBJECT_EVENT_GFX_KABUTO
[OBJECT_EVENT_GFX_DEOXYS_D / 2] = 0x22, // OBJECT_EVENT_GFX_DEOXYS_A
[OBJECT_EVENT_GFX_DEOXYS_N / 2] = 0x32, // OBJECT_EVENT_GFX_SS_ANNE
};
void DynamicPlaceholderTextUtil_Reset(void)
@@ -63,7 +136,7 @@ u8 GetColorFromTextColorTable(u16 graphicId)
u32 test = graphicId >> 1;
u32 shift = (graphicId & 1) << 2;
if (test > 0x4B)
if (test >= NELEMS(sTextColorTable))
return 3;
else
return (sTextColorTable[graphicId >> 1] >> shift) & 0xF;
+84 -75
View File
@@ -1,25 +1,18 @@
#include "global.h"
#include "link.h"
#include "unk_815c27c.h"
enum {
EREADER_XFR_STATE_INIT,
EREADER_XFR_STATE_HANDSHAKE,
EREADER_XFR_STATE_START,
EREADER_XFR_STATE_TRANSFER,
};
#include "ereader_helpers.h"
struct SendRecvMgr
{
u8 sendOrRecv;
u8 state;
u8 field_02;
u8 field_03;
u8 field_04;
u32 * dataptr;
int cursor;
int size;
u32 checksum;
u8 master_slave; // 0: clock slave; 1: clock master
u8 state; // EREADER_XFR_STATE_*
u8 xferState; // EREADER_XFER_*
u8 checksumResult; // EREADER_CHECKSUM_*
u8 cancellationReason; // EREADER_CANCEL_*
u32 * dataptr; // Payload source or destination
int cursor; // Index of the next word
int size; // Last word index
u32 checksum; // Validation checksum
};
static bool16 DetermineSendRecvState(u8);
@@ -39,10 +32,9 @@ static u16 sSavedIme;
static u16 sSavedIe;
static u16 sSavedTm3Cnt;
static u16 sSavedSioCnt;
static u16 sSavedSioCnt;
static u16 sSavedRCnt;
int EReader_Send(size_t r6, const void * r5)
int EReader_Send(size_t size, const void * src)
{
int result;
EReaderHelper_SaveRegsState();
@@ -53,18 +45,18 @@ int EReader_Send(size_t r6, const void * r5)
if (TEST_BUTTON(sJoyNew, B_BUTTON))
gShouldAdvanceLinkState = 2;
sSendRecvStatus = EReaderHandleTransfer(1, r6, r5, NULL);
if ((sSendRecvStatus & 0x13) == 0x10)
sSendRecvStatus = EReaderHandleTransfer(1, size, src, NULL);
if ((sSendRecvStatus & 0x13) == 0x10) // checksum OK and xfer off
{
result = 0;
break;
}
else if (sSendRecvStatus & 8)
else if (sSendRecvStatus & 8) // cancelled by player
{
result = 1;
break;
}
else if (sSendRecvStatus & 4)
else if (sSendRecvStatus & 4) // timed out
{
result = 2;
break;
@@ -81,7 +73,7 @@ int EReader_Send(size_t r6, const void * r5)
return result;
}
int EReader_Recv(void * r5)
int EReader_Recv(void * dest)
{
int result;
EReaderHelper_SaveRegsState();
@@ -92,18 +84,18 @@ int EReader_Recv(void * r5)
if (TEST_BUTTON(sJoyNew, B_BUTTON))
gShouldAdvanceLinkState = 2;
sSendRecvStatus = EReaderHandleTransfer(0, 0, NULL, r5);
if ((sSendRecvStatus & 0x13) == 0x10)
sSendRecvStatus = EReaderHandleTransfer(0, 0, NULL, dest);
if ((sSendRecvStatus & 0x13) == 0x10) // checksum OK and xfer off
{
result = 0;
break;
}
else if (sSendRecvStatus & 8)
else if (sSendRecvStatus & 8) // cancelled by player
{
result = 1;
break;
}
else if (sSendRecvStatus & 4)
else if (sSendRecvStatus & 4) // timed out
{
result = 2;
break;
@@ -159,92 +151,98 @@ u16 EReaderHandleTransfer(u8 mode, size_t size, const void * data, void * recvBu
{
switch (sSendRecvMgr.state)
{
case 0:
case EREADER_XFR_STATE_INIT:
OpenSerialMulti();
sSendRecvMgr.field_02 = 1;
sSendRecvMgr.state = 1;
sSendRecvMgr.xferState = EREADER_XFER_EXE;
sSendRecvMgr.state = EREADER_XFR_STATE_HANDSHAKE;
break;
case 1:
case EREADER_XFR_STATE_HANDSHAKE:
if (DetermineSendRecvState(mode))
EnableSio();
if (gShouldAdvanceLinkState == 2)
{
sSendRecvMgr.field_04 = 2;
sSendRecvMgr.state = 6;
sSendRecvMgr.cancellationReason = EREADER_CANCEL_KEY;
sSendRecvMgr.state = EREADER_XFR_STATE_DONE;
}
// Progression is handled by the serial callback
break;
case 2:
case EREADER_XFR_STATE_START:
OpenSerial32();
SetUpTransferManager(size, data, recvBuffer);
sSendRecvMgr.state = 3;
sSendRecvMgr.state = EREADER_XFR_STATE_TRANSFER;
// fallthrough
case 3:
case EREADER_XFR_STATE_TRANSFER:
if (gShouldAdvanceLinkState == 2)
{
sSendRecvMgr.field_04 = 2;
sSendRecvMgr.state = 6;
sSendRecvMgr.cancellationReason = EREADER_CANCEL_KEY;
sSendRecvMgr.state = EREADER_XFR_STATE_DONE;
}
else
{
sCounter1++;
sCounter2++;
if (sSendRecvMgr.sendOrRecv == 0 && sCounter2 > 60)
if (sSendRecvMgr.master_slave == 0 && sCounter2 > 60)
{
sSendRecvMgr.field_04 = 1;
sSendRecvMgr.state = 6;
sSendRecvMgr.cancellationReason = EREADER_CANCEL_TIMEOUT;
sSendRecvMgr.state = EREADER_XFR_STATE_DONE;
}
if (sSendRecvMgr.field_02 != 2)
if (sSendRecvMgr.xferState != EREADER_XFER_CHK)
{
if (sSendRecvMgr.sendOrRecv != 0 && sCounter1 > 2)
if (sSendRecvMgr.master_slave != 0 && sCounter1 > 2)
{
EnableSio();
sSendRecvMgr.field_02 = 2;
sSendRecvMgr.xferState = EREADER_XFER_CHK;
}
else
{
EnableSio();
sSendRecvMgr.field_02 = 2;
sSendRecvMgr.xferState = EREADER_XFER_CHK;
}
}
}
// Progression is handled by the serial callback
break;
case 4:
case EREADER_XFR_STATE_TRANSFER_DONE:
OpenSerialMulti();
sSendRecvMgr.state = 5;
sSendRecvMgr.state = EREADER_XFR_STATE_CHECKSUM;
break;
case 5:
if (sSendRecvMgr.sendOrRecv == 1 && sCounter1 > 2)
case EREADER_XFR_STATE_CHECKSUM:
if (sSendRecvMgr.master_slave == 1 && sCounter1 > 2)
EnableSio();
if (++sCounter1 > 60)
{
sSendRecvMgr.field_04 = 1;
sSendRecvMgr.state = 6;
sSendRecvMgr.cancellationReason = EREADER_CANCEL_TIMEOUT;
sSendRecvMgr.state = EREADER_XFR_STATE_DONE;
}
break;
case 6:
if (sSendRecvMgr.field_02 != 0)
// Progression is handled by the serial callback
case EREADER_XFR_STATE_DONE:
if (sSendRecvMgr.xferState != 0)
{
CloseSerial();
sSendRecvMgr.field_02 = 0;
sSendRecvMgr.xferState = 0;
}
break;
}
return sSendRecvMgr.field_02 | (sSendRecvMgr.field_04 << 2) | (sSendRecvMgr.field_03 << 4);
return
(sSendRecvMgr.xferState << EREADER_XFER_SHIFT)
| (sSendRecvMgr.cancellationReason << EREADER_CANCEL_SHIFT)
| (sSendRecvMgr.checksumResult << EREADER_CHECKSUM_SHIFT);
}
static bool16 DetermineSendRecvState(u8 mode)
{
bool16 resp;
if ((*(vu32 *)REG_ADDR_SIOCNT & (SIO_MULTI_SI | SIO_MULTI_SD)) == SIO_MULTI_SD && mode)
resp = sSendRecvMgr.sendOrRecv = TRUE;
resp = sSendRecvMgr.master_slave = TRUE;
else
resp = sSendRecvMgr.sendOrRecv = FALSE;
resp = sSendRecvMgr.master_slave = FALSE;
return resp;
}
static void SetUpTransferManager(size_t size, const void * data, void * recvBuffer)
{
if (sSendRecvMgr.sendOrRecv)
if (sSendRecvMgr.master_slave)
{
REG_SIOCNT |= SIO_38400_BPS;
sSendRecvMgr.dataptr = (void *)data;
@@ -284,7 +282,7 @@ void EReaderHelper_SerialCallback(void)
switch (sSendRecvMgr.state)
{
case 1:
case EREADER_XFR_STATE_HANDSHAKE:
REG_SIOMLT_SEND = 0xCCD0;
*(u64 *)recv = REG_SIOMLT_RECV;
for (i = 0, cnt1 = 0, cnt2 = 0; i < 4; i++)
@@ -295,14 +293,17 @@ void EReaderHelper_SerialCallback(void)
cnt2++;
}
if (cnt1 == 2 && cnt2 == 0)
sSendRecvMgr.state = 2;
sSendRecvMgr.state = EREADER_XFR_STATE_START;
break;
case 3:
// Progression is handled by software
case EREADER_XFR_STATE_TRANSFER:
recv32 = REG_SIODATA32;
if (sSendRecvMgr.cursor == 0 && sSendRecvMgr.sendOrRecv == 0)
// The first value sent by the EReader is the payload size
if (sSendRecvMgr.cursor == 0 && sSendRecvMgr.master_slave == 0)
sSendRecvMgr.size = recv32 / 4 + 1;
if (sSendRecvMgr.sendOrRecv == 1)
if (sSendRecvMgr.master_slave == 1)
{
// Send mode
if (sSendRecvMgr.cursor < sSendRecvMgr.size)
{
REG_SIODATA32 = sSendRecvMgr.dataptr[sSendRecvMgr.cursor];
@@ -313,43 +314,51 @@ void EReaderHelper_SerialCallback(void)
}
else
{
// Receive mode
if (sSendRecvMgr.cursor > 0 && sSendRecvMgr.cursor < sSendRecvMgr.size + 1)
{
// Receive next word
sSendRecvMgr.dataptr[sSendRecvMgr.cursor - 1] = recv32;
sSendRecvMgr.checksum += recv32;
}
else if (sSendRecvMgr.cursor != 0)
{
// Reached the end, test the received checksum
if (sSendRecvMgr.checksum == recv32)
sSendRecvMgr.field_03 = 1;
sSendRecvMgr.checksumResult = EREADER_CHECKSUM_OK;
else
sSendRecvMgr.field_03 = 2;
sSendRecvMgr.checksumResult = EREADER_CHECKSUM_ERR;
}
sCounter2 = 0;
}
sSendRecvMgr.cursor++;
if (sSendRecvMgr.cursor < sSendRecvMgr.size + 2)
{
if (sSendRecvMgr.sendOrRecv != 0)
if (sSendRecvMgr.master_slave != 0)
// Clock master; start timer
REG_TM3CNT_H |= TIMER_ENABLE;
else
// Clock slave; reset
EnableSio();
}
else
{
sSendRecvMgr.state = 4;
sSendRecvMgr.state = EREADER_XFR_STATE_TRANSFER_DONE;
sCounter1 = 0;
}
break;
case 5:
if (sSendRecvMgr.sendOrRecv == 0)
REG_SIODATA8 = sSendRecvMgr.field_03;
// Progression is handled by the software
case EREADER_XFR_STATE_CHECKSUM:
if (sSendRecvMgr.master_slave == 0)
// Clock slave
REG_SIODATA8 = sSendRecvMgr.checksumResult;
*(vu64 *)recv = REG_SIOMLT_RECV;
if (recv[1] == 1 || recv[1] == 2)
if (recv[1] == EREADER_CHECKSUM_OK || recv[1] == EREADER_CHECKSUM_ERR)
{
if (sSendRecvMgr.sendOrRecv == 1)
sSendRecvMgr.field_03 = recv[1];
sSendRecvMgr.state = 6;
if (sSendRecvMgr.master_slave == 1)
// EReader has (in)validated the payload
sSendRecvMgr.checksumResult = recv[1];
sSendRecvMgr.state = EREADER_XFR_STATE_DONE;
}
break;
}
+2 -2
View File
@@ -118,7 +118,7 @@ bool32 IsMysteryGiftEnabled(void)
return FlagGet(FLAG_SYS_MYSTERY_GIFT_ENABLED);
}
void sub_806E2D0(void)
void ResetMysteryEventFlags(void)
{
FlagClear(FLAG_MYSTERY_EVENT_DONE);
FlagClear(FLAG_0x3D9);
@@ -138,7 +138,7 @@ void sub_806E2D0(void)
FlagClear(FLAG_0x3E7);
}
void sub_806E370(void)
void ResetMysteryEventVars(void)
{
VarSet(VAR_EVENT_PICHU_SLOT, 0);
VarSet(VAR_0x40B6, 0);
+4 -4
View File
@@ -524,12 +524,12 @@ void RfuUnionObjectSetFacingDirection(u8 objectEventId, u8 direction)
}
}
void RfuUnionObjectToggleInvisibility(u8 objectEventId, bool32 arg1)
void RfuUnionObjectToggleInvisibility(u8 objectEventId, bool32 invisible)
{
u8 spriteId = GetObjectEventSpriteId(objectEventId);
if (spriteId != MAX_SPRITES)
{
if (arg1)
if (invisible)
gSprites[spriteId].tInvisible = TRUE;
else
gSprites[spriteId].tInvisible = FALSE;
@@ -544,12 +544,12 @@ bool32 RfuUnionObjectIsInvisible(u8 objectEventId)
return gSprites[spriteId].tInvisible == TRUE;
}
void RfuUnionObjectStartWarp(u8 objectEventId, u8 direction)
void RfuUnionObjectStartWarp(u8 objectEventId, u8 animNo)
{
u8 spriteId = GetObjectEventSpriteId(objectEventId);
if (spriteId != MAX_SPRITES)
{
gSprites[spriteId].tUnionRoomWarpAnimNo = direction;
gSprites[spriteId].tUnionRoomWarpAnimNo = animNo;
gSprites[spriteId].tUnionRoomWarpAnimState = 0;
}
}
+1 -1
View File
@@ -93,7 +93,7 @@ void sub_80696C0(void)
UnfreezeObjectEvents();
}
void sub_80696F0(void)
void UnionRoom_UnlockPlayerAndChatPartner(void)
{
u8 objectEventId;
if (gObjectEvents[gSelectedObjectEvent].active)
+4 -4
View File
@@ -206,7 +206,7 @@ static void sub_807DDF0(u8 taskId)
switch (task->data[0])
{
case 0:
sub_800AB9C();
PrepareSendLinkCmd2FFE_or_RfuCmd6600();
task->data[0]++;
break;
case 1:
@@ -227,7 +227,7 @@ static void sub_807DDF0(u8 taskId)
}
}
void sub_807DE58(void)
void FieldCB_ReturnToFieldWirelessLink(void)
{
ScriptContext2_Enable();
Overworld_PlaySpecialMapMusic();
@@ -632,7 +632,7 @@ static void sub_807E5EC(u8 taskId)
break;
case 2:
WarpIntoMap();
SetMainCallback2(sub_8056788);
SetMainCallback2(CB2_ReturnToFieldCableClub);
DestroyTask(taskId);
break;
}
@@ -662,7 +662,7 @@ static void sub_807E678(u8 taskId)
case 1:
if (!sub_807E40C() && BGMusicStopped())
{
sub_800AAC0();
Link_TryStartSend5FFF();
data[0]++;
}
break;
+5 -5
View File
@@ -1920,15 +1920,15 @@ u16 Special_BattleCardAction(void)
switch (gSpecialVar_Result)
{
case 0:
return sub_81445C0(3);
return MEvent_GetBattleCardCount(3);
case 1:
return sub_81445C0(4);
return MEvent_GetBattleCardCount(4);
case 2:
return sub_81445C0(0);
return MEvent_GetBattleCardCount(0);
case 3:
return sub_81445C0(1);
return MEvent_GetBattleCardCount(1);
case 4:
return sub_81445C0(2);
return MEvent_GetBattleCardCount(2);
default:
AGB_ASSERT_EX(0, ABSPATH("scr_tool.c"), 3873);
return 0;
+1 -1
View File
@@ -490,7 +490,7 @@ void MapGridSetMetatileEntryAt(s32 x, s32 y, u16 metatile)
}
}
void sub_8059024(s32 x, s32 y, bool32 arg2)
void MapGridSetMetatileImpassabilityAt(s32 x, s32 y, bool32 arg2)
{
if (x >= 0 && x < VMap.Xsize
&& y >= 0 && y < VMap.Ysize)
+30 -30
View File
@@ -33,7 +33,7 @@ struct HelpSystemVideoState
static EWRAM_DATA u8 sMapTilesBackup[BG_CHAR_SIZE] = {0};
EWRAM_DATA u8 gUnknown_203F174 = 0;
EWRAM_DATA u8 gUnknown_203F175 = 0;
EWRAM_DATA bool8 gHelpSystemToggleWithRButtonDisabled = FALSE;
static EWRAM_DATA u8 sDelayTimer = 0;
static EWRAM_DATA u8 sInHelpSystem = 0;
static EWRAM_DATA struct HelpSystemVideoState sVideoState = {0};
@@ -53,7 +53,7 @@ u8 RunHelpSystemCallback(void)
sInHelpSystem = 0;
if (gSaveBlock2Ptr->optionsButtonMode != OPTIONS_BUTTON_MODE_HELP)
return 0;
if (JOY_NEW(R_BUTTON) && gUnknown_203F175 == 1)
if (JOY_NEW(R_BUTTON) && gHelpSystemToggleWithRButtonDisabled == TRUE)
return 0;
if (JOY_NEW(L_BUTTON | R_BUTTON))
{
@@ -93,9 +93,9 @@ u8 RunHelpSystemCallback(void)
HelpSystem_PrintText_Row61(gString_Help);
sub_813BD14(1);
if (sub_812B40C() == TRUE)
sub_812BC54(&gHelpSystemListMenu, gHelpSystemListMenuItems);
HelpSystemSubroutine_PrintWelcomeMessage(&gHelpSystemListMenu, gHelpSystemListMenuItems);
else
sub_812BCA8(&gHelpSystemListMenu, gHelpSystemListMenuItems);
HelpSystemSubroutine_WelcomeEndGotoMenu(&gHelpSystemListMenu, gHelpSystemListMenuItems);
sub_813BE78(1);
sub_813BF50(1);
CommitTilemap();
@@ -110,7 +110,7 @@ u8 RunHelpSystemCallback(void)
sVideoState.state = 5;
break;
case 5:
if (!sub_812BB9C(&gHelpSystemListMenu, gHelpSystemListMenuItems))
if (!RunHelpMenuSubroutine(&gHelpSystemListMenu, gHelpSystemListMenuItems))
{
PlaySE(SE_HELP_CL);
sVideoState.state = 6;
@@ -981,9 +981,9 @@ void HelpSystem_FillPanel1(void)
void HelpSystem_InitListMenuController(struct HelpSystemListMenu * a0, u8 a1, u8 a2)
{
gHelpSystemListMenu.sub = a0->sub;
gHelpSystemListMenu.field_0C = a1;
gHelpSystemListMenu.field_0D = a2;
gHelpSystemListMenu.field_0E = 0;
gHelpSystemListMenu.itemsAbove = a1;
gHelpSystemListMenu.cursorPos = a2;
gHelpSystemListMenu.state = 0;
if (gHelpSystemListMenu.sub.totalItems < gHelpSystemListMenu.sub.maxShowed)
gHelpSystemListMenu.sub.maxShowed = gHelpSystemListMenu.sub.totalItems;
sub_813BDA4(0);
@@ -1007,7 +1007,7 @@ s32 HelpSystem_GetMenuInput(void)
else if (JOY_NEW(A_BUTTON))
{
PlaySE(SE_SELECT);
return gHelpSystemListMenu.sub.items[gHelpSystemListMenu.field_0C + gHelpSystemListMenu.field_0D].index;
return gHelpSystemListMenu.sub.items[gHelpSystemListMenu.itemsAbove + gHelpSystemListMenu.cursorPos].index;
}
else if (JOY_NEW(B_BUTTON))
{
@@ -1051,15 +1051,15 @@ void sub_813C75C(void)
u8 r6 = gHelpSystemListMenu.sub.totalItems - 7;
if (gHelpSystemListMenu.sub.totalItems > 7)
{
s32 r4 = gHelpSystemListMenu.field_0C + gHelpSystemListMenu.field_0D;
s32 r4 = gHelpSystemListMenu.itemsAbove + gHelpSystemListMenu.cursorPos;
sub_813C004(0, 0);
if (r4 == 0)
sub_813C004(1, 1);
else if (gHelpSystemListMenu.field_0C == 0 && gHelpSystemListMenu.field_0D != 0)
else if (gHelpSystemListMenu.itemsAbove == 0 && gHelpSystemListMenu.cursorPos != 0)
sub_813C004(1, 1);
else if (gHelpSystemListMenu.field_0C == r6)
else if (gHelpSystemListMenu.itemsAbove == r6)
sub_813C004(0, 1);
else if (gHelpSystemListMenu.field_0C != 0)
else if (gHelpSystemListMenu.itemsAbove != 0)
{
sub_813C004(0, 1);
sub_813C004(1, 1);
@@ -1071,7 +1071,7 @@ void PrintListMenuItems(void)
{
u8 glyphHeight = GetFontAttribute(2, 1) + 1;
s32 i;
s32 r5 = gHelpSystemListMenu.field_0C;
s32 r5 = gHelpSystemListMenu.itemsAbove;
for (i = 0; i < gHelpSystemListMenu.sub.maxShowed; i++)
{
@@ -1086,7 +1086,7 @@ void PlaceListMenuCursor(void)
{
u8 glyphHeight = GetFontAttribute(2, 1) + 1;
u8 x = gHelpSystemListMenu.sub.left;
u8 y = gHelpSystemListMenu.sub.top + glyphHeight * gHelpSystemListMenu.field_0D;
u8 y = gHelpSystemListMenu.sub.top + glyphHeight * gHelpSystemListMenu.cursorPos;
HelpSystem_PrintTextAt(gFameCheckerText_ListMenuCursor, x, y);
}
@@ -1107,24 +1107,24 @@ u8 TryMoveCursor1(u8 dirn)
r4 = 0;
else
r4 = gHelpSystemListMenu.sub.maxShowed - (gHelpSystemListMenu.sub.maxShowed / 2 + (gHelpSystemListMenu.sub.maxShowed & 1)) - 1;
if (gHelpSystemListMenu.field_0C == 0)
if (gHelpSystemListMenu.itemsAbove == 0)
{
if (gHelpSystemListMenu.field_0D != 0)
if (gHelpSystemListMenu.cursorPos != 0)
{
gHelpSystemListMenu.field_0D--;
gHelpSystemListMenu.cursorPos--;
return 1;
}
else
return 0;
}
if (gHelpSystemListMenu.field_0D > r4)
if (gHelpSystemListMenu.cursorPos > r4)
{
gHelpSystemListMenu.field_0D--;
gHelpSystemListMenu.cursorPos--;
return 1;
}
else
{
gHelpSystemListMenu.field_0C--;
gHelpSystemListMenu.itemsAbove--;
return 2;
}
}
@@ -1134,24 +1134,24 @@ u8 TryMoveCursor1(u8 dirn)
r4 = 0;
else
r4 = gHelpSystemListMenu.sub.maxShowed / 2 + (gHelpSystemListMenu.sub.maxShowed & 1);
if (gHelpSystemListMenu.field_0C == gHelpSystemListMenu.sub.totalItems - gHelpSystemListMenu.sub.maxShowed)
if (gHelpSystemListMenu.itemsAbove == gHelpSystemListMenu.sub.totalItems - gHelpSystemListMenu.sub.maxShowed)
{
if (gHelpSystemListMenu.field_0D < gHelpSystemListMenu.sub.maxShowed - 1)
if (gHelpSystemListMenu.cursorPos < gHelpSystemListMenu.sub.maxShowed - 1)
{
gHelpSystemListMenu.field_0D++;
gHelpSystemListMenu.cursorPos++;
return 1;
}
else
return 0;
}
else if (gHelpSystemListMenu.field_0D < r4)
else if (gHelpSystemListMenu.cursorPos < r4)
{
gHelpSystemListMenu.field_0D++;
gHelpSystemListMenu.cursorPos++;
return 1;
}
else
{
gHelpSystemListMenu.field_0C++;
gHelpSystemListMenu.itemsAbove++;
return 2;
}
}
@@ -1159,7 +1159,7 @@ u8 TryMoveCursor1(u8 dirn)
bool8 MoveCursor(u8 by, u8 dirn)
{
u8 r7 = gHelpSystemListMenu.field_0D;
u8 r7 = gHelpSystemListMenu.cursorPos;
u8 flags = 0;
s32 i;
for (i = 0; i < by; i++)
@@ -1172,14 +1172,14 @@ bool8 MoveCursor(u8 by, u8 dirn)
// neither changed
return TRUE;
case 1:
// changed field_0D only
// changed cursorPos only
sub_813C860(r7);
PlaceListMenuCursor();
CommitTilemap();
break;
case 2:
case 3:
// changed field_0C
// changed itemsAbove
if (sub_812BF88() == TRUE)
{
HelpSystem_SetInputDelay(2);
+209 -210
View File
@@ -19,22 +19,22 @@
static EWRAM_DATA u16 sSomeVariable = 0;
static EWRAM_DATA u8 gUnknown_203B0EE = 0;
u8 gUnknown_3005E9C[4];
u8 sHelpSystemState[4];
u16 gSomeVariableBackup;
static bool32 IsCurrentMapInArray(const u16 * mapIdxs);
static void sub_812B520(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
static void sub_812B614(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
static bool8 sub_812B754(void);
static bool8 sub_812B780(u8);
static bool8 sub_812BB10(void);
static void BuildMainTopicsListAndMoveToH00(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
static void SetHelpSystemSubmenuItems(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
static bool8 HelpSystem_HasDefeatedBrock(void);
static bool8 HelpSystemSubmenuIndexIsActive(u8);
static bool8 HasGottenAtLeastOneHM(void);
static void sub_812BF5C(void);
static void sub_812BF74(const u8 *);
static void sub_812BF94(struct HelpSystemListMenu * a0);
static void sub_812BF9C(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
static void PrintWelcomeMessageOnPanel1(void);
static void PrintTextOnPanel2Row52RightAlign(const u8 *);
static void ResetHelpSystemCursor(struct HelpSystemListMenu * a0);
static void PrintHelpSystemTopicMouseoverDescription(struct HelpSystemListMenu * a0, struct ListMenuItem * a1);
static const u8 *const gUnknown_845B080[] = {
static const u8 *const sHelpSystemTopicPtrs[] = {
gUnknown_81B2DF8,
gUnknown_81B2E1C,
gUnknown_81B2E2E,
@@ -43,7 +43,7 @@ static const u8 *const gUnknown_845B080[] = {
gUnknown_81B2E6A
};
static const u8 *const gUnknown_845B098[] = {
static const u8 *const sHelpSystemTopicMouseoverDescriptionPtrs[] = {
gUnknown_81B2E88,
gUnknown_81B2EC8,
gUnknown_81B2F00,
@@ -52,7 +52,7 @@ static const u8 *const gUnknown_845B098[] = {
gUnknown_81B2FA9
};
static const u8 *const gUnknown_845B0B0[] = {
static const u8 *const sHelpSystemSpecializedQuestionTextPtrs[] = {
NULL,
gUnknown_81B3083,
gUnknown_81B30A9,
@@ -100,7 +100,7 @@ static const u8 *const gUnknown_845B0B0[] = {
gUnknown_81B3516
};
static const u8 *const gUnknown_845B164[] = {
static const u8 *const sHelpSystemSpecializedAnswerTextPtrs[] = {
NULL,
gUnknown_81B3525,
gUnknown_81B35E6,
@@ -148,7 +148,7 @@ static const u8 *const gUnknown_845B164[] = {
gUnknown_81B55F4
};
static const u8 *const gUnknown_845B218[] = {
static const u8 *const sHelpSystemMenuTopicTextPtrs[] = {
NULL,
gUnknown_81B56E3,
gUnknown_81B56F4,
@@ -200,7 +200,7 @@ static const u8 *const gUnknown_845B218[] = {
gUnknown_81B5A37
};
static const u8 *const gUnknown_845B2DC[] = {
static const u8 *const sHelpSystemSpecializedControlsTextPtrs[] = {
NULL,
gUnknown_81B5A4D,
gUnknown_81B5B0C,
@@ -252,7 +252,7 @@ static const u8 *const gUnknown_845B2DC[] = {
gUnknown_81B7C57
};
static const u8 *const gUnknown_845B3A0[] = {
static const u8 *const sHelpSystemSpecializedStringsTextPtrs[] = {
NULL,
gUnknown_81B7CC1,
gUnknown_81B7CC4,
@@ -299,7 +299,7 @@ static const u8 *const gUnknown_845B3A0[] = {
gUnknown_81B7E0F
};
static const u8 *const gUnknown_845B450[] = {
static const u8 *const sHelpSystemSpecializedStringDefinitionsTextPtrs[] = {
NULL,
gUnknown_81B7E16,
gUnknown_81B7F0A,
@@ -346,7 +346,7 @@ static const u8 *const gUnknown_845B450[] = {
gUnknown_81B9B2F
};
static const u8 *const gUnknown_845B500[] = {
static const u8 *const sHelpSystemGeneralTopicTextPtrs[] = {
NULL,
gUnknown_81B9BB7,
gUnknown_81B9BC7,
@@ -357,7 +357,7 @@ static const u8 *const gUnknown_845B500[] = {
gUnknown_81B9C1D
};
static const u8 *const gUnknown_845B520[] = {
static const u8 *const sHelpSystemGeneralTopicDescriptionTextPtrs[] = {
NULL,
gUnknown_81B9C2F,
gUnknown_81B9D04,
@@ -368,7 +368,7 @@ static const u8 *const gUnknown_845B520[] = {
gUnknown_81BA027
};
static const u8 *const gUnknown_845B540[] = {
static const u8 *const sHelpSystemTypeMatchupTextPtrs[] = {
NULL,
gUnknown_81BA0F1,
gUnknown_81BA10D,
@@ -407,7 +407,7 @@ static const u8 *const gUnknown_845B540[] = {
gUnknown_81BA400
};
static const u8 *const gUnknown_845B5D0[] = {
static const u8 *const sHelpSystemTypeMatchupDescriptionTextPtrs[] = {
NULL,
gUnknown_81BA416,
gUnknown_81BA4E6,
@@ -446,7 +446,6 @@ static const u8 *const gUnknown_845B5D0[] = {
gUnknown_81BB156
};
static const u8 gUnknown_845B660[] = {
0x01, 0x02, 0x03, 0xff
};
@@ -739,7 +738,7 @@ static const u8 gUnknown_845B9BE[] = {
0x09, 0x01, 0x02, 0x03, 0x23, 0x25, 0x24, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0a, 0x0b, 0x0c, 0x0d, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x27, 0x15, 0x26, 0x16, 0x17, 0x18, 0x1a, 0x0e, 0x1b, 0xff
};
static const u8 *const gUnknown_845B9E0[] = {
static const u8 *const sHelpSystemSubmenuIndexPointers[] = {
NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, gUnknown_845B660, NULL,
NULL, NULL, NULL, gUnknown_845B664, NULL,
@@ -780,48 +779,48 @@ static const u8 *const gUnknown_845B9E0[] = {
static const u16 unref_845BCB0[] = INCBIN_U16("graphics/help_system/unk_845BCB0.bin");
static const u8 gUnknown_845C4B0[] = {
static const u8 sHelpSystemContextTopicOrder[] = {
3, 0, 1, 2, 4, 5
};
static const u8 gUnknown_845C4B6[][6] = {
{0, 0, 0, 0, 0, 1},
{0, 0, 0, 1, 0, 1},
{0, 0, 0, 1, 0, 1},
{0, 1, 0, 1, 0, 1},
{0, 1, 0, 0, 0, 1},
{0, 1, 1, 0, 0, 1},
{0, 1, 1, 0, 0, 1},
{0, 0, 1, 0, 0, 1},
{0, 0, 1, 0, 0, 1},
{0, 1, 1, 0, 0, 1},
{0, 1, 1, 0, 0, 1},
{0, 1, 0, 0, 0, 1},
{0, 1, 1, 0, 0, 1},
{0, 1, 1, 0, 0, 1},
{1, 0, 0, 1, 0, 1},
{1, 1, 1, 0, 0, 1},
{1, 1, 1, 1, 0, 1},
{1, 1, 1, 0, 0, 1},
{1, 1, 1, 0, 1, 1},
{1, 1, 1, 0, 0, 1},
{1, 1, 1, 0, 0, 1},
{1, 1, 1, 0, 0, 1},
{1, 1, 1, 0, 0, 1},
{1, 1, 1, 0, 1, 1},
{1, 1, 1, 0, 1, 1},
{1, 1, 1, 0, 1, 1},
{1, 1, 1, 0, 1, 1},
{0, 1, 0, 0, 0, 1},
{0, 1, 0, 0, 0, 1},
{0, 1, 0, 0, 0, 1},
{0, 1, 0, 0, 0, 1},
{0, 1, 0, 0, 0, 1},
{0, 1, 0, 0, 0, 1},
{0, 1, 0, 0, 0, 1},
{0, 1, 0, 0, 0, 1},
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0}
static const bool8 sHelpSystemContextTopicFlags[][6] = {
{FALSE, FALSE, FALSE, FALSE, FALSE, TRUE },
{FALSE, FALSE, FALSE, TRUE, FALSE, TRUE },
{FALSE, FALSE, FALSE, TRUE, FALSE, TRUE },
{FALSE, TRUE, FALSE, TRUE, FALSE, TRUE },
{FALSE, TRUE, FALSE, FALSE, FALSE, TRUE },
{FALSE, TRUE, TRUE, FALSE, FALSE, TRUE },
{FALSE, TRUE, TRUE, FALSE, FALSE, TRUE },
{FALSE, FALSE, TRUE, FALSE, FALSE, TRUE },
{FALSE, FALSE, TRUE, FALSE, FALSE, TRUE },
{FALSE, TRUE, TRUE, FALSE, FALSE, TRUE },
{FALSE, TRUE, TRUE, FALSE, FALSE, TRUE },
{FALSE, TRUE, FALSE, FALSE, FALSE, TRUE },
{FALSE, TRUE, TRUE, FALSE, FALSE, TRUE },
{FALSE, TRUE, TRUE, FALSE, FALSE, TRUE },
{TRUE, FALSE, FALSE, TRUE, FALSE, TRUE },
{TRUE, TRUE, TRUE, FALSE, FALSE, TRUE },
{TRUE, TRUE, TRUE, TRUE, FALSE, TRUE },
{TRUE, TRUE, TRUE, FALSE, FALSE, TRUE },
{TRUE, TRUE, TRUE, FALSE, TRUE, TRUE },
{TRUE, TRUE, TRUE, FALSE, FALSE, TRUE },
{TRUE, TRUE, TRUE, FALSE, FALSE, TRUE },
{TRUE, TRUE, TRUE, FALSE, FALSE, TRUE },
{TRUE, TRUE, TRUE, FALSE, FALSE, TRUE },
{TRUE, TRUE, TRUE, FALSE, TRUE, TRUE },
{TRUE, TRUE, TRUE, FALSE, TRUE, TRUE },
{TRUE, TRUE, TRUE, FALSE, TRUE, TRUE },
{TRUE, TRUE, TRUE, FALSE, TRUE, TRUE },
{FALSE, TRUE, FALSE, FALSE, FALSE, TRUE },
{FALSE, TRUE, FALSE, FALSE, FALSE, TRUE },
{FALSE, TRUE, FALSE, FALSE, FALSE, TRUE },
{FALSE, TRUE, FALSE, FALSE, FALSE, TRUE },
{FALSE, TRUE, FALSE, FALSE, FALSE, TRUE },
{FALSE, TRUE, FALSE, FALSE, FALSE, TRUE },
{FALSE, TRUE, FALSE, FALSE, FALSE, TRUE },
{FALSE, TRUE, FALSE, FALSE, FALSE, TRUE },
{FALSE, FALSE, FALSE, FALSE, FALSE, FALSE},
{FALSE, FALSE, FALSE, FALSE, FALSE, FALSE}
};
static const u16 sMartMaps[] = {
@@ -961,12 +960,12 @@ static bool8 IsInDungeonMap(void)
void sub_812B35C(void)
{
sub_812B4B8();
HelpSystem_EnableToggleWithRButton();
if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))
HelpSystem_SetSomeVariable2(0x16);
else if (IsInDungeonMap())
HelpSystem_SetSomeVariable2(0x15);
else if (is_light_level_8_or_9(gMapHeader.mapType))
else if (IsMapTypeIndoors(gMapHeader.mapType))
{
if ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_1F) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_1F)) || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_2F) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_2F)))
HelpSystem_SetSomeVariable2(0x0E);
@@ -1015,126 +1014,126 @@ void HelpSystem_Enable(void)
if (gQuestLogState != 2 && gQuestLogState != 3)
{
gHelpSystemEnabled = TRUE;
sub_812B4B8();
HelpSystem_EnableToggleWithRButton();
}
}
void sub_812B4AC(void)
void HelpSystem_DisableToggleWithRButton(void)
{
gUnknown_203F175 = 1;
gHelpSystemToggleWithRButtonDisabled = TRUE;
}
void sub_812B4B8(void)
void HelpSystem_EnableToggleWithRButton(void)
{
gUnknown_203F175 = 0;
gHelpSystemToggleWithRButtonDisabled = FALSE;
}
static void sub_812B4C4(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
static void ResetHelpSystemListMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
a0->sub.items = a1;
a0->sub.totalItems = 1;
a0->sub.maxShowed = 1;
a0->sub.left = 1;
a0->sub.top = 4;
helpListMenu->sub.items = listMenuItemsBuffer;
helpListMenu->sub.totalItems = 1;
helpListMenu->sub.maxShowed = 1;
helpListMenu->sub.left = 1;
helpListMenu->sub.top = 4;
}
static void sub_812B4D8(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
static void BuildAndPrintMainTopicsListMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
sub_812B4C4(a0, a1);
sub_812B520(a0, a1);
sub_812BF74(gUnknown_841DFAC);
HelpSystem_InitListMenuController(a0, 0, gUnknown_3005E9C[2]);
sub_812BF9C(a0, a1);
ResetHelpSystemListMenu(helpListMenu, listMenuItemsBuffer);
BuildMainTopicsListAndMoveToH00(helpListMenu, listMenuItemsBuffer);
PrintTextOnPanel2Row52RightAlign(gUnknown_841DFAC);
HelpSystem_InitListMenuController(helpListMenu, 0, sHelpSystemState[2]);
PrintHelpSystemTopicMouseoverDescription(helpListMenu, listMenuItemsBuffer);
sub_813BDA4(1);
sub_813BD5C(1);
}
static void sub_812B520(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
static void BuildMainTopicsListAndMoveToH00(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
u8 i;
u8 r4 = 0;
u8 totalItems = 0;
for (i = 0; i < 6; i++)
{
if (gUnknown_845C4B6[sSomeVariable][gUnknown_845C4B0[i]] == 1)
if (sHelpSystemContextTopicFlags[sSomeVariable][sHelpSystemContextTopicOrder[i]] == TRUE)
{
a1[r4].label = gUnknown_845B080[gUnknown_845C4B0[i]];
a1[r4].index = gUnknown_845C4B0[i];
r4++;
listMenuItemsBuffer[totalItems].label = sHelpSystemTopicPtrs[sHelpSystemContextTopicOrder[i]];
listMenuItemsBuffer[totalItems].index = sHelpSystemContextTopicOrder[i];
totalItems++;
}
}
a1[r4 - 1].index = -2;
a0->sub.totalItems = r4;
a0->sub.maxShowed = r4;
a0->sub.left = 0;
listMenuItemsBuffer[totalItems - 1].index = -2;
helpListMenu->sub.totalItems = totalItems;
helpListMenu->sub.maxShowed = totalItems;
helpListMenu->sub.left = 0;
}
static void sub_812B5A8(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
static void BuildAndPrintSubmenuList(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
sub_813BDE8(0);
sub_813BFC0(0);
sub_813BE78(1);
sub_812B4C4(a0, a1);
sub_812B614(a0, a1);
sub_812BF74(gUnknown_841DFC9);
HelpSystem_InitListMenuController(a0, a0->field_0C, a0->field_0D);
HelpSystem_PrintTextAt(gUnknown_845B080[gUnknown_3005E9C[1]], 0, 0);
ResetHelpSystemListMenu(helpListMenu, listMenuItemsBuffer);
SetHelpSystemSubmenuItems(helpListMenu, listMenuItemsBuffer);
PrintTextOnPanel2Row52RightAlign(gUnknown_841DFC9);
HelpSystem_InitListMenuController(helpListMenu, helpListMenu->itemsAbove, helpListMenu->cursorPos);
HelpSystem_PrintTextAt(sHelpSystemTopicPtrs[sHelpSystemState[1]], 0, 0);
sub_813BDA4(1);
sub_813BD5C(1);
}
static void sub_812B614(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
static void SetHelpSystemSubmenuItems(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
u8 r6 = 0;
const u8 * r3 = gUnknown_845B9E0[sSomeVariable * 5 + gUnknown_3005E9C[1]];
u8 totalItems = 0;
const u8 * indexPtr = sHelpSystemSubmenuIndexPointers[sSomeVariable * 5 + sHelpSystemState[1]];
u8 i;
for (i = 0; r3[i] != 0xFF; i++)
for (i = 0; indexPtr[i] != 0xFF; i++)
{
if (sub_812B780(r3[i]) == TRUE)
if (HelpSystemSubmenuIndexIsActive(indexPtr[i]) == TRUE)
{
if (gUnknown_3005E9C[1] == 0)
a1[r6].label = gUnknown_845B0B0[r3[i]];
else if (gUnknown_3005E9C[1] == 1)
a1[r6].label = gUnknown_845B218[r3[i]];
else if (gUnknown_3005E9C[1] == 2)
a1[r6].label = gUnknown_845B3A0[r3[i]];
else if (gUnknown_3005E9C[1] == 3)
a1[r6].label = gUnknown_845B500[r3[i]];
if (sHelpSystemState[1] == 0)
listMenuItemsBuffer[totalItems].label = sHelpSystemSpecializedQuestionTextPtrs[indexPtr[i]];
else if (sHelpSystemState[1] == 1)
listMenuItemsBuffer[totalItems].label = sHelpSystemMenuTopicTextPtrs[indexPtr[i]];
else if (sHelpSystemState[1] == 2)
listMenuItemsBuffer[totalItems].label = sHelpSystemSpecializedStringsTextPtrs[indexPtr[i]];
else if (sHelpSystemState[1] == 3)
listMenuItemsBuffer[totalItems].label = sHelpSystemGeneralTopicTextPtrs[indexPtr[i]];
else
a1[r6].label = gUnknown_845B540[r3[i]];
a1[r6].index = r3[i];
r6++;
listMenuItemsBuffer[totalItems].label = sHelpSystemTypeMatchupTextPtrs[indexPtr[i]];
listMenuItemsBuffer[totalItems].index = indexPtr[i];
totalItems++;
}
}
if (sub_812B754() == TRUE)
if (HelpSystem_HasDefeatedBrock() == TRUE)
{
for (i = 0, r3 = gUnknown_845B9BE; r3[i] != 0xFF; i++)
for (i = 0, indexPtr = gUnknown_845B9BE; indexPtr[i] != 0xFF; i++)
{
a1[r6].label = gUnknown_845B3A0[r3[i]];
a1[r6].index = r3[i];
r6++;
listMenuItemsBuffer[totalItems].label = sHelpSystemSpecializedStringsTextPtrs[indexPtr[i]];
listMenuItemsBuffer[totalItems].index = indexPtr[i];
totalItems++;
}
}
a1[r6].label = gUnknown_81B2E6F;
a1[r6].index = -2;
r6++;
a0->sub.totalItems = r6;
a0->sub.maxShowed = 7;
a0->sub.left = 0;
a0->sub.top = 21;
listMenuItemsBuffer[totalItems].label = gUnknown_81B2E6F;
listMenuItemsBuffer[totalItems].index = -2;
totalItems++;
helpListMenu->sub.totalItems = totalItems;
helpListMenu->sub.maxShowed = 7;
helpListMenu->sub.left = 0;
helpListMenu->sub.top = 21;
}
static bool8 sub_812B754(void)
static bool8 HelpSystem_HasDefeatedBrock(void)
{
if (FlagGet(FLAG_DEFEATED_BROCK) == TRUE && gUnknown_3005E9C[1] == 2)
if (FlagGet(FLAG_DEFEATED_BROCK) == TRUE && sHelpSystemState[1] == 2)
return TRUE;
return FALSE;
}
static bool8 sub_812B780(u8 id)
static bool8 HelpSystemSubmenuIndexIsActive(u8 id)
{
u8 i = 0;
if (gUnknown_3005E9C[1] == 0)
if (sHelpSystemState[1] == 0)
{
switch (id)
{
@@ -1188,7 +1187,7 @@ static bool8 sub_812B780(u8 id)
return FlagGet(FLAG_BADGE01_GET);
case 28:
case 40:
return sub_812BB10();
return HasGottenAtLeastOneHM();
case 39:
return FlagGet(FLAG_GOT_FAME_CHECKER);
case 44:
@@ -1196,7 +1195,7 @@ static bool8 sub_812B780(u8 id)
}
return FALSE;
}
if (gUnknown_3005E9C[1] == 1)
if (sHelpSystemState[1] == 1)
{
switch (id)
{
@@ -1254,7 +1253,7 @@ static bool8 sub_812B780(u8 id)
return FlagGet(FLAG_BADGE01_GET);
case 16:
case 17:
return sub_812BB10();
return HasGottenAtLeastOneHM();
case 18:
return FlagGet(FLAG_GOT_BICYCLE);
case 48:
@@ -1262,9 +1261,9 @@ static bool8 sub_812B780(u8 id)
}
return FALSE;
}
if (gUnknown_3005E9C[1] == 2)
if (sHelpSystemState[1] == 2)
{
if (sub_812B754() == TRUE)
if (HelpSystem_HasDefeatedBrock() == TRUE)
{
for (i = 0; gUnknown_845B9BE[i] != 0xFF; i++)
{
@@ -1311,7 +1310,7 @@ static bool8 sub_812B780(u8 id)
return FlagGet(FLAG_SYS_POKEMON_GET);
case 36:
case 37:
return sub_812BB10();
return HasGottenAtLeastOneHM();
case 3:
case 15:
case 18:
@@ -1320,7 +1319,7 @@ static bool8 sub_812B780(u8 id)
}
return TRUE;
}
if (gUnknown_3005E9C[1] == 3)
if (sHelpSystemState[1] == 3)
{
switch (id)
{
@@ -1331,7 +1330,7 @@ static bool8 sub_812B780(u8 id)
}
return TRUE;
}
if (gUnknown_3005E9C[1] == 4)
if (sHelpSystemState[1] == 4)
{
return TRUE;
}
@@ -1339,7 +1338,7 @@ static bool8 sub_812B780(u8 id)
return FALSE;
}
static bool8 sub_812BB10(void)
static bool8 HasGottenAtLeastOneHM(void)
{
if (FlagGet(FLAG_GOT_HM01) == TRUE)
return TRUE;
@@ -1358,64 +1357,64 @@ static bool8 sub_812BB10(void)
return FALSE;
}
bool8 sub_812BB9C(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
bool8 RunHelpMenuSubroutine(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
switch (a0->field_0E)
switch (helpListMenu->state)
{
case 8:
return sub_812BC54(a0, a1);
return HelpSystemSubroutine_PrintWelcomeMessage(helpListMenu, listMenuItemsBuffer);
case 9:
return sub_812BC80(a0, a1);
return HelpSystemSubroutine_WelcomeWaitButton(helpListMenu, listMenuItemsBuffer);
case 10:
return sub_812BCA8(a0, a1);
return HelpSystemSubroutine_WelcomeEndGotoMenu(helpListMenu, listMenuItemsBuffer);
case 0:
return sub_812BCD0(a0, a1);
return HelpSystemSubroutine_MenuInputHandlerMain(helpListMenu, listMenuItemsBuffer);
case 1:
return sub_812BD2C(a0, a1);
return HelpMenuSubroutine_InitSubmenu(helpListMenu, listMenuItemsBuffer);
case 2:
return sub_812BD64(a0, a1);
return HelpMenuSubroutine_ReturnFromSubmenu(helpListMenu, listMenuItemsBuffer);
case 3:
return sub_812BD98(a0, a1);
return HelpMenuSubroutine_SubmenuInputHandler(helpListMenu, listMenuItemsBuffer);
case 4:
return sub_812BE10(a0, a1);
return HelpMenuSubroutine_HelpItemPrint(helpListMenu, listMenuItemsBuffer);
case 5:
return sub_812BEEC(a0, a1);
return HelpMenuSubroutine_ReturnFromHelpItem(helpListMenu, listMenuItemsBuffer);
case 6:
return sub_812BF18(a0, a1);
return HelpMenuSubroutine_HelpItemWaitButton(helpListMenu, listMenuItemsBuffer);
}
return FALSE;
}
bool8 sub_812BC54(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
bool8 HelpSystemSubroutine_PrintWelcomeMessage(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
sub_812BF74(gUnknown_841DFA5);
sub_812BF5C();
PrintTextOnPanel2Row52RightAlign(gUnknown_841DFA5);
PrintWelcomeMessageOnPanel1();
sub_813BDA4(1);
sub_813BD5C(1);
a0->field_0E = 9;
helpListMenu->state = 9;
return TRUE;
}
bool8 sub_812BC80(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
bool8 HelpSystemSubroutine_WelcomeWaitButton(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
if (JOY_NEW(A_BUTTON))
{
PlaySE(SE_SELECT);
a0->field_0E = 10;
helpListMenu->state = 10;
}
return TRUE;
}
bool8 sub_812BCA8(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
bool8 HelpSystemSubroutine_WelcomeEndGotoMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
gUnknown_3005E9C[2] = 0;
sub_812BF94(a0);
sub_812B4D8(a0, a1);
a0->field_0E = 0;
sHelpSystemState[2] = 0;
ResetHelpSystemCursor(helpListMenu);
BuildAndPrintMainTopicsListMenu(helpListMenu, listMenuItemsBuffer);
helpListMenu->state = 0;
return TRUE;
}
bool8 sub_812BCD0(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
bool8 HelpSystemSubroutine_MenuInputHandlerMain(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
s32 v0 = HelpSystem_GetMenuInput();
switch (v0)
@@ -1425,42 +1424,42 @@ bool8 sub_812BCD0(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
return FALSE;
case -5:
case -4:
sub_812BF9C(a0, a1);
PrintHelpSystemTopicMouseoverDescription(helpListMenu, listMenuItemsBuffer);
break;
case -3:
case -1:
break;
default:
gUnknown_3005E9C[1] = v0;
a0->field_0E = 1;
sHelpSystemState[1] = v0;
helpListMenu->state = 1;
break;
}
return TRUE;
}
bool8 sub_812BD2C(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
bool8 HelpMenuSubroutine_InitSubmenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
gUnknown_3005E9C[0] = 1;
gUnknown_3005E9C[2] = a0->field_0D;
sub_812BF94(a0);
sub_812B5A8(a0, a1);
sHelpSystemState[0] = 1;
sHelpSystemState[2] = helpListMenu->cursorPos;
ResetHelpSystemCursor(helpListMenu);
BuildAndPrintSubmenuList(helpListMenu, listMenuItemsBuffer);
sub_813C75C();
HelpSystem_SetInputDelay(2);
a0->field_0E = 3;
helpListMenu->state = 3;
return TRUE;
}
bool8 sub_812BD64(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
bool8 HelpMenuSubroutine_ReturnFromSubmenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
sub_813C004(0, 0);
sub_813C004(1, 0);
gUnknown_3005E9C[0] = 0;
sub_812B4D8(a0, a1);
a0->field_0E = 0;
sHelpSystemState[0] = 0;
BuildAndPrintMainTopicsListMenu(helpListMenu, listMenuItemsBuffer);
helpListMenu->state = 0;
return TRUE;
}
bool8 sub_812BD98(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
bool8 HelpMenuSubroutine_SubmenuInputHandler(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
s32 v0 = HelpSystem_GetMenuInput();
switch (v0)
@@ -1468,7 +1467,7 @@ bool8 sub_812BD98(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
case -6:
return FALSE;
case -2:
a0->field_0E = 2;
helpListMenu->state = 2;
break;
case -5:
case -4:
@@ -1476,8 +1475,8 @@ bool8 sub_812BD98(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
case -1:
break;
default:
gUnknown_3005E9C[3] = v0;
a0->field_0E = 4;
sHelpSystemState[3] = v0;
helpListMenu->state = 4;
break;
}
return TRUE;
@@ -1485,60 +1484,60 @@ bool8 sub_812BD98(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
void sub_812BDEC(void)
{
HelpSystem_PrintTextAt(gUnknown_845B080[gUnknown_3005E9C[1]], 0, 0);
HelpSystem_PrintTextAt(sHelpSystemTopicPtrs[sHelpSystemState[1]], 0, 0);
}
bool8 sub_812BE10(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
bool8 HelpMenuSubroutine_HelpItemPrint(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
gUnknown_3005E9C[0] = 2;
sHelpSystemState[0] = 2;
sub_813BDA4(0);
HelpSystem_FillPanel1();
sub_812BF74(gUnknown_841DFBE);
PrintTextOnPanel2Row52RightAlign(gUnknown_841DFBE);
sub_813BDE8(1);
sub_813BEE4(1);
if (gUnknown_3005E9C[1] == 0)
if (sHelpSystemState[1] == 0)
{
HelpSystem_PrintTwoStrings(gUnknown_845B0B0[gUnknown_3005E9C[3]], gUnknown_845B164[gUnknown_3005E9C[3]]);
HelpSystem_PrintTwoStrings(sHelpSystemSpecializedQuestionTextPtrs[sHelpSystemState[3]], sHelpSystemSpecializedAnswerTextPtrs[sHelpSystemState[3]]);
}
else if (gUnknown_3005E9C[1] == 1)
else if (sHelpSystemState[1] == 1)
{
HelpSystem_PrintTwoStrings(gUnknown_845B218[gUnknown_3005E9C[3]], gUnknown_845B2DC[gUnknown_3005E9C[3]]);
HelpSystem_PrintTwoStrings(sHelpSystemMenuTopicTextPtrs[sHelpSystemState[3]], sHelpSystemSpecializedControlsTextPtrs[sHelpSystemState[3]]);
}
else if (gUnknown_3005E9C[1] == 2)
else if (sHelpSystemState[1] == 2)
{
HelpSystem_PrintTwoStrings(gUnknown_845B3A0[gUnknown_3005E9C[3]], gUnknown_845B450[gUnknown_3005E9C[3]]);
HelpSystem_PrintTwoStrings(sHelpSystemSpecializedStringsTextPtrs[sHelpSystemState[3]], sHelpSystemSpecializedStringDefinitionsTextPtrs[sHelpSystemState[3]]);
}
else if (gUnknown_3005E9C[1] == 3)
else if (sHelpSystemState[1] == 3)
{
HelpSystem_PrintTwoStrings(gUnknown_845B500[gUnknown_3005E9C[3]], gUnknown_845B520[gUnknown_3005E9C[3]]);
HelpSystem_PrintTwoStrings(sHelpSystemGeneralTopicTextPtrs[sHelpSystemState[3]], sHelpSystemGeneralTopicDescriptionTextPtrs[sHelpSystemState[3]]);
}
else
{
HelpSystem_PrintTwoStrings(gUnknown_845B540[gUnknown_3005E9C[3]], gUnknown_845B5D0[gUnknown_3005E9C[3]]);
HelpSystem_PrintTwoStrings(sHelpSystemTypeMatchupTextPtrs[sHelpSystemState[3]], sHelpSystemTypeMatchupDescriptionTextPtrs[sHelpSystemState[3]]);
}
sub_813BDA4(1);
sub_813BD5C(1);
a0->field_0E = 6;
helpListMenu->state = 6;
return TRUE;
}
bool8 sub_812BEEC(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
bool8 HelpMenuSubroutine_ReturnFromHelpItem(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
gUnknown_3005E9C[0] = 1;
sub_812B5A8(a0, a1);
sHelpSystemState[0] = 1;
BuildAndPrintSubmenuList(helpListMenu, listMenuItemsBuffer);
sub_813C75C();
HelpSystem_SetInputDelay(2);
a0->field_0E = 3;
helpListMenu->state = 3;
return TRUE;
}
bool8 sub_812BF18(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
bool8 HelpMenuSubroutine_HelpItemWaitButton(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
if (JOY_NEW(B_BUTTON) || JOY_NEW(A_BUTTON))
{
PlaySE(SE_SELECT);
a0->field_0E = 5;
helpListMenu->state = 5;
return TRUE;
}
if (JOY_NEW(L_BUTTON | R_BUTTON))
@@ -1546,13 +1545,13 @@ bool8 sub_812BF18(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
return TRUE;
}
static void sub_812BF5C(void)
static void PrintWelcomeMessageOnPanel1(void)
{
HelpSystem_FillPanel1();
HelpSystem_PrintTextAt(gUnknown_81B2FC9, 0, 0);
}
static void sub_812BF74(const u8 * str)
static void PrintTextOnPanel2Row52RightAlign(const u8 * str)
{
HelpSystem_FillPanel2();
HelpSystem_PrintTextRightAlign_Row52(str);
@@ -1560,21 +1559,21 @@ static void sub_812BF74(const u8 * str)
u8 sub_812BF88(void)
{
return gUnknown_3005E9C[0];
return sHelpSystemState[0];
}
static void sub_812BF94(struct HelpSystemListMenu * a0)
static void ResetHelpSystemCursor(struct HelpSystemListMenu * helpListMenu)
{
a0->field_0C = 0;
a0->field_0D = 0;
helpListMenu->itemsAbove = 0;
helpListMenu->cursorPos = 0;
}
static void sub_812BF9C(struct HelpSystemListMenu * a0, struct ListMenuItem * a1)
static void PrintHelpSystemTopicMouseoverDescription(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer)
{
s32 index = a1[a0->field_0C + a0->field_0D].index;
s32 index = listMenuItemsBuffer[helpListMenu->itemsAbove + helpListMenu->cursorPos].index;
if (index == -2)
HelpSystem_PrintText_813C584(gUnknown_845B098[5]);
HelpSystem_PrintText_813C584(sHelpSystemTopicMouseoverDescriptionPtrs[5]);
else
HelpSystem_PrintText_813C584(gUnknown_845B098[index]);
HelpSystem_PrintText_813C584(sHelpSystemTopicMouseoverDescriptionPtrs[index]);
sub_813BE30(1);
}
+2 -2
View File
@@ -1431,7 +1431,7 @@ static void sub_80EDB70(struct IntroSequenceData * this)
{
this->field_0018->pos1.x += this->field_0018->pos2.x;
this->field_0018->pos1.y += this->field_0018->pos2.y;
sub_8007FFC(this->field_0018, 0, 0x2A);
obj_pos2_update_enable(this->field_0018, 0, 0x2A);
this->field_0018->callback = SpriteCallbackDummy;
StartSpriteAffineAnim(this->field_0018, 1);
}
@@ -1448,7 +1448,7 @@ static void sub_80EDBAC(struct IntroSequenceData * this)
{
StartSpriteAffineAnim(this->field_0028[i], 1);
this->field_0028[i]->callback = nullsub_83;
sub_8007FFC(this->field_0028[i], gUnknown_840BBB8[i][0], gUnknown_840BBB8[i][1]);
obj_pos2_update_enable(this->field_0028[i], gUnknown_840BBB8[i][0], gUnknown_840BBB8[i][1]);
}
}
+1 -1
View File
@@ -309,7 +309,7 @@ static void MoveRelearnerLoadBgGfx(void)
FillBgTilemapBufferRect(0, 0x000, 0, 0, 30, 20, 0xF);
SetBgTilemapBuffer(1, sMoveRelearner->bg1TilemapBuffer);
TextWindow_SetUserSelectedFrame(0, 1, 0xE0);
sub_8107D38(0xD0, 1);
ListMenuLoadStdPalAt(0xD0, 1);
LoadPalette(gUnknown_8E97DDC, 0x00, 0x20);
DecompressAndLoadBgGfxUsingHeap(1, gUnknown_8E97DFC, 0, 0, 0);
CopyToBgTilemapBuffer(1, gUnknown_8E97EC4, 0, 0);
+402
View File
@@ -0,0 +1,402 @@
#include "global.h"
#include "librfu.h"
static void sio32intr_clock_master(void);
static void sio32intr_clock_slave(void);
static u16 handshake_wait(u16 slot);
static void STWI_set_timer_in_RAM(u8 count);
static void STWI_stop_timer_in_RAM(void);
static void STWI_init_slave(void);
static void Callback_Dummy_M(int reqCommandId, int error, void (*callbackM)());
static void Callback_Dummy_S(u16 reqCommandId, void (*callbackS)(u16));
static void Callback_Dummy_ID(void (*callbackId)(void));
void IntrSIO32(void)
{
if (gSTWIStatus->state == 10)
{
if (gSTWIStatus->callbackID != NULL)
Callback_Dummy_ID(gSTWIStatus->callbackID);
}
else
{
if (gSTWIStatus->msMode == AGB_CLK_MASTER)
sio32intr_clock_master();
else
sio32intr_clock_slave();
}
}
static void sio32intr_clock_master(void)
{
u32 regSIODATA32;
u32 ackLen;
STWI_set_timer_in_RAM(80);
regSIODATA32 = REG_SIODATA32;
if (gSTWIStatus->state == 0) // master send req
{
if (regSIODATA32 == 0x80000000)
{
if (gSTWIStatus->reqNext <= gSTWIStatus->reqLength)
{
REG_SIODATA32 = ((u32*)gSTWIStatus->txPacket->rfuPacket8.data)[gSTWIStatus->reqNext];
gSTWIStatus->reqNext++;
}
else
{
gSTWIStatus->state = 1; // master wait ack
REG_SIODATA32 = 0x80000000;
}
}
else
{
STWI_stop_timer_in_RAM();
STWI_set_timer_in_RAM(130);
return;
}
}
else if (gSTWIStatus->state == 1) // master wait ack
{
if ((regSIODATA32 & 0xFFFF0000) == 0x99660000)
{
gSTWIStatus->ackNext = 0;
((u32*)gSTWIStatus->rxPacket)[gSTWIStatus->ackNext] = regSIODATA32;
gSTWIStatus->ackNext++;
gSTWIStatus->ackActiveCommand = regSIODATA32;
gSTWIStatus->ackLength = ackLen = regSIODATA32 >> 8;
if ((ackLen = gSTWIStatus->ackLength) >= gSTWIStatus->ackNext)
{
gSTWIStatus->state = 2; // master receive ack
REG_SIODATA32 = 0x80000000;
}
else
{
gSTWIStatus->state = 3; // master done ack
}
}
else
{
STWI_stop_timer_in_RAM();
STWI_set_timer_in_RAM(130);
return;
}
}
else if (gSTWIStatus->state == 2) // master receive ack
{
((u32*)gSTWIStatus->rxPacket)[gSTWIStatus->ackNext] = regSIODATA32;
gSTWIStatus->ackNext++;
if (gSTWIStatus->ackLength < gSTWIStatus->ackNext)
gSTWIStatus->state = 3; // master done ack
else
REG_SIODATA32 = 0x80000000;
}
if (handshake_wait(1) == 1)
return;
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS | SIO_MULTI_SD;
if (handshake_wait(0) == 1)
return;
STWI_stop_timer_in_RAM();
if (gSTWIStatus->state == 3) // master done ack
{
if (
gSTWIStatus->ackActiveCommand == (0x80 | ID_MS_CHANGE_REQ)
|| gSTWIStatus->ackActiveCommand == (0x80 | ID_DATA_TX_AND_CHANGE_REQ)
|| gSTWIStatus->ackActiveCommand == (0x80 | ID_UNK35_REQ)
|| gSTWIStatus->ackActiveCommand == (0x80 | ID_RESUME_RETRANSMIT_AND_CHANGE_REQ)
)
{
gSTWIStatus->msMode = AGB_CLK_SLAVE;
REG_SIODATA32 = 0x80000000;
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS;
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS | SIO_ENABLE;
gSTWIStatus->state = 5; // slave receive req init
}
else
{
if (gSTWIStatus->ackActiveCommand == 0xEE)
{
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;
gSTWIStatus->state = 4; // error
gSTWIStatus->error = ERR_REQ_CMD_ACK_REJECTION;
}
else
{
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;
gSTWIStatus->state = 4; // error
}
}
gSTWIStatus->sending = 0;
if (gSTWIStatus->callbackM != NULL)
Callback_Dummy_M(gSTWIStatus->reqActiveCommand, gSTWIStatus->error, gSTWIStatus->callbackM);
}
else
{
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS | SIO_ENABLE;
}
}
static void sio32intr_clock_slave(void)
{
u32 regSIODATA32;
u32 r0;
register u32 reqLen asm("r2");
gSTWIStatus->timerActive = 0;
STWI_set_timer_in_RAM(100);
if (handshake_wait(0) == 1)
return;
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS | SIO_MULTI_SD;
regSIODATA32 = REG_SIODATA32;
if (gSTWIStatus->state == 5) // slave receive req init
{
((u32*)gSTWIStatus->rxPacket)[0] = regSIODATA32;
gSTWIStatus->reqNext = 1;
r0 = 0x99660000;
if ((regSIODATA32 >> 16) == (r0 >> 16))
{
gSTWIStatus->reqLength = reqLen = regSIODATA32 >> 8;
gSTWIStatus->reqActiveCommand = regSIODATA32;
if (gSTWIStatus->reqLength == 0)
{
if (
gSTWIStatus->reqActiveCommand == ID_MS_CHANGE_REQ
|| gSTWIStatus->reqActiveCommand == ID_DATA_READY_AND_CHANGE_REQ
|| gSTWIStatus->reqActiveCommand == ID_DISCONNECTED_AND_CHANGE_REQ
|| gSTWIStatus->reqActiveCommand == ID_UNK36_REQ
)
{
gSTWIStatus->ackActiveCommand = gSTWIStatus->reqActiveCommand + 0x80;
((u32*)gSTWIStatus->txPacket)[0] = 0x99660000 + gSTWIStatus->ackActiveCommand;
gSTWIStatus->ackLength = 0;
}
else
{
((u32*)gSTWIStatus->txPacket)[0] = 0x996601EE;
if (gSTWIStatus->reqActiveCommand >= 0x10 && gSTWIStatus->reqActiveCommand <= 0x3D)
{
((u32*)gSTWIStatus->txPacket)[1] = 1;
}
else
{
((u32*)gSTWIStatus->txPacket)[1] = 2;
}
gSTWIStatus->ackLength = 1;
gSTWIStatus->error = ERR_REQ_CMD_ACK_REJECTION;
}
REG_SIODATA32 = ((u32*)gSTWIStatus->txPacket)[0];
gSTWIStatus->ackNext = 1;
gSTWIStatus->state = 7; // slave send ack
}
else
{
REG_SIODATA32 = 0x80000000;
gSTWIStatus->reqNext = 1;
gSTWIStatus->state = 6; // slave receive req
}
}
else
{
STWI_stop_timer_in_RAM();
STWI_set_timer_in_RAM(100);
return;
}
}
else if (gSTWIStatus->state == 6) // slave receive req
{
((u32*)gSTWIStatus->rxPacket)[gSTWIStatus->reqNext] = regSIODATA32;
gSTWIStatus->reqNext++;
if (gSTWIStatus->reqLength < gSTWIStatus->reqNext)
{
if (
gSTWIStatus->reqActiveCommand == ID_DATA_READY_AND_CHANGE_REQ
|| gSTWIStatus->reqActiveCommand == ID_DISCONNECTED_AND_CHANGE_REQ
|| gSTWIStatus->reqActiveCommand == ID_UNK36_REQ
)
{
gSTWIStatus->ackActiveCommand = gSTWIStatus->reqActiveCommand + 0x80;
((u32*)gSTWIStatus->txPacket)[0] = 0x99660000 | gSTWIStatus->ackActiveCommand;
gSTWIStatus->ackLength = 0;
}
else
{
((u32*)gSTWIStatus->txPacket)[0] = 0x996601EE;
if (gSTWIStatus->reqActiveCommand >= 0x10 && gSTWIStatus->reqActiveCommand <= 0x3D)
{
((u32*)gSTWIStatus->txPacket)[1] = 1;
}
else
{
((u32*)gSTWIStatus->txPacket)[1] = 2;
}
gSTWIStatus->ackLength = 1;
gSTWIStatus->error = ERR_REQ_CMD_ACK_REJECTION;
}
REG_SIODATA32 = ((u32*)gSTWIStatus->txPacket)[0];
gSTWIStatus->ackNext = 1;
gSTWIStatus->state = 7; // slave send ack
}
else
{
REG_SIODATA32 = 0x80000000;
}
}
else if (gSTWIStatus->state == 7) // slave send ack
{
if (regSIODATA32 == 0x80000000)
{
if (gSTWIStatus->ackLength < gSTWIStatus->ackNext)
{
gSTWIStatus->state = 8; // slave done ack
}
else
{
REG_SIODATA32 = ((u32*)gSTWIStatus->txPacket)[gSTWIStatus->ackNext];
gSTWIStatus->ackNext++;
}
}
else
{
STWI_stop_timer_in_RAM();
STWI_set_timer_in_RAM(100);
return;
}
}
if (handshake_wait(1) == 1)
return;
if (gSTWIStatus->state == 8) // slave done ack
{
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS;
STWI_stop_timer_in_RAM();
if (gSTWIStatus->error == ERR_REQ_CMD_ACK_REJECTION)
{
STWI_init_slave();
if (gSTWIStatus->callbackS != NULL)
{
Callback_Dummy_S(0x1EE, gSTWIStatus->callbackS);
}
}
else
{
REG_SIODATA32 = 0;
REG_SIOCNT = 0;
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;
gSTWIStatus->msMode = AGB_CLK_MASTER;
gSTWIStatus->state = 0; // master send req
if (gSTWIStatus->callbackS != NULL)
{
Callback_Dummy_S((gSTWIStatus->reqLength << 8) | (gSTWIStatus->reqActiveCommand), gSTWIStatus->callbackS);
}
}
}
else
{
REG_IME = 0;
if (REG_TM0CNT_H & TIMER_ENABLE)
{
if ((REG_TM0CNT_H & 0x03) == TIMER_1CLK)
{
while (REG_TM0CNT_L > 0xFF9B);
}
else
{
while (REG_TM0CNT_L > 0xFFFE);
}
}
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS;
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS | SIO_ENABLE;
REG_IME = 1;
}
}
static u16 handshake_wait(u16 slot)
{
do
{
if ((gSTWIStatus->timerActive & 0xFF) == 1)
{
gSTWIStatus->timerActive = 0;
return 1;
}
} while ((REG_SIOCNT & SIO_MULTI_SI) != (slot << SIO_MULTI_SI_SHIFT));
return 0;
}
static void STWI_set_timer_in_RAM(u8 count)
{
vu16* regTMCNTL = (vu16*)(REG_ADDR_TMCNT_L + gSTWIStatus->timerSelect * 4);
vu16* regTMCNTH = (vu16*)(REG_ADDR_TMCNT_H + gSTWIStatus->timerSelect * 4);
REG_IME = 0;
switch (count)
{
case 50:
*regTMCNTL = 0xFCCB;
gSTWIStatus->timerState = 1;
break;
case 80:
*regTMCNTL = 0xFAE0;
gSTWIStatus->timerState = 2;
break;
case 100:
*regTMCNTL = 0xF996;
gSTWIStatus->timerState = 3;
break;
case 130:
*regTMCNTL = 0xF7AD;
gSTWIStatus->timerState = 4;
break;
}
*regTMCNTH = TIMER_ENABLE | TIMER_64CLK | TIMER_256CLK | TIMER_INTR_ENABLE;
REG_IF = INTR_FLAG_TIMER0 << gSTWIStatus->timerSelect;
REG_IME = 1;
}
static void STWI_stop_timer_in_RAM(void)
{
gSTWIStatus->timerState = 0;
REG_TMCNT_L(gSTWIStatus->timerSelect) = 0;
REG_TMCNT_H(gSTWIStatus->timerSelect) = 0;
}
static void STWI_init_slave(void)
{
gSTWIStatus->state = 5; // slave receive req init
gSTWIStatus->msMode = AGB_CLK_SLAVE;
gSTWIStatus->reqLength = 0;
gSTWIStatus->reqNext = 0;
gSTWIStatus->reqActiveCommand = 0;
gSTWIStatus->ackLength = 0;
gSTWIStatus->ackNext = 0;
gSTWIStatus->ackActiveCommand = 0;
gSTWIStatus->timerState = 0;
gSTWIStatus->timerActive = 0;
gSTWIStatus->error = 0;
gSTWIStatus->recoveryCount = 0;
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS | SIO_ENABLE;
}
NAKED
static void Callback_Dummy_M(int reqCommandId, int error, void (*callbackM)())
{
asm("bx r2");
}
NAKED
static void Callback_Dummy_S(u16 reqCommandId, void (*callbackS)(u16))
{
asm("bx r1");
}
NAKED
static void Callback_Dummy_ID(void (*callbackId)(void))
{
asm("bx r0");
}
+904 -840
View File
File diff suppressed because it is too large Load Diff
+76 -66
View File
@@ -4,44 +4,56 @@ static void Sio32IDIntr(void);
static void Sio32IDInit(void);
static s32 Sio32IDMain(void);
struct RfuSIO32Id
{
u8 MS_mode;
u8 state;
u16 count;
u16 send_id;
u16 recv_id;
u16 unk8; // unused
u16 lastId;
};
struct RfuSIO32Id gRfuSIO32Id;
static const u16 Sio32ConnectionData[] = { 0x494e, 0x544e, 0x4e45, 0x4f44 }; // NINTENDO
static const char Sio32IDLib_Var[] = "Sio32ID_030820";
s32 AgbRFU_checkID(u8 r5)
s32 AgbRFU_checkID(u8 maxTries)
{
u16 r8;
vu16 *r4;
s32 r6;
u16 ieBak;
vu16 *regTMCNTL;
s32 id;
// Interrupts must be enabled
if (REG_IME == 0)
return -1;
r8 = REG_IE;
ieBak = REG_IE;
gSTWIStatus->state = 10;
STWI_set_Callback_ID(Sio32IDIntr);
Sio32IDInit();
r4 = &REG_TMCNT_L(gSTWIStatus->timerSelect);
r5 *= 8;
while (--r5 != 0xFF)
regTMCNTL = &REG_TMCNT_L(gSTWIStatus->timerSelect);
maxTries *= 8;
while (--maxTries != 0xFF)
{
r6 = Sio32IDMain();
if (r6 != 0)
id = Sio32IDMain();
if (id != 0)
break;
r4[1] = 0;
r4[0] = 0;
r4[1] = TIMER_1024CLK | TIMER_ENABLE;
while (r4[0] < 32)
regTMCNTL[1] = 0;
regTMCNTL[0] = 0;
regTMCNTL[1] = TIMER_1024CLK | TIMER_ENABLE;
while (regTMCNTL[0] < 32)
;
r4[1] = 0;
r4[0] = 0;
regTMCNTL[1] = 0;
regTMCNTL[0] = 0;
}
REG_IME = 0;
REG_IE = r8;
REG_IE = ieBak;
REG_IME = 1;
gSTWIStatus->state = 0;
STWI_set_Callback_ID(NULL);
return r6;
return id;
}
static void Sio32IDInit(void)
@@ -58,107 +70,105 @@ static void Sio32IDInit(void)
static s32 Sio32IDMain(void)
{
u8 r12;
switch (r12 = gRfuSIO32Id.unk1)
switch (gRfuSIO32Id.state)
{
case 0:
gRfuSIO32Id.unk0 = 1;
gRfuSIO32Id.MS_mode = AGB_CLK_MASTER;
REG_SIOCNT |= SIO_38400_BPS;
REG_IME = r12;
REG_IME = 0;
REG_IE |= INTR_FLAG_SERIAL;
REG_IME = 1;
gRfuSIO32Id.unk1 = 1;
gRfuSIO32Id.state = 1;
*(vu8 *)&REG_SIOCNT |= SIO_ENABLE;
break;
case 1:
if (gRfuSIO32Id.unkA == 0)
if (gRfuSIO32Id.lastId == 0)
{
if (gRfuSIO32Id.unk0 == 1)
if (gRfuSIO32Id.MS_mode == AGB_CLK_MASTER)
{
if (gRfuSIO32Id.unk2 == 0)
if (gRfuSIO32Id.count == 0)
{
REG_IME = gRfuSIO32Id.unk2;
REG_IME = 0;
REG_SIOCNT |= SIO_ENABLE;
REG_IME = r12;
REG_IME = 1;
}
}
else if (gRfuSIO32Id.unk4 != 0x8001 && !gRfuSIO32Id.unk2)
else if (gRfuSIO32Id.send_id != RFU_ID && !gRfuSIO32Id.count)
{
REG_IME = gRfuSIO32Id.unk2;
REG_IME = 0;
REG_IE &= ~INTR_FLAG_SERIAL;
REG_IME = r12;
REG_SIOCNT = gRfuSIO32Id.unk2;
REG_IME = 1;
REG_SIOCNT = 0;
REG_SIOCNT = SIO_32BIT_MODE;
REG_IF = INTR_FLAG_SERIAL;
REG_SIOCNT |= SIO_INTR_ENABLE | SIO_ENABLE;
REG_IME = gRfuSIO32Id.unk2;
REG_IME = 0;
REG_IE |= INTR_FLAG_SERIAL;
REG_IME = r12;
REG_IME = 1;
}
break;
}
else
{
gRfuSIO32Id.unk1 = 2;
gRfuSIO32Id.state = 2;
// fallthrough
}
default:
return gRfuSIO32Id.unkA;
return gRfuSIO32Id.lastId;
}
return 0;
}
static void Sio32IDIntr(void)
{
u32 r5;
u16 r0;
u32 regSIODATA32;
u16 delay;
#ifndef NONMATCHING
register u32 r1 asm("r1");
register u16 r0_ asm("r0");
register u32 rfuSIO32IdUnk0_times_16 asm("r1");
register u16 negRfuSIO32IdUnk6 asm("r0");
#else
u32 r1;
u16 r0_;
u32 rfuSIO32IdUnk0_times_16;
u16 negRfuSIO32IdUnk6;
#endif
r5 = REG_SIODATA32;
if (gRfuSIO32Id.unk0 != 1)
regSIODATA32 = REG_SIODATA32;
if (gRfuSIO32Id.MS_mode != AGB_CLK_MASTER)
REG_SIOCNT |= SIO_ENABLE;
r1 = 16 * gRfuSIO32Id.unk0; // to handle side effect of inline asm
r1 = (r5 << r1) >> 16;
r5 = (r5 << 16 * (1 - gRfuSIO32Id.unk0)) >> 16;
if (gRfuSIO32Id.unkA == 0)
rfuSIO32IdUnk0_times_16 = 16 * gRfuSIO32Id.MS_mode; // to handle side effect of inline asm
rfuSIO32IdUnk0_times_16 = (regSIODATA32 << rfuSIO32IdUnk0_times_16) >> 16;
regSIODATA32 = (regSIODATA32 << 16 * (1 - gRfuSIO32Id.MS_mode)) >> 16;
if (gRfuSIO32Id.lastId == 0)
{
if (r1 == gRfuSIO32Id.unk6)
if (rfuSIO32IdUnk0_times_16 == gRfuSIO32Id.recv_id)
{
if (gRfuSIO32Id.unk2 > 3)
if (gRfuSIO32Id.count > 3)
{
gRfuSIO32Id.unkA = r5;
gRfuSIO32Id.lastId = regSIODATA32;
}
else if (r1 == (u16)~gRfuSIO32Id.unk4)
else if (rfuSIO32IdUnk0_times_16 == (u16)~gRfuSIO32Id.send_id)
{
r0_ = ~gRfuSIO32Id.unk6;
if (r5 == r0_)
++gRfuSIO32Id.unk2;
negRfuSIO32IdUnk6 = ~gRfuSIO32Id.recv_id;
if (regSIODATA32 == negRfuSIO32IdUnk6)
++gRfuSIO32Id.count;
}
}
else
{
gRfuSIO32Id.unk2 = gRfuSIO32Id.unkA;
gRfuSIO32Id.count = 0;
}
}
if (gRfuSIO32Id.unk2 < 4)
gRfuSIO32Id.unk4 = *(gRfuSIO32Id.unk2 + Sio32ConnectionData);
if (gRfuSIO32Id.count < 4)
gRfuSIO32Id.send_id = *(gRfuSIO32Id.count + Sio32ConnectionData);
else
gRfuSIO32Id.unk4 = 0x8001;
gRfuSIO32Id.unk6 = ~r5;
REG_SIODATA32 = (gRfuSIO32Id.unk4 << 16 * (1 - gRfuSIO32Id.unk0))
+ (gRfuSIO32Id.unk6 << 16 * gRfuSIO32Id.unk0);
if (gRfuSIO32Id.unk0 == 1 && (gRfuSIO32Id.unk2 || r5 == 0x494E))
gRfuSIO32Id.send_id = RFU_ID;
gRfuSIO32Id.recv_id = ~regSIODATA32;
REG_SIODATA32 = (gRfuSIO32Id.send_id << 16 * (1 - gRfuSIO32Id.MS_mode))
+ (gRfuSIO32Id.recv_id << 16 * gRfuSIO32Id.MS_mode);
if (gRfuSIO32Id.MS_mode == AGB_CLK_MASTER && (gRfuSIO32Id.count != 0 || regSIODATA32 == 0x494e))
{
for (r0 = 0; r0 < 600; ++r0)
for (delay = 0; delay < 600; ++delay)
;
if (gRfuSIO32Id.unkA == 0)
if (gRfuSIO32Id.lastId == 0)
REG_SIOCNT |= SIO_ENABLE;
}
}
+42 -39
View File
@@ -28,8 +28,8 @@ void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, b
}
gSTWIStatus->rxPacket = &interruptStruct->rxPacketAlloc;
gSTWIStatus->txPacket = &interruptStruct->txPacketAlloc;
gSTWIStatus->msMode = 1;
gSTWIStatus->state = 0;
gSTWIStatus->msMode = AGB_CLK_MASTER;
gSTWIStatus->state = 0; // master send req
gSTWIStatus->reqLength = 0;
gSTWIStatus->reqNext = 0;
gSTWIStatus->ackLength = 0;
@@ -39,7 +39,7 @@ void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, b
gSTWIStatus->timerActive = 0;
gSTWIStatus->error = 0;
gSTWIStatus->recoveryCount = 0;
gSTWIStatus->unk_2c = 0;
gSTWIStatus->sending = 0;
REG_RCNT = 0x100; // TODO: mystery bit?
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;
STWI_init_Callback_M();
@@ -71,7 +71,7 @@ void AgbRFU_SoftReset(void)
*timerH = 3;
REG_RCNT = 0x80A0;
REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS;
gSTWIStatus->state = 0;
gSTWIStatus->state = 0; // master send req
gSTWIStatus->reqLength = 0;
gSTWIStatus->reqNext = 0;
gSTWIStatus->reqActiveCommand = 0;
@@ -81,9 +81,9 @@ void AgbRFU_SoftReset(void)
gSTWIStatus->timerState = 0;
gSTWIStatus->timerActive = 0;
gSTWIStatus->error = 0;
gSTWIStatus->msMode = 1;
gSTWIStatus->msMode = AGB_CLK_MASTER;
gSTWIStatus->recoveryCount = 0;
gSTWIStatus->unk_2c = 0;
gSTWIStatus->sending = 0;
}
void STWI_set_MS_mode(u8 mode)
@@ -131,12 +131,12 @@ void STWI_set_Callback_S(void (*callbackS)(u16))
void STWI_set_Callback_ID(void (*func)(void)) // name in SDK, but is actually setting a function pointer
{
gSTWIStatus->unk_20 = func;
gSTWIStatus->callbackID = func;
}
u16 STWI_poll_CommandEnd(void)
{
while (gSTWIStatus->unk_2c == TRUE)
while (gSTWIStatus->sending == 1)
;
return gSTWIStatus->error;
}
@@ -195,7 +195,7 @@ void STWI_send_ConfigStatusREQ(void)
}
}
void STWI_send_GameConfigREQ(const u8 *unk1, const u8 *data)
void STWI_send_GameConfigREQ(const u8 *serial_gname, const u8 *uname)
{
u8 *packetBytes;
s32 i;
@@ -203,29 +203,28 @@ void STWI_send_GameConfigREQ(const u8 *unk1, const u8 *data)
if (!STWI_init(ID_GAME_CONFIG_REQ))
{
gSTWIStatus->reqLength = 6;
// TODO: what is unk1
packetBytes = gSTWIStatus->txPacket->rfuPacket8.data;
packetBytes += sizeof(u32);
*(u16 *)packetBytes = *(u16 *)unk1;
*(u16 *)packetBytes = *(u16 *)serial_gname;
packetBytes += sizeof(u16);
unk1 += sizeof(u16);
serial_gname += sizeof(u16);
for (i = 0; i < 14; ++i)
{
*packetBytes = *unk1;
*packetBytes = *serial_gname;
++packetBytes;
++unk1;
++serial_gname;
}
for (i = 0; i < 8; ++i)
{
*packetBytes = *data;
*packetBytes = *uname;
++packetBytes;
++data;
++uname;
}
STWI_start_Command();
}
}
void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3)
void STWI_send_SystemConfigREQ(u16 availSlotFlag, u8 maxMFrame, u8 mcTimer)
{
if (!STWI_init(ID_SYSTEM_CONFIG_REQ))
{
@@ -234,9 +233,9 @@ void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3)
gSTWIStatus->reqLength = 1;
packetBytes = gSTWIStatus->txPacket->rfuPacket8.data;
packetBytes += sizeof(u32);
*packetBytes++ = unk3;
*packetBytes++ = unk2;
*(u16*)packetBytes = unk1;
*packetBytes++ = mcTimer;
*packetBytes++ = maxMFrame;
*(u16*)packetBytes = availSlotFlag;
STWI_start_Command();
}
}
@@ -499,20 +498,17 @@ static void STWI_intr_timer(void)
STWI_stop_timer();
STWI_reset_ClockCounter();
if (gSTWIStatus->callbackM != NULL)
gSTWIStatus->callbackM(255, 0);
gSTWIStatus->callbackM(ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ, 0);
break;
}
}
static void STWI_set_timer(u8 unk)
static void STWI_set_timer(u8 count)
{
vu16 *timerL;
vu16 *timerH;
timerL = &REG_TMCNT_L(gSTWIStatus->timerSelect);
timerH = &REG_TMCNT_H(gSTWIStatus->timerSelect);
vu16 *timerL = &REG_TMCNT_L(gSTWIStatus->timerSelect);
vu16 *timerH = &REG_TMCNT_H(gSTWIStatus->timerSelect);
REG_IME = 0;
switch (unk)
switch (count)
{
case 50:
*timerL = 0xFCCB;
@@ -543,25 +539,31 @@ static void STWI_stop_timer(void)
REG_TMCNT_H(gSTWIStatus->timerSelect) = 0;
}
/*
* Set up STWI to send REQ. Returns 1 if error (see below).
*/
static u16 STWI_init(u8 request)
{
if (!REG_IME)
{
// Can't start sending if IME is disabled.
gSTWIStatus->error = ERR_REQ_CMD_IME_DISABLE;
if (gSTWIStatus->callbackM != NULL)
gSTWIStatus->callbackM(request, gSTWIStatus->error);
return TRUE;
}
else if (gSTWIStatus->unk_2c == TRUE)
else if (gSTWIStatus->sending == 1)
{
// Already sending something. Cancel and error.
gSTWIStatus->error = ERR_REQ_CMD_SENDING;
gSTWIStatus->unk_2c = FALSE;
gSTWIStatus->sending = 0;
if (gSTWIStatus->callbackM != NULL)
gSTWIStatus->callbackM(request, gSTWIStatus->error);
return TRUE;
}
else if(!gSTWIStatus->msMode)
else if (gSTWIStatus->msMode == AGB_CLK_SLAVE)
{
// Can't send if clock slave
gSTWIStatus->error = ERR_REQ_CMD_CLOCK_SLAVE;
if (gSTWIStatus->callbackM != NULL)
gSTWIStatus->callbackM(request, gSTWIStatus->error, gSTWIStatus);
@@ -569,9 +571,10 @@ static u16 STWI_init(u8 request)
}
else
{
gSTWIStatus->unk_2c = TRUE;
// Good to go, start sending
gSTWIStatus->sending = 1;
gSTWIStatus->reqActiveCommand = request;
gSTWIStatus->state = 0;
gSTWIStatus->state = 0; // master send req
gSTWIStatus->reqLength = 0;
gSTWIStatus->reqNext = 0;
gSTWIStatus->ackLength = 0;
@@ -595,7 +598,7 @@ static s32 STWI_start_Command(void)
// but the cast here is required to avoid register issue
*(u32 *)gSTWIStatus->txPacket->rfuPacket8.data = 0x99660000 | (gSTWIStatus->reqLength << 8) | gSTWIStatus->reqActiveCommand;
REG_SIODATA32 = gSTWIStatus->txPacket->rfuPacket32.command;
gSTWIStatus->state = 0;
gSTWIStatus->state = 0; // master send req
gSTWIStatus->reqNext = 1;
imeTemp = REG_IME;
REG_IME = 0;
@@ -608,7 +611,7 @@ static s32 STWI_start_Command(void)
static s32 STWI_restart_Command(void)
{
if (gSTWIStatus->recoveryCount <= 1)
if (gSTWIStatus->recoveryCount < 2)
{
++gSTWIStatus->recoveryCount;
STWI_start_Command();
@@ -618,17 +621,17 @@ static s32 STWI_restart_Command(void)
if (gSTWIStatus->reqActiveCommand == ID_MS_CHANGE_REQ || gSTWIStatus->reqActiveCommand == ID_DATA_TX_AND_CHANGE_REQ || gSTWIStatus->reqActiveCommand == ID_UNK35_REQ || gSTWIStatus->reqActiveCommand == ID_RESUME_RETRANSMIT_AND_CHANGE_REQ)
{
gSTWIStatus->error = ERR_REQ_CMD_CLOCK_DRIFT;
gSTWIStatus->unk_2c = 0;
gSTWIStatus->sending = 0;
if (gSTWIStatus->callbackM != NULL)
gSTWIStatus->callbackM(gSTWIStatus->reqActiveCommand, gSTWIStatus->error);
}
else
{
gSTWIStatus->error = ERR_REQ_CMD_CLOCK_DRIFT;
gSTWIStatus->unk_2c = 0;
gSTWIStatus->sending = 0;
if (gSTWIStatus->callbackM != NULL)
gSTWIStatus->callbackM(gSTWIStatus->reqActiveCommand, gSTWIStatus->error);
gSTWIStatus->state = 4; // TODO: what's 4
gSTWIStatus->state = 4; // error
}
}
return 0;
@@ -636,7 +639,7 @@ static s32 STWI_restart_Command(void)
static s32 STWI_reset_ClockCounter(void)
{
gSTWIStatus->state = 5; // TODO: what is 5
gSTWIStatus->state = 5; // slave receive req init
gSTWIStatus->reqLength = 0;
gSTWIStatus->reqNext = 0;
REG_SIODATA32 = (1 << 31);
+67 -67
View File
@@ -82,14 +82,14 @@ u32 gFiller_3003EC0;
u16 gLinkHeldKeys;
u16 gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH];
u32 gLinkStatus;
bool8 gUnknown_3003F24;
bool8 gLinkAllAcked5FFF;
bool8 gUnknown_3003F28;
bool8 gUnknown_3003F2C[MAX_LINK_PLAYERS];
bool8 gUnknown_3003F30[MAX_LINK_PLAYERS];
u16 gUnknown_3003F34;
bool8 gLinkCommand2FFEAck[MAX_LINK_PLAYERS];
bool8 gLinkCommand5FFFAck[MAX_LINK_PLAYERS];
u16 gLinkCmd5FFFparam;
u8 gSuppressLinkErrorMessage;
bool8 gWirelessCommType;
bool8 gSavedLinkPlayerCount;
u8 gWirelessCommType;
u8 gSavedLinkPlayerCount;
u16 gSendCmd[CMD_LENGTH];
u8 gSavedMultiplayerId;
bool8 gReceivedRemoteLinkPlayers;
@@ -123,8 +123,8 @@ EWRAM_DATA struct {
u8 lastSendQueueCount;
u8 unk_06;
} sLinkErrorBuffer = {};
EWRAM_DATA u16 gUnknown_202285C = 0;
EWRAM_DATA void *gUnknown_2022860 = NULL;
static EWRAM_DATA u16 sStartSend5FFFfailures = 0;
static EWRAM_DATA void *sLinkErrorBgTilemapBuffer = NULL;
static void InitLocalLinkPlayer(void);
static void sub_800978C(void);
@@ -142,13 +142,13 @@ static u16 LinkTestCalcBlockChecksum(const u16 *src, u16 size);
static void LinkTest_prnthex(u32 pos, u8 a0, u8 a1, u8 a2);
static void LinkCB_RequestPlayerDataExchange(void);
static void Task_PrintTestData(u8 taskId);
static void sub_800AB0C(void);
static void sub_800AB38(void);
static void sub_800ABD4(void);
static void sub_800AC00(void);
static void LinkCB_BuildCommand5FFF(void);
static void LinkCB_WaitAckCommand5FFF(void);
static void LinkFunc_Send2FFE_1(void);
static void LinkFunc_Send2FFE_2(void);
static void CheckErrorStatus(void);
static void CB2_PrintErrorMessage(void);
static void sub_800B210(void);
static void SetWirelessCommType0(void);
static void DisableSerial(void);
static void EnableSerial(void);
static bool8 IsSioMultiMaster(void);
@@ -232,16 +232,16 @@ bool8 IsWirelessAdapterConnected(void)
if (gQuestLogState == 2 || gQuestLogState == 3)
return FALSE;
sub_800B1F4();
SetWirelessCommType1();
sub_80F86F4();
sub_80FB128(TRUE);
if (sub_80FD3A4() == RFU_ID)
if (rfu_LMAN_REQBN_softReset_and_checkID() == RFU_ID)
{
rfu_REQ_stopMode();
rfu_waitREQComplete();
return TRUE;
}
sub_800B210();
SetWirelessCommType0();
CloseLink();
RestoreSerialTimer3IntrHandlers();
return FALSE;
@@ -379,8 +379,8 @@ void OpenLink(void)
ResetBlockSend();
gUnknown_3000E4C = 0;
gUnknown_3003F28 = FALSE;
gUnknown_3003F24 = FALSE;
gUnknown_3003F34 = 0;
gLinkAllAcked5FFF = FALSE;
gLinkCmd5FFFparam = 0;
CreateTask(Task_TriggerHandshake, 2);
}
else
@@ -391,8 +391,8 @@ void OpenLink(void)
for (i = 0; i < MAX_LINK_PLAYERS; i++)
{
gRemoteLinkPlayersNotReceived[i] = TRUE;
gUnknown_3003F30[i] = FALSE;
gUnknown_3003F2C[i] = FALSE;
gLinkCommand5FFFAck[i] = FALSE;
gLinkCommand2FFEAck[i] = FALSE;
}
}
@@ -401,7 +401,7 @@ void CloseLink(void)
gReceivedRemoteLinkPlayers = FALSE;
if (gWirelessCommType)
{
sub_80F8DC0();
LinkRfu_Shutdown();
}
gLinkOpen = FALSE;
DisableSerial();
@@ -468,7 +468,7 @@ void LinkTestProcessKeyInput(void)
}
if (JOY_NEW(SELECT_BUTTON))
{
sub_800AAC0();
Link_TryStartSend5FFF();
}
if (gLinkTestDebugValuesEnabled)
{
@@ -613,7 +613,7 @@ void ProcessRecvCmds(u8 unused)
linkPlayer->name[9] = 0;
linkPlayer->name[8] = 0;
}
sub_800B284(linkPlayer);
IntlConvertLinkPlayerName(linkPlayer);
if (strcmp(block->magic1, sASCIIGameFreakInc) != 0
|| strcmp(block->magic2, sASCIIGameFreakInc) != 0)
{
@@ -632,10 +632,10 @@ void ProcessRecvCmds(u8 unused)
}
break;
case LINKCMD_0x5FFF:
gUnknown_3003F30[i] = TRUE;
gLinkCommand5FFFAck[i] = TRUE;
break;
case LINKCMD_0x2FFE:
gUnknown_3003F2C[i] = TRUE;
gLinkCommand2FFEAck[i] = TRUE;
break;
case LINKCMD_0xAAAA:
sub_800A3CC();
@@ -701,7 +701,7 @@ void BuildSendCmd(u16 command)
break;
case LINKCMD_0x5FFF:
gSendCmd[0] = LINKCMD_0x5FFF;
gSendCmd[1] = gUnknown_3003F34;
gSendCmd[1] = gLinkCmd5FFFparam;
break;
case LINKCMD_0x5566:
gSendCmd[0] = LINKCMD_0x5566;
@@ -721,7 +721,7 @@ void sub_8009FE8(void)
{
if (gWirelessCommType)
{
sub_80F9828();
StartSendingKeysToRfu();
}
gLinkCallback = sub_800A040;
}
@@ -1312,54 +1312,54 @@ u8 sub_800AA74(void)
return gUnknown_3000E50;
}
void sub_800AA80(u16 a0)
void Link_StartSend5FFFwithParam(u16 a0)
{
if (gWirelessCommType == 1)
{
task_add_05_task_del_08FA224_when_no_RfuFunc();
Rfu_BeginBuildAndSendCommand5F();
}
else
{
if (gLinkCallback == NULL)
{
gLinkCallback = sub_800AB0C;
gUnknown_3003F24 = FALSE;
gUnknown_3003F34 = a0;
gLinkCallback = LinkCB_BuildCommand5FFF;
gLinkAllAcked5FFF = FALSE;
gLinkCmd5FFFparam = a0;
}
}
}
void sub_800AAC0(void)
void Link_TryStartSend5FFF(void)
{
if (gWirelessCommType == 1)
{
task_add_05_task_del_08FA224_when_no_RfuFunc();
Rfu_BeginBuildAndSendCommand5F();
}
else
{
if (gLinkCallback != NULL)
{
gUnknown_202285C++;
sStartSend5FFFfailures++;
}
else
{
gLinkCallback = sub_800AB0C;
gUnknown_3003F24 = FALSE;
gUnknown_3003F34 = 0;
gLinkCallback = LinkCB_BuildCommand5FFF;
gLinkAllAcked5FFF = FALSE;
gLinkCmd5FFFparam = 0;
}
}
}
static void sub_800AB0C(void)
static void LinkCB_BuildCommand5FFF(void)
{
if (gLastRecvQueueCount == 0)
{
BuildSendCmd(LINKCMD_0x5FFF);
gLinkCallback = sub_800AB38;
gLinkCallback = LinkCB_WaitAckCommand5FFF;
}
}
static void sub_800AB38(void)
static void LinkCB_WaitAckCommand5FFF(void)
{
int i;
unsigned count;
@@ -1369,7 +1369,7 @@ static void sub_800AB38(void)
count = 0;
for (i = 0; i < linkPlayerCount; i++)
{
if (gUnknown_3003F30[i])
if (gLinkCommand5FFFAck[i])
{
count++;
}
@@ -1380,36 +1380,36 @@ static void sub_800AB38(void)
gLinkVSyncDisabled = TRUE;
CloseLink();
gLinkCallback = NULL;
gUnknown_3003F24 = TRUE;
gLinkAllAcked5FFF = TRUE;
}
}
void sub_800AB9C(void)
void PrepareSendLinkCmd2FFE_or_RfuCmd6600(void)
{
if (gWirelessCommType == 1)
{
sub_80FA42C();
LinkRfu_SetRfuFuncToSend6600();
}
else
{
if (gLinkCallback == NULL)
{
gLinkCallback = sub_800ABD4;
gLinkCallback = LinkFunc_Send2FFE_1;
}
gUnknown_3003F24 = FALSE;
gLinkAllAcked5FFF = FALSE;
}
}
static void sub_800ABD4(void)
static void LinkFunc_Send2FFE_1(void)
{
if (gLastRecvQueueCount == 0)
{
BuildSendCmd(LINKCMD_0x2FFE);
gLinkCallback = sub_800AC00;
gLinkCallback = LinkFunc_Send2FFE_2;
}
}
static void sub_800AC00(void)
static void LinkFunc_Send2FFE_2(void)
{
u8 i;
u8 linkPlayerCount;
@@ -1417,7 +1417,7 @@ static void sub_800AC00(void)
linkPlayerCount = GetLinkPlayerCount();
for (i = 0; i < linkPlayerCount; i++)
{
if (!gUnknown_3003F2C[i])
if (!gLinkCommand2FFEAck[i])
{
break;
}
@@ -1426,7 +1426,7 @@ static void sub_800AC00(void)
{
for (i = 0; i < MAX_LINK_PLAYERS; i++)
{
gUnknown_3003F2C[i] = FALSE;
gLinkCommand2FFEAck[i] = FALSE;
}
gLinkCallback = NULL;
}
@@ -1448,7 +1448,7 @@ static void CheckErrorStatus(void)
}
}
void sub_800ACBC(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 unk_06)
void SetLinkErrorFromRfu(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 unk_06)
{
sLinkErrorBuffer.status = status;
sLinkErrorBuffer.lastSendQueueCount = lastSendQueueCount;
@@ -1477,12 +1477,12 @@ void CB2_LinkError(void)
{
gWirelessCommType = 3;
}
sub_80F85F8();
ResetLinkRfuGFLayer();
}
SetVBlankCallback(sub_800978C);
ResetBgsAndClearDma3BusyFlags(0);
ResetBgsAndClearDma3BusyFlags(FALSE);
InitBgsFromTemplates(0, sLinkErrorBgTemplates, 2);
gUnknown_2022860 = tilemapBuffer = malloc(0x800);
sLinkErrorBgTilemapBuffer = tilemapBuffer = malloc(0x800);
SetBgTilemapBuffer(1, tilemapBuffer);
if (InitWindows(sLinkErrorWindowTemplates))
{
@@ -1603,12 +1603,12 @@ static void CB2_PrintErrorMessage(void)
bool8 GetSioMultiSI(void)
{
return (REG_SIOCNT & 0x04) != 0;
return (REG_SIOCNT & SIO_MULTI_SI) != 0;
}
static bool8 IsSioMultiMaster(void)
{
return (REG_SIOCNT & 0x8) && !(REG_SIOCNT & 0x04);
return (REG_SIOCNT & SIO_MULTI_SD) && !(REG_SIOCNT & SIO_MULTI_SI);
}
bool8 IsLinkConnectionEstablished(void)
@@ -1626,7 +1626,7 @@ bool8 HasLinkErrorOccurred(void)
return gLinkErrorOccurred;
}
void sub_800B0B4(void)
void PrepareLocalLinkPlayerBlock(void)
{
struct LinkPlayerBlock * block;
@@ -1638,7 +1638,7 @@ void sub_800B0B4(void)
memcpy(gBlockSendBuffer, block, sizeof(*block));
}
void sub_800B110(u32 who)
void LinkPlayerFromBlock(u32 who)
{
u8 who_ = who;
struct LinkPlayerBlock * block;
@@ -1647,7 +1647,7 @@ void sub_800B110(u32 who)
block = (struct LinkPlayerBlock *)gBlockRecvBuffer[who_];
player = &gLinkPlayers[who_];
*player = block->linkPlayer;
sub_800B284(player);
IntlConvertLinkPlayerName(player);
if (strcmp(block->magic1, sASCIIGameFreakInc) != 0 || strcmp(block->magic2, sASCIIGameFreakInc) != 0)
{
SetMainCallback2(CB2_LinkError);
@@ -1670,8 +1670,8 @@ bool8 HandleLinkConnection(void)
}
else
{
r4 = sub_80FAE94();
r5 = sub_80FAEF0();
r4 = LinkRfuMain1();
r5 = LinkRfuMain2();
if (sub_8058318() == TRUE)
{
if (r4 == TRUE || IsRfuRecvQueueEmpty() || r5)
@@ -1683,7 +1683,7 @@ bool8 HandleLinkConnection(void)
return FALSE;
}
void sub_800B1F4(void)
void SetWirelessCommType1(void)
{
if (gReceivedRemoteLinkPlayers == 0)
{
@@ -1691,7 +1691,7 @@ void sub_800B1F4(void)
}
}
static void sub_800B210(void)
static void SetWirelessCommType0(void)
{
if (gReceivedRemoteLinkPlayers == 0)
{
@@ -1699,7 +1699,7 @@ static void sub_800B210(void)
}
}
void sub_800B22C(void)
void SetWirelessCommType0_UnusedCopy(void)
{
if (gReceivedRemoteLinkPlayers == 0)
{
@@ -1725,7 +1725,7 @@ bool32 sub_800B270(void)
return FALSE;
}
void sub_800B284(struct LinkPlayer * player)
void IntlConvertLinkPlayerName(struct LinkPlayer * player)
{
player->name[10] = player->name[8];
ConvertInternationalString(player->name, player->language);
-1381
View File
File diff suppressed because it is too large Load Diff
+781 -754
View File
File diff suppressed because it is too large Load Diff
+110 -97
View File
@@ -166,7 +166,7 @@ static const struct SpriteTemplate sWirelessStatusIndicatorSpriteTemplate = {
SpriteCallbackDummy
};
void sub_80FC478(struct UnkRfuStruct_2_Sub_124 *ptr)
void RFU_queue_20_70_reset(struct UnkRfuStruct_2_Sub_124 *queue)
{
s32 i;
s32 j;
@@ -175,16 +175,16 @@ void sub_80FC478(struct UnkRfuStruct_2_Sub_124 *ptr)
{
for (j = 0; j < 70; j++)
{
ptr->unk_00[i][j] = 0;
queue->slots[i][j] = 0;
}
}
ptr->unk_8c1 = 0;
ptr->unk_8c0 = 0;
ptr->unk_8c2 = 0;
ptr->unk_8c3 = 0;
queue->send_slot = 0;
queue->recv_slot = 0;
queue->count = 0;
queue->full = 0;
}
void sub_80FC4D4(struct UnkRfuStruct_2_Sub_9e8 *ptr)
void RFU_queue_40_14_reset(struct UnkRfuStruct_2_Sub_9e8 *ptr)
{
s32 i;
s32 j;
@@ -193,16 +193,16 @@ void sub_80FC4D4(struct UnkRfuStruct_2_Sub_9e8 *ptr)
{
for (j = 0; j < 14; j++)
{
ptr->unk_00[i][j] = 0;
ptr->slots[i][j] = 0;
}
}
ptr->unk_231 = 0;
ptr->unk_230 = 0;
ptr->unk_232 = 0;
ptr->unk_233 = 0;
ptr->send_slot = 0;
ptr->recv_slot = 0;
ptr->count = 0;
ptr->full = 0;
}
static void sub_80FC530(struct UnkRfuStruct_Sub_Unused *ptr)
static void RFU_queue_2_256_reset(struct UnkRfuStruct_Sub_Unused *ptr)
{
s32 i;
s32 j;
@@ -211,29 +211,29 @@ static void sub_80FC530(struct UnkRfuStruct_Sub_Unused *ptr)
{
for (j = 0; j < 256; j++)
{
ptr->unk_00[i][j] = 0;
ptr->slots[i][j] = 0;
}
}
ptr->unk_201 = 0;
ptr->unk_200 = 0;
ptr->unk_202 = 0;
ptr->unk_203 = 0;
ptr->send_slot = 0;
ptr->recv_slot = 0;
ptr->count = 0;
ptr->full = 0;
}
void sub_80FC588(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2)
void RFU_queue_20_70_recv(struct UnkRfuStruct_2_Sub_124 *queue, u8 *data)
{
s32 i;
u16 imeBak;
u8 count;
if (q1->unk_8c2 < 20)
if (queue->count < 20)
{
imeBak = REG_IME;
REG_IME = 0;
count = 0;
for (i = 0; i < 70; i += 14)
{
if (q2[i] == 0 && q2[i + 1] == 0)
if (data[i] == 0 && data[i + 1] == 0)
{
count++;
}
@@ -242,36 +242,36 @@ void sub_80FC588(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2)
{
for (i = 0; i < 70; i++)
{
q1->unk_00[q1->unk_8c0][i] = q2[i];
queue->slots[queue->recv_slot][i] = data[i];
}
q1->unk_8c0++;
q1->unk_8c0 %= 20;
q1->unk_8c2++;
queue->recv_slot++;
queue->recv_slot %= 20;
queue->count++;
for (i = 0; i < 70; i++)
{
q2[i] = 0;
data[i] = 0;
}
}
REG_IME = imeBak;
}
else
{
q1->unk_8c3 = 1;
queue->full = 1;
}
}
void sub_80FC63C(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2)
void RFU_queue_40_14_recv(struct UnkRfuStruct_2_Sub_9e8 *queue, u8 *data)
{
s32 i;
u16 imeBak;
if (q1->unk_232 < 40)
if (queue->count < 40)
{
imeBak = REG_IME;
REG_IME = 0;
for (i = 0; i < 14; i++)
{
if (q2[i] != 0)
if (data[i] != 0)
{
break;
}
@@ -280,57 +280,57 @@ void sub_80FC63C(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2)
{
for (i = 0; i < 14; i++)
{
q1->unk_00[q1->unk_230][i] = q2[i];
queue->slots[queue->recv_slot][i] = data[i];
}
q1->unk_230++;
q1->unk_230 %= 40;
q1->unk_232++;
queue->recv_slot++;
queue->recv_slot %= 40;
queue->count++;
for (i = 0; i < 14; i++)
{
q2[i] = 0;
data[i] = 0;
}
}
REG_IME = imeBak;
}
else
{
q1->unk_233 = 1;
queue->full = 1;
}
}
bool8 sub_80FC6E8(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2)
bool8 RFU_queue_20_70_send(struct UnkRfuStruct_2_Sub_124 *queue, u8 *dest)
{
u16 imeBak;
s32 i;
imeBak = REG_IME;
REG_IME = 0;
if (q1->unk_8c0 == q1->unk_8c1 || q1->unk_8c3 != 0)
if (queue->recv_slot == queue->send_slot || queue->full)
{
for (i = 0; i < 70; i++)
{
q2[i] = 0;
dest[i] = 0;
}
REG_IME = imeBak;
return FALSE;
}
for (i = 0; i < 70; i++)
{
q2[i] = q1->unk_00[q1->unk_8c1][i];
dest[i] = queue->slots[queue->send_slot][i];
}
q1->unk_8c1++;
q1->unk_8c1 %= 20;
q1->unk_8c2--;
queue->send_slot++;
queue->send_slot %= 20;
queue->count--;
REG_IME = imeBak;
return TRUE;
}
bool8 sub_80FC79C(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2)
bool8 RFU_queue_40_14_send(struct UnkRfuStruct_2_Sub_9e8 *queue, u8 *dest)
{
s32 i;
u16 imeBak;
if (q1->unk_230 == q1->unk_231 || q1->unk_233 != 0)
if (queue->recv_slot == queue->send_slot || queue->full != 0)
{
return FALSE;
}
@@ -338,98 +338,98 @@ bool8 sub_80FC79C(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2)
REG_IME = 0;
for (i = 0; i < 14; i++)
{
q2[i] = q1->unk_00[q1->unk_231][i];
dest[i] = queue->slots[queue->send_slot][i];
}
q1->unk_231++;
q1->unk_231 %= 40;
q1->unk_232--;
queue->send_slot++;
queue->send_slot %= 40;
queue->count--;
REG_IME = imeBak;
return TRUE;
}
void sub_80FC828(struct UnkRfuStruct_2_Sub_c1c *q1, const u8 *q2)
void RFU_queue_2_14_recv(struct UnkRfuStruct_2_Sub_c1c *queue, const u8 *data)
{
s32 i;
if (q2[1] == 0)
if (data[1] == 0)
{
sub_80FC888(q1, NULL);
RFU_queue_2_14_send(queue, NULL);
}
else
{
for (i = 0; i < 14; i++)
{
q1->unk_00[q1->unk_1c][i] = q2[i];
queue->slots[queue->recv_slot][i] = data[i];
}
q1->unk_1c++;
q1->unk_1c %= 2;
if (q1->unk_1e < 2)
queue->recv_slot++;
queue->recv_slot %= 2;
if (queue->count < 2)
{
q1->unk_1e++;
queue->count++;
}
else
{
q1->unk_1d = q1->unk_1c;
queue->send_slot = queue->recv_slot;
}
}
}
bool8 sub_80FC888(struct UnkRfuStruct_2_Sub_c1c *q1, u8 *q2)
bool8 RFU_queue_2_14_send(struct UnkRfuStruct_2_Sub_c1c *queue, u8 *dest)
{
s32 i;
if (q1->unk_1e == 0)
if (queue->count == 0)
{
return FALSE;
}
if (q2 != NULL)
if (dest != NULL)
{
for (i = 0; i < 14; i++)
{
q2[i] = q1->unk_00[q1->unk_1d][i];
dest[i] = queue->slots[queue->send_slot][i];
}
}
q1->unk_1d++;
q1->unk_1d %= 2;
q1->unk_1e--;
queue->send_slot++;
queue->send_slot %= 2;
queue->count--;
return TRUE;
}
static void sub_80FC8D8(struct UnkRfuStruct_Sub_Unused *q1, u8 *q2)
static void RFU_queue_2_256_recv(struct UnkRfuStruct_Sub_Unused *queue, u8 *data)
{
s32 i;
if (q1->unk_202 < 2)
if (queue->count < 2)
{
for (i = 0; i < 256; i++)
{
q1->unk_00[q1->unk_200][i] = q2[i];
queue->slots[queue->recv_slot][i] = data[i];
}
q1->unk_200++;
q1->unk_200 %= 2;
q1->unk_202++;
queue->recv_slot++;
queue->recv_slot %= 2;
queue->count++;
}
else
{
q1->unk_203 = 1;
queue->full = 1;
}
}
static bool8 sub_80FC944(struct UnkRfuStruct_Sub_Unused *q1, u8 *q2)
static bool8 RFU_queue_2_256_send(struct UnkRfuStruct_Sub_Unused *queue, u8 *send)
{
s32 i;
if (q1->unk_200 == q1->unk_201 || q1->unk_203)
if (queue->recv_slot == queue->send_slot || queue->full)
{
return FALSE;
}
for (i = 0; i < 256; i++)
{
q2[i] = q1->unk_00[q1->unk_201][i];
send[i] = queue->slots[queue->send_slot][i];
}
q1->unk_201++;
q1->unk_201 %= 2;
q1->unk_202--;
queue->send_slot++;
queue->send_slot %= 2;
queue->count--;
return TRUE;
}
@@ -438,7 +438,7 @@ static void sub_80FC9B8(u8 *q1, u8 mode)
s32 i;
u8 rval;
u16 r5 = 0;
static u8 _3002018;
static u8 counter;
switch (mode)
{
@@ -470,11 +470,11 @@ static void sub_80FC9B8(u8 *q1, u8 mode)
case 3:
for (i = 0; i < 200; i++)
{
q1[i] = i + 1 + _3002018;
r5 += (i + 1 + _3002018) & 0xFF;
q1[i] = i + 1 + counter;
r5 += (i + 1 + counter) & 0xFF;
}
*((u16 *)(q1 + i)) = r5;
_3002018++;
counter++;
break;
}
}
@@ -603,7 +603,7 @@ static u8 GetConnectedChildStrength(u8 maxFlags)
}
#endif
void InitHostRFUtgtGname(struct GFtgtGname *data, u8 activity, bool32 r2, s32 r3)
void InitHostRFUtgtGname(struct GFtgtGname *data, u8 activity, bool32 started, s32 child_sprite_genders)
{
s32 i;
@@ -613,30 +613,37 @@ void InitHostRFUtgtGname(struct GFtgtGname *data, u8 activity, bool32 r2, s32 r3
}
for (i = 0; i < RFU_CHILD_MAX; i++)
{
data->unk_04[i] = r3;
r3 >>= 8;
data->child_sprite_gender[i] = child_sprite_genders;
child_sprite_genders >>= 8;
}
data->playerGender = gSaveBlock2Ptr->playerGender;
data->unk_0a_0 = activity;
data->unk_0a_7 = r2;
data->unk_00.unk_00_0 = GAME_LANGUAGE;
data->unk_00.unk_01_2 = GAME_VERSION;
data->unk_00.unk_00_4 = 0;
data->unk_00.unk_00_5 = 0;
data->activity = activity;
data->started = started;
data->unk_00.language = GAME_LANGUAGE;
data->unk_00.version = GAME_VERSION;
data->unk_00.hasNews = FALSE;
data->unk_00.hasCard = FALSE;
data->unk_00.unk_00_6 = 0;
data->unk_00.isChampion = FlagGet(FLAG_SYS_CAN_LINK_WITH_RS);
data->unk_00.hasNationalDex = IsNationalPokedexEnabled();
data->unk_00.gameClear = FlagGet(FLAG_SYS_GAME_CLEAR);
}
bool8 sub_80FCC3C(struct GFtgtGname *gname, u8 *uname, u8 idx)
/*
* ==========================================================
* Returns 1 if parent, 0 if child or neutral.
* If partner serial number is valid, copies gname and uname.
* Otherwise, blanks these.
* ==========================================================
*/
bool8 LinkRfu_GetNameIfCompatible(struct GFtgtGname *gname, u8 *uname, u8 idx)
{
bool8 retVal;
if (gUnknown_3005E10.unk_06 == 1)
if (lman.parent_child == MODE_PARENT)
{
retVal = TRUE;
if (sub_80FA44C(gRfuLinkStatus->partner[idx].serialNo) && ((gRfuLinkStatus->getNameFlag >> idx) & 1))
if (RfuSerialNumberIsValid(gRfuLinkStatus->partner[idx].serialNo) && ((gRfuLinkStatus->getNameFlag >> idx) & 1))
{
memcpy(gname, &gRfuLinkStatus->partner[idx].gname, RFU_GAME_NAME_LENGTH);
memcpy(uname, gRfuLinkStatus->partner[idx].uname, RFU_USER_NAME_LENGTH);
@@ -650,7 +657,7 @@ bool8 sub_80FCC3C(struct GFtgtGname *gname, u8 *uname, u8 idx)
else
{
retVal = FALSE;
if (sub_80FA44C(gRfuLinkStatus->partner[idx].serialNo))
if (RfuSerialNumberIsValid(gRfuLinkStatus->partner[idx].serialNo))
{
memcpy(gname, &gRfuLinkStatus->partner[idx].gname, RFU_GAME_NAME_LENGTH);
memcpy(uname, gRfuLinkStatus->partner[idx].uname, RFU_USER_NAME_LENGTH);
@@ -664,7 +671,13 @@ bool8 sub_80FCC3C(struct GFtgtGname *gname, u8 *uname, u8 idx)
return retVal;
}
bool8 sub_80FCCF4(struct GFtgtGname *gname, u8 *uname, u8 idx)
/*
* ==========================================================
* Specific check for serial number 0x7F7D,
* which comes from ???
* ==========================================================
*/
bool8 LinkRfu_GetNameIfSerial7F7D(struct GFtgtGname *gname, u8 *uname, u8 idx)
{
bool8 retVal = FALSE;
if (gRfuLinkStatus->partner[idx].serialNo == 0x7F7D)
@@ -824,7 +837,7 @@ void UpdateWirelessStatusIndicatorSprite(void)
gMain.oamBuffer[125].paletteNum = sprite->oam.paletteNum;
gMain.oamBuffer[125].tileNum = sprite->data[6] + sprite->anims[sprite->data[2]][sprite->data[4]].frame.imageValue;
CpuCopy16(gMain.oamBuffer + 125, (struct OamData *)OAM + 125, sizeof(struct OamData));
if (sub_80FB9F4() == 1)
if (RfuGetErrorStatus() == 1)
{
DestroyWirelessStatusIndicatorSprite();
}
+1 -1
View File
@@ -763,7 +763,7 @@ void sub_8107CF8(u8 windowId, u16 speciesId, u32 personality, u16 x, u16 y)
BlitBitmapToWindow(windowId, GetMonIconPtr(speciesId, personality, 1), x, y, 32, 32);
}
void sub_8107D38(u8 palOffset, u8 palId)
void ListMenuLoadStdPalAt(u8 palOffset, u8 palId)
{
const u16 *palette;
+224 -221
View File
File diff suppressed because it is too large Load Diff
-793
View File
@@ -1,793 +0,0 @@
#include "global.h"
#include "constants/species.h"
#include "bg.h"
#include "gpu_regs.h"
#include "palette.h"
#include "decompress.h"
#include "malloc.h"
#include "menu.h"
#include "new_menu_helpers.h"
#include "pokemon_icon.h"
#include "mystery_gift_menu.h"
#include "menu_indicators.h"
#include "string_util.h"
#include "link_rfu.h"
#include "mevent.h"
#include "battle_anim.h"
struct UnkStruct_8467FB8
{
u8 textPal1:4;
u8 textPal2:4;
u8 textPal3:4;
u8 textPal4:4;
const u8 * tiles;
const u8 * map;
const u16 * pal;
};
struct UnkStruct_203F3C8_02DC
{
u8 unk_00;
u8 unk_01[41];
u8 unk_42[4];
};
struct UnkStruct_203F3C8
{
/*0000*/ struct MEWonderCardData unk_0000;
/*014c*/ struct MEventBuffer_3430_Sub unk_014C;
/*0170*/ const struct UnkStruct_8467FB8 * unk_0170;
/*0174*/ u8 unk_0174;
/*0175*/ u8 unk_0175;
/*0176*/ u16 unk_0176[3];
/*017C*/ u8 unk_017C;
/*017D*/ u8 unk_017D[7][2];
/*018B*/ u8 unk_018B[41];
/*01B4*/ u8 unk_01B4[41];
/*01DD*/ u8 unk_01DD[7];
/*01E4*/ u8 unk_01E4[4][41];
/*0288*/ u8 unk_0288[41];
/*02B1*/ u8 unk_02B1[41];
/*02DC*/ struct UnkStruct_203F3C8_02DC unk_02DC[8];
/*045C*/ u8 buffer_045C[0x1000];
};
EWRAM_DATA struct UnkStruct_203F3C8 * gUnknown_203F3C8 = NULL;
void sub_8145A98(void);
void sub_8145D18(u8 whichWindow);
void sub_8146060(void);
void sub_81461D8(void);
const u8 gUnknown_8467068[][3] = {
{0, 2, 3},
{0, 1, 2}
};
const u8 ALIGNED(4) gUnknown_8467070[3] = {7, 4, 7};
const struct WindowTemplate gUnknown_8467074[] = {
{0x01, 0x01, 0x01, 0x19, 0x04, 0x0f, 0x029c},
{0x01, 0x01, 0x06, 0x1c, 0x08, 0x0f, 0x01bc},
{0x01, 0x01, 0x0e, 0x1c, 0x05, 0x0f, 0x0130}
};
const u16 gUnknown_846708C[] = INCBIN_U16("data/graphics/mevent/pal_46708C.gbapal");
const u16 gUnknown_84670AC[] = INCBIN_U16("data/graphics/mevent/pal_4670AC.gbapal");
const u16 gUnknown_84670CC[] = INCBIN_U16("data/graphics/mevent/pal_4670CC.gbapal");
const u16 gUnknown_84670EC[] = INCBIN_U16("data/graphics/mevent/pal_4670EC.gbapal");
const u16 gUnknown_846710C[] = INCBIN_U16("data/graphics/mevent/pal_46710C.gbapal");
const u16 gUnknown_846712C[] = INCBIN_U16("data/graphics/mevent/pal_46712C.gbapal");
const u16 gUnknown_846714C[] = INCBIN_U16("data/graphics/mevent/pal_46714C.gbapal");
const u16 gUnknown_846716C[] = INCBIN_U16("data/graphics/mevent/pal_46716C.gbapal");
const u8 gUnknown_846718C[] = INCBIN_U8("data/graphics/mevent/gfx_46718C.4bpp.lz");
const u8 gUnknown_8467288[] = INCBIN_U8("data/graphics/mevent/tilemap_467288.bin.lz");
const u8 gUnknown_846737C[] = INCBIN_U8("data/graphics/mevent/gfx_46737C.4bpp.lz");
const u8 gUnknown_8467470[] = INCBIN_U8("data/graphics/mevent/tilemap_467470.bin.lz");
const u8 gUnknown_8467558[] = INCBIN_U8("data/graphics/mevent/gfx_467558.4bpp.lz");
const u8 gUnknown_846762C[] = INCBIN_U8("data/graphics/mevent/tilemap_46762C.bin.lz");
const u8 gUnknown_8467700[] = INCBIN_U8("data/graphics/mevent/gfx_467700.4bpp.lz");
const u8 gUnknown_8467934[] = INCBIN_U8("data/graphics/mevent/tilemap_467934.bin.lz");
const u8 gUnknown_8467A7C[] = INCBIN_U8("data/graphics/mevent/gfx_467A7C.4bpp.lz");
const u8 gUnknown_8467CAC[] = INCBIN_U8("data/graphics/mevent/tilemap_467CAC.bin.lz");
const u16 gUnknown_8467DF4[] = INCBIN_U16("data/graphics/mevent/pal_467DF4.gbapal");
const u16 gUnknown_8467E14[] = INCBIN_U16("data/graphics/mevent/pal_467E14.gbapal");
const u16 gUnknown_8467E34[] = INCBIN_U16("data/graphics/mevent/pal_467E34.gbapal");
const u16 gUnknown_8467E54[] = INCBIN_U16("data/graphics/mevent/pal_467E54.gbapal");
const u16 gUnknown_8467E74[] = INCBIN_U16("data/graphics/mevent/pal_467E74.gbapal");
const u16 gUnknown_8467E94[] = INCBIN_U16("data/graphics/mevent/pal_467E94.gbapal");
const u16 gUnknown_8467EB4[] = INCBIN_U16("data/graphics/mevent/pal_467EB4.gbapal");
const u16 gUnknown_8467ED4[] = INCBIN_U16("data/graphics/mevent/pal_467ED4.gbapal");
const u32 gUnknown_8467EF4[] = INCBIN_U32("data/graphics/mevent/gfx_467EF4.4bpp.lz");
const struct CompressedSpriteSheet gUnknown_8467F58 = {
gUnknown_8467EF4, 0x100, 0x8000
};
const struct SpritePalette gUnknown_8467F60[] = {
{gUnknown_8467DF4, 0x8000},
{gUnknown_8467E14, 0x8000},
{gUnknown_8467E34, 0x8000},
{gUnknown_8467E54, 0x8000},
{gUnknown_8467E74, 0x8000},
{gUnknown_8467E94, 0x8000},
{gUnknown_8467EB4, 0x8000},
{gUnknown_8467ED4, 0x8000}
};
const struct SpriteTemplate gUnknown_8467FA0 = {
0x8000, 0x8000, &gOamData_AffineOff_ObjNormal_32x16, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
};
const struct UnkStruct_8467FB8 gUnknown_8467FB8[8] = {
{1, 0, 0, 0, gUnknown_846718C, gUnknown_8467288, gUnknown_846708C},
{1, 0, 0, 1, gUnknown_846737C, gUnknown_8467470, gUnknown_84670AC},
{1, 0, 0, 2, gUnknown_8467558, gUnknown_846762C, gUnknown_84670CC},
{1, 0, 0, 3, gUnknown_8467558, gUnknown_846762C, gUnknown_84670EC},
{1, 0, 0, 4, gUnknown_8467558, gUnknown_846762C, gUnknown_846710C},
{1, 0, 0, 5, gUnknown_8467558, gUnknown_846762C, gUnknown_846712C},
{1, 0, 0, 6, gUnknown_8467700, gUnknown_8467934, gUnknown_846714C},
{1, 0, 0, 7, gUnknown_8467A7C, gUnknown_8467CAC, gUnknown_846716C}
};
bool32 InitWonderCardResources(struct MEWonderCardData * r5, struct MEventBuffer_3430_Sub * r6)
{
if (r5 == NULL || r6 == NULL)
return FALSE;
gUnknown_203F3C8 = AllocZeroed(sizeof(struct UnkStruct_203F3C8));
if (gUnknown_203F3C8 == NULL)
return FALSE;
gUnknown_203F3C8->unk_0000 = *r5;
gUnknown_203F3C8->unk_014C = *r6;
if (gUnknown_203F3C8->unk_0000.unk_08_2 >= NELEMS(gUnknown_8467FB8))
gUnknown_203F3C8->unk_0000.unk_08_2 = 0;
if (gUnknown_203F3C8->unk_0000.unk_08_0 >= NELEMS(gUnknown_8467070))
gUnknown_203F3C8->unk_0000.unk_08_0 = 0;
if (gUnknown_203F3C8->unk_0000.unk_09 > NELEMS(gUnknown_203F3C8->unk_017D))
gUnknown_203F3C8->unk_0000.unk_09 = 0;
gUnknown_203F3C8->unk_0170 = &gUnknown_8467FB8[gUnknown_203F3C8->unk_0000.unk_08_2];
return TRUE;
}
void DestroyWonderCardResources(void)
{
if (gUnknown_203F3C8 != NULL)
{
*gUnknown_203F3C8 = (struct UnkStruct_203F3C8){};
Free(gUnknown_203F3C8);
gUnknown_203F3C8 = NULL;
}
}
s32 FadeToWonderCardMenu(void)
{
if (gUnknown_203F3C8 == NULL)
return -1;
switch(gUnknown_203F3C8->unk_0174)
{
case 0:
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
break;
case 1:
if (UpdatePaletteFade())
return 0;
break;
case 2:
FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);
FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20);
CopyBgTilemapBufferToVram(0);
CopyBgTilemapBufferToVram(1);
CopyBgTilemapBufferToVram(2);
DecompressAndCopyTileDataToVram(2, gUnknown_203F3C8->unk_0170->tiles, 0, 0x008, 0);
gUnknown_203F3C8->unk_0176[0] = AddWindow(&gUnknown_8467074[0]);
gUnknown_203F3C8->unk_0176[1] = AddWindow(&gUnknown_8467074[1]);
gUnknown_203F3C8->unk_0176[2] = AddWindow(&gUnknown_8467074[2]);
break;
case 3:
if (FreeTempTileDataBuffersIfPossible())
return 0;
gPaletteFade.bufferTransferDisabled = TRUE;
LoadPalette(gUnknown_203F3C8->unk_0170->pal, 0x10, 0x20);
LZ77UnCompWram(gUnknown_203F3C8->unk_0170->map, gUnknown_203F3C8->buffer_045C);
CopyRectToBgTilemapBufferRect(2, gUnknown_203F3C8->buffer_045C, 0, 0, 30, 20, 0, 0, 30, 20, 1, 0x008, 0);
CopyBgTilemapBufferToVram(2);
break;
case 4:
sub_8145A98();
break;
case 5:
sub_8145D18(0);
sub_8145D18(1);
sub_8145D18(2);
CopyBgTilemapBufferToVram(1);
break;
case 6:
LoadMonIconPalettes();
break;
case 7:
ShowBg(1);
ShowBg(2);
gPaletteFade.bufferTransferDisabled = FALSE;
sub_8146060();
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
UpdatePaletteFade();
break;
default:
if (UpdatePaletteFade())
return 0;
gUnknown_203F3C8->unk_0174 = 0;
return 1;
}
++gUnknown_203F3C8->unk_0174;
return 0;
}
s32 FadeOutFromWonderCard(bool32 flag)
{
if (gUnknown_203F3C8 == NULL)
return -1;
switch (gUnknown_203F3C8->unk_0174)
{
case 0:
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
break;
case 1:
if (UpdatePaletteFade())
return 0;
break;
case 2:
FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);
FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20);
CopyBgTilemapBufferToVram(0);
CopyBgTilemapBufferToVram(1);
CopyBgTilemapBufferToVram(2);
break;
case 3:
HideBg(1);
HideBg(2);
RemoveWindow(gUnknown_203F3C8->unk_0176[2]);
RemoveWindow(gUnknown_203F3C8->unk_0176[1]);
RemoveWindow(gUnknown_203F3C8->unk_0176[0]);
break;
case 4:
sub_81461D8();
FreeMonIconPalettes();
break;
case 5:
PrintMysteryGiftOrEReaderTopMenu(gGiftIsFromEReader, flag);
break;
case 6:
CopyBgTilemapBufferToVram(0);
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
break;
default:
if (UpdatePaletteFade())
return 0;
gUnknown_203F3C8->unk_0174 = 0;
return 1;
}
++gUnknown_203F3C8->unk_0174;
return 0;
}
void sub_8145A98(void)
{
u16 i = 0;
u16 r6;
u16 sp0[3] = {0, 0, 0};
memcpy(gUnknown_203F3C8->unk_018B, gUnknown_203F3C8->unk_0000.unk_0A, 40);
gUnknown_203F3C8->unk_018B[40] = EOS;
memcpy(gUnknown_203F3C8->unk_01B4, gUnknown_203F3C8->unk_0000.unk_32, 40);
gUnknown_203F3C8->unk_01B4[40] = EOS;
if (gUnknown_203F3C8->unk_0000.unk_04 > 999999)
gUnknown_203F3C8->unk_0000.unk_04 = 999999;
ConvertIntToDecimalStringN(gUnknown_203F3C8->unk_01DD, gUnknown_203F3C8->unk_0000.unk_04, STR_CONV_MODE_LEFT_ALIGN, 6);
for (i = 0; i < 4; i++)
{
memcpy(gUnknown_203F3C8->unk_01E4[i], gUnknown_203F3C8->unk_0000.unk_5A[i], 40);
gUnknown_203F3C8->unk_01E4[i][40] = EOS;
}
memcpy(gUnknown_203F3C8->unk_0288, gUnknown_203F3C8->unk_0000.unk_FA, 40);
gUnknown_203F3C8->unk_0288[40] = EOS;
switch (gUnknown_203F3C8->unk_0000.unk_08_0)
{
case 0:
memcpy(gUnknown_203F3C8->unk_02B1, gUnknown_203F3C8->unk_0000.unk_122, 40);
gUnknown_203F3C8->unk_02B1[40] = EOS;
break;
case 1:
gUnknown_203F3C8->unk_02B1[00] = EOS;
break;
case 2:
gUnknown_203F3C8->unk_02B1[00] = EOS;
sp0[0] = gUnknown_203F3C8->unk_014C.unk_00 < 999 ? gUnknown_203F3C8->unk_014C.unk_00 : 999;
sp0[1] = gUnknown_203F3C8->unk_014C.unk_02 < 999 ? gUnknown_203F3C8->unk_014C.unk_02 : 999;
sp0[2] = gUnknown_203F3C8->unk_014C.unk_04 < 999 ? gUnknown_203F3C8->unk_014C.unk_04 : 999;
for (i = 0; i < 8; i++)
{
memset(gUnknown_203F3C8->unk_02DC[i].unk_42, EOS, 4);
memset(gUnknown_203F3C8->unk_02DC[i].unk_01, EOS, 41);
}
for (i = 0, r6 = 0; i < 40; i++)
{
if (gUnknown_203F3C8->unk_0000.unk_122[i] != 0xF7)
{
gUnknown_203F3C8->unk_02DC[gUnknown_203F3C8->unk_0175].unk_01[r6] = gUnknown_203F3C8->unk_0000.unk_122[i];
r6++;
}
else
{
u8 r3 = gUnknown_203F3C8->unk_0000.unk_122[i + 1];
if (r3 > 2)
{
i += 2;
}
else
{
ConvertIntToDecimalStringN(gUnknown_203F3C8->unk_02DC[gUnknown_203F3C8->unk_0175].unk_42, sp0[r3], STR_CONV_MODE_LEADING_ZEROS, 3);
gUnknown_203F3C8->unk_02DC[gUnknown_203F3C8->unk_0175].unk_00 = gUnknown_203F3C8->unk_0000.unk_122[i + 2];
gUnknown_203F3C8->unk_0175++;
if (gUnknown_203F3C8->unk_0175 > 7)
break;
r6 = 0;
i += 2;
}
}
}
}
}
void sub_8145D18(u8 whichWindow)
{
s8 sp0C = 0;
s32 windowId = gUnknown_203F3C8->unk_0176[whichWindow];
PutWindowTilemap(windowId);
FillWindowPixelBuffer(windowId, 0);
switch (whichWindow)
{
case 0:
{
s32 x;
AddTextPrinterParameterized3(windowId, 3, 0, 1, gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal1], 0, gUnknown_203F3C8->unk_018B);
x = 160 - GetStringWidth(3, gUnknown_203F3C8->unk_01B4, GetFontAttribute(3, 2));
if (x < 0)
x = 0;
AddTextPrinterParameterized3(windowId, 3, x, 17, gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal1], 0, gUnknown_203F3C8->unk_01B4);
if (gUnknown_203F3C8->unk_0000.unk_04 != 0)
{
AddTextPrinterParameterized3(windowId, 2, 166, 17, gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal1], 0, gUnknown_203F3C8->unk_01DD);
}
break;
}
case 1:
for (; sp0C < 4; sp0C++)
{
AddTextPrinterParameterized3(windowId, 3, 0, 16 * sp0C + 2, gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal2], 0, gUnknown_203F3C8->unk_01E4[sp0C]);
}
break;
case 2:
AddTextPrinterParameterized3(windowId, 3, 0, gUnknown_8467070[gUnknown_203F3C8->unk_0000.unk_08_0], gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal3], 0, gUnknown_203F3C8->unk_0288);
if (gUnknown_203F3C8->unk_0000.unk_08_0 != 2)
{
AddTextPrinterParameterized3(windowId, 3, 0, 16 + gUnknown_8467070[gUnknown_203F3C8->unk_0000.unk_08_0], gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal3], 0, gUnknown_203F3C8->unk_02B1);
}
else
{
s32 x = 0;
s32 y = gUnknown_8467070[gUnknown_203F3C8->unk_0000.unk_08_0] + 16;
s32 spacing = GetFontAttribute(3, 2);
for (; sp0C < gUnknown_203F3C8->unk_0175; sp0C++)
{
AddTextPrinterParameterized3(windowId, 3, x, y, gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal3], 0, gUnknown_203F3C8->unk_02DC[sp0C].unk_01);
if (gUnknown_203F3C8->unk_02DC[sp0C].unk_42[0] != EOS)
{
x += GetStringWidth(3, gUnknown_203F3C8->unk_02DC[sp0C].unk_01, spacing);
AddTextPrinterParameterized3(windowId, 2, x, y, gUnknown_8467068[gUnknown_203F3C8->unk_0170->textPal3], 0, gUnknown_203F3C8->unk_02DC[sp0C].unk_42);
x += GetStringWidth(3, gUnknown_203F3C8->unk_02DC[sp0C].unk_42, spacing) + gUnknown_203F3C8->unk_02DC[sp0C].unk_00;
}
}
}
break;
}
CopyWindowToVram(windowId, 3);
}
void sub_8146060(void)
{
u8 r7 = 0;
gUnknown_203F3C8->unk_017C = 0xFF;
if (gUnknown_203F3C8->unk_014C.unk_06 != SPECIES_NONE)
{
gUnknown_203F3C8->unk_017C = CreateMonIcon_HandleDeoxys(MailSpeciesToIconSpecies(gUnknown_203F3C8->unk_014C.unk_06), SpriteCallbackDummy, 0xDC, 0x14, 0, FALSE);
gSprites[gUnknown_203F3C8->unk_017C].oam.priority = 2;
}
if (gUnknown_203F3C8->unk_0000.unk_09 != 0 && gUnknown_203F3C8->unk_0000.unk_08_0 == 1)
{
LoadCompressedSpriteSheetUsingHeap(&gUnknown_8467F58);
LoadSpritePalette(&gUnknown_8467F60[gUnknown_203F3C8->unk_0170->textPal4]);
for (; r7 < gUnknown_203F3C8->unk_0000.unk_09; r7++)
{
gUnknown_203F3C8->unk_017D[r7][0] = 0xFF;
gUnknown_203F3C8->unk_017D[r7][1] = 0xFF;
gUnknown_203F3C8->unk_017D[r7][0] = CreateSprite(&gUnknown_8467FA0, 0xd8 - 32 * r7, 0x90, 8);
if (gUnknown_203F3C8->unk_014C.unk_08[0][r7] != 0)
{
gUnknown_203F3C8->unk_017D[r7][1] = CreateMonIcon_HandleDeoxys(MailSpeciesToIconSpecies(gUnknown_203F3C8->unk_014C.unk_08[0][r7]), SpriteCallbackDummy, 0xd8 - 32 * r7, 0x88, 0, 0);
gSprites[gUnknown_203F3C8->unk_017D[r7][1]].oam.priority = 2;
}
}
}
}
void sub_81461D8(void)
{
u8 r6 = 0;
if (gUnknown_203F3C8->unk_017C != 0xFF)
DestroyMonIcon(&gSprites[gUnknown_203F3C8->unk_017C]);
if (gUnknown_203F3C8->unk_0000.unk_09 != 0 && gUnknown_203F3C8->unk_0000.unk_08_0 == 1)
{
for (; r6 < gUnknown_203F3C8->unk_0000.unk_09; r6++)
{
if (gUnknown_203F3C8->unk_017D[r6][0] != 0xFF)
{
DestroySprite(&gSprites[gUnknown_203F3C8->unk_017D[r6][0]]);
// This might be a typo. Uncomment the next line, and comment the one that follows, to get the presumed intended behavior.
// if (gUnknown_203F3C8->unk_017D[r6][1] != 0xFF)
if (gUnknown_203F3C8->unk_017D[r6][0] != 0xFF)
{
DestroyMonIcon(&gSprites[gUnknown_203F3C8->unk_017D[r6][1]]);
}
}
}
FreeSpriteTilesByTag(0x8000);
FreeSpritePaletteByTag(0x8000);
}
}
struct UnkStruct_203F3CC
{
/*0000*/ struct MEWonderNewsData unk_0000;
/*01bc*/ const struct UnkStruct_8467FB8 * unk_01BC;
/*01c0*/ u8 unk_01C0_0:1;
u8 unk_01C0_1:7;
/*01c1*/ u8 unk_01C1;
/*01c2*/ u8 unk_01C2_0:1;
u8 unk_01C2_1:7;
/*01c3*/ u8 unk_01C3_0:1;
u8 unk_01C3_1:7;
/*01c4*/ u16 unk_01C4;
/*01c6*/ u16 unk_01C6;
/*01c8*/ u16 unk_01C8[2];
/*01cc*/ u8 filler_01CC[2];
/*01ce*/ u8 unk_01CE[41];
/*01f7*/ u8 unk_01F7[10][41];
/*0394*/ struct ScrollArrowsTemplate unk_0394;
/*03a4*/ u8 buffer_03A4[0x1000];
};
EWRAM_DATA struct UnkStruct_203F3CC * gUnknown_203F3CC = NULL;
void sub_8146980(void);
void sub_8146A30(void);
void sub_8146B58(void);
const u8 gUnknown_8468038[][3] = {
{0, 2, 3},
{0, 1, 2}
};
const struct WindowTemplate gUnknown_8468040[] = {
{0, 1, 0, 28, 3, 15, 0x000},
{2, 1, 3, 28, 20, 15, 0x000}
};
const struct ScrollArrowsTemplate gUnknown_8468050 = {
0x02, 0xe8, 0x18, 0x03, 0xe8, 0x98,
0x0000, 0x0002, 0x1000, 0x1000, 0x0,
};
const u16 gUnknown_8468060[] = INCBIN_U16("data/graphics/mevent/pal_468060.gbapal");
const u16 gUnknown_8468080[] = INCBIN_U16("data/graphics/mevent/pal_468080.gbapal");
const u16 gUnknown_84680A0[] = INCBIN_U16("data/graphics/mevent/pal_4680A0.gbapal");
const u8 gUnknown_84680C0[] = INCBIN_U8("data/graphics/mevent/gfx_4680C0.4bpp.lz");
const u8 gUnknown_8468140[] = INCBIN_U8("data/graphics/mevent/tilemap_468140.bin.lz");
const u8 gUnknown_846821C[] = INCBIN_U8("data/graphics/mevent/gfx_46821C.4bpp.lz");
const u8 gUnknown_846824C[] = INCBIN_U8("data/graphics/mevent/tilemap_46824C.bin.lz");
const u8 gUnknown_846830C[] = INCBIN_U8("data/graphics/mevent/gfx_46830C.4bpp.lz");
const u8 gUnknown_846837C[] = INCBIN_U8("data/graphics/mevent/tilemap_46837C.bin.lz");
const u8 gUnknown_8468448[] = INCBIN_U8("data/graphics/mevent/gfx_468448.4bpp.lz");
const u8 gUnknown_84684D8[] = INCBIN_U8("data/graphics/mevent/tilemap_4684D8.bin.lz");
const u8 gUnknown_84685B4[] = INCBIN_U8("data/graphics/mevent/gfx_4685B4.4bpp.lz");
const u8 gUnknown_8468644[] = INCBIN_U8("data/graphics/mevent/tilemap_468644.bin.lz");
const struct UnkStruct_8467FB8 gUnknown_8468720[] = {
{1, 0, 0, 0, gUnknown_84680C0, gUnknown_8468140, gUnknown_8468060},
{1, 0, 0, 0, gUnknown_846821C, gUnknown_846824C, gUnknown_84670AC},
{1, 0, 0, 0, gUnknown_846830C, gUnknown_846837C, gUnknown_84670CC},
{1, 0, 0, 0, gUnknown_846830C, gUnknown_846837C, gUnknown_84670EC},
{1, 0, 0, 0, gUnknown_846830C, gUnknown_846837C, gUnknown_846710C},
{1, 0, 0, 0, gUnknown_846830C, gUnknown_846837C, gUnknown_846712C},
{1, 0, 0, 0, gUnknown_8468448, gUnknown_84684D8, gUnknown_8468080},
{1, 0, 0, 0, gUnknown_84685B4, gUnknown_8468644, gUnknown_84680A0}
};
bool32 InitWonderNewsResources(const struct MEWonderNewsData * a0)
{
if (a0 == NULL)
return FALSE;
gUnknown_203F3CC = AllocZeroed(sizeof(struct UnkStruct_203F3CC));
if (gUnknown_203F3CC == NULL)
return FALSE;
gUnknown_203F3CC->unk_0000 = *a0;
if (gUnknown_203F3CC->unk_0000.unk_03 >= NELEMS(gUnknown_8468720))
gUnknown_203F3CC->unk_0000.unk_03 = 0;
gUnknown_203F3CC->unk_01BC = &gUnknown_8468720[gUnknown_203F3CC->unk_0000.unk_03];
gUnknown_203F3CC->unk_01C1 = 0xFF;
return TRUE;
}
void DestroyWonderNewsResources(void)
{
if (gUnknown_203F3CC != NULL)
{
*gUnknown_203F3CC = (struct UnkStruct_203F3CC){};
Free(gUnknown_203F3CC);
gUnknown_203F3CC = NULL;
}
}
s32 FadeToWonderNewsMenu(void)
{
if (gUnknown_203F3CC == NULL)
return -1;
switch (gUnknown_203F3CC->unk_01C0_1)
{
case 0:
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
break;
case 1:
if (UpdatePaletteFade())
return 0;
ChangeBgY(0, 0, 0);
ChangeBgY(1, 0, 0);
ChangeBgY(2, 0, 0);
ChangeBgY(3, 0, 0);
SetGpuReg(REG_OFFSET_WIN0H, 0xF0);
SetGpuReg(REG_OFFSET_WIN0V, 0x1A98);
SetGpuReg(REG_OFFSET_WININ, 0x1F);
SetGpuReg(REG_OFFSET_WINOUT, 0x1B);
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
break;
case 2:
FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);
FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20);
FillBgTilemapBufferRect_Palette0(3, 0x000, 0, 0, 30, 20);
CopyBgTilemapBufferToVram(0);
CopyBgTilemapBufferToVram(1);
CopyBgTilemapBufferToVram(2);
CopyBgTilemapBufferToVram(3);
DecompressAndCopyTileDataToVram(3, gUnknown_203F3CC->unk_01BC->tiles, 0, 8, 0);
gUnknown_203F3CC->unk_01C8[0] = AddWindow(&gUnknown_8468040[0]);
gUnknown_203F3CC->unk_01C8[1] = AddWindow(&gUnknown_8468040[1]);
break;
case 3:
if (FreeTempTileDataBuffersIfPossible())
return 0;
gPaletteFade.bufferTransferDisabled = TRUE;
LoadPalette(gUnknown_203F3CC->unk_01BC->pal, 0x10, 0x20);
LZ77UnCompWram(gUnknown_203F3CC->unk_01BC->map, gUnknown_203F3CC->buffer_03A4);
CopyRectToBgTilemapBufferRect(1, gUnknown_203F3CC->buffer_03A4, 0, 0, 30, 3, 0, 0, 30, 3, 1, 8, 0);
CopyRectToBgTilemapBufferRect(3, gUnknown_203F3CC->buffer_03A4, 0, 3, 30, 23, 0, 3, 30, 23, 1, 8, 0);
CopyBgTilemapBufferToVram(1);
CopyBgTilemapBufferToVram(3);
break;
case 4:
sub_8146980();
break;
case 5:
sub_8146A30();
CopyBgTilemapBufferToVram(0);
CopyBgTilemapBufferToVram(2);
break;
case 6:
ShowBg(1);
ShowBg(2);
ShowBg(3);
gPaletteFade.bufferTransferDisabled = FALSE;
gUnknown_203F3CC->unk_01C1 = AddScrollIndicatorArrowPair(&gUnknown_203F3CC->unk_0394, &gUnknown_203F3CC->unk_01C6);
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
UpdatePaletteFade();
break;
default:
if (UpdatePaletteFade())
return 0;
gUnknown_203F3CC->unk_01C0_1 = 0;
return 1;
}
++gUnknown_203F3CC->unk_01C0_1;
return 0;
}
s32 FadeOutFromWonderNews(bool32 flag)
{
if (gUnknown_203F3CC == NULL)
return -1;
switch (gUnknown_203F3CC->unk_01C0_1)
{
case 0:
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
break;
case 1:
if (UpdatePaletteFade())
return 0;
ChangeBgY(2, 0, 0);
SetGpuReg(REG_OFFSET_WIN0H, 0);
SetGpuReg(REG_OFFSET_WIN0V, 0);
SetGpuReg(REG_OFFSET_WININ, 0);
SetGpuReg(REG_OFFSET_WINOUT, 0);
ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
break;
case 2:
FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);
FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 24);
FillBgTilemapBufferRect_Palette0(3, 0x000, 0, 0, 30, 24);
CopyBgTilemapBufferToVram(0);
CopyBgTilemapBufferToVram(1);
CopyBgTilemapBufferToVram(2);
CopyBgTilemapBufferToVram(3);
break;
case 3:
HideBg(1);
HideBg(2);
RemoveWindow(gUnknown_203F3CC->unk_01C8[1]);
RemoveWindow(gUnknown_203F3CC->unk_01C8[0]);
break;
case 4:
ChangeBgY(2, 0, 0);
ChangeBgY(3, 0, 0);
if (gUnknown_203F3CC->unk_01C1 != 0xFF)
{
RemoveScrollIndicatorArrowPair(gUnknown_203F3CC->unk_01C1);
gUnknown_203F3CC->unk_01C1 = 0xFF;
}
break;
case 5:
PrintMysteryGiftOrEReaderTopMenu(gGiftIsFromEReader, flag);
break;
case 6:
MG_DrawCheckerboardPattern();
CopyBgTilemapBufferToVram(0);
CopyBgTilemapBufferToVram(3);
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
break;
default:
if (UpdatePaletteFade())
return 0;
gUnknown_203F3CC->unk_01C0_1 = 0;
return 1;
}
++gUnknown_203F3CC->unk_01C0_1;
return 0;
}
void MENews_RemoveScrollIndicatorArrowPair(void)
{
if (!gUnknown_203F3CC->unk_01C0_0 && gUnknown_203F3CC->unk_01C1 != 0xFF)
{
RemoveScrollIndicatorArrowPair(gUnknown_203F3CC->unk_01C1);
gUnknown_203F3CC->unk_01C1 = 0xFF;
gUnknown_203F3CC->unk_01C0_0 = TRUE;
}
}
void MENews_AddScrollIndicatorArrowPair(void)
{
if (gUnknown_203F3CC->unk_01C0_0)
{
gUnknown_203F3CC->unk_01C1 = AddScrollIndicatorArrowPair(&gUnknown_203F3CC->unk_0394, &gUnknown_203F3CC->unk_01C6);
gUnknown_203F3CC->unk_01C0_0 = FALSE;
}
}
u32 MENews_GetInput(u16 input)
{
if (gUnknown_203F3CC->unk_01C2_0)
{
sub_8146B58();
return 0xFF;
}
switch (input)
{
case A_BUTTON:
return 0;
case B_BUTTON:
return 1;
case DPAD_UP:
if (gUnknown_203F3CC->unk_01C6 == 0)
return 0xFF;
if (gUnknown_203F3CC->unk_01C0_0)
return 0xFF;
gUnknown_203F3CC->unk_01C3_0 = FALSE;
break;
case DPAD_DOWN:
if (gUnknown_203F3CC->unk_01C6 == gUnknown_203F3CC->unk_01C4)
return 0xFF;
if (gUnknown_203F3CC->unk_01C0_0)
return 0xFF;
gUnknown_203F3CC->unk_01C3_0 = TRUE;
break;
default:
return 0xFF;
}
gUnknown_203F3CC->unk_01C2_0 = TRUE;
gUnknown_203F3CC->unk_01C2_1 = 2;
gUnknown_203F3CC->unk_01C3_1 = 0;
if (gUnknown_203F3CC->unk_01C3_0 == FALSE)
return 2;
else
return 3;
}
void sub_8146980(void)
{
u8 i = 0;
memcpy(gUnknown_203F3CC->unk_01CE, gUnknown_203F3CC->unk_0000.unk_04, 40);
gUnknown_203F3CC->unk_01CE[40] = EOS;
for (; i < 10; ++i)
{
memcpy(gUnknown_203F3CC->unk_01F7[i], gUnknown_203F3CC->unk_0000.unk_2C[i], 40);
gUnknown_203F3CC->unk_01F7[i][40] = EOS;
if (i > 7 && gUnknown_203F3CC->unk_01F7[i][0] != EOS)
++gUnknown_203F3CC->unk_01C4;
}
gUnknown_203F3CC->unk_0394 = gUnknown_8468050;
gUnknown_203F3CC->unk_0394.fullyDownThreshold = gUnknown_203F3CC->unk_01C4;
}
void sub_8146A30(void)
{
u8 i = 0;
s32 x;
PutWindowTilemap(gUnknown_203F3CC->unk_01C8[0]);
PutWindowTilemap(gUnknown_203F3CC->unk_01C8[1]);
FillWindowPixelBuffer(gUnknown_203F3CC->unk_01C8[0], 0);
FillWindowPixelBuffer(gUnknown_203F3CC->unk_01C8[1], 0);
x = (0xe0 - GetStringWidth(3, gUnknown_203F3CC->unk_01CE, GetFontAttribute(3, 2))) / 2;
if (x < 0)
x = 0;
AddTextPrinterParameterized3(gUnknown_203F3CC->unk_01C8[0], 3, x, 6, gUnknown_8468038[gUnknown_203F3CC->unk_01BC->textPal1], 0, gUnknown_203F3CC->unk_01CE);
for (; i < 10; ++i)
{
AddTextPrinterParameterized3(gUnknown_203F3CC->unk_01C8[1], 3, 0, 16 * i + 2, gUnknown_8468038[gUnknown_203F3CC->unk_01BC->textPal2], 0, gUnknown_203F3CC->unk_01F7[i]);
}
CopyWindowToVram(gUnknown_203F3CC->unk_01C8[0], 3);
CopyWindowToVram(gUnknown_203F3CC->unk_01C8[1], 3);
}
void sub_8146B58(void)
{
u16 r4 = gUnknown_203F3CC->unk_01C2_1;
r4 <<= 8;
if (gUnknown_203F3CC->unk_01C3_0)
{
ChangeBgY(2, r4, 1);
ChangeBgY(3, r4, 1);
}
else
{
ChangeBgY(2, r4, 2);
ChangeBgY(3, r4, 2);
}
gUnknown_203F3CC->unk_01C3_1 += gUnknown_203F3CC->unk_01C2_1;
if (gUnknown_203F3CC->unk_01C3_1 > 15)
{
if (gUnknown_203F3CC->unk_01C3_0)
++gUnknown_203F3CC->unk_01C6;
else
--gUnknown_203F3CC->unk_01C6;
gUnknown_203F3CC->unk_01C2_0 = FALSE;
gUnknown_203F3CC->unk_01C3_1 = 0;
}
}
+5 -4
View File
@@ -195,15 +195,16 @@ static u32 client_mainseq_4(struct mevent_client * svr)
mevent_client_send_word(svr, 0x13, svr->param);
break;
case 10:
sub_8143F68(svr->recvBuffer);
OverwriteSavedWonderCardWithReceivedCard(svr->recvBuffer);
break;
case 9:
if (!sub_8143EF4(svr->recvBuffer))
if (!MEvent_HaveAlreadyReceivedWonderNews(svr->recvBuffer))
{
sub_8143DC8(svr->recvBuffer);
OverwriteSavedWonderNewsWithReceivedNews(svr->recvBuffer);
mevent_client_send_word(svr, 0x13, 0);
}
else
// Other trainer already has news
mevent_client_send_word(svr, 0x13, 1);
break;
case 15:
@@ -211,7 +212,7 @@ static u32 client_mainseq_4(struct mevent_client * svr)
svr->flag = 0;
break;
case 16:
sub_8144254(svr->recvBuffer);
MEvent_ReceiveDistributionMon(svr->recvBuffer);
break;
case 17:
MEventSetRamScript(svr->recvBuffer, 1000);
+2 -2
View File
@@ -176,7 +176,7 @@ static u32 common_mainseq_4(struct mevent_srv_common * svr)
case 9:
AGB_ASSERT_EX(cmd->flag == FALSE, ABSPATH("mevent_server.c"), 408);
ptr = mevent_first_if_not_null_else_second(cmd->parameter, &svr->sendWord);
svr->param = sub_8144434(ptr, svr->mevent_unk1442cc, ptr);
svr->param = MEvent_CanPlayerReceiveDistributionMon(ptr, svr->mevent_unk1442cc, ptr);
break;
case 10:
AGB_ASSERT_EX(cmd->parameter == NULL, ABSPATH("mevent_server.c"), 415);
@@ -247,7 +247,7 @@ static u32 common_mainseq_4(struct mevent_srv_common * svr)
case 26:
AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, ABSPATH("mevent_server.c"), 506);
memcpy(svr->card, GetSavedWonderCard(), 332);
sub_814410C(svr->card);
MEvent_WonderCardResetUnk08_6(svr->card);
break;
case 27:
AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, ABSPATH("mevent_server.c"), 512);
+459
View File
@@ -0,0 +1,459 @@
#include "global.h"
#include "constants/species.h"
#include "bg.h"
#include "gpu_regs.h"
#include "palette.h"
#include "decompress.h"
#include "malloc.h"
#include "menu.h"
#include "new_menu_helpers.h"
#include "pokemon_icon.h"
#include "mystery_gift_menu.h"
#include "menu_indicators.h"
#include "string_util.h"
#include "link_rfu.h"
#include "mevent.h"
#include "battle_anim.h"
struct MEventScreenMgr_02DC
{
u8 nDigits;
u8 nameTxt[41];
u8 numberTxt[4];
};
struct MEventScreenMgr
{
/*0000*/ struct MEWonderCardData wonderCard;
/*014c*/ struct MEventBuffer_3430_Sub buff3430Sub;
/*0170*/ const struct UnkStruct_8467FB8 * bgSpec;
/*0174*/ u8 state;
/*0175*/ u8 recordIdx;
/*0176*/ u16 windowIds[3];
/*017C*/ u8 monIconId;
/*017D*/ u8 cardIconAndShadowSprites[7][2];
/*018B*/ u8 title[41];
/*01B4*/ u8 subtitle[41];
/*01DD*/ u8 unk_01DD[7];
/*01E4*/ u8 mainMessageLines[4][41];
/*0288*/ u8 instructionsLine1[41];
/*02B1*/ u8 instructionsLine2[41];
/*02DC*/ struct MEventScreenMgr_02DC recordStrings[8];
/*045C*/ u8 buffer_045C[0x1000];
};
static EWRAM_DATA struct MEventScreenMgr * sMEventScreenData = NULL;
static void sub_8145A98(void);
static void sub_8145D18(u8 whichWindow);
static void sub_8146060(void);
static void sub_81461D8(void);
static const u8 gUnknown_8467068[][3] = {
{0, 2, 3},
{0, 1, 2}
};
static const u8 ALIGNED(4) sTextYCoords[3] = {7, 4, 7};
static const struct WindowTemplate sWindowTemplates[] = {
{
.bg = 1,
.tilemapLeft = 1,
.tilemapTop = 1,
.width = 25,
.height = 4,
.paletteNum = 15,
.baseBlock = 0x29c},
{
.bg = 1,
.tilemapLeft = 1,
.tilemapTop = 6,
.width = 28,
.height = 8,
.paletteNum = 15,
.baseBlock = 0x1bc},
{
.bg = 1,
.tilemapLeft = 1,
.tilemapTop = 14,
.width = 28,
.height = 5,
.paletteNum = 15,
.baseBlock = 0x130}
};
static const u16 gCard0Pal[] = INCBIN_U16("data/graphics/mevent/pal_46708C.gbapal");
const u16 gCard1Pal[] = INCBIN_U16("data/graphics/mevent/pal_4670AC.gbapal");
const u16 gCard2Pal[] = INCBIN_U16("data/graphics/mevent/pal_4670CC.gbapal");
const u16 gCard3Pal[] = INCBIN_U16("data/graphics/mevent/pal_4670EC.gbapal");
const u16 gCard4Pal[] = INCBIN_U16("data/graphics/mevent/pal_46710C.gbapal");
const u16 gCard5Pal[] = INCBIN_U16("data/graphics/mevent/pal_46712C.gbapal");
static const u16 gCard6Pal[] = INCBIN_U16("data/graphics/mevent/pal_46714C.gbapal");
static const u16 gCard7Pal[] = INCBIN_U16("data/graphics/mevent/pal_46716C.gbapal");
static const u8 sCard0Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_46718C.4bpp.lz");
static const u8 sCard0Map[] = INCBIN_U8("data/graphics/mevent/tilemap_467288.bin.lz");
static const u8 sCard1Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_46737C.4bpp.lz");
static const u8 sCard1Map[] = INCBIN_U8("data/graphics/mevent/tilemap_467470.bin.lz");
static const u8 sCard2Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_467558.4bpp.lz");
static const u8 sCard2Map[] = INCBIN_U8("data/graphics/mevent/tilemap_46762C.bin.lz");
static const u8 sCard6Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_467700.4bpp.lz");
static const u8 sCard6Map[] = INCBIN_U8("data/graphics/mevent/tilemap_467934.bin.lz");
static const u8 sCard7Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_467A7C.4bpp.lz");
static const u8 sCard7Map[] = INCBIN_U8("data/graphics/mevent/tilemap_467CAC.bin.lz");
static const u16 gUnknown_8467DF4[] = INCBIN_U16("data/graphics/mevent/pal_467DF4.gbapal");
static const u16 gUnknown_8467E14[] = INCBIN_U16("data/graphics/mevent/pal_467E14.gbapal");
static const u16 gUnknown_8467E34[] = INCBIN_U16("data/graphics/mevent/pal_467E34.gbapal");
static const u16 gUnknown_8467E54[] = INCBIN_U16("data/graphics/mevent/pal_467E54.gbapal");
static const u16 gUnknown_8467E74[] = INCBIN_U16("data/graphics/mevent/pal_467E74.gbapal");
static const u16 gUnknown_8467E94[] = INCBIN_U16("data/graphics/mevent/pal_467E94.gbapal");
static const u16 gUnknown_8467EB4[] = INCBIN_U16("data/graphics/mevent/pal_467EB4.gbapal");
static const u16 gUnknown_8467ED4[] = INCBIN_U16("data/graphics/mevent/pal_467ED4.gbapal");
static const u32 gUnknown_8467EF4[] = INCBIN_U32("data/graphics/mevent/gfx_467EF4.4bpp.lz");
static const struct CompressedSpriteSheet sShadowSpriteSheet = {
gUnknown_8467EF4, 0x100, 0x8000
};
static const struct SpritePalette sShadowSpritePalettes[] = {
{gUnknown_8467DF4, 0x8000},
{gUnknown_8467E14, 0x8000},
{gUnknown_8467E34, 0x8000},
{gUnknown_8467E54, 0x8000},
{gUnknown_8467E74, 0x8000},
{gUnknown_8467E94, 0x8000},
{gUnknown_8467EB4, 0x8000},
{gUnknown_8467ED4, 0x8000}
};
static const struct SpriteTemplate sShadowSpriteTemplate = {
0x8000, 0x8000, &gOamData_AffineOff_ObjNormal_32x16, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
};
static const struct UnkStruct_8467FB8 sCardGfxPtrs[8] = {
{1, 0, 0, 0, sCard0Gfx, sCard0Map, gCard0Pal},
{1, 0, 0, 1, sCard1Gfx, sCard1Map, gCard1Pal},
{1, 0, 0, 2, sCard2Gfx, sCard2Map, gCard2Pal},
{1, 0, 0, 3, sCard2Gfx, sCard2Map, gCard3Pal},
{1, 0, 0, 4, sCard2Gfx, sCard2Map, gCard4Pal},
{1, 0, 0, 5, sCard2Gfx, sCard2Map, gCard5Pal},
{1, 0, 0, 6, sCard6Gfx, sCard6Map, gCard6Pal},
{1, 0, 0, 7, sCard7Gfx, sCard7Map, gCard7Pal}
};
bool32 InitWonderCardResources(struct MEWonderCardData * card, struct MEventBuffer_3430_Sub * b3430sub)
{
if (card == NULL || b3430sub == NULL)
return FALSE;
sMEventScreenData = AllocZeroed(sizeof(struct MEventScreenMgr));
if (sMEventScreenData == NULL)
return FALSE;
sMEventScreenData->wonderCard = *card;
sMEventScreenData->buff3430Sub = *b3430sub;
if (sMEventScreenData->wonderCard.unk_08_2 >= NELEMS(sCardGfxPtrs))
sMEventScreenData->wonderCard.unk_08_2 = 0;
if (sMEventScreenData->wonderCard.unk_08_0 >= NELEMS(sTextYCoords))
sMEventScreenData->wonderCard.unk_08_0 = 0;
if (sMEventScreenData->wonderCard.recvMonCapacity > NELEMS(sMEventScreenData->cardIconAndShadowSprites))
sMEventScreenData->wonderCard.recvMonCapacity = 0;
sMEventScreenData->bgSpec = &sCardGfxPtrs[sMEventScreenData->wonderCard.unk_08_2];
return TRUE;
}
void DestroyWonderCardResources(void)
{
if (sMEventScreenData != NULL)
{
*sMEventScreenData = (struct MEventScreenMgr){};
Free(sMEventScreenData);
sMEventScreenData = NULL;
}
}
s32 FadeToWonderCardMenu(void)
{
if (sMEventScreenData == NULL)
return -1;
switch(sMEventScreenData->state)
{
case 0:
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
break;
case 1:
if (UpdatePaletteFade())
return 0;
break;
case 2:
FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);
FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20);
CopyBgTilemapBufferToVram(0);
CopyBgTilemapBufferToVram(1);
CopyBgTilemapBufferToVram(2);
DecompressAndCopyTileDataToVram(2, sMEventScreenData->bgSpec->tiles, 0, 0x008, 0);
sMEventScreenData->windowIds[0] = AddWindow(&sWindowTemplates[0]);
sMEventScreenData->windowIds[1] = AddWindow(&sWindowTemplates[1]);
sMEventScreenData->windowIds[2] = AddWindow(&sWindowTemplates[2]);
break;
case 3:
if (FreeTempTileDataBuffersIfPossible())
return 0;
gPaletteFade.bufferTransferDisabled = TRUE;
LoadPalette(sMEventScreenData->bgSpec->pal, 0x10, 0x20);
LZ77UnCompWram(sMEventScreenData->bgSpec->map, sMEventScreenData->buffer_045C);
CopyRectToBgTilemapBufferRect(2, sMEventScreenData->buffer_045C, 0, 0, 30, 20, 0, 0, 30, 20, 1, 0x008, 0);
CopyBgTilemapBufferToVram(2);
break;
case 4:
sub_8145A98();
break;
case 5:
sub_8145D18(0);
sub_8145D18(1);
sub_8145D18(2);
CopyBgTilemapBufferToVram(1);
break;
case 6:
LoadMonIconPalettes();
break;
case 7:
ShowBg(1);
ShowBg(2);
gPaletteFade.bufferTransferDisabled = FALSE;
sub_8146060();
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
UpdatePaletteFade();
break;
default:
if (UpdatePaletteFade())
return 0;
sMEventScreenData->state = 0;
return 1;
}
++sMEventScreenData->state;
return 0;
}
s32 FadeOutFromWonderCard(bool32 flag)
{
if (sMEventScreenData == NULL)
return -1;
switch (sMEventScreenData->state)
{
case 0:
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
break;
case 1:
if (UpdatePaletteFade())
return 0;
break;
case 2:
FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);
FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20);
CopyBgTilemapBufferToVram(0);
CopyBgTilemapBufferToVram(1);
CopyBgTilemapBufferToVram(2);
break;
case 3:
HideBg(1);
HideBg(2);
RemoveWindow(sMEventScreenData->windowIds[2]);
RemoveWindow(sMEventScreenData->windowIds[1]);
RemoveWindow(sMEventScreenData->windowIds[0]);
break;
case 4:
sub_81461D8();
FreeMonIconPalettes();
break;
case 5:
PrintMysteryGiftOrEReaderTopMenu(gGiftIsFromEReader, flag);
break;
case 6:
CopyBgTilemapBufferToVram(0);
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
break;
default:
if (UpdatePaletteFade())
return 0;
sMEventScreenData->state = 0;
return 1;
}
++sMEventScreenData->state;
return 0;
}
static void sub_8145A98(void)
{
u16 i = 0;
u16 r6;
u16 sp0[3] = {0, 0, 0};
memcpy(sMEventScreenData->title, sMEventScreenData->wonderCard.unk_0A, 40);
sMEventScreenData->title[40] = EOS;
memcpy(sMEventScreenData->subtitle, sMEventScreenData->wonderCard.unk_32, 40);
sMEventScreenData->subtitle[40] = EOS;
if (sMEventScreenData->wonderCard.unk_04 > 999999)
sMEventScreenData->wonderCard.unk_04 = 999999;
ConvertIntToDecimalStringN(sMEventScreenData->unk_01DD, sMEventScreenData->wonderCard.unk_04, STR_CONV_MODE_LEFT_ALIGN, 6);
for (i = 0; i < 4; i++)
{
memcpy(sMEventScreenData->mainMessageLines[i], sMEventScreenData->wonderCard.unk_5A[i], 40);
sMEventScreenData->mainMessageLines[i][40] = EOS;
}
memcpy(sMEventScreenData->instructionsLine1, sMEventScreenData->wonderCard.unk_FA, 40);
sMEventScreenData->instructionsLine1[40] = EOS;
switch (sMEventScreenData->wonderCard.unk_08_0)
{
case 0:
memcpy(sMEventScreenData->instructionsLine2, sMEventScreenData->wonderCard.unk_122, 40);
sMEventScreenData->instructionsLine2[40] = EOS;
break;
case 1:
sMEventScreenData->instructionsLine2[00] = EOS;
break;
case 2:
sMEventScreenData->instructionsLine2[00] = EOS;
sp0[0] = sMEventScreenData->buff3430Sub.linkWins < 999 ? sMEventScreenData->buff3430Sub.linkWins : 999;
sp0[1] = sMEventScreenData->buff3430Sub.linkLosses < 999 ? sMEventScreenData->buff3430Sub.linkLosses : 999;
sp0[2] = sMEventScreenData->buff3430Sub.linkTrades < 999 ? sMEventScreenData->buff3430Sub.linkTrades : 999;
for (i = 0; i < 8; i++)
{
memset(sMEventScreenData->recordStrings[i].numberTxt, EOS, 4);
memset(sMEventScreenData->recordStrings[i].nameTxt, EOS, 41);
}
for (i = 0, r6 = 0; i < 40; i++)
{
if (sMEventScreenData->wonderCard.unk_122[i] != CHAR_SPECIAL_F7)
{
sMEventScreenData->recordStrings[sMEventScreenData->recordIdx].nameTxt[r6] = sMEventScreenData->wonderCard.unk_122[i];
r6++;
}
else
{
u8 r3 = sMEventScreenData->wonderCard.unk_122[i + 1];
if (r3 > 2)
{
i += 2;
}
else
{
ConvertIntToDecimalStringN(sMEventScreenData->recordStrings[sMEventScreenData->recordIdx].numberTxt, sp0[r3], STR_CONV_MODE_LEADING_ZEROS, 3);
sMEventScreenData->recordStrings[sMEventScreenData->recordIdx].nDigits = sMEventScreenData->wonderCard.unk_122[i + 2];
sMEventScreenData->recordIdx++;
if (sMEventScreenData->recordIdx > 7)
break;
r6 = 0;
i += 2;
}
}
}
}
}
static void sub_8145D18(u8 whichWindow)
{
s8 sp0C = 0;
s32 windowId = sMEventScreenData->windowIds[whichWindow];
PutWindowTilemap(windowId);
FillWindowPixelBuffer(windowId, 0);
switch (whichWindow)
{
case 0:
{
s32 x;
AddTextPrinterParameterized3(windowId, 3, 0, 1, gUnknown_8467068[sMEventScreenData->bgSpec->textPal1], 0, sMEventScreenData->title);
x = 160 - GetStringWidth(3, sMEventScreenData->subtitle, GetFontAttribute(3, 2));
if (x < 0)
x = 0;
AddTextPrinterParameterized3(windowId, 3, x, 17, gUnknown_8467068[sMEventScreenData->bgSpec->textPal1], 0, sMEventScreenData->subtitle);
if (sMEventScreenData->wonderCard.unk_04 != 0)
{
AddTextPrinterParameterized3(windowId, 2, 166, 17, gUnknown_8467068[sMEventScreenData->bgSpec->textPal1], 0, sMEventScreenData->unk_01DD);
}
break;
}
case 1:
for (; sp0C < 4; sp0C++)
{
AddTextPrinterParameterized3(windowId, 3, 0, 16 * sp0C + 2, gUnknown_8467068[sMEventScreenData->bgSpec->textPal2], 0, sMEventScreenData->mainMessageLines[sp0C]);
}
break;
case 2:
AddTextPrinterParameterized3(windowId, 3, 0, sTextYCoords[sMEventScreenData->wonderCard.unk_08_0], gUnknown_8467068[sMEventScreenData->bgSpec->textPal3], 0, sMEventScreenData->instructionsLine1);
if (sMEventScreenData->wonderCard.unk_08_0 != 2)
{
AddTextPrinterParameterized3(windowId, 3, 0, 16 + sTextYCoords[sMEventScreenData->wonderCard.unk_08_0], gUnknown_8467068[sMEventScreenData->bgSpec->textPal3], 0, sMEventScreenData->instructionsLine2);
}
else
{
s32 x = 0;
s32 y = sTextYCoords[sMEventScreenData->wonderCard.unk_08_0] + 16;
s32 spacing = GetFontAttribute(3, 2);
for (; sp0C < sMEventScreenData->recordIdx; sp0C++)
{
AddTextPrinterParameterized3(windowId, 3, x, y, gUnknown_8467068[sMEventScreenData->bgSpec->textPal3], 0, sMEventScreenData->recordStrings[sp0C].nameTxt);
if (sMEventScreenData->recordStrings[sp0C].numberTxt[0] != EOS)
{
x += GetStringWidth(3, sMEventScreenData->recordStrings[sp0C].nameTxt, spacing);
AddTextPrinterParameterized3(windowId, 2, x, y, gUnknown_8467068[sMEventScreenData->bgSpec->textPal3], 0, sMEventScreenData->recordStrings[sp0C].numberTxt);
x += GetStringWidth(3, sMEventScreenData->recordStrings[sp0C].numberTxt, spacing) + sMEventScreenData->recordStrings[sp0C].nDigits;
}
}
}
break;
}
CopyWindowToVram(windowId, 3);
}
static void sub_8146060(void)
{
u8 r7 = 0;
sMEventScreenData->monIconId = 0xFF;
if (sMEventScreenData->buff3430Sub.unk_06 != SPECIES_NONE)
{
sMEventScreenData->monIconId = CreateMonIcon_HandleDeoxys(MailSpeciesToIconSpecies(sMEventScreenData->buff3430Sub.unk_06), SpriteCallbackDummy, 0xDC, 0x14, 0, FALSE);
gSprites[sMEventScreenData->monIconId].oam.priority = 2;
}
if (sMEventScreenData->wonderCard.recvMonCapacity != 0 && sMEventScreenData->wonderCard.unk_08_0 == 1)
{
LoadCompressedSpriteSheetUsingHeap(&sShadowSpriteSheet);
LoadSpritePalette(&sShadowSpritePalettes[sMEventScreenData->bgSpec->index]);
for (; r7 < sMEventScreenData->wonderCard.recvMonCapacity; r7++)
{
sMEventScreenData->cardIconAndShadowSprites[r7][0] = 0xFF;
sMEventScreenData->cardIconAndShadowSprites[r7][1] = 0xFF;
sMEventScreenData->cardIconAndShadowSprites[r7][0] = CreateSprite(&sShadowSpriteTemplate, 0xd8 - 32 * r7, 0x90, 8);
if (sMEventScreenData->buff3430Sub.distributedMons[0][r7] != 0)
{
sMEventScreenData->cardIconAndShadowSprites[r7][1] = CreateMonIcon_HandleDeoxys(MailSpeciesToIconSpecies(sMEventScreenData->buff3430Sub.distributedMons[0][r7]), SpriteCallbackDummy, 0xd8 - 32 * r7, 0x88, 0, 0);
gSprites[sMEventScreenData->cardIconAndShadowSprites[r7][1]].oam.priority = 2;
}
}
}
}
static void sub_81461D8(void)
{
u8 r6 = 0;
if (sMEventScreenData->monIconId != 0xFF)
DestroyMonIcon(&gSprites[sMEventScreenData->monIconId]);
if (sMEventScreenData->wonderCard.recvMonCapacity != 0 && sMEventScreenData->wonderCard.unk_08_0 == 1)
{
for (; r6 < sMEventScreenData->wonderCard.recvMonCapacity; r6++)
{
if (sMEventScreenData->cardIconAndShadowSprites[r6][0] != 0xFF)
{
DestroySprite(&gSprites[sMEventScreenData->cardIconAndShadowSprites[r6][0]]);
// This might be a typo. Uncomment the next line, and comment the one that follows, to get the presumed intended behavior.
// if (sMEventScreenData->cardIconAndShadowSprites[r6][1] != 0xFF)
if (sMEventScreenData->cardIconAndShadowSprites[r6][0] != 0xFF)
{
DestroyMonIcon(&gSprites[sMEventScreenData->cardIconAndShadowSprites[r6][1]]);
}
}
}
FreeSpriteTilesByTag(0x8000);
FreeSpritePaletteByTag(0x8000);
}
}
+357
View File
@@ -0,0 +1,357 @@
#include "global.h"
#include "gflib.h"
#include "menu_indicators.h"
#include "new_menu_helpers.h"
#include "mevent.h"
#include "mystery_gift_menu.h"
#include "menu.h"
#include "link_rfu.h"
struct UnkStruct_203F3CC
{
/*0000*/ struct MEWonderNewsData wonderNews;
/*01bc*/ const struct UnkStruct_8467FB8 * bgSpec;
/*01c0*/ u8 verticalScrollDisabled:1;
u8 state:7;
/*01c1*/ u8 menuIndicatorsId;
/*01c2*/ u8 unk_01C2_0:1;
u8 unk_01C2_1:7;
/*01c3*/ u8 scrollDirection:1;
u8 unk_01C3_1:7;
/*01c4*/ u16 numMails;
/*01c6*/ u16 scrollOffset;
/*01c8*/ u16 windowIds[2];
/*01cc*/ u8 filler_01CC[2];
/*01ce*/ u8 title[41];
/*01f7*/ u8 messages[10][41];
/*0394*/ struct ScrollArrowsTemplate scrollArrowsTemplate;
/*03a4*/ u8 buffer_03A4[0x1000];
};
static EWRAM_DATA struct UnkStruct_203F3CC * sWork = NULL;
static void sub_8146980(void);
static void sub_8146A30(void);
static void sub_8146B58(void);
static const u8 sTextPals[][3] = {
{0, 2, 3},
{0, 1, 2}
};
static const struct WindowTemplate gUnknown_8468040[] = {
{0, 1, 0, 28, 3, 15, 0x000},
{2, 1, 3, 28, 20, 15, 0x000}
};
static const struct ScrollArrowsTemplate sScrollArrowsTemplate = {
0x02, 0xe8, 0x18, 0x03, 0xe8, 0x98,
0x0000, 0x0002, 0x1000, 0x1000, 0x0,
};
static const u16 sNews1Pal[] = INCBIN_U16("data/graphics/mevent/pal_468060.gbapal");
static const u16 sNews6Pal[] = INCBIN_U16("data/graphics/mevent/pal_468080.gbapal");
static const u16 sNews7Pal[] = INCBIN_U16("data/graphics/mevent/pal_4680A0.gbapal");
static const u8 sNews0Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_4680C0.4bpp.lz");
static const u8 sNews0Map[] = INCBIN_U8("data/graphics/mevent/tilemap_468140.bin.lz");
static const u8 sNews1Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_46821C.4bpp.lz");
static const u8 sNews1Map[] = INCBIN_U8("data/graphics/mevent/tilemap_46824C.bin.lz");
static const u8 sNews2Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_46830C.4bpp.lz");
static const u8 sNews2Map[] = INCBIN_U8("data/graphics/mevent/tilemap_46837C.bin.lz");
static const u8 sNews6Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_468448.4bpp.lz");
static const u8 sNews6Map[] = INCBIN_U8("data/graphics/mevent/tilemap_4684D8.bin.lz");
static const u8 sNews7Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_4685B4.4bpp.lz");
static const u8 sNews7Map[] = INCBIN_U8("data/graphics/mevent/tilemap_468644.bin.lz");
static const struct UnkStruct_8467FB8 sBgSpecs[] = {
{1, 0, 0, 0, sNews0Gfx, sNews0Map, sNews1Pal},
{1, 0, 0, 0, sNews1Gfx, sNews1Map, gCard1Pal},
{1, 0, 0, 0, sNews2Gfx, sNews2Map, gCard2Pal},
{1, 0, 0, 0, sNews2Gfx, sNews2Map, gCard3Pal},
{1, 0, 0, 0, sNews2Gfx, sNews2Map, gCard4Pal},
{1, 0, 0, 0, sNews2Gfx, sNews2Map, gCard5Pal},
{1, 0, 0, 0, sNews6Gfx, sNews6Map, sNews6Pal},
{1, 0, 0, 0, sNews7Gfx, sNews7Map, sNews7Pal}
};
bool32 InitWonderNewsResources(const struct MEWonderNewsData * news)
{
if (news == NULL)
return FALSE;
sWork = AllocZeroed(sizeof(struct UnkStruct_203F3CC));
if (sWork == NULL)
return FALSE;
sWork->wonderNews = *news;
if (sWork->wonderNews.unk_03 >= NELEMS(sBgSpecs))
sWork->wonderNews.unk_03 = 0;
sWork->bgSpec = &sBgSpecs[sWork->wonderNews.unk_03];
sWork->menuIndicatorsId = 0xFF;
return TRUE;
}
void DestroyWonderNewsResources(void)
{
if (sWork != NULL)
{
*sWork = (struct UnkStruct_203F3CC){};
Free(sWork);
sWork = NULL;
}
}
s32 FadeToWonderNewsMenu(void)
{
if (sWork == NULL)
return -1;
switch (sWork->state)
{
case 0:
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
break;
case 1:
if (UpdatePaletteFade())
return 0;
ChangeBgY(0, 0, 0);
ChangeBgY(1, 0, 0);
ChangeBgY(2, 0, 0);
ChangeBgY(3, 0, 0);
SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 240));
SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(26, 152));
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ);
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ);
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
break;
case 2:
FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);
FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20);
FillBgTilemapBufferRect_Palette0(3, 0x000, 0, 0, 30, 20);
CopyBgTilemapBufferToVram(0);
CopyBgTilemapBufferToVram(1);
CopyBgTilemapBufferToVram(2);
CopyBgTilemapBufferToVram(3);
DecompressAndCopyTileDataToVram(3, sWork->bgSpec->tiles, 0, 8, 0);
sWork->windowIds[0] = AddWindow(&gUnknown_8468040[0]);
sWork->windowIds[1] = AddWindow(&gUnknown_8468040[1]);
break;
case 3:
if (FreeTempTileDataBuffersIfPossible())
return 0;
gPaletteFade.bufferTransferDisabled = TRUE;
LoadPalette(sWork->bgSpec->pal, 0x10, 0x20);
LZ77UnCompWram(sWork->bgSpec->map, sWork->buffer_03A4);
CopyRectToBgTilemapBufferRect(1, sWork->buffer_03A4, 0, 0, 30, 3, 0, 0, 30, 3, 1, 8, 0);
CopyRectToBgTilemapBufferRect(3, sWork->buffer_03A4, 0, 3, 30, 23, 0, 3, 30, 23, 1, 8, 0);
CopyBgTilemapBufferToVram(1);
CopyBgTilemapBufferToVram(3);
break;
case 4:
sub_8146980();
break;
case 5:
sub_8146A30();
CopyBgTilemapBufferToVram(0);
CopyBgTilemapBufferToVram(2);
break;
case 6:
ShowBg(1);
ShowBg(2);
ShowBg(3);
gPaletteFade.bufferTransferDisabled = FALSE;
sWork->menuIndicatorsId = AddScrollIndicatorArrowPair(&sWork->scrollArrowsTemplate, &sWork->scrollOffset);
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
UpdatePaletteFade();
break;
default:
if (UpdatePaletteFade())
return 0;
sWork->state = 0;
return 1;
}
++sWork->state;
return 0;
}
s32 FadeOutFromWonderNews(bool32 flag)
{
if (sWork == NULL)
return -1;
switch (sWork->state)
{
case 0:
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
break;
case 1:
if (UpdatePaletteFade())
return 0;
ChangeBgY(2, 0, 0);
SetGpuReg(REG_OFFSET_WIN0H, 0);
SetGpuReg(REG_OFFSET_WIN0V, 0);
SetGpuReg(REG_OFFSET_WININ, 0);
SetGpuReg(REG_OFFSET_WINOUT, 0);
ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
break;
case 2:
FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20);
FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20);
FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 24);
FillBgTilemapBufferRect_Palette0(3, 0x000, 0, 0, 30, 24);
CopyBgTilemapBufferToVram(0);
CopyBgTilemapBufferToVram(1);
CopyBgTilemapBufferToVram(2);
CopyBgTilemapBufferToVram(3);
break;
case 3:
HideBg(1);
HideBg(2);
RemoveWindow(sWork->windowIds[1]);
RemoveWindow(sWork->windowIds[0]);
break;
case 4:
ChangeBgY(2, 0, 0);
ChangeBgY(3, 0, 0);
if (sWork->menuIndicatorsId != 0xFF)
{
RemoveScrollIndicatorArrowPair(sWork->menuIndicatorsId);
sWork->menuIndicatorsId = 0xFF;
}
break;
case 5:
PrintMysteryGiftOrEReaderTopMenu(gGiftIsFromEReader, flag);
break;
case 6:
MG_DrawCheckerboardPattern();
CopyBgTilemapBufferToVram(0);
CopyBgTilemapBufferToVram(3);
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
break;
default:
if (UpdatePaletteFade())
return 0;
sWork->state = 0;
return 1;
}
++sWork->state;
return 0;
}
void MENews_RemoveScrollIndicatorArrowPair(void)
{
if (!sWork->verticalScrollDisabled && sWork->menuIndicatorsId != 0xFF)
{
RemoveScrollIndicatorArrowPair(sWork->menuIndicatorsId);
sWork->menuIndicatorsId = 0xFF;
sWork->verticalScrollDisabled = TRUE;
}
}
void MENews_AddScrollIndicatorArrowPair(void)
{
if (sWork->verticalScrollDisabled)
{
sWork->menuIndicatorsId = AddScrollIndicatorArrowPair(&sWork->scrollArrowsTemplate, &sWork->scrollOffset);
sWork->verticalScrollDisabled = FALSE;
}
}
u32 MENews_GetInput(u16 input)
{
if (sWork->unk_01C2_0)
{
sub_8146B58();
return 0xFF;
}
switch (input)
{
case A_BUTTON:
return 0;
case B_BUTTON:
return 1;
case DPAD_UP:
if (sWork->scrollOffset == 0)
return 0xFF;
if (sWork->verticalScrollDisabled)
return 0xFF;
sWork->scrollDirection = FALSE;
break;
case DPAD_DOWN:
if (sWork->scrollOffset == sWork->numMails)
return 0xFF;
if (sWork->verticalScrollDisabled)
return 0xFF;
sWork->scrollDirection = TRUE;
break;
default:
return 0xFF;
}
sWork->unk_01C2_0 = TRUE;
sWork->unk_01C2_1 = 2;
sWork->unk_01C3_1 = 0;
if (sWork->scrollDirection == FALSE)
return 2;
else
return 3;
}
static void sub_8146980(void)
{
u8 i = 0;
memcpy(sWork->title, sWork->wonderNews.unk_04, 40);
sWork->title[40] = EOS;
for (; i < 10; ++i)
{
memcpy(sWork->messages[i], sWork->wonderNews.unk_2C[i], 40);
sWork->messages[i][40] = EOS;
if (i > 7 && sWork->messages[i][0] != EOS)
++sWork->numMails;
}
sWork->scrollArrowsTemplate = sScrollArrowsTemplate;
sWork->scrollArrowsTemplate.fullyDownThreshold = sWork->numMails;
}
static void sub_8146A30(void)
{
u8 i = 0;
s32 x;
PutWindowTilemap(sWork->windowIds[0]);
PutWindowTilemap(sWork->windowIds[1]);
FillWindowPixelBuffer(sWork->windowIds[0], 0);
FillWindowPixelBuffer(sWork->windowIds[1], 0);
x = (0xe0 - GetStringWidth(3, sWork->title, GetFontAttribute(3, 2))) / 2;
if (x < 0)
x = 0;
AddTextPrinterParameterized3(sWork->windowIds[0], 3, x, 6, sTextPals[sWork->bgSpec->textPal1], 0, sWork->title);
for (; i < 10; ++i)
{
AddTextPrinterParameterized3(sWork->windowIds[1], 3, 0, 16 * i + 2, sTextPals[sWork->bgSpec->textPal2], 0, sWork->messages[i]);
}
CopyWindowToVram(sWork->windowIds[0], 3);
CopyWindowToVram(sWork->windowIds[1], 3);
}
static void sub_8146B58(void)
{
u16 r4 = sWork->unk_01C2_1;
r4 <<= 8;
if (sWork->scrollDirection)
{
ChangeBgY(2, r4, 1);
ChangeBgY(3, r4, 1);
}
else
{
ChangeBgY(2, r4, 2);
ChangeBgY(3, r4, 2);
}
sWork->unk_01C3_1 += sWork->unk_01C2_1;
if (sWork->unk_01C3_1 > 15)
{
if (sWork->scrollDirection)
++sWork->scrollOffset;
else
--sWork->scrollOffset;
sWork->unk_01C2_0 = FALSE;
sWork->unk_01C3_1 = 0;
}
}
+91 -80
View File
@@ -5,72 +5,83 @@
#include "trig.h"
#include "constants/songs.h"
void sub_815F1AC(u8 taskId);
bool32 sub_815F2AC(u8 spriteId);
void sub_815F3E0(u8 spriteId1, u8 spriteId2, u8 spriteId3);
bool32 sub_815F444(u8 spriteId);
void sub_815F470(struct Sprite * sprite);
void sub_815F564(u16 tilesTag, u16 palTag);
u8 sub_815F5BC(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority);
void sub_815F610(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 * spriteId2_p, s16 * spriteId3_p);
static void Task_MinigameCountdown(u8 taskId);
static bool32 RunMinigameCountdownDigitsAnim(u8 spriteId);
static void StartStartGraphic(u8 spriteId1, u8 spriteId2, u8 spriteId3);
static bool32 IsStartGraphicAnimRunning(u8 spriteId);
static void SpriteCB_Start(struct Sprite * sprite);
static void Load321StartGfx(u16 tilesTag, u16 palTag);
static u8 CreateNumberSprite(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority);
static void CreateStartSprite(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 * spriteId2_p, s16 * spriteId3_p);
void sub_815F138(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority)
#define tState data[0]
#define tTilesTag data[2]
#define tPalTag data[3]
#define tX data[4]
#define tY data[5]
#define tSubpriority data[6]
#define tSpriteId1 data[7]
#define tSpriteId2 data[8]
#define tSpriteId3 data[9]
void StartMinigameCountdown(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority)
{
u8 taskId = CreateTask(sub_815F1AC, 80);
gTasks[taskId].data[2] = tilesTag;
gTasks[taskId].data[3] = palTag;
gTasks[taskId].data[4] = x;
gTasks[taskId].data[5] = y;
gTasks[taskId].data[6] = subpriority;
u8 taskId = CreateTask(Task_MinigameCountdown, 80);
gTasks[taskId].tTilesTag = tilesTag;
gTasks[taskId].tPalTag = palTag;
gTasks[taskId].tX = x;
gTasks[taskId].tY = y;
gTasks[taskId].tSubpriority = subpriority;
}
bool8 sub_815F198(void)
bool8 IsMinigameCountdownRunning(void)
{
return FuncIsActiveTask(sub_815F1AC);
return FuncIsActiveTask(Task_MinigameCountdown);
}
void sub_815F1AC(u8 taskId)
static void Task_MinigameCountdown(u8 taskId)
{
s16 * data = gTasks[taskId].data;
switch (data[0])
switch (tState)
{
case 0:
sub_815F564(data[2], data[3]);
data[7] = sub_815F5BC(data[2], data[3], data[4], data[5], data[6]);
sub_815F610(data[2], data[3], data[4], data[5], data[6], &data[8], &data[9]);
data[0]++;
Load321StartGfx(tTilesTag, tPalTag);
tSpriteId1 = CreateNumberSprite(tTilesTag, tPalTag, tX, tY, tSubpriority);
CreateStartSprite(tTilesTag, tPalTag, tX, tY, tSubpriority, &tSpriteId2, &tSpriteId3);
tState++;
break;
case 1:
if (!sub_815F2AC(data[7]))
if (!RunMinigameCountdownDigitsAnim(tSpriteId1))
{
sub_815F3E0(data[7], data[8], data[9]);
FreeSpriteOamMatrix(&gSprites[data[7]]);
DestroySprite(&gSprites[data[7]]);
data[0]++;
StartStartGraphic(tSpriteId1, tSpriteId2, tSpriteId3);
FreeSpriteOamMatrix(&gSprites[tSpriteId1]);
DestroySprite(&gSprites[tSpriteId1]);
tState++;
}
break;
case 2:
if (!sub_815F444(data[8]))
if (!IsStartGraphicAnimRunning(tSpriteId2))
{
DestroySprite(&gSprites[data[8]]);
DestroySprite(&gSprites[data[9]]);
FreeSpriteTilesByTag(data[2]);
FreeSpritePaletteByTag(data[3]);
DestroySprite(&gSprites[tSpriteId2]);
DestroySprite(&gSprites[tSpriteId3]);
FreeSpriteTilesByTag(tTilesTag);
FreeSpritePaletteByTag(tPalTag);
DestroyTask(taskId);
}
break;
}
}
bool32 sub_815F2AC(u8 spriteId)
static bool32 RunMinigameCountdownDigitsAnim(u8 spriteId)
{
struct Sprite * sprite = &gSprites[spriteId];
switch (sprite->data[0])
{
case 0:
sub_8007FFC(sprite, 0x800, 0x1A);
// some sort of affine transform; x transform disabled
obj_pos2_update_enable(sprite, 0x800, 0x1A);
sprite->data[0]++;
// fallthrough
case 1:
@@ -134,22 +145,22 @@ bool32 sub_815F2AC(u8 spriteId)
return TRUE;
}
void sub_815F3E0(u8 spriteId1, u8 spriteId2, u8 spriteId3)
static void StartStartGraphic(u8 spriteId1, u8 spriteId2, u8 spriteId3)
{
gSprites[spriteId2].pos2.y = -40;
gSprites[spriteId3].pos2.y = -40;
gSprites[spriteId2].invisible = FALSE;
gSprites[spriteId3].invisible = FALSE;
gSprites[spriteId2].callback = sub_815F470;
gSprites[spriteId3].callback = sub_815F470;
gSprites[spriteId2].callback = SpriteCB_Start;
gSprites[spriteId3].callback = SpriteCB_Start;
}
bool32 sub_815F444(u8 spriteId)
static bool32 IsStartGraphicAnimRunning(u8 spriteId)
{
return gSprites[spriteId].callback == sub_815F470;
return gSprites[spriteId].callback == SpriteCB_Start;
}
void sub_815F470(struct Sprite * sprite)
static void SpriteCB_Start(struct Sprite * sprite)
{
s16 * data = sprite->data;
s32 y;
@@ -200,103 +211,103 @@ void sub_815F470(struct Sprite * sprite)
}
}
const u16 gUnknown_847A328[] = INCBIN_U16("data/graphics/unk_847a348.gbapal");
const u16 gUnknown_847A348[] = INCBIN_U16("data/graphics/unk_847a348.4bpp.lz");
static const u16 sSpritePal_321Start[] = INCBIN_U16("data/graphics/unk_847a348.gbapal");
static const u16 sSpriteSheet_321Start[] = INCBIN_U16("data/graphics/unk_847a348.4bpp.lz");
void sub_815F564(u16 tilesTag, u16 palTag)
static void Load321StartGfx(u16 tilesTag, u16 palTag)
{
struct CompressedSpriteSheet spriteSheet = {(const void *)gUnknown_847A348, 0xE00};
struct SpritePalette spritePalette = {gUnknown_847A328};
struct CompressedSpriteSheet spriteSheet = {(const void *)sSpriteSheet_321Start, 0xE00};
struct SpritePalette spritePalette = {sSpritePal_321Start};
spriteSheet.tag = tilesTag;
spritePalette.tag = palTag;
LoadCompressedSpriteSheet(&spriteSheet);
LoadSpritePalette(&spritePalette);
}
const struct OamData gOamData_847A7AC = {
static const struct OamData sOamData_Numbers = {
.affineMode = ST_OAM_AFFINE_DOUBLE,
.shape = ST_OAM_SQUARE,
.size = 2
.shape = SPRITE_SHAPE(32x32),
.size = SPRITE_SIZE(32x32)
};
const struct OamData gOamData_847A7B4 = {
static const struct OamData sOamData_Start = {
.affineMode = ST_OAM_AFFINE_OFF,
.shape = ST_OAM_H_RECTANGLE,
.size = 3
.shape = SPRITE_SHAPE(64x32),
.size = SPRITE_SIZE(64x32)
};
const union AnimCmd gUnknown_847A7BC[] = {
static const union AnimCmd sAnim_Numbers_Three[] = {
ANIMCMD_FRAME( 0, 1),
ANIMCMD_END
};
const union AnimCmd gUnknown_847A7C4[] = {
static const union AnimCmd sAnim_Numbers_Two[] = {
ANIMCMD_FRAME(16, 1),
ANIMCMD_END
};
const union AnimCmd gUnknown_847A7CC[] = {
static const union AnimCmd sAnim_Numbers_One[] = {
ANIMCMD_FRAME(32, 1),
ANIMCMD_END
};
const union AnimCmd *const gUnknown_847A7D4[] = {
gUnknown_847A7BC,
gUnknown_847A7C4,
gUnknown_847A7CC
static const union AnimCmd *const sAnimTable_Numbers[] = {
sAnim_Numbers_Three,
sAnim_Numbers_Two,
sAnim_Numbers_One
};
const union AnimCmd gUnknown_847A7E0[] = {
static const union AnimCmd sAnim_StartLeft[] = {
ANIMCMD_FRAME(48, 1),
ANIMCMD_END
};
const union AnimCmd gUnknown_847A7E8[] = {
static const union AnimCmd sAnim_StartRight[] = {
ANIMCMD_FRAME(80, 1),
ANIMCMD_END
};
const union AnimCmd *const gUnknown_847A7F0[] = {
gUnknown_847A7E0,
gUnknown_847A7E8
static const union AnimCmd *const sAnimTable_Start[] = {
sAnim_StartLeft,
sAnim_StartRight
};
const union AffineAnimCmd gUnknown_847A7F8[] = {
static const union AffineAnimCmd sAffineAnim_Numbers_0[] = {
AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
AFFINEANIMCMD_END
};
const union AffineAnimCmd gUnknown_847A808[] = {
static const union AffineAnimCmd sAffineAnim_Numbers_1[] = {
AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
AFFINEANIMCMD_FRAME( 0x10, -0x10, 0, 8),
AFFINEANIMCMD_END
};
const union AffineAnimCmd gUnknown_847A820[] = {
static const union AffineAnimCmd sAffineAnim_Numbers_2[] = {
AFFINEANIMCMD_FRAME(-0x12, 0x12, 0, 8),
AFFINEANIMCMD_END
};
const union AffineAnimCmd gUnknown_847A830[] = {
static const union AffineAnimCmd sAffineAnim_Numbers_3[] = {
AFFINEANIMCMD_FRAME( 0x6, -0x6, 0, 8),
AFFINEANIMCMD_FRAME( -0x4, 0x4, 0, 8),
AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
AFFINEANIMCMD_END
};
const union AffineAnimCmd *const gUnknown_847A850[] = {
gUnknown_847A7F8,
gUnknown_847A808,
gUnknown_847A820,
gUnknown_847A830
static const union AffineAnimCmd *const sAffineAnimTable_Numbers[] = {
sAffineAnim_Numbers_0,
sAffineAnim_Numbers_1,
sAffineAnim_Numbers_2,
sAffineAnim_Numbers_3
};
u8 sub_815F5BC(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority)
static u8 CreateNumberSprite(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority)
{
struct SpriteTemplate spriteTemplate = {
.oam = &gOamData_847A7AC,
.anims = gUnknown_847A7D4,
.affineAnims = gUnknown_847A850,
.oam = &sOamData_Numbers,
.anims = sAnimTable_Numbers,
.affineAnims = sAffineAnimTable_Numbers,
.callback = SpriteCallbackDummy
};
spriteTemplate.tileTag = tilesTag;
@@ -304,11 +315,11 @@ u8 sub_815F5BC(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority)
return CreateSprite(&spriteTemplate, x, y, subpriority);
}
void sub_815F610(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 * spriteId2_p, s16 * spriteId3_p)
static void CreateStartSprite(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 * spriteId2_p, s16 * spriteId3_p)
{
struct SpriteTemplate spriteTemplate = {
.oam = &gOamData_847A7B4,
.anims = gUnknown_847A7F0,
.oam = &sOamData_Start,
.anims = sAnimTable_Start,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
+9 -8
View File
@@ -25,6 +25,7 @@
#include "help_system.h"
#include "strings.h"
#include "constants/songs.h"
#include "constants/union_room.h"
EWRAM_DATA u8 sDownArrowCounterAndYCoordIdx[8] = {};
EWRAM_DATA bool8 gGiftIsFromEReader = FALSE;
@@ -1237,21 +1238,21 @@ void task00_mystery_gift(u8 taskId)
case 0:
if (data->source == 1)
{
MEvent_CreateTask_CardOrNewsWithFriend(0x15);
MEvent_CreateTask_CardOrNewsWithFriend(ACTIVITY_WCARD2);
}
else if (data->source == 0)
{
MEvent_CreateTask_CardOrNewsOverWireless(0x15);
MEvent_CreateTask_CardOrNewsOverWireless(ACTIVITY_WCARD2);
}
break;
case 1:
if (data->source == 1)
{
MEvent_CreateTask_CardOrNewsWithFriend(0x16);
MEvent_CreateTask_CardOrNewsWithFriend(ACTIVITY_WNEWS2);
}
else if (data->source == 0)
{
MEvent_CreateTask_CardOrNewsOverWireless(0x16);
MEvent_CreateTask_CardOrNewsOverWireless(ACTIVITY_WNEWS2);
}
break;
}
@@ -1278,7 +1279,7 @@ void task00_mystery_gift(u8 taskId)
switch (mevent_client_do_exec(&data->curPromptWindowId))
{
case 6: // done
task_add_05_task_del_08FA224_when_no_RfuFunc();
Rfu_BeginBuildAndSendCommand5F();
data->prevPromptWindowId = data->curPromptWindowId;
data->state = 13;
break;
@@ -1595,10 +1596,10 @@ void task00_mystery_gift(u8 taskId)
switch (data->IsCardOrNews)
{
case 0:
MEvent_CreateTask_Leader(21);
MEvent_CreateTask_Leader(ACTIVITY_WCARD2);
break;
case 1:
MEvent_CreateTask_Leader(22);
MEvent_CreateTask_Leader(ACTIVITY_WNEWS2);
break;
}
data->source = 1;
@@ -1644,7 +1645,7 @@ void task00_mystery_gift(u8 taskId)
}
break;
case 33:
task_add_05_task_del_08FA224_when_no_RfuFunc();
Rfu_BeginBuildAndSendCommand5F();
StringCopy(gStringVar1, gLinkPlayers[1].name);
data->state = 34;
break;
+1 -1
View File
@@ -145,7 +145,7 @@ void NewGameInitData(void)
ResetTrainerFanClub();
UnionRoomChat_InitializeRegisteredTexts();
ResetMiniGamesResults();
sub_8143D24();
InitMEventData();
SetAllRenewableItemFlags();
WarpToPlayersRoom();
ScriptContext2_RunNewScript(EventScript_ResetAllMapFlags);
+2 -2
View File
@@ -3881,7 +3881,7 @@ static void CursorCB_Register(u8 taskId)
u16 species = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES);
u8 obedience = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_OBEDIENCE);
switch (CanRegisterMonForTradingBoard(*(struct GFtgtGnameSub *)sub_80F9800(), species2, species, obedience))
switch (CanRegisterMonForTradingBoard(*(struct GFtgtGnameSub *)GetHostRFUtgtGname(), species2, species, obedience))
{
case CANT_REGISTER_MON:
StringExpandPlaceholders(gStringVar4, gText_PkmnCantBeTradedNow);
@@ -3907,7 +3907,7 @@ static void CursorCB_Trade1(u8 taskId)
u16 species2 = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES2);
u16 species = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES);
u8 obedience = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_OBEDIENCE);
u32 stringId = GetUnionRoomTradeMessageId(*(struct GFtgtGnameSub *)sub_80F9800(), gUnknown_203B064, species2, gUnionRoomOfferedSpecies, gUnionRoomRequestedMonType, species, obedience);
u32 stringId = GetUnionRoomTradeMessageId(*(struct GFtgtGnameSub *)GetHostRFUtgtGname(), gPartnerTgtGnameSub, species2, gUnionRoomOfferedSpecies, gUnionRoomRequestedMonType, species, obedience);
if (stringId != UR_TRADE_MSG_NONE)
{
+4 -4
View File
@@ -562,8 +562,8 @@ void sub_8102F80(u8 taskId)
switch (gUnknown_203ACF0->field_01)
{
case 0:
sub_8107D38(0x10, 0);
sub_8107D38(0x20, 1);
ListMenuLoadStdPalAt(0x10, 0);
ListMenuLoadStdPalAt(0x20, 1);
gUnknown_203ACF0->field_48 = sub_8103518(gUnknown_203ACF0->field_42);
gUnknown_203ACF0->field_01 = 2;
break;
@@ -648,8 +648,8 @@ void sub_8103238(u8 taskId)
switch (gUnknown_203ACF0->field_01)
{
case 0:
sub_8107D38(0x10, 0);
sub_8107D38(0x20, 1);
ListMenuLoadStdPalAt(0x10, 0);
ListMenuLoadStdPalAt(0x20, 1);
gUnknown_203ACF0->field_48 = sub_8103518(gUnknown_203ACF0->field_42);
gUnknown_203ACF0->field_01 = 2;
break;
+107 -105
View File
@@ -10,14 +10,15 @@
#include "task.h"
#include "constants/flags.h"
#include "constants/event_object_movement.h"
#include "constants/union_room.h"
#include "constants/object_events.h"
static EWRAM_DATA struct UnionObj * UnionObjWork = NULL;
static EWRAM_DATA u32 sUnionObjRefreshTimer = 0;
static u8 StartUnionObjAnimTask(void);
static u32 sub_811BBC8(u32 playerIdx, u32 arg1);
static void sub_811C008(s32 arg0, s32 arg1, u8 arg2);
static u32 RfuUnionGroupMemberIsInvisible(u32 group, u32 member);
static void UnionPartnerObjectSetFacing(s32 member, s32 group, u8 direction);
static const u8 sUnionObjectEventGfxIds[][10] = {
[MALE] = {
@@ -69,12 +70,12 @@ static const u8 sOppositeFacingDirection[] = {
[DIR_EAST] = DIR_WEST
};
static const u8 gUnknown_845711B[] = {
1,
3,
1,
4,
2
static const u8 sUnionGroupMemberFacings[] = {
DIR_SOUTH,
DIR_WEST,
DIR_SOUTH,
DIR_EAST,
DIR_NORTH
};
static const u8 sUnionRoomLocalIds[] = {
@@ -116,19 +117,19 @@ static u8 GetUnionRoomPlayerGraphicsId(u32 gender, u32 id)
return sUnionObjectEventGfxIds[gender][id % 8];
}
static void GetUnionRoomPlayerFacingCoords(u32 id, u32 dirn, s32 * xp, s32 * yp)
static void GetUnionRoomPlayerFacingCoords(u32 group, u32 member, s32 * xp, s32 * yp)
{
*xp = sUnionPartnerCoords[id][0] + sFacingDirectionOffsets[dirn][0] + 7;
*yp = sUnionPartnerCoords[id][1] + sFacingDirectionOffsets[dirn][1] + 7;
*xp = sUnionPartnerCoords[group][0] + sFacingDirectionOffsets[member][0] + 7;
*yp = sUnionPartnerCoords[group][1] + sFacingDirectionOffsets[member][1] + 7;
}
static bool32 sub_811B58C(u32 id, u32 dirn, s32 x, s32 y)
static bool32 IsUnionRoomPlayerFacingTileAt(u32 group, u32 member, s32 x, s32 y)
{
if (sUnionPartnerCoords[id][0] + sFacingDirectionOffsets[dirn][0] + 7 != x)
if (sUnionPartnerCoords[group][0] + sFacingDirectionOffsets[member][0] + 7 != x)
{
return FALSE;
}
else if (sUnionPartnerCoords[id][1] + sFacingDirectionOffsets[dirn][1] + 7 != y)
else if (sUnionPartnerCoords[group][1] + sFacingDirectionOffsets[member][1] + 7 != y)
{
return FALSE;
}
@@ -188,6 +189,7 @@ static bool32 SetUnionRoomPlayerEnterExitMovement(u32 playerIdx, const u8 * move
}
return TRUE;
}
static bool32 TryReleaseUnionRoomPlayerObjectEvent(u32 playerIdx)
{
u8 objectId;
@@ -263,11 +265,11 @@ static const u8 sMovement_UnionPlayerEnter[2] = {
MOVEMENT_ACTION_STEP_END
};
static bool32 AnimateUnionRoomPlayerSpawn(s8 * a0, u32 playerIdx, struct UnionObj * ptr)
static bool32 AnimateUnionRoomPlayerSpawn(s8 * state_p, u32 playerIdx, struct UnionObj * ptr)
{
s16 x, y;
switch (*a0)
switch (*state_p)
{
case 0:
if (!is_walking_or_running())
@@ -275,30 +277,30 @@ static bool32 AnimateUnionRoomPlayerSpawn(s8 * a0, u32 playerIdx, struct UnionOb
break;
}
PlayerGetDestCoords(&x, &y);
if (sub_811B58C(playerIdx, 0, x, y) == TRUE)
if (IsUnionRoomPlayerFacingTileAt(playerIdx, 0, x, y) == TRUE)
{
break;
}
player_get_pos_including_state_based_drift(&x, &y);
if (sub_811B58C(playerIdx, 0, x, y) == TRUE)
if (IsUnionRoomPlayerFacingTileAt(playerIdx, 0, x, y) == TRUE)
{
break;
}
SetUnionRoomPlayerGfx(playerIdx, ptr->gfxId);
CreateUnionRoomPlayerObjectEvent(playerIdx);
ShowUnionRoomPlayer(playerIdx);
(*a0)++;
(*state_p)++;
// fallthrough
case 3: // incorrect?
if (SetUnionRoomPlayerEnterExitMovement(playerIdx, sMovement_UnionPlayerEnter) == 1)
{
(*a0)++;
(*state_p)++;
}
break;
case 2:
if (TryReleaseUnionRoomPlayerObjectEvent(playerIdx))
{
*a0 = 0;
*state_p = 0;
return TRUE;
}
break;
@@ -306,12 +308,12 @@ static bool32 AnimateUnionRoomPlayerSpawn(s8 * a0, u32 playerIdx, struct UnionOb
return FALSE;
}
static bool32 sub_811B8BC(u32 playerIdx, u32 a1, u32 a2)
static bool32 SpawnGroupLeader(u32 playerIdx, u32 gender, u32 idMod256)
{
struct UnionObj * ptr = &UnionObjWork[playerIdx];
AGB_ASSERT_EX(UnionObjWork != NULL, ABSPATH("rfu_union_tool.c"), 561)
ptr->schedAnim = 1;
ptr->gfxId = GetUnionRoomPlayerGraphicsId(a1, a2);
ptr->schedAnim = UNION_ROOM_SPAWN_IN;
ptr->gfxId = GetUnionRoomPlayerGraphicsId(gender, idMod256);
if (ptr->state == 0)
{
return TRUE;
@@ -322,11 +324,11 @@ static bool32 sub_811B8BC(u32 playerIdx, u32 a1, u32 a2)
}
}
static bool32 sub_811B90C(u32 playerIdx)
static bool32 DespawnGroupLeader(u32 playerIdx)
{
struct UnionObj * ptr = &UnionObjWork[playerIdx];
AGB_ASSERT_EX(UnionObjWork != NULL, ABSPATH("rfu_union_tool.c"), 577)
ptr->schedAnim = 2;
ptr->schedAnim = UNION_ROOM_SPAWN_OUT;
if (ptr->state == 1)
{
return TRUE;
@@ -342,7 +344,7 @@ static void AnimateUnionObj(u32 playerIdx, struct UnionObj * ptr)
switch (ptr->state)
{
case 0:
if (ptr->schedAnim == 1)
if (ptr->schedAnim == UNION_ROOM_SPAWN_IN)
{
ptr->state = 2;
ptr->animState = 0;
@@ -353,7 +355,7 @@ static void AnimateUnionObj(u32 playerIdx, struct UnionObj * ptr)
}
// fallthrough
case 2:
if (!sub_811BBC8(playerIdx, 0) && ptr->schedAnim == 2)
if (!RfuUnionGroupMemberIsInvisible(playerIdx, 0) && ptr->schedAnim == 2)
{
ptr->state = 0;
ptr->animState = 0;
@@ -366,7 +368,7 @@ static void AnimateUnionObj(u32 playerIdx, struct UnionObj * ptr)
}
break;
case 1:
if (ptr->schedAnim == 2)
if (ptr->schedAnim == UNION_ROOM_SPAWN_OUT)
{
ptr->state = 3;
ptr->animState = 0;
@@ -383,7 +385,7 @@ static void AnimateUnionObj(u32 playerIdx, struct UnionObj * ptr)
}
break;
}
ptr->schedAnim = 0;
ptr->schedAnim = UNION_ROOM_SPAWN_NONE;
}
static void Task_AnimateUnionObjs(u8 taskId)
@@ -409,7 +411,7 @@ static u8 StartUnionObjAnimTask(void)
}
}
static void sub_811BA5C(void)
static void DestroyAnimateUnionObjsTask(void)
{
u8 taskId = FindTaskIdByFunc(Task_AnimateUnionObjs);
if (taskId < NUM_TASKS)
@@ -418,7 +420,7 @@ static void sub_811BA5C(void)
}
}
void sub_811BA78(void)
void DeleteUnionObjWorkAndStopTask(void)
{
s32 i;
for (i = 0; i < 8; i++)
@@ -430,31 +432,31 @@ void sub_811BA78(void)
}
}
UnionObjWork = NULL;
sub_811BA5C();
DestroyAnimateUnionObjsTask();
}
void sub_811BAAC(u8 * sp8, s32 r9)
void CreateGroupMemberObjectsInvisible(u8 * sprite_ids, s32 group)
{
s32 r7;
s32 i;
for (r7 = 0; r7 < 5; r7++)
for (i = 0; i < 5; i++)
{
s32 r5 = 5 * r9 + r7;
sp8[r5] = sprite_new(OBJECT_EVENT_GFX_MAN, r5 - 0x38, sUnionPartnerCoords[r9][0] + sFacingDirectionOffsets[r7][0], sUnionPartnerCoords[r9][1] + sFacingDirectionOffsets[r7][1], 3, 1);
RfuUnionObjectToggleInvisibility(r5 - 0x38, TRUE);
s32 obj_id = 5 * group + i;
sprite_ids[obj_id] = sprite_new(OBJECT_EVENT_GFX_MAN, obj_id - 0x38, sUnionPartnerCoords[group][0] + sFacingDirectionOffsets[i][0], sUnionPartnerCoords[group][1] + sFacingDirectionOffsets[i][1], 3, 1);
RfuUnionObjectToggleInvisibility(obj_id - 0x38, TRUE);
}
}
void sub_811BB40(u8 * r5)
void DestroyGroupMemberObjects(u8 *spriteIds)
{
s32 i;
for (i = 0; i < 40; i++)
{
DestroySprite(&gSprites[r5[i]]);
DestroySprite(&gSprites[spriteIds[i]]);
}
}
void sub_811BB68(void)
void MakeGroupAssemblyAreasPassable(void)
{
s32 i, j, x, y;
for (i = 0; i < 8; i++)
@@ -462,94 +464,94 @@ void sub_811BB68(void)
for (j = 0; j < 5; j++)
{
GetUnionRoomPlayerFacingCoords(i, j, &x, &y);
sub_8059024(x, y, 0);
MapGridSetMetatileImpassabilityAt(x, y, FALSE);
}
}
}
static u8 sub_811BBA0(u32 r1, u32 unused, struct GFtgtGname * r2)
static u8 UnionPartnerObjectGetFacing(u32 member, u32 group, struct GFtgtGname * gname)
{
if (r1 != 0)
if (member != 0)
{
return gUnknown_845711B[r1];
return sUnionGroupMemberFacings[member];
}
else if (r2->unk_0a_0 == 0x45)
else if (gname->activity == 0x45)
{
return 1;
return DIR_SOUTH;
}
else
{
return 4;
return DIR_EAST;
}
}
static u32 sub_811BBC8(u32 a0, u32 a1)
static u32 RfuUnionGroupMemberIsInvisible(u32 group, u32 member)
{
return RfuUnionObjectIsInvisible(5 * a0 + a1 - 0x38);
return RfuUnionObjectIsInvisible(5 * group + member - 0x38);
}
static void sub_811BBE0(u32 r5, u32 r6, u8 r8, struct GFtgtGname * r9)
static void SpawnGroupMember(u32 groupNo, u32 memberNo, u8 direction, struct GFtgtGname * gname)
{
s32 x, y;
s32 r7 = 5 * r5 + r6;
if (sub_811BBC8(r5, r6) == 1)
s32 objId = 5 * groupNo + memberNo;
if (RfuUnionGroupMemberIsInvisible(groupNo, memberNo) == TRUE)
{
RfuUnionObjectToggleInvisibility(r7 - 0x38, FALSE);
RfuUnionObjectStartWarp(r7 - 0x38, 1);
RfuUnionObjectToggleInvisibility(objId - 0x38, FALSE);
RfuUnionObjectStartWarp(objId - 0x38, UNION_ROOM_SPAWN_IN);
}
RfuUnionObjectSetFacingDirection(r7 - 0x38, r8);
sub_811C008(r6, r5, sub_811BBA0(r6, r5, r9));
GetUnionRoomPlayerFacingCoords(r5, r6, &x, &y);
sub_8059024(x, y, 1);
RfuUnionObjectSetFacingDirection(objId - 0x38, direction);
UnionPartnerObjectSetFacing(memberNo, groupNo, UnionPartnerObjectGetFacing(memberNo, groupNo, gname));
GetUnionRoomPlayerFacingCoords(groupNo, memberNo, &x, &y);
MapGridSetMetatileImpassabilityAt(x, y, TRUE);
}
static void sub_811BC68(u32 a0, u32 a1)
static void DespawnGroupMember(u32 group, u32 member)
{
s32 x, y;
RfuUnionObjectStartWarp(5 * a0 + a1 - 0x38, 2);
GetUnionRoomPlayerFacingCoords(a0, a1, &x, &y);
sub_8059024(x, y, 0);
RfuUnionObjectStartWarp(5 * group + member - 0x38, UNION_ROOM_SPAWN_OUT);
GetUnionRoomPlayerFacingCoords(group, member, &x, &y);
MapGridSetMetatileImpassabilityAt(x, y, FALSE);
}
static void sub_811BCA0(u32 r7, struct GFtgtGname * r8)
static void AssembleGroup(u32 group, struct GFtgtGname * gname)
{
s16 x, y, x2, y2;
s32 i;
PlayerGetDestCoords(&x, &y);
player_get_pos_including_state_based_drift(&x2, &y2);
if (RfuUnionObjectIsInvisible(5 * r7 - 0x38) == 1)
if (RfuUnionObjectIsInvisible(5 * group - 0x38) == TRUE)
{
if (sub_811B58C(r7, 0, x, y) == TRUE || sub_811B58C(r7, 0, x2, y2) == TRUE)
if (IsUnionRoomPlayerFacingTileAt(group, 0, x, y) == TRUE || IsUnionRoomPlayerFacingTileAt(group, 0, x2, y2) == TRUE)
{
return;
}
sub_811BBE0(r7, 0, GetUnionRoomPlayerGraphicsId(r8->playerGender, r8->unk_00.playerTrainerId[0]), r8);
SpawnGroupMember(group, 0, GetUnionRoomPlayerGraphicsId(gname->playerGender, gname->unk_00.playerTrainerId[0]), gname);
}
for (i = 1; i < 5; i++)
{
if (r8->unk_04[i - 1] == 0)
if (gname->child_sprite_gender[i - 1] == 0)
{
sub_811BC68(r7, i);
DespawnGroupMember(group, i);
}
else if (sub_811B58C(r7, i, x, y) == FALSE && sub_811B58C(r7, i, x2, y2) == FALSE)
else if (IsUnionRoomPlayerFacingTileAt(group, i, x, y) == FALSE && IsUnionRoomPlayerFacingTileAt(group, i, x2, y2) == FALSE)
{
sub_811BBE0(r7, i, GetUnionRoomPlayerGraphicsId((r8->unk_04[i - 1] >> 3) & 1, r8->unk_04[i - 1] & 7), r8);
SpawnGroupMember(group, i, GetUnionRoomPlayerGraphicsId((gname->child_sprite_gender[i - 1] >> 3) & 1, gname->child_sprite_gender[i - 1] & 7), gname);
}
}
}
static void sub_811BDA8(u32 r5, struct GFtgtGname * r4)
static void SpawnGroupLeaderAndMembers(u32 group, struct GFtgtGname * gname)
{
u32 i;
switch (r4->unk_0a_0)
switch (gname->activity)
{
case 0x40:
case 0x54:
sub_811B8BC(r5, r4->playerGender, r4->unk_00.playerTrainerId[0]);
SpawnGroupLeader(group, gname->playerGender, gname->unk_00.playerTrainerId[0]);
for (i = 0; i < 5; i++)
{
sub_811BC68(r5, i);
DespawnGroupMember(group, i);
}
break;
case 0x41:
@@ -559,70 +561,70 @@ static void sub_811BDA8(u32 r5, struct GFtgtGname * r4)
case 0x51:
case 0x52:
case 0x53:
sub_811B90C(r5);
sub_811BCA0(r5, r4);
DespawnGroupLeader(group);
AssembleGroup(group, gname);
break;
default:
AGB_ASSERT_EX(0, ABSPATH("rfu_union_tool.c"), 979)
}
}
static void sub_811BE6C(u32 r5, struct GFtgtGname * unused)
static void DespawnGroupLeaderAndMembers(u32 group, struct GFtgtGname * gname)
{
s32 i;
sub_811B90C(r5);
DespawnGroupLeader(group);
for (i = 0; i < 5; i++)
{
sub_811BC68(r5, i);
DespawnGroupMember(group, i);
}
}
static void UpdateUnionRoomPlayerSprites(struct UnkStruct_URoom *r0)
static void UpdateUnionRoomPlayerSprites(struct UnkStruct_URoom * groups)
{
s32 i;
struct UnkStruct_x20 * r4;
struct UnkStruct_x20 * x20_p;
sUnionObjRefreshTimer = 0;
for (i = 0, r4 = r0->field_0->arr; i < 8; i++)
for (i = 0, x20_p = groups->field_0->arr; i < 8; i++)
{
if (r4[i].field_1A_0 == 1)
if (x20_p[i].groupScheduledAnim == UNION_ROOM_SPAWN_IN)
{
sub_811BDA8(i, &r4[i].unk.gname);
SpawnGroupLeaderAndMembers(i, &x20_p[i].gname_uname.gname);
}
else if (r4[i].field_1A_0 == 2)
else if (x20_p[i].groupScheduledAnim == UNION_ROOM_SPAWN_OUT)
{
sub_811BE6C(i, &r4[i].unk.gname);
DespawnGroupLeaderAndMembers(i, &x20_p[i].gname_uname.gname);
}
}
}
void sub_811BECC(struct UnkStruct_URoom *unused)
void ScheduleUnionRoomPlayerRefresh(struct UnkStruct_URoom *uroom_p)
{
sUnionObjRefreshTimer = 300;
}
void sub_811BEDC(struct UnkStruct_URoom *r2)
void HandleUnionRoomPlayerRefresh(struct UnkStruct_URoom *uroom_p)
{
if (++sUnionObjRefreshTimer > 300)
{
UpdateUnionRoomPlayerSprites(r2);
UpdateUnionRoomPlayerSprites(uroom_p);
}
}
bool32 sub_811BF00(struct UnkStruct_Main0 *arg0, s16 *arg1, s16 *arg2, u8 *arg3)
bool32 RfuUnionTool_GetGroupAndMemberInFrontOfPlayer(struct UnkStruct_Main0 *main0_p, s16 *member_p, s16 *group_p, u8 *spriteIds)
{
s16 x, y;
s32 i, j;
struct UnkStruct_x20 * r4;
struct UnkStruct_x20 * x20_p;
if (!is_walking_or_running())
{
return FALSE;
}
GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
for (i = 0, r4 = arg0->arr; i < 8; i++)
for (i = 0, x20_p = main0_p->arr; i < 8; i++)
{
for (j = 0; j < 5; j++)
{
s32 r3 = 5 * i + j;
s32 objId = 5 * i + j;
if (x != sUnionPartnerCoords[i][0] + sFacingDirectionOffsets[j][0] + 7)
{
continue;
@@ -631,33 +633,33 @@ bool32 sub_811BF00(struct UnkStruct_Main0 *arg0, s16 *arg1, s16 *arg2, u8 *arg3)
{
continue;
}
if (RfuUnionObjectIsInvisible(r3 - 0x38) != 0)
if (RfuUnionObjectIsInvisible(objId - 0x38) != 0)
{
continue;
}
if (RfuUnionObjectIsWarping(r3 - 0x38) != 0)
if (RfuUnionObjectIsWarping(objId - 0x38) != 0)
{
continue;
}
if (r4[i].field_1A_0 != 1)
if (x20_p[i].groupScheduledAnim != UNION_ROOM_SPAWN_IN)
{
continue;
}
sub_811C008(j, i, sOppositeFacingDirection[GetPlayerFacingDirection()]);
*arg1 = j;
*arg2 = i;
UnionPartnerObjectSetFacing(j, i, sOppositeFacingDirection[GetPlayerFacingDirection()]);
*member_p = j;
*group_p = i;
return TRUE;
}
}
return FALSE;
}
static void sub_811C008(s32 arg0, s32 arg1, u8 arg2)
static void UnionPartnerObjectSetFacing(s32 member, s32 group, u8 direction)
{
TurnObjectEvent(5 * arg1 - 0x38 + arg0, arg2);
TurnObjectEvent(5 * group - 0x38 + member, direction);
}
void sub_811C028(u32 arg0, u32 arg1, struct UnkStruct_Main0 *arg2)
void UpdateUnionGroupMemberFacing(u32 member, u32 group, struct UnkStruct_Main0 *main0_p)
{
return sub_811C008(arg0, arg1, sub_811BBA0(arg0, arg1, &arg2->arr[arg1].unk.gname));
return UnionPartnerObjectSetFacing(member, group, UnionPartnerObjectGetFacing(member, group, &main0_p->arr[group].gname_uname.gname));
}

Some files were not shown because too many files have changed in this diff Show More