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);
+}
+
+