summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/6F12E0.h38
-rw-r--r--include/6F17B0.h25
-rw-r--r--include/code_variables.h2
-rw-r--r--include/m_cpak.h65
-rw-r--r--include/s_cpak.h20
-rw-r--r--linker_scripts/jp/symbol_addrs_code.txt54
-rw-r--r--src/code/m_cpak.c490
-rw-r--r--src/code/m_private.c2
-rw-r--r--src/code/s_cpak.c181
-rw-r--r--src/overlays/gamestates/ovl_second_game/second_game.c2
-rw-r--r--yamls/jp/code.yaml5
11 files changed, 528 insertions, 356 deletions
diff --git a/include/6F12E0.h b/include/6F12E0.h
deleted file mode 100644
index 18f721e..0000000
--- a/include/6F12E0.h
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef C_6F12E0_H
-#define C_6F12E0_H
-
-#include "ultra64.h"
-
-#include "m_cpak.h"
-
-void func_800CD640_jp(PakInfo74Struct* arg0, void*, void*);
-UNK_RET func_800CD68C_jp(PakInfo04Struct* arg0, UNK_TYPE arg1);
-size_t func_800CD730_jp(PakInfo04Struct* arg0);
-UNK_RET func_800CD760_jp(PakInfo04Struct* arg0, UNK_TYPE arg1, u32 arg2, void* arg3);
-UNK_RET func_800CD82C_jp(PakInfo04Struct* arg0, UNK_TYPE arg1, u32 arg2, void* arg3);
-UNK_RET func_800CD8F8_jp(PakInfo04Struct* arg0, PakInfo74Struct* arg1, u32 arg2);
-UNK_RET func_800CD990_jp(PakInfo04Struct* arg0, PakInfo74Struct* arg1);
-void func_800CD9F0_jp(PakInfo04Struct* arg0, PakInfo74Struct* arg1);
-UNK_RET func_800CDA4C_jp(PakInfo04Struct* arg0, PakInfo94Struct* arg1);
-UNK_RET func_800CDA90_jp(PakInfo04Struct* arg0, UNK_PTR, UNK_PTR);
-// void func_800CDAD0_jp();
-// void func_800CDB10_jp();
-// void func_800CDBE0_jp();
-// void func_800CDBF0_jp();
-// void func_800CDC10_jp();
-// void func_800CDC30_jp();
-// void func_800CDCC0_jp();
-// void func_800CDDE0_jp();
-// void func_800CDE54_jp();
-// void func_800CDECC_jp();
-// void func_800CDEDC_jp();
-// void func_800CDF78_jp();
-// void func_800CE04C_jp();
-// void func_800CE090_jp();
-// void func_800CE0E8_jp();
-// void func_800CE110_jp();
-// void func_800CE120_jp();
-// void func_800CE1CC_jp();
-// void func_800CE328_jp();
-
-#endif
diff --git a/include/6F17B0.h b/include/6F17B0.h
new file mode 100644
index 0000000..3ae179f
--- /dev/null
+++ b/include/6F17B0.h
@@ -0,0 +1,25 @@
+#ifndef C_6F17B0_H
+#define C_6F17B0_H
+
+#include "ultra64.h"
+
+// void func_800CDB10_jp();
+// void func_800CDBE0_jp();
+// void func_800CDBF0_jp();
+// void func_800CDC10_jp();
+// void func_800CDC30_jp();
+// void func_800CDCC0_jp();
+// void func_800CDDE0_jp();
+// void func_800CDE54_jp();
+// void func_800CDECC_jp();
+// void func_800CDEDC_jp();
+// void func_800CDF78_jp();
+// void func_800CE04C_jp();
+// void func_800CE090_jp();
+// void func_800CE0E8_jp();
+// void func_800CE110_jp();
+// void func_800CE120_jp();
+// void func_800CE1CC_jp();
+// void func_800CE328_jp();
+
+#endif
diff --git a/include/code_variables.h b/include/code_variables.h
index b1e0978..45c637c 100644
--- a/include/code_variables.h
+++ b/include/code_variables.h
@@ -759,7 +759,7 @@ extern s32 fuusen_DEBUG_mode_flag;
// extern UNK_TYPE D_8010EF48_jp;
// extern UNK_TYPE D_8010EF50_jp;
// extern UNK_TYPE D_8010EF60_jp;
-// extern UNK_TYPE D_8010EF70_jp;
+extern char D_8010EF70_jp[];
extern vs32 D_8010EFB0_jp; // TODO: Determine where this goes
// extern UNK_TYPE D_8010EFB8_jp;
diff --git a/include/m_cpak.h b/include/m_cpak.h
index 0a6c723..035d9b0 100644
--- a/include/m_cpak.h
+++ b/include/m_cpak.h
@@ -7,26 +7,21 @@
#include "m_npc.h"
#include "m_private.h"
-typedef struct B80137C40Unk0000Struct {
+typedef struct Passport {
/* 0x0000 */ u16 unk_0000;
/* 0x0002 */ UNK_TYPE1 unk_0002[0x0006];
/* 0x0008 */ PrivateInfo priv;
/* 0x0BD8 */ Animal_c animal;
/* 0x1100 */ u16 unk_1100;
/* 0x1102 */ UNK_TYPE1 unk_1102[0x00FE];
-} B80137C40Unk0000Struct; // size = 0x1200
+} Passport; // size = 0x1200
-typedef struct B80137C40Struct {
- /* 0x0000 */ B80137C40Unk0000Struct unk_0000;
- /* 0x1200 */ OSMesgQueue* unk_1200;
+typedef struct PakCtrl {
+ /* 0x0000 */ Passport passport;
+ /* 0x1200 */ OSMesgQueue* queue;
/* 0x1204 */ UNK_TYPE unk_1204;
/* 0x1208 */ u16 unk_1208;
-} B80137C40Struct; // size = 0x1208
-
-// For alignment this can only have members of size 1 or 2
-typedef struct D80104798Struct {
- /* 0x0 */ UNK_TYPE1 unk0[0x10];
-} D80104798Struct; // size 0x10
+} PakCtrl; // size = 0x1208
typedef struct D801047A8Struct {
/* 0x0 */ UNK_TYPE1 unk_0[0x08];
@@ -37,49 +32,37 @@ typedef struct D801047B0Struct {
/* 0x0002 */ UNK_TYPE1 unk_0002[0x66FE];
} D801047B0Struct; // size = 0x6700;
-typedef struct PakInfo74Struct {
- /* 0x00 */ size_t unk_00;
- /* 0x04 */ UNK_TYPE1 unk_04[0x6];
- /* 0x0A */ char unk_0A[4];
- /* 0x0E */ D80104798Struct unk_0E;
- /* 0x1E */ UNK_TYPE1 unk_1E[0x2];
-} PakInfo74Struct; // size = 0x20
-
-typedef struct PakInfo94Struct {
- /* 0x00 */ UNK_TYPE1 unk_00[0x20];
-} PakInfo94Struct; // size = 0x20
-
-typedef struct PakInfo04Struct {
+typedef struct OSPfsInfo {
/* 0x00 */ OSPfs pfs;
- /* 0x68 */ s32 unk_68;
- /* 0x6C */ s32 unk_6C;
-} PakInfo04Struct; // size = 0x70
+ /* 0x68 */ s32 fileNo;
+ /* 0x6C */ s32 err;
+} OSPfsInfo; // size = 0x70
typedef struct PakInfo {
/* 0x000 */ UNK_TYPE unk_00;
- /* 0x004 */ PakInfo04Struct unk_04;
- /* 0x074 */ PakInfo74Struct unk_74;
- /* 0x090 */ PakInfo94Struct unk_94[16];
+ /* 0x004 */ OSPfsInfo pfsInfo;
+ /* 0x074 */ OSPfsState pfsState;
+ /* 0x094 */ OSPfsState unk_94[16];
/* 0x294 */ s32 unk_294[16];
- /* 0x2D4 */ size_t unk_2D4;
- /* 0x2D8 */ s32 unk_2D8;
- /* 0x2DC */ s32 unk_2DC;
+ /* 0x2D4 */ s32 freeBytes;
+ /* 0x2D8 */ s32 maxFiles;
+ /* 0x2DC */ s32 filesUsed;
} PakInfo; // size >= 0x2DC
-UNK_RET mCPk_PakOpen(PakInfo* info, s32 arg1);
-UNK_RET func_80078F08_jp(PakInfo* info);
-s32 func_80078FE8_jp(PakInfo* info);
-void func_80079080_jp(B80137C40Struct* arg0);
-UNK_RET mCPk_InitPak(UNK_TYPE arg0);
-PrivateInfo* func_800793A8_jp(void);
+s32 mCPk_PakOpen(PakInfo* info, s32 channel);
+s32 mCPk_NoteNum(PakInfo* info);
+s32 mCPk_FreeBlockNum(PakInfo* info);
+void mCPk_ClearPassport(Passport* passport);
+s32 mCPk_InitPak(s32 channel);
+PrivateInfo* mCPk_GetSaveFilePrivateP(void);
s32 mCPk_SavePak(PrivateInfo* priv, Animal_c* animal, PakInfo* info);
-s32 func_8007942C_jp(PrivateInfo* priv, Animal_c* animal, PakInfo* info);
+s32 mCPk_PakPrivateLoad(PrivateInfo* priv, Animal_c* animal, PakInfo* info);
s32 func_80079760_jp(void);
void* func_80079838_jp(void);
s32 func_800798DC_jp(PakInfo* info);
UNK_RET func_80079AAC_jp(void);
UNK_RET func_80079D00_jp(void);
-s32 func_80079E54_jp(D801047B0Struct* arg0, PakInfo* arg1);
+s32 func_80079E54_jp(D801047B0Struct* arg0, PakInfo* info);
UNK_RET func_80079EA4_jp(UNK_PTR, PakInfo* info);
void func_80079EDC_jp(void);
s32 func_80079F44_jp(void);
diff --git a/include/s_cpak.h b/include/s_cpak.h
new file mode 100644
index 0000000..5ad06f9
--- /dev/null
+++ b/include/s_cpak.h
@@ -0,0 +1,20 @@
+#ifndef S_CPAK_H
+#define S_CPAK_H
+
+#include "ultra64.h"
+
+#include "m_cpak.h"
+
+void sCPk_SetCode(OSPfsState* pfsState, u16* companyCode, u32* gameCode);
+s32 sCPk_PakOpen(OSPfsInfo* pfsInfo, s32 channel);
+s32 sCPk_PakFreeArea(OSPfsInfo* pfsInfo);
+s32 sCPk_Save(OSPfsInfo* pfsInfo, s32 offset, s32 size, u8* buffer);
+s32 sCPk_Load(OSPfsInfo* pfsInfo, s32 offset, s32 size, u8* buffer);
+s32 sCPk_MakeFile(OSPfsInfo* pfsInfo, OSPfsState* pfsState, size_t size);
+s32 sCPk_FileOpen(OSPfsInfo* pfsInfo, OSPfsState* pfsState);
+s32 sCPk_DeleteFile(OSPfsInfo* pfsInfo, OSPfsState* pfsState);
+u32 sCPk_FileState(OSPfsInfo* pfsInfo, OSPfsState* pfsState);
+s32 sCPk_FileNum(OSPfsInfo* pfsInfo, s32* maxFiles, s32* filesUsed);
+s32 sCPk_RepairID(OSPfsInfo* pfsInfo);
+
+#endif
diff --git a/linker_scripts/jp/symbol_addrs_code.txt b/linker_scripts/jp/symbol_addrs_code.txt
index 45f03e4..5b1cab9 100644
--- a/linker_scripts/jp/symbol_addrs_code.txt
+++ b/linker_scripts/jp/symbol_addrs_code.txt
@@ -932,21 +932,21 @@ getTrigger = 0x80078DF4; // type:func
getJoystick_X = 0x80078E28; // type:func
getJoystick_Y = 0x80078E5C; // type:func
mCPk_PakOpen = 0x80078E90; // type:func
-func_80078EB4_jp = 0x80078EB4; // type:func
-func_80078EE0_jp = 0x80078EE0; // type:func
-func_80078F08_jp = 0x80078F08; // type:func
+mCPk_NoteMake = 0x80078EB4; // type:func
+mCPk_NoteOpen = 0x80078EE0; // type:func
+mCPk_NoteNum = 0x80078F08; // type:func
func_80078F34_jp = 0x80078F34; // type:func
-func_80078FE8_jp = 0x80078FE8; // type:func
-func_80079030_jp = 0x80079030; // type:func
-func_80079080_jp = 0x80079080; // type:func
+mCPk_FreeBlockNum = 0x80078FE8; // type:func
+mCPk_CheckNoteRest = 0x80079030; // type:func
+mCPk_ClearPassport = 0x80079080; // type:func
mCPk_InitPak = 0x800790C0; // type:func
-func_8007919C_jp = 0x8007919C; // type:func
+mCPk_SetForestPakState = 0x8007919C; // type:func
func_8007920C_jp = 0x8007920C; // type:func
func_800792FC_jp = 0x800792FC; // type:func
-func_80079378_jp = 0x80079378; // type:func
-func_800793A8_jp = 0x800793A8; // type:func
+mCPk_SetPrivateSavefile = 0x80079378; // type:func
+mCPk_GetSaveFilePrivateP = 0x800793A8; // type:func
mCPk_SavePak = 0x800793B8; // type:func
-func_8007942C_jp = 0x8007942C; // type:func
+mCPk_PakPrivateLoad = 0x8007942C; // type:func
func_800794E4_jp = 0x800794E4; // type:func
func_8007967C_jp = 0x8007967C; // type:func
func_80079708_jp = 0x80079708; // type:func
@@ -3218,17 +3218,17 @@ func_800CCE08_jp = 0x800CCE08; // type:func
func_800CCE40_jp = 0x800CCE40; // type:func
func_800CD194_jp = 0x800CD194; // type:func
func_800CD59C_jp = 0x800CD59C; // type:func
-func_800CD640_jp = 0x800CD640; // type:func
-func_800CD68C_jp = 0x800CD68C; // type:func
-func_800CD730_jp = 0x800CD730; // type:func
-func_800CD760_jp = 0x800CD760; // type:func
-func_800CD82C_jp = 0x800CD82C; // type:func
-func_800CD8F8_jp = 0x800CD8F8; // type:func
-func_800CD990_jp = 0x800CD990; // type:func
-func_800CD9F0_jp = 0x800CD9F0; // type:func
-func_800CDA4C_jp = 0x800CDA4C; // type:func
-func_800CDA90_jp = 0x800CDA90; // type:func
-func_800CDAD0_jp = 0x800CDAD0; // type:func
+sCPk_SetCode = 0x800CD640; // type:func
+sCPk_PakOpen = 0x800CD68C; // type:func
+sCPk_PakFreeArea = 0x800CD730; // type:func
+sCPk_Save = 0x800CD760; // type:func
+sCPk_Load = 0x800CD82C; // type:func
+sCPk_MakeFile = 0x800CD8F8; // type:func
+sCPk_FileOpen = 0x800CD990; // type:func
+sCPk_DeleteFile = 0x800CD9F0; // type:func
+sCPk_FileState = 0x800CDA4C; // type:func
+sCPk_FileNum = 0x800CDA90; // type:func
+sCPk_RepairID = 0x800CDAD0; // type:func
func_800CDB10_jp = 0x800CDB10; // type:func
func_800CDBE0_jp = 0x800CDBE0; // type:func
func_800CDBF0_jp = 0x800CDBF0; // type:func
@@ -4362,10 +4362,10 @@ oc_collision_function = 0x8010471C; // size:0x24
occ_collision_function = 0x80104740; //
OCCClearFunctionTable = 0x80104764; //
status_org = 0x80104770; //
-D_80104790_jp = 0x80104790; // type:s32
-D_80104794_jp = 0x80104794; //
-D_80104798_jp = 0x80104798; //
-D_8010479C_jp = 0x8010479C; //
+sCompanyCode = 0x80104790; // type:s32
+sGameCode = 0x80104794; //
+l_game_name = 0x80104798; //
+l_ext_name_table = 0x8010479C; //
g_paks_info_p = 0x801047A4; //
D_801047A8_jp = 0x801047A8; //
D_801047B0_jp = 0x801047B0; //
@@ -5331,7 +5331,7 @@ RO_FLT_801167F0_jp = 0x801167F0; // type:f32
RO_FLT_801167F4_jp = 0x801167F4; // type:f32
RO_STR_80116800_jp = 0x80116800; // type:asciz
RO_STR_80116804_jp = 0x80116804; // type:asciz
-RO_80116808_jp = 0x80116808; //
+sFileSizes = 0x80116808; //
jtbl_80116810_jp = 0x80116810; // type:jtbl
RO_FLT_80116828_jp = 0x80116828; // type:f32
RO_STR_80116830_jp = 0x80116830; // type:asciz
@@ -5997,7 +5997,7 @@ B_80126E9C_jp = 0x80126E9C; //
common_data = 0x80126EA0; // size:0x10AB8
l_paks_info = 0x80137960; //
-B_80137C40_jp = 0x80137C40; // size:0x1208
+l_pak_ctrl = 0x80137C40; // size:0x1208
debug_mode = 0x80138E50; //
debug_display = 0x80138E60; //
diff --git a/src/code/m_cpak.c b/src/code/m_cpak.c
index beb8290..c6a4005 100644
--- a/src/code/m_cpak.c
+++ b/src/code/m_cpak.c
@@ -8,229 +8,231 @@
#include "padmgr.h"
#include "6B8F20.h"
-#include "6F12E0.h"
+#include "s_cpak.h"
-extern PakInfo l_paks_info;
-extern B80137C40Struct B_80137C40_jp;
+PakInfo l_paks_info;
+PakCtrl l_pak_ctrl;
-extern D80104798Struct D_8010EF70_jp;
-
-UNK_TYPE2 D_80104790_jp = 0x3031;
-UNK_TYPE D_80104794_jp = 0x4E41464A;
-D80104798Struct* D_80104798_jp = &D_8010EF70_jp;
-char* D_8010479C_jp[2] = { "\x1A", "\x1B" };
+u16 sCompanyCode = 0x3031;
+u32 sGameCode = 0x4E41464A;
+char* l_game_name = D_8010EF70_jp;
+char* l_ext_name_table[2] = { "\x1A", "\x1B" };
PakInfo* g_paks_info_p = &l_paks_info;
D801047A8Struct D_801047A8_jp = { { 0xD4, 0x8E, 0xA6, 0x90, 0x85, 0x42, 0x00, 0x00 } };
-const size_t RO_80116808_jp[2] = { sizeof(B80137C40Unk0000Struct), sizeof(D801047B0Struct) };
+const size_t sFileSizes[2] = { sizeof(Passport), sizeof(D801047B0Struct) };
-UNK_RET mCPk_PakOpen(PakInfo* info, s32 arg1) {
- return func_800CD68C_jp(&info->unk_04, arg1);
+s32 mCPk_PakOpen(PakInfo* info, s32 channel) {
+ return sCPk_PakOpen(&info->pfsInfo, channel);
}
-UNK_RET func_80078EB4_jp(PakInfo* info) {
- return func_800CD8F8_jp(&info->unk_04, &info->unk_74, info->unk_74.unk_00);
+s32 mCPk_NoteMake(PakInfo* info) {
+ return sCPk_MakeFile(&info->pfsInfo, &info->pfsState, info->pfsState.file_size);
}
-UNK_RET func_80078EE0_jp(PakInfo* info) {
- return func_800CD990_jp(&info->unk_04, &info->unk_74);
+s32 mCPk_NoteOpen(PakInfo* info) {
+ return sCPk_FileOpen(&info->pfsInfo, &info->pfsState);
}
-UNK_RET func_80078F08_jp(PakInfo* info) {
- return func_800CDA90_jp(&info->unk_04, &info->unk_2D8, &info->unk_2DC);
+s32 mCPk_NoteNum(PakInfo* info) {
+ return sCPk_FileNum(&info->pfsInfo, &info->maxFiles, &info->filesUsed);
}
s32 func_80078F34_jp(PakInfo* info) {
- PakInfo04Struct* var_s2 = &info->unk_04;
- PakInfo94Struct* var_s3 = info->unk_94;
+ OSPfsInfo* pfsInfo = &info->pfsInfo;
+ OSPfsState* pfsStates = info->unk_94;
s32* var_s1 = info->unk_294;
s32 i;
- s32 temp_v0;
+ u32 file_size;
for (i = 0; i < ARRAY_COUNT(info->unk_94); i++) {
var_s1[i] = 0;
- var_s2->unk_68 = i;
- temp_v0 = func_800CDA4C_jp(var_s2, &var_s3[i]);
- if (temp_v0 == 0) {
- if (var_s2->unk_6C == 5) {
+ pfsInfo->fileNo = i;
+ file_size = sCPk_FileState(pfsInfo, &pfsStates[i]);
+ if (file_size == 0) {
+ if (pfsInfo->err == PFS_ERR_INVALID) {
var_s1[i] = -1;
continue;
}
- return temp_v0;
+ return file_size;
}
}
- return temp_v0;
+ return file_size;
}
-s32 func_80078FE8_jp(PakInfo* info) {
- s32 sp1C = FALSE;
+s32 mCPk_FreeBlockNum(PakInfo* info) {
+ s32 ret = FALSE;
- info->unk_2D4 = func_800CD730_jp(&info->unk_04);
- if (info->unk_04.unk_6C == 0) {
- sp1C = TRUE;
+ info->freeBytes = sCPk_PakFreeArea(&info->pfsInfo);
+ if (info->pfsInfo.err == 0) {
+ ret = TRUE;
}
- return sp1C;
+ return ret;
}
-s32 func_80079030_jp(PakInfo* info) {
- s32 sp1C = FALSE;
+s32 mCPk_CheckNoteRest(PakInfo* info) {
+ s32 ret = FALSE;
- if ((func_80078FE8_jp(info) == TRUE) && (info->unk_2D4 >= info->unk_74.unk_00)) {
- sp1C = TRUE;
+ if ((mCPk_FreeBlockNum(info) == TRUE) && (info->freeBytes >= info->pfsState.file_size)) {
+ ret = TRUE;
}
- return sp1C;
+ return ret;
}
-void func_80079080_jp(B80137C40Struct* arg0) {
- arg0->unk_0000.unk_0000 = 0;
- mPr_ClearPrivateInfo(&arg0->unk_0000.priv);
- mNpc_ClearAnimalInfo(&arg0->unk_0000.animal);
- arg0->unk_0000.unk_1100 = 0xFFFF;
+void mCPk_ClearPassport(Passport* passport) {
+ passport->unk_0000 = 0;
+ mPr_ClearPrivateInfo(&passport->priv);
+ mNpc_ClearAnimalInfo(&passport->animal);
+ passport->unk_1100 = 0xFFFF;
}
-UNK_RET mCPk_InitPak(UNK_TYPE arg0) {
- PakInfo* sp2C;
- PakInfo74Struct* sp28;
- PakInfo94Struct* tmp;
+s32 mCPk_InitPak(s32 channel) {
+ PakInfo* info = mCPk_get_pkinfo();
+ OSPfsState* pfsState;
+ OSPfsState* iter;
s32 i;
- s32 temp_s1;
+ s32 ret;
- sp2C = mCPk_get_pkinfo();
- sp2C->unk_00 = 0;
+ info->unk_00 = 0;
- sp28 = &sp2C->unk_74;
- bzero(sp28, sizeof(PakInfo74Struct));
+ pfsState = &info->pfsState;
+ bzero(pfsState, sizeof(OSPfsState));
- tmp = sp2C->unk_94;
- for (i = 0; i < ARRAY_COUNT(sp2C->unk_94); i++) {
- bzero(tmp, sizeof(PakInfo94Struct));
- tmp++;
+ iter = info->unk_94;
+ for (i = 0; i < ARRAY_COUNT(info->unk_94); i++) {
+ bzero(iter, sizeof(OSPfsState));
+ iter++;
}
- func_800CD640_jp(sp28, &D_80104790_jp, &D_80104794_jp);
- bcopy(D_80104798_jp, &sp28->unk_0E, sizeof(D80104798Struct));
- temp_s1 = mCPk_PakOpen(sp2C, arg0);
- func_80079080_jp(&B_80137C40_jp);
- B_80137C40_jp.unk_1200 = NULL;
- B_80137C40_jp.unk_1204 = 0;
- B_80137C40_jp.unk_1208 = 0xFFFF;
- return temp_s1;
+ sCPk_SetCode(pfsState, &sCompanyCode, &sGameCode);
+
+ bcopy(l_game_name, &pfsState->game_name, sizeof(pfsState->game_name));
+
+ ret = mCPk_PakOpen(info, channel);
+
+ mCPk_ClearPassport(&l_pak_ctrl.passport);
+
+ l_pak_ctrl.queue = NULL;
+ l_pak_ctrl.unk_1204 = 0;
+ l_pak_ctrl.unk_1208 = 0xFFFF;
+
+ return ret;
}
-void func_8007919C_jp(PakInfo* info, u8 arg1) {
- PakInfo74Struct* sp20 = &info->unk_74;
+void mCPk_SetForestPakState(PakInfo* info, u8 state) {
+ OSPfsState* pfsState = &info->pfsState;
- if (arg1 < 2) {
- bcopy(D_8010479C_jp[arg1], sp20->unk_0A, sizeof(sp20->unk_0A));
- sp20->unk_00 = RO_80116808_jp[arg1];
+ if (state < ARRAY_COUNT(l_ext_name_table)) {
+ bcopy(l_ext_name_table[state], pfsState->ext_name, sizeof(pfsState->ext_name));
+ pfsState->file_size = sFileSizes[state];
}
}
-UNK_RET func_8007920C_jp(PakInfo* info, void* arg1) {
- s32 var_v0;
- s32 var_s1;
- u32 tmp;
+s32 func_8007920C_jp(PakInfo* info, void* buffer) {
+ s32 ret;
+ s32 i;
+ u32 file_size;
- for (var_s1 = 0; var_s1 < 1; var_s1++) {
- PakInfo04Struct* temp_s3 = &info->unk_04;
+ for (i = 0; i < 1; i++) {
+ OSPfsInfo* pfsInfo = &info->pfsInfo;
- B_80137C40_jp.unk_1200 = padmgr_LockSerialMesgQ();
- var_v0 = func_80078EE0_jp(info);
+ l_pak_ctrl.queue = padmgr_LockSerialMesgQ();
+ ret = mCPk_NoteOpen(info);
- if (temp_s3->unk_6C == 5) {
- var_v0 = func_80078EB4_jp(info);
+ if (pfsInfo->err == PFS_ERR_INVALID) {
+ ret = mCPk_NoteMake(info);
}
- if ((var_v0 == 1) || (temp_s3->unk_6C == 9)) {
- tmp = info->unk_74.unk_00;
- var_v0 = func_800CD760_jp(temp_s3, 0, tmp, arg1);
+ if ((ret == 1) || (pfsInfo->err == PFS_ERR_EXIST)) {
+ file_size = info->pfsState.file_size;
+ ret = sCPk_Save(pfsInfo, 0, file_size, buffer);
}
- padmgr_UnlockSerialMesgQ(B_80137C40_jp.unk_1200);
+ padmgr_UnlockSerialMesgQ(l_pak_ctrl.queue);
}
- return var_v0;
+ return ret;
}
-s32 func_800792FC_jp(PakInfo* info, void* arg1) {
- s32 sp1C;
- u32 tmp;
+s32 func_800792FC_jp(PakInfo* info, void* buffer) {
+ s32 ret;
+ u32 file_size;
- B_80137C40_jp.unk_1200 = padmgr_LockSerialMesgQ();
- sp1C = func_80078EE0_jp(info);
+ l_pak_ctrl.queue = padmgr_LockSerialMesgQ();
+ ret = mCPk_NoteOpen(info);
- if (sp1C == 1) {
- tmp = info->unk_74.unk_00;
- sp1C = func_800CD82C_jp(&info->unk_04, 0, tmp, arg1);
- if (sp1C == 0) {
- sp1C = -1;
+ if (ret == 1) {
+ file_size = info->pfsState.file_size;
+ ret = sCPk_Load(&info->pfsInfo, 0, file_size, buffer);
+ if (ret == 0) {
+ ret = -1;
}
}
- padmgr_UnlockSerialMesgQ(B_80137C40_jp.unk_1200);
+ padmgr_UnlockSerialMesgQ(l_pak_ctrl.queue);
- return sp1C;
+ return ret;
}
-void func_80079378_jp(PrivateInfo* priv) {
+void mCPk_SetPrivateSavefile(PrivateInfo* priv) {
if (priv != NULL) {
- mem_copy((void*)&B_80137C40_jp.unk_0000.priv, (void*)priv, sizeof(PrivateInfo));
+ mem_copy((void*)&l_pak_ctrl.passport.priv, (void*)priv, sizeof(PrivateInfo));
}
}
-PrivateInfo* func_800793A8_jp(void) {
- return &B_80137C40_jp.unk_0000.priv;
+PrivateInfo* mCPk_GetSaveFilePrivateP(void) {
+ return &l_pak_ctrl.passport.priv;
}
s32 mCPk_SavePak(PrivateInfo* priv, Animal_c* animal, PakInfo* info) {
- func_8007919C_jp(info, 0);
- func_80079378_jp(priv);
- mem_copy((void*)&B_80137C40_jp.unk_0000.animal, (void*)animal, sizeof(Animal_c));
- B_80137C40_jp.unk_0000.unk_0000 =
- func_8008EEB4_jp(&B_80137C40_jp.unk_0000, sizeof(B80137C40Unk0000Struct), B_80137C40_jp.unk_0000.unk_0000);
+ mCPk_SetForestPakState(info, 0);
+ mCPk_SetPrivateSavefile(priv);
+ mem_copy((void*)&l_pak_ctrl.passport.animal, (void*)animal, sizeof(Animal_c));
+ l_pak_ctrl.passport.unk_0000 =
+ func_8008EEB4_jp(&l_pak_ctrl.passport, sizeof(Passport), l_pak_ctrl.passport.unk_0000);
- return func_8007920C_jp(info, &B_80137C40_jp);
+ return func_8007920C_jp(info, &l_pak_ctrl.passport);
}
-s32 func_8007942C_jp(PrivateInfo* priv, Animal_c* animal, PakInfo* info) {
- s32 sp1C;
+s32 mCPk_PakPrivateLoad(PrivateInfo* priv, Animal_c* animal, PakInfo* info) {
+ s32 ret;
- func_8007919C_jp(info, 0);
- sp1C = func_800792FC_jp(info, &B_80137C40_jp);
+ mCPk_SetForestPakState(info, 0);
+ ret = func_800792FC_jp(info, &l_pak_ctrl.passport);
- if (sp1C == 1) {
- B_80137C40_jp.unk_1204 = 1;
+ if (ret == 1) {
+ l_pak_ctrl.unk_1204 = 1;
}
- if (sp1C == 1) {
- if (mPr_CheckPrivate(&B_80137C40_jp.unk_0000.priv) == TRUE) {
- mem_copy((void*)priv, (void*)&B_80137C40_jp.unk_0000.priv, sizeof(PrivateInfo));
- mem_copy((void*)animal, (void*)&B_80137C40_jp.unk_0000.animal, sizeof(Animal_c));
+ if (ret == 1) {
+ if (mPr_CheckPrivate(&l_pak_ctrl.passport.priv) == TRUE) {
+ mem_copy((void*)priv, (void*)&l_pak_ctrl.passport.priv, sizeof(PrivateInfo));
+ mem_copy((void*)animal, (void*)&l_pak_ctrl.passport.animal, sizeof(Animal_c));
} else {
- sp1C = 0;
+ ret = 0;
}
} else {
- sp1C = 0;
+ ret = 0;
}
- return sp1C;
+ return ret;
}
-s32 func_800794E4_jp(s32* arg0, s32 arg1, PakInfo* arg2, void* arg3) {
- PakInfo04Struct* unkStruct = &arg2->unk_04;
- void* var_a3;
- s32 sp24 = FALSE;
+s32 func_800794E4_jp(s32* arg0, s32 arg1, PakInfo* info, void* arg3) {
+ OSPfsInfo* pfsInfo = &info->pfsInfo;
+ void* buffer;
+ s32 ret = FALSE;
UNUSED s32 pad[2];
*arg0 = 5;
- B_80137C40_jp.unk_1200 = padmgr_LockSerialMesgQ();
- if ((func_80078EE0_jp(arg2) == 1) || (unkStruct->unk_6C == 9)) {
- var_a3 = (arg1 == 0) ? &B_80137C40_jp : arg3;
- if ((var_a3 != NULL) && (func_800CD82C_jp(unkStruct, 0, arg2->unk_74.unk_00, var_a3) == 1)) {
+ l_pak_ctrl.queue = padmgr_LockSerialMesgQ();
+ if ((mCPk_NoteOpen(info) == 1) || (pfsInfo->err == PFS_ERR_EXIST)) {
+ buffer = (arg1 == 0) ? &l_pak_ctrl.passport : arg3;
+ if ((buffer != NULL) && (sCPk_Load(pfsInfo, 0, info->pfsState.file_size, buffer) == 1)) {
if (arg1 == 0) {
- if (!mPr_NullCheckPersonalID(&B_80137C40_jp.unk_0000.priv.playerId)) {
- B_80137C40_jp.unk_1204 = 1;
+ if (!mPr_NullCheckPersonalID(&l_pak_ctrl.passport.priv.playerId)) {
+ l_pak_ctrl.unk_1204 = 1;
*arg0 = 0;
} else {
*arg0 = 2;
@@ -238,103 +240,103 @@ s32 func_800794E4_jp(s32* arg0, s32 arg1, PakInfo* arg2, void* arg3) {
} else {
*arg0 = 2;
}
- sp24 = TRUE;
+ ret = TRUE;
}
- } else if (unkStruct->unk_6C == 5) {
- if ((func_80078F08_jp(arg2) == 1) && (arg2->unk_2DC >= 0x10)) {
+ } else if (pfsInfo->err == PFS_ERR_INVALID) {
+ if ((mCPk_NoteNum(info) == 1) && (info->filesUsed >= 0x10)) {
*arg0 = 4;
- sp24 = TRUE;
- } else if (func_80079030_jp(arg2) == TRUE) {
+ ret = TRUE;
+ } else if (mCPk_CheckNoteRest(info) == TRUE) {
*arg0 = 1;
- sp24 = TRUE;
- } else if (unkStruct->unk_6C == 0) {
+ ret = TRUE;
+ } else if (pfsInfo->err == 0) {
*arg0 = 3;
- sp24 = TRUE;
+ ret = TRUE;
}
}
- padmgr_UnlockSerialMesgQ(B_80137C40_jp.unk_1200);
- return sp24;
+ padmgr_UnlockSerialMesgQ(l_pak_ctrl.queue);
+ return ret;
}
-s32 func_8007967C_jp(s32* arg0, s32 arg1, PakInfo* arg2) {
+s32 func_8007967C_jp(s32* arg0, s32 arg1, PakInfo* info) {
UNUSED s32 pad;
- s32 sp20;
+ s32 ret;
void* sp1C;
if (arg1 == 0) {
- sp1C = &B_80137C40_jp;
+ sp1C = &l_pak_ctrl;
} else {
- sp1C = zelda_malloc(arg2->unk_74.unk_00);
+ sp1C = zelda_malloc(info->pfsState.file_size);
}
- sp20 = func_800794E4_jp(arg0, arg1, arg2, sp1C);
+ ret = func_800794E4_jp(arg0, arg1, info, sp1C);
if ((arg1 != 0) && (sp1C != NULL)) {
zelda_free(sp1C);
}
- return sp20;
+ return ret;
}
UNK_RET func_80079708_jp(s32 arg0) {
- s32 var_v1;
+ s32 ret;
switch (arg0) {
case 0:
- var_v1 = 4;
+ ret = 4;
break;
case 1:
case 2:
- var_v1 = 3;
+ ret = 3;
break;
case 3:
- var_v1 = 2;
+ ret = 2;
break;
case 4:
- var_v1 = 6;
+ ret = 6;
break;
case 5:
- var_v1 = 5;
+ ret = 5;
break;
default:
- var_v1 = 5;
+ ret = 5;
break;
}
- return var_v1;
+ return ret;
}
s32 func_80079760_jp(void) {
PakInfo* info = mCPk_get_pkinfo();
PrivateInfo* iter = &common_data.save.saveFilePrivateInfo[0];
- s32 sp34 = -1;
+ s32 ret = -1;
s32 temp_v0_2;
s32 i;
- func_8007919C_jp(info, 0);
+ mCPk_SetForestPakState(info, 0);
- temp_v0_2 = func_800792FC_jp(info, &B_80137C40_jp);
+ temp_v0_2 = func_800792FC_jp(info, &l_pak_ctrl.passport);
if (temp_v0_2 == 1) {
- B_80137C40_jp.unk_1204 = 1;
+ l_pak_ctrl.unk_1204 = 1;
}
- if ((temp_v0_2 == 1) && !mPr_NullCheckPersonalID(&B_80137C40_jp.unk_0000.priv.playerId)) {
- sp34 = 4;
+ if ((temp_v0_2 == 1) && !mPr_NullCheckPersonalID(&l_pak_ctrl.passport.priv.playerId)) {
+ ret = 4;
for (i = 0; i < ARRAY_COUNT(common_data.save.saveFilePrivateInfo); i++) {
- if (mPr_CheckCmpPrivate(&B_80137C40_jp.unk_0000.priv, iter) == TRUE) {
- sp34 = i;
+ if (mPr_CheckCmpPrivate(&l_pak_ctrl.passport.priv, iter) == TRUE) {
+ ret = i;
break;
}
iter++;
}
}
- return sp34;
+ return ret;
}
void* func_80079838_jp(void) {
@@ -342,14 +344,14 @@ void* func_80079838_jp(void) {
PakInfo* info = mCPk_get_pkinfo();
void* sp24 = &D_801047A8_jp;
- if (B_80137C40_jp.unk_1204 == 0) {
- func_8007919C_jp(info, 0);
- if (func_800792FC_jp(info, &B_80137C40_jp) == 1) {
- B_80137C40_jp.unk_1204 = 1;
- id = &B_80137C40_jp.unk_0000.priv.playerId;
+ if (l_pak_ctrl.unk_1204 == 0) {
+ mCPk_SetForestPakState(info, 0);
+ if (func_800792FC_jp(info, &l_pak_ctrl.passport) == 1) {
+ l_pak_ctrl.unk_1204 = 1;
+ id = &l_pak_ctrl.passport.priv.playerId;
}
} else {
- id = &B_80137C40_jp.unk_0000.priv.playerId;
+ id = &l_pak_ctrl.passport.priv.playerId;
}
if ((id != NULL) && !mPr_NullCheckPersonalID(id)) {
@@ -362,62 +364,61 @@ void* func_80079838_jp(void) {
s32 func_800798DC_jp(PakInfo* info) {
UNUSED s32 pad;
u32 temp_v0;
- s32 sp24 = FALSE;
+ s32 ret = FALSE;
- if (B_80137C40_jp.unk_1204 == 0) {
- func_8007919C_jp(info, 0);
- if (func_800792FC_jp(info, &B_80137C40_jp) == 1) {
- B_80137C40_jp.unk_1204 = 1;
+ if (l_pak_ctrl.unk_1204 == 0) {
+ mCPk_SetForestPakState(info, 0);
+ if (func_800792FC_jp(info, &l_pak_ctrl.passport) == 1) {
+ l_pak_ctrl.unk_1204 = 1;
}
}
- if (B_80137C40_jp.unk_1204 == 1) {
+ if (l_pak_ctrl.unk_1204 == 1) {
temp_v0 = fqrand() * 65534.0f;
- B_80137C40_jp.unk_1208 = temp_v0;
- B_80137C40_jp.unk_0000.unk_1100 = temp_v0;
- B_80137C40_jp.unk_0000.unk_0000 =
- func_8008EEB4_jp(&B_80137C40_jp, sizeof(B80137C40Unk0000Struct), B_80137C40_jp.unk_0000.unk_0000);
+ l_pak_ctrl.unk_1208 = temp_v0;
+ l_pak_ctrl.passport.unk_1100 = temp_v0;
+ l_pak_ctrl.passport.unk_0000 = func_8008EEB4_jp(&l_pak_ctrl, sizeof(Passport), l_pak_ctrl.passport.unk_0000);
- if (func_8007920C_jp(info, &B_80137C40_jp) == 1) {
- sp24 = TRUE;
+ if (func_8007920C_jp(info, &l_pak_ctrl.passport) == 1) {
+ ret = TRUE;
}
}
- return sp24;
+ return ret;
}
s32 func_80079A24_jp(PakInfo* info) {
- s32 sp1C;
-
- if (B_80137C40_jp.unk_1208 != 0xFFFF) {
- sp1C = FALSE;
- func_8007919C_jp(info, 0);
- if (func_800792FC_jp(info, &B_80137C40_jp) == 1) {
- B_80137C40_jp.unk_1204 = 1;
- if (B_80137C40_jp.unk_1208 == B_80137C40_jp.unk_0000.unk_1100) {
- sp1C = TRUE;
+ s32 ret;
+
+ if (l_pak_ctrl.unk_1208 != 0xFFFF) {
+ ret = FALSE;
+ mCPk_SetForestPakState(info, 0);
+ if (func_800792FC_jp(info, &l_pak_ctrl.passport) == 1) {
+ l_pak_ctrl.unk_1204 = 1;
+ if (l_pak_ctrl.unk_1208 == l_pak_ctrl.passport.unk_1100) {
+ ret = TRUE;
}
}
} else {
- sp1C = TRUE;
+ ret = TRUE;
}
- return sp1C;
+ return ret;
}
UNK_RET func_80079AAC_jp(void) {
PakInfo* info = mCPk_get_pkinfo();
- s32 sp20 = 0;
+ s32 ret = 0;
s32 sp1C;
- func_8007919C_jp(info, 0);
+ mCPk_SetForestPakState(info, 0);
if (func_80079A24_jp(info) == 1) {
if (func_8007967C_jp(&sp1C, 0, info) == 1) {
- sp20 = func_80079708_jp(sp1C);
+ ret = func_80079708_jp(sp1C);
}
} else {
- sp20 = 1;
+ ret = 1;
}
- return sp20;
+ return ret;
}
void func_80079B28_jp(UNK_PTR arg0, u32 arg1, PakInfo* info) {
@@ -428,65 +429,65 @@ void func_80079B28_jp(UNK_PTR arg0, u32 arg1, PakInfo* info) {
if (temp_v0 == 1) {
if (func_8008EE7C_jp(arg0, arg1) != 0) {
- func_8007919C_jp(info, 1);
+ mCPk_SetForestPakState(info, 1);
queue = padmgr_LockSerialMesgQ();
- func_800CD9F0_jp(&info->unk_04, &info->unk_74);
+ sCPk_DeleteFile(&info->pfsInfo, &info->pfsState);
padmgr_UnlockSerialMesgQ(queue);
}
} else if (temp_v0 == -1) {
info2 = mCPk_get_pkinfo();
- func_8007919C_jp(info2, 1);
- B_80137C40_jp.unk_1200 = padmgr_LockSerialMesgQ();
- func_800CD9F0_jp(&info2->unk_04, &info2->unk_74);
- padmgr_UnlockSerialMesgQ(B_80137C40_jp.unk_1200);
+ mCPk_SetForestPakState(info2, 1);
+ l_pak_ctrl.queue = padmgr_LockSerialMesgQ();
+ sCPk_DeleteFile(&info2->pfsInfo, &info2->pfsState);
+ padmgr_UnlockSerialMesgQ(l_pak_ctrl.queue);
}
}
UNK_RET func_80079BF8_jp(PakInfo* info) {
UNUSED s32 pad;
s32 sp28;
- s32 sp24 = 0;
+ s32 ret = 0;
UNK_PTR sp20;
if (!mLd_PlayerManKindCheck()) {
- func_8007919C_jp(info, 1);
- sp20 = zelda_malloc(info->unk_74.unk_00);
+ mCPk_SetForestPakState(info, 1);
+ sp20 = zelda_malloc(info->pfsState.file_size);
if (sp20 != NULL) {
- func_80079B28_jp(sp20, info->unk_74.unk_00, info);
+ func_80079B28_jp(sp20, info->pfsState.file_size, info);
}
if (func_800794E4_jp(&sp28, 1, info, sp20) == TRUE) {
- sp24 = func_80079708_jp(sp28);
+ ret = func_80079708_jp(sp28);
}
if (sp20 != NULL) {
zelda_free(sp20);
}
} else if (func_800966E0_jp() == 1) {
- func_8007919C_jp(info, 0);
+ mCPk_SetForestPakState(info, 0);
if (func_80079A24_jp(info) == 1) {
if (func_8007967C_jp(&sp28, 0, info) == 1) {
- sp24 = func_80079708_jp(sp28);
+ ret = func_80079708_jp(sp28);
}
} else {
- sp24 = 1;
+ ret = 1;
}
}
- return sp24;
+ return ret;
}
UNK_RET func_80079D00_jp(void) {
PakInfo* info = mCPk_get_pkinfo();
- s32 sp18 = 0;
+ s32 ret = 0;
- if (mCPk_PakOpen(info, 0) == 1) {
- sp18 = func_80079BF8_jp(info);
+ if (mCPk_PakOpen(info, 0) == TRUE) {
+ ret = func_80079BF8_jp(info);
}
- return sp18;
+ return ret;
}
s32 func_80079D50_jp(D801047B0Struct* arg0, PakInfo* info, u8* index) {
- func_8007919C_jp(info, 1);
+ mCPk_SetForestPakState(info, 1);
arg0->unk_0000 = func_8008EEB4_jp(arg0, sizeof(D801047B0Struct), arg0->unk_0000);
if (func_8007920C_jp(info, arg0) == 1) {
if (mLd_PlayerManKindCheck()) {
@@ -506,70 +507,69 @@ s32 func_80079D50_jp(D801047B0Struct* arg0, PakInfo* info, u8* index) {
}
s32 func_80079E14_jp(UNUSED D801047B0Struct* arg0, UNUSED PakInfo* info, u8* arg2) {
- s32 temp_v0 = func_80090044_jp();
+ s32 ret = func_80090044_jp();
- if (temp_v0 != 0) {
+ if (ret != 0) {
*arg2 = 0;
}
- return temp_v0;
+ return ret;
}
typedef s32 (*D801047B0Func)(D801047B0Struct*, PakInfo*, u8*);
D801047B0Func D_801047B0_jp[2] = { func_80079D50_jp, func_80079E14_jp };
-s32 func_80079E54_jp(D801047B0Struct* arg0, PakInfo* arg1) {
+s32 func_80079E54_jp(D801047B0Struct* arg0, PakInfo* info) {
static u8 D_801047B8_jp = 0;
if (D_801047B8_jp >= ARRAY_COUNT(D_801047B0_jp)) {
D_801047B8_jp = 0;
}
- return D_801047B0_jp[D_801047B8_jp](arg0, arg1, &D_801047B8_jp);
+ return D_801047B0_jp[D_801047B8_jp](arg0, info, &D_801047B8_jp);
}
s32 func_80079EA4_jp(UNK_PTR arg0, PakInfo* info) {
- func_8007919C_jp(info, 1);
+ mCPk_SetForestPakState(info, 1);
return func_800792FC_jp(info, arg0);
}
void func_80079EDC_jp(void) {
PakInfo* info = mCPk_get_pkinfo();
- func_80079080_jp(&B_80137C40_jp);
- func_8007919C_jp(info, 0);
- B_80137C40_jp.unk_0000.unk_0000 =
- func_8008EEB4_jp(&B_80137C40_jp, sizeof(B80137C40Unk0000Struct), B_80137C40_jp.unk_0000.unk_0000);
- func_8007920C_jp(info, &B_80137C40_jp);
+ mCPk_ClearPassport(&l_pak_ctrl.passport);
+ mCPk_SetForestPakState(info, 0);
+ l_pak_ctrl.passport.unk_0000 = func_8008EEB4_jp(&l_pak_ctrl, sizeof(Passport), l_pak_ctrl.passport.unk_0000);
+ func_8007920C_jp(info, &l_pak_ctrl.passport);
}
s32 func_80079F44_jp(void) {
PakInfo* info = mCPk_get_pkinfo();
u16 sp2A = 0;
s32 sp24;
- s32 var_s0 = 0;
+ s32 ret = 0;
- func_8007919C_jp(info, 0);
+ mCPk_SetForestPakState(info, 0);
- sp24 = func_800792FC_jp(info, &B_80137C40_jp);
+ sp24 = func_800792FC_jp(info, &l_pak_ctrl.passport);
if (sp24 == 1) {
- B_80137C40_jp.unk_1204 = 1;
- sp2A = func_8008EE7C_jp(&B_80137C40_jp, sizeof(B80137C40Unk0000Struct));
+ l_pak_ctrl.unk_1204 = 1;
+ sp2A = func_8008EE7C_jp(&l_pak_ctrl, sizeof(Passport));
} else if (sp24 == -1) {
- var_s0 = -2;
+ ret = -2;
} else {
- var_s0 = -1;
+ ret = -1;
}
if ((sp24 == 1) && (sp2A == 0)) {
- var_s0 = 1;
+ ret = 1;
} else {
- B_80137C40_jp.unk_1204 = 0;
- func_80079080_jp(&B_80137C40_jp);
+ l_pak_ctrl.unk_1204 = 0;
+ mCPk_ClearPassport(&l_pak_ctrl.passport);
}
- return var_s0;
+ return ret;
}
void func_8007A008_jp(void) {
@@ -578,9 +578,9 @@ void func_8007A008_jp(void) {
OSMesgQueue* queue;
if ((temp_v0 == 0) || (temp_v0 == -2)) {
- func_8007919C_jp(info, 0);
+ mCPk_SetForestPakState(info, 0);
queue = padmgr_LockSerialMesgQ();
- func_800CD9F0_jp(&info->unk_04, &info->unk_74);
+ sCPk_DeleteFile(&info->pfsInfo, &info->pfsState);
padmgr_UnlockSerialMesgQ(queue);
}
}
@@ -591,11 +591,11 @@ PakInfo* mCPk_get_pkinfo(void) {
s32 func_8007A080_jp(void) {
PakInfo* info = mCPk_get_pkinfo();
- s32 var_v1 = TRUE;
+ s32 ret = TRUE;
- if ((info != NULL) && (info->unk_04.unk_6C == 10)) {
- var_v1 = FALSE;
+ if ((info != NULL) && (info->pfsInfo.err == PFS_ERR_ID_FATAL)) {
+ ret = FALSE;
}
- return var_v1;
+ return ret;
}
diff --git a/src/code/m_private.c b/src/code/m_private.c
index f957663..8ee4297 100644
--- a/src/code/m_private.c
+++ b/src/code/m_private.c
@@ -666,7 +666,7 @@ s32 mPr_CheckMuseumInfoMail(PrivateInfo* priv) {
s32 mPr_LoadPak_and_SetPrivateInfo2(u8 player, PakInfo* pak) {
PrivateInfo* priv;
s32 res = FALSE;
- s32 save = func_8007942C_jp(&g_foreigner_private, mNpc_GetInAnimalP(), pak);
+ s32 save = mCPk_PakPrivateLoad(&g_foreigner_private, mNpc_GetInAnimalP(), pak);
if (save == TRUE) {
if (player < 4) {
diff --git a/src/code/s_cpak.c b/src/code/s_cpak.c
new file mode 100644
index 0000000..832fb4d
--- /dev/null
+++ b/src/code/s_cpak.c
@@ -0,0 +1,181 @@
+#include "s_cpak.h"
+#include "global.h"
+
+#include "getcurrentms.h"
+#include "padmgr.h"
+
+void sCPk_SetCode(OSPfsState* pfsState, u16* companyCode, u32* gameCode) {
+ bcopy(companyCode, &pfsState->company_code, sizeof(pfsState->company_code));
+ bcopy(gameCode, &pfsState->game_code, sizeof(pfsState->game_code));
+}
+
+s32 sCPk_PakOpen(OSPfsInfo* pfsInfo, s32 channel) {
+ OSMesgQueue* queue;
+ s32 err;
+ s32 ret = FALSE;
+
+ queue = padmgr_LockSerialMesgQ();
+ err = osPfsInitPak(queue, &pfsInfo->pfs, channel);
+
+ if (err == 0) {
+ ret = TRUE;
+ }
+
+ if (err == PFS_ERR_DEVICE) {
+ if (osMotorInit(queue, &pfsInfo->pfs, channel) != 0) {
+ if (osGbpakInit(queue, &pfsInfo->pfs, channel) != 0) {
+ err = PFS_ERR_ID_FATAL;
+ }
+ }
+ }
+
+ pfsInfo->err = err;
+ padmgr_UnlockSerialMesgQ(queue);
+
+ return ret;
+}
+
+s32 sCPk_PakFreeArea(OSPfsInfo* pfsInfo) {
+ s32 bytes;
+
+ pfsInfo->err = osPfsFreeBlocks(&pfsInfo->pfs, &bytes);
+ return bytes;
+}
+
+s32 sCPk_Save(OSPfsInfo* pfsInfo, s32 offset, s32 size, u8* buffer) {
+ UNUSED s32 pad;
+ s32 err;
+ s32 ret = FALSE;
+ s32 writeSize = 0x2300;
+
+ do {
+ if (size < writeSize) {
+ writeSize = size;
+ }
+ err = osPfsReadWriteFile(&pfsInfo->pfs, pfsInfo->fileNo, PFS_WRITE, offset, writeSize, buffer);
+ offset += writeSize;
+ buffer += writeSize;
+ size -= writeSize;
+ B_80145FF8_jp = GetCurrentMilliseconds();
+ } while ((size > 0) && (err == 0));
+
+ if (err == 0) {
+ ret = TRUE;
+ }
+
+ pfsInfo->err = err;
+ return ret;
+}
+
+s32 sCPk_Load(OSPfsInfo* pfsInfo, s32 offset, s32 size, u8* buffer) {
+ UNUSED s32 pad;
+ s32 err;
+ s32 ret = FALSE;
+ s32 readSize = 0x2300;
+
+ do {
+ if (size < readSize) {
+ readSize = size;
+ }
+ err = osPfsReadWriteFile(&pfsInfo->pfs, pfsInfo->fileNo, PFS_READ, offset, readSize, buffer);
+ offset += readSize;
+ buffer += readSize;
+ size -= readSize;
+ B_80145FF8_jp = GetCurrentMilliseconds();
+ } while ((size > 0) && (err == 0));
+
+ if (err == 0) {
+ ret = TRUE;
+ }
+
+ pfsInfo->err = err;
+ return ret;
+}
+
+s32 sCPk_MakeFile(OSPfsInfo* pfsInfo, OSPfsState* pfsState, size_t size) {
+ s32 alignedSize = ALIGN256(size);
+ s32 ret = FALSE;
+ s32 err;
+
+ if (sCPk_PakFreeArea(pfsInfo) < alignedSize) {
+ return FALSE;
+ }
+
+ err = osPfsAllocateFile(&pfsInfo->pfs, pfsState->company_code, pfsState->game_code, (u8*)pfsState->game_name,
+ (u8*)pfsState->ext_name, alignedSize, &pfsInfo->fileNo);
+ if (err == 0) {
+ ret = TRUE;
+ }
+
+ pfsInfo->err = err;
+ return ret;
+}
+
+s32 sCPk_FileOpen(OSPfsInfo* pfsInfo, OSPfsState* pfsState) {
+ s32 err;
+ s32 ret = FALSE;
+
+ err = osPfsFindFile(&pfsInfo->pfs, pfsState->company_code, pfsState->game_code, (u8*)pfsState->game_name,
+ (u8*)pfsState->ext_name, &pfsInfo->fileNo);
+
+ pfsInfo->err = err;
+ if (err == 0) {
+ ret = TRUE;
+ }
+
+ return ret;
+}
+
+s32 sCPk_DeleteFile(OSPfsInfo* pfsInfo, OSPfsState* pfsState) {
+ s32 err;
+ s32 ret = FALSE;
+
+ err = osPfsDeleteFile(&pfsInfo->pfs, pfsState->company_code, pfsState->game_code, (u8*)pfsState->game_name,
+ (u8*)pfsState->ext_name);
+ if (err == 0) {
+ ret = TRUE;
+ }
+
+ pfsInfo->err = err;
+
+ return ret;
+}
+
+u32 sCPk_FileState(OSPfsInfo* pfsInfo, OSPfsState* pfsState) {
+ s32 err = osPfsFileState(&pfsInfo->pfs, pfsInfo->fileNo, pfsState);
+
+ pfsInfo->err = err;
+ if (err != 0) {
+ return 0;
+ }
+
+ return pfsState->file_size;
+}
+
+s32 sCPk_FileNum(OSPfsInfo* pfsInfo, s32* maxFiles, s32* filesUsed) {
+ s32 err;
+ s32 ret = FALSE;
+
+ err = osPfsNumFiles(&pfsInfo->pfs, maxFiles, filesUsed);
+
+ if (err == 0) {
+ ret = TRUE;
+ }
+
+ pfsInfo->err = err;
+ return ret;
+}
+
+s32 sCPk_RepairID(OSPfsInfo* pfsInfo) {
+ s32 err;
+ s32 ret = FALSE;
+
+ err = osPfsRepairId(&pfsInfo->pfs);
+
+ if (err == 0) {
+ ret = TRUE;
+ }
+
+ pfsInfo->err = err;
+ return ret;
+}
diff --git a/src/overlays/gamestates/ovl_second_game/second_game.c b/src/overlays/gamestates/ovl_second_game/second_game.c
index afa4e2f..1fdf266 100644
--- a/src/overlays/gamestates/ovl_second_game/second_game.c
+++ b/src/overlays/gamestates/ovl_second_game/second_game.c
@@ -14,7 +14,7 @@ void second_game_main(Game* game) {
Game_SecondGame* secondGame = (Game_SecondGame*)game;
if (mCPk_PakOpen(info, 0) == 0) {
- if (info->unk_04.unk_6C == 1 || info->unk_04.unk_6C == 11) {
+ if (info->pfsInfo.err == PFS_ERR_NOPACK || info->pfsInfo.err == PFS_ERR_DEVICE) {
mempak = 0;
} else {
mempak = 1;
diff --git a/yamls/jp/code.yaml b/yamls/jp/code.yaml
index 0ce6406..019bf93 100644
--- a/yamls/jp/code.yaml
+++ b/yamls/jp/code.yaml
@@ -87,7 +87,8 @@
- [0x6EDD10, c, code/m_time]
- [0x6EE540, c, code/m_view]
- [0x6EFC20, asm, code/6EFC20]
- - [0x6F12E0, asm, code/6F12E0]
+ - [0x6F12E0, c, code/s_cpak]
+ - [0x6F17B0, asm, code/6F17B0]
- [0x6F2150, c, code/m_roll_lib]
- [0x6F2EE0, c, code/PreRender]
- [0x6F5180, c, code/THA_GA]
@@ -304,7 +305,7 @@
- { start: 0x74AB40, type: bss, vram: 0x80123F80, name: code/80123F80}
- { start: 0x73F4D0, type: .bss, vram: 0x80126E70, name: code/m_collision_obj }
- { start: 0x74AB40, type: .bss, vram: 0x80126EA0, name: code/m_common_data }
- - { start: 0x75B600, type: bss, vram: 0x80137960, name: code/m_cpak }
+ - { start: 0x75B600, type: .bss, vram: 0x80137960, name: code/m_cpak }
- { start: 0x73F4D0, type: .bss, vram: 0x80138E50, name: code/m_debug}
- { start: 0x73F4D0, type: .bss, vram: 0x80138E60, name: code/m_debug_display}
- { start: 0x73F4D0, type: bss, vram: 0x80138E70, name: code/80138E70 }