diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/code/m_cpak.c | 490 | ||||
| -rw-r--r-- | src/code/m_private.c | 2 | ||||
| -rw-r--r-- | src/code/s_cpak.c | 181 | ||||
| -rw-r--r-- | src/overlays/gamestates/ovl_second_game/second_game.c | 2 |
4 files changed, 428 insertions, 247 deletions
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; |
