From c07c907d97bc02bc865403a6b6bd4bc54f6afba9 Mon Sep 17 00:00:00 2001 From: Bl00D4NGEL Date: Sat, 5 Oct 2024 02:58:17 +0200 Subject: [PATCH 1/4] document: sandcastle (code_3E30) related code --- include/enums.h | 8 +- level_symbols.us.v10.txt | 2 +- src/TTC/code_3E30.c | 1224 ++++++++++++++++++++++--------------- src/core2/ch/crab.c | 4 +- src/core2/ch/gameSelect.c | 2 +- src/core2/code_73640.c | 2 +- src/core2/code_9B990.c | 6 +- src/core2/code_AD5B0.c | 2 +- src/core2/code_CF3E0.c | 4 +- src/core2/gc/dialog.c | 5 + 10 files changed, 767 insertions(+), 492 deletions(-) diff --git a/include/enums.h b/include/enums.h index da212652..6230eef9 100644 --- a/include/enums.h +++ b/include/enums.h @@ -290,7 +290,7 @@ enum volatile_flags_e { VOLATILE_FLAG_74_SANDCASTLE_INFINITE_EGGS, VOLATILE_FLAG_75_SANDCASTLE_INFINITE_RED_FEATHERS, VOLATILE_FLAG_76_SANDCASTLE_INFINITE_GOLD_FEATHERS, - VOLATILE_FLAG_77, // unused + VOLATILE_FLAG_77_SANDCASTLE_SET_HEALTH_TO_MAX, // unused VOLATILE_FLAG_78_SANDCASTLE_NO_BONUS, VOLATILE_FLAG_79, // unused VOLATILE_FLAG_7A, // unused @@ -4265,7 +4265,7 @@ enum asset_e ASSET_E35_DIALOG_BOTTLES_BONUS_REMINDER = VER_SELECT(0xE35, 0xa77, 0, 0), ASSET_E37_TEXT_BOTTLES_STOP_WASTING_TIME_AFTER_FURNACE_FUN = 0xE37, // Talk to bottles after beating furnace fun - ASSET_E38_TEXT_UNKNOWN, + ASSET_E38_CHEATING_ERASE_SAVE_CONFIRMATION, ASSET_E57_DIALOG_FIRST_JIGGY = VER_SELECT(0xF57, 0xabd, 0, 0), @@ -4282,8 +4282,8 @@ enum asset_e ASSET_FAD_TEXT_UNKNOWN = 0xfad, - ASSET_FBE_TEXT_UNKNOWN = 0xfbe, - ASSET_FBF_TEXT_UNKNOWN, + ASSET_FBE_TEXT_CHEATING_ERASE_SAVE_WARNING = 0xfbe, + ASSET_FBF_TEXT_ERASED_SAVE, ASSET_10A1_DIALOG_BRENTILDA_MEET = 0x10A1, ASSET_10A2_TEXT_UNKNOWN, diff --git a/level_symbols.us.v10.txt b/level_symbols.us.v10.txt index aabae6b5..4d14705c 100644 --- a/level_symbols.us.v10.txt +++ b/level_symbols.us.v10.txt @@ -1,7 +1,7 @@ sm_func_80386810 = 0x80386810; mm_func_803888B0 = 0x803888B0; TTC_resetSpawnableActors = 0x80388AC0; -ttc_func_8038BF8C = 0x8038BF8C; +code_3E30_isSecretCheatCodeRelatedValueEqualToScrambledAddressValue = 0x8038BF8C; cc_func_803870E0 = 0x803870E0; cc_func_80387DA0 = 0x80387DA0; bgs_func_803885DC = 0x803885DC; diff --git a/src/TTC/code_3E30.c b/src/TTC/code_3E30.c index 6b679ffc..1414f29a 100644 --- a/src/TTC/code_3E30.c +++ b/src/TTC/code_3E30.c @@ -5,326 +5,434 @@ #include "SnS.h" /* extern */ -extern void func_802D6310(f32, enum map_e, s32, s32, enum file_progress_e); + +void func_802D6310(f32, enum map_e, s32, s32, enum file_progress_e); extern BKModel *mapModel_getModel(s32); extern u8 D_8037DCC0[7]; /* .h */ -void func_8038B5B4(void); -u32 func_8038B600(void); -typedef struct { +static void __code3E30_resetSecretCheatCodeProgress(void); +static u32 __code3E30_scrambleAddressForSecretCheatCode(); + +typedef struct +{ u8 *code; - u8 unk4; + u8 codeCharacterIdx; u8 id; - s16 unk6; -} struct_ttc_3E30_4_s; + s16 unk6; // unused +} SecretCheatCode; -typedef struct { - u8 *code; - s16 unk4; - s16 unk6; -} struct_ttc_3E30_3_s; +typedef struct +{ + u8 *code; // string of code where the hex value of floor_letters_e is converted into a char + s16 flagBitMask; + s16 codeCharacterIdx; +} CheatCode; -typedef struct { +typedef struct +{ s16 meshId; - u8 letter; - u8 unk3; - f32 unk4; -}LetterFloorTile; + u8 letter; // floor_letters_e + u8 state; // some sort of state, 1 - 5 + f32 time_delta_sum; +} LetterFloorTile; -typedef struct { +typedef struct +{ s16 minId; s16 maxId; -}IdRange; +} BannedCheatCodeRange; -s32 __sandcastleCodes_getNumberEntered(void); +static s32 __code3E30_getNumberOfBannedCheatCodesEntered(); /* .data */ -s32 D_8038C980 = 0; -LetterFloorTile letterFloorTilesTable[] ={ - {0x02, 0x70, 0, 0.0f}, - {0x04, 0x35, 0, 0.0f}, - {0x06, 0x6E, 0, 0.0f}, - {0x08, 0x62, 0, 0.0f}, - {0x0A, 0x61, 0, 0.0f}, - {0x0C, 0x6A, 0, 0.0f}, - {0x0E, 0x30, 0, 0.0f}, - {0x10, 0x31, 0, 0.0f}, - {0x12, 0x69, 0, 0.0f}, - {0x14, 0x39, 0, 0.0f}, - {0x16, 0x72, 0, 0.0f}, - {0x18, 0x6C, 0, 0.0f}, - {0x1A, 0x36, 0, 0.0f}, - {0x1C, 0x32, 0, 0.0f}, - {0x1E, 0x33, 0, 0.0f}, - {0x20, 0x67, 0, 0.0f}, - {0x22, 0x65, 0, 0.0f}, - {0x24, 0x34, 0, 0.0f}, - {0x26, 0x68, 0, 0.0f}, - {0x28, 0x64, 0, 0.0f}, - {0x2A, 0x63, 0, 0.0f}, - {0x2C, 0x36, 0, 0.0f}, - {0x2E, 0x6E, 0, 0.0f}, - {0x30, 0x37, 0, 0.0f}, - {0x32, 0x36, 0, 0.0f}, - {0x34, 0x6D, 0, 0.0f}, - {0x36, 0x6B, 0, 0.0f}, - {0x38, 0x38, 0, 0.0f}, - {0x00, 0x00, 0, 0.0f} +static s32 secretCheatCodeRelatedValue = NULL; + +enum floor_letters_e { + FLOOR_LETTER_J = 0x70, + FLOOR_LETTER_G = 0x35, + FLOOR_LETTER_A = 0x6E, + FLOOR_LETTER_L = 0x62, + FLOOR_LETTER_V = 0x61, + FLOOR_LETTER_E = 0x6A, + FLOOR_LETTER_C = 0x30, + FLOOR_LETTER_M = 0x31, + FLOOR_LETTER_N = 0x69, + FLOOR_LETTER_R = 0x39, + FLOOR_LETTER_P = 0x72, + FLOOR_LETTER_D = 0x6C, + FLOOR_LETTER_O = 0x36, + FLOOR_LETTER_S = 0x32, + FLOOR_LETTER_Z = 0x33, + FLOOR_LETTER_U = 0x67, + FLOOR_LETTER_Y = 0x65, + FLOOR_LETTER_I = 0x34, + FLOOR_LETTER_X = 0x68, + FLOOR_LETTER_T = 0x64, + FLOOR_LETTER_F = 0x63, + FLOOR_LETTER_W = 0x37, + FLOOR_LETTER_H = 0x6D, + FLOOR_LETTER_B = 0x6B, + FLOOR_LETTER_K = 0x38 }; - -struct_ttc_3E30_3_s codesTable[] = { - {"knip68n3664j", 0x0001, 0}, //BANJOKAZOOIE - {"kbgjj552", 0x0002, 0}, //BLUEEGGS - {"9jlcjndmj92", 0x0004, 0}, //REDFEATHERS - {"56blcjndmj92", 0x0008, 0}, //GOLDFEATHERS - {"k6ddbj2k6ig26ij", 0x0010, 0}, //BOTTLESBONUSONE - {"k6ddbj2k6ig2d76", 0x0020, 0}, //BOTTLESBONUSTWO - {"k6ddbj2k6ig2dm9jj", 0x0040, 0}, //BOTTLESBONUSTHREE - {"k6ddbj2k6ig2c6g9", 0x0080, 0}, //BOTTLESBONUSFOUR - {"k6ddbj2k6ig2c4aj", 0x0100, 0}, //BOTTLESBONUSFIVE - {"k45k6ddbj2k6ig2", 0x0200, 0}, //BIGBOTTLESBONUS - {"742me7n2meknip6", 0x0400, 0}, //WISHYWASHYBANJO - {"i6k6ig2", 0x0800, 0}, //NOBONUS - 0 +static LetterFloorTile sLetterFloorTiles[] = { + {0x02, FLOOR_LETTER_J, 0, 0.0f}, + {0x04, FLOOR_LETTER_G, 0, 0.0f}, + {0x06, FLOOR_LETTER_A, 0, 0.0f}, + {0x08, FLOOR_LETTER_L, 0, 0.0f}, + {0x0A, FLOOR_LETTER_V, 0, 0.0f}, + {0x0C, FLOOR_LETTER_E, 0, 0.0f}, + {0x0E, FLOOR_LETTER_C, 0, 0.0f}, + {0x10, FLOOR_LETTER_M, 0, 0.0f}, + {0x12, FLOOR_LETTER_N, 0, 0.0f}, + {0x14, FLOOR_LETTER_R, 0, 0.0f}, + {0x16, FLOOR_LETTER_P, 0, 0.0f}, + {0x18, FLOOR_LETTER_D, 0, 0.0f}, + {0x1A, FLOOR_LETTER_O, 0, 0.0f}, + {0x1C, FLOOR_LETTER_S, 0, 0.0f}, + {0x1E, FLOOR_LETTER_Z, 0, 0.0f}, + {0x20, FLOOR_LETTER_U, 0, 0.0f}, + {0x22, FLOOR_LETTER_Y, 0, 0.0f}, + {0x24, FLOOR_LETTER_I, 0, 0.0f}, + {0x26, FLOOR_LETTER_X, 0, 0.0f}, + {0x28, FLOOR_LETTER_T, 0, 0.0f}, + {0x2A, FLOOR_LETTER_F, 0, 0.0f}, + {0x2C, FLOOR_LETTER_O, 0, 0.0f}, + {0x2E, FLOOR_LETTER_A, 0, 0.0f}, + {0x30, FLOOR_LETTER_W, 0, 0.0f}, + {0x32, FLOOR_LETTER_O, 0, 0.0f}, + {0x34, FLOOR_LETTER_H, 0, 0.0f}, + {0x36, FLOOR_LETTER_B, 0, 0.0f}, + {0x38, FLOOR_LETTER_K, 0, 0.0f}, + {NULL, NULL, NULL, NULL} }; -struct{ +static CheatCode sCheatCodes[0xD] = { + {"knip68n3664j", 0x0001, 0}, // BANJOKAZOOIE + {"kbgjj552", 0x0002, 0}, // BLUEEGGS + {"9jlcjndmj92", 0x0004, 0}, // REDFEATHERS + {"56blcjndmj92", 0x0008, 0}, // GOLDFEATHERS + {"k6ddbj2k6ig26ij", 0x0010, 0}, // BOTTLESBONUSONE + {"k6ddbj2k6ig2d76", 0x0020, 0}, // BOTTLESBONUSTWO + {"k6ddbj2k6ig2dm9jj", 0x0040, 0}, // BOTTLESBONUSTHREE + {"k6ddbj2k6ig2c6g9", 0x0080, 0}, // BOTTLESBONUSFOUR + {"k6ddbj2k6ig2c4aj", 0x0100, 0}, // BOTTLESBONUSFIVE + {"k45k6ddbj2k6ig2", 0x0200, 0}, // BIGBOTTLESBONUS + {"742me7n2meknip6", 0x0400, 0}, // WISHYWASHYBANJO + {"i6k6ig2", 0x0800, 0}, // NOBONUS + NULL +}; + +struct +{ BKModel *model1; BKModel *model2; - u8 unk8; - u8 sfxsourceIdx; - u8 unkA; - u8 padB[1]; - f32 unkC; - u8 unk10; -} D_8038D720; - - + u8 banjoKazooieCodeEnteredState; // 0 = BK code not entered, 2 = BK code entered, 3 = jiggy collected + u8 doorOpeningSfxSourceIdx; + u8 dullCannonShotSfxSourceId; + u8 padB[1]; + f32 unkC; // time in map? + u8 timerState; // 0 = nothing, 1 = timer running, 2 = no timer required / time trial completed +} sMapState; /* .code */ -void func_8038A220( s32 arg0, BKVtxRef *vtx_ref, Vtx *vtx, s32 arg2){ +static void __code3E30_transformMeshCallbackOverlayUpdate(s32 arg0, BKVtxRef *vtx_ref, Vtx *vtx, s32 arg2) +{ vtx->v.ob[1] += 2; } -void func_8038A23C( s32 arg0, BKVtxRef *vtx_ref, Vtx *vtx, s32 arg2){ +static void __code3E30_transformMeshCallbackOverlayInit(s32 arg0, BKVtxRef *vtx_ref, Vtx *vtx, s32 arg2) +{ vtx->v.ob[1] += 0xf0; } -void func_8038A258(s32 arg0) { - if (arg0 == 1) { - if (volatileFlag_get(VOLATILE_FLAG_2_FF_IN_MINIGAME)) { - item_set(ITEM_0_HOURGLASS_TIMER, 3000 - 1); - } else { - item_set(ITEM_0_HOURGLASS_TIMER, 6000 - 1); +static void __code3E30_setupCheatCodeTimer(s32 new_timer_state) +{ + if (new_timer_state == 1) + { // something in FF? + if (volatileFlag_get(VOLATILE_FLAG_2_FF_IN_MINIGAME)) + { + // set timer to 50 seconds + item_set(ITEM_0_HOURGLASS_TIMER, 2999); + } + else + { + // set timer to 100 seconds + item_set(ITEM_0_HOURGLASS_TIMER, 5999); } item_set(ITEM_6_HOURGLASS, TRUE); } - if (D_8038D720.unk10 == 1) { + + if (sMapState.timerState == 1) + { item_set(ITEM_6_HOURGLASS, FALSE); } - D_8038D720.unk10 = arg0; + + sMapState.timerState = new_timer_state; } -LetterFloorTile *func_8038A2DC(s32 mesh_id) { +static LetterFloorTile* __code_3E30_getFloorTileForMeshId(s32 mesh_id) +{ LetterFloorTile *i_ptr; - for(i_ptr = letterFloorTilesTable; i_ptr->meshId != 0; i_ptr++){ - if(i_ptr->meshId == mesh_id){ + for (i_ptr = sLetterFloorTiles; i_ptr->meshId != NULL; i_ptr++) + { + if (i_ptr->meshId == mesh_id) + { return i_ptr; } } + return NULL; } -void func_8038A328(void) { +static void __code3E30_initFloorTiles(void) +{ LetterFloorTile *i_ptr; - for(i_ptr = letterFloorTilesTable; i_ptr->meshId != 0; i_ptr++){ - i_ptr->unk3 = 2; - i_ptr->unk4 = 0.0f; + for (i_ptr = sLetterFloorTiles; i_ptr->meshId != 0; i_ptr++) + { + i_ptr->state = 2; + i_ptr->time_delta_sum = 0.0f; } + mapSpecificFlags_set(TTC_SPECIFIC_FLAG_1_UNKNOWN, FALSE); } -void func_8038A37C(s32 arg0, BKVtxRef *ref, Vtx *dst, s32 arg3) { - LetterFloorTile *ptr = (LetterFloorTile *) arg3; +static void __code3E30_meshCallbackFloorTileState_1(s32 arg0, BKVtxRef *ref, Vtx *dst, s32 arg3) +{ + LetterFloorTile *ptr = (LetterFloorTile *)arg3; f32 temp_f2; - if (ptr->unk4 < 0.5) { - temp_f2 = (ptr->unk4 / 0.5); + if (ptr->time_delta_sum < 0.5) + { + temp_f2 = (ptr->time_delta_sum / 0.5); dst->v.cn[0] = (ref->v.v.cn[0] - 0xFF) * temp_f2 + 255.0f; dst->v.cn[1] = ref->v.v.cn[1] * temp_f2; dst->v.cn[2] = ref->v.v.cn[2] * temp_f2; } - else{ + else + { dst->v.cn[0] = ref->v.v.cn[0]; dst->v.cn[1] = ref->v.v.cn[1]; dst->v.cn[2] = ref->v.v.cn[2]; - ptr->unk3 = 2; + ptr->state = 2; } } -void TTC_func_8038A5D8(LetterFloorTile *arg0, s32 arg1) { +static void __code3E30_setLetterFloorTileState(LetterFloorTile *arg0, s32 arg1) +{ s32 temp_v0; - temp_v0 = arg0->unk3; - arg0->unk3 = arg1; - arg0->unk4 = 0.0f; - if ((arg1 == 1) && (temp_v0 != arg1)) { + temp_v0 = arg0->state; + arg0->state = arg1; + arg0->time_delta_sum = 0.0f; + if ((arg1 == 1) && (temp_v0 != arg1)) + { func_8025A6EC(COMUSIC_2C_BUZZER, 32000); } } -void func_8038A618(s32 arg0, BKVtxRef *ref, Vtx *dst, s32 arg3) { - LetterFloorTile *ptr = (LetterFloorTile *) arg3; +static void __code3E30_meshCallbackFloorTileState_3(s32 arg0, BKVtxRef *ref, Vtx *dst, s32 arg3) +{ + LetterFloorTile *ptr = (LetterFloorTile *)arg3; f32 temp_f12; - - if (ptr->unk4 <= 0.5) { - temp_f12 = (ptr->unk4 / 0.5); + if (ptr->time_delta_sum <= 0.5) + { + temp_f12 = (ptr->time_delta_sum / 0.5); dst->v.cn[0] = ref->v.v.cn[0] * (1.0f - temp_f12); dst->v.cn[1] = 0xFF; dst->v.cn[2] = ref->v.v.cn[2] * (1.0f - temp_f12); } - if (ptr->unk4 >= 0.5) { - ptr->unk3 = 4; + if (ptr->time_delta_sum >= 0.5) + { + ptr->state = 4; } } -void func_8038A7DC(s32 arg0, BKVtxRef *ref, Vtx *dst, s32 arg3){ - LetterFloorTile *ptr = (LetterFloorTile *) arg3; +static void __code3E30_meshCallbackFloorTileState_5(s32 arg0, BKVtxRef *ref, Vtx *dst, s32 arg3) +{ + LetterFloorTile *ptr = (LetterFloorTile *)arg3; f32 temp_f2; - if (ptr->unk4 < 0.5) { - temp_f2 = (ptr->unk4 / 0.5); + if (ptr->time_delta_sum < 0.5) + { + temp_f2 = (ptr->time_delta_sum / 0.5); dst->v.cn[0] = (ref->v.v.cn[0] - 0xFF) * temp_f2 + 255.0f; dst->v.cn[1] = (ref->v.v.cn[1] - 0xFF) * temp_f2 + 255.0f; dst->v.cn[2] = ref->v.v.cn[2] * temp_f2; } - else{ + else + { dst->v.cn[0] = ref->v.v.cn[0]; dst->v.cn[1] = ref->v.v.cn[1]; dst->v.cn[2] = ref->v.v.cn[2]; - ptr->unk3 = 2; + ptr->state = 2; } } -void func_8038AA2C(void) { - f32 temp_f20; +static void __code3E30_updateTimeDeltaSumForFloorTiles() +{ + f32 time_delta; LetterFloorTile *floor_tile; - temp_f20 = time_getDelta(); - for(floor_tile = letterFloorTilesTable; floor_tile->meshId != 0; floor_tile++){ - floor_tile->unk4 += temp_f20; - if (floor_tile->unk3 == 1) { - BKModel_transformMesh(D_8038D720.model1, floor_tile->meshId, func_8038A37C, (s32)floor_tile); - } else if (floor_tile->unk3 == 3) { - BKModel_transformMesh(D_8038D720.model1, floor_tile->meshId, func_8038A618, (s32)floor_tile); - } else if (floor_tile->unk3 == 5) { - BKModel_transformMesh(D_8038D720.model1, floor_tile->meshId, func_8038A7DC, (s32)floor_tile); + time_delta = time_getDelta(); + for (floor_tile = sLetterFloorTiles; floor_tile->meshId != 0; floor_tile++) + { + floor_tile->time_delta_sum += time_delta; + if (floor_tile->state == 1) + { + BKModel_transformMesh(sMapState.model1, floor_tile->meshId, __code3E30_meshCallbackFloorTileState_1, (s32)floor_tile); + } + else if (floor_tile->state == 3) + { + BKModel_transformMesh(sMapState.model1, floor_tile->meshId, __code3E30_meshCallbackFloorTileState_3, (s32)floor_tile); + } + else if (floor_tile->state == 5) + { + BKModel_transformMesh(sMapState.model1, floor_tile->meshId, __code3E30_meshCallbackFloorTileState_5, (s32)floor_tile); } } } -void func_8038AB44(void){ - D_8038C980 = func_8038B600(); +static void __code3E30_setsecretCheatCodeRelatedValue(void) +{ + secretCheatCodeRelatedValue = __code3E30_scrambleAddressForSecretCheatCode(); } -u32 cheatoCodeUnlocked(s32 cheato_code_index){ - if(fileProgressFlag_get(FILEPROG_AD_CHEATO_BLUEEGGS_UNLOCKED + cheato_code_index - 1)){ +static u32 __code3E30_cheatoCodeUnlocked(s32 cheato_code_index) +{ + if (fileProgressFlag_get(FILEPROG_AD_CHEATO_BLUEEGGS_UNLOCKED + cheato_code_index - 1)) + { return 1 << cheato_code_index; } + return 0; } -void func_8038ABA0(u32 arg0){ +static void __code3E30_setVolatileFlags(u32 arg0) +{ int i; volatileFlag_setAndTriggerDialog_0(VOLATILE_FLAG_C2_NOBONUS_TEXT); - if(arg0 & 0x400){ + // wish washy banjo cheat code + if (arg0 & 0x400) + { volatileFlag_setAndTriggerDialog_E(VOLATILE_FLAG_C5_WISHYWASHYBANJO_TEXT); } volatileFlag_set(VOLATILE_FLAG_78_SANDCASTLE_NO_BONUS, 0); - for(i = 4; i < 0xb; i++){ - if( arg0 & (1 << i)){ + for (i = 4; i < 11; i++) + { + if (arg0 & (1 << i)) + { volatileFlag_set(VOLATILE_FLAG_93_SANDCASTLE_OPEN_CCW + i, TRUE); volatileFlag_set(VOLATILE_FLAG_78_SANDCASTLE_NO_BONUS, TRUE); } - else{ + else + { volatileFlag_set(VOLATILE_FLAG_93_SANDCASTLE_OPEN_CCW + i, FALSE); } } } -void func_8038AC48(LetterFloorTile *arg0) { - s32 sp40[4]; - s32 sp3C; - bool temp_s5; +static void __code3E30_checkFloorTileForRegularCheatCode(LetterFloorTile *letter_floor_tile) +{ + s32 sp40[4]; // unused but required for checksum + + bool floor_is_valid_or_correct; + bool is_in_ff_minigame; s32 i; u32 var_v0; - struct_ttc_3E30_3_s *i_ptr; - s32 phi_s1; - bool phi_s7; + CheatCode *cheatcode_ptr; + s32 unlocked_cheat_flags; + bool is_correct_input; - temp_s5 = volatileFlag_get(VOLATILE_FLAG_2_FF_IN_MINIGAME); - phi_s7 = FALSE; - sp3C = func_8038BD10(arg0); - for(i_ptr = codesTable; i_ptr->code != 0; i_ptr++){ - phi_s1 = (D_8038D720.unk8 == 0) ? 1 : 0; - if (!temp_s5) { - for(i = 1; i < 4; i++){ - phi_s1 |= cheatoCodeUnlocked(i); + is_in_ff_minigame = volatileFlag_get(VOLATILE_FLAG_2_FF_IN_MINIGAME); + is_correct_input = FALSE; + floor_is_valid_or_correct = __code3E30_isFloorTileValidForSecretCheatCode(letter_floor_tile); + for (cheatcode_ptr = sCheatCodes; cheatcode_ptr->code != NULL; cheatcode_ptr++) + { + unlocked_cheat_flags = (sMapState.banjoKazooieCodeEnteredState == 0) ? 1 : 0; + if (!is_in_ff_minigame) + { + for (i = 1; i < 4; i++) + { + unlocked_cheat_flags |= __code3E30_cheatoCodeUnlocked(i); } - for(i = 0; i < 7; i++){ - if (D_8037DCC0[i] != 0) { - phi_s1 |= (0x10 << i); + for (i = 0; i < 7; i++) + { + if (D_8037DCC0[i] != 0) + { + unlocked_cheat_flags |= (0x10 << i); } }; - if (volatileFlag_get(VOLATILE_FLAG_78_SANDCASTLE_NO_BONUS)) { - phi_s1 |= 0x800; + if (volatileFlag_get(VOLATILE_FLAG_78_SANDCASTLE_NO_BONUS)) + { + unlocked_cheat_flags |= 0x800; } } - if (i_ptr->unk4 & phi_s1) { - if (func_8038BF68() && !temp_s5) { - i_ptr->unk6 = 0; - func_8038A258(2); + if (cheatcode_ptr->flagBitMask & unlocked_cheat_flags) + { + if (__code3E30_isCurrentSecretCheatCodeCharacter0() && !is_in_ff_minigame) + { + cheatcode_ptr->codeCharacterIdx = 0; + __code3E30_setupCheatCodeTimer(2); } - if (arg0->letter == i_ptr->code[i_ptr->unk6]) { - phi_s7 = TRUE; - i_ptr->unk6++; - if (func_8038BF68()) { - i_ptr->unk6 = 0; - } else { - if (i_ptr->unk4 & 0xFFE) { - func_8038A258(2); - TTC_func_8038A5D8(arg0, 5); - } else { - TTC_func_8038A5D8(arg0, 3); + if (letter_floor_tile->letter == cheatcode_ptr->code[cheatcode_ptr->codeCharacterIdx]) + { + is_correct_input = TRUE; + cheatcode_ptr->codeCharacterIdx++; + if (__code3E30_isCurrentSecretCheatCodeCharacter0()) + { + cheatcode_ptr->codeCharacterIdx = 0; + } + else + { + // is not banjo kazooie + if (cheatcode_ptr->flagBitMask & 0xFFE) + { + __code3E30_setupCheatCodeTimer(2); + __code3E30_setLetterFloorTileState(letter_floor_tile, 5); } - if (i_ptr->code[i_ptr->unk6] == 0) { + else + { + __code3E30_setLetterFloorTileState(letter_floor_tile, 3); + } + if (cheatcode_ptr->code[cheatcode_ptr->codeCharacterIdx] == 0) + { func_8025A6EC(COMUSIC_2D_PUZZLE_SOLVED_FANFARE, 32000); - - if (temp_s5) { + + if (is_in_ff_minigame) + { item_set(ITEM_6_HOURGLASS, FALSE); volatileFlag_set(VOLATILE_FLAG_3, 0); volatileFlag_set(VOLATILE_FLAG_5_FF_MINIGAME_WON, 1); - func_8038A258(2); - } else { - var_v0 = i_ptr->unk4; - if (var_v0 & 1) { - D_8038D720.unk8 = 2U; - D_8038D720.unkC = 0.0f; + __code3E30_setupCheatCodeTimer(2); + } + else + { + var_v0 = cheatcode_ptr->flagBitMask; + // banjokazooie check + if (var_v0 & 1) + { + sMapState.banjoKazooieCodeEnteredState = 2; + sMapState.unkC = 0.0f; mapSpecificFlags_set(TTC_SPECIFIC_FLAG_1_UNKNOWN, TRUE); fileProgressFlag_set(0xFA, TRUE); - func_8030E2C4(D_8038D720.sfxsourceIdx); - func_8038A258(2); - } else if (var_v0 & 0xE) { - func_8035644C((i_ptr - codesTable) - 1 + FILEPROG_BE_CHEATO_BLUEEGGS); - switch ((i_ptr - codesTable) - 1) { /* irregular */ + func_8030E2C4(sMapState.doorOpeningSfxSourceIdx); + __code3E30_setupCheatCodeTimer(2); + } + // blue eggs & red/gold feathers check + else if (var_v0 & 0xE) + { + // trigger dialog + func_8035644C((cheatcode_ptr - sCheatCodes) - 1 + FILEPROG_BE_CHEATO_BLUEEGGS); + switch ((cheatcode_ptr - sCheatCodes) - 1) + { default: break; case 0: @@ -340,255 +448,296 @@ void func_8038AC48(LetterFloorTile *arg0) { func_802FAFAC(ITEM_10_GOLD_FEATHER, COMUSIC_14_GOLD_FEATHER_COLLECTED); break; } - } else if (var_v0 & 0xFF0) { - func_8038ABA0(var_v0); + } + // bottle bonus / wishy washy banjo / nobonus + else if (var_v0 & 0xFF0) + { + __code3E30_setVolatileFlags(var_v0); } } - } else { + } + else + { func_8025A6EC(COMUSIC_2B_DING_B, 28000); } } - - } else if (sp3C != 0) { - phi_s7 = TRUE; + } + else if (floor_is_valid_or_correct != FALSE) + { + is_correct_input = TRUE; } } } - if ((func_8038BF68() == 0) && (phi_s7 == 0) && (D_8038D720.unk8 == 0)) { - TTC_func_8038A5D8(arg0, 1); + if ((__code3E30_isCurrentSecretCheatCodeCharacter0() == FALSE) && (is_correct_input == FALSE) && (sMapState.banjoKazooieCodeEnteredState == 0)) + { + __code3E30_setLetterFloorTileState(letter_floor_tile, 1); } } -void func_8038AFC8(void){ - struct_ttc_3E30_3_s *iPtr; +static void __code3E30_resetCheatCodeProgress(void) +{ + CheatCode *iPtr; - for(iPtr = codesTable; iPtr->code != NULL; iPtr++){ - iPtr->unk6 = 0; + for (iPtr = sCheatCodes; iPtr->code != NULL; iPtr++) + { + iPtr->codeCharacterIdx = 0; } - if(volatileFlag_get(VOLATILE_FLAG_2_FF_IN_MINIGAME)) - strcpy(codesTable[0].code, "j4663n86pink"); //EIOOZAKOJNAB + if (volatileFlag_get(VOLATILE_FLAG_2_FF_IN_MINIGAME)) + strcpy(sCheatCodes[0].code, "j4663n86pink"); // EIOOZAKOJNAB else - strcpy(codesTable[0].code, "knip68n3664j"); //BANJOKAZOOIE + strcpy(sCheatCodes[0].code, "knip68n3664j"); // BANJOKAZOOIE - func_8038B5B4(); + __code3E30_resetSecretCheatCodeProgress(); } -void func_8038B04C(void){ - if(D_8038D720.model1){ - func_8038A258(0); - func_8030DA44(D_8038D720.sfxsourceIdx); - func_8030DA44(D_8038D720.unkA); +void code3E30_overlayRelease(void) +{ + if (sMapState.model1) + { + __code3E30_setupCheatCodeTimer(0); + func_8030DA44(sMapState.doorOpeningSfxSourceIdx); + func_8030DA44(sMapState.dullCannonShotSfxSourceId); } } -void func_8038B094(void){ +void code3E30_overlayInit(void) +{ void *sp2C; void *sp28; - if( map_get() == MAP_7_TTC_TREASURE_TROVE_COVE - && levelSpecificFlags_get(0x2) - ){ + if (map_get() == MAP_7_TTC_TREASURE_TROVE_COVE && levelSpecificFlags_get(0x2)) + { sp2C = func_8034C5AC(0x12C); - if(sp2C){ + if (sp2C) + { func_8034E71C(sp2C, -600, 0.0f); } } - D_8038D720.model1 = 0; - if(map_get() != MAP_A_TTC_SANDCASTLE){ - func_8038AB44(); + sMapState.model1 = 0; + if (map_get() != MAP_A_TTC_SANDCASTLE) + { + __code3E30_setsecretCheatCodeRelatedValue(); } - else{ + else + { sp2C = func_8034C5AC(0x131); sp28 = func_8034C5AC(0x12C); - if(levelSpecificFlags_get(5)){ + if (levelSpecificFlags_get(5)) + { func_8034E71C(sp2C, -500, 10.0f); func_80324E38(0.0f, 3); timed_setStaticCameraToNode(0.0f, 1); timed_exitStaticCamera(2.0f); func_80324E38(2.0f, 0); func_803228D8(); - timedFunc_set_3(2.0f, (GenFunction_3) func_802E4078, MAP_7_TTC_TREASURE_TROVE_COVE, 1, 0); + timedFunc_set_3(2.0f, (GenFunction_3)func_802E4078, MAP_7_TTC_TREASURE_TROVE_COVE, 1, 0); } - else if(levelSpecificFlags_get(2) || volatileFlag_get(VOLATILE_FLAG_2_FF_IN_MINIGAME)){ + else if (levelSpecificFlags_get(2) || volatileFlag_get(VOLATILE_FLAG_2_FF_IN_MINIGAME)) + { func_8034E71C(sp2C, -500, 0.0f); } - else{ + else + { func_8034E71C(sp28, -500, 0.0f); - }//L8038B1EC + } // L8038B1EC - D_8038D720.model1 = mapModel_getModel(0); - D_8038D720.model2 = mapModel_getModel(1); - D_8038D720.unk8 = 0; - D_8038D720.unk10 = 0; - D_8038D720.unkC = 0.0f; + sMapState.model1 = mapModel_getModel(0); + sMapState.model2 = mapModel_getModel(1); + sMapState.banjoKazooieCodeEnteredState = 0; + sMapState.timerState = 0; + sMapState.unkC = 0.0f; - D_8038D720.sfxsourceIdx = sfxsource_createSfxsourceAndReturnIndex(); - sfxsource_playSfxAtVolume(D_8038D720.sfxsourceIdx, 0.1f); - sfxsource_setSfxId(D_8038D720.sfxsourceIdx, SFX_3EC_CCW_DOOR_OPENING); - func_8030DD14(D_8038D720.sfxsourceIdx, 3); - sfxsource_setSampleRate(D_8038D720.sfxsourceIdx, 28000); + sMapState.doorOpeningSfxSourceIdx = sfxsource_createSfxsourceAndReturnIndex(); + sfxsource_playSfxAtVolume(sMapState.doorOpeningSfxSourceIdx, 0.1f); + sfxsource_setSfxId(sMapState.doorOpeningSfxSourceIdx, SFX_3EC_CCW_DOOR_OPENING); + func_8030DD14(sMapState.doorOpeningSfxSourceIdx, 3); + sfxsource_setSampleRate(sMapState.doorOpeningSfxSourceIdx, 28000); - D_8038D720.unkA = sfxsource_createSfxsourceAndReturnIndex(); - sfxsource_setSfxId(D_8038D720.unkA, SFX_3_DULL_CANNON_SHOT); - func_8030DD14(D_8038D720.unkA, 3); - sfxsource_setSampleRate(D_8038D720.unkA, 0x7fff); - func_8038A328(); - func_8038AFC8(); + sMapState.dullCannonShotSfxSourceId = sfxsource_createSfxsourceAndReturnIndex(); + sfxsource_setSfxId(sMapState.dullCannonShotSfxSourceId, SFX_3_DULL_CANNON_SHOT); + func_8030DD14(sMapState.dullCannonShotSfxSourceId, 3); + sfxsource_setSampleRate(sMapState.dullCannonShotSfxSourceId, 0x7fff); + __code3E30_initFloorTiles(); + __code3E30_resetCheatCodeProgress(); - if( jiggyscore_isCollected(JIGGY_10_TTC_SANDCASTLE) - && !volatileFlag_get(VOLATILE_FLAG_2_FF_IN_MINIGAME) - ){ - BKModel_transformMesh(D_8038D720.model2, 0x3C, func_8038A23C, 0); - D_8038D720.unk8 = 3; - }//L8038B2CC - func_8038AB44(); - func_8038B5B4(); - }//L8038B2E0 + if (jiggyscore_isCollected(JIGGY_10_TTC_SANDCASTLE) && !volatileFlag_get(VOLATILE_FLAG_2_FF_IN_MINIGAME)) + { + BKModel_transformMesh(sMapState.model2, 0x3C, __code3E30_transformMeshCallbackOverlayInit, 0); + sMapState.banjoKazooieCodeEnteredState = 3; + } // L8038B2CC + __code3E30_setsecretCheatCodeRelatedValue(); + __code3E30_resetSecretCheatCodeProgress(); + } // L8038B2E0 } -void func_8038B2F0(void) { - f32 sp2C[3]; - s32 mesh_id; - f32 sp24; +void code3E30_overlayUpdate(void) +{ + f32 player_position[3]; + s32 mesh_id_closest_to_player; + f32 time_delta; u8 temp_v0; - LetterFloorTile *temp_v0_3; + LetterFloorTile *floor_tile; - sp24 = time_getDelta(); - if (__sandcastleCodes_getNumberEntered() == 3) { + time_delta = time_getDelta(); + if (__code3E30_getNumberOfBannedCheatCodesEntered() == 3) + { func_802C5A3C(-1); } - if (D_8038D720.model1 != 0) { - func_8038AA2C(); - player_getPosition(sp2C); - if ((D_8038D720.unk10 == 0) && volatileFlag_get(VOLATILE_FLAG_2_FF_IN_MINIGAME) && volatileFlag_get(VOLATILE_FLAG_3)) { - func_8038A258(1); + if (sMapState.model1 != 0) + { + __code3E30_updateTimeDeltaSumForFloorTiles(); + player_getPosition(player_position); + if ((sMapState.timerState == 0) && volatileFlag_get(VOLATILE_FLAG_2_FF_IN_MINIGAME) && volatileFlag_get(VOLATILE_FLAG_3)) + { + __code3E30_setupCheatCodeTimer(1); } - if ((D_8038D720.unk10 == 1) && item_empty(ITEM_0_HOURGLASS_TIMER)) { - func_8038A258(2); - if (volatileFlag_get(VOLATILE_FLAG_2_FF_IN_MINIGAME)) { + // timer has run out + if ((sMapState.timerState == 1) && item_empty(ITEM_0_HOURGLASS_TIMER)) + { + __code3E30_setupCheatCodeTimer(2); + if (volatileFlag_get(VOLATILE_FLAG_2_FF_IN_MINIGAME)) + { volatileFlag_set(VOLATILE_FLAG_3, FALSE); volatileFlag_set(VOLATILE_FLAG_5_FF_MINIGAME_WON, FALSE); - } else { + } + else + { func_8028F66C(BS_INTR_F); } } - if ((D_8038D720.unk8 == 0) || (D_8038D720.unk8 == 3)) { - if( (levelSpecificFlags_get(2) || volatileFlag_get(VOLATILE_FLAG_3)) - && (player_getActiveHitbox(0) == HITBOX_1_BEAK_BUSTER) - && func_8028F20C() - ) { - mesh_id = func_8033F3C0(D_8038D720.model1, sp2C); - if (mesh_id != 0) { - temp_v0_3 = func_8038A2DC(mesh_id); - if ((temp_v0_3 != NULL) && ((temp_v0_3->unk3 == 2) || (D_8038D720.unk8 == 3))) { - func_8038AC48(temp_v0_3); - if ((D_8038D720.unk8 == 0) && (D_8038D720.unk10 == 0) && (volatileFlag_get(VOLATILE_FLAG_2_FF_IN_MINIGAME) == 0)) { - func_8038A258(1); + if ((sMapState.banjoKazooieCodeEnteredState == 0) || (sMapState.banjoKazooieCodeEnteredState == 3)) + { + if ((levelSpecificFlags_get(2) || volatileFlag_get(VOLATILE_FLAG_3)) && (player_getActiveHitbox(0) == HITBOX_1_BEAK_BUSTER) && func_8028F20C()) + { + mesh_id_closest_to_player = func_8033F3C0(sMapState.model1, player_position); + if (mesh_id_closest_to_player != 0) + { + floor_tile = __code_3E30_getFloorTileForMeshId(mesh_id_closest_to_player); + if ((floor_tile != NULL) && ((floor_tile->state == 2) || (sMapState.banjoKazooieCodeEnteredState == 3))) + { + __code3E30_checkFloorTileForRegularCheatCode(floor_tile); + if ((sMapState.banjoKazooieCodeEnteredState == 0) && (sMapState.timerState == 0) && (volatileFlag_get(VOLATILE_FLAG_2_FF_IN_MINIGAME) == 0)) + { + __code3E30_setupCheatCodeTimer(1); } } } } - } else if (D_8038D720.unk8 == 2) { - D_8038D720.unkC = (f32) (D_8038D720.unkC + sp24); - BKModel_transformMesh(D_8038D720.model2, 0x3C, func_8038A220, 0); - if (D_8038D720.unkC > 4.0f) { - D_8038D720.unk8 = 3; - func_8030E2C4(D_8038D720.unkA); - func_8030E394(D_8038D720.sfxsourceIdx); + } + else if (sMapState.banjoKazooieCodeEnteredState == 2) + { + sMapState.unkC = (f32)(sMapState.unkC + time_delta); + BKModel_transformMesh(sMapState.model2, 0x3C, __code3E30_transformMeshCallbackOverlayUpdate, 0); + if (sMapState.unkC > 4.0f) + { + sMapState.banjoKazooieCodeEnteredState = 3; + func_8030E2C4(sMapState.dullCannonShotSfxSourceId); + func_8030E394(sMapState.doorOpeningSfxSourceIdx); } } } } -bool func_8038B550(void){ - return NOT(D_8038D720.unk8 < 2); +// is used to determine whether to spawn the crab or not +bool code3E30_hasBanjoKazooieCodeBeenEntered(void) +{ + return NOT(sMapState.banjoKazooieCodeEnteredState < 2); } -s32 D_8038CAD4 = 0; -struct_ttc_3E30_4_s secretCodesTable[] = { - {"0mjnd", 0, 0x00, 00}, //CHEAT - {"i67knip674bbkjnkbjd62jj4d6iinkigd2dnkbj", 0, 0x01, 00}, //NOW BANJO WILL BE ABLE TO SEE IT ON NABNUTS TABLE - {"dm422j09jde6gbbkj59nkk4i4idmj0nrdn4i20nk4i", 0, 0x02, 00}, //THIS SECRET YOULL BE GRABBIN IN THE CAPTAINS CABIN - {"n14l2ddmjmngidjl5b661n2j09jd4idmjkndm9661", 0, 0x03, 00}, //AMIDST THE HAUNTED GLOOM A SECRET IN THE BATHROOM - {"nlj2j9dl6696rji274ljni04jid2j09jd27n4d4i24lj", 0, 0x04, 00}, //A DESERT DOOR OPENS WIDE ANCIENT SECRETS WAIT INSIDE - {"6gd6cdmj2jn4d942j2d69jajnb169j2j09jdr943j2", 0, 0x05, 00}, //OUT OF THE SEA IT RISES TO REVEAL MORE SECRET PRIZES - {"l6ide6g56nildjbbmj9nk6gddmj2j09jd4imj90jbbn9", 0, 0x06, 00}, //DONT YOU GO AND TELL HER ABOUT THE SECRET IN HER CELLAR - {"i67e6g0ni2jjni40j40j8je7m40me6g0nimnajc69c9jj", 0, 0x07, 00}, //NOW YOU CAN SEE A NICE ICE KEY WHICH YOU CAN HAVE FOR FREE - {"56945md6idm96g5mi6djl669d76", 0, 0x7A, 00}, //GO RIGHT ON THROUGH NOTE DOOR TWO - {"i6djl669dm9jj5jd4ic69c9jj", 0, 0x7B, 00}, //NOTE DOOR THREE GET IN FOR FREE - {"dn8jnd6g9dm96g5mi6djl669c6g9", 0, 0x7C, 00}, //TAKE A TOUR THROUGH NOTE DOOR FOUR - {"g2jdm420mjndi6djl669c4aj42kjnd", 0, 0x7D, 00}, //USE THIS CHEAT NOTE DOOR FIVE IS BEAT - {"dm42d94082g2jld66rjii6djl66924h", 0, 0x7E, 00}, //THIS TRICKS USED TO OPEN NOTE DOOR SIX - {"dmj2jajidmi6djl66942i67i6169j", 0, 0x7F, 00}, //THE SEVENTH NOTE DOOR IS NOW NO MORE - {"e6g0ni5jd7jdcjjdi670bni8j92p455e42061rbjdj", 0, 0x80, 00}, //YOU CAN GET WET FEET NOW CLANKERS JIGGY IS COMPLETE - {"dmjp455e2cgbb6cce6g2d61r4id6l4i5ekgkkbj5b66r27n1r", 0, 0x81, 00}, //THE JIGGYS FULL OFF YOU STOMP IN TO DINGY BUBBLEGLOOP SWAMP - {"dmjp455e2l6ij266cce6g564id6c9jj3jj3erjn8nil4d22i67", 0, 0x82, 00}, //THE JIGGYS DONE SO OFF YOU GO INTO FREEZEEZY PEAK AND ITS SNOW - {"56k42p455e42i67l6ijd9j86i4inil5jd261j2gi", 0, 0x83, 00}, //GOBIS JIGGY IS NOW DONE TREK ON IN AND GET SOME SUN - {"dmjp455e2i671nlj7m6bj4id6dmj1ni246ie6g0ni2d96bb", 0, 0x84, 00}, //THE JIGGYS NOW MADE WHOLE INTO THE MANSION YOU CAN STROLL - {"dmjp455e2l6ij26dn8jnd94r6id6dmj9g2dekg08jd2m4r", 0, 0x85, 00}, //THE JIGGYS DONE SO TAKE A TRIP ON TO THE RUSTY BUCKET SHIP - {"0b4080b608766l42b6d26ccgi566i4idmjp455e2l6ij", 0, 0x86, 00}, //CLICK CLOCK WOOD IS LOTS OF FUN GO ON IN THE JIGGYS DONE - {"b6d26c56j274dm1nieknip62", 0, 0x87, 00}, //LOTS OF GOES WITH MANY BANJOS - {"knip6kj52c69rbjide6cj552", 0, 0x88, 00}, //BANJO BEGS FOR PLENTY OF EGGS - {"i67e6g0nicbem45m4idmj28e", 0, 0x89, 00}, //NOW YOU CAN FLY HIGH IN THE SKY - {"n56blji5b67d6r96dj0dknip6", 0, 0x8A, 00}, //A GOLDEN GLOW TO PROTECT BANJO - {"k6dmr4rj2n9jdmj9jd60bni8j92bn49", 0, 0x91, 00}, //BOTH PIPES ARE THERE TO CLANKERS LAIR - {"e6gbb0jn2jd6594rj7mjigr56j2nr4rj", 0, 0x92, 00}, //YOULL CEASE TO GRIPE WHEN UP GOES A PIPE - {"dmj9j2i67mj9jlni8j9dmni4i74dm0bni8j9", 0, 0x93, 00}, //THERES NOWHERE DANKER THAN IN WITH CLANKER - {"e6gbbkjn1n3jli67dmj27n1rr400e594bbj429n42jl", 0, 0x94, 00}, //YOULL BE AMAZED NOW THE SWAMP PICCY GRILLE IS RAISED - {"l6idlj2rn49dmjd9jjp455er6l4g142i67dmj9j", 0, 0x95, 00}, //DONT DESPAIR THE TREE JIGGY PODIUM IS NOW THERE - {"2mj2nig5beknd26bjd29j16ajmj9594bbjnilmnd", 0, 0x96, 00}, //SHES AN UGLY BAT SO LETS REMOVE HER GRILLE AND HAT - {"4d2e6g9bg08elnen2dmj40jknbb1jbd2n7ne", 0, 0x97, 00}, //ITS YOUR LUCKY DAY AS THE ICE BALL MELTS AWAY - {"i674id6dmj27n1re6g0ni2d61r", 0, 0x98, 00}, //NOW IN TO THE SWAMP YOU CAN STOMP - {"dmje0ng2jd96gkbjkgdi67dmje9j9gkkbj", 0, 0x99, 00}, //THEY CAUSE TROUBLE BUT NOW THEYRE RUBBLE - {"e6gbbkj5bnld62jjdmj2m608pg1rrnl", 0, 0x9A, 00}, //YOULL BE GLAD TO SEE THE SHOCK JUMP PAD - {"dm42061j24imniled66rji261j7mj9j2nile", 0, 0x9B, 00}, //THIS COMES IN HANDY TO OPEN SOMEWHERE SANDY - {"7jk22d6re6g9rbne26dn8jdmj1n7ne", 0, 0x9C, 00}, //WEBS STOP YOUR PLAY SO TAKE THEM AWAY - {"59gide74bb09ei67e6gaj21n2mjlmj9jej", 0, 0x9D, 00}, //GRUNTY WILL CRY NOW YOUVE SMASHED HER EYE - {"e6g76idkj2nli67e6g0nig2jdmjcbernl", 0, 0x9E, 00}, //YOU WONT BE SAD NOW YOU CAN USE THE FLY PAD - {"i67e6g0ni56nild9gl5j4idmj2i67", 0, 0x9F, 00}, //NOW YOU CAN GO AND TRUDGE IN THE SNOW - {"dmj1ni246i6c5m62d2n9ji67e6g9m62d2", 0, 0xA0, 00}, //THE MANSION OF GHOSTS ARE NOW YOUR HOSTS - {"e6g76idmnajd67n4di67dmj9j2i609erd5ndj", 0, 0xA1, 00}, //YOU WONT HAVE TO WAIT NOW THERES NO CRYPT GATE - {"dm422m6gbl5jd94l6cdmj09erd06cc4ib4l", 0, 0xA2, 00}, //THIS SHOULD GET RID OF THE CRYPT COFFIN LID - {"gre6g5674dm6gdnm4d0mgrd6dmj7ndj9bjajb274d0m", 0, 0xA3, 00}, //UP YOU GO WITHOUT A HITCH UP TO THE WATER LEVEL SWITCH - {"7mei6ddn8jnd94r4i24lj59gide29g2de2m4r", 0, 0xA4, 00}, //WHY NOT TAKE A TRIP INSIDE GRUNTYS RUSTY SHIP - {"dmj594bbj56j2k661d6dmj2m4rr40dg9j9661", 0, 0xA5, 00}, //THE GRILLE GOES BOOM TO THE SHIP PICTURE ROOM - {"6i0j4d2m6ijkgddmjb6i5dgiijb594bbj4256ij", 0, 0xA6, 00}, //ONCE IT SHONE BUT THE LONG TUNNEL GRILLE IS GONE - {"dm426ij2566ln2e6g0nijidj9dmj766l", 0, 0xA7, 00}, //THIS ONES GOOD AS YOU CAN ENTER THE WOOD - {"nijij95ekn9d65jde6gcn9", 0, 0xA8, 00}, //AN ENERGY BAR TO GET YOU FAR - {"l6idkjnlg1k6562jj1g1k6", 0, 0xA9, 00}, //DONT BE A DUMBO GO SEE MUMBO - {"54ajdmjkjn9b6d26cn49", 0, 0xAA, 00}, //GIVE THE BEAR LOTS OF AIR - 0 +static s32 sThirdForbiddenSecretCheatCodeIndex = NULL; + +#define VOLATILE_FLAG_CHEAT_OFFSET 0x14 + +static SecretCheatCode sSecretsCheatCodes[] = { + {"0mjnd", 0, 0x00, 00}, // CHEAT + {"i67knip674bbkjnkbjd62jj4d6iinkigd2dnkbj", 0, 0x01, 00}, // NOW BANJO WILL BE ABLE TO SEE IT ON NABNUTS TABLE + {"dm422j09jde6gbbkj59nkk4i4idmj0nrdn4i20nk4i", 0, 0x02, 00}, // THIS SECRET YOULL BE GRABBIN IN THE CAPTAINS CABIN + {"n14l2ddmjmngidjl5b661n2j09jd4idmjkndm9661", 0, 0x03, 00}, // AMIDST THE HAUNTED GLOOM A SECRET IN THE BATHROOM + {"nlj2j9dl6696rji274ljni04jid2j09jd27n4d4i24lj", 0, 0x04, 00}, // A DESERT DOOR OPENS WIDE ANCIENT SECRETS WAIT INSIDE + {"6gd6cdmj2jn4d942j2d69jajnb169j2j09jdr943j2", 0, 0x05, 00}, // OUT OF THE SEA IT RISES TO REVEAL MORE SECRET PRIZES + {"l6ide6g56nildjbbmj9nk6gddmj2j09jd4imj90jbbn9", 0, 0x06, 00}, // DONT YOU GO AND TELL HER ABOUT THE SECRET IN HER CELLAR + {"i67e6g0ni2jjni40j40j8je7m40me6g0nimnajc69c9jj", 0, 0x07, 00}, // NOW YOU CAN SEE A NICE ICE KEY WHICH YOU CAN HAVE FOR FREE + {"56945md6idm96g5mi6djl669d76", 0, VOLATILE_FLAG_66_SANDCASTLE_OPEN_DOOR_TWO + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // GO RIGHT ON THROUGH NOTE DOOR TWO + {"i6djl669dm9jj5jd4ic69c9jj", 0, VOLATILE_FLAG_67_SANDCASTLE_OPEN_DOOR_THREE + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // NOTE DOOR THREE GET IN FOR FREE + {"dn8jnd6g9dm96g5mi6djl669c6g9", 0, VOLATILE_FLAG_68_SANDCASTLE_OPEN_DOOR_FOUR + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // TAKE A TOUR THROUGH NOTE DOOR FOUR + {"g2jdm420mjndi6djl669c4aj42kjnd", 0, VOLATILE_FLAG_69_SANDCASTLE_OPEN_DOOR_FIVE + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // USE THIS CHEAT NOTE DOOR FIVE IS BEAT + {"dm42d94082g2jld66rjii6djl66924h", 0, VOLATILE_FLAG_6A_SANDCASTLE_OPEN_DOOR_SIX + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // THIS TRICKS USED TO OPEN NOTE DOOR SIX + {"dmj2jajidmi6djl66942i67i6169j", 0, VOLATILE_FLAG_6B_SANDCASTLE_OPEN_DOOR_SEVEN + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // THE SEVENTH NOTE DOOR IS NOW NO MORE + {"e6g0ni5jd7jdcjjdi670bni8j92p455e42061rbjdj", 0, VOLATILE_FLAG_6C_SANDCASTLE_PUZZLE_COMPLETE_CC + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // YOU CAN GET WET FEET NOW CLANKERS JIGGY IS COMPLETE + {"dmjp455e2cgbb6cce6g2d61r4id6l4i5ekgkkbj5b66r27n1r", 0, VOLATILE_FLAG_6D_SANDCASTLE_PUZZLE_COMPLETE_BGS + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // THE JIGGYS FULL OFF YOU STOMP IN TO DINGY BUBBLEGLOOP SWAMP + {"dmjp455e2l6ij266cce6g564id6c9jj3jj3erjn8nil4d22i67", 0, VOLATILE_FLAG_6E_SANDCASTLE_PUZZLE_COMPLETE_FP + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // THE JIGGYS DONE SO OFF YOU GO INTO FREEZEEZY PEAK AND ITS SNOW + {"56k42p455e42i67l6ijd9j86i4inil5jd261j2gi", 0, VOLATILE_FLAG_6F_SANDCASTLE_PUZZLE_COMPLETE_GV + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // GOBIS JIGGY IS NOW DONE TREK ON IN AND GET SOME SUN + {"dmjp455e2i671nlj7m6bj4id6dmj1ni246ie6g0ni2d96bb", 0, VOLATILE_FLAG_70_SANDCASTLE_PUZZLE_COMPLETE_MMM + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // THE JIGGYS NOW MADE WHOLE INTO THE MANSION YOU CAN STROLL + {"dmjp455e2l6ij26dn8jnd94r6id6dmj9g2dekg08jd2m4r", 0, VOLATILE_FLAG_71_SANDCASTLE_PUZZLE_COMPLETE_RBB + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // THE JIGGYS DONE SO TAKE A TRIP ON TO THE RUSTY BUCKET SHIP + {"0b4080b608766l42b6d26ccgi566i4idmjp455e2l6ij", 0, VOLATILE_FLAG_72_SANDCASTLE_PUZZLE_COMPLETE_CCC + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // CLICK CLOCK WOOD IS LOTS OF FUN GO ON IN THE JIGGYS DONE + {"b6d26c56j274dm1nieknip62", 0, VOLATILE_FLAG_73_SANDCASTLE_INFINITE_LIVES + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // LOTS OF GOES WITH MANY BANJOS + {"knip6kj52c69rbjide6cj552", 0, VOLATILE_FLAG_74_SANDCASTLE_INFINITE_EGGS + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // BANJO BEGS FOR PLENTY OF EGGS + {"i67e6g0nicbem45m4idmj28e", 0, VOLATILE_FLAG_75_SANDCASTLE_INFINITE_RED_FEATHERS + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // NOW YOU CAN FLY HIGH IN THE SKY + {"n56blji5b67d6r96dj0dknip6", 0, VOLATILE_FLAG_76_SANDCASTLE_INFINITE_GOLD_FEATHERS + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // A GOLDEN GLOW TO PROTECT BANJO + {"k6dmr4rj2n9jdmj9jd60bni8j92bn49", 0, VOLATILE_FLAG_7D_SANDCASTLE_RAISE_PIPES_TO_CC + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // BOTH PIPES ARE THERE TO CLANKERS LAIR + {"e6gbb0jn2jd6594rj7mjigr56j2nr4rj", 0, VOLATILE_FLAG_7E_SANDCASTLE_RAISE_PIPE_TO_BRENTILDA + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // YOULL CEASE TO GRIPE WHEN UP GOES A PIPE + {"dmj9j2i67mj9jlni8j9dmni4i74dm0bni8j9", 0, VOLATILE_FLAG_7F_SANDCASTLE_OPEN_CC + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // THERES NOWHERE DANKER THAN IN WITH CLANKER + {"e6gbbkjn1n3jli67dmj27n1rr400e594bbj429n42jl", 0, VOLATILE_FLAG_80_SANDCASTLE_REMOVE_GRILL_NEAR_BGS_JIGGY + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // YOULL BE AMAZED NOW THE SWAMP PICCY GRILLE IS RAISED + {"l6idlj2rn49dmjd9jjp455er6l4g142i67dmj9j", 0, VOLATILE_FLAG_81_SANDCASTLE_CCC_JIGGY_PODIUM + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // DONT DESPAIR THE TREE JIGGY PODIUM IS NOW THERE + {"2mj2nig5beknd26bjd29j16ajmj9594bbjnilmnd", 0, VOLATILE_FLAG_82_SANDCASTLE_REMOVE_GRILL_AND_HAT_FROM_STATUE + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // SHES AN UGLY BAT SO LETS REMOVE HER GRILLE AND HAT + {"4d2e6g9bg08elnen2dmj40jknbb1jbd2n7ne", 0, VOLATILE_FLAG_83_SANDCASTLE_REMOVE_ICE + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // ITS YOUR LUCKY DAY AS THE ICE BALL MELTS AWAY + {"i674id6dmj27n1re6g0ni2d61r", 0, VOLATILE_FLAG_84_SANDCASTLE_OPEN_BGS + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // NOW IN TO THE SWAMP YOU CAN STOMP + {"dmje0ng2jd96gkbjkgdi67dmje9j9gkkbj", 0, VOLATILE_FLAG_85_SANDCASTLE_REMOVE_BREAKABLE_WALLS + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // THEY CAUSE TROUBLE BUT NOW THEYRE RUBBLE + {"e6gbbkj5bnld62jjdmj2m608pg1rrnl", 0, VOLATILE_FLAG_86_SANDCASTLE_SHOCKSPRING_JUMP_UNLOCKED + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // YOULL BE GLAD TO SEE THE SHOCK JUMP PAD + {"dm42061j24imniled66rji261j7mj9j2nile", 0, VOLATILE_FLAG_87_SANDCASTLE_OPEN_GV + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // THIS COMES IN HANDY TO OPEN SOMEWHERE SANDY + {"7jk22d6re6g9rbne26dn8jdmj1n7ne", 0, VOLATILE_FLAG_88_SANDCASTLE_REMOVE_WEBS + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // WEBS STOP YOUR PLAY SO TAKE THEM AWAY + {"59gide74bb09ei67e6gaj21n2mjlmj9jej", 0, VOLATILE_FLAG_89_SANDCASTLE_REMOVE_GLASS_EYE + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // GRUNTY WILL CRY NOW YOUVE SMASHED HER EYE + {"e6g76idkj2nli67e6g0nig2jdmjcbernl", 0, VOLATILE_FLAG_8A_SANDCASTLE_FLIGHT_UNLOCKED + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // YOU WONT BE SAD NOW YOU CAN USE THE FLY PAD + {"i67e6g0ni56nild9gl5j4idmj2i67", 0, VOLATILE_FLAG_8B_SANDCASTLE_OPEN_FP + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // NOW YOU CAN GO AND TRUDGE IN THE SNOW + {"dmj1ni246i6c5m62d2n9ji67e6g9m62d2", 0, VOLATILE_FLAG_8C_SANDCASTLE_OPEN_MMM + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // THE MANSION OF GHOSTS ARE NOW YOUR HOSTS + {"e6g76idmnajd67n4di67dmj9j2i609erd5ndj", 0, VOLATILE_FLAG_8D_SANDCASTLE_REMOVE_CRYPT_GATE + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // YOU WONT HAVE TO WAIT NOW THERES NO CRYPT GATE + {"dm422m6gbl5jd94l6cdmj09erd06cc4ib4l", 0, VOLATILE_FLAG_8E_SANDCASTLE_REMOVE_CRYPT_COFFIN_LID + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // THIS SHOULD GET RID OF THE CRYPT COFFIN LID + {"gre6g5674dm6gdnm4d0mgrd6dmj7ndj9bjajb274d0m", 0, VOLATILE_FLAG_8F_SANDCASTLE_REMOVE_GRATE_NEAR_WATER_SWITCH + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // UP YOU GO WITHOUT A HITCH UP TO THE WATER LEVEL SWITCH + {"7mei6ddn8jnd94r4i24lj59gide29g2de2m4r", 0, VOLATILE_FLAG_90_SANDCASTLE_OPEN_RBB + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // WHY NOT TAKE A TRIP INSIDE GRUNTYS RUSTY SHIP + {"dmj594bbj56j2k661d6dmj2m4rr40dg9j9661", 0, VOLATILE_FLAG_91_SANDCASTLE_REMOVE_GRILL_NEAR_RBB_JIGGY + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // THE GRILLE GOES BOOM TO THE SHIP PICTURE ROOM + {"6i0j4d2m6ijkgddmjb6i5dgiijb594bbj4256ij", 0, VOLATILE_FLAG_92_SANDCASTLE_REMOVE_TUNNEL_GRILL_NEAR_RBB_JIGGY + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // ONCE IT SHONE BUT THE LONG TUNNEL GRILLE IS GONE + {"dm426ij2566ln2e6g0nijidj9dmj766l", 0, VOLATILE_FLAG_93_SANDCASTLE_OPEN_CCW + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // THIS ONES GOOD AS YOU CAN ENTER THE WOOD + {"nijij95ekn9d65jde6gcn9", 0, VOLATILE_FLAG_94_SANDCASTLE_INFINITE_HEALTH + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // AN ENERGY BAR TO GET YOU FAR + {"l6idkjnlg1k6562jj1g1k6", 0, VOLATILE_FLAG_95_SANDCASTLE_INFINTE_MUMBO_TOKENS + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // DONT BE A DUMBO GO SEE MUMBO + {"54ajdmjkjn9b6d26cn49", 0, VOLATILE_FLAG_96_SANDCASTLE_INFINITE_AIR + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // GIVE THE BEAR LOTS OF AIR + NULL }; -u8 D_8038CC78 = 0; -IdRange bannedCheatCodesIdRanges[] = { - {0x7A, 0x7F}, - {0x80, 0x86}, - {0x91, 0xA7}, - 0 +static u8 sLastFloorTileHitCorret = 0; // 0 = "initial", 1 = incorrect, 2 = correct +static BannedCheatCodeRange sBannedCheatCodeRanges[4] = { + {VOLATILE_FLAG_66_SANDCASTLE_OPEN_DOOR_TWO + VOLATILE_FLAG_CHEAT_OFFSET, VOLATILE_FLAG_6B_SANDCASTLE_OPEN_DOOR_SEVEN + VOLATILE_FLAG_CHEAT_OFFSET}, + {VOLATILE_FLAG_6C_SANDCASTLE_PUZZLE_COMPLETE_CC + VOLATILE_FLAG_CHEAT_OFFSET, VOLATILE_FLAG_72_SANDCASTLE_PUZZLE_COMPLETE_CCC + VOLATILE_FLAG_CHEAT_OFFSET}, + {VOLATILE_FLAG_7D_SANDCASTLE_RAISE_PIPES_TO_CC + VOLATILE_FLAG_CHEAT_OFFSET, VOLATILE_FLAG_93_SANDCASTLE_OPEN_CCW + VOLATILE_FLAG_CHEAT_OFFSET}, + NULL }; -void func_8038B564(s32 secretCodeIndex, s32 codeId, enum map_e map_id, s32 arg3, s32 arg4){ - if(codeId == secretCodesTable[secretCodeIndex].id){ +// shows the unlocked stop n swap item in a cutscene, arg3/arg4 might describe state / camera angle or something +static void __code3E30_showUnlockedSnSCode(s32 secret_cheat_code_index, s32 codeId, enum map_e map_id, s32 arg3, s32 arg4) +{ + if (codeId == sSecretsCheatCodes[secret_cheat_code_index].id) + { func_802D6310(1.0f, map_id, arg3, arg4, 0); } } -void func_8038B5B4(void) { - struct_ttc_3E30_4_s *i_ptr; +static void __code3E30_resetSecretCheatCodeProgress(void) +{ + SecretCheatCode *i_ptr; - for(i_ptr = &secretCodesTable[0]; i_ptr->code != NULL; i_ptr++){ - i_ptr->unk4 = 0; + for (i_ptr = &sSecretsCheatCodes[0]; i_ptr->code != NULL; i_ptr++) + { + i_ptr->codeCharacterIdx = 0; } - D_8038CC78 = 0; - func_8038AB44(); + sLastFloorTileHitCorret = 0; + __code3E30_setsecretCheatCodeRelatedValue(); } -u32 func_8038B600(void) { - s32 addr = (s32)&secretCodesTable; +static u32 __code3E30_scrambleAddressForSecretCheatCode() +{ + s32 addr = (s32)&sSecretsCheatCodes; s32 scrambled; - struct_ttc_3E30_4_s * i_ptr; + SecretCheatCode *i_ptr; u32 var_a3; u32 var_v0; @@ -596,15 +745,18 @@ u32 func_8038B600(void) { scrambled += (addr & 0xFF) << 8; scrambled = addr ^ scrambled; - addr = (((scrambled & 0xFF000000) >> 8) + ((scrambled << 8) & 0xFF00)) ^ scrambled; + addr = (((scrambled & 0xFF000000) >> 8) + ((scrambled << 8) & 0xFF00)) ^ scrambled; - i_ptr = (struct_ttc_3E30_4_s *)addr; + i_ptr = (SecretCheatCode *)addr; var_a3 = 0x03148C41; - while(i_ptr->code != NULL){ - for(var_v0 = 0; var_v0 < i_ptr->unk4; var_v0++){ + while (i_ptr->code != NULL) + { + for (var_v0 = 0; var_v0 < i_ptr->codeCharacterIdx; var_v0++) + { var_a3 = ((i_ptr->code[var_v0] ^ var_a3) << 5) + (var_a3 >> 0x18); } - for(var_v0 = var_v0; i_ptr->code[var_v0] != 0; var_v0++){ + for (var_v0 = var_v0; i_ptr->code[var_v0] != 0; var_v0++) + { var_a3 = (i_ptr->code[var_v0] << (var_v0 & 0xF)) ^ (var_a3 + 0xD); } i_ptr++; @@ -612,193 +764,311 @@ u32 func_8038B600(void) { return var_a3; } -void TTC_func_8038B6D4(s32 arg0, s32 secretCodeIndex, s32 arg2, enum file_progress_e prog_id, s32 prog_val, s32 prog_bit_size, enum file_progress_e arg6){ - if( ((arg2 + 20 == secretCodesTable[secretCodeIndex].id) && volatileFlag_get(arg2)) - || arg0 == 3 - ){ +static void __code3E30_setFileProgressForSecretCheatCode( + s32 always_0, + s32 secret_cheat_code_index, + enum volatile_flags_e volatile_flag, + enum file_progress_e prog_id, + s32 prog_val, + s32 prog_bit_size, + enum file_progress_e file_progress_to_mark_true +) +{ + if ( + ((volatile_flag + VOLATILE_FLAG_CHEAT_OFFSET == sSecretsCheatCodes[secret_cheat_code_index].id) && volatileFlag_get(volatile_flag)) + // This can never be true as always_0 is always 0 + || always_0 == 3 + ) { fileProgressFlag_setN(prog_id, prog_val, prog_bit_size); - if(arg6){ - fileProgressFlag_set(arg6, TRUE); + if (file_progress_to_mark_true) + { + fileProgressFlag_set(file_progress_to_mark_true, TRUE); } } } -void __sandcastleCodes_setNumberEntered(s32 arg0){ +static void __code3E30_setNumberOfBannedCheatcodesEntered(s32 arg0) +{ fileProgressFlag_setN(FILEPROG_FD_BANNED_CHEATCODES_ENTERED, arg0, 2); } -s32 __sandcastleCodes_getNumberEntered(void){ +static s32 __code3E30_getNumberOfBannedCheatCodesEntered() +{ return fileProgressFlag_getN(FILEPROG_FD_BANNED_CHEATCODES_ENTERED, 2); } -void func_8038B79C(s32 arg0, s32 arg1, s32 arg2, enum item_e item_id, s32 item_diff, s32 item_val) { - if (((arg2 + 0x14) == secretCodesTable[arg1].id) || (arg0 == 1)) { - if (item_diff != 0) { - item_adjustByDiffWithHud(item_id, item_diff); +static void __code3E30_setItemForSecretCheatCode(s32 always_0, s32 secret_cheat_code_index, enum volatile_flags_e volatile_flag, enum item_e item_id, s32 always_0_2, s32 item_val) +{ + if (((volatile_flag + VOLATILE_FLAG_CHEAT_OFFSET) == sSecretsCheatCodes[secret_cheat_code_index].id) || (always_0 == 1)) + { + if (always_0_2 != 0) + { + item_adjustByDiffWithHud(item_id, always_0_2); return; } item_set(item_id, item_val); } } -void func_8038B800(s32 secretCodeIndex) { - struct_ttc_3E30_4_s *secretCode; +static void __code3E30_checkSecretCheatCodeIndex(s32 secret_cheat_code_index) +{ + SecretCheatCode *secret_cheat_code; enum volatile_flags_e volaflag_cheat_id; - secretCode = &secretCodesTable[secretCodeIndex]; - volaflag_cheat_id = secretCode->id - 0x14; - sns_set_item_and_update_payload(secretCode->id, 1, 1); - func_8038B564(secretCodeIndex, 1, MAP_61_CCW_WINTER_NABNUTS_HOUSE, 0x83, 0x1B); - func_8038B564(secretCodeIndex, 2, MAP_3F_RBB_CAPTAINS_CABIN, 0x84, 0x1C); - func_8038B564(secretCodeIndex, 3, MAP_2C_MMM_BATHROOM, 0x85, 0x1D); - func_8038B564(secretCodeIndex, 4, MAP_12_GV_GOBIS_VALLEY, 0x86, 0x1E); - func_8038B564(secretCodeIndex, 5, MAP_7_TTC_TREASURE_TROVE_COVE, 0x87, 0x1F); - func_8038B564(secretCodeIndex, 6, MAP_1D_MMM_CELLAR, 0x88, 0x20); - func_8038B564(secretCodeIndex, 7, MAP_7F_FP_WOZZAS_CAVE, 0x89, 0x21); - if (secretCode->id >= 0x14) { + secret_cheat_code = &sSecretsCheatCodes[secret_cheat_code_index]; + volaflag_cheat_id = secret_cheat_code->id - VOLATILE_FLAG_CHEAT_OFFSET; + sns_set_item_and_update_payload(secret_cheat_code->id, 1, 1); + __code3E30_showUnlockedSnSCode(secret_cheat_code_index, 0x01, MAP_61_CCW_WINTER_NABNUTS_HOUSE, 0x83, 0x1B); + __code3E30_showUnlockedSnSCode(secret_cheat_code_index, 0x02, MAP_3F_RBB_CAPTAINS_CABIN, 0x84, 0x1C); + __code3E30_showUnlockedSnSCode(secret_cheat_code_index, 0x03, MAP_2C_MMM_BATHROOM, 0x85, 0x1D); + __code3E30_showUnlockedSnSCode(secret_cheat_code_index, 0x04, MAP_12_GV_GOBIS_VALLEY, 0x86, 0x1E); + __code3E30_showUnlockedSnSCode(secret_cheat_code_index, 0x05, MAP_7_TTC_TREASURE_TROVE_COVE, 0x87, 0x1F); + __code3E30_showUnlockedSnSCode(secret_cheat_code_index, 0x06, MAP_1D_MMM_CELLAR, 0x88, 0x20); + __code3E30_showUnlockedSnSCode(secret_cheat_code_index, 0x07, MAP_7F_FP_WOZZAS_CAVE, 0x89, 0x21); + if (secret_cheat_code->id >= VOLATILE_FLAG_CHEAT_OFFSET) + { func_8030E58C(SFX_2B_BULL_MOO_1, 1.5f); volatileFlag_set(VOLATILE_FLAG_65_CHEAT_ENTERED, 1); volatileFlag_set(volaflag_cheat_id, 1); } - TTC_func_8038B6D4(0, secretCodeIndex, 0x6C, FILEPROG_60_CC_PUZZLE_PIECES_PLACED, 5, 3, FILEPROG_33_CC_OPEN); - TTC_func_8038B6D4(0, secretCodeIndex, 0x6D, FILEPROG_63_BGS_PUZZLE_PIECES_PLACED, 7, 3, FILEPROG_34_BGS_OPEN); - TTC_func_8038B6D4(0, secretCodeIndex, 0x6E, FILEPROG_66_FP_PUZZLE_PIECES_PLACED, 8, 4, FILEPROG_35_FP_OPEN); - TTC_func_8038B6D4(0, secretCodeIndex, 0x6F, FILEPROG_6A_GV_PUZZLE_PIECES_PLACED, 9, 4, FILEPROG_36_GV_OPEN); - TTC_func_8038B6D4(0, secretCodeIndex, 0x70, FILEPROG_6E_MMM_PUZZLE_PIECES_PLACED, 10, 4, FILEPROG_37_MMM_OPEN); - TTC_func_8038B6D4(0, secretCodeIndex, 0x71, FILEPROG_72_RBB_PUZZLE_PIECES_PLACED, 0xC, 4, FILEPROG_38_RBB_OPEN); - TTC_func_8038B6D4(0, secretCodeIndex, 0x72, FILEPROG_76_CCW_PUZZLE_PIECES_PLACED, 0xF, 4, FILEPROG_39_CCW_OPEN); - func_8038B79C(0, secretCodeIndex, 0x94, ITEM_15_HEALTH_TOTAL, 0, 8); - func_8038B79C(0, secretCodeIndex, 0x77, ITEM_14_HEALTH, 0, item_getCount(ITEM_15_HEALTH_TOTAL)); - func_8038B79C(0, secretCodeIndex, 0x95, ITEM_1C_MUMBO_TOKEN, 0, 99); - if (volaflag_cheat_id == VOLATILE_FLAG_81_SANDCASTLE_CCC_JIGGY_PODIUM) { + + __code3E30_setFileProgressForSecretCheatCode( + 0, + secret_cheat_code_index, + VOLATILE_FLAG_6C_SANDCASTLE_PUZZLE_COMPLETE_CC, + FILEPROG_60_CC_PUZZLE_PIECES_PLACED, + 5, + 3, + FILEPROG_33_CC_OPEN + ); + __code3E30_setFileProgressForSecretCheatCode( + 0, + secret_cheat_code_index, + VOLATILE_FLAG_6D_SANDCASTLE_PUZZLE_COMPLETE_BGS, + FILEPROG_63_BGS_PUZZLE_PIECES_PLACED, + 7, + 3, + FILEPROG_34_BGS_OPEN + ); + __code3E30_setFileProgressForSecretCheatCode( + 0, + secret_cheat_code_index, + VOLATILE_FLAG_6E_SANDCASTLE_PUZZLE_COMPLETE_FP, + FILEPROG_66_FP_PUZZLE_PIECES_PLACED, + 8, + 4, + FILEPROG_35_FP_OPEN + ); + __code3E30_setFileProgressForSecretCheatCode( + 0, + secret_cheat_code_index, + VOLATILE_FLAG_6F_SANDCASTLE_PUZZLE_COMPLETE_GV, + FILEPROG_6A_GV_PUZZLE_PIECES_PLACED, + 9, + 4, + FILEPROG_36_GV_OPEN + ); + __code3E30_setFileProgressForSecretCheatCode( + 0, + secret_cheat_code_index, + VOLATILE_FLAG_70_SANDCASTLE_PUZZLE_COMPLETE_MMM, + FILEPROG_6E_MMM_PUZZLE_PIECES_PLACED, + 10, + 4, + FILEPROG_37_MMM_OPEN + ); + __code3E30_setFileProgressForSecretCheatCode( + 0, + secret_cheat_code_index, + VOLATILE_FLAG_71_SANDCASTLE_PUZZLE_COMPLETE_RBB, + FILEPROG_72_RBB_PUZZLE_PIECES_PLACED, + 0xC, + 4, + FILEPROG_38_RBB_OPEN + ); + __code3E30_setFileProgressForSecretCheatCode( + 0, + secret_cheat_code_index, + VOLATILE_FLAG_72_SANDCASTLE_PUZZLE_COMPLETE_CCC, + FILEPROG_76_CCW_PUZZLE_PIECES_PLACED, + 0xF, + 4, + FILEPROG_39_CCW_OPEN + ); + __code3E30_setItemForSecretCheatCode(0, secret_cheat_code_index, VOLATILE_FLAG_94_SANDCASTLE_INFINITE_HEALTH, ITEM_15_HEALTH_TOTAL, 0, 8); + __code3E30_setItemForSecretCheatCode(0, secret_cheat_code_index, VOLATILE_FLAG_77_SANDCASTLE_SET_HEALTH_TO_MAX, ITEM_14_HEALTH, 0, item_getCount(ITEM_15_HEALTH_TOTAL)); + __code3E30_setItemForSecretCheatCode(0, secret_cheat_code_index, VOLATILE_FLAG_95_SANDCASTLE_INFINTE_MUMBO_TOKENS, ITEM_1C_MUMBO_TOKEN, 0, 99); + if (volaflag_cheat_id == VOLATILE_FLAG_81_SANDCASTLE_CCC_JIGGY_PODIUM) + { fileProgressFlag_set(FILEPROG_53_CCW_PUZZLE_PODIUM_SWITCH_PRESSED, 1); fileProgressFlag_set(FILEPROG_54_CCW_PUZZLE_PODIUM_ACTIVE, 1); } - func_8038B5B4(); + __code3E30_resetSecretCheatCodeProgress(); } -void __sandcastleCodes_eraseGameDialogCallback(ActorMarker *caller, enum asset_e text_id, s32 confirmed) { - if (confirmed == 1) { - __sandcastleCodes_setNumberEntered(3); - func_8038B800(D_8038CAD4); - gcdialog_showText(ASSET_FBF_TEXT_UNKNOWN, 0xC, NULL, NULL, NULL, NULL); +static void __code3E30_eraseGameplayDialogCallback(ActorMarker *caller, enum asset_e text_id, s32 confirmed) +{ + if (confirmed == 1) + { + __code3E30_setNumberOfBannedCheatcodesEntered(3); + __code3E30_checkSecretCheatCodeIndex(sThirdForbiddenSecretCheatCodeIndex); + gcdialog_showText(ASSET_FBF_TEXT_ERASED_SAVE, 0xC, NULL, NULL, NULL, NULL); gameFile_clear(func_802C5A30()); gameFile_8033CFD4(func_802C5A30()); func_802C5A3C(-1); return; } - func_8038B5B4(); + __code3E30_resetSecretCheatCodeProgress(); } -void TTC_func_8038BBA0(s32 secretCodeIndex) { +static void __code3E30_checkIfBannedCheatCodeEntered(s32 secret_cheat_code_index) +{ s32 i; - if ((s32) secretCodesTable[secretCodeIndex].id >= 0x14) { - if (volatileFlag_get(secretCodesTable[secretCodeIndex].id - 0x14)) { - func_8038B5B4(); + if ((s32)sSecretsCheatCodes[secret_cheat_code_index].id >= VOLATILE_FLAG_CHEAT_OFFSET) + { + if (volatileFlag_get(sSecretsCheatCodes[secret_cheat_code_index].id - VOLATILE_FLAG_CHEAT_OFFSET)) + { + __code3E30_resetSecretCheatCodeProgress(); return; } - for( i = 0; bannedCheatCodesIdRanges[i].minId != 0; i++){ - if ((secretCodesTable[secretCodeIndex].id >= bannedCheatCodesIdRanges[i].minId) && (bannedCheatCodesIdRanges[i].maxId >= secretCodesTable[secretCodeIndex].id)) { - switch (__sandcastleCodes_getNumberEntered()) { + for (i = 0; sBannedCheatCodeRanges[i].minId != 0; i++) + { + if ((sSecretsCheatCodes[secret_cheat_code_index].id >= sBannedCheatCodeRanges[i].minId) && (sBannedCheatCodeRanges[i].maxId >= sSecretsCheatCodes[secret_cheat_code_index].id)) + { + switch (__code3E30_getNumberOfBannedCheatCodesEntered()) + { case 0: - __sandcastleCodes_setNumberEntered(1); - func_8038B800(secretCodeIndex); - func_8038B5B4(); + __code3E30_setNumberOfBannedCheatcodesEntered(1); + __code3E30_checkSecretCheatCodeIndex(secret_cheat_code_index); + __code3E30_resetSecretCheatCodeProgress(); return; case 1: - __sandcastleCodes_setNumberEntered(2); - func_8038B800(secretCodeIndex); - func_8038B5B4(); - gcdialog_showText(ASSET_FBE_TEXT_UNKNOWN, 0xC, NULL, NULL, NULL, NULL); + __code3E30_setNumberOfBannedCheatcodesEntered(2); + __code3E30_checkSecretCheatCodeIndex(secret_cheat_code_index); + __code3E30_resetSecretCheatCodeProgress(); + gcdialog_showText(ASSET_FBE_TEXT_CHEATING_ERASE_SAVE_WARNING, 0xC, NULL, NULL, NULL, NULL); return; case 2: - D_8038CAD4 = secretCodeIndex; - gcdialog_showText(ASSET_E38_TEXT_UNKNOWN, 0xC, NULL, NULL, __sandcastleCodes_eraseGameDialogCallback, NULL); + sThirdForbiddenSecretCheatCodeIndex = secret_cheat_code_index; + gcdialog_showText(ASSET_E38_CHEATING_ERASE_SAVE_CONFIRMATION, 0xC, NULL, NULL, __code3E30_eraseGameplayDialogCallback, NULL); return; } return; } } } - func_8038B800(secretCodeIndex); - func_8038B5B4(); + __code3E30_checkSecretCheatCodeIndex(secret_cheat_code_index); + __code3E30_resetSecretCheatCodeProgress(); } -bool func_8038BD10(LetterFloorTile *arg0) { - struct_ttc_3E30_4_s *var_s0; - struct_ttc_3E30_4_s *var_v0; - s32 var_a2; - s32 secretCodeIndex; - s32 var_s2; +static bool __code3E30_isFloorTileValidForSecretCheatCode(LetterFloorTile *floor_tile) +{ + SecretCheatCode *var_s0; + SecretCheatCode *var_v0; + s32 matched_secret_cheat_codes; + s32 secret_cheat_code_index; + s32 matched_secret_cheat_code_2; s32 var_v1; - if ((D_8038CC78 == 2) || (__sandcastleCodes_getNumberEntered() == 3)) { - return 0; + if ((sLastFloorTileHitCorret == 2) || (__code3E30_getNumberOfBannedCheatCodesEntered() == 3)) + { + return FALSE; } - if (D_8038CC78 == 0) { - var_a2 = 0; - if (*(secretCodesTable[0].unk4 + secretCodesTable[0].code) == 0) { - for(var_v1 = 0; (secretCodesTable + var_v1)->code != NULL; var_v1++){ - if (arg0->letter == (secretCodesTable + var_v1)->code[(secretCodesTable + var_v1)->unk4]) { - (secretCodesTable + var_v1)->unk4++; - var_a2 += 1; + + if (sLastFloorTileHitCorret == 0) + { + matched_secret_cheat_codes = 0; + // has entered "CHEAT" and is now entering "actual" cheat code + if (*(sSecretsCheatCodes[0].codeCharacterIdx + sSecretsCheatCodes[0].code) == NULL) + { + // go through each secret cheat code + for (var_v1 = 0; (sSecretsCheatCodes + var_v1)->code != NULL; var_v1++) + { + // check whether the floor tile letter is the "expected" character in the current secret cheat code + if (floor_tile->letter == (sSecretsCheatCodes + var_v1)->code[(sSecretsCheatCodes + var_v1)->codeCharacterIdx]) + { + // advance character index + (sSecretsCheatCodes + var_v1)->codeCharacterIdx++; + matched_secret_cheat_codes += 1; } } - if (var_a2 != 0) { - D_8038CC78 = 1; - func_8038AB44(); - return 1; + // did the letter occur in any secret cheat code? + if (matched_secret_cheat_codes != 0) + { + sLastFloorTileHitCorret = 1; + __code3E30_setsecretCheatCodeRelatedValue(); + return TRUE; } - D_8038CC78 = 2; - func_8038AB44(); - return 0; + + sLastFloorTileHitCorret = 2; + __code3E30_setsecretCheatCodeRelatedValue(); + return FALSE; } - if (arg0->letter == secretCodesTable[0].code[secretCodesTable[0].unk4]) { + + // is entering "CHEAT"? + if (floor_tile->letter == sSecretsCheatCodes[0].code[sSecretsCheatCodes[0].codeCharacterIdx]) + { func_8030E58C(SFX_2B_BULL_MOO_1, randf2(0.6f, 0.7f)); - secretCodesTable[0].unk4++; - func_8038AB44(); - return 1; + sSecretsCheatCodes[0].codeCharacterIdx++; + __code3E30_setsecretCheatCodeRelatedValue(); + return TRUE; } - D_8038CC78 = 2; - func_8038AB44(); - return 0; + + sLastFloorTileHitCorret = 2; + __code3E30_setsecretCheatCodeRelatedValue(); + return FALSE; } - - func_8038AB44(); - if (D_8038CC78 == 1) { - var_s2 = 0; - for(secretCodeIndex = 1; (secretCodesTable + secretCodeIndex)->code != 0; secretCodeIndex++){ - if (((secretCodesTable + secretCodeIndex)->unk4 != 0) && (arg0->letter == (secretCodesTable + secretCodeIndex)->code[(secretCodesTable + secretCodeIndex)->unk4])) { - var_s2 += 1; - (secretCodesTable + secretCodeIndex)->unk4++; - func_8038AB44(); - if ((secretCodesTable + secretCodeIndex)->code[(secretCodesTable + secretCodeIndex)->unk4] == '\0') { - if ((secretCodesTable + secretCodeIndex)->id != 0) { - TTC_func_8038BBA0(secretCodeIndex); - } - return 1; + + __code3E30_setsecretCheatCodeRelatedValue(); + if (sLastFloorTileHitCorret == 1) + { + matched_secret_cheat_code_2 = 0; + // iterate over all secret cheat codes except the first one + for (secret_cheat_code_index = 1; (sSecretsCheatCodes + secret_cheat_code_index)->code != 0; secret_cheat_code_index++) + { + // is the letter expected at the current cheat codes character index + if ( + ((sSecretsCheatCodes + secret_cheat_code_index)->codeCharacterIdx != NULL) && + (floor_tile->letter == (sSecretsCheatCodes + secret_cheat_code_index)->code[(sSecretsCheatCodes + secret_cheat_code_index)->codeCharacterIdx]) + ) + { + matched_secret_cheat_code_2 += 1; + (sSecretsCheatCodes + secret_cheat_code_index)->codeCharacterIdx++; + __code3E30_setsecretCheatCodeRelatedValue(); + // check if "next" expected character is zero-terminator, if true then cheat entered successfully + if ((sSecretsCheatCodes + secret_cheat_code_index)->code[(sSecretsCheatCodes + secret_cheat_code_index)->codeCharacterIdx] == '\0') + { + if ((sSecretsCheatCodes + secret_cheat_code_index)->id != NULL) + { + __code3E30_checkIfBannedCheatCodeEntered(secret_cheat_code_index); } + return TRUE; } - else{ - (secretCodesTable + secretCodeIndex)->unk4 = 0U; - func_8038AB44(); - } + } + else + { + // reset progress for current secret cheat code + (sSecretsCheatCodes + secret_cheat_code_index)->codeCharacterIdx = 0; + __code3E30_setsecretCheatCodeRelatedValue(); + } } - if (var_s2 == 0) { - D_8038CC78 = 2; - return 0; + if (matched_secret_cheat_code_2 == 0) + { + sLastFloorTileHitCorret = 2; + return FALSE; } - } - return 1; + + return TRUE; } -bool func_8038BF68(void){ - return *(u8*)(secretCodesTable[0].unk4 + (s32)secretCodesTable[0].code) == 0; +static bool __code3E30_isCurrentSecretCheatCodeCharacter0() +{ + return *(u8 *)(sSecretsCheatCodes[0].codeCharacterIdx + (s32)sSecretsCheatCodes[0].code) == 0; } - -int ttc_func_8038BF8C(void){ - return func_8038B600() == D_8038C980; +bool code_3E30_isSecretCheatCodeRelatedValueEqualToScrambledAddressValue() +{ + return __code3E30_scrambleAddressForSecretCheatCode() == secretCheatCodeRelatedValue; } diff --git a/src/core2/ch/crab.c b/src/core2/ch/crab.c index 85be3490..b5d26f19 100644 --- a/src/core2/ch/crab.c +++ b/src/core2/ch/crab.c @@ -39,7 +39,7 @@ void __chCrab_802CB040(Actor *this) { void __chCrab_802CB078(Actor *this) { u32 temp_t9; - if ((this->modelCacheIndex != ACTOR_F2_BLACK_SNIPPET) || func_8038B550()) { + if ((this->modelCacheIndex != ACTOR_F2_BLACK_SNIPPET) || code3E30_hasBanjoKazooieCodeBeenEntered()) { temp_t9 = (u32) this->unk38_31 >> 0x16; if (this->unk38_31 != 0) { this->unk38_31--; @@ -159,7 +159,7 @@ bool __chCrab_802CB76C(ActorMarker *marker, ActorMarker *other) { Actor *this; this = marker_getActor(marker); - if ((this->modelCacheIndex == ACTOR_F2_BLACK_SNIPPET) && !func_8038B550()) { + if ((this->modelCacheIndex == ACTOR_F2_BLACK_SNIPPET) && !code3E30_hasBanjoKazooieCodeBeenEntered()) { return FALSE; } return TRUE; diff --git a/src/core2/ch/gameSelect.c b/src/core2/ch/gameSelect.c index ed243191..20fa103a 100644 --- a/src/core2/ch/gameSelect.c +++ b/src/core2/ch/gameSelect.c @@ -83,7 +83,7 @@ s32 mm_hut_smash_count; u32 CH_TREASUREHUNT_PUZZLE_CURRENT_STEP; struct FF_StorageStruct* D_8037DCB8; s32 D_8037DCBC; -u8 D_8037DCC0[7]; +u8 D_8037DCC0[7]; // bottle bonus puzzle? u8 D_8037DCC7; u8 D_8037DCC8; u8 D_8037DCC9; diff --git a/src/core2/code_73640.c b/src/core2/code_73640.c index 3007fc3b..ca6382e7 100644 --- a/src/core2/code_73640.c +++ b/src/core2/code_73640.c @@ -89,7 +89,7 @@ ItemPrint D_803692F8[0x2C] = { /* .bss */ s32 D_803810B0; f32 itemPrintValues[0x2C]; //item_print_value -s32 D_80381168[0x2C]; //comusic_e +s32 D_80381168[0x2C]; // item_e => comusic_e f32 D_80381218[0x2C]; //item_sfx_volume??? s32 D_803812C8[0x2C]; //comusic_e s32 D_80381378[0x2C]; //sfx_e diff --git a/src/core2/code_9B990.c b/src/core2/code_9B990.c index 6e816522..829d6130 100644 --- a/src/core2/code_9B990.c +++ b/src/core2/code_9B990.c @@ -208,15 +208,15 @@ void func_80322B3C(s32 arg0, s32 arg1){ return; } void __overlay_ttc_draw(Gfx **gfx, Mtx **mtx, Vtx **vtx){ return; } void __overlay_ttc_release(void){ - func_8038B04C(); + code3E30_overlayRelease(); } void overlay_ttc_init(void){ - func_8038B094(); + code3E30_overlayInit(); } void __overlay_ttc_update(void){ - func_8038B2F0(); + code3E30_overlayUpdate(); } void func_80322BB8(s32 arg0, s32 arg1){ return; } diff --git a/src/core2/code_AD5B0.c b/src/core2/code_AD5B0.c index 619dc3e0..0f4a839a 100644 --- a/src/core2/code_AD5B0.c +++ b/src/core2/code_AD5B0.c @@ -321,7 +321,7 @@ s32 func_80334ECC(void) { phi_v1 = 0x1F; } if (((phi_v1 & phi_v0) == 3) && (overlayManagergetLoadedId() == OVERLAY_5_BEACH)) { - if ((ttc_func_8038BF8C() == 0) || (D_80370250 != 0)) { + if ((code_3E30_isSecretCheatCodeRelatedValueEqualToScrambledAddressValue() == FALSE) || (D_80370250 != 0)) { D_80370250 = (u8)1; for (phi_v0 = 0; phi_v0 != 0x8F0D180; phi_v0++){ } diff --git a/src/core2/code_CF3E0.c b/src/core2/code_CF3E0.c index af97ebf8..c1058b26 100644 --- a/src/core2/code_CF3E0.c +++ b/src/core2/code_CF3E0.c @@ -123,12 +123,12 @@ void volatileFlag_setAndTriggerDialog_0(s32 arg0) { volatileFlag_setAndTriggerDialog(arg0, 0); } -// called for FFQ dialogs +// called for FFQ dialogs, gruntilda speaking? void volatileFlag_setAndTriggerDialog_4(s32 arg0) { volatileFlag_setAndTriggerDialog(arg0, 4); } -// called for WISHYWASHYBANJO dialog +// called for WISHYWASHYBANJO dialog, mumbo jumbo speaking? void volatileFlag_setAndTriggerDialog_E(s32 arg0) { volatileFlag_setAndTriggerDialog(arg0, 0xE); } diff --git a/src/core2/gc/dialog.c b/src/core2/gc/dialog.c index 858888ea..b83854fe 100644 --- a/src/core2/gc/dialog.c +++ b/src/core2/gc/dialog.c @@ -942,6 +942,11 @@ int func_80311174(s32 text_id, s32 arg1, f32 *pos, ActorMarker *marker, void(*ca return 0; } +// arg1 = "person" that says text? +// 0xC = Bottles +// 0xE = Jumbo? +// 0x4 = Gruntilda? +// 0xF = Mr Vile? bool gcdialog_showText(s32 text_id, s32 arg1, f32 *pos, ActorMarker *marker, void(*callback)(ActorMarker *, enum asset_e, s32), void(*arg5)(ActorMarker *, enum asset_e, s32)){ return func_80311174(text_id, arg1, pos, marker, callback, arg5, 0); } From 230aa57fb1a3bea165dd56f572ea7eb03a8adf87 Mon Sep 17 00:00:00 2001 From: Bl00D4NGEL Date: Thu, 10 Oct 2024 22:20:53 +0200 Subject: [PATCH 2/4] refac: rename struct property --- src/TTC/code_3E30.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/TTC/code_3E30.c b/src/TTC/code_3E30.c index 60122dd8..54eb046b 100644 --- a/src/TTC/code_3E30.c +++ b/src/TTC/code_3E30.c @@ -36,7 +36,7 @@ typedef struct s16 meshId; u8 letter; // floor_letters_e u8 state; // some sort of state, 1 - 5 - f32 time_delta_sum; + f32 timeDeltaSum; } LetterFloorTile; typedef struct From f8b724f598843360b3ead3f2b6e3ec63917ffcb5 Mon Sep 17 00:00:00 2001 From: Bl00D4NGEL Date: Thu, 10 Oct 2024 22:33:07 +0200 Subject: [PATCH 3/4] document the rest of ttc --- level_symbols.us.v10.txt | 2 +- src/CC/code_1F70.c | 2 +- src/CC/code_BF0.c | 2 +- src/TTC/ch/lockup.c | 2 +- src/TTC/code_26D0.c | 41 ++++++++++++++++++++-------------------- src/TTC/code_3040.c | 13 ++++++++----- src/TTC/code_3E30.c | 20 ++++++++++---------- src/core2/code_4C020.c | 2 ++ src/core2/code_956B0.c | 5 +++-- src/core2/spawnqueue.c | 2 +- 10 files changed, 49 insertions(+), 42 deletions(-) diff --git a/level_symbols.us.v10.txt b/level_symbols.us.v10.txt index 0b659fc5..a8d4da4f 100644 --- a/level_symbols.us.v10.txt +++ b/level_symbols.us.v10.txt @@ -1,6 +1,6 @@ sm_func_80386810 = 0x80386810; mm_func_803888B0 = 0x803888B0; -TTC_resetSpawnableActors = 0x80388AC0; +code26D0_resetSpawnableActorsForTTC = 0x80388AC0; code_3E30_isSecretCheatCodeRelatedValueEqualToScrambledAddressValue = 0x8038BF8C; cc_func_803870E0 = 0x803870E0; cc_func_80387DA0 = 0x80387DA0; diff --git a/src/CC/code_1F70.c b/src/CC/code_1F70.c index 38176809..a039910c 100644 --- a/src/CC/code_1F70.c +++ b/src/CC/code_1F70.c @@ -382,7 +382,7 @@ void CC_func_80388F4C(void){ if(D_80389FA0.unk21 == 3){ func_8034A174(D_80389FA0.unk34, 6, sp48); if(ml_distance_vec3f(sp48, sp6C) <= 130.0f && sp6C[1] - sp48[1] < 50.0f){ - func_8031D04C(0x21, 1); + func_8031D04C(MAP_21_CC_WITCH_SWITCH_ROOM, 1); } }//L80389260 diff --git a/src/CC/code_BF0.c b/src/CC/code_BF0.c index 980bff2b..eda3acbd 100644 --- a/src/CC/code_BF0.c +++ b/src/CC/code_BF0.c @@ -137,7 +137,7 @@ void func_803870F8(Actor *this){ sp3C[1] = this->position_y + 100; sp3C[2] = this->position_z; if(ml_distance_vec3f(&sp3C, &sp70) < 120.0f){ - func_8031D04C(0x22, (local->unk0 == 1)? 7 : 6); + func_8031D04C(MAP_22_CC_INSIDE_CLANKER, (local->unk0 == 1)? 7 : 6); } }//L80387500 } diff --git a/src/TTC/ch/lockup.c b/src/TTC/ch/lockup.c index 574ae5d6..3ead4eb2 100644 --- a/src/TTC/ch/lockup.c +++ b/src/TTC/ch/lockup.c @@ -70,7 +70,7 @@ static void __chLockup_close(Actor *this){ } static void __chLockup_open(Actor *this){ - func_80389468(); + code3040_func_80389468(); subaddie_set_state_with_direction(this, CH_LOCKUP_STATE_OPENING, 0.2f, 1); this->unk38_31 = 1; FUNC_8030E8B4(SFX_6B_LOCKUP_OPENING, 1.0f, 32000, this->position, 1250, 2500); diff --git a/src/TTC/code_26D0.c b/src/TTC/code_26D0.c index 55759d90..a7e484dc 100644 --- a/src/TTC/code_26D0.c +++ b/src/TTC/code_26D0.c @@ -25,11 +25,12 @@ extern ActorInfo gChTreasurehuntRedQuestionMark; extern ActorInfo gChTreasurehuntRedX; extern ActorInfo gChTreasure; -void code26D0_genericUpdateFunc(Actor *this); -void code26D0_palmTreeUpdateFunc(Actor *this); -void code26D0_lighthouseAUpdateFunc(Actor *this); -void func_802D3D54(Actor *this); -void code26D0_sharkfoodIslandUpdateFunc(Actor *this); +extern void func_802D3D54(Actor *this); + +static void __code26D0_genericUpdateFunc(Actor *this); +static void __code26D0_palmTreeUpdateFunc(Actor *this); +static void __code26D0_lighthouseAUpdateFunc(Actor *this); +static void __code26D0_sharkfoodIslandUpdateFunc(Actor *this); /* .data */ ActorInfo gBlubberShipTopHatch = { @@ -49,47 +50,47 @@ ActorInfo gLighthouseDoor = { ActorInfo gSharkfoodIsland = { MARKER_167_SHARKFOOD_ISLAND, ACTOR_25C_SHARKFOOD_ISLAND, ASSET_50A_MODEL_SHARKFOOD_ISLAND, 0x1, NULL, - code26D0_sharkfoodIslandUpdateFunc, actor_update_func_80326224, actor_drawFullDepth, + __code26D0_sharkfoodIslandUpdateFunc, actor_update_func_80326224, actor_drawFullDepth, 0, 0, 0.0f, 0 }; ActorInfo gLighthouseA = { MARKER_267_LIGHTHOUSE_A, ACTOR_2E2_LIGHTHOUSE_A, ASSET_3BD_MODEL_LIGHTHOUSE_A, 0x1, NULL, - code26D0_lighthouseAUpdateFunc, actor_update_func_80326224, actor_drawFullDepth, + __code26D0_lighthouseAUpdateFunc, actor_update_func_80326224, actor_drawFullDepth, 0, 0, 0.0f, 0 }; ActorInfo gLighthouseB = { MARKER_26A_LIGHTHOUSE_B, ACTOR_2DF_LIGHTHOUSE_B, ASSET_3BE_MODEL_LIGHTHOUSE_B, 0x1, NULL, - code26D0_genericUpdateFunc, actor_update_func_80326224, actor_drawFullDepth, + __code26D0_genericUpdateFunc, actor_update_func_80326224, actor_drawFullDepth, 0, 0, 0.0f, 0 }; ActorInfo gStairs1 = { MARKER_268_STAIRS_1, ACTOR_2E0_TTC_STAIRS_1, ASSET_3B6_MODEL_TTC_STAIRS_1, 0x1, NULL, - code26D0_genericUpdateFunc, actor_update_func_80326224, actor_drawFullDepth, + __code26D0_genericUpdateFunc, actor_update_func_80326224, actor_drawFullDepth, 0, 0, 0.0f, 0 }; ActorInfo gStairs2 = { MARKER_269_STAIRS_2, ACTOR_2E1_TTC_STAIRS_2, ASSET_3B7_MODEL_TTC_STAIRS_1, 0x1, NULL, - code26D0_genericUpdateFunc, actor_update_func_80326224, actor_drawFullDepth, + __code26D0_genericUpdateFunc, actor_update_func_80326224, actor_drawFullDepth, 0, 0, 0.0f, 0 }; ActorInfo gPalmTree = { MARKER_1D5_PALM_TREE, ACTOR_31E_PALM_TREE, ASSET_3A9_MODEL_PALM_TREE, 0x1, NULL, - code26D0_palmTreeUpdateFunc, actor_update_func_80326224, actor_drawFullDepth, + __code26D0_palmTreeUpdateFunc, actor_update_func_80326224, actor_drawFullDepth, 0, 0, 0.0f, 0 }; /* .code */ -void TTC_resetSpawnableActors(void) +void code26D0_resetSpawnableActorsForTTC(void) { spawnableActorList_add(&gBlubberShipTopHatch, actor_new, ACTOR_FLAG_NONE); spawnableActorList_add(&gLighthouseDoor, actor_new, ACTOR_FLAG_NONE); @@ -112,14 +113,14 @@ void TTC_resetSpawnableActors(void) spawnableActorList_add(&gChClam, actor_new, ACTOR_FLAG_UNKNOWN_0 | ACTOR_FLAG_UNKNOWN_6 | ACTOR_FLAG_UNKNOWN_25); } -void code26D0_genericUpdateFunc(Actor *this){ +static void __code26D0_genericUpdateFunc(Actor *this){ if(!this->initialized){ func_802D3D74(this); this->initialized = TRUE; } } -void code26D0_palmTreeUpdateFunc(Actor *this){ +static void __code26D0_palmTreeUpdateFunc(Actor *this){ if(!this->initialized){ func_802D3D74(this); this->initialized = TRUE; @@ -127,21 +128,21 @@ void code26D0_palmTreeUpdateFunc(Actor *this){ } } -void code26D0_spawnLighthouseB(s32 arg0){ +static void __code26D0_spawnLighthouseB(s32 arg0){ ActorMarker *marker = reinterpret_cast(ActorMarker *, arg0); Actor *this = marker_getActor(marker); spawn_child_actor(ACTOR_2DF_LIGHTHOUSE_B, &this); } -void code26D0_lighthouseAUpdateFunc(Actor *this){ - code26D0_genericUpdateFunc(this); +static void __code26D0_lighthouseAUpdateFunc(Actor *this){ + __code26D0_genericUpdateFunc(this); if(!this->volatile_initialized){ - __spawnQueue_add_1((GenFunction_1)code26D0_spawnLighthouseB, (s32)this->marker); + __spawnQueue_add_1((GenFunction_1)__code26D0_spawnLighthouseB, (s32)this->marker); this->volatile_initialized = TRUE; } } -void code26D0_sharkfoodIslandUpdateFunc(Actor *this){ +static void __code26D0_sharkfoodIslandUpdateFunc(Actor *this){ f32 player_position[3]; if(!this->initialized){ @@ -160,7 +161,7 @@ void code26D0_sharkfoodIslandUpdateFunc(Actor *this){ else{ this->position_y = -1000.0f; } - }//L80388E7C + } if(this->position_y == 700.0f){ player_getPosition(player_position); diff --git a/src/TTC/code_3040.c b/src/TTC/code_3040.c index 942a7198..c0c6a292 100644 --- a/src/TTC/code_3040.c +++ b/src/TTC/code_3040.c @@ -5,8 +5,11 @@ extern s32 D_80276CB0; /* .data */ +// code crc0 s32 D_8038C750 = 0x0016D2FD; +// code crc1 s32 D_8038C754 = 0xFB70B01D; +// data crc s32 D_8038C758 = 0x0004EFAC; /* .bss */ @@ -15,17 +18,17 @@ struct { s32 unk4; u8 pad8[4]; s32 unkC; -}D_8038D6F0; +} sD_8038D6F0; /* .code */ -void func_80389430(void){ +void __code3040_func_80389430(){ if(getGameMode() != GAME_MODE_7_ATTRACT_DEMO){ func_8029CF48(2, 1, 0.0f); } } -void func_80389468(void){ - if(D_8038D6F0.unk4 != D_8038C754 || D_8038D6F0.unkC != D_80276CB0){ - func_80389430(); +void code3040_func_80389468(void){ + if(sD_8038D6F0.unk4 != D_8038C754 || sD_8038D6F0.unkC != D_80276CB0){ + __code3040_func_80389430(); } } diff --git a/src/TTC/code_3E30.c b/src/TTC/code_3E30.c index 54eb046b..dfaec3c0 100644 --- a/src/TTC/code_3E30.c +++ b/src/TTC/code_3E30.c @@ -196,7 +196,7 @@ static void __code3E30_initFloorTiles(void) for (i_ptr = sLetterFloorTiles; i_ptr->meshId != 0; i_ptr++) { i_ptr->state = 2; - i_ptr->time_delta_sum = 0.0f; + i_ptr->timeDeltaSum = 0.0f; } mapSpecificFlags_set(TTC_SPECIFIC_FLAG_1_UNKNOWN, FALSE); @@ -207,9 +207,9 @@ static void __code3E30_meshCallbackFloorTileState_1(s32 arg0, BKVtxRef *ref, Vtx LetterFloorTile *ptr = (LetterFloorTile *)arg3; f32 temp_f2; - if (ptr->time_delta_sum < 0.5) + if (ptr->timeDeltaSum < 0.5) { - temp_f2 = (ptr->time_delta_sum / 0.5); + temp_f2 = (ptr->timeDeltaSum / 0.5); dst->v.cn[0] = (ref->v.v.cn[0] - 0xFF) * temp_f2 + 255.0f; dst->v.cn[1] = ref->v.v.cn[1] * temp_f2; dst->v.cn[2] = ref->v.v.cn[2] * temp_f2; @@ -229,7 +229,7 @@ static void __code3E30_setLetterFloorTileState(LetterFloorTile *arg0, s32 arg1) temp_v0 = arg0->state; arg0->state = arg1; - arg0->time_delta_sum = 0.0f; + arg0->timeDeltaSum = 0.0f; if ((arg1 == 1) && (temp_v0 != arg1)) { func_8025A6EC(COMUSIC_2C_BUZZER, 32000); @@ -241,14 +241,14 @@ static void __code3E30_meshCallbackFloorTileState_3(s32 arg0, BKVtxRef *ref, Vtx LetterFloorTile *ptr = (LetterFloorTile *)arg3; f32 temp_f12; - if (ptr->time_delta_sum <= 0.5) + if (ptr->timeDeltaSum <= 0.5) { - temp_f12 = (ptr->time_delta_sum / 0.5); + temp_f12 = (ptr->timeDeltaSum / 0.5); dst->v.cn[0] = ref->v.v.cn[0] * (1.0f - temp_f12); dst->v.cn[1] = 0xFF; dst->v.cn[2] = ref->v.v.cn[2] * (1.0f - temp_f12); } - if (ptr->time_delta_sum >= 0.5) + if (ptr->timeDeltaSum >= 0.5) { ptr->state = 4; } @@ -259,9 +259,9 @@ static void __code3E30_meshCallbackFloorTileState_5(s32 arg0, BKVtxRef *ref, Vtx LetterFloorTile *ptr = (LetterFloorTile *)arg3; f32 temp_f2; - if (ptr->time_delta_sum < 0.5) + if (ptr->timeDeltaSum < 0.5) { - temp_f2 = (ptr->time_delta_sum / 0.5); + temp_f2 = (ptr->timeDeltaSum / 0.5); dst->v.cn[0] = (ref->v.v.cn[0] - 0xFF) * temp_f2 + 255.0f; dst->v.cn[1] = (ref->v.v.cn[1] - 0xFF) * temp_f2 + 255.0f; dst->v.cn[2] = ref->v.v.cn[2] * temp_f2; @@ -283,7 +283,7 @@ static void __code3E30_updateTimeDeltaSumForFloorTiles() time_delta = time_getDelta(); for (floor_tile = sLetterFloorTiles; floor_tile->meshId != 0; floor_tile++) { - floor_tile->time_delta_sum += time_delta; + floor_tile->timeDeltaSum += time_delta; if (floor_tile->state == 1) { BKModel_transformMesh(sMapState.model1, floor_tile->meshId, __code3E30_meshCallbackFloorTileState_1, (s32)floor_tile); diff --git a/src/core2/code_4C020.c b/src/core2/code_4C020.c index 5db33954..7f972afd 100644 --- a/src/core2/code_4C020.c +++ b/src/core2/code_4C020.c @@ -361,6 +361,7 @@ void func_802D3CC8(ActorMarker *marker){ func_802D31AC(marker, NULL); } +// used as init function void func_802D3CE8(Actor *this){ if(!this->initialized){ marker_setCollisionScripts(this->marker, NULL, func_802D3138, func_802D31AC); @@ -373,6 +374,7 @@ void func_802D3D54(Actor *this){ func_802D3CE8(this); } +// used as init function void func_802D3D74(Actor *this){ this->marker->propPtr->unk8_3 = TRUE; actor_collisionOff(this); diff --git a/src/core2/code_956B0.c b/src/core2/code_956B0.c index 161a6d96..1b547460 100644 --- a/src/core2/code_956B0.c +++ b/src/core2/code_956B0.c @@ -231,8 +231,9 @@ void func_8031CE70(f32 *arg0, enum map_e arg1, s32 arg2) { } } -void func_8031D04C(enum map_e arg0, s32 arg1) { - func_8031CB50(arg0, arg1, 0); +// set map and exit id? +void func_8031D04C(enum map_e arg0, s32 exit_id) { + func_8031CB50(arg0, exit_id, 0); } void func_8031D06C(enum map_e arg0, s32 arg1) { diff --git a/src/core2/spawnqueue.c b/src/core2/spawnqueue.c index 7b1b9859..aad84102 100644 --- a/src/core2/spawnqueue.c +++ b/src/core2/spawnqueue.c @@ -374,7 +374,7 @@ void spawnQueue_reset(void){ GV_func_8038F154(); break; case OVERLAY_5_BEACH: - TTC_resetSpawnableActors(); + code26D0_resetSpawnableActorsForTTC(); break; case OVERLAY_6_JUNGLE: MM_func_803888B0(); From 3a8222b5cd23680479a3b682209e820c6085ca8e Mon Sep 17 00:00:00 2001 From: Bl00D4NGEL Date: Thu, 10 Oct 2024 22:54:45 +0200 Subject: [PATCH 4/4] general cleanup of ttc related code --- include/enums.h | 8 +- src/TTC/code_3E30.c | 283 +++++++++++++++++++++++++----------- src/core2/ch/bottlesbonus.c | 6 +- src/core2/ch/gameSelect.c | 2 +- src/core2/gc/dialog.c | 5 - 5 files changed, 210 insertions(+), 94 deletions(-) diff --git a/include/enums.h b/include/enums.h index d1e9d46a..0b70abc1 100644 --- a/include/enums.h +++ b/include/enums.h @@ -328,7 +328,7 @@ enum volatile_flags_e { VOLATILE_FLAG_74_SANDCASTLE_INFINITE_EGGS, VOLATILE_FLAG_75_SANDCASTLE_INFINITE_RED_FEATHERS, VOLATILE_FLAG_76_SANDCASTLE_INFINITE_GOLD_FEATHERS, - VOLATILE_FLAG_77_SANDCASTLE_SET_HEALTH_TO_MAX, // unused + VOLATILE_FLAG_77_SANDCASTLE_SET_HEALTH_TO_MAX, VOLATILE_FLAG_78_SANDCASTLE_NO_BONUS, VOLATILE_FLAG_79, // unused VOLATILE_FLAG_7A, // unused @@ -4431,7 +4431,7 @@ enum asset_e ASSET_E35_DIALOG_BOTTLES_BONUS_REMINDER = VER_SELECT(0xE35, 0xa77, 0, 0), ASSET_E37_TEXT_BOTTLES_STOP_WASTING_TIME_AFTER_FURNACE_FUN = 0xE37, // Talk to bottles after beating furnace fun - ASSET_E38_CHEATING_ERASE_SAVE_CONFIRMATION, + ASSET_E38_DIALOG_CHEATING_ERASE_SAVE_CONFIRMATION, ASSET_E57_DIALOG_FIRST_JIGGY = VER_SELECT(0xF57, 0xabd, 0, 0), @@ -4450,8 +4450,8 @@ enum asset_e ASSET_FAD_TEXT_UNKNOWN = 0xfad, - ASSET_FBE_TEXT_CHEATING_ERASE_SAVE_WARNING = 0xfbe, - ASSET_FBF_TEXT_ERASED_SAVE, + ASSET_FBE_DIALOG_CHEATING_ERASE_SAVE_WARNING = 0xfbe, + ASSET_FBF_DIALOG_ERASED_SAVE, ASSET_10A1_DIALOG_BRENTILDA_MEET = 0x10A1, ASSET_10A2_TEXT_UNKNOWN, diff --git a/src/TTC/code_3E30.c b/src/TTC/code_3E30.c index dfaec3c0..b6df2004 100644 --- a/src/TTC/code_3E30.c +++ b/src/TTC/code_3E30.c @@ -5,14 +5,12 @@ #include "SnS.h" /* extern */ - -void func_802D6310(f32, enum map_e, s32, s32, enum file_progress_e); +extern void func_802D6310(f32, enum map_e, s32, s32, enum file_progress_e); extern BKModel *mapModel_getModel(s32); -extern u8 D_8037DCC0[7]; +extern u8 gCompletedBottleBonusGames[7]; /* .h */ - static void __code3E30_resetSecretCheatCodeProgress(void); static u32 __code3E30_scrambleAddressForSecretCheatCode(); @@ -48,7 +46,7 @@ typedef struct static s32 __code3E30_getNumberOfBannedCheatCodesEntered(); /* .data */ -static s32 secretCheatCodeRelatedValue = NULL; +static s32 sSecretCheatCodeRelatedValue = NULL; enum floor_letters_e { FLOOR_LETTER_J = 0x70, @@ -78,6 +76,17 @@ enum floor_letters_e { FLOOR_LETTER_K = 0x38 }; +/** + * The floor tiles look like this (_ being empty): + * J _ G _ A _ L + * _ V _ E _ C _ + * M _ N _ R _ P + * _ D _ O _ S _ + * Z _ U _ Y _ I + * _ X _ T _ F _ + * O _ A _ W _ O + * _ H _ B _ K _ + */ static LetterFloorTile sLetterFloorTiles[] = { {0x02, FLOOR_LETTER_J, 0, 0.0f}, {0x04, FLOOR_LETTER_G, 0, 0.0f}, @@ -111,18 +120,18 @@ static LetterFloorTile sLetterFloorTiles[] = { }; static CheatCode sCheatCodes[0xD] = { - {"knip68n3664j", 0x0001, 0}, // BANJOKAZOOIE - {"kbgjj552", 0x0002, 0}, // BLUEEGGS - {"9jlcjndmj92", 0x0004, 0}, // REDFEATHERS - {"56blcjndmj92", 0x0008, 0}, // GOLDFEATHERS - {"k6ddbj2k6ig26ij", 0x0010, 0}, // BOTTLESBONUSONE - {"k6ddbj2k6ig2d76", 0x0020, 0}, // BOTTLESBONUSTWO - {"k6ddbj2k6ig2dm9jj", 0x0040, 0}, // BOTTLESBONUSTHREE - {"k6ddbj2k6ig2c6g9", 0x0080, 0}, // BOTTLESBONUSFOUR - {"k6ddbj2k6ig2c4aj", 0x0100, 0}, // BOTTLESBONUSFIVE - {"k45k6ddbj2k6ig2", 0x0200, 0}, // BIGBOTTLESBONUS - {"742me7n2meknip6", 0x0400, 0}, // WISHYWASHYBANJO - {"i6k6ig2", 0x0800, 0}, // NOBONUS + {"knip68n3664j", 0x0001, 0}, // BANJOKAZOOIE + {"kbgjj552", 0x0002, 0}, // BLUEEGGS + {"9jlcjndmj92", 0x0004, 0}, // REDFEATHERS + {"56blcjndmj92", 0x0008, 0}, // GOLDFEATHERS + {"k6ddbj2k6ig26ij", 0x0010, 0}, // BOTTLESBONUSONE + {"k6ddbj2k6ig2d76", 0x0020, 0}, // BOTTLESBONUSTWO + {"k6ddbj2k6ig2dm9jj", 0x0040, 0}, // BOTTLESBONUSTHREE + {"k6ddbj2k6ig2c6g9", 0x0080, 0}, // BOTTLESBONUSFOUR + {"k6ddbj2k6ig2c4aj", 0x0100, 0}, // BOTTLESBONUSFIVE + {"k45k6ddbj2k6ig2", 0x0200, 0}, // BIGBOTTLESBONUS + {"742me7n2meknip6", 0x0400, 0}, // WISHYWASHYBANJO + {"i6k6ig2", 0x0800, 0}, // NOBONUS NULL }; @@ -152,7 +161,7 @@ static void __code3E30_transformMeshCallbackOverlayInit(s32 arg0, BKVtxRef *vtx_ static void __code3E30_setupCheatCodeTimer(s32 new_timer_state) { if (new_timer_state == 1) - { // something in FF? + { if (volatileFlag_get(VOLATILE_FLAG_2_FF_IN_MINIGAME)) { // set timer to 50 seconds @@ -163,6 +172,7 @@ static void __code3E30_setupCheatCodeTimer(s32 new_timer_state) // set timer to 100 seconds item_set(ITEM_0_HOURGLASS_TIMER, 5999); } + item_set(ITEM_6_HOURGLASS, TRUE); } @@ -301,7 +311,7 @@ static void __code3E30_updateTimeDeltaSumForFloorTiles() static void __code3E30_setsecretCheatCodeRelatedValue(void) { - secretCheatCodeRelatedValue = __code3E30_scrambleAddressForSecretCheatCode(); + sSecretCheatCodeRelatedValue = __code3E30_scrambleAddressForSecretCheatCode(); } static u32 __code3E30_cheatoCodeUnlocked(s32 cheato_code_index) @@ -340,7 +350,7 @@ static void __code3E30_setVolatileFlags(u32 arg0) static void __code3E30_checkFloorTileForRegularCheatCode(LetterFloorTile *letter_floor_tile) { - s32 sp40[4]; // unused but required for checksum + s32 pad0[4]; bool floor_is_valid_or_correct; bool is_in_ff_minigame; @@ -365,7 +375,7 @@ static void __code3E30_checkFloorTileForRegularCheatCode(LetterFloorTile *letter for (i = 0; i < 7; i++) { - if (D_8037DCC0[i] != 0) + if (gCompletedBottleBonusGames[i] != 0) { unlocked_cheat_flags |= (0x10 << i); } @@ -563,10 +573,10 @@ void code3E30_overlayInit(void) { BKModel_transformMesh(sMapState.model2, 0x3C, __code3E30_transformMeshCallbackOverlayInit, 0); sMapState.banjoKazooieCodeEnteredState = 3; - } // L8038B2CC + } __code3E30_setsecretCheatCodeRelatedValue(); __code3E30_resetSecretCheatCodeProgress(); - } // L8038B2E0 + } } void code3E30_overlayUpdate(void) @@ -648,65 +658,176 @@ static s32 sThirdForbiddenSecretCheatCodeIndex = NULL; #define VOLATILE_FLAG_CHEAT_OFFSET 0x14 static SecretCheatCode sSecretsCheatCodes[] = { - {"0mjnd", 0, 0x00, 00}, // CHEAT - {"i67knip674bbkjnkbjd62jj4d6iinkigd2dnkbj", 0, 0x01, 00}, // NOW BANJO WILL BE ABLE TO SEE IT ON NABNUTS TABLE - {"dm422j09jde6gbbkj59nkk4i4idmj0nrdn4i20nk4i", 0, 0x02, 00}, // THIS SECRET YOULL BE GRABBIN IN THE CAPTAINS CABIN - {"n14l2ddmjmngidjl5b661n2j09jd4idmjkndm9661", 0, 0x03, 00}, // AMIDST THE HAUNTED GLOOM A SECRET IN THE BATHROOM - {"nlj2j9dl6696rji274ljni04jid2j09jd27n4d4i24lj", 0, 0x04, 00}, // A DESERT DOOR OPENS WIDE ANCIENT SECRETS WAIT INSIDE - {"6gd6cdmj2jn4d942j2d69jajnb169j2j09jdr943j2", 0, 0x05, 00}, // OUT OF THE SEA IT RISES TO REVEAL MORE SECRET PRIZES - {"l6ide6g56nildjbbmj9nk6gddmj2j09jd4imj90jbbn9", 0, 0x06, 00}, // DONT YOU GO AND TELL HER ABOUT THE SECRET IN HER CELLAR - {"i67e6g0ni2jjni40j40j8je7m40me6g0nimnajc69c9jj", 0, 0x07, 00}, // NOW YOU CAN SEE A NICE ICE KEY WHICH YOU CAN HAVE FOR FREE - {"56945md6idm96g5mi6djl669d76", 0, VOLATILE_FLAG_66_SANDCASTLE_OPEN_DOOR_TWO + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // GO RIGHT ON THROUGH NOTE DOOR TWO - {"i6djl669dm9jj5jd4ic69c9jj", 0, VOLATILE_FLAG_67_SANDCASTLE_OPEN_DOOR_THREE + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // NOTE DOOR THREE GET IN FOR FREE - {"dn8jnd6g9dm96g5mi6djl669c6g9", 0, VOLATILE_FLAG_68_SANDCASTLE_OPEN_DOOR_FOUR + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // TAKE A TOUR THROUGH NOTE DOOR FOUR - {"g2jdm420mjndi6djl669c4aj42kjnd", 0, VOLATILE_FLAG_69_SANDCASTLE_OPEN_DOOR_FIVE + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // USE THIS CHEAT NOTE DOOR FIVE IS BEAT - {"dm42d94082g2jld66rjii6djl66924h", 0, VOLATILE_FLAG_6A_SANDCASTLE_OPEN_DOOR_SIX + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // THIS TRICKS USED TO OPEN NOTE DOOR SIX - {"dmj2jajidmi6djl66942i67i6169j", 0, VOLATILE_FLAG_6B_SANDCASTLE_OPEN_DOOR_SEVEN + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // THE SEVENTH NOTE DOOR IS NOW NO MORE - {"e6g0ni5jd7jdcjjdi670bni8j92p455e42061rbjdj", 0, VOLATILE_FLAG_6C_SANDCASTLE_PUZZLE_COMPLETE_CC + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // YOU CAN GET WET FEET NOW CLANKERS JIGGY IS COMPLETE - {"dmjp455e2cgbb6cce6g2d61r4id6l4i5ekgkkbj5b66r27n1r", 0, VOLATILE_FLAG_6D_SANDCASTLE_PUZZLE_COMPLETE_BGS + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // THE JIGGYS FULL OFF YOU STOMP IN TO DINGY BUBBLEGLOOP SWAMP - {"dmjp455e2l6ij266cce6g564id6c9jj3jj3erjn8nil4d22i67", 0, VOLATILE_FLAG_6E_SANDCASTLE_PUZZLE_COMPLETE_FP + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // THE JIGGYS DONE SO OFF YOU GO INTO FREEZEEZY PEAK AND ITS SNOW - {"56k42p455e42i67l6ijd9j86i4inil5jd261j2gi", 0, VOLATILE_FLAG_6F_SANDCASTLE_PUZZLE_COMPLETE_GV + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // GOBIS JIGGY IS NOW DONE TREK ON IN AND GET SOME SUN - {"dmjp455e2i671nlj7m6bj4id6dmj1ni246ie6g0ni2d96bb", 0, VOLATILE_FLAG_70_SANDCASTLE_PUZZLE_COMPLETE_MMM + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // THE JIGGYS NOW MADE WHOLE INTO THE MANSION YOU CAN STROLL - {"dmjp455e2l6ij26dn8jnd94r6id6dmj9g2dekg08jd2m4r", 0, VOLATILE_FLAG_71_SANDCASTLE_PUZZLE_COMPLETE_RBB + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // THE JIGGYS DONE SO TAKE A TRIP ON TO THE RUSTY BUCKET SHIP - {"0b4080b608766l42b6d26ccgi566i4idmjp455e2l6ij", 0, VOLATILE_FLAG_72_SANDCASTLE_PUZZLE_COMPLETE_CCC + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // CLICK CLOCK WOOD IS LOTS OF FUN GO ON IN THE JIGGYS DONE - {"b6d26c56j274dm1nieknip62", 0, VOLATILE_FLAG_73_SANDCASTLE_INFINITE_LIVES + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // LOTS OF GOES WITH MANY BANJOS - {"knip6kj52c69rbjide6cj552", 0, VOLATILE_FLAG_74_SANDCASTLE_INFINITE_EGGS + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // BANJO BEGS FOR PLENTY OF EGGS - {"i67e6g0nicbem45m4idmj28e", 0, VOLATILE_FLAG_75_SANDCASTLE_INFINITE_RED_FEATHERS + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // NOW YOU CAN FLY HIGH IN THE SKY - {"n56blji5b67d6r96dj0dknip6", 0, VOLATILE_FLAG_76_SANDCASTLE_INFINITE_GOLD_FEATHERS + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // A GOLDEN GLOW TO PROTECT BANJO - {"k6dmr4rj2n9jdmj9jd60bni8j92bn49", 0, VOLATILE_FLAG_7D_SANDCASTLE_RAISE_PIPES_TO_CC + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // BOTH PIPES ARE THERE TO CLANKERS LAIR - {"e6gbb0jn2jd6594rj7mjigr56j2nr4rj", 0, VOLATILE_FLAG_7E_SANDCASTLE_RAISE_PIPE_TO_BRENTILDA + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // YOULL CEASE TO GRIPE WHEN UP GOES A PIPE - {"dmj9j2i67mj9jlni8j9dmni4i74dm0bni8j9", 0, VOLATILE_FLAG_7F_SANDCASTLE_OPEN_CC + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // THERES NOWHERE DANKER THAN IN WITH CLANKER - {"e6gbbkjn1n3jli67dmj27n1rr400e594bbj429n42jl", 0, VOLATILE_FLAG_80_SANDCASTLE_REMOVE_GRILL_NEAR_BGS_JIGGY + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // YOULL BE AMAZED NOW THE SWAMP PICCY GRILLE IS RAISED - {"l6idlj2rn49dmjd9jjp455er6l4g142i67dmj9j", 0, VOLATILE_FLAG_81_SANDCASTLE_CCC_JIGGY_PODIUM + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // DONT DESPAIR THE TREE JIGGY PODIUM IS NOW THERE - {"2mj2nig5beknd26bjd29j16ajmj9594bbjnilmnd", 0, VOLATILE_FLAG_82_SANDCASTLE_REMOVE_GRILL_AND_HAT_FROM_STATUE + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // SHES AN UGLY BAT SO LETS REMOVE HER GRILLE AND HAT - {"4d2e6g9bg08elnen2dmj40jknbb1jbd2n7ne", 0, VOLATILE_FLAG_83_SANDCASTLE_REMOVE_ICE + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // ITS YOUR LUCKY DAY AS THE ICE BALL MELTS AWAY - {"i674id6dmj27n1re6g0ni2d61r", 0, VOLATILE_FLAG_84_SANDCASTLE_OPEN_BGS + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // NOW IN TO THE SWAMP YOU CAN STOMP - {"dmje0ng2jd96gkbjkgdi67dmje9j9gkkbj", 0, VOLATILE_FLAG_85_SANDCASTLE_REMOVE_BREAKABLE_WALLS + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // THEY CAUSE TROUBLE BUT NOW THEYRE RUBBLE - {"e6gbbkj5bnld62jjdmj2m608pg1rrnl", 0, VOLATILE_FLAG_86_SANDCASTLE_SHOCKSPRING_JUMP_UNLOCKED + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // YOULL BE GLAD TO SEE THE SHOCK JUMP PAD - {"dm42061j24imniled66rji261j7mj9j2nile", 0, VOLATILE_FLAG_87_SANDCASTLE_OPEN_GV + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // THIS COMES IN HANDY TO OPEN SOMEWHERE SANDY - {"7jk22d6re6g9rbne26dn8jdmj1n7ne", 0, VOLATILE_FLAG_88_SANDCASTLE_REMOVE_WEBS + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // WEBS STOP YOUR PLAY SO TAKE THEM AWAY - {"59gide74bb09ei67e6gaj21n2mjlmj9jej", 0, VOLATILE_FLAG_89_SANDCASTLE_REMOVE_GLASS_EYE + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // GRUNTY WILL CRY NOW YOUVE SMASHED HER EYE - {"e6g76idkj2nli67e6g0nig2jdmjcbernl", 0, VOLATILE_FLAG_8A_SANDCASTLE_FLIGHT_UNLOCKED + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // YOU WONT BE SAD NOW YOU CAN USE THE FLY PAD - {"i67e6g0ni56nild9gl5j4idmj2i67", 0, VOLATILE_FLAG_8B_SANDCASTLE_OPEN_FP + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // NOW YOU CAN GO AND TRUDGE IN THE SNOW - {"dmj1ni246i6c5m62d2n9ji67e6g9m62d2", 0, VOLATILE_FLAG_8C_SANDCASTLE_OPEN_MMM + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // THE MANSION OF GHOSTS ARE NOW YOUR HOSTS - {"e6g76idmnajd67n4di67dmj9j2i609erd5ndj", 0, VOLATILE_FLAG_8D_SANDCASTLE_REMOVE_CRYPT_GATE + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // YOU WONT HAVE TO WAIT NOW THERES NO CRYPT GATE - {"dm422m6gbl5jd94l6cdmj09erd06cc4ib4l", 0, VOLATILE_FLAG_8E_SANDCASTLE_REMOVE_CRYPT_COFFIN_LID + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // THIS SHOULD GET RID OF THE CRYPT COFFIN LID - {"gre6g5674dm6gdnm4d0mgrd6dmj7ndj9bjajb274d0m", 0, VOLATILE_FLAG_8F_SANDCASTLE_REMOVE_GRATE_NEAR_WATER_SWITCH + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // UP YOU GO WITHOUT A HITCH UP TO THE WATER LEVEL SWITCH - {"7mei6ddn8jnd94r4i24lj59gide29g2de2m4r", 0, VOLATILE_FLAG_90_SANDCASTLE_OPEN_RBB + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // WHY NOT TAKE A TRIP INSIDE GRUNTYS RUSTY SHIP - {"dmj594bbj56j2k661d6dmj2m4rr40dg9j9661", 0, VOLATILE_FLAG_91_SANDCASTLE_REMOVE_GRILL_NEAR_RBB_JIGGY + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // THE GRILLE GOES BOOM TO THE SHIP PICTURE ROOM - {"6i0j4d2m6ijkgddmjb6i5dgiijb594bbj4256ij", 0, VOLATILE_FLAG_92_SANDCASTLE_REMOVE_TUNNEL_GRILL_NEAR_RBB_JIGGY + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // ONCE IT SHONE BUT THE LONG TUNNEL GRILLE IS GONE - {"dm426ij2566ln2e6g0nijidj9dmj766l", 0, VOLATILE_FLAG_93_SANDCASTLE_OPEN_CCW + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // THIS ONES GOOD AS YOU CAN ENTER THE WOOD - {"nijij95ekn9d65jde6gcn9", 0, VOLATILE_FLAG_94_SANDCASTLE_INFINITE_HEALTH + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // AN ENERGY BAR TO GET YOU FAR - {"l6idkjnlg1k6562jj1g1k6", 0, VOLATILE_FLAG_95_SANDCASTLE_INFINTE_MUMBO_TOKENS + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // DONT BE A DUMBO GO SEE MUMBO - {"54ajdmjkjn9b6d26cn49", 0, VOLATILE_FLAG_96_SANDCASTLE_INFINITE_AIR + VOLATILE_FLAG_CHEAT_OFFSET, 00}, // GIVE THE BEAR LOTS OF AIR + // CHEAT + {"0mjnd", 0, 0x00, 00}, + + // NOW BANJO WILL BE ABLE TO SEE IT ON NABNUTS TABLE + {"i67knip674bbkjnkbjd62jj4d6iinkigd2dnkbj", 0, 0x01, 00}, + + // THIS SECRET YOULL BE GRABBIN IN THE CAPTAINS CABIN + {"dm422j09jde6gbbkj59nkk4i4idmj0nrdn4i20nk4i", 0, 0x02, 00}, + + // AMIDST THE HAUNTED GLOOM A SECRET IN THE BATHROOM + {"n14l2ddmjmngidjl5b661n2j09jd4idmjkndm9661", 0, 0x03, 00}, + + // A DESERT DOOR OPENS WIDE ANCIENT SECRETS WAIT INSIDE + {"nlj2j9dl6696rji274ljni04jid2j09jd27n4d4i24lj", 0, 0x04, 00}, + + // OUT OF THE SEA IT RISES TO REVEAL MORE SECRET PRIZES + {"6gd6cdmj2jn4d942j2d69jajnb169j2j09jdr943j2", 0, 0x05, 00}, + + // DONT YOU GO AND TELL HER ABOUT THE SECRET IN HER CELLAR + {"l6ide6g56nildjbbmj9nk6gddmj2j09jd4imj90jbbn9", 0, 0x06, 00}, + + // NOW YOU CAN SEE A NICE ICE KEY WHICH YOU CAN HAVE FOR FREE + {"i67e6g0ni2jjni40j40j8je7m40me6g0nimnajc69c9jj", 0, 0x07, 00}, + + // GO RIGHT ON THROUGH NOTE DOOR TWO + {"56945md6idm96g5mi6djl669d76", 0, VOLATILE_FLAG_66_SANDCASTLE_OPEN_DOOR_TWO + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // NOTE DOOR THREE GET IN FOR FREE + {"i6djl669dm9jj5jd4ic69c9jj", 0, VOLATILE_FLAG_67_SANDCASTLE_OPEN_DOOR_THREE + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // TAKE A TOUR THROUGH NOTE DOOR FOUR + {"dn8jnd6g9dm96g5mi6djl669c6g9", 0, VOLATILE_FLAG_68_SANDCASTLE_OPEN_DOOR_FOUR + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // USE THIS CHEAT NOTE DOOR FIVE IS BEAT + {"g2jdm420mjndi6djl669c4aj42kjnd", 0, VOLATILE_FLAG_69_SANDCASTLE_OPEN_DOOR_FIVE + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // THIS TRICKS USED TO OPEN NOTE DOOR SIX + {"dm42d94082g2jld66rjii6djl66924h", 0, VOLATILE_FLAG_6A_SANDCASTLE_OPEN_DOOR_SIX + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // THE SEVENTH NOTE DOOR IS NOW NO MORE + {"dmj2jajidmi6djl66942i67i6169j", 0, VOLATILE_FLAG_6B_SANDCASTLE_OPEN_DOOR_SEVEN + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // YOU CAN GET WET FEET NOW CLANKERS JIGGY IS COMPLETE + {"e6g0ni5jd7jdcjjdi670bni8j92p455e42061rbjdj", 0, VOLATILE_FLAG_6C_SANDCASTLE_PUZZLE_COMPLETE_CC + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // THE JIGGYS FULL OFF YOU STOMP IN TO DINGY BUBBLEGLOOP SWAMP + {"dmjp455e2cgbb6cce6g2d61r4id6l4i5ekgkkbj5b66r27n1r", 0, VOLATILE_FLAG_6D_SANDCASTLE_PUZZLE_COMPLETE_BGS + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // THE JIGGYS DONE SO OFF YOU GO INTO FREEZEEZY PEAK AND ITS SNOW + {"dmjp455e2l6ij266cce6g564id6c9jj3jj3erjn8nil4d22i67", 0, VOLATILE_FLAG_6E_SANDCASTLE_PUZZLE_COMPLETE_FP + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // GOBIS JIGGY IS NOW DONE TREK ON IN AND GET SOME SUN + {"56k42p455e42i67l6ijd9j86i4inil5jd261j2gi", 0, VOLATILE_FLAG_6F_SANDCASTLE_PUZZLE_COMPLETE_GV + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // THE JIGGYS NOW MADE WHOLE INTO THE MANSION YOU CAN STROLL + {"dmjp455e2i671nlj7m6bj4id6dmj1ni246ie6g0ni2d96bb", 0, VOLATILE_FLAG_70_SANDCASTLE_PUZZLE_COMPLETE_MMM + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // THE JIGGYS DONE SO TAKE A TRIP ON TO THE RUSTY BUCKET SHIP + {"dmjp455e2l6ij26dn8jnd94r6id6dmj9g2dekg08jd2m4r", 0, VOLATILE_FLAG_71_SANDCASTLE_PUZZLE_COMPLETE_RBB + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // CLICK CLOCK WOOD IS LOTS OF FUN GO ON IN THE JIGGYS DONE + {"0b4080b608766l42b6d26ccgi566i4idmjp455e2l6ij", 0, VOLATILE_FLAG_72_SANDCASTLE_PUZZLE_COMPLETE_CCC + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // LOTS OF GOES WITH MANY BANJOS + {"b6d26c56j274dm1nieknip62", 0, VOLATILE_FLAG_73_SANDCASTLE_INFINITE_LIVES + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // BANJO BEGS FOR PLENTY OF EGGS + {"knip6kj52c69rbjide6cj552", 0, VOLATILE_FLAG_74_SANDCASTLE_INFINITE_EGGS + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // NOW YOU CAN FLY HIGH IN THE SKY + {"i67e6g0nicbem45m4idmj28e", 0, VOLATILE_FLAG_75_SANDCASTLE_INFINITE_RED_FEATHERS + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // A GOLDEN GLOW TO PROTECT BANJO + {"n56blji5b67d6r96dj0dknip6", 0, VOLATILE_FLAG_76_SANDCASTLE_INFINITE_GOLD_FEATHERS + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // BOTH PIPES ARE THERE TO CLANKERS LAIR + {"k6dmr4rj2n9jdmj9jd60bni8j92bn49", 0, VOLATILE_FLAG_7D_SANDCASTLE_RAISE_PIPES_TO_CC + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // YOULL CEASE TO GRIPE WHEN UP GOES A PIPE + {"e6gbb0jn2jd6594rj7mjigr56j2nr4rj", 0, VOLATILE_FLAG_7E_SANDCASTLE_RAISE_PIPE_TO_BRENTILDA + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // THERES NOWHERE DANKER THAN IN WITH CLANKER + {"dmj9j2i67mj9jlni8j9dmni4i74dm0bni8j9", 0, VOLATILE_FLAG_7F_SANDCASTLE_OPEN_CC + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // YOULL BE AMAZED NOW THE SWAMP PICCY GRILLE IS RAISED + {"e6gbbkjn1n3jli67dmj27n1rr400e594bbj429n42jl", 0, VOLATILE_FLAG_80_SANDCASTLE_REMOVE_GRILL_NEAR_BGS_JIGGY + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // DONT DESPAIR THE TREE JIGGY PODIUM IS NOW THERE + {"l6idlj2rn49dmjd9jjp455er6l4g142i67dmj9j", 0, VOLATILE_FLAG_81_SANDCASTLE_CCC_JIGGY_PODIUM + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // SHES AN UGLY BAT SO LETS REMOVE HER GRILLE AND HAT + {"2mj2nig5beknd26bjd29j16ajmj9594bbjnilmnd", 0, VOLATILE_FLAG_82_SANDCASTLE_REMOVE_GRILL_AND_HAT_FROM_STATUE + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // ITS YOUR LUCKY DAY AS THE ICE BALL MELTS AWAY + {"4d2e6g9bg08elnen2dmj40jknbb1jbd2n7ne", 0, VOLATILE_FLAG_83_SANDCASTLE_REMOVE_ICE + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // NOW IN TO THE SWAMP YOU CAN STOMP + {"i674id6dmj27n1re6g0ni2d61r", 0, VOLATILE_FLAG_84_SANDCASTLE_OPEN_BGS + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // THEY CAUSE TROUBLE BUT NOW THEYRE RUBBLE + {"dmje0ng2jd96gkbjkgdi67dmje9j9gkkbj", 0, VOLATILE_FLAG_85_SANDCASTLE_REMOVE_BREAKABLE_WALLS + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // YOULL BE GLAD TO SEE THE SHOCK JUMP PAD + {"e6gbbkj5bnld62jjdmj2m608pg1rrnl", 0, VOLATILE_FLAG_86_SANDCASTLE_SHOCKSPRING_JUMP_UNLOCKED + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // THIS COMES IN HANDY TO OPEN SOMEWHERE SANDY + {"dm42061j24imniled66rji261j7mj9j2nile", 0, VOLATILE_FLAG_87_SANDCASTLE_OPEN_GV + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // WEBS STOP YOUR PLAY SO TAKE THEM AWAY + {"7jk22d6re6g9rbne26dn8jdmj1n7ne", 0, VOLATILE_FLAG_88_SANDCASTLE_REMOVE_WEBS + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // GRUNTY WILL CRY NOW YOUVE SMASHED HER EYE + {"59gide74bb09ei67e6gaj21n2mjlmj9jej", 0, VOLATILE_FLAG_89_SANDCASTLE_REMOVE_GLASS_EYE + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // YOU WONT BE SAD NOW YOU CAN USE THE FLY PAD + {"e6g76idkj2nli67e6g0nig2jdmjcbernl", 0, VOLATILE_FLAG_8A_SANDCASTLE_FLIGHT_UNLOCKED + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // NOW YOU CAN GO AND TRUDGE IN THE SNOW + {"i67e6g0ni56nild9gl5j4idmj2i67", 0, VOLATILE_FLAG_8B_SANDCASTLE_OPEN_FP + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // THE MANSION OF GHOSTS ARE NOW YOUR HOSTS + {"dmj1ni246i6c5m62d2n9ji67e6g9m62d2", 0, VOLATILE_FLAG_8C_SANDCASTLE_OPEN_MMM + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // YOU WONT HAVE TO WAIT NOW THERES NO CRYPT GATE + {"e6g76idmnajd67n4di67dmj9j2i609erd5ndj", 0, VOLATILE_FLAG_8D_SANDCASTLE_REMOVE_CRYPT_GATE + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // THIS SHOULD GET RID OF THE CRYPT COFFIN LID + {"dm422m6gbl5jd94l6cdmj09erd06cc4ib4l", 0, VOLATILE_FLAG_8E_SANDCASTLE_REMOVE_CRYPT_COFFIN_LID + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // UP YOU GO WITHOUT A HITCH UP TO THE WATER LEVEL SWITCH + {"gre6g5674dm6gdnm4d0mgrd6dmj7ndj9bjajb274d0m", 0, VOLATILE_FLAG_8F_SANDCASTLE_REMOVE_GRATE_NEAR_WATER_SWITCH + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // WHY NOT TAKE A TRIP INSIDE GRUNTYS RUSTY SHIP + {"7mei6ddn8jnd94r4i24lj59gide29g2de2m4r", 0, VOLATILE_FLAG_90_SANDCASTLE_OPEN_RBB + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // THE GRILLE GOES BOOM TO THE SHIP PICTURE ROOM + {"dmj594bbj56j2k661d6dmj2m4rr40dg9j9661", 0, VOLATILE_FLAG_91_SANDCASTLE_REMOVE_GRILL_NEAR_RBB_JIGGY + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // ONCE IT SHONE BUT THE LONG TUNNEL GRILLE IS GONE + {"6i0j4d2m6ijkgddmjb6i5dgiijb594bbj4256ij", 0, VOLATILE_FLAG_92_SANDCASTLE_REMOVE_TUNNEL_GRILL_NEAR_RBB_JIGGY + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // THIS ONES GOOD AS YOU CAN ENTER THE WOOD + {"dm426ij2566ln2e6g0nijidj9dmj766l", 0, VOLATILE_FLAG_93_SANDCASTLE_OPEN_CCW + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // AN ENERGY BAR TO GET YOU FAR + {"nijij95ekn9d65jde6gcn9", 0, VOLATILE_FLAG_94_SANDCASTLE_INFINITE_HEALTH + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // DONT BE A DUMBO GO SEE MUMBO + {"l6idkjnlg1k6562jj1g1k6", 0, VOLATILE_FLAG_95_SANDCASTLE_INFINTE_MUMBO_TOKENS + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + + // GIVE THE BEAR LOTS OF AIR + {"54ajdmjkjn9b6d26cn49", 0, VOLATILE_FLAG_96_SANDCASTLE_INFINITE_AIR + VOLATILE_FLAG_CHEAT_OFFSET, 00}, + NULL }; static u8 sLastFloorTileHitCorret = 0; // 0 = "initial", 1 = incorrect, 2 = correct static BannedCheatCodeRange sBannedCheatCodeRanges[4] = { - {VOLATILE_FLAG_66_SANDCASTLE_OPEN_DOOR_TWO + VOLATILE_FLAG_CHEAT_OFFSET, VOLATILE_FLAG_6B_SANDCASTLE_OPEN_DOOR_SEVEN + VOLATILE_FLAG_CHEAT_OFFSET}, - {VOLATILE_FLAG_6C_SANDCASTLE_PUZZLE_COMPLETE_CC + VOLATILE_FLAG_CHEAT_OFFSET, VOLATILE_FLAG_72_SANDCASTLE_PUZZLE_COMPLETE_CCC + VOLATILE_FLAG_CHEAT_OFFSET}, - {VOLATILE_FLAG_7D_SANDCASTLE_RAISE_PIPES_TO_CC + VOLATILE_FLAG_CHEAT_OFFSET, VOLATILE_FLAG_93_SANDCASTLE_OPEN_CCW + VOLATILE_FLAG_CHEAT_OFFSET}, + { + VOLATILE_FLAG_66_SANDCASTLE_OPEN_DOOR_TWO + VOLATILE_FLAG_CHEAT_OFFSET, + VOLATILE_FLAG_6B_SANDCASTLE_OPEN_DOOR_SEVEN + VOLATILE_FLAG_CHEAT_OFFSET + }, + { + VOLATILE_FLAG_6C_SANDCASTLE_PUZZLE_COMPLETE_CC + VOLATILE_FLAG_CHEAT_OFFSET, + VOLATILE_FLAG_72_SANDCASTLE_PUZZLE_COMPLETE_CCC + VOLATILE_FLAG_CHEAT_OFFSET + }, + { + VOLATILE_FLAG_7D_SANDCASTLE_RAISE_PIPES_TO_CC + VOLATILE_FLAG_CHEAT_OFFSET, + VOLATILE_FLAG_93_SANDCASTLE_OPEN_CCW + VOLATILE_FLAG_CHEAT_OFFSET + }, NULL }; @@ -910,7 +1031,7 @@ static void __code3E30_eraseGameplayDialogCallback(ActorMarker *caller, enum ass { __code3E30_setNumberOfBannedCheatcodesEntered(3); __code3E30_checkSecretCheatCodeIndex(sThirdForbiddenSecretCheatCodeIndex); - gcdialog_showText(ASSET_FBF_TEXT_ERASED_SAVE, 0xC, NULL, NULL, NULL, NULL); + gcdialog_showText(ASSET_FBF_DIALOG_ERASED_SAVE, 0xC, NULL, NULL, NULL, NULL); gameFile_clear(func_802C5A30()); gameFile_8033CFD4(func_802C5A30()); func_802C5A3C(-1); @@ -945,11 +1066,11 @@ static void __code3E30_checkIfBannedCheatCodeEntered(s32 secret_cheat_code_index __code3E30_setNumberOfBannedCheatcodesEntered(2); __code3E30_checkSecretCheatCodeIndex(secret_cheat_code_index); __code3E30_resetSecretCheatCodeProgress(); - gcdialog_showText(ASSET_FBE_TEXT_CHEATING_ERASE_SAVE_WARNING, 0xC, NULL, NULL, NULL, NULL); + gcdialog_showText(ASSET_FBE_DIALOG_CHEATING_ERASE_SAVE_WARNING, 0xC, NULL, NULL, NULL, NULL); return; case 2: sThirdForbiddenSecretCheatCodeIndex = secret_cheat_code_index; - gcdialog_showText(ASSET_E38_CHEATING_ERASE_SAVE_CONFIRMATION, 0xC, NULL, NULL, __code3E30_eraseGameplayDialogCallback, NULL); + gcdialog_showText(ASSET_E38_DIALOG_CHEATING_ERASE_SAVE_CONFIRMATION, 0xC, NULL, NULL, __code3E30_eraseGameplayDialogCallback, NULL); return; } return; @@ -1068,5 +1189,5 @@ static bool __code3E30_isCurrentSecretCheatCodeCharacter0() bool code_3E30_isSecretCheatCodeRelatedValueEqualToScrambledAddressValue() { - return __code3E30_scrambleAddressForSecretCheatCode() == secretCheatCodeRelatedValue; + return __code3E30_scrambleAddressForSecretCheatCode() == sSecretCheatCodeRelatedValue; } diff --git a/src/core2/ch/bottlesbonus.c b/src/core2/ch/bottlesbonus.c index 65333c30..1ef89412 100644 --- a/src/core2/ch/bottlesbonus.c +++ b/src/core2/ch/bottlesbonus.c @@ -19,7 +19,7 @@ extern void func_803458E4(f32[4], f32[4], f32[4], f32); #define CH_BOTTLES_BONUS_PUZZLE_PIECE_COUNT (CH_BOTTLES_BONUS_PUZZLE_HEIGHT * CH_BOTTLES_BONUS_PUZZLE_WIDTH) /* .extern symbols??? */ -extern u8 D_8037DCC0[7]; +extern u8 gCompletedBottleBonusGames[7]; extern u8 D_8037DCC7; extern u8 D_8037DCC8; extern u8 D_8037DCC9; @@ -422,7 +422,7 @@ void chBottlesBonus_completedPuzzle(void) { Actor *actor; actor = marker_getActor(chBottlesBonusMarker); - D_8037DCC0[chBottleBonusPuzzleIndex] = TRUE; + gCompletedBottleBonusGames[chBottleBonusPuzzleIndex] = TRUE; func_80311714(0); gcdialog_showText(D_803681A0[chBottleBonusPuzzleIndex + 1].text_id, 0x86, actor->position, chBottlesBonusMarker, chBottlesBonus_IncrementPuzzle, NULL); func_80311714(1); @@ -600,7 +600,7 @@ Actor *chBottlesBonus_new(s32 position[3], s32 yaw, ActorInfo *actor_info, u32 f void chBottlesBonus_func_802DEB80(void) { int i; for(i = 0; i < 7; i++){ - D_8037DCC0[i] = 0; + gCompletedBottleBonusGames[i] = 0; } D_8037DCC7 = 0; D_8037DCC8 = 0; diff --git a/src/core2/ch/gameSelect.c b/src/core2/ch/gameSelect.c index 7f26bd00..ce2d2dbe 100644 --- a/src/core2/ch/gameSelect.c +++ b/src/core2/ch/gameSelect.c @@ -83,7 +83,7 @@ s32 mm_hut_smash_count; u32 CH_TREASUREHUNT_PUZZLE_CURRENT_STEP; struct FF_StorageStruct* D_8037DCB8; s32 D_8037DCBC; -u8 D_8037DCC0[7]; // bottle bonus puzzle? +u8 gCompletedBottleBonusGames[7]; // bottle bonus puzzle? u8 D_8037DCC7; u8 D_8037DCC8; u8 D_8037DCC9; diff --git a/src/core2/gc/dialog.c b/src/core2/gc/dialog.c index b83854fe..858888ea 100644 --- a/src/core2/gc/dialog.c +++ b/src/core2/gc/dialog.c @@ -942,11 +942,6 @@ int func_80311174(s32 text_id, s32 arg1, f32 *pos, ActorMarker *marker, void(*ca return 0; } -// arg1 = "person" that says text? -// 0xC = Bottles -// 0xE = Jumbo? -// 0x4 = Gruntilda? -// 0xF = Mr Vile? bool gcdialog_showText(s32 text_id, s32 arg1, f32 *pos, ActorMarker *marker, void(*callback)(ActorMarker *, enum asset_e, s32), void(*arg5)(ActorMarker *, enum asset_e, s32)){ return func_80311174(text_id, arg1, pos, marker, callback, arg5, 0); }