diff --git a/progress/progress.boss.csv b/progress/progress.boss.csv index 366ecd3..2535acc 100644 --- a/progress/progress.boss.csv +++ b/progress/progress.boss.csv @@ -41,7 +41,7 @@ us,.boss,func_boss_80024524,68,yes us,.boss,func_boss_8002413C,452,no us,.boss,func_boss_8002FEC0,180,yes us,.boss,func_boss_80031AA0,4200,no -us,.boss,func_boss_8002EA7C,1668,no +us,.boss,func_boss_8002EA7C,1668,yes us,.boss,func_boss_8003340C,152,yes us,.boss,func_boss_80030EC4,3036,no us,.boss,func_boss_8002531C,72,yes diff --git a/progress/progress.total.csv b/progress/progress.total.csv index 8872e99..8e0e1ea 100644 --- a/progress/progress.total.csv +++ b/progress/progress.total.csv @@ -4235,7 +4235,7 @@ us,.boss,func_boss_80024524,68,yes us,.boss,func_boss_8002413C,452,no us,.boss,func_boss_8002FEC0,180,yes us,.boss,func_boss_80031AA0,4200,no -us,.boss,func_boss_8002EA7C,1668,no +us,.boss,func_boss_8002EA7C,1668,yes us,.boss,func_boss_8003340C,152,yes us,.boss,func_boss_80030EC4,3036,no us,.boss,func_boss_8002531C,72,yes diff --git a/progress/progress_boss.svg b/progress/progress_boss.svg index fe58a7f..076768d 100644 --- a/progress/progress_boss.svg +++ b/progress/progress_boss.svg @@ -9,7 +9,7 @@ - + @@ -17,7 +17,7 @@ boss - 24.8441% - 24.8441% + 27.1654% + 27.1654% diff --git a/progress/progress_total.svg b/progress/progress_total.svg index 9aea56a..d94f7b4 100644 --- a/progress/progress_total.svg +++ b/progress/progress_total.svg @@ -9,7 +9,7 @@ - + @@ -17,7 +17,7 @@ Donkey Kong 64 (US) - 40.1365% - 40.1365% + 40.2377% + 40.2377% diff --git a/src/boss/KRoolGeneric.c b/src/boss/KRoolGeneric.c index 228bdd9..21d2e8f 100644 --- a/src/boss/KRoolGeneric.c +++ b/src/boss/KRoolGeneric.c @@ -114,6 +114,260 @@ void func_boss_80027A30(Struct80027A30_arg0 *arg0, u8 *arg1) { // Jumptable, 2224 bytes of code #pragma GLOBAL_ASM("asm/nonmatchings/boss/KRoolGeneric/func_boss_80027BA8.s") +extern u8 D_global_asm_8076A0B1; +extern s8 D_global_asm_8076A0B3; + +typedef struct BossUnkPaaD178 { + u8 pad0[0x4]; + s16 unk4; + u8 pad6[0x8 - 0x6]; + s16 unk8[6]; // Unsure of array size + u8 pad14; + u8 unk15; + u8 unk16; + u8 pad17; + u8 unk18[]; +} BossUnkPaaD178; + +typedef struct BossUnkPaaD17C { + u8 unk0; +} BossUnkPaaD17C; + +/* +u8 func_boss_80027BA8(u8 *arg0, u16 arg1, f32 arg2) { + BossUnkPaaD178 *temp_s0; + PlayerAdditionalActorData *temp_v1; + u8 sp2F; + u8 sp2E; + s16 temp_a0; + s32 cutscene; + + temp_v1 = player_pointer->PaaD; + temp_s0 = current_actor_pointer->unk178; + sp2E = FALSE; + sp2F = TRUE; + switch (current_actor_pointer->control_state) { + case 0x54: + sp2F = FALSE; + if (current_actor_pointer->control_state_progress) { + if (func_global_asm_80629148()) { + sp2F = TRUE; + } + } else { + func_global_asm_80629174(); + sp2F = FALSE; + current_actor_pointer->control_state_progress = 1; + } + break; + case 0x5F: + playCutscene(current_actor_pointer, arg0[temp_s0->unk15++], 1); + break; + case 0x5E: + if (is_cutscene_active == 1) { + sp2F = TRUE; + func_global_asm_8061D4E4(temp_v1->unk104); + sp2F = TRUE; + } + D_global_asm_8076A0B3 = 0; + current_actor_pointer->object_properties_bitfield &= ~4; + D_global_asm_8076A0B1 |= 0x10; + temp_s0->unk15++; + temp_s0->unk4 = (arg0[temp_s0->unk15] * 0x1E); + break; + case 0x5D: + temp_s0->unk15++; + sp2F = TRUE; + func_global_asm_8072B324(current_actor_pointer, arg0[temp_s0->unk15]); + sp2F = TRUE; + break; + case 0x5C: + ((BossUnkPaaD17C *)current_actor_pointer->unk17C)->unk0 = arg0[temp_s0->unk15++]; + break; + case 0x5A: + sp2F = TRUE; + loadText(current_actor_pointer, arg0[temp_s0->unk15], arg0[temp_s0->unk15 + 1]); + sp2F = TRUE; + temp_s0->unk15 += 2; + break; + case 0x42: +block_16: + sp2F = sp2F; + func_global_asm_8072AB74(0x42U, D_global_asm_807FDC90->unkA, D_global_asm_807FDC90->unkE, arg1, arg2); + if (func_global_asm_8072D13C(current_actor_pointer->control_state, 0) == 0) { + default: + sp2F = FALSE; + } + break; + case 0x69: + D_global_asm_807FDC90->unk1A |= 0x20; + break; + case 0x6D: + break; + case 0x58: + current_actor_pointer->object_properties_bitfield |= 4; + break; + case 0x59: + current_actor_pointer->object_properties_bitfield &= ~4; + break; + case 0x51: + sp2F = TRUE; + playActorAnimation(current_actor_pointer, arg0[temp_s0->unk15 + 1] + (arg0[temp_s0->unk15] << 8)); + sp2F = TRUE; + temp_s0->unk15 += 2; + break; + case 0x55: + sp2F = FALSE; + if (current_actor_pointer->control_state_progress == 0) { + temp_s0->unk8[0] = arg0[temp_s0->unk15 + 1] + (arg0[temp_s0->unk15] << 8); + temp_s0->unk15 += 2; + current_actor_pointer->control_state_progress = 1; + } else { + temp_s0->unk8[0]--; + if (temp_s0->unk8[0] == 0) { + sp2F = TRUE; + } + } + break; + case 0x23: + if (current_actor_pointer->control_state_progress == 0) { + temp_s0->unk15++; + temp_s0->unk8[0] = arg0[temp_s0->unk15]; + current_actor_pointer->control_state_progress = 1; + sp2F = FALSE; + func_global_asm_8072B324(current_actor_pointer, D_global_asm_807FDC9C->unkD); + sp2F = sp2F; + } else { + sp2F = FALSE; + func_global_asm_8072AB74(0x23U, D_global_asm_807FDC90->unk4->x_position, D_global_asm_807FDC90->unk4->z_position, arg1, arg2); + sp2F = FALSE; + temp_s0->unk8[0]--; + if ((temp_s0->unk8[0] == 0) || (temp_v1->unk1F0 & 0x80000)) { + temp_v1->unk1F0 &= 0xFFF7FFFF; + sp2F = TRUE; + func_global_asm_8072B324(current_actor_pointer, D_global_asm_807FDC9C->unkC); + sp2F = TRUE; + } + } + break; + case 0x52: + if (!(current_actor_pointer->unk6A & 1)) { + sp2F = FALSE; + } + break; + case 0x53: + if (current_actor_pointer->control_state_progress == 0) { + sp2F = FALSE; + } + break; + case 0x4F: + temp_s0->unk16 = temp_s0->unk15; + break; + case 0x50: + temp_s0->unk15 = temp_s0->unk16; + break; + case 0x66: + if (D_global_asm_807FDC90->unk1A & 8) { + temp_s0->unk15 = temp_s0->unk16; + } + break; + case 0x63: + if (temp_s0->unk8[arg0[temp_s0->unk15]] != 0) { + temp_s0->unk8[arg0[temp_s0->unk15]]--; + sp2F = FALSE; + break; + } + temp_s0->unk15++; + break; + case 0x62: + temp_s0->unk8[arg0[temp_s0->unk15]] = arg0[temp_s0->unk15 + 1]; + temp_s0->unk15 += 2; + sp2E = TRUE; + break; + case 0x64: + temp_s0->unk18[arg0[temp_s0->unk15]] = arg0[temp_s0->unk15 + 1]; + temp_s0->unk15 += 2; + sp2E = TRUE; + break; + case 0x68: + D_global_asm_807FDC90->unk1A &= 0xFFEF; + sp2E = TRUE; + break; + case 0x65: + D_global_asm_807FDC90->unk2C = arg0[temp_s0->unk15]++; + sp2E = TRUE; + break; + case 0x67: + func_boss_80027950(temp_s0, arg0); + sp2F = FALSE; + current_actor_pointer->control_state = 0x42; + current_actor_pointer->control_state_progress = 0; + goto block_16; + case 0x4C: + func_boss_80027A30(temp_s0, arg0); + sp2F = FALSE; + current_actor_pointer->control_state = 0x42; + current_actor_pointer->control_state_progress = 0; + goto block_16; + case 0x4B: + D_global_asm_807FDC90->unk25++; + if (arg0[temp_s0->unk15 + 1] < D_global_asm_807FDC90->unk25) { + D_global_asm_807FDC90->unk25 = arg0[temp_s0->unk15]; + } + temp_s0->unk15 += 2; + sp2F = FALSE; + current_actor_pointer->control_state = 0x42; + current_actor_pointer->control_state_progress = 0; + goto block_16; + case 0x41: + sp2F = FALSE; + D_global_asm_807FDC90->unk25 = arg0[temp_s0->unk15++]; + current_actor_pointer->control_state = 0x42; + current_actor_pointer->control_state_progress = 0; + goto block_16; + case 0x49: + case 0x4A: + sp2F = FALSE; + switch (current_actor_pointer->control_state_progress) { + case 0: + current_actor_pointer->shadow_opacity -= 0xA; + if (current_actor_pointer->shadow_opacity < 0) { + current_actor_pointer->shadow_opacity = 0; + current_actor_pointer->control_state_progress += 1; + } + break; + case 1: + if (current_actor_pointer->control_state == 0x49) { + D_global_asm_807FDC90->unk25 = arg0[temp_s0->unk15++]; + } else { + sp2F = FALSE; + func_boss_80027950(temp_s0, arg0); + } + sp2F = FALSE; + func_global_asm_8072D13C(0x49U, 0); + sp2F = FALSE; + current_actor_pointer->x_position = (f32) D_global_asm_807FDC90->unkA; + current_actor_pointer->z_position = (f32) D_global_asm_807FDC90->unkE; + current_actor_pointer->control_state_progress++; + break; + case 2: + current_actor_pointer->shadow_opacity += 0xA; + if (current_actor_pointer->shadow_opacity >= 0x100) { + current_actor_pointer->shadow_opacity = 0xFF; + sp2F = TRUE; + } + break; + } + break; + } + if (sp2F) { + current_actor_pointer->control_state = arg0[temp_s0->unk15++]; + current_actor_pointer->control_state_progress = 0; + } + return sp2E; +} +*/ + + void func_boss_80028458(void) { func_global_asm_805FF8F8(); } diff --git a/src/boss/KRoolLanky.c b/src/boss/KRoolLanky.c index 1b7d153..1607a90 100644 --- a/src/boss/KRoolLanky.c +++ b/src/boss/KRoolLanky.c @@ -85,5 +85,158 @@ void func_boss_8002EA14(void) { func_global_asm_8072B324(current_actor_pointer, D_global_asm_807FDC9C->unkC + (sp1C->unk14 * 0xA) + 0xF); } -// Jumptable -#pragma GLOBAL_ASM("asm/nonmatchings/boss/KRoolLanky/func_boss_8002EA7C.s") +u8 func_boss_80027BA8(u8 *, u16, f32); +u8 func_global_asm_8061CB98(u8); +s32 func_global_asm_8072881C(s32, s32 *); +void func_global_asm_8072A450(void); +extern u8 *D_boss_80035A80[4]; + +typedef struct KRoolLankyAAD178 { + Actor *unk0; + u8 pad4[0x14 - 0x4]; + u8 unk14; + u8 unk15; +} KRoolLankyAAD178; + +void func_boss_8002EA7C(void) { + KRoolLankyAAD178 *temp_t0; + u8 *sp28; + + temp_t0 = current_actor_pointer->unk178; + sp28 = D_boss_80035A80[temp_t0->unk14]; + initializeCharacterSpawnerActor(); + func_boss_80028878(sp28); + if (!(current_actor_pointer->object_properties_bitfield & 0x10)) { + current_actor_pointer->unk146_s16 = 1; + current_actor_pointer->control_state = 0x1E; + current_actor_pointer->control_state_progress = 0; + current_actor_pointer->unkCC = 1; + func_global_asm_80724CA4(2, 1); + func_boss_8002DC60(); + current_actor_pointer->y_acceleration = 0.0f; + } + if ((player_pointer->control_state == 0x48) && !(D_global_asm_807FDC90->unk1A & 0x8000)) { + playCutscene(current_actor_pointer, 0, 1); + D_global_asm_807FDC90->unk1A |= 0x8000; + } + if ((func_global_asm_8061CB98(0) == 0) && ((func_global_asm_8061CB98(1) == 0)) && ((player_pointer->control_state != 0x67) || (current_actor_pointer->control_state != 0x42))) { + switch (current_actor_pointer->control_state) { + case 0x2B: + switch (current_actor_pointer->control_state_progress) { + case 0: + func_global_asm_8072B324(current_actor_pointer, 0); + playCutscene(player_pointer, 9, 1); + func_boss_8002E9B8(0x3F5, 0x679); + current_actor_pointer->control_state_progress += 1; + break; + case 2: + func_global_asm_8072B324(current_actor_pointer, D_global_asm_807FDC9C->unkD); + func_boss_8002E9B8(0x3F4, 0x678); + current_actor_pointer->control_state_progress += 1; + break; + case 3: + if (D_global_asm_807FBB70.unk1B != 0) { + current_actor_pointer->control_state = 0x31; + current_actor_pointer->control_state_progress = 0; + } else if (D_global_asm_807FBB70.unk200 == 2) { + func_boss_8002E7A0(NULL); + current_actor_pointer->control_state = 0x2C; + current_actor_pointer->control_state_progress = 0; + } + func_global_asm_8072AB74(0x23U, D_global_asm_807FDC94->x_position, D_global_asm_807FDC94->z_position, 0U, 0.0f); + break; + } + break; + case 0x2C: + if (current_actor_pointer->control_state_progress == 0) { + setAction(0x36, current_actor_pointer, 0U); + func_boss_8002EA14(); + current_actor_pointer->control_state = 0x42; + current_actor_pointer->control_state_progress = 0; + } + break; + case 0x1E: + temp_t0->unk14 = 0U; + temp_t0->unk15 = 0U; + current_actor_pointer->control_state = sp28[temp_t0->unk15++]; + current_actor_pointer->control_state_progress = 0; + break; + case 0x0: + switch (current_actor_pointer->control_state_progress) { + case 0: + func_boss_8002E9B8(0x3F5, 0x679); + current_actor_pointer->control_state_progress++; + break; + case 2: + func_boss_8002EA14(); + current_actor_pointer->control_state = sp28[temp_t0->unk15++]; + current_actor_pointer->control_state_progress = 0; + func_global_asm_8066EB40(player_pointer, player_pointer->ledge_info_pointer->unkC * 2); + func_global_asm_8066E5F8(player_pointer, 6, 1U); + func_global_asm_8066E5F8(player_pointer, 7, 1U); + func_global_asm_8066E5F8(player_pointer, 8, 1U); + func_global_asm_8066E5F8(player_pointer, 9, 1U); + func_global_asm_8066E5F8(player_pointer, 0xA, 1U); + func_global_asm_8066E5F8(player_pointer, 0xB, 1U); + break; + } + break; + case 0x31: + switch (current_actor_pointer->control_state_progress) { + case 0: + if (temp_t0->unk14 == 3) { + current_actor_pointer->control_state = 0x37; + current_actor_pointer->control_state_progress = 0; + } else { + playActorAnimation(current_actor_pointer, 0x3F2); + playActorAnimation(temp_t0->unk0, 0x3F1); + func_global_asm_8072B324(current_actor_pointer, 0); + current_actor_pointer->control_state_progress += 1; + } + break; + case 1: + func_global_asm_8072AB74(0U, 0.0f, 0.0f, 0x310U, 0.0f); + break; + case 2: + func_boss_8002E7A0(NULL); + func_boss_8002EA14(); + temp_t0->unk15 = 0U; + temp_t0->unk14++; + sp28 = D_boss_80035A80[temp_t0->unk14]; + current_actor_pointer->control_state = sp28[temp_t0->unk15++]; + current_actor_pointer->control_state_progress = 0; + break; + } + break; + case 0x37: + switch (current_actor_pointer->control_state_progress) { + case 0: + deleteActor(temp_t0->unk0); + playActorAnimation(current_actor_pointer, 0); + playCutscene(current_actor_pointer, 5, 1); + current_actor_pointer->control_state_progress += 1; + break; + case 1: + if (func_global_asm_80629148() != 0) { + func_global_asm_805FF158(0U); + func_global_asm_805FF378(MAP_KROOL_FIGHT_TINY_PHASE, 0); + current_actor_pointer->control_state_progress += 1; + } + break; + } + break; + default: + func_boss_80027BA8(sp28, 0x10, 0.0f); + break; + } + } else if (current_actor_pointer->animation_state->unk64 == 0x406) { + func_global_asm_80614D00(current_actor_pointer, 0.0f, 0.0f); + } + func_global_asm_8072A450(); + if (func_global_asm_8072881C(0, &D_global_asm_807FDC90->unk28) != 0) { + func_global_asm_8072881C(0x81, &D_global_asm_807FDC90->unk28); + } + renderActor(current_actor_pointer, 0U); +} + +