// Enemy AI - inc. ki-hunter #include "ida_types.h" #include "variables.h" #include "sm_rtl.h" #include "funcs.h" #include "enemy_types.h" #define g_off_A890DA ((uint16*)RomFixedPtr(0xa890da)) #define g_word_A8A0A7 (*(uint16*)RomFixedPtr(0xa8a0a7)) #define g_word_A8A0A9 (*(uint16*)RomFixedPtr(0xa8a0a9)) #define g_word_A8A0AB (*(uint16*)RomFixedPtr(0xa8a0ab)) #define g_word_A8A0AD (*(uint16*)RomFixedPtr(0xa8a0ad)) #define g_word_A8A0B3 (*(uint16*)RomFixedPtr(0xa8a0b3)) #define g_word_A8A0B5 (*(uint16*)RomFixedPtr(0xa8a0b5)) #define g_word_A8A0B7 (*(uint16*)RomFixedPtr(0xa8a0b7)) #define g_word_A8A0B9 (*(uint16*)RomFixedPtr(0xa8a0b9)) #define g_word_A8A0BB (*(uint16*)RomFixedPtr(0xa8a0bb)) #define g_word_A8A0BD (*(uint16*)RomFixedPtr(0xa8a0bd)) #define g_word_A8A0C3 (*(uint16*)RomFixedPtr(0xa8a0c3)) #define g_word_A8A0C5 (*(uint16*)RomFixedPtr(0xa8a0c5)) #define g_off_A8A097 ((uint16*)RomFixedPtr(0xa8a097)) #define kNorfairLavaMan_Palette ((uint16*)RomFixedPtr(0xa8ac1c)) #define g_word_A8AF79 ((uint16*)RomFixedPtr(0xa8af79)) #define g_word_A8AF55 ((uint16*)RomFixedPtr(0xa8af55)) #define g_off_A8AF67 ((uint16*)RomFixedPtr(0xa8af67)) #define kBeetom_Ilist_B74E ((uint16*)RomFixedPtr(0xa8b74e)) #define g_off_A8C599 ((uint16*)RomFixedPtr(0xa8c599)) #define g_off_A8CC30 ((uint16*)RomFixedPtr(0xa8cc30)) #define g_off_A8E380 ((uint16*)RomFixedPtr(0xa8e380)) #define g_off_A8E682 ((uint16*)RomFixedPtr(0xa8e682)) #define g_off_A8E688 ((uint16*)RomFixedPtr(0xa8e688)) #define g_word_A8E7CC ((uint16*)RomFixedPtr(0xa8e7cc)) #define g_off_A8F3B0 ((uint16*)RomFixedPtr(0xa8f3b0)) static const int16 g_word_A890CA[4] = { -8, 8, 0, 0 }; static const int16 g_word_A890D2[4] = { 0, 0, -8, 8 }; static const uint16 g_word_A89050 = 0x80; static const uint16 g_word_A89052 = 0xb0; static const uint16 g_word_A89054 = 0x80; static const uint16 g_word_A89056 = 0x80; static const uint16 g_word_A89A9C = 0x10; static const uint16 g_word_A89A9E = 0x40; static const uint16 g_word_A89AA0 = 0x1800; static const uint16 g_word_A89AA2 = 1; static const uint16 g_word_A89AA4 = 0x78; static const uint16 g_word_A89AA6 = 0x78; static const uint16 g_word_A89AA8[18] = { 0xffc0, 0xffc0, 0, 0xffc0, 0x40, 0, 0xffc0, 0, 0, 0, 0x40, 0, 0xffc0, 0x40, 0, 0x40, 0x40, 0x40 }; static const uint16 g_word_A89ACC[17] = { 1, 8, 1, 8, 1, 7, 1, 7, 2, 6, 2, 6, 3, 5, 3, 5, 0xffff }; static const uint16 kWreckedShipGhost_Palette[16] = { 0x3800, 0x57ff, 0x42f7, 0x929, 0xa5, 0x4f5a, 0x36b5, 0x2610, 0x1dce, 0x1df, 0x1f, 0x18, 0xa, 0x6b9, 0xea, 0x45 }; static const uint16 g_word_A89D32 = 1; static const uint16 g_word_A89D34 = 1; static const int16 g_word_A8C277[3] = { -12, -16, -20 }; static const int16 g_word_A8C27D[3] = { -20, -16, -12 }; static const uint16 g_word_A8C19F = 0x40; static const uint16 g_word_A8C1A1[12] = { 0, 1, 2, 3, 2, 1, 0, 0xffff, 0xfffe, 0xfffd, 0xfffe, 0xffff }; static const uint16 g_word_A8C1B9 = 0; static const uint16 g_word_A8C1BB = 0; static const uint16 g_word_A8C1BD = 0; static const uint16 g_word_A8C1BF = 0; static const uint16 g_word_A8C1C1 = 1; static const uint16 g_word_A8C1C3 = 0; static const uint16 g_word_A8C1C5 = 0xffff; static const uint16 g_word_A8C1C7 = 0x8000; static const int16 g_word_A8CCC1[31] = { 0x1f, 0x18, 0xf, 8, 0x40, 0x18, 0xf, 8, 0x1f, 0x10, 0xf, 8, 0x1f, 0x18, 0x10, 8, 0x1f, 0x18, 0xf, 0x40, 0xf, 8, 0x1f, 0x18, 0x10, 0x18, 0xf, 8, 0x1f, 0x10, -1, }; static const int16 g_word_A8D871[10] = { 0xc0, 0xe0, 0, 0x20, 0x40, 0x40, 0x60, 0x80, 0xa0, 0xc0, }; static const int16 g_word_A8D885[8] = { 0x3ff, 0x4ff, 0x5ff, 0x6ff, 0x7ff, 0x8ff, 0x9ff, 0xaff, }; static const int16 g_word_A8D895[26] = { 3, 1, 4, 1, 5, 2, 6, 2, 7, 2, 8, 3, 9, 3, 0xa, 4, 0xb, 4, 0xc, 5, 0xd, 5, 0xe, 6, 0xf, 6, }; static const uint16 g_word_A8DCC7 = 0x50; static const uint16 g_word_A8DCCB = 0x70; static const uint16 g_word_A8F180 = 0x60; static const uint16 g_word_A8F182 = 0xe000; static const uint16 g_word_A8F184 = 0; static const uint8 g_byte_A8F186 = 0x30; void Enemy_GrappleReact_NoInteract_A8(void) { // 0xA88000 SwitchEnemyAiToMainAi(); } void Enemy_GrappleReact_KillEnemy_A8(void) { // 0xA8800A EnemyGrappleDeath(); } void Enemy_GrappleReact_CancelBeam_A8(void) { // 0xA8800F Enemy_SwitchToFrozenAi(); } void Enemy_GrappleReact_SamusLatchesNoInvinc_A8(void) { // 0xA88014 SamusLatchesOnWithGrappleNoInvinc(); } void Enemy_GrappleReact_HurtSamus_A8(void) { // 0xA8801E SamusHurtFromGrapple(); } void Enemy_NormalTouchAI_A8(void) { // 0xA88023 NormalEnemyTouchAi(); } void Enemy_NormalShotAI_A8(void) { // 0xA8802D NormalEnemyShotAi(); } void Enemy_NormalPowerBombAI_A8(void) { // 0xA88037 NormalEnemyPowerBombAi(); } void Enemy_NormalFrozenAI_A8(void) { // 0xA88041 NormalEnemyFrozenAI(); } const uint16 *MiniDraygon_Instr_2(uint16 k, const uint16 *jp) { // 0xA8878F QueueSfx2_Max6(0x5E); return jp; } const uint16 *MiniDraygon_Instr_1(uint16 k, const uint16 *jp) { // 0xA8879B if (gEnemySpawnData(cur_enemy_index)[30].cause_of_death == addr_kMiniDraygon_Ilist_870B) Get_MiniDraygon(cur_enemy_index)->mdn_var_F = -8; else Get_MiniDraygon(cur_enemy_index)->mdn_var_F = 8; return jp; } const uint16 *MiniDraygon_Instr_3(uint16 k, const uint16 *jp) { // 0xA887B6 Enemy_MiniDraygon *E = Get_MiniDraygon(cur_enemy_index); if (gEnemySpawnData(cur_enemy_index)[30].cause_of_death == addr_kMiniDraygon_Ilist_870B) { ++E->mdn_var_F; } else { --E->mdn_var_F; } return jp; } const uint16 *MiniDraygon_Instr_4(uint16 k, const uint16 *jp) { // 0xA887CB Enemy_MiniDraygon *E = Get_MiniDraygon(cur_enemy_index); E->mdn_var_0C = 0; E->mdn_var_0B = 0; E->mdn_var_C = FUNC16(MiniDraygon_Func_8); return jp; } void MiniDraygon_Init(void) { // 0xA887E0 Enemy_MiniDraygon *E = Get_MiniDraygon(cur_enemy_index); if (E->mdn_parameter_1) { MiniDraygon_Func_2(); E->base.layer = 4; } else { MiniDraygon_Func_1(); uint16 v2 = 8 * LOBYTE(E->mdn_parameter_2); int v3 = v2 >> 1; E->mdn_var_04 = kCommonEnemySpeeds_Linear[v3]; E->mdn_var_03 = kCommonEnemySpeeds_Linear[v3 + 1]; E->mdn_var_06 = kCommonEnemySpeeds_Linear[v3 + 2]; E->mdn_var_05 = kCommonEnemySpeeds_Linear[v3 + 3]; E->mdn_var_E = HIBYTE(Get_MiniDraygon(v2)->mdn_parameter_2) >> 1; } E->mdn_var_00 = 0; E->mdn_var_01 = 0; E->mdn_var_C = FUNC16(MiniDraygon_Func_4); } void MiniDraygon_Func_1(void) { // 0xA88838 Get_MiniDraygon(cur_enemy_index)->mdn_var_B = (GetSamusEnemyDelta_X(cur_enemy_index) & 0x8000) == 0; Enemy_MiniDraygon *E = Get_MiniDraygon(cur_enemy_index); E->mdn_var_02 = addr_kMiniDraygon_Ilist_86A7; if (E->mdn_var_B) E->mdn_var_02 = addr_kMiniDraygon_Ilist_870B; MiniDraygon_Func_12(); } void MiniDraygon_Func_2(void) { // 0xA88866 int v0 = cur_enemy_index >> 1; uint16 v1 = enemy_drawing_queue_sizes[v0 + 1]; Enemy_MiniDraygon *E = Get_MiniDraygon(cur_enemy_index); E->mdn_var_B = v1; if (v1) { E->base.x_pos = enemy_drawing_queue[v0 + 91] + 4; E->base.y_pos = enemy_drawing_queue[v0 + 93] + 10; E->mdn_var_02 = addr_kMiniDraygon_Ilist_8727; } else { E->base.x_pos = enemy_drawing_queue[v0 + 91] - 4; E->base.y_pos = enemy_drawing_queue[v0 + 93] + 10; E->mdn_var_02 = addr_kMiniDraygon_Ilist_86C3; } MiniDraygon_Func_12(); } void EvirProjectile_Init(void) { // 0xA888B0 Enemy_MiniDraygon *E = Get_MiniDraygon(cur_enemy_index); E->mdn_var_02 = addr_kMiniDraygon_Ilist_876F; MiniDraygon_Func_12(); int v2 = cur_enemy_index >> 1; E->base.palette_index = enemy_drawing_queue[v2 + 73]; E->base.vram_tiles_index = enemy_drawing_queue[v2 + 74]; MiniDraygon_Func_3(); E->mdn_var_01 = 0; E->mdn_var_0C = 0; E->mdn_var_0B = 0; E->mdn_var_F = 0; E->mdn_var_C = FUNC16(MiniDraygon_Func_8); } void MiniDraygon_Func_3(void) { // 0xA888E5 int v0 = cur_enemy_index >> 1; uint16 v1 = enemy_drawing_queue[v0 + 83]; Enemy_MiniDraygon *E = Get_MiniDraygon(cur_enemy_index); E->mdn_var_B = v1; if (v1) E->base.x_pos = enemy_drawing_queue[v0 + 59] + 4; else E->base.x_pos = enemy_drawing_queue[v0 + 59] - 4; E->base.y_pos = enemy_drawing_queue[v0 + 61] + 18; } void CallMiniDraygonFunc(uint32 ea) { switch (ea) { case fnMiniDraygon_Func_4: MiniDraygon_Func_4(); return; case fnMiniDraygon_Func_8: MiniDraygon_Func_8(); return; case fnMiniDraygon_Func_9: MiniDraygon_Func_9(); return; case fnMiniDraygon_Func_10: MiniDraygon_Func_10(); return; default: Unreachable(); } } void MiniDraygon_Main(void) { // 0xA8891B Enemy_MiniDraygon *E = Get_MiniDraygon(cur_enemy_index); CallMiniDraygonFunc(E->mdn_var_C | 0xA80000); } void MiniDraygon_Func_4(void) { // 0xA88922 if (Get_MiniDraygon(cur_enemy_index)->mdn_parameter_1) MiniDraygon_Func_6(); else MiniDraygon_Func_5(); } void MiniDraygon_Func_5(void) { // 0xA88933 if (!Get_MiniDraygon(cur_enemy_index + 128)->mdn_var_0C) MiniDraygon_Func_1(); Enemy_MiniDraygon *E = Get_MiniDraygon(cur_enemy_index); if (E->mdn_var_00) { E->base.y_pos += E->mdn_var_04; uint16 y_subpos = E->base.y_subpos; bool v3 = __CFADD__uint16(E->mdn_var_03, y_subpos); uint16 v6 = E->mdn_var_03 + y_subpos; if (v3) ++E->base.y_pos; E->base.y_subpos = v6; } else { E->base.y_pos += E->mdn_var_06; uint16 v2 = E->base.y_subpos; bool v3 = __CFADD__uint16(E->mdn_var_05, v2); uint16 v4 = E->mdn_var_05 + v2; if (v3) ++E->base.y_pos; E->base.y_subpos = v4; } if ((--E->mdn_var_E & 0x8000) != 0) { E->mdn_var_E = HIBYTE(E->mdn_parameter_2); E->mdn_var_00 ^= 1; } } void MiniDraygon_Func_6(void) { // 0xA88997 MiniDraygon_Func_2(); } void EvirProjectile_Main(void) { // 0xA8899E Enemy_MiniDraygon *E = Get_MiniDraygon(cur_enemy_index); if (!E->base.frozen_timer) { if (E->mdn_var_0B) { E->mdn_var_02 = addr_kMiniDraygon_Ilist_876F; MiniDraygon_Func_12(); } else if (E->mdn_var_0C) { E->mdn_var_02 = addr_kMiniDraygon_Ilist_8775; MiniDraygon_Func_12(); } else { MiniDraygon_Func_7(); } } CallMiniDraygonFunc(E->mdn_var_C | 0xA80000); } void MiniDraygon_Func_7(void) { // 0xA889D4 if (IsSamusWithinEnemy_X(cur_enemy_index - 128, 0x80)) { uint16 r22 = -(uint8)(CalculateAngleOfSamusFromEnemy(cur_enemy_index) - 64); Enemy_MiniDraygon *E = Get_MiniDraygon(cur_enemy_index); SetHiLo(&E->mdn_var_07, &E->mdn_var_08, CosineMult8bitFull(r22, 4)); SetHiLo(&E->mdn_var_09, &E->mdn_var_0A, SineMult8bitFull(r22, 4)); E->mdn_var_02 = addr_kMiniDraygon_Ilist_876F; MiniDraygon_Func_12(); E->mdn_var_0B = 1; E->mdn_var_C = FUNC16(MiniDraygon_Func_9); } } void MiniDraygon_Func_8(void) { // 0xA88A34 MiniDraygon_Func_3(); } void MiniDraygon_Func_9(void) { // 0xA88A3B MiniDraygon_Func_11(); Enemy_MiniDraygon *E = Get_MiniDraygon(cur_enemy_index); E->base.x_pos += E->mdn_var_07; uint16 x_subpos = E->base.x_subpos; bool v3 = __CFADD__uint16(E->mdn_var_08, x_subpos); uint16 v4 = E->mdn_var_08 + x_subpos; if (v3) ++E->base.x_pos; E->base.x_subpos = v4; E->base.y_pos += E->mdn_var_09; uint16 y_subpos = E->base.y_subpos; v3 = __CFADD__uint16(E->mdn_var_0A, y_subpos); uint16 v6 = E->mdn_var_0A + y_subpos; if (v3) ++E->base.y_pos; E->base.y_subpos = v6; } void MiniDraygon_Func_10(void) { // 0xA88A78 if (!enemy_drawing_queue[(cur_enemy_index >> 1) + 77]) { Enemy_MiniDraygon *E = Get_MiniDraygon(cur_enemy_index); if (E->mdn_var_0C) { MiniDraygon_Func_3(); E->base.x_pos += E->mdn_var_F; } else { E->mdn_var_02 = addr_kMiniDraygon_Ilist_876F; MiniDraygon_Func_12(); E->mdn_var_0C = 0; E->mdn_var_0B = 0; E->mdn_var_C = FUNC16(MiniDraygon_Func_8); } } } void MiniDraygon_Func_11(void) { // 0xA88AB1 if (EnemyFunc_ADA3(0x100)) { if (!enemy_drawing_queue[(cur_enemy_index >> 1) + 77]) { Enemy_MiniDraygon *E = Get_MiniDraygon(cur_enemy_index); E->mdn_var_0B = 0; E->mdn_var_0C = 1; E->mdn_var_C = FUNC16(MiniDraygon_Func_10); E->mdn_var_0C = 1; E->mdn_var_02 = addr_kMiniDraygon_Ilist_8775; MiniDraygon_Func_12(); } } } void MiniDraygon_Func_12(void) { // 0xA88AE8 Enemy_MiniDraygon *E = Get_MiniDraygon(cur_enemy_index); uint16 mdn_var_02 = E->mdn_var_02; if (mdn_var_02 != E->mdn_var_01) { E->base.current_instruction = mdn_var_02; E->mdn_var_01 = mdn_var_02; E->base.instruction_timer = 1; E->base.timer = 0; } } void MiniDraygon_Touch(void) { // 0xA88B06 Enemy_NormalTouchAI_A8(); MiniDraygon_Func_13(); } void MiniDraygon_Powerbomb(void) { // 0xA88B0C Enemy_NormalPowerBombAI_A8(); MiniDraygon_Func_13(); } void MiniDraygon_Shot(void) { // 0xA88B12 NormalEnemyShotAi(); MiniDraygon_Func_13(); } void MiniDraygon_Func_13(void) { // 0xA88B16 Enemy_MiniDraygon *E = Get_MiniDraygon(cur_enemy_index); Enemy_MiniDraygon *E1 = Get_MiniDraygon(cur_enemy_index + 64); Enemy_MiniDraygon *E2 = Get_MiniDraygon(cur_enemy_index + 128); if (!E->base.health) { E1->base.properties |= 0x200; E2->base.properties |= 0x200; } uint16 frozen_timer = E->base.frozen_timer; if (frozen_timer) { E1->base.frozen_timer = frozen_timer; E1->base.ai_handler_bits |= 4; if (E2->mdn_var_C != FUNC16(MiniDraygon_Func_9)) { E2->base.ai_handler_bits |= 4; E2->base.frozen_timer = E->base.frozen_timer; } } } void MorphBallEye_Init(void) { // 0xA89058 Enemy_MorphBallEye *E = Get_MorphBallEye(cur_enemy_index); E->base.properties |= kEnemyProps_DisableSamusColl; E->base.spritemap_pointer = addr_kSpritemap_Nothing_A8; E->base.instruction_timer = 1; E->base.timer = 0; if ((E->mbee_parameter_2 & 0x8000) != 0) { int v1 = E->mbee_parameter_2 & 0xF; E->base.x_pos += g_word_A890CA[v1]; E->base.y_pos += g_word_A890D2[v1]; E->mbee_var_F = FUNC16(nullsub_244); E->base.current_instruction = g_off_A890DA[v1]; for (int i = 510; i >= 0; i -= 2) *(uint16 *)((uint8 *)&g_word_7E9100 + (uint16)i) = 255; } else { E->mbee_var_F = FUNC16(MorphBallEye_Func_1); if ((E->mbee_parameter_1 & 1) != 0) E->base.current_instruction = addr_stru_A8900E; else E->base.current_instruction = addr_stru_A88FFC; } } void MorphBallEye_Main(void) { // 0xA890E2 if ((collected_items & 4) != 0) { Enemy_MorphBallEye *E = Get_MorphBallEye(cur_enemy_index); CallEnemyPreInstr(E->mbee_var_F | 0xA80000); } } void MorphBallEye_Func_1(uint16 k) { // 0xA890F1 if (IsSamusWithinEnemy_Y(k, g_word_A89054) && IsSamusWithinEnemy_X(k, g_word_A89050)) { Enemy_MorphBallEye *E = Get_MorphBallEye(k); E->mbee_var_E = 32; E->base.instruction_timer = 1; if ((E->mbee_parameter_1 & 1) != 0) E->base.current_instruction = addr_kMorphBallEye_Ilist_9026; else E->base.current_instruction = addr_kMorphBallEye_Ilist_9014; E->mbee_var_F = FUNC16(MorphBallEye_Func_2); } } void MorphBallEye_Func_2(uint16 k) { // 0xA8912E Enemy_MorphBallEye *E = Get_MorphBallEye(k); bool v2 = E->mbee_var_E == 1; bool v3 = (--E->mbee_var_E & 0x8000) != 0; if (v2 || v3) { QueueSfx2_Max6(0x17); SpawnMorphBallEyeBeamHdma(); E->mbee_var_F = FUNC16(MorphBallEye_Func_3); E->mbee_var_D = CalculateAngleFromXY(samus_x_pos - E->base.x_pos, samus_y_pos - E->base.y_pos); } } void MorphBallEye_Func_3(uint16 k) { // 0xA89160 Enemy_MorphBallEye *E = Get_MorphBallEye(k); if (IsSamusWithinEnemy_Y(k, g_word_A89056) && IsSamusWithinEnemy_X(k, g_word_A89052)) { uint16 v3 = CalculateAngleFromXY(samus_x_pos - E->base.x_pos, samus_y_pos - E->base.y_pos); E->mbee_var_D = v3; E->base.current_instruction = ((v3 & 0xF0) >> 2) - 28756; } else { QueueSfx2_Max6(0x71); E->mbee_var_C = 0; E->mbee_var_E = 32; if ((E->mbee_parameter_1 & 1) != 0) E->base.current_instruction = addr_kMorphBallEye_Ilist_9002; else E->base.current_instruction = addr_kMorphBallEye_Ilist_8FF0; E->mbee_var_F = FUNC16(MorphBallEye_Func_4); } E->base.instruction_timer = 1; } void MorphBallEye_Func_4(uint16 k) { // 0xA891CE Enemy_MorphBallEye *E = Get_MorphBallEye(k); bool v2 = E->mbee_var_E == 1; bool v3 = (--E->mbee_var_E & 0x8000) != 0; if (v2 || v3) E->mbee_var_F = FUNC16(MorphBallEye_Func_1); } const uint16 *Fune_Instr_2(uint16 k, const uint16 *jp) { // 0xA89625 QueueSfx2_Max9(0x1F); return jp; } const uint16 *Fune_Instr_6(uint16 k, const uint16 *jp) { // 0xA89631 enemy_projectile_unk1995 = LOBYTE(Get_Fune(cur_enemy_index)->fune_parameter_2); SpawnEnemyProjectileWithGfx(0, cur_enemy_index, addr_stru_86DFBC); return jp; } const uint16 *Fune_Instr_7(uint16 k, const uint16 *jp) { // 0xA8964A enemy_projectile_unk1995 = LOBYTE(Get_Fune(cur_enemy_index)->fune_parameter_2); SpawnEnemyProjectileWithGfx(1, cur_enemy_index, addr_stru_86DFBC); return jp; } const uint16 *Fune_Instr_1(uint16 k, const uint16 *jp) { // 0xA89663 enemy_projectile_unk1995 = LOBYTE(Get_Fune(cur_enemy_index)->fune_parameter_2); SpawnEnemyProjectileWithGfx(0, cur_enemy_index, addr_stru_86DFCA); return jp; } const uint16 *Fune_Instr_4(uint16 k, const uint16 *jp) { // 0xA8967C enemy_projectile_unk1995 = LOBYTE(Get_Fune(cur_enemy_index)->fune_parameter_2); SpawnEnemyProjectileWithGfx(1, cur_enemy_index, addr_stru_86DFCA); return jp; } const uint16 *Fune_Instr_3(uint16 k, const uint16 *jp) { // 0xA89695 Enemy_Fune *E = Get_Fune(cur_enemy_index); E->fune_var_A += 4; E->fune_var_B = FUNC16(Fune_Func_1); if (E->fune_var_D) E->fune_var_B = FUNC16(Fune_Func_2); return jp; } const uint16 *Fune_Instr_5(uint16 k, const uint16 *jp) { // 0xA896B4 Enemy_Fune *E = Get_Fune(cur_enemy_index); E->fune_var_A += 4; E->fune_var_B = FUNC16(Fune_Func_1); if (E->fune_var_D) E->fune_var_B = FUNC16(Fune_Func_2); return jp; } void Fune_Init(void) { // 0xA896E3 Enemy_Fune *E = Get_Fune(cur_enemy_index); E->fune_var_A = addr_off_A896D7; E->fune_var_B = FUNC16(Fune_Func_1); uint16 v1 = E->fune_parameter_1 & 0xF; E->fune_var_D = v1; if (v1) { E->fune_var_A = addr_off_A896DF; E->fune_var_B = FUNC16(Fune_Func_2); } if ((E->fune_parameter_1 & 0xF0) != 0) { ++E->fune_var_A; ++E->fune_var_A; } Fune_Func_4(); E->fune_var_C = HIBYTE(E->fune_parameter_2); E->fune_var_F = HIBYTE(E->fune_parameter_1); E->fune_var_E = 0; } void CallFuneFunc(uint32 ea) { switch (ea) { case fnFune_Func_1: Fune_Func_1(); return; // 0xa89737 case fnFune_Func_2: Fune_Func_2(); return; // 0xa8975c case fnnullsub_247: return; // 0xa8978e case fnnullsub_248: return; // 0xa8978f default: Unreachable(); } } void Fune_Main(void) { // 0xA89730 Enemy_Fune *E = Get_Fune(cur_enemy_index); CallFuneFunc(E->fune_var_B | 0xA80000); } void Fune_Func_1(void) { // 0xA89737 Enemy_Fune *E = Get_Fune(cur_enemy_index); if ((int16)(++E->fune_var_E - E->fune_var_F) >= 0) { E->fune_var_A -= 4; Fune_Func_4(); E->fune_var_B = FUNC16(nullsub_247); E->fune_var_E = 0; } } void Fune_Func_2(void) { // 0xA8975C Enemy_Fune *E = Get_Fune(cur_enemy_index); E->fune_var_00 = E->fune_var_A; if (Fune_Func_3()) { uint16 fune_var_00 = E->fune_var_00; E->fune_var_A = fune_var_00; fune_var_00 -= 4; E->fune_var_00 = fune_var_00; E->fune_var_A = fune_var_00; Fune_Func_4(); E->fune_var_B = FUNC16(nullsub_248); } E->fune_var_A = E->fune_var_00; } uint16 Fune_Func_3(void) { // 0xA89790 Enemy_Fune *E = Get_Fune(cur_enemy_index); return IsSamusWithinEnemy_Y(cur_enemy_index, E->fune_var_C); } void Fune_Func_4(void) { // 0xA8979B Enemy_Fune *E = Get_Fune(cur_enemy_index); E->base.instruction_timer = 1; E->base.timer = 0; E->base.current_instruction = *(uint16 *)RomPtr_A8(E->fune_var_A); } void WreckedShipGhost_Init(void) { // 0xA89AEE Enemy_WreckedShipGhost *E = Get_WreckedShipGhost(cur_enemy_index); E->base.properties |= kEnemyProps_DisableSamusColl | kEnemyProps_Tangible | kEnemyProps_Invisible; E->base.instruction_timer = 1; E->base.timer = 0; E->base.current_instruction = addr_kWreckedShipGhost_Ilist_9A8C; E->wsgt_var_A = FUNC16(WreckedShipGhost_Func_6); E->wsgt_var_B = g_word_A89AA4 + 160; uint16 v2 = swap16(E->base.palette_index); uint16 v3 = 16 * v2 + 256; int n = 16; do { target_palettes[v3 >> 1] = 0; v3 += 2; } while (--n >= 0); } void CallWreckedShipGhost(uint32 ea, uint16 k) { switch (ea) { case fnWreckedShipGhost_Func_1: WreckedShipGhost_Func_1(k); return; case fnWreckedShipGhost_Func_2: WreckedShipGhost_Func_2(k); return; case fnWreckedShipGhost_Func_4: WreckedShipGhost_Func_4(k); return; case fnWreckedShipGhost_Func_5: WreckedShipGhost_Func_5(k); return; case fnWreckedShipGhost_Func_6: WreckedShipGhost_Func_6(k); return; case fnWreckedShipGhost_Func_7: WreckedShipGhost_Func_7(k); return; default: Unreachable(); } } void WreckedShipGhost_Main(void) { // 0xA89B3C Enemy_WreckedShipGhost *E = Get_WreckedShipGhost(cur_enemy_index); CallWreckedShipGhost(E->wsgt_var_A | 0xA80000, cur_enemy_index); } void WreckedShipGhost_Func_1(uint16 k) { // 0xA89B42 WreckedShipGhost_Func_3(k); Enemy_WreckedShipGhost *E = Get_WreckedShipGhost(cur_enemy_index); uint16 v3 = swap16(E->base.palette_index); uint16 v4 = 16 * v3 + 256; int n = 16, v1 = 16; do { int v5 = v4 >> 1; if (sign16((palette_buffer[v5] & 0x1F) - 31)) { palette_buffer[v5] += 1057; --v1; } v4 += 2; } while (--n); if ((int16)(v1 - 16) >= 0) { E->wsgt_var_A = FUNC16(WreckedShipGhost_Func_2); uint16 v7 = swap16(E->base.palette_index); uint16 v8 = 16 * v7 + 256; uint16 v9 = 0; do { target_palettes[v8 >> 1] = kWreckedShipGhost_Palette[v9 >> 1]; v8 += 2; v9 += 2; } while ((int16)(v9 - 32) < 0); } } void WreckedShipGhost_Func_2(uint16 k) { // 0xA89BAD uint16 v4 = WreckedShipGhost_Func_8(); WreckedShipGhost_Func_3(cur_enemy_index); Enemy_WreckedShipGhost *E = Get_WreckedShipGhost(cur_enemy_index); if (!(E->wsgt_var_B | v4)) { E->base.properties &= 0xFAFF; E->wsgt_var_A = FUNC16(WreckedShipGhost_Func_5); E->wsgt_var_00 = E->base.y_pos; E->wsgt_var_B = 1; E->wsgt_var_C = 2; E->wsgt_var_01 = 0; E->wsgt_var_02 = g_word_A89AA2; E->wsgt_var_B = g_word_A89AA6; E->wsgt_var_05 = 4; uint16 v2 = samus_x_pos; E->wsgt_var_06 = samus_x_pos; E->wsgt_var_07 = v2; E->wsgt_var_08 = v2; E->wsgt_var_09 = 12; uint16 v3 = *(uint16 *)((uint8 *)&samus_y_pos + cur_enemy_index); E->wsgt_var_0A = v3; E->wsgt_var_0B = v3; E->wsgt_var_0C = v3; E->wsgt_var_0D = g_word_A89A9E; E->wsgt_var_0E = g_word_A89A9C; } } void WreckedShipGhost_Func_3(uint16 k) { // 0xA89C31 int16 v5; Enemy_WreckedShipGhost *E = Get_WreckedShipGhost(k); uint16 wsgt_var_B = E->wsgt_var_B; if (!wsgt_var_B) goto LABEL_6; uint16 v3; v3 = wsgt_var_B - 1; E->wsgt_var_B = v3; if (!v3) { uint16 wsgt_var_C; wsgt_var_C = E->wsgt_var_C; v5 = g_word_A89ACC[wsgt_var_C >> 1]; if (v5 < 0) { E->wsgt_var_B = 0; E->wsgt_var_C = 0; return; } E->wsgt_var_B = v5; E->wsgt_var_C = wsgt_var_C + 2; if ((wsgt_var_C & 2) == 0) LABEL_6: E->base.properties &= ~kEnemyProps_Invisible; } } void WreckedShipGhost_Func_4(uint16 k) { // 0xA89C69 if (!WreckedShipGhost_Func_8()) { Enemy_WreckedShipGhost *E = Get_WreckedShipGhost(cur_enemy_index); E->wsgt_var_A = FUNC16(WreckedShipGhost_Func_6); E->base.properties |= kEnemyProps_Invisible; E->wsgt_var_B = g_word_A89AA4; } } void WreckedShipGhost_Func_5(uint16 k) { // 0xA89C8A Enemy_WreckedShipGhost *E = Get_WreckedShipGhost(k); uint16 y_subpos = E->base.y_subpos; bool v3 = __CFADD__uint16(E->wsgt_var_01, y_subpos); E->base.y_subpos = E->wsgt_var_01 + y_subpos; E->base.y_pos += E->wsgt_var_02 + v3; uint16 wsgt_var_01 = E->wsgt_var_01; uint16 v5; if ((int16)(E->base.y_pos - E->wsgt_var_00) < 0) { v3 = __CFADD__uint16(g_word_A89AA0, wsgt_var_01); E->wsgt_var_01 = g_word_A89AA0 + wsgt_var_01; v5 = v3 + E->wsgt_var_02; } else { v3 = wsgt_var_01 < g_word_A89AA0; E->wsgt_var_01 = wsgt_var_01 - g_word_A89AA0; v5 = E->wsgt_var_02 - v3; } E->wsgt_var_02 = v5; uint16 v6 = E->wsgt_var_B - 1; E->wsgt_var_B = v6; if (!v6) { E->wsgt_var_A = FUNC16(WreckedShipGhost_Func_4); E->base.properties |= kEnemyProps_Tangible; // todo: this must be swap16 it seems int t = swap16(E->base.palette_index); uint16 v9 = 16 * t + 256; int n = 16; do { target_palettes[v9 >> 1] = 0x7FFF; v9 += 2; n--; } while ((n & 0x8000) == 0); } } void WreckedShipGhost_Func_6(uint16 k) { // 0xA89D13 uint16 v3; Enemy_WreckedShipGhost *E = Get_WreckedShipGhost(k); uint16 wsgt_var_B = E->wsgt_var_B; if (!wsgt_var_B || (v3 = wsgt_var_B - 1, (E->wsgt_var_B = v3) == 0)) { E->wsgt_var_B = 1; E->wsgt_var_C = 2; E->wsgt_var_A = FUNC16(WreckedShipGhost_Func_7); } } void WreckedShipGhost_Func_7(uint16 k) { // 0xA89D36 int16 v2; int16 v4; int16 v7; int16 v9; Enemy_WreckedShipGhost *E = Get_WreckedShipGhost(k); if ((int16)(samus_x_pos - E->wsgt_var_07) < 0 || (int16)(samus_x_pos - E->wsgt_var_08) >= 0 || (v2 = *(uint16 *)((uint8 *)&samus_y_pos + k), (int16)(v2 - E->wsgt_var_0B) < 0) || (int16)(v2 - E->wsgt_var_0C) >= 0) { E->wsgt_var_0D = g_word_A89A9E; v4 = 0; if ((int16)(samus_x_pos - E->wsgt_var_06) >= 0) { if (samus_x_pos == E->wsgt_var_06) v4 = 4; else v4 = 8; } if (v4 == E->wsgt_var_05) { v7 = 0; v9 = samus_y_pos - E->wsgt_var_0A; if (v9 >= 0) { if (v9) v7 = 24; else v7 = 12; } if (v7 == E->wsgt_var_09) { uint16 v10 = E->wsgt_var_0E - 1; E->wsgt_var_0E = v10; if (!v10) goto LABEL_13; } else { E->wsgt_var_09 = v7; E->wsgt_var_0E = g_word_A89A9C; } } else { E->wsgt_var_05 = v4; E->wsgt_var_0E = g_word_A89A9C; } } else { uint16 v3; v3 = E->wsgt_var_0D - 1; E->wsgt_var_0D = v3; if (!v3) { E->wsgt_var_05 = 4; E->wsgt_var_09 = 12; LABEL_13: E->wsgt_var_A = FUNC16(WreckedShipGhost_Func_1); E->wsgt_var_0D = g_word_A89A9E; E->wsgt_var_0E = g_word_A89A9C; int v6 = (uint16)(E->wsgt_var_09 + E->wsgt_var_05) >> 1; E->base.x_pos = g_word_A89AA8[v6] + *(uint16 *)((uint8 *)&samus_x_pos + k); E->base.y_pos = g_word_A89AA8[v6 + 1] + *(uint16 *)((uint8 *)&samus_y_pos + k); return; } } uint16 v11 = samus_x_pos; E->wsgt_var_06 = samus_x_pos; E->wsgt_var_07 = v11 - g_word_A89D32; E->wsgt_var_08 = g_word_A89D32 + samus_x_pos; uint16 v13 = samus_y_pos; E->wsgt_var_0A = samus_y_pos; E->wsgt_var_0B = v13 - g_word_A89D34; E->wsgt_var_0C = g_word_A89D34 + samus_y_pos; } uint16 WreckedShipGhost_Func_8(void) { // 0xA89E88 uint16 v0 = 0; if (!door_transition_flag_enemies) { Enemy_WreckedShipGhost *E = Get_WreckedShipGhost(cur_enemy_index); uint16 v2 = swap16(E->base.palette_index); uint16 v3 = 16 * v2 + 256; uint16 r20 = 16 * v2 + 288; do { int v4 = v3 >> 1; if (target_palettes[v4] != palette_buffer[v4]) { uint16 r18 = target_palettes[v4] & 0x1F; uint16 v5 = palette_buffer[v4] & 0x1F; if (v5 != r18) { uint16 v6; if ((int16)(v5 - r18) >= 0) v6 = v5 - 1; else v6 = v5 + 1; r18 = v6; palette_buffer[v4] = v6 | palette_buffer[v4] & 0xFFE0; ++v0; } r18 = target_palettes[v4] & 0x3E0; uint16 v7 = palette_buffer[v4] & 0x3E0; if (v7 != r18) { uint16 v8; if ((int16)(v7 - r18) >= 0) v8 = v7 - 32; else v8 = v7 + 32; r18 = v8; palette_buffer[v4] = v8 | palette_buffer[v4] & 0xFC1F; ++v0; } r18 = target_palettes[v4] & 0x7C00; uint16 v9 = palette_buffer[v4] & 0x7C00; if (v9 != r18) { uint16 v10; if ((int16)(v9 - r18) >= 0) v10 = v9 - 1024; else v10 = v9 + 1024; r18 = v10; palette_buffer[v4] = v10 | palette_buffer[v4] & 0x83FF; ++v0; } } v3 += 2; } while ((int16)(v3 - r20) < 0); } return v0; } const uint16 *YappingMaw_Instr_2(uint16 k, const uint16 *jp) { // 0xA8A0C7 Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); E->ymw_var_32 = g_word_A8A0AB; E->ymw_var_33 = g_word_A8A0AD; return jp; } const uint16 *YappingMaw_Instr_4(uint16 k, const uint16 *jp) { // 0xA8A0D9 Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); E->ymw_var_32 = g_word_A8A0C3; E->ymw_var_33 = g_word_A8A0C5; return jp; } const uint16 *YappingMaw_Instr_5(uint16 k, const uint16 *jp) { // 0xA8A0EB Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); E->ymw_var_32 = g_word_A8A0B3; E->ymw_var_33 = g_word_A8A0B5; return jp; } const uint16 *YappingMaw_Instr_7(uint16 k, const uint16 *jp) { // 0xA8A0FD Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); E->ymw_var_32 = g_word_A8A0BB; E->ymw_var_33 = g_word_A8A0BD; return jp; } const uint16 *YappingMaw_Instr_3(uint16 k, const uint16 *jp) { // 0xA8A10F Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); E->ymw_var_32 = g_word_A8A0A7; E->ymw_var_33 = g_word_A8A0A9; return jp; } const uint16 *YappingMaw_Instr_6(uint16 k, const uint16 *jp) { // 0xA8A121 Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); E->ymw_var_32 = g_word_A8A0B7; E->ymw_var_33 = g_word_A8A0B9; return jp; } const uint16 *YappingMaw_Instr_1(uint16 k, const uint16 *jp) { // 0xA8A133 if (!Get_YappingMaw(cur_enemy_index)->ymw_var_36) QueueSfx2_Max6(0x2F); return jp; } void YappingMaw_Init(void) { // 0xA8A148 int16 v1; Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); E->ymw_var_0C = E->base.x_pos; E->ymw_var_0D = E->base.y_pos; E->ymw_var_00 = 0; E->ymw_var_01 = 0; E->ymw_var_02 = 0; E->ymw_var_03 = 0; E->ymw_var_04 = 0; E->ymw_var_05 = 0; E->ymw_var_06 = 0; E->ymw_var_07 = 0; E->ymw_var_30 = 0; E->ymw_var_F = E->ymw_parameter_1; E->ymw_var_E = 64; E->base.current_instruction = addr_kYappingMaw_Ilist_9F6F; uint16 R36 = 57; uint16 R34 = 8; if (!E->ymw_parameter_2) { E->base.current_instruction = addr_kYappingMaw_Ilist_9FC7; R36 = 56; R34 = -8; } E->base.instruction_timer = 1; E->base.timer = 0; E->ymw_var_A = FUNC16(YappingMaw_Func_1); E->ymw_var_45 = E->base.palette_index & 0xE00; v1 = 3; E->ymw_var_44 = 3; do { SpawnEnemyProjectileWithGfx(v1, cur_enemy_index, addr_kEproj_YappingMawsBody); v1 = E->ymw_var_44 - 1; E->ymw_var_44 = v1; } while (v1 >= 0); uint16 v3 = E->base.vram_tiles_index | E->base.palette_index; E->ymw_var_47 = v3; E->ymw_var_46 = CreateSpriteAtPos(E->base.x_pos, R34 + E->base.y_pos, R36, v3); } void CallYappingMawFunc(uint32 ea) { switch (ea) { case fnYappingMaw_Func_1: YappingMaw_Func_1(); return; // 0xa8a235 case fnYappingMaw_Func_2: YappingMaw_Func_2(); return; // 0xa8a28c case fnYappingMaw_Func_8: YappingMaw_Func_8(); return; // 0xa8a445 case fnYappingMaw_Func_11: YappingMaw_Func_11(); return; // 0xa8a68a default: Unreachable(); } } void YappingMaw_Main(void) { // 0xA8A211 Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); --E->ymw_var_35; E->ymw_var_36 = CheckIfEnemyIsOnScreen(); CallYappingMawFunc(E->ymw_var_A | 0xA80000); YappingMaw_Func_15(); YappingMaw_Func_14(); YappingMaw_Func_13(); YappingMaw_Func_12(); } void YappingMaw_Func_1(void) { // 0xA8A235 Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); PairU16 pair = EnemyFunc_ACA8((Point16U) { E->base.x_pos, E->base.y_pos}, (Point16U) { samus_x_pos, samus_y_pos }); uint16 v2 = Abs16(pair.k); E->ymw_var_08 = v2; if (sign16(v2 - 32)) { E->ymw_var_35 = 48; } else if ((int16)(v2 - E->ymw_var_F) < 0) { if (!sign16(E->ymw_var_08 - 64)) E->ymw_var_08 = 64; E->ymw_var_0A = pair.j; E->ymw_var_A = FUNC16(YappingMaw_Func_2); } } void YappingMaw_Func_2(void) { // 0xA8A28C Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); E->ymw_var_B = 0; E->ymw_var_C = 0; E->ymw_var_D = 0; E->ymw_var_09 = E->ymw_var_08 >> 1; uint16 v1 = (uint8)(64 - E->ymw_var_0A); E->ymw_var_0B = v1; if (sign16(v1 - 128)) E->ymw_var_2F = 0; else E->ymw_var_2F = 1; YappingMaw_Func_3(); uint16 v2 = 2 * ((uint8)(E->ymw_var_0A + 16) >> 5); E->ymw_var_34 = v2; E->base.current_instruction = g_off_A8A097[v2 >> 1]; E->base.instruction_timer = 1; E->base.timer = 0; E->ymw_var_32 = *(uint16 *)((uint8 *)&g_word_A8A0A7 + (uint16)(2 * v2)); E->ymw_var_33 = *(uint16 *)((uint8 *)&g_word_A8A0A9 + (uint16)(2 * v2)); E->ymw_var_A = FUNC16(YappingMaw_Func_8); } void YappingMaw_Func_3(void) { // 0xA8A310 Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); E->ymw_var_0E = YappingMaw_Func_16(0x80, E->ymw_var_09); E->ymw_var_0F = YappingMaw_Func_17(0x80, E->ymw_var_09 >> 1); } void YappingMaw_Func_4(void) { // 0xA8A339 Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); uint16 varE32 = E->ymw_var_00; E->ymw_var_10 = YappingMaw_Func_16(0, varE32); E->ymw_var_11 = YappingMaw_Func_17(0, varE32); E->ymw_var_27 = YappingMaw_Func_16(E->ymw_var_0B, varE32) - E->ymw_var_10; E->ymw_var_28 = YappingMaw_Func_17(E->ymw_var_0B, varE32) - E->ymw_var_11; } void YappingMaw_Func_5(void) { // 0xA8A37C Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); uint16 varE32 = E->ymw_var_02; E->ymw_var_10 = YappingMaw_Func_16(0, varE32); E->ymw_var_11 = YappingMaw_Func_17(0, varE32); E->ymw_var_29 = YappingMaw_Func_16(E->ymw_var_0B, varE32) - E->ymw_var_10; E->ymw_var_2A = YappingMaw_Func_17(E->ymw_var_0B, varE32) - E->ymw_var_11; } void YappingMaw_Func_6(void) { // 0xA8A3BF Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); uint16 varE32 = E->ymw_var_04; E->ymw_var_10 = YappingMaw_Func_16(0, varE32); E->ymw_var_11 = YappingMaw_Func_17(0, varE32); E->ymw_var_2B = YappingMaw_Func_16(E->ymw_var_0B, varE32) - E->ymw_var_10; E->ymw_var_2C = YappingMaw_Func_17(E->ymw_var_0B, varE32) - E->ymw_var_11; } void YappingMaw_Func_7(void) { // 0xA8A402 Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); uint16 varE32 = E->ymw_var_06; E->ymw_var_10 = YappingMaw_Func_16(0, varE32); E->ymw_var_11 = YappingMaw_Func_17(0, varE32); E->ymw_var_2D = YappingMaw_Func_16(E->ymw_var_0B, varE32) - E->ymw_var_10; E->ymw_var_2E = YappingMaw_Func_17(E->ymw_var_0B, varE32) - E->ymw_var_11; } void YappingMaw_Func_8(void) { // 0xA8A445 int16 v9; int16 v11; // tt int16 v13; // tt int16 v16; int16 v17; // tt int16 v19; int16 v20; // tt int16 v22; int16 v23; // tt int16 v25; int16 v26; // tt int16 v28; int16 v29; // tt int16 v31; int16 v32; // tt uint16 v8; Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); uint16 r20 = E->ymw_var_B >> 2; if (E->ymw_var_2F) { bool v3 = __CFADD__uint16(r20, 128); v9 = r20 + 128; E->ymw_var_21 = r20 + 128; v11 = v3; v3 = __CFADD__uint16(v3, v9); uint16 v10 = v11 + v9; v3 |= __CFADD__uint16(r20, v10); v10 += r20; E->ymw_var_22 = v10; v13 = v3; v3 = __CFADD__uint16(v3, v10); uint16 v12 = v13 + v10; v3 |= __CFADD__uint16(r20, v12); v12 += r20; E->ymw_var_23 = v12; v8 = r20 + v3 + v12; } else { uint16 v2 = 128 - r20; bool v3 = r20 <= 0x80; E->ymw_var_21 = 128 - r20; uint16 v5 = !v3 + r20; v3 = v2 < v5; uint16 v4 = v2 - v5; E->ymw_var_22 = v4; uint16 v7 = v3 + r20; v3 = v4 < v7; uint16 v6 = v4 - v7; E->ymw_var_23 = v6; v8 = v6 - (v3 + r20); } E->ymw_var_24 = v8; uint16 varE32 = E->ymw_var_09; E->ymw_var_00 = YappingMaw_Func_16(E->ymw_var_21, varE32) - E->ymw_var_0E; E->ymw_var_02 = YappingMaw_Func_16(E->ymw_var_22, varE32) - E->ymw_var_0E; E->ymw_var_04 = YappingMaw_Func_16(E->ymw_var_23, varE32) - E->ymw_var_0E; E->ymw_var_06 = YappingMaw_Func_16(E->ymw_var_24, varE32) - E->ymw_var_0E; varE32 = E->ymw_var_09 >> 1; E->ymw_var_01 = YappingMaw_Func_17(E->ymw_var_21, varE32) - E->ymw_var_0F; E->ymw_var_03 = YappingMaw_Func_17(E->ymw_var_22, varE32) - E->ymw_var_0F; E->ymw_var_05 = YappingMaw_Func_17(E->ymw_var_23, varE32) - E->ymw_var_0F; E->ymw_var_07 = YappingMaw_Func_17(E->ymw_var_24, varE32) - E->ymw_var_0F; YappingMaw_Func_4(); YappingMaw_Func_5(); YappingMaw_Func_6(); YappingMaw_Func_7(); uint16 ymw_var_00 = E->ymw_var_00; bool v3 = __CFADD__uint16(E->ymw_var_27, ymw_var_00); E->ymw_var_00 = E->ymw_var_27 + ymw_var_00; uint16 ymw_var_01 = E->ymw_var_01; v17 = v3; v3 = __CFADD__uint16(v3, ymw_var_01); v16 = v17 + ymw_var_01; v3 |= __CFADD__uint16(E->ymw_var_28, v16); E->ymw_var_01 = E->ymw_var_28 + v16; uint16 ymw_var_02 = E->ymw_var_02; v20 = v3; v3 = __CFADD__uint16(v3, ymw_var_02); v19 = v20 + ymw_var_02; v3 |= __CFADD__uint16(E->ymw_var_29, v19); E->ymw_var_02 = E->ymw_var_29 + v19; uint16 ymw_var_03 = E->ymw_var_03; v23 = v3; v3 = __CFADD__uint16(v3, ymw_var_03); v22 = v23 + ymw_var_03; v3 |= __CFADD__uint16(E->ymw_var_2A, v22); E->ymw_var_03 = E->ymw_var_2A + v22; uint16 ymw_var_04 = E->ymw_var_04; v26 = v3; v3 = __CFADD__uint16(v3, ymw_var_04); v25 = v26 + ymw_var_04; v3 |= __CFADD__uint16(E->ymw_var_2B, v25); E->ymw_var_04 = E->ymw_var_2B + v25; uint16 ymw_var_05 = E->ymw_var_05; v29 = v3; v3 = __CFADD__uint16(v3, ymw_var_05); v28 = v29 + ymw_var_05; v3 |= __CFADD__uint16(E->ymw_var_2C, v28); E->ymw_var_05 = E->ymw_var_2C + v28; uint16 ymw_var_06 = E->ymw_var_06; v32 = v3; v3 = __CFADD__uint16(v3, ymw_var_06); v31 = v32 + ymw_var_06; v3 |= __CFADD__uint16(E->ymw_var_2D, v31); E->ymw_var_06 = E->ymw_var_2D + v31; E->ymw_var_07 += E->ymw_var_2E + v3; E->base.x_pos = E->ymw_var_06 + E->ymw_var_0C; E->base.y_pos = E->ymw_var_07 + E->ymw_var_0D; YappingMaw_Func_9(cur_enemy_index); if (!sign16(E->ymw_var_B)) { if (!sign16(E->ymw_var_B - 128)) { E->ymw_var_B = 128; E->ymw_var_C = 0; ++E->ymw_var_D; ++E->ymw_var_D; ++E->ymw_var_D; ++E->ymw_var_D; } LABEL_19: if (E->ymw_var_30) YappingMaw_Func_10(); return; } E->ymw_var_A = FUNC16(YappingMaw_Func_11); E->ymw_var_35 = 48; if (E->ymw_var_34 == 4) { E->base.current_instruction = addr_kYappingMaw_Ilist_A01F; } else if (E->ymw_var_34 == 12) { E->base.current_instruction = addr_kYappingMaw_Ilist_A03D; } else { E->base.current_instruction = addr_off_A8A025; } if (!E->ymw_parameter_2) { if (E->ymw_var_34 == 4) { E->base.current_instruction = addr_kYappingMaw_Ilist_A05B; } else { if (E->ymw_var_34 != 12) { E->base.current_instruction = addr_off_A8A061; return; } E->base.current_instruction = addr_kYappingMaw_Ilist_A079; } goto LABEL_19; } } void YappingMaw_Func_9(uint16 k) { // 0xA8A63E Enemy_YappingMaw *E = Get_YappingMaw(k); int v2 = E->ymw_var_D >> 1; E->ymw_var_B += kCommonEnemySpeeds_Quadratic[v2 + 1]; uint16 ymw_var_C = E->ymw_var_C; bool v4 = __CFADD__uint16(kCommonEnemySpeeds_Quadratic[v2], ymw_var_C); uint16 v5 = kCommonEnemySpeeds_Quadratic[v2] + ymw_var_C; if (v4) ++E->ymw_var_B; E->ymw_var_C = v5; E->ymw_var_D += 8; } void YappingMaw_Func_10(void) { // 0xA8A665 CallSomeSamusCode(3); Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); samus_x_pos = E->ymw_var_32 + E->base.x_pos; samus_y_pos = E->ymw_var_33 + E->base.y_pos; EnemyFunc_B7A1(); } void YappingMaw_Func_11(void) { // 0xA8A68A Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); if (E->ymw_var_30) YappingMaw_Func_10(); if ((--E->ymw_var_E & 0x8000) != 0 && samus_input_handler != FUNC16(Samus_InputHandler_E91D)) { samus_input_handler = FUNC16(Samus_InputHandler_E913); E->ymw_var_30 = 0; E->ymw_var_35 = 48; E->ymw_var_E = 64; E->ymw_var_A = FUNC16(YappingMaw_Func_1); } } void YappingMaw_Func_12(void) { // 0xA8A6C4 Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); int v1 = E->ymw_var_40 >> 1; enemy_projectile_x_pos[v1] = E->ymw_var_0C; enemy_projectile_y_pos[v1] = E->ymw_var_0D; } void YappingMaw_Func_13(void) { // 0xA8A6DB Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); int v1 = E->ymw_var_41 >> 1; enemy_projectile_x_pos[v1] = E->ymw_var_00 + E->ymw_var_0C; enemy_projectile_y_pos[v1] = E->ymw_var_01 + E->ymw_var_0D; } void YappingMaw_Func_14(void) { // 0xA8A6FC Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); int v1 = E->ymw_var_42 >> 1; enemy_projectile_x_pos[v1] = E->ymw_var_02 + E->ymw_var_0C; enemy_projectile_y_pos[v1] = E->ymw_var_03 + E->ymw_var_0D; } void YappingMaw_Func_15(void) { // 0xA8A71D Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); int v1 = E->ymw_var_43 >> 1; enemy_projectile_x_pos[v1] = E->ymw_var_04 + E->ymw_var_0C; enemy_projectile_y_pos[v1] = E->ymw_var_05 + E->ymw_var_0D; } uint16 YappingMaw_Func_16(uint16 a, uint16 varE32) { // 0xA8A73E return YappingMaw_Func_17(a - 64, varE32); } uint16 YappingMaw_Func_17(uint16 a, uint16 varE32) { // 0xA8A742 int16 v1; uint16 r20 = 0; uint16 r22 = 0; v1 = kSine16bit[(uint8)-a]; if (v1 < 0) { v1 = -v1; ++r20; } WriteReg(WRMPYA, HIBYTE(v1)); if ((uint8)varE32) { uint16 prod = Mult8x8(HIBYTE(v1), varE32); r22 = 2 * ((prod & 0xFF00) >> 8); if (r20) r22 = (2 * ((uint16)-prod >> 8)) | 0xFF00; } return r22; } void YappingMaw_Touch(void) { // 0xA8A799 Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); if ((E->ymw_var_35 & 0x8000) != 0 && !E->ymw_var_30) { E->ymw_var_35 = 0; E->ymw_var_30 = 1; samus_input_handler = FUNC16(nullsub_152); } } void YappingMaw_Shot(void) { // 0xA8A7BD NormalEnemyShotAi(); Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); if (E->base.health) { if (E->base.frozen_timer) { if (samus_input_handler != FUNC16(Samus_InputHandler_E91D)) samus_input_handler = FUNC16(Samus_InputHandler_E913); E->ymw_var_30 = 0; } } else { *(uint16 *)((uint8 *)enemy_projectile_id + E->ymw_var_40) = 0; *(uint16 *)((uint8 *)enemy_projectile_id + E->ymw_var_41) = 0; *(uint16 *)((uint8 *)enemy_projectile_id + E->ymw_var_42) = 0; *(uint16 *)((uint8 *)enemy_projectile_id + E->ymw_var_43) = 0; sprite_instr_list_ptrs[E->ymw_var_46 >> 1] = 0; if (samus_input_handler != FUNC16(Samus_InputHandler_E91D)) samus_input_handler = FUNC16(Samus_InputHandler_E913); Get_YappingMaw(cur_enemy_index)->ymw_var_30 = 0; } } void YappingMaw_Frozen(void) { // 0xA8A835 Enemy_NormalFrozenAI_A8(); Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); YappingMaw_Func_18(E->ymw_var_40); YappingMaw_Func_18(E->ymw_var_41); YappingMaw_Func_18(E->ymw_var_42); YappingMaw_Func_18(E->ymw_var_43); YappingMaw_Func_19(); } void YappingMaw_Func_18(uint16 j) { // 0xA8A85D int v1 = j >> 1; Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); enemy_projectile_gfx_idx[v1] = E->ymw_var_45 | enemy_projectile_gfx_idx[v1] & 0xF1FF; if (E->base.frozen_timer) { enemy_projectile_gfx_idx[v1] = enemy_projectile_gfx_idx[v1] & 0xF1FF | 0xC00; uint16 frozen_timer = E->base.frozen_timer; if (sign16(frozen_timer - 90)) { if ((frozen_timer & 2) == 0) enemy_projectile_gfx_idx[v1] = E->ymw_var_45 | enemy_projectile_gfx_idx[v1] & 0xF1FF; } } } void YappingMaw_Func_19(void) { // 0xA8A899 Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); uint16 r18 = E->ymw_var_45; uint16 r20 = E->ymw_var_46; sprite_palettes[r20 >> 1] = r18 | sprite_palettes[r20 >> 1] & 0xF1FF; if (E->base.frozen_timer) { sprite_palettes[r20 >> 1] = sprite_palettes[r20 >> 1] & 0xF1FF | 0xC00; uint16 frozen_timer = E->base.frozen_timer; if (sign16(frozen_timer - 90)) { if ((frozen_timer & 2) == 0) sprite_palettes[r20 >> 1] = r18 | sprite_palettes[r20 >> 1] & 0xF1FF; } } } void Kago_Init(void) { // 0xA8AB46 Enemy_Kago *E = Get_Kago(cur_enemy_index); E->base.properties |= kEnemyProps_DisableSamusColl; E->base.instruction_timer = 1; E->base.timer = 0; E->kago_var_E = 0; E->base.current_instruction = addr_kKago_Ilist_AB1E; E->kago_var_A = FUNC16(Kago_Func_1); E->kago_var_F = 0; E->kago_var_04 = E->kago_parameter_1; } void CallKagoFunc(uint32 ea, uint16 k) { switch (ea) { case fnKago_Func_1: Kago_Func_1(k); return; case fnnullsub_306: return; default: Unreachable(); } } void Kago_Main(void) { // 0xA8AB75 Enemy_Kago *E = Get_Kago(cur_enemy_index); CallKagoFunc(E->kago_var_A | 0xA80000, cur_enemy_index); } void Kago_Func_1(uint16 k) { // 0xA8AB7B Get_Kago(k)->kago_var_A = FUNC16(nullsub_306); } void Kago_Shot(void) { // 0xA8AB83 int16 v2; NormalEnemyShotAi(); earthquake_type = 2; earthquake_timer = 16; Enemy_Kago *E = Get_Kago(cur_enemy_index); if (!E->kago_var_B) { E->kago_var_B = 1; E->base.current_instruction = addr_kKago_Ilist_AB32; E->base.instruction_timer = 1; } v2 = E->kago_var_04 - 1; E->kago_var_04 = v2; if (v2 < 0) { EnemyDeathAnimation(cur_enemy_index, 4); E->kago_var_F = 1; } SpawnEnemyProjectileWithGfx(E->base.y_pos, cur_enemy_index, addr_loc_A8D02E); } const uint16 *NorfairLavaMan_Instr_1(uint16 k, const uint16 *jp) { // 0xA8AE12 if (!CheckIfEnemyIsOnScreen()) { QueueSfx2_Max6(jp[0]); } return jp + 1; } const uint16 *NorfairLavaMan_Instr_8(uint16 k, const uint16 *jp) { // 0xA8AE26 Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); ++E->base.y_pos; ++E->base.y_pos; return jp; } const uint16 *NorfairLavaMan_Instr_14(uint16 k, const uint16 *jp) { // 0xA8AE30 Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); --E->base.y_pos; --E->base.y_pos; return jp; } const uint16 *NorfairLavaMan_Instr_2(uint16 k, const uint16 *jp) { // 0xA8AE3A Get_NorfairLavaMan(cur_enemy_index)->nlmn_var_01 = 1; return jp; } const uint16 *NorfairLavaMan_Instr_7(uint16 k, const uint16 *jp) { // 0xA8AE45 Get_NorfairLavaMan(cur_enemy_index)->nlmn_var_01 = 0; return jp; } const uint16 *NorfairLavaMan_Instr_10(uint16 k, const uint16 *jp) { // 0xA8AE50 Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); --E->base.y_pos; Enemy_NorfairLavaMan *E1 = Get_NorfairLavaMan(cur_enemy_index + 64); --E1->base.y_pos; return jp; } const uint16 *NorfairLavaMan_Instr_12(uint16 k, const uint16 *jp) { // 0xA8AE5A Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); ++E->base.y_pos; Enemy_NorfairLavaMan *E1 = Get_NorfairLavaMan(cur_enemy_index + 64); ++E1->base.y_pos; return jp; } const uint16 *NorfairLavaMan_Instr_9(uint16 k, const uint16 *jp) { // 0xA8AE64 Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); uint16 v4 = E->nlmn_var_03 + 24; E->base.y_pos = v4; Enemy_NorfairLavaMan *E1 = Get_NorfairLavaMan(cur_enemy_index + 64); E1->base.y_pos = v4; E1->base.properties &= ~0x100; Enemy_NorfairLavaMan *E2 = Get_NorfairLavaMan(cur_enemy_index + 128); E2->base.properties &= ~0x100; return jp; } const uint16 *NorfairLavaMan_Instr_11(uint16 k, const uint16 *jp) { // 0xA8AE88 Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); uint16 nlmn_var_03 = E->nlmn_var_03; E->base.y_pos = nlmn_var_03; Get_NorfairLavaMan(cur_enemy_index + 64)->base.y_pos = nlmn_var_03; return jp; } const uint16 *NorfairLavaMan_Instr_13(uint16 k, const uint16 *jp) { // 0xA8AE96 Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); uint16 v4 = E->nlmn_var_03 + 4; E->base.y_pos = v4; Enemy_NorfairLavaMan *E1 = Get_NorfairLavaMan(cur_enemy_index + 64); E1->base.y_pos = v4; E1->base.properties |= 0x100; Enemy_NorfairLavaMan *E2 = Get_NorfairLavaMan(cur_enemy_index + 128); E2->base.properties |= 0x100; return jp; } const uint16 *NorfairLavaMan_Instr_5(uint16 k, const uint16 *jp) { // 0xA8AEBA Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); SpawnEnemyProjectileWithGfx(E->nlmn_var_B, cur_enemy_index, addr_kEproj_LavaThrownByLavaman); return jp; } const uint16 *NorfairLavaMan_Instr_15(uint16 k, const uint16 *jp) { // 0xA8AECA Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); E->base.x_pos = E->nlmn_var_12 + 8; E->base.y_pos = E->nlmn_var_13 - 4; return jp; } const uint16 *NorfairLavaMan_Instr_4(uint16 k, const uint16 *jp) { // 0xA8AEE4 Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); E->base.x_pos = E->nlmn_var_12 - 8; E->base.y_pos = E->nlmn_var_13 - 4; return jp; } const uint16 *NorfairLavaMan_Instr_16(uint16 k, const uint16 *jp) { // 0xA8AEFE Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); E->base.x_pos = E->nlmn_var_12 + 8; E->base.y_pos = E->nlmn_var_13 - 8; return jp; } const uint16 *NorfairLavaMan_Instr_6(uint16 k, const uint16 *jp) { // 0xA8AF18 Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); E->base.x_pos = E->nlmn_var_12 - 8; E->base.y_pos = E->nlmn_var_13 - 4; return jp; } void sub_A8AF32(void) { // 0xA8AF32 Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); E->base.x_pos = E->nlmn_var_12; E->base.y_pos = E->nlmn_var_13; } const uint16 *NorfairLavaMan_Instr_3(uint16 k, const uint16 *jp) { // 0xA8AF44 Get_NorfairLavaMan(cur_enemy_index)->nlmn_var_04 = 256; return jp; } static Func_V *const g_off_A8AF4F[3] = { NorfairLavaMan_Func_1, NorfairLavaMan_Func_2, NorfairLavaMan_Func_3 }; void NorfairLavaMan_Init(void) { // 0xA8AF8B uint16 v0 = 2 * Get_NorfairLavaMan(cur_enemy_index)->nlmn_parameter_1; g_off_A8AF4F[v0 >> 1](); NorfairLavaMan_Func_4(); NorfairLavaMan_Func_5(cur_enemy_index); } void NorfairLavaMan_Func_1(void) { // 0xA8AF9D Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); E->nlmn_var_C = 0; E->nlmn_var_00 = 0; E->nlmn_var_02 = 0; E->nlmn_var_03 = E->base.y_pos; if ((GetSamusEnemyDelta_X(cur_enemy_index) & 0x8000) != 0) E->nlmn_var_00 = 1; E->nlmn_var_D = addr_kNorfairLavaMan_Ilist_AC9C; if (!E->nlmn_var_00) E->nlmn_var_D = addr_kNorfairLavaMan_Ilist_AD3C; NorfairLavaMan_Func_20(); E->nlmn_var_F = FUNC16(NorfairLavaMan_Func_7); } void NorfairLavaMan_Func_2(void) { // 0xA8AFE2 Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); E->nlmn_var_03 = E->base.y_pos; E->nlmn_var_C = 0; E->nlmn_var_0C = 0; E->nlmn_var_0D = 1; E->nlmn_var_D = addr_kNorfairLavaMan_Ilist_ADDC; NorfairLavaMan_Func_20(); E->base.y_pos += 32; E->nlmn_var_F = FUNC16(NorfairLavaMan_Func_10); E->base.properties |= kEnemyProps_Invisible; } void NorfairLavaMan_Func_3(void) { // 0xA8B020 Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); E->nlmn_var_03 = E->base.y_pos; E->nlmn_var_11 = E->base.x_pos; E->nlmn_var_C = 0; E->nlmn_var_04 = 0; E->nlmn_var_D = addr_kNorfairLavaMan_Ilist_AE0C; NorfairLavaMan_Func_20(); E->base.y_pos += 32; E->nlmn_var_F = FUNC16(NorfairLavaMan_Func_15); E->base.properties |= kEnemyProps_Invisible; } void NorfairLavaMan_Func_4(void) { // 0xA8B05E Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); int v1 = (8 * HIBYTE(E->nlmn_parameter_2)) >> 1; E->nlmn_var_08 = kCommonEnemySpeeds_Linear[v1]; E->nlmn_var_07 = kCommonEnemySpeeds_Linear[v1 + 1]; E->nlmn_var_0A = kCommonEnemySpeeds_Linear[v1 + 2]; E->nlmn_var_09 = kCommonEnemySpeeds_Linear[v1 + 3]; } void NorfairLavaMan_Func_5(uint16 k) { // 0xA8B088 enemy_gfx_drawn_hook.addr = FUNC16(NorfairLavaMan_Func_6); *(uint16 *)&enemy_gfx_drawn_hook.bank = 168; variables_for_enemy_graphics_drawn_hook[0] = ((uint16)(Get_NorfairLavaMan(k)->base.palette_index & 0xE00) >> 4) + 256; variables_for_enemy_graphics_drawn_hook[2] = 8; variables_for_enemy_graphics_drawn_hook[1] = 0; } void NorfairLavaMan_Func_6(void) { // 0xA8B0B2 if (!door_transition_flag_enemies && !--variables_for_enemy_graphics_drawn_hook[2]) { variables_for_enemy_graphics_drawn_hook[2] = 8; ++variables_for_enemy_graphics_drawn_hook[1]; int v0 = (uint16)(32 * (variables_for_enemy_graphics_drawn_hook[1] & 3)) >> 1; uint16 r18 = kNorfairLavaMan_Palette[v0 + 9]; uint16 r20 = kNorfairLavaMan_Palette[v0 + 10]; uint16 r22 = kNorfairLavaMan_Palette[v0 + 11]; uint16 r24 = kNorfairLavaMan_Palette[v0 + 12]; int v1 = variables_for_enemy_graphics_drawn_hook[0] >> 1; palette_buffer[v1 + 9] = r18; palette_buffer[v1 + 10] = r20; palette_buffer[v1 + 11] = r22; palette_buffer[v1 + 12] = r24; } } void NorfairLavaMan_Main(void) { // 0xA8B10A Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); --E->nlmn_var_04; CallEnemyPreInstr(E->nlmn_var_F | 0xA80000); } void NorfairLavaMan_Func_7(uint16 k) { // 0xA8B11A Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); E->nlmn_var_00 = 0; E->nlmn_var_D = addr_kNorfairLavaMan_Ilist_AC9C; if ((GetSamusEnemyDelta_X(cur_enemy_index) & 0x8000) == 0) { E->nlmn_var_D = addr_kNorfairLavaMan_Ilist_AD3C; E->nlmn_var_00 = 1; } NorfairLavaMan_Func_20(); Enemy_NorfairLavaMan *E2 = Get_NorfairLavaMan(cur_enemy_index + 128); if ((E2->nlmn_var_04 & 0x8000) != 0) { E2->nlmn_var_04 = 0; if (IsSamusWithinEnemy_X(cur_enemy_index, LOBYTE(E->nlmn_parameter_2))) { E->nlmn_var_D = addr_kNorfairLavaMan_Ilist_ACDE; if (E->nlmn_var_00) E->nlmn_var_D = addr_kNorfairLavaMan_Ilist_AD7E; NorfairLavaMan_Func_20(); E->nlmn_var_F = FUNC16(NorfairLavaMan_Func_8); } } } void NorfairLavaMan_Func_8(uint16 k) { // 0xA8B175 Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); if (!E->nlmn_var_01) { E->nlmn_var_02 = 1; Get_NorfairLavaMan(cur_enemy_index + 64)->nlmn_var_0D = 0; E->nlmn_var_F = FUNC16(sub_A8B193); } } void sub_A8B193(uint16 k) { // 0xA8B193 Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); if (!E->nlmn_var_02) { E->nlmn_var_D = addr_kNorfairLavaMan_Ilist_AD0C; if ((GetSamusEnemyDelta_X(cur_enemy_index) & 0x8000) == 0) E->nlmn_var_D = addr_kNorfairLavaMan_Ilist_ADAC; NorfairLavaMan_Func_20(); E->nlmn_var_F = FUNC16(NorfairLavaMan_Func_9); } } void NorfairLavaMan_Func_9(uint16 k) { // 0xA8B1B8 Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); if (!E->nlmn_var_01) { E->nlmn_var_D = addr_kNorfairLavaMan_Ilist_AC9C; if ((GetSamusEnemyDelta_X(cur_enemy_index) & 0x8000) == 0) E->nlmn_var_D = addr_kNorfairLavaMan_Ilist_AD3C; NorfairLavaMan_Func_20(); E->nlmn_var_F = FUNC16(NorfairLavaMan_Func_7); } } void NorfairLavaMan_Func_10(uint16 k) { // 0xA8B1DD Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); if (!E->nlmn_var_0D) { E->nlmn_var_F = FUNC16(NorfairLavaMan_Func_11); E->nlmn_var_E = 0; E->nlmn_var_0D = 0; E->nlmn_var_B = 2; E->base.y_pos = E->nlmn_var_03; } } void NorfairLavaMan_Func_11(uint16 k) { // 0xA8B204 EnemySpawnData *v3; Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); uint16 y_subpos = E->base.y_subpos; v3 = gEnemySpawnData(cur_enemy_index); bool v4 = __CFADD__uint16(v3[31].ypos2, y_subpos); E->base.y_subpos = v3[31].ypos2 + y_subpos; if (v4) ++E->nlmn_var_E; E->base.y_pos += v3[31].field_14 + v4; E->nlmn_var_E += v3[31].field_14; NorfairLavaMan_Func_12(cur_enemy_index); } void NorfairLavaMan_Func_12(uint16 k) { // 0xA8B230 int v3; Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(k); if (!sign16(-E->nlmn_var_E - 108)) printf("Y undefined %d!\n", -(int16)E->nlmn_var_E); uint16 nlmn_var_B = E->nlmn_var_B; if (!sign16(-E->nlmn_var_E - 108) || (v3 = nlmn_var_B >> 1, (int16)(E->base.y_pos - g_word_A8AF79[v3] - samus_y_pos) < 0)) { E->nlmn_var_F = FUNC16(sub_A8B291); E->nlmn_var_0C = 1; if ((int16)(-E->nlmn_var_E - g_word_A8AF55[nlmn_var_B >> 1]) < 0) return; goto LABEL_6; } if ((int16)(-E->nlmn_var_E - g_word_A8AF55[v3]) >= 0) { LABEL_6: ++E->nlmn_var_B; ++E->nlmn_var_B; E->base.y_pos += 8; E->nlmn_var_D = g_off_A8AF67[E->nlmn_var_B >> 1]; NorfairLavaMan_Func_20(); } } void sub_A8B291(uint16 k) { // 0xA8B291 ; } void NorfairLavaMan_Func_13(void) { // 0xA8B295 EnemySpawnData *v2; Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); v2 = gEnemySpawnData(cur_enemy_index); E->base.y_pos += v2[31].xpos2; E->nlmn_var_E += v2[31].xpos2; uint16 y_subpos = E->base.y_subpos; bool v4 = __CFADD__uint16(v2[31].field_E, y_subpos); uint16 v5 = v2[31].field_E + y_subpos; if (v4) { ++E->base.y_pos; ++E->nlmn_var_E; } E->base.y_subpos = v5; NorfairLavaMan_Func_14(cur_enemy_index); } void NorfairLavaMan_Func_14(uint16 k) { // 0xA8B2C5 int16 nlmn_var_E; Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(k); nlmn_var_E = E->nlmn_var_E; if (nlmn_var_E >= 0) { E->nlmn_var_0D = 1; gEnemySpawnData(k)[31].field_4 = 0; E->nlmn_var_F = FUNC16(NorfairLavaMan_Func_10); } else if ((int16)(-nlmn_var_E - g_word_A8AF55[(uint16)(E->nlmn_var_B - 2) >> 1]) < 0) { --E->nlmn_var_B; --E->nlmn_var_B; E->base.y_pos -= 8; E->nlmn_var_D = g_off_A8AF67[E->nlmn_var_B >> 1]; NorfairLavaMan_Func_20(); } } void NorfairLavaMan_Func_15(uint16 k) { // 0xA8B30D if (enemy_drawing_queue[(cur_enemy_index >> 1) + 87] == FUNC16(NorfairLavaMan_Func_8)) Get_NorfairLavaMan(cur_enemy_index)->nlmn_var_F = FUNC16(NorfairLavaMan_Func_17); } void NorfairLavaMan_Func_16(uint16 k) { // 0xA8B31F Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); if (!E->nlmn_var_01) { E->nlmn_var_D = addr_kNorfairLavaMan_Ilist_AE0C; NorfairLavaMan_Func_20(); enemy_drawing_queue_sizes[(cur_enemy_index >> 1) + 5] = FUNC16(NorfairLavaMan_Func_13); E->nlmn_var_F = FUNC16(NorfairLavaMan_Func_18); gEnemySpawnData(cur_enemy_index)[31].field_18 = 0; E->base.x_pos = E->nlmn_var_12; E->base.y_pos = E->nlmn_var_13; } NorfairLavaMan_Func_19(cur_enemy_index); } void NorfairLavaMan_Func_17(uint16 k) { // 0xA8B356 if (gEnemySpawnData(cur_enemy_index)[31].field_18) { Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); E->nlmn_var_D = addr_kNorfairLavaMan_Ilist_ACB0; E->nlmn_var_B = 0; if ((GetSamusEnemyDelta_X(cur_enemy_index) & 0x8000) == 0) { E->nlmn_var_D = addr_kNorfairLavaMan_Ilist_AD50; E->nlmn_var_B = 1; } NorfairLavaMan_Func_20(); E->nlmn_var_F = FUNC16(NorfairLavaMan_Func_16); E->nlmn_var_12 = E->base.x_pos; E->nlmn_var_13 = E->base.y_pos; } else { Get_NorfairLavaMan(cur_enemy_index)->base.y_pos = enemy_drawing_queue[(cur_enemy_index >> 1) + 93] - g_word_A8AF79[enemy_drawing_queue_sizes[(cur_enemy_index >> 1) + 1] >> 1]; } NorfairLavaMan_Func_19(cur_enemy_index); } void NorfairLavaMan_Func_18(uint16 k) { // 0xA8B3A7 int v1 = cur_enemy_index >> 1; if (enemy_drawing_queue[v1 + 87] == FUNC16(NorfairLavaMan_Func_7)) Get_NorfairLavaMan(cur_enemy_index)->nlmn_var_F = FUNC16(NorfairLavaMan_Func_15); else Get_NorfairLavaMan(cur_enemy_index)->base.y_pos = enemy_drawing_queue[v1 + 93] - g_word_A8AF79[enemy_drawing_queue_sizes[v1 + 1] >> 1]; NorfairLavaMan_Func_19(cur_enemy_index); } void NorfairLavaMan_Func_19(uint16 k) { // 0xA8B3CB int v1 = k >> 1; uint16 v2 = enemy_drawing_queue[v1 + 61] - Get_NorfairLavaMan(k)->base.y_pos + 2; enemy_drawing_queue[v1 + 64] = v2; if (sign16(v2 - 8)) enemy_drawing_queue[v1 + 64] = 8; } void NorfairLavaMan_Func_20(void) { // 0xA8B3E5 Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); uint16 nlmn_var_D = E->nlmn_var_D; if (nlmn_var_D != E->nlmn_var_C) { E->base.current_instruction = nlmn_var_D; E->nlmn_var_C = nlmn_var_D; E->base.instruction_timer = 1; E->base.timer = 0; } } void NorfairLavaMan_Powerbomb(void) { // 0xA8B400 Enemy_NormalPowerBombAI_A8(); NorfairLavaMan_Common(); } void NorfairLavaMan_Touch(void) { // 0xA8B406 Enemy_NormalTouchAI_A8(); NorfairLavaMan_Common(); } void NorfairLavaMan_Shot(void) { // 0xA8B40C NormalEnemyShotAi(); NorfairLavaMan_Common(); } void NorfairLavaMan_Common(void) { // 0xA8B410 Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); Enemy_NorfairLavaMan *E1 = Get_NorfairLavaMan(cur_enemy_index + 64); Enemy_NorfairLavaMan *E2 = Get_NorfairLavaMan(cur_enemy_index + 128); if (!E->base.health) { E1->base.properties |= 0x200; E2->base.properties |= 0x200; } uint16 frozen_timer = E->base.frozen_timer; if (frozen_timer) { E1->base.frozen_timer = frozen_timer; E1->base.ai_handler_bits |= 4; E2->base.frozen_timer = frozen_timer; E2->base.ai_handler_bits |= 4; } } const uint16 *Beetom_Instr_1(uint16 k, const uint16 *jp) { // 0xA8B75E return jp; } void Beetom_Func_1(void) { // 0xA8B762 Enemy_Beetom *E = Get_Beetom(cur_enemy_index); E->base.current_instruction = E->beetom_var_00; E->base.instruction_timer = 1; E->base.timer = 0; } void Beetom_Init(void) { // 0xA8B776 Enemy_Beetom *E = Get_Beetom(cur_enemy_index); E->beetom_var_D = 0; E->beetom_var_C = 0; E->beetom_var_05 = 0; E->beetom_var_08 = 0; E->beetom_var_A = 0; E->beetom_var_E = 64; E->beetom_var_F = joypad1_lastkeys; random_number = 23; E->beetom_var_02 = Beetom_Func_2(12288, 4); E->beetom_var_03 = Beetom_Func_2(0x4000, 5); E->beetom_var_04 = Beetom_Func_2(12288, 3); E->beetom_var_00 = addr_kBeetom_Ilist_B6F2; if ((GetSamusEnemyDelta_X(cur_enemy_index) & 0x8000) != 0) E->beetom_var_00 = addr_kBeetom_Ilist_B696; Beetom_Func_1(); E->beetom_var_C = FUNC16(Beetom_Func_3); } uint16 Beetom_Func_2(uint16 r22, uint16 r24) { // 0xA8B7EF uint16 r18 = 0, r20 = 0; do { r18 += r24; r20 += *(uint16 *)((uint8 *)kCommonEnemySpeeds_Quadratic + (8 * r18) + 1); } while (sign16(r20 - r22)); return r18; } void Beetom_Func_3(void) { // 0xA8B814 if (IsSamusWithinEnemy_X(cur_enemy_index, 0x60)) Get_Beetom(cur_enemy_index)->beetom_var_C = FUNC16(Beetom_Func_12); else Get_Beetom(cur_enemy_index)->beetom_var_C = FUNC16(Beetom_Func_4); } void Beetom_Func_4(void) { // 0xA8B82F NextRandom(); Enemy_Beetom *E = Get_Beetom(cur_enemy_index); E->beetom_var_C = kBeetom_Ilist_B74E[random_number & 7]; E->beetom_var_09 = random_number & 1; } void Beetom_Func_5(void) { // 0xA8B84F Enemy_Beetom *E = Get_Beetom(cur_enemy_index); E->beetom_var_D = 32; E->beetom_var_C = FUNC16(Beetom_Func_17); } void Beetom_Func_6(void) { // 0xA8B85F Enemy_Beetom *E = Get_Beetom(cur_enemy_index); E->beetom_var_C = FUNC16(Beetom_Func_18); E->beetom_var_00 = addr_kBeetom_Ilist_B696; Beetom_Func_1(); } void Beetom_Func_7(void) { // 0xA8B873 Enemy_Beetom *E = Get_Beetom(cur_enemy_index); E->beetom_var_C = FUNC16(Beetom_Func_19); E->beetom_var_00 = addr_kBeetom_Ilist_B6F2; Beetom_Func_1(); } void Beetom_Func_8(void) { // 0xA8B887 Enemy_Beetom *E = Get_Beetom(cur_enemy_index); E->beetom_var_B = E->beetom_var_02; E->beetom_var_C = FUNC16(Beetom_Func_20); E->beetom_var_05 = 0; E->beetom_var_00 = addr_kBeetom_Ilist_B6AC; Beetom_Func_1(); } void Beetom_Func_9(void) { // 0xA8B8A9 Enemy_Beetom *E = Get_Beetom(cur_enemy_index); E->beetom_var_B = E->beetom_var_02; E->beetom_var_C = FUNC16(Beetom_Func_21); E->beetom_var_05 = 0; E->beetom_var_00 = addr_kBeetom_Ilist_B708; Beetom_Func_1(); } void Beetom_Func_10(void) { // 0xA8B8CB Enemy_Beetom *E = Get_Beetom(cur_enemy_index); E->beetom_var_B = E->beetom_var_03; E->beetom_var_C = FUNC16(Beetom_Func_24); E->beetom_var_05 = 0; E->beetom_var_00 = addr_kBeetom_Ilist_B6AC; Beetom_Func_1(); } void Beetom_Func_11(void) { // 0xA8B8ED Enemy_Beetom *E = Get_Beetom(cur_enemy_index); E->beetom_var_B = E->beetom_var_03; E->beetom_var_C = FUNC16(Beetom_Func_25); E->beetom_var_05 = 0; E->beetom_var_00 = addr_kBeetom_Ilist_B708; Beetom_Func_1(); } void Beetom_Func_12(void) { // 0xA8B90F Enemy_Beetom *E = Get_Beetom(cur_enemy_index); E->beetom_var_B = E->beetom_var_04; E->beetom_var_00 = addr_kBeetom_Ilist_B708; E->beetom_var_C = FUNC16(Beetom_Func_29); E->beetom_var_09 = 1; if ((GetSamusEnemyDelta_X(cur_enemy_index) & 0x8000) != 0) { E->beetom_var_00 = addr_kBeetom_Ilist_B6AC; E->beetom_var_C = FUNC16(Beetom_Func_28); E->beetom_var_09 = 0; } Beetom_Func_1(); E->beetom_var_05 = 0; } void Beetom_Func_13(void) { // 0xA8B952 Enemy_Beetom *E = Get_Beetom(cur_enemy_index); E->beetom_var_00 = addr_kBeetom_Ilist_B6CC; Beetom_Func_1(); E->beetom_var_C = FUNC16(Beetom_Func_32); } void Beetom_Func_14(void) { // 0xA8B966 Enemy_Beetom *E = Get_Beetom(cur_enemy_index); E->beetom_var_00 = addr_kBeetom_Ilist_B728; Beetom_Func_1(); E->beetom_var_C = FUNC16(Beetom_Func_33); } void Beetom_Func_15(void) { // 0xA8B97A Enemy_Beetom *E = Get_Beetom(cur_enemy_index); E->beetom_var_00 = addr_kBeetom_Ilist_B696; if (E->beetom_var_09) E->beetom_var_00 = addr_kBeetom_Ilist_B6F2; Beetom_Func_1(); E->beetom_var_05 = 0; E->beetom_var_C = FUNC16(Beetom_Func_35); } void Beetom_Func_16(void) { // 0xA8B9A2 Enemy_Beetom *E = Get_Beetom(cur_enemy_index); E->beetom_var_B = 0; E->beetom_var_C = FUNC16(Beetom_Func_36); } void Beetom_Func_17(void) { // 0xA8B9B2 Enemy_Beetom *E = Get_Beetom(cur_enemy_index); if ((--E->beetom_var_D & 0x8000) != 0) E->beetom_var_C = FUNC16(Beetom_Func_3); } void Beetom_Func_18(void) { // 0xA8B9C1 Enemy_Beetom *E = Get_Beetom(cur_enemy_index); if ((--E->beetom_var_D & 0x8000) != 0) { E->beetom_var_D = 64; E->beetom_var_C = FUNC16(Beetom_Func_3); } else { E->base.x_pos -= 8; if (Enemy_MoveDown(cur_enemy_index, INT16_SHL16(1))) { E->base.x_pos += 8; if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index, __PAIR32__(-1, -16384))) E->beetom_var_C = FUNC16(Beetom_Func_7); } else { E->beetom_var_C = FUNC16(Beetom_Func_7); --E->base.y_pos; E->base.x_pos += 8; } } } void Beetom_Func_19(void) { // 0xA8BA24 Enemy_Beetom *E = Get_Beetom(cur_enemy_index); if ((--E->beetom_var_D & 0x8000) != 0) { E->beetom_var_D = 64; E->beetom_var_C = FUNC16(Beetom_Func_3); } else { E->base.x_pos += 8; if (Enemy_MoveDown(cur_enemy_index, INT16_SHL16(1))) { E->base.x_pos -= 8; if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index, __PAIR32__(0, 0x4000))) E->beetom_var_C = FUNC16(Beetom_Func_6); } else { E->beetom_var_C = FUNC16(Beetom_Func_6); --E->base.y_pos; E->base.x_pos -= 8; } } } void Beetom_Func_22(uint16 k) { // 0xA8BAE7 Enemy_Beetom *E = Get_Beetom(k); int v2 = (8 * E->beetom_var_B) >> 1; if (Enemy_MoveDown(k, kCommonEnemySpeeds_Quadratic32[(v2 + 2) >> 1])) { E->beetom_var_C = FUNC16(Beetom_Func_15); } else { E->beetom_var_B -= 4; if (sign16(E->beetom_var_B)) { E->beetom_var_B = 0; E->beetom_var_05 = 1; } } } void Beetom_Func_23(uint16 k) { // 0xA8BB20 Enemy_Beetom *E = Get_Beetom(k); int v2 = (8 * E->beetom_var_B) >> 1; if (Enemy_MoveDown(k, kCommonEnemySpeeds_Quadratic32[v2 >> 1])) { E->beetom_var_C = FUNC16(Beetom_Func_3); } else { E->beetom_var_B += 4; if (!sign16(E->beetom_var_B - 64)) E->beetom_var_B = 64; } } void Beetom_Func_20(void) { // 0xA8BA84 Enemy_Beetom *E = Get_Beetom(cur_enemy_index); if (E->beetom_var_05) Beetom_Func_23(cur_enemy_index); else Beetom_Func_22(cur_enemy_index); if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index, __PAIR32__(-1, -16384))) { E->beetom_var_09 ^= 1; E->beetom_var_C = FUNC16(Beetom_Func_15); } } void Beetom_Func_21(void) { // 0xA8BAB7 Enemy_Beetom *E = Get_Beetom(cur_enemy_index); if (E->beetom_var_05) Beetom_Func_23(cur_enemy_index); else Beetom_Func_22(cur_enemy_index); if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index, __PAIR32__(0, 0x4000))) { E->beetom_var_09 ^= 1; E->beetom_var_C = FUNC16(Beetom_Func_15); } } void Beetom_Func_26(uint16 k) { // 0xA8BBB8 Enemy_Beetom *E = Get_Beetom(k); int v2 = (8 * E->beetom_var_B) >> 1; if (Enemy_MoveDown(k, kCommonEnemySpeeds_Quadratic32[(v2 + 2) >> 1])) { E->beetom_var_C = FUNC16(Beetom_Func_15); } else { E->beetom_var_B -= 5; if (sign16(E->beetom_var_B)) { E->beetom_var_B = 0; E->beetom_var_05 = 1; } } } void Beetom_Func_27(uint16 k) { // 0xA8BBF1 Enemy_Beetom *E = Get_Beetom(k); int v2 = (8 * E->beetom_var_B) >> 1; if (Enemy_MoveDown(k, kCommonEnemySpeeds_Quadratic32[v2 >> 1])) { E->beetom_var_C = FUNC16(Beetom_Func_3); } else { E->beetom_var_B += 5; if (!sign16(E->beetom_var_B - 64)) E->beetom_var_B = 64; } } void Beetom_Func_24(void) { // 0xA8BB55 Enemy_Beetom *E = Get_Beetom(cur_enemy_index); if (E->beetom_var_05) Beetom_Func_27(cur_enemy_index); else Beetom_Func_26(cur_enemy_index); if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index, __PAIR32__(-1, -16384))) { E->beetom_var_09 ^= 1; E->beetom_var_C = FUNC16(Beetom_Func_15); } } void Beetom_Func_25(void) { // 0xA8BB88 Enemy_Beetom *E = Get_Beetom(cur_enemy_index); if (E->beetom_var_05) Beetom_Func_27(cur_enemy_index); else Beetom_Func_26(cur_enemy_index); if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index, __PAIR32__(0, 0x4000))) { E->beetom_var_09 ^= 1; E->beetom_var_C = FUNC16(Beetom_Func_15); } } void Beetom_Func_30(uint16 k) { // 0xA8BC8A Enemy_Beetom *E = Get_Beetom(k); int v2 = (8 * E->beetom_var_B) >> 1; if (Enemy_MoveDown(k, kCommonEnemySpeeds_Quadratic32[(v2 + 2) >> 1])) { E->beetom_var_C = FUNC16(Beetom_Func_15); } else { int16 v3 = E->beetom_var_B - 5; E->beetom_var_B = v3; if (v3 < 0) { E->beetom_var_B = 0; E->beetom_var_05 = 1; } } } void Beetom_Func_31(uint16 k) { // 0xA8BCC3 Enemy_Beetom *E = Get_Beetom(k); int v2 = (8 * E->beetom_var_B) >> 1; if (Enemy_MoveDown(k, kCommonEnemySpeeds_Quadratic32[v2 >> 1])) { E->beetom_var_C = FUNC16(Beetom_Func_3); } else { uint16 v3 = E->beetom_var_B + 3; E->beetom_var_B = v3; if (!sign16(v3 - 64)) E->beetom_var_B = 64; } } void Beetom_Func_28(void) { // 0xA8BC26 Enemy_Beetom *E = Get_Beetom(cur_enemy_index); if (E->beetom_var_05) Beetom_Func_31(cur_enemy_index); else Beetom_Func_30(cur_enemy_index); if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index, __PAIR32__(-3, 0))) { E->beetom_var_09 ^= 1; E->beetom_var_C = FUNC16(Beetom_Func_15); } } void Beetom_Func_29(void) { // 0xA8BC5A Enemy_Beetom *E = Get_Beetom(cur_enemy_index); if (E->beetom_var_05) Beetom_Func_31(cur_enemy_index); else Beetom_Func_30(cur_enemy_index); if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index, __PAIR32__(3, 0))) { E->beetom_var_09 ^= 1; E->beetom_var_C = FUNC16(Beetom_Func_15); } } void Beetom_Func_34(void) { // 0xA8BD8C Enemy_Beetom *E = Get_Beetom(cur_enemy_index); if (joypad1_lastkeys != E->beetom_var_F) { E->beetom_var_F = joypad1_lastkeys; --E->beetom_var_E; } } void Beetom_Func_32(void) { // 0xA8BCF8 Enemy_Beetom *E = Get_Beetom(cur_enemy_index); if (E->beetom_var_E) { E->base.x_pos = samus_x_pos; E->base.y_pos = samus_y_pos - 4; Beetom_Func_34(); } else { if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index, __PAIR32__(16, 0))) { E->beetom_var_09 = 1; Enemy_MoveRight_IgnoreSlopes(cur_enemy_index, __PAIR32__(-32, 0)); } E->beetom_var_08 = 0; E->beetom_var_C = FUNC16(Beetom_Func_16); } } void Beetom_Func_33(void) { // 0xA8BD42 Enemy_Beetom *E = Get_Beetom(cur_enemy_index); if (E->beetom_var_E) { E->base.x_pos = samus_x_pos; E->base.y_pos = samus_y_pos - 4; Beetom_Func_34(); } else { if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index, __PAIR32__(-16, 0))) { E->beetom_var_09 = 0; Enemy_MoveRight_IgnoreSlopes(cur_enemy_index, __PAIR32__(32, 0)); } E->beetom_var_08 = 0; E->beetom_var_C = FUNC16(Beetom_Func_16); } } void Beetom_Func_35(void) { // 0xA8BD9D if (Enemy_MoveDown(cur_enemy_index, __PAIR32__(3, 0))) { Enemy_Beetom *E = Get_Beetom(cur_enemy_index); if (E->beetom_var_09) E->beetom_var_C = FUNC16(Beetom_Func_7); else E->beetom_var_C = FUNC16(Beetom_Func_6); } } void Beetom_Func_37(uint16 k) { // 0xA8BDCC Enemy_Beetom *E = Get_Beetom(k); int v2 = (8 * E->beetom_var_B) >> 1; if (Enemy_MoveDown(k, kCommonEnemySpeeds_Quadratic32[v2 >> 1])) { E->beetom_var_C = FUNC16(Beetom_Func_3); } else { uint16 v3 = E->beetom_var_B + 1; E->beetom_var_B = v3; if (!sign16(v3 - 64)) E->beetom_var_B = 64; } uint16 v4 = (E->beetom_var_09) ? -2 : 2; if (Enemy_MoveRight_IgnoreSlopes(k, __PAIR32__(v4, 0))) { E->beetom_var_09 ^= 1; E->beetom_var_C = FUNC16(Beetom_Func_15); } } void Beetom_Func_36(void) { // 0xA8BDC5 Beetom_Func_37(cur_enemy_index); } void CallBeetomFunc(uint32 ea) { switch (ea) { case fnBeetom_Func_3: Beetom_Func_3(); return; // 0xa8b814 case fnBeetom_Func_4: Beetom_Func_4(); return; // 0xa8b82f case fnBeetom_Func_5: Beetom_Func_5(); return; // 0xa8b84f case fnBeetom_Func_6: Beetom_Func_6(); return; // 0xa8b85f case fnBeetom_Func_7: Beetom_Func_7(); return; // 0xa8b873 case fnBeetom_Func_8: Beetom_Func_8(); return; // 0xa8b887 case fnBeetom_Func_9: Beetom_Func_9(); return; // 0xa8b8a9 case fnBeetom_Func_10: Beetom_Func_10(); return; // 0xa8b8cb case fnBeetom_Func_11: Beetom_Func_11(); return; // 0xa8b8ed case fnBeetom_Func_12: Beetom_Func_12(); return; // 0xa8b90f case fnBeetom_Func_13: Beetom_Func_13(); return; // 0xa8b952 case fnBeetom_Func_14: Beetom_Func_14(); return; // 0xa8b966 case fnBeetom_Func_15: Beetom_Func_15(); return; // 0xa8b97a case fnBeetom_Func_16: Beetom_Func_16(); return; // 0xa8b9a2 case fnBeetom_Func_17: Beetom_Func_17(); return; // 0xa8b9b2 case fnBeetom_Func_18: Beetom_Func_18(); return; // 0xa8b9c1 case fnBeetom_Func_19: Beetom_Func_19(); return; // 0xa8ba24 case fnBeetom_Func_20: Beetom_Func_20(); return; // 0xa8ba84 case fnBeetom_Func_21: Beetom_Func_21(); return; // 0xa8bab7 case fnBeetom_Func_24: Beetom_Func_24(); return; // 0xa8bb55 case fnBeetom_Func_25: Beetom_Func_25(); return; // 0xa8bb88 case fnBeetom_Func_28: Beetom_Func_28(); return; // 0xa8bc26 case fnBeetom_Func_29: Beetom_Func_29(); return; // 0xa8bc5a case fnBeetom_Func_32: Beetom_Func_32(); return; // 0xa8bcf8 case fnBeetom_Func_33: Beetom_Func_33(); return; // 0xa8bd42 case fnBeetom_Func_35: Beetom_Func_35(); return; // 0xa8bd9d case fnBeetom_Func_36: Beetom_Func_36(); return; // 0xa8bdc5 default: Unreachable(); } } void Beetom_Main(void) { // 0xA8B80D Enemy_Beetom *E = Get_Beetom(cur_enemy_index); CallBeetomFunc(E->beetom_var_C | 0xA80000); } void Beetom_Touch(void) { // 0xA8BE2E Enemy_Beetom *E = Get_Beetom(cur_enemy_index); if (!E->beetom_var_08) { if (E->beetom_var_09) E->beetom_var_C = FUNC16(Beetom_Func_14); else E->beetom_var_C = FUNC16(Beetom_Func_13); E->beetom_var_08 = 1; E->beetom_var_E = 64; E->base.layer = 2; E->beetom_var_06 = samus_x_pos - E->base.x_pos; E->beetom_var_07 = samus_y_pos - E->base.y_pos; } if (samus_contact_damage_index) goto LABEL_11; if ((random_enemy_counter & 7) == 7 && !sign16(samus_health - 30)) QueueSfx3_Max6(0x2D); if ((E->base.frame_counter & 0x3F) == 63) { LABEL_11: Enemy_NormalTouchAI_A8(); samus_invincibility_timer = 0; samus_knockback_timer = 0; } } void Beetom_Shot(void) { // 0xA8BEAC Enemy_NormalShotAI_A8(); Enemy_Beetom *E = Get_Beetom(cur_enemy_index); if (E->base.frozen_timer && (E->beetom_var_C == FUNC16(Beetom_Func_33) || E->beetom_var_C == FUNC16(Beetom_Func_32))) { E->beetom_var_C = FUNC16(Beetom_Func_15); } E->beetom_var_08 = 0; } void MaridiaFloater_Init(void) { // 0xA8C1C9 Enemy_MaridiaFloater *E = Get_MaridiaFloater(cur_enemy_index); E->base.properties |= kEnemyProps_DisableSamusColl; E->base.spritemap_pointer = addr_kSpritemap_Nothing_A8; E->base.instruction_timer = 1; E->base.timer = 0; if (E->mfr_parameter_1) { E->mfr_var_A = E->base.x_pos; E->mfr_var_B = E->base.y_pos; E->mfr_var_F = FUNC16(nullsub_256); E->base.current_instruction = addr_stru_A8C199; E->mfr_var_D = E->mfr_parameter_2; } else { E->mfr_var_E = 60; E->mfr_var_F = FUNC16(MaridiaFloater_Func_3); E->base.current_instruction = addr_kMaridiaFloater_Ilist_C173; } } void MaridiaFloater_Main(void) { // 0xA8C21C Enemy_MaridiaFloater *E = Get_MaridiaFloater(cur_enemy_index); CallEnemyPreInstr(E->mfr_var_F | 0xA80000); } void MaridiaFloater_Func_1(uint16 k) { // 0xA8C223 for (int i = 7; i >= 0; --i) SpawnEnemyProjectileWithGfx(i, k, addr_kEproj_MaridiaFloatersSpikes); } void MaridiaFloater_Func_2(uint16 k) { // 0xA8C234 int v1 = k >> 1; uint16 v2 = enemy_drawing_queue[v1 + 103]; if (sign16(v2 + 0x3E6F)) { uint16 v3 = (uint16)(v2 - 4 + 15997) >> 1; if (!sign16(v3 - 6)) v3 = 0; enemy_drawing_queue[v1 + 93] = g_word_A8C277[v3 >> 1] + Get_MaridiaFloater(k)->base.y_pos; } else { uint16 v4 = (uint16)(v2 - 4 + 15983) >> 1; if (!sign16(v4 - 6)) v4 = 0; enemy_drawing_queue[v1 + 93] = g_word_A8C27D[v4 >> 1] + Get_MaridiaFloater(k)->base.y_pos; } } void MaridiaFloater_Func_3(uint16 k) { // 0xA8C283 Enemy_MaridiaFloater *E = Get_MaridiaFloater(k); bool v2 = E->mfr_var_E == 1; bool v3 = (--E->mfr_var_E & 0x8000) != 0; if (v2 || v3) { int v4 = k >> 1; enemy_drawing_queue[v4 + 104] = 1; enemy_drawing_queue[v4 + 103] = addr_kMaridiaFloater_Ilist_C183; E->mfr_var_F = FUNC16(MaridiaFloater_Func_4); E->mfr_var_E = 10; } MaridiaFloater_Func_2(k); } void MaridiaFloater_Func_4(uint16 k) { // 0xA8C2A6 Enemy_MaridiaFloater *E = Get_MaridiaFloater(k); bool v2 = E->mfr_var_E == 1; bool v3 = (--E->mfr_var_E & 0x8000) != 0; if (v2 || v3) { E->mfr_var_F = FUNC16(MaridiaFloater_Func_5); E->mfr_var_A = g_word_A8C1C5; E->mfr_var_B = g_word_A8C1C7; E->base.instruction_timer = 1; E->base.current_instruction = addr_kMaridiaFloater_Ilist_C163; } MaridiaFloater_Func_2(k); } void MaridiaFloater_Func_5(uint16 k) { // 0xA8C2CF Enemy_MaridiaFloater *E = Get_MaridiaFloater(k); if ((E->base.ai_handler_bits & 1) != 0) { E->mfr_var_F = FUNC16(MaridiaFloater_Func_7); MaridiaFloater_Func_7(k); } else { bool v2 = E->mfr_var_D == 1; bool v3 = (--E->mfr_var_D & 0x8000) != 0; if (v2 || v3) { E->mfr_var_D = 5; int v4 = k >> 1; uint16 v5 = g_word_A8C1A1[E->mfr_var_C] + enemy_drawing_queue_sizes[v4]; enemy_drawing_queue[v4 + 91] = v5; E->base.x_pos = v5; uint16 v6 = E->mfr_var_C + 1; if (!sign16(E->mfr_var_C - 11)) v6 = 0; E->mfr_var_C = v6; } uint16 mfr_var_B = E->mfr_var_B; bool v8 = __CFADD__uint16(g_word_A8C1BB, mfr_var_B); E->mfr_var_B = g_word_A8C1BB + mfr_var_B; E->mfr_var_A += g_word_A8C1B9 + v8; if (Enemy_MoveDown(k, __PAIR32__(E->mfr_var_A, E->mfr_var_B)) || (int16)(enemy_drawing_queue_sizes[(k >> 1) + 1] - g_word_A8C19F - E->base.y_pos) >= 0) { uint16 mfr_var_C = E->mfr_var_C; if (!mfr_var_C || mfr_var_C == 6) { E->mfr_var_F = FUNC16(MaridiaFloater_Func_10); E->mfr_var_E = 10; int v10 = k >> 1; enemy_drawing_queue[v10 + 104] = 1; enemy_drawing_queue[v10 + 103] = addr_kMaridiaFloater_Ilist_C191; } else { E->mfr_var_F = FUNC16(MaridiaFloater_Func_6); } } MaridiaFloater_Func_2(k); } } void MaridiaFloater_Func_6(uint16 k) { // 0xA8C36B Enemy_MaridiaFloater *E = Get_MaridiaFloater(k); bool v2 = E->mfr_var_D == 1; bool v3 = (--E->mfr_var_D & 0x8000) != 0; if (!v2 && !v3) { LABEL_9:; uint16 mfr_var_B = E->mfr_var_B; bool v9 = __CFADD__uint16(g_word_A8C1BB, mfr_var_B); E->mfr_var_B = g_word_A8C1BB + mfr_var_B; E->mfr_var_A += g_word_A8C1B9 + v9; Enemy_MoveDown(k, __PAIR32__(E->mfr_var_A, E->mfr_var_B)); goto LABEL_10; } E->mfr_var_D = 5; int v4; v4 = k >> 1; { uint16 v5 = g_word_A8C1A1[E->mfr_var_C] + enemy_drawing_queue_sizes[v4]; enemy_drawing_queue[v4 + 91] = v5; E->base.x_pos = v5; } if (E->mfr_var_C && E->mfr_var_C != 6) { uint16 v7 = E->mfr_var_C + 1; if (!sign16(v7 - 12)) v7 = 0; E->mfr_var_C = v7; goto LABEL_9; } E->mfr_var_F = FUNC16(MaridiaFloater_Func_10); E->mfr_var_E = 10; enemy_drawing_queue[v4 + 104] = 1; enemy_drawing_queue[v4 + 103] = addr_kMaridiaFloater_Ilist_C191; LABEL_10: MaridiaFloater_Func_2(k); } void MaridiaFloater_Func_7(uint16 k) { // 0xA8C3E1 Enemy_MaridiaFloater *E = Get_MaridiaFloater(k); if ((E->base.ai_handler_bits & 1) != 0) { bool v2 = E->mfr_var_D == 1; bool v3 = (--E->mfr_var_D & 0x8000) != 0; if (v2 || v3) { E->mfr_var_D = 5; int v4 = k >> 1; uint16 v5 = g_word_A8C1A1[E->mfr_var_C] + enemy_drawing_queue_sizes[v4]; enemy_drawing_queue[v4 + 91] = v5; E->base.x_pos = v5; uint16 v6 = E->mfr_var_C + 1; if (!sign16(E->mfr_var_C - 11)) v6 = 0; E->mfr_var_C = v6; } uint16 mfr_var_B = E->mfr_var_B; bool v8 = __CFADD__uint16(g_word_A8C1BB, mfr_var_B); E->mfr_var_B = g_word_A8C1BB + mfr_var_B; E->mfr_var_A += g_word_A8C1B9 + v8; if (Enemy_MoveDown(k, __PAIR32__(E->mfr_var_A, E->mfr_var_B)) || (int16)(enemy_drawing_queue_sizes[(k >> 1) + 1] - enemy_drawing_queue_sizes[(k >> 1) + 3] - E->base.y_pos) >= 0) { uint16 mfr_var_C = E->mfr_var_C; if (!mfr_var_C || mfr_var_C == 6) E->mfr_var_F = FUNC16(MaridiaFloater_Func_9); else E->mfr_var_F = FUNC16(MaridiaFloater_Func_8); } MaridiaFloater_Func_2(k); } else { E->mfr_var_F = FUNC16(MaridiaFloater_Func_6); } } void MaridiaFloater_Func_8(uint16 k) { // 0xA8C469 Enemy_MaridiaFloater *E = Get_MaridiaFloater(k); if ((E->base.ai_handler_bits & 1) == 0) { E->mfr_var_F = FUNC16(MaridiaFloater_Func_6); return; } bool v2 = E->mfr_var_D == 1; bool v3 = (--E->mfr_var_D & 0x8000) != 0; if (!v2 && !v3) goto LABEL_11; E->mfr_var_D = 5; int v4; v4 = k >> 1; uint16 v5; v5 = g_word_A8C1A1[E->mfr_var_C] + enemy_drawing_queue_sizes[v4]; enemy_drawing_queue[v4 + 91] = v5; E->base.x_pos = v5; if (E->mfr_var_C && E->mfr_var_C != 6) { { uint16 v7 = E->mfr_var_C + 1; if (!sign16(v7 - 12)) v7 = 0; E->mfr_var_C = v7; } LABEL_11:; uint16 mfr_var_B = E->mfr_var_B; bool v9 = __CFADD__uint16(g_word_A8C1BB, mfr_var_B); E->mfr_var_B = g_word_A8C1BB + mfr_var_B; E->mfr_var_A += g_word_A8C1B9 + v9; Enemy_MoveDown(k, __PAIR32__(E->mfr_var_A, E->mfr_var_B)); goto LABEL_12; } E->mfr_var_F = FUNC16(MaridiaFloater_Func_9); LABEL_12: MaridiaFloater_Func_2(k); } void MaridiaFloater_Func_9(uint16 k) { // 0xA8C4DC Enemy_MaridiaFloater *E = Get_MaridiaFloater(k); if ((E->base.ai_handler_bits & 1) == 0) { E->mfr_var_F = FUNC16(MaridiaFloater_Func_10); E->mfr_var_E = 10; int v2 = k >> 1; enemy_drawing_queue[v2 + 104] = 1; enemy_drawing_queue[v2 + 103] = addr_kMaridiaFloater_Ilist_C191; } MaridiaFloater_Func_2(k); } void MaridiaFloater_Func_10(uint16 k) { // 0xA8C500 Enemy_MaridiaFloater *E = Get_MaridiaFloater(k); bool v2 = E->mfr_var_E == 1; bool v3 = (--E->mfr_var_E & 0x8000) != 0; if (v2 || v3) { E->mfr_var_F = FUNC16(MaridiaFloater_Func_11); E->mfr_var_A = g_word_A8C1C1; E->mfr_var_B = g_word_A8C1C3; } MaridiaFloater_Func_2(k); } void MaridiaFloater_Func_11(uint16 k) { // 0xA8C51D Enemy_MaridiaFloater *E = Get_MaridiaFloater(k); uint16 mfr_var_B = E->mfr_var_B; bool v3 = __CFADD__uint16(g_word_A8C1BF, mfr_var_B); E->mfr_var_B = g_word_A8C1BF + mfr_var_B; E->mfr_var_A += g_word_A8C1BD + v3; Enemy_MoveDown(k, __PAIR32__(E->mfr_var_A, E->mfr_var_B)); int v4 = k >> 1; if ((int16)(E->base.y_pos - enemy_drawing_queue_sizes[v4 + 1]) >= 0) { E->base.y_pos = enemy_drawing_queue_sizes[v4 + 1]; E->mfr_var_F = FUNC16(MaridiaFloater_Func_3); E->mfr_var_E = 60; E->base.instruction_timer = 1; E->base.current_instruction = addr_kMaridiaFloater_Ilist_C173; } MaridiaFloater_Func_2(k); } void MaridiaFloater_Func_12(uint16 k) { // 0xA8C569 int v1 = k >> 1; if (!sign16(enemy_drawing_queue[v1 + 103] + 0x3E6F)) { uint16 v2 = (uint16)(enemy_drawing_queue[v1 + 103] - 4 + 15983) >> 1; if (v2) { enemy_drawing_queue[v1 + 103] = g_off_A8C599[v2 >> 1]; enemy_drawing_queue[v1 + 104] = 1; } } Enemy_MaridiaFloater *E = Get_MaridiaFloater(k); E->mfr_var_F = FUNC16(MaridiaFloater_Func_13); E->mfr_var_E = 32; MaridiaFloater_Func_2(k); } void MaridiaFloater_Func_13(uint16 k) { // 0xA8C59F uint16 v5; Enemy_MaridiaFloater *E = Get_MaridiaFloater(k); bool v2 = E->mfr_var_E == 1; bool v3 = (--E->mfr_var_E & 0x8000) != 0; if (v2 || v3) { int v4 = k >> 1; enemy_drawing_queue[v4 + 100] = 0; enemy_drawing_queue[v4 + 97] |= 0x200; MaridiaFloater_Func_1(k); //printf("A undefined!\n"); v5 = 0; EnemyDeathAnimation(k, v5); } else { MaridiaFloater_Func_2(k); } } void MaridiaFloater_Touch(void) { // 0xA8C5BE Enemy_MaridiaFloater *E = Get_MaridiaFloater(cur_enemy_index); if (!E->mfr_parameter_2) { uint16 palette_index = E->base.palette_index; NormalEnemyTouchAi(); if (!E->base.health) { enemy_drawing_queue[(cur_enemy_index >> 1) + 97] |= 0x200; E->base.palette_index = palette_index; MaridiaFloater_Func_1(cur_enemy_index); E->base.palette_index = 2560; } } } void MaridiaFloater_Shot(void) { // 0xA8C5EF Enemy_MaridiaFloater *E = Get_MaridiaFloater(cur_enemy_index); if (!E->mfr_parameter_2) { NormalEnemyShotAiSkipDeathAnim_CurEnemy(); if ((E->base.ai_handler_bits & 4) != 0) { int v2 = cur_enemy_index >> 1; enemy_drawing_queue[v2 + 109] = E->base.frozen_timer; enemy_drawing_queue[v2 + 99] |= 4; } if ((E->base.ai_handler_bits & 2) != 0) { int v3 = cur_enemy_index >> 1; enemy_drawing_queue[v3 + 108] = E->base.flash_timer; enemy_drawing_queue[v3 + 99] |= 2; } if (!E->base.health) { E->mfr_var_F = FUNC16(MaridiaFloater_Func_12); E->mfr_parameter_2 = 1; } } } void MaridiaFloater_Powerbomb(void) { // 0xA8C63F Enemy_NormalPowerBombAI_A8(); Enemy_MaridiaFloater *E = Get_MaridiaFloater(cur_enemy_index); if (E->base.health) { int v1 = cur_enemy_index >> 1; enemy_drawing_queue[v1 + 111] = E->base.shake_timer; enemy_drawing_queue[v1 + 110] = E->base.invincibility_timer; enemy_drawing_queue[v1 + 108] = E->base.flash_timer; enemy_drawing_queue[v1 + 109] = E->base.frozen_timer; enemy_drawing_queue[v1 + 99] = E->base.ai_handler_bits; } else { enemy_drawing_queue[(cur_enemy_index >> 1) + 97] |= 0x200; } } void WreckedShipRobot_Init(void) { // 0xA8CB77 if ((*(uint16 *)&boss_bits_for_area[area_index] & 1) != 0) { enemy_gfx_drawn_hook.bank = -88; enemy_gfx_drawn_hook.addr = FUNC16(WreckedShipRobot_Func_1); Enemy_WreckedShipRobot *E = Get_WreckedShipRobot(cur_enemy_index); E->base.properties |= 0xA000; E->base.instruction_timer = 4; E->base.timer = 0; E->base.current_instruction = addr_kWreckedShipRobot_Ilist_C6E5; E->wsrt_var_A = -512; wrecked_ship_robot_palanim_timer = 1; *(uint16 *)&wrecked_ship_robot_palanim_table_index = 0; E->wsrt_var_B = 0; wrecked_ship_robot_palanim_palindex = E->base.palette_index; } else { WreckedShipRobotDeactivated_Init(); } } void WreckedShipRobotDeactivated_Init(void) { // 0xA8CBCC EnemyData *v0 = gEnemyData(cur_enemy_index); uint16 parameter_1 = v0->parameter_1; if (sign16(parameter_1) || !sign16(parameter_1 - 4)) parameter_1 = 0; v0->parameter_1 = parameter_1; v0->current_instruction = g_off_A8CC30[parameter_1]; v0->properties |= 0x8000; v0->instruction_timer = 1; v0->timer = 0; wrecked_ship_robot_palanim_timer = 0; v0->ai_var_E = 0; v0->ai_preinstr = 1; int v2 = (16 * ((wrecked_ship_robot_palanim_palindex & 0xFF00) >> 8)) >> 1; palette_buffer[v2 + 137] = 10; palette_buffer[v2 + 138] = 10; palette_buffer[v2 + 139] = 10; palette_buffer[v2 + 140] = 10; } void WreckedShipRobot_Main(void) { // 0xA8CC36 Enemy_WreckedShipRobot *E = Get_WreckedShipRobot(cur_enemy_index); if (!Enemy_MoveDown(cur_enemy_index, __PAIR32__(E->wsrt_var_F, E->wsrt_var_E))) { ++E->base.instruction_timer; uint16 wsrt_var_E = E->wsrt_var_E; E->wsrt_var_E = wsrt_var_E + 0x8000; E->wsrt_var_F += __CFADD__uint16(wsrt_var_E, 0x8000); } } void WreckedShipRobot_Func_1(void) { // 0xA8CC67 uint16 i; int16 v2; if (!door_transition_flag_enemies) { if (wrecked_ship_robot_palanim_timer) { if (!--wrecked_ship_robot_palanim_timer) { int v1; for (i = *(uint16 *)&wrecked_ship_robot_palanim_table_index; ; i = 0) { v1 = i >> 1; v2 = g_word_A8CCC1[v1]; if (v2 >= 0) break; } int v3 = (16 * ((wrecked_ship_robot_palanim_palindex & 0xFF00) >> 8)) >> 1; palette_buffer[v3 + 137] = v2; palette_buffer[v3 + 138] = g_word_A8CCC1[v1 + 1]; palette_buffer[v3 + 139] = g_word_A8CCC1[v1 + 2]; palette_buffer[v3 + 140] = g_word_A8CCC1[v1 + 3]; wrecked_ship_robot_palanim_timer = g_word_A8CCC1[v1 + 4]; *(uint16 *)&wrecked_ship_robot_palanim_table_index = i + 10; } } } } void WreckedShipRobot_Func_2(uint16 k) { // 0xA8CCFF Enemy_WreckedShipRobot *E = Get_WreckedShipRobot(k); uint16 wsrt_var_B = E->wsrt_var_B; if (wsrt_var_B) E->wsrt_var_B = wsrt_var_B - 1; } const uint16 *WreckedShipRobot_Instr_4(uint16 k, const uint16 *jp) { // 0xA8CD09 WreckedShipRobot_Func_2(cur_enemy_index); Enemy_WreckedShipRobot *E = Get_WreckedShipRobot(cur_enemy_index); E->wsrt_var_A = -512; if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index, INT16_SHL16(-4))) { E->wsrt_var_B += 8; return INSTR_RETURN_ADDR(addr_kWreckedShipRobot_Ilist_C73F); } else { if (CheckIfEnemyTouchesSamus(cur_enemy_index)) { extra_samus_x_subdisplacement = 0; extra_samus_x_displacement = -4; } E->wsrt_var_D = E->base.y_pos; uint16 x_pos = E->base.x_pos; E->wsrt_var_C = x_pos; E->base.x_pos = x_pos - E->base.x_width - E->base.x_width; if (Enemy_MoveDown(cur_enemy_index, INT16_SHL16(1))) { E->base.x_pos = E->wsrt_var_C; E->base.y_pos = E->wsrt_var_D; } else { E->wsrt_var_B += 8; E->base.x_pos = E->wsrt_var_C; E->base.y_pos = E->wsrt_var_D; E->wsrt_var_A = 512; return INSTR_RETURN_ADDR(addr_kWreckedShipRobot_Ilist_CB65); } } return jp; } const uint16 *WreckedShipRobot_Instr_9(uint16 k, const uint16 *jp) { // 0xA8CDA4 WreckedShipRobot_Func_2(cur_enemy_index); Enemy_WreckedShipRobot *E = Get_WreckedShipRobot(cur_enemy_index); E->wsrt_var_A = -512; if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index, INT16_SHL16(-4))) { E->wsrt_var_B += 8; return INSTR_RETURN_ADDR(addr_kWreckedShipRobot_Ilist_C73F); } else if (CheckIfEnemyTouchesSamus(cur_enemy_index)) { extra_samus_x_subdisplacement = 0; extra_samus_x_displacement = -4; } return jp; } const uint16 *WreckedShipRobot_Instr_6(uint16 k, const uint16 *jp) { // 0xA8CDEA WreckedShipRobot_Func_2(cur_enemy_index); Enemy_WreckedShipRobot *E = Get_WreckedShipRobot(cur_enemy_index); E->wsrt_var_A = -512; if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index, INT16_SHL16(4))) { E->wsrt_var_B += 8; return INSTR_RETURN_ADDR(addr_stru_A8C6E9); } else { if (CheckIfEnemyTouchesSamus(cur_enemy_index)) { extra_samus_x_subdisplacement = 0; extra_samus_x_displacement = 4; } E->wsrt_var_D = E->base.y_pos; uint16 x_pos = E->base.x_pos; E->wsrt_var_C = x_pos; E->base.x_pos = E->base.x_width + E->base.x_width + x_pos; if (Enemy_MoveDown(cur_enemy_index, INT16_SHL16(1))) { E->base.x_pos = E->wsrt_var_C; E->base.y_pos = E->wsrt_var_D; } else { E->wsrt_var_B += 8; E->base.x_pos = E->wsrt_var_C; E->base.y_pos = E->wsrt_var_D; E->wsrt_var_A = -512; return INSTR_RETURN_ADDR(addr_kWreckedShipRobot_Ilist_C91B); } } return jp; } const uint16 *WreckedShipRobot_Instr_8(uint16 k, const uint16 *jp) { // 0xA8CE85 WreckedShipRobot_Func_2(cur_enemy_index); Enemy_WreckedShipRobot *E = Get_WreckedShipRobot(cur_enemy_index); E->wsrt_var_A = -512; if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index, INT16_SHL16(4))) { E->wsrt_var_B += 8; return INSTR_RETURN_ADDR(addr_stru_A8C6E9); } else if (CheckIfEnemyTouchesSamus(cur_enemy_index)) { extra_samus_x_subdisplacement = 0; extra_samus_x_displacement = 4; } return jp; } const uint16 *WreckedShipRobot_Instr_7(uint16 k, const uint16 *jp) { // 0xA8CECB return INSTR_RETURN_ADDR(addr_kWreckedShipRobot_Ilist_C92D); } const uint16 *WreckedShipRobot_Instr_15(uint16 k, const uint16 *jp) { // 0xA8CECF WreckedShipRobot_Func_2(cur_enemy_index); Enemy_WreckedShipRobot *E = Get_WreckedShipRobot(cur_enemy_index); E->wsrt_var_A = 512; if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index, INT16_SHL16(4))) { E->wsrt_var_B += 8; return INSTR_RETURN_ADDR(addr_kWreckedShipRobot_Ilist_C985); } else { if (CheckIfEnemyTouchesSamus(cur_enemy_index)) { extra_samus_x_subdisplacement = 0; extra_samus_x_displacement = 4; } E->wsrt_var_D = E->base.y_pos; uint16 x_pos = E->base.x_pos; E->wsrt_var_C = x_pos; E->base.x_pos = E->base.x_width + E->base.x_width + x_pos; if (Enemy_MoveDown(cur_enemy_index, INT16_SHL16(1))) { E->base.x_pos = E->wsrt_var_C; E->base.y_pos = E->wsrt_var_D; } else { E->wsrt_var_B += 8; E->base.x_pos = E->wsrt_var_C; E->base.y_pos = E->wsrt_var_D; E->wsrt_var_A = -512; return INSTR_RETURN_ADDR(addr_kWreckedShipRobot_Ilist_C91B); } } return jp; } const uint16 *WreckedShipRobot_Instr_18(uint16 k, const uint16 *jp) { // 0xA8CF6A WreckedShipRobot_Func_2(cur_enemy_index); Enemy_WreckedShipRobot *E = Get_WreckedShipRobot(cur_enemy_index); E->wsrt_var_A = 512; if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index, INT16_SHL16(4))) { E->wsrt_var_B += 8; return INSTR_RETURN_ADDR(addr_kWreckedShipRobot_Ilist_C985); } else if (CheckIfEnemyTouchesSamus(cur_enemy_index)) { extra_samus_x_subdisplacement = 0; extra_samus_x_displacement = 4; } return jp; } const uint16 *WreckedShipRobot_Instr_16(uint16 k, const uint16 *jp) { // 0xA8CFB0 WreckedShipRobot_Func_2(cur_enemy_index); Enemy_WreckedShipRobot *E = Get_WreckedShipRobot(cur_enemy_index); E->wsrt_var_A = 512; if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index, INT16_SHL16(-4))) { E->wsrt_var_B += 8; return INSTR_RETURN_ADDR(addr_stru_A8C6E9); } else { if (CheckIfEnemyTouchesSamus(cur_enemy_index)) { extra_samus_x_subdisplacement = 0; extra_samus_x_displacement = -4; } E->wsrt_var_D = E->base.y_pos; uint16 x_pos = E->base.x_pos; E->wsrt_var_C = x_pos; E->base.x_pos = x_pos - E->base.x_width - E->base.x_width; if (Enemy_MoveDown(cur_enemy_index, INT16_SHL16(1))) { E->base.y_pos = E->wsrt_var_D; E->base.x_pos = E->wsrt_var_C; } else { E->wsrt_var_B += 8; E->base.y_pos = E->wsrt_var_D; E->base.x_pos = E->wsrt_var_C; E->wsrt_var_A = 512; return INSTR_RETURN_ADDR(addr_kWreckedShipRobot_Ilist_CB65); } } return jp; } const uint16 *WreckedShipRobot_Instr_17(uint16 k, const uint16 *jp) { // 0xA8D04B WreckedShipRobot_Func_2(cur_enemy_index); Enemy_WreckedShipRobot *E = Get_WreckedShipRobot(cur_enemy_index); E->wsrt_var_A = 512; if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index, INT16_SHL16(-4))) { E->wsrt_var_B += 8; return INSTR_RETURN_ADDR(addr_stru_A8C6E9); } else if (CheckIfEnemyTouchesSamus(cur_enemy_index)) { extra_samus_x_subdisplacement = 0; extra_samus_x_displacement = -4; } return jp; } const uint16 *WreckedShipRobot_Instr_3(uint16 k, const uint16 *jp) { // 0xA8D091 Enemy_WreckedShipRobot *E = Get_WreckedShipRobot(cur_enemy_index); if ((int16)(layer1_x_pos - E->base.x_pos) < 0 && (int16)(layer1_x_pos + 256 - E->base.x_pos) >= 0 && (int16)(layer1_y_pos - E->base.y_pos) < 0 && (int16)(layer1_y_pos + 224 - E->base.y_pos) >= 0) { QueueSfx2_Max6(0x68); } return jp; } const uint16 *WreckedShipRobot_Instr_10(uint16 k, const uint16 *jp) { // 0xA8D0C2 return INSTR_RETURN_ADDR(addr_stru_A8C6E9); } const uint16 *WreckedShipRobot_Instr_14(uint16 k, const uint16 *jp) { // 0xA8D0C6 return WreckedShipRobot_CommonInstr(k, jp, addr_kWreckedShipRobot_Ilist_CB1D, addr_kEproj_WreckedShipRobotLaserUpRight); } const uint16 *WreckedShipRobot_Instr_2(uint16 k, const uint16 *jp) { // 0xA8D0D2 return WreckedShipRobot_CommonInstr(k, jp, addr_kWreckedShipRobot_Ilist_C8D1, addr_kEproj_WreckedShipRobotLaserUpLeft); } const uint16 *WreckedShipRobot_CommonInstr(uint16 k, const uint16 *jp, uint16 r50, uint16 r48) { // 0xA8D0DC Enemy_WreckedShipRobot *E = Get_WreckedShipRobot(k); if (E->wsrt_var_B) { WreckedShipRobot_Func_2(k); } else { uint16 v3 = (random_number & 0x1F) + 16; E->wsrt_var_B = v3; SpawnEnemyProjectileWithGfx(v3, cur_enemy_index, r48); return INSTR_RETURN_ADDR(r50); } return jp; } const uint16 *WreckedShipRobot_Instr_13(uint16 k, const uint16 *jp) { // 0xA8D100 return WreckedShipRobot_D10C(k, jp, addr_kWreckedShipRobot_Ilist_CB09); } const uint16 *WreckedShipRobot_Instr_1(uint16 k, const uint16 *jp) { // 0xA8D107 return WreckedShipRobot_D10C(k, jp, addr_kWreckedShipRobot_Ilist_C8BD); } const uint16 *WreckedShipRobot_D10C(uint16 k, const uint16 *jp, uint16 r50) { // 0xA8D10C Enemy_WreckedShipRobot *E = Get_WreckedShipRobot(k); if (E->wsrt_var_B) { WreckedShipRobot_Func_2(k); } else { uint16 v3 = (random_number & 0x1F) + 16; E->wsrt_var_B = v3; SpawnEnemyProjectileWithGfx(v3, cur_enemy_index, addr_kEproj_WreckedShipRobotLaserHorizontal); return INSTR_RETURN_ADDR(r50); } return jp; } const uint16 *WreckedShipRobot_Instr_12(uint16 k, const uint16 *jp) { // 0xA8D131 return WreckedShipRobot_D147(k, jp, addr_kEproj_WreckedShipRobotLaserDownRight, addr_kWreckedShipRobot_Ilist_CAFD); } const uint16 *WreckedShipRobot_Instr_5(uint16 k, const uint16 *jp) { // 0xA8D13D return WreckedShipRobot_D147(k, jp, addr_kEproj_WreckedShipRobotLaserDownLeft, addr_kWreckedShipRobot_Ilist_C8B1); } const uint16 *WreckedShipRobot_D147(uint16 k, const uint16 *jp, uint16 r48, uint16 r50) { // 0xA8D147 Enemy_WreckedShipRobot *E = Get_WreckedShipRobot(k); if (E->wsrt_var_B) { WreckedShipRobot_Func_2(k); } else { uint16 v3 = (random_number & 0x1F) + 16; E->wsrt_var_B = v3; SpawnEnemyProjectileWithGfx(v3, cur_enemy_index, r48); return INSTR_RETURN_ADDR(r50); } return jp; } const uint16 *WreckedShipRobot_Instr_11(uint16 k, const uint16 *jp) { // 0xA8D16B WreckedShipRobot_Func_2(cur_enemy_index); return jp; } void WreckedShipRobotDeactivated_Touch(void) { // 0xA8D174 if ((int16)(gEnemyData(cur_enemy_index)->x_pos - samus_x_pos) < 0) extra_samus_x_displacement = 4; else extra_samus_x_displacement = -4; } void WreckedShipRobotDeactivated_Shot(void) { // 0xA8D18D NormalEnemyShotAi(); } void WreckedShipRobot_Shot(void) { // 0xA8D192 if ((*(uint16 *)&boss_bits_for_area[area_index] & 1) != 0) { NormalEnemyShotAi(); Enemy_WreckedShipRobot *E = Get_WreckedShipRobot(cur_enemy_index); if (E->base.health) { uint16 v1; if ((E->wsrt_var_A & 0x8000) != 0) { if ((int16)(samus_x_pos - E->base.x_pos) >= 0) v1 = addr_kWreckedShipRobot_Ilist_C833; else v1 = addr_kWreckedShipRobot_Ilist_C7BB; } else if ((int16)(samus_x_pos - E->base.x_pos) < 0) { v1 = addr_kWreckedShipRobot_Ilist_CA7D; } else { v1 = addr_kWreckedShipRobot_Ilist_CA01; } E->base.current_instruction = v1; E->base.instruction_timer = 1; E->wsrt_var_B += 64; } } } void MaridiaPuffer_Init(void) { // 0xA8D8C9 Enemy_MaridiaPuffer *E = Get_MaridiaPuffer(cur_enemy_index); E->base.instruction_timer = 1; E->base.timer = 0; E->base.current_instruction = addr_kMaridiaPuffer_Ilist_D841; int v1 = (uint16)(4 * E->mpr_parameter_1) >> 1; uint16 v2 = g_word_A8D895[v1]; E->mpr_var_05 = v2; E->mpr_var_F = v2; E->mpr_var_06 = g_word_A8D895[v1 + 1]; E->mpr_var_E = 16; E->mpr_var_A = FUNC16(MaridiaPuffer_Func_1); E->mpr_var_00 = g_word_A8D885[E->mpr_parameter_2]; } void CallMaridiaPuffer(uint32 ea) { switch (ea) { case fnMaridiaPuffer_Func_1: MaridiaPuffer_Func_1(); return; case fnMaridiaPuffer_Func_2: MaridiaPuffer_Func_2(); return; case fnMaridiaPuffer_Func_3: MaridiaPuffer_Func_3(); return; case fnMaridiaPuffer_Func_4: MaridiaPuffer_Func_4(); return; default: Unreachable(); } } void MaridiaPuffer_Main(void) { // 0xA8D90B Enemy_MaridiaPuffer *E = Get_MaridiaPuffer(cur_enemy_index); uint16 v1 = E->mpr_var_07 - 1; E->mpr_var_07 = v1; if (!v1) { E->mpr_var_07 = 1; E->mpr_var_03 = 0; } CallMaridiaPuffer(E->mpr_var_A | 0xA80000); } void MaridiaPuffer_Func_1(void) { // 0xA8D92B Enemy_MaridiaPuffer *E = Get_MaridiaPuffer(cur_enemy_index); if (E->mpr_var_E-- == 1) { E->mpr_var_E = 16; E->mpr_var_A = FUNC16(MaridiaPuffer_Func_2); } } void MaridiaPuffer_Func_2(void) { // 0xA8D940 uint8 v1 = CalculateAngleOfSamusFromEnemy(cur_enemy_index) - 64; Enemy_MaridiaPuffer *E = Get_MaridiaPuffer(cur_enemy_index); E->mpr_var_01 = v1; E->mpr_var_02 = v1; E->mpr_var_A = FUNC16(MaridiaPuffer_Func_3); E->mpr_var_C = 24; } void MaridiaPuffer_Func_3(void) { // 0xA8D963 Enemy_MaridiaPuffer *E = Get_MaridiaPuffer(cur_enemy_index); if ((int16)(E->mpr_var_D - E->mpr_var_00) < 0) MaridiaPuffer_Func_8(cur_enemy_index); MaridiaPuffer_Func_6(); MaridiaPuffer_Func_7(); MaridiaPuffer_Func_5(); } void MaridiaPuffer_Func_4(void) { // 0xA8D97C Enemy_MaridiaPuffer *E = Get_MaridiaPuffer(cur_enemy_index); if ((int16)E->mpr_var_D > 0 && (int16)E->mpr_var_B > 0) { MaridiaPuffer_Func_6(); MaridiaPuffer_Func_7(); MaridiaPuffer_Func_9(cur_enemy_index); } else { E->mpr_var_A = FUNC16(MaridiaPuffer_Func_1); E->mpr_var_B = 0; E->mpr_var_C = 0; E->mpr_var_D = 0; } } void MaridiaPuffer_Func_5(void) { // 0xA8D9AA uint8 v1 = CalculateAngleOfSamusFromEnemy(cur_enemy_index) - 64; Enemy_MaridiaPuffer *E = Get_MaridiaPuffer(cur_enemy_index); E->mpr_var_01 = v1; uint16 v3 = SignExtend8(v1 - E->mpr_var_02); uint16 v4 = Abs16(v3); if (!sign16(v4 - 48)) { E->mpr_var_A = FUNC16(MaridiaPuffer_Func_4); E->mpr_var_C = 24; } } void MaridiaPuffer_Func_6(void) { // 0xA8D9DB Enemy_MaridiaPuffer *E = Get_MaridiaPuffer(cur_enemy_index); uint16 R26 = 0; uint16 r18 = kSine16bit[(uint8)(E->mpr_var_02 + 64)]; if ((r18 & 0x8000) != 0) ++R26; uint32 t = ((Abs16(r18) & 0xFF00) >> 8) * E->mpr_var_D; if (R26) t = -(int32)t; AddToHiLo(&E->base.x_pos, &E->base.x_subpos, t); } void MaridiaPuffer_Func_7(void) { // 0xA8DA28 Enemy_MaridiaPuffer *E = Get_MaridiaPuffer(cur_enemy_index); uint16 R26 = 0; uint16 r18 = kSine16bit[(uint8)E->mpr_var_02]; if ((r18 & 0x8000) != 0) ++R26; uint32 t = ((Abs16(r18) & 0xFF00) >> 8) * E->mpr_var_D; if (R26) t = -(int32)t; AddToHiLo(&E->base.y_pos, &E->base.y_subpos, t); } void MaridiaPuffer_Func_8(uint16 k) { // 0xA8DA71 Enemy_MaridiaPuffer *E = Get_MaridiaPuffer(k); if (E->mpr_var_F-- == 1) { E->mpr_var_F = E->mpr_var_05; E->mpr_var_B += E->mpr_var_C; E->mpr_var_D += E->mpr_var_B; } } void MaridiaPuffer_Func_9(uint16 k) { // 0xA8DA92 Enemy_MaridiaPuffer *E = Get_MaridiaPuffer(k); if (E->mpr_var_F-- == 1) { E->mpr_var_F = E->mpr_var_06; E->mpr_var_B -= E->mpr_var_C; E->mpr_var_D -= E->mpr_var_B; } } void MaridiaPuffer_Shot(void) { // 0xA8DB14 Enemy_MaridiaPuffer *E = Get_MaridiaPuffer(cur_enemy_index); E->mpr_var_40 = E->base.health; Enemy_NormalShotAI_A8(); if (E->base.health == E->mpr_var_40 && !E->mpr_var_03) { E->base.instruction_timer = 1; E->base.timer = 0; E->base.current_instruction = addr_kMaridiaPuffer_Ilist_D855; E->mpr_var_02 = g_word_A8D871[projectile_dir[collision_detection_index] & 0xF]; E->mpr_var_B = 256; E->mpr_var_D = 1536; E->mpr_var_A = FUNC16(MaridiaPuffer_Func_4); E->mpr_var_07 = 48; E->mpr_var_03 = 1; } } void WalkingLavaSeahorse_Init(void) { // 0xA8DCCD Enemy_WalkingLavaSeahorse *E = Get_WalkingLavaSeahorse(cur_enemy_index); E->wlse_var_04 = 0; E->wlse_var_F = E->base.y_pos; E->wlse_var_02 = E->base.x_pos; E->base.properties |= kEnemyProps_DisableSamusColl; E->base.current_instruction = addr_kWalkingLavaSeahorse_Ilist_DBE7; E->wlse_var_A = FUNC16(WalkingLavaSeahorse_Func_3); WalkingLavaSeahorse_Func_1(cur_enemy_index); do { uint16 wlse_var_C = E->wlse_var_C; bool v4 = __CFADD__uint16(E->base.y_subpos, wlse_var_C); E->base.y_subpos += wlse_var_C; E->base.y_pos += v4 + E->wlse_var_B; } while ((WalkingLavaSeahorse_Func_2(cur_enemy_index) & 0x8000) != 0); while (1) { if (Enemy_MoveDown(cur_enemy_index, __PAIR32__(E->wlse_var_B, E->wlse_var_C))) break; WalkingLavaSeahorse_Func_2(cur_enemy_index); } E->wlse_var_03 = E->base.y_pos; E->base.y_pos = E->wlse_var_F; } void WalkingLavaSeahorse_Func_1(uint16 k) { // 0xA8DD37 Enemy_WalkingLavaSeahorse *E = Get_WalkingLavaSeahorse(k); E->wlse_var_B = -12; E->wlse_var_C = 0; E->wlse_var_D = 0; E->wlse_var_E = 0; E->wlse_var_00 = 0; E->wlse_var_01 = 0x8000; } uint16 WalkingLavaSeahorse_Func_2(uint16 k) { // 0xA8DD55 Enemy_WalkingLavaSeahorse *E = Get_WalkingLavaSeahorse(k); uint16 wlse_var_C = E->wlse_var_C; bool v3 = __CFADD__uint16(E->wlse_var_01, wlse_var_C); E->wlse_var_C = E->wlse_var_01 + wlse_var_C; uint16 result = E->wlse_var_00 + v3 + E->wlse_var_B; E->wlse_var_B = result; return result; } void CallWalkingLavaSeahorseFunc(uint32 ea, uint16 k) { switch (ea) { case fnnullsub_257: return; case fnWalkingLavaSeahorse_Func_3: WalkingLavaSeahorse_Func_3(k); return; case fnWalkingLavaSeahorse_Func_4: WalkingLavaSeahorse_Func_4(k); return; case fnWalkingLavaSeahorse_Func_6: WalkingLavaSeahorse_Func_6(k); return; case fnWalkingLavaSeahorse_Func_7: WalkingLavaSeahorse_Func_7(k); return; case fnWalkingLavaSeahorse_Func_8: WalkingLavaSeahorse_Func_8(k); return; case fnWalkingLavaSeahorse_Func_9: WalkingLavaSeahorse_Func_9(k); return; default: Unreachable(); } } void WalkingLavaSeahorse_Main(void) { // 0xA8DD6B Enemy_WalkingLavaSeahorse *E = Get_WalkingLavaSeahorse(cur_enemy_index); CallWalkingLavaSeahorseFunc(E->wlse_var_A | 0xA80000, cur_enemy_index); } void WalkingLavaSeahorse_Func_3(uint16 k) { // 0xA8DD71 uint16 v4; int16 v5; Enemy_WalkingLavaSeahorse *E = Get_WalkingLavaSeahorse(k); uint16 xxx; uint16 v3 = abs16(E->wlse_var_03 - samus_y_pos); if (sign16(v3 - 32) && (int16)(abs16((xxx = samus_x_pos - E->base.x_pos)) - g_word_A8DCC7) < 0) { WalkingLavaSeahorse_Func_1(k); v4 = addr_stru_A8DC4B; v5 = -2; if (!sign16(xxx)) { v4 = addr_stru_A8DCBB; v5 = 2; } E->wlse_var_D = v5; E->base.current_instruction = v4; E->base.instruction_timer = 1; E->wlse_var_A = FUNC16(WalkingLavaSeahorse_Func_4); QueueSfx2_Max6(0x5E); } } void WalkingLavaSeahorse_Func_4(uint16 k) { // 0xA8DDC6 Enemy_WalkingLavaSeahorse *E = Get_WalkingLavaSeahorse(k); uint16 wlse_var_C = E->wlse_var_C; bool v3 = __CFADD__uint16(E->base.y_subpos, wlse_var_C); E->base.y_subpos += wlse_var_C; E->base.y_pos += v3 + E->wlse_var_B; if ((WalkingLavaSeahorse_Func_2(k) & 0x8000) == 0) sub_A8DDDE(k); } void sub_A8DDDE(uint16 k) { // 0xA8DDDE EnemyData *v1 = gEnemyData(k); v1->ai_var_A = FUNC16(WalkingLavaSeahorse_Func_6); uint16 v2 = addr_kWalkingLavaSeahorse_Ilist_DC51; if ((v1->ai_var_D & 0x8000) == 0) v2 = addr_kWalkingLavaSeahorse_Ilist_DCC1; v1->current_instruction = v2; v1->instruction_timer = 1; } void WalkingLavaSeahorse_Func_5(uint16 k) { // 0xA8DDFA Enemy_WalkingLavaSeahorse *E = Get_WalkingLavaSeahorse(k); E->wlse_var_B = 0; E->wlse_var_C = 0; sub_A8DDDE(k); } void WalkingLavaSeahorse_Func_6(uint16 k) { // 0xA8DE05 int16 v3; Enemy_WalkingLavaSeahorse *E = Get_WalkingLavaSeahorse(k); if (Enemy_MoveDown(k, __PAIR32__(E->wlse_var_B, E->wlse_var_C))) { int t = samus_x_pos - E->base.x_pos; uint16 v2 = addr_kWalkingLavaSeahorse_Ilist_DBE7; v3 = -2; if (!sign16(t)) { v3 = 2; v2 = addr_kWalkingLavaSeahorse_Ilist_DC57; } E->wlse_var_D = v3; E->base.current_instruction = v2; E->base.instruction_timer = 1; E->wlse_var_A = FUNC16(WalkingLavaSeahorse_Func_7); E->wlse_var_04 = 1; } else { WalkingLavaSeahorse_Func_2(k); } } void WalkingLavaSeahorse_Func_7(uint16 k) { // 0xA8DE4B Enemy_MoveDown(k, INT16_SHL16(2)); Enemy_WalkingLavaSeahorse *E = Get_WalkingLavaSeahorse(k); if ((int16)(abs16(E->wlse_var_02 - E->base.x_pos) - g_word_A8DCCB) >= 0) { E->wlse_var_A = FUNC16(WalkingLavaSeahorse_Func_8); E->wlse_var_B = -4; E->wlse_var_C = 0; uint16 v4 = addr_kWalkingLavaSeahorse_Ilist_DC51; if ((E->wlse_var_D & 0x8000) == 0) v4 = addr_kWalkingLavaSeahorse_Ilist_DCC1; E->base.current_instruction = v4; E->base.instruction_timer = 1; } else { if (E->wlse_var_04) return; int t = samus_x_pos - E->base.x_pos; uint16 v3; if (!sign16(t)) { v3 = addr_kWalkingLavaSeahorse_Ilist_DC73; if ((E->wlse_var_D & 0x8000) != 0) return; } else { v3 = addr_kWalkingLavaSeahorse_Ilist_DC03; if ((E->wlse_var_D & 0x8000) == 0) return; } E->base.current_instruction = v3; E->base.instruction_timer = 1; E->wlse_var_A = FUNC16(nullsub_257); } } void WalkingLavaSeahorse_Func_8(uint16 k) { // 0xA8DECD Enemy_WalkingLavaSeahorse *E = Get_WalkingLavaSeahorse(k); uint16 wlse_var_C = E->wlse_var_C; bool v3 = __CFADD__uint16(E->base.y_subpos, wlse_var_C); E->base.y_subpos += wlse_var_C; E->base.y_pos += v3 + E->wlse_var_B; if ((WalkingLavaSeahorse_Func_2(k) & 0x8000) == 0) E->wlse_var_A = FUNC16(WalkingLavaSeahorse_Func_9); } void WalkingLavaSeahorse_Func_9(uint16 k) { // 0xA8DEEC Enemy_WalkingLavaSeahorse *E = Get_WalkingLavaSeahorse(k); uint16 wlse_var_C = E->wlse_var_C; bool v3 = __CFADD__uint16(E->base.y_subpos, wlse_var_C); E->base.y_subpos += wlse_var_C; uint16 v4 = E->base.y_pos + v3 + E->wlse_var_B; E->base.y_pos = v4; if ((int16)(v4 - E->wlse_var_F) >= 0) { E->base.y_pos = E->wlse_var_F; E->base.x_pos = E->wlse_var_02; E->wlse_var_A = FUNC16(WalkingLavaSeahorse_Func_3); } else { WalkingLavaSeahorse_Func_2(k); } } const uint16 *WalkingLavaSeahorse_Instr_4(uint16 k, const uint16 *jp) { // 0xA8DF1C WalkingLavaSeahorse_DF20(0); return jp; } void WalkingLavaSeahorse_DF20(uint16 a) { // 0xA8DF20 SpawnEnemyProjectileWithGfx(a, cur_enemy_index, addr_loc_A89E90); QueueSfx2_Max6(0x3F); } const uint16 *WalkingLavaSeahorse_Instr_3(uint16 k, const uint16 *jp) { // 0xA8DF33 WalkingLavaSeahorse_DF20(2); return jp; } const uint16 *WalkingLavaSeahorse_Instr_5(uint16 k, const uint16 *jp) { // 0xA8DF39 WalkingLavaSeahorse_DF20(4); return jp; } const uint16 *WalkingLavaSeahorse_Instr_6(uint16 k, const uint16 *jp) { // 0xA8DF3F int16 v3; Enemy_WalkingLavaSeahorse *E = Get_WalkingLavaSeahorse(cur_enemy_index); E->wlse_var_A = FUNC16(WalkingLavaSeahorse_Func_7); v3 = random_number & 3; if ((random_number & 3) == 0) v3 = 2; E->wlse_var_04 = v3; if ((E->wlse_var_D & 0x8000) == 0) return INSTR_RETURN_ADDR(addr_kWalkingLavaSeahorse_Ilist_DC57); return INSTR_RETURN_ADDR(addr_kWalkingLavaSeahorse_Ilist_DBE7); } const uint16 *WalkingLavaSeahorse_Instr_2(uint16 k, const uint16 *jp) { // 0xA8DF63 Enemy_WalkingLavaSeahorse *E = Get_WalkingLavaSeahorse(cur_enemy_index); uint16 wlse_var_04 = E->wlse_var_04; if (wlse_var_04) E->wlse_var_04 = wlse_var_04 - 1; return WalkingLavaSeahorse_Instr_1(cur_enemy_index, jp); } const uint16 *WalkingLavaSeahorse_Instr_1(uint16 k, const uint16 *jp) { // 0xA8DF71 int16 wlse_var_D; Enemy_WalkingLavaSeahorse *E = Get_WalkingLavaSeahorse(cur_enemy_index); if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index, INT16_SHL16(E->wlse_var_D))) { jp = INSTR_RETURN_ADDR(addr_stru_A8DBE9); wlse_var_D = E->wlse_var_D; if (wlse_var_D < 0) jp = INSTR_RETURN_ADDR(addr_stru_A8DC59); E->wlse_var_D = -wlse_var_D; } else { EnemyFunc_C8AD(cur_enemy_index); } return jp; } void WalkingLavaSeahorse_Func_10(void) { // 0xA8DF9D NormalEnemyShotAi(); } void WreckedShipOrbs_Init(void) { // 0xA8E388 Enemy_WreckedShipOrbs *E = Get_WreckedShipOrbs(cur_enemy_index); E->base.instruction_timer = 1; E->base.timer = 0; E->base.current_instruction = g_off_A8E380[E->wsos_parameter_1]; int v1 = (8 * E->wsos_parameter_2) >> 1; E->wsos_var_01 = kCommonEnemySpeeds_Linear[v1]; E->wsos_var_00 = kCommonEnemySpeeds_Linear[v1 + 1]; E->wsos_var_03 = kCommonEnemySpeeds_Linear[v1 + 2]; E->wsos_var_02 = kCommonEnemySpeeds_Linear[v1 + 3]; } void CallWreckedShipOrbsA(uint32 ea) { switch (ea) { case fnWreckedShipOrbs_Func_3: WreckedShipOrbs_Func_3(); return; case fnWreckedShipOrbs_Func_4: WreckedShipOrbs_Func_4(); return; default: Unreachable(); } } void CallWreckedShipOrbsB(uint32 ea) { switch (ea) { case fnWreckedShipOrbs_Func_5: WreckedShipOrbs_Func_5(); return; case fnWreckedShipOrbs_Func_6: WreckedShipOrbs_Func_6(); return; default: Unreachable(); } } void WreckedShipOrbs_Main(void) { // 0xA8E3C3 WreckedShipOrbs_Func_1(); WreckedShipOrbs_Func_2(); Enemy_WreckedShipOrbs *E = Get_WreckedShipOrbs(cur_enemy_index); CallWreckedShipOrbsA(E->wsos_var_A | 0xA80000); CallWreckedShipOrbsB(E->wsos_var_B | 0xA80000); } void WreckedShipOrbs_Func_1(void) { // 0xA8E3D9 Enemy_WreckedShipOrbs *E = Get_WreckedShipOrbs(cur_enemy_index); E->wsos_var_A = FUNC16(WreckedShipOrbs_Func_3); if ((GetSamusEnemyDelta_Y(cur_enemy_index) & 0x8000) == 0) E->wsos_var_A = FUNC16(WreckedShipOrbs_Func_4); } void WreckedShipOrbs_Func_2(void) { // 0xA8E3EF Enemy_WreckedShipOrbs *E = Get_WreckedShipOrbs(cur_enemy_index); E->wsos_var_B = FUNC16(WreckedShipOrbs_Func_5); if ((GetSamusEnemyDelta_X(cur_enemy_index) & 0x8000) == 0) E->wsos_var_B = FUNC16(WreckedShipOrbs_Func_6); } void WreckedShipOrbs_Func_3(void) { // 0xA8E405 Enemy_WreckedShipOrbs *E = Get_WreckedShipOrbs(cur_enemy_index); AddToHiLo(&E->base.y_pos, &E->base.y_subpos, __PAIR32__(E->wsos_var_03, E->wsos_var_02)); } void WreckedShipOrbs_Func_4(void) { // 0xA8E424 Enemy_WreckedShipOrbs *E = Get_WreckedShipOrbs(cur_enemy_index); AddToHiLo(&E->base.y_pos, &E->base.y_subpos, __PAIR32__(E->wsos_var_01, E->wsos_var_00)); } void WreckedShipOrbs_Func_5(void) { // 0xA8E443 Enemy_WreckedShipOrbs *E = Get_WreckedShipOrbs(cur_enemy_index); AddToHiLo(&E->base.x_pos, &E->base.x_subpos, __PAIR32__(E->wsos_var_03, E->wsos_var_02)); } void WreckedShipOrbs_Func_6(void) { // 0xA8E462 Enemy_WreckedShipOrbs *E = Get_WreckedShipOrbs(cur_enemy_index); AddToHiLo(&E->base.x_pos, &E->base.x_subpos, __PAIR32__(E->wsos_var_01, E->wsos_var_00)); } const uint16 *WreckedShipSpark_Instr_2(uint16 k, const uint16 *jp) { // 0xA8E61D Enemy_WreckedShipSpark *E = Get_WreckedShipSpark(cur_enemy_index); E->base.properties |= kEnemyProps_Tangible; return jp; } const uint16 *WreckedShipSpark_Instr_1(uint16 k, const uint16 *jp) { // 0xA8E62A Enemy_WreckedShipSpark *E = Get_WreckedShipSpark(cur_enemy_index); E->base.properties &= ~kEnemyProps_Tangible; return jp; } static void WreckedShipSpark_Func_4(uint16 k, uint16 r18) { // 0xA8E6F6 int16 wssk_var_E; Enemy_WreckedShipSpark *E = Get_WreckedShipSpark(k); wssk_var_E = E->wssk_var_E; if (wssk_var_E < 0) wssk_var_E = (NextRandom() & 0x3F) + 4; E->wssk_var_F = r18 + wssk_var_E; } void WreckedShipSpark_Init(void) { // 0xA8E637 Enemy_WreckedShipSpark *E = Get_WreckedShipSpark(cur_enemy_index); int v2 = E->wssk_parameter_1 & 3; E->wssk_var_B = g_off_A8E688[v2]; E->wssk_var_E = E->wssk_parameter_2; WreckedShipSpark_Func_4(cur_enemy_index, 0); E->base.instruction_timer = 1; E->base.current_instruction = g_off_A8E682[v2]; E->base.timer = 0; E->base.instruction_timer = 1; if ((boss_bits_for_area[area_index] & 1) == 0) { E->base.properties |= *(uint16 *)((uint8 *)&gVramWriteEntry(0)[6].vram_dst + 1); } } void CallWreckedShipSpark(uint32 ea, uint16 k) { switch (ea) { case fnWreckedShipSpark_Func_1: WreckedShipSpark_Func_1(k); return; case fnWreckedShipSpark_Func_2: WreckedShipSpark_Func_2(k); return; case fnWreckedShipSpark_Func_3: WreckedShipSpark_Func_3(k); return; case fnnullsub_259: return; default: Unreachable(); } } void WreckedShipSpark_Main(void) { // 0xA8E68E Enemy_WreckedShipSpark *E = Get_WreckedShipSpark(cur_enemy_index); CallWreckedShipSpark(E->wssk_var_B | 0xA80000, cur_enemy_index); } void WreckedShipSpark_Func_1(uint16 k) { // 0xA8E695 Enemy_WreckedShipSpark *E = Get_WreckedShipSpark(k); if (E->wssk_var_F == 1) { E->wssk_var_B = FUNC16(WreckedShipSpark_Func_2); E->base.current_instruction = addr_kWreckedShipSpark_Ilist_E5A7; E->base.instruction_timer = 1; WreckedShipSpark_Func_4(k, 0); } else { --E->wssk_var_F; } } void WreckedShipSpark_Func_2(uint16 k) { // 0xA8E6B7 Enemy_WreckedShipSpark *E = Get_WreckedShipSpark(k); if (E->wssk_var_F == 1) { E->wssk_var_B = FUNC16(WreckedShipSpark_Func_1); E->base.current_instruction = addr_kWreckedShipSpark_Ilist_E5E5; E->base.instruction_timer = 1; WreckedShipSpark_Func_4(k, 8); } else { --E->wssk_var_F; } } void WreckedShipSpark_Func_3(uint16 k) { // 0xA8E6DC Enemy_WreckedShipSpark *E = Get_WreckedShipSpark(k); if (E->wssk_var_F == 1) { uint16 v2 = cur_enemy_index; SpawnEnemyProjectileWithGfx(0, cur_enemy_index, addr_kEproj_Sparks); WreckedShipSpark_Func_4(v2, 0); } else { --E->wssk_var_F; } } void WreckedShipSpark_Shot(void) { // 0xA8E70E projectile_dir[collision_detection_index] &= ~0x10; } void BlueBrinstarFaceBlock_Init(void) { // 0xA8E82E EnemyData *v0 = gEnemyData(cur_enemy_index); v0->current_instruction = addr_kBlueBrinstarFaceBlock_Ilist_E828; uint16 v1 = FUNC16(BlueBrinstarFaceBlock_Func_1); if ((collected_items & 4) == 0) v1 = FUNC16(nullsub_170_A8); enemy_gfx_drawn_hook.addr = v1; *(uint16 *)&enemy_gfx_drawn_hook.bank = 168; variables_for_enemy_graphics_drawn_hook[0] = ((16 * v0->palette_index) & 0xFF00) >> 8; variables_for_enemy_graphics_drawn_hook[2] = 16; v0->parameter_2 = ((v0->parameter_2 & 1) >> 2) | ((v0->parameter_2 & 1) << 15); } void BlueBrinstarFaceBlock_Func_1(void) { // 0xA8E86E if (!door_transition_flag_enemies && !--variables_for_enemy_graphics_drawn_hook[2]) { variables_for_enemy_graphics_drawn_hook[2] = 16; uint16 v0 = variables_for_enemy_graphics_drawn_hook[0]; uint16 v1 = 8 * variables_for_enemy_graphics_drawn_hook[1]; int n = 4; do { palette_buffer[(v0 >> 1) + 137] = g_word_A8E7CC[v1 >> 1]; v1 += 2; v0 += 2; } while (--n); variables_for_enemy_graphics_drawn_hook[1] = (LOBYTE(variables_for_enemy_graphics_drawn_hook[1]) + 1) & 7; } } void BlueBrinstarFaceBlock_Main(void) { // 0xA8E8AE if ((collected_items & 4) != 0) { enemy_gfx_drawn_hook.addr = FUNC16(BlueBrinstarFaceBlock_Func_1); EnemyData *v1 = gEnemyData(cur_enemy_index); variables_for_enemy_graphics_drawn_hook[0] = ((16 * v1->palette_index) & 0xFF00) >> 8; if (!v1->ai_var_A) { uint16 SamusEnemyDelta_Y = GetSamusEnemyDelta_Y(cur_enemy_index); if ((int16)(Abs16(SamusEnemyDelta_Y) - v1->parameter_1) < 0) { uint16 SamusEnemyDelta_X = GetSamusEnemyDelta_X(cur_enemy_index); v1->ai_var_B = SamusEnemyDelta_X; if ((int16)(Abs16(SamusEnemyDelta_X) - v1->parameter_1) < 0 && (v1->ai_var_B & 0x8000) != v1->parameter_2) { uint16 v4 = addr_kBlueBrinstarFaceBlock_Ilist_E80C; if ((v1->ai_var_B & 0x8000) == 0) v4 = addr_kBlueBrinstarFaceBlock_Ilist_E81A; v1->current_instruction = v4; v1->instruction_timer = 1; v1->ai_var_A = 1; variables_for_enemy_graphics_drawn_hook[2] = 16; } } } } } void BlueBrinstarFaceBlock_Shot(void) { // 0xA8E91D projectile_dir[collision_detection_index] &= ~0x10; } void KiHunter_Init(void) { // 0xA8F188 Enemy_KiHunter *E = Get_KiHunter(cur_enemy_index); E->base.properties |= kEnemyProps_DisableSamusColl; E->khr_var_14 = 0; E->base.instruction_timer = 1; E->base.timer = 0; E->base.current_instruction = addr_kKiHunter_Ilist_E9FA; E->khr_var_F = 0; E->khr_var_A = FUNC16(KiHunter_Func_1); E->khr_var_08 = 0; E->khr_var_09 = 1; E->khr_var_06 = 0; E->khr_var_07 = -1; uint16 v1 = E->base.y_pos - 16; E->khr_var_0A = v1; E->khr_var_0B = v1 + 32; E->khr_var_0C = E->base.x_pos; E->khr_var_0D = E->base.y_pos; if ((E->khr_parameter_1 & 0x8000) != 0) { E->khr_var_14 = 1; E->khr_var_A = FUNC16(KiHunter_Func_4); E->khr_var_08 = 0; E->khr_var_09 = 1; } } void KiHunterWings_Init(void) { // 0xA8F214 Enemy_KiHunter *E = Get_KiHunter(cur_enemy_index); E->base.properties |= kEnemyProps_DisableSamusColl; E->base.instruction_timer = 1; E->base.timer = 0; E->base.current_instruction = addr_kKiHunter_Ilist_EA4E; int v2 = cur_enemy_index >> 1; E->base.y_pos = enemy_drawing_queue[v2 + 93]; E->base.x_pos = enemy_drawing_queue[v2 + 91]; E->khr_var_A = FUNC16(KiHunter_Func_9); E->base.palette_index = enemy_drawing_queue[v2 + 105]; E->base.vram_tiles_index = enemy_drawing_queue[v2 + 106]; if ((enemy_drawing_queue_sizes[v2 + 6] & 0x8000) != 0) E->base.properties |= kEnemyProps_Deleted; } void CallKiHunterFunc(uint32 ea, uint16 k) { switch (ea) { case fnKiHunter_Func_1: KiHunter_Func_1(k); return; // 0xa8f268 case fnKiHunter_Func_2: KiHunter_Func_2(k); return; // 0xa8f3b8 case fnKiHunter_Func_3: KiHunter_Func_3(k); return; // 0xa8f4ed case fnKiHunter_Func_4: KiHunter_Func_4(k); return; // 0xa8f55a case fnKiHunter_Func_5: KiHunter_Func_5(k); return; // 0xa8f58b case fnKiHunter_Func_6: KiHunter_Func_6(k); return; // 0xa8f5f0 case fnKiHunter_Func_7: KiHunter_Func_7(k); return; // 0xa8f68b case fnKiHunter_Func_8: KiHunter_Func_8(k); return; case fnKiHunter_Func_9: KiHunter_Func_9(k); return; // 0xa8f6f3 case fnKiHunter_Func_10: KiHunter_Func_10(k); return; // 0xa8f7cf case fnnullsub_346: return; default: Unreachable(); } } void KiHunter_Main(void) { // 0xA8F25C Enemy_KiHunter *E = Get_KiHunter(cur_enemy_index); CallKiHunterFunc(E->khr_var_A | 0xA80000, cur_enemy_index); } void KiHunterWings_Main(void) { // 0xA8F262 Enemy_KiHunter *E = Get_KiHunter(cur_enemy_index); CallKiHunterFunc(E->khr_var_A | 0xA80000, cur_enemy_index); } void KiHunter_Func_1(uint16 k) { // 0xA8F268 int16 v4; Enemy_KiHunter *E = Get_KiHunter(k); if (Enemy_MoveDown(k, __PAIR32__(E->khr_var_09, E->khr_var_08))) { v4 = -E->khr_var_09; } else { uint16 y_pos = E->base.y_pos; if ((int16)(y_pos - E->khr_var_0A) < 0) { v4 = 1; } else { if ((int16)(y_pos - E->khr_var_0B) < 0) goto LABEL_8; v4 = -1; } } E->khr_var_09 = v4; LABEL_8: if (Enemy_MoveRight_IgnoreSlopes(k, __PAIR32__(E->khr_var_07, E->khr_var_06))) { uint16 v5 = 0; bool v6 = (-E->khr_var_07 & 0x8000) != 0; E->khr_var_07 = -E->khr_var_07; if (!v6) v5 = 4; int v7 = v5 >> 1; E->base.current_instruction = g_off_A8F3B0[v7]; Enemy_KiHunter *E1 = Get_KiHunter(k + 64); E1->base.current_instruction = g_off_A8F3B0[v7 + 1]; E->base.instruction_timer = 1; E1->base.instruction_timer = 1; } EnemyFunc_C8AD(k); uint16 r18 = samus_x_pos - E->base.x_pos; uint16 r20 = abs16(r18); if ((int16)(r20 - g_word_A8F180) < 0 && !sign16(samus_y_pos - E->base.y_pos - 32)) { uint16 r24 = samus_y_pos - E->base.y_pos; uint16 v9; if ((r18 & 0x8000) != 0) { E->khr_var_00 = -2; E->khr_var_02 = 0; E->khr_var_03 = 0; E->khr_var_04 = -1; E->khr_var_07 = -1; E->khr_var_05 = -8192; E->khr_var_F = 255; E->khr_var_0E = 240; v9 = 0; } else { E->khr_var_00 = 2; E->khr_var_02 = 0; E->khr_var_03 = 0; E->khr_var_04 = 0; E->khr_var_05 = 0x2000; E->khr_var_F = 128; E->khr_var_07 = 1; E->khr_var_0E = 144; v9 = 4; } int v10 = v9 >> 1; E->base.current_instruction = g_off_A8F3B0[v10]; Enemy_KiHunter *E1 = Get_KiHunter(k + 64); E1->base.current_instruction = g_off_A8F3B0[v10 + 1]; E->base.instruction_timer = 1; E1->base.instruction_timer = 1; E->khr_var_B = r18 + E->base.x_pos; E->khr_var_C = E->base.y_pos; E->khr_var_A = FUNC16(KiHunter_Func_2); E->khr_var_12 = r24; E->khr_var_11 = r20; E->khr_var_10 = 0; } } void KiHunter_Func_2(uint16 k) { // 0xA8F3B8 Enemy_KiHunter *E = Get_KiHunter(k); if ((E->khr_var_04 & 0x8000) == 0) { if ((int16)(E->khr_var_F - E->khr_var_0E) < 0) goto LABEL_9; } else if ((int16)(E->khr_var_F - E->khr_var_0E) >= 0) { goto LABEL_9; } if (!E->khr_var_10) { E->khr_var_10 = 1; uint16 v2 = addr_kKiHunter_Ilist_EA32; if ((E->khr_var_04 & 0x8000) != 0) v2 = addr_kKiHunter_Ilist_EA08; E->base.current_instruction = v2; E->base.instruction_timer = 1; } LABEL_9: if ((E->khr_var_04 & 0x8000) == 0) { uint16 khr_var_03 = E->khr_var_03; bool v4 = __CFADD__uint16(E->khr_var_05, khr_var_03); E->khr_var_03 = E->khr_var_05 + khr_var_03; uint16 khr_var_00 = E->khr_var_04 + v4 + E->khr_var_02; if ((int16)(khr_var_00 - E->khr_var_00) >= 0) khr_var_00 = E->khr_var_00; E->khr_var_02 = khr_var_00; uint16 v9 = E->khr_var_02 + E->khr_var_F; E->khr_var_F = v9; if (!sign16(v9 - 256)) { E->khr_var_A = FUNC16(KiHunter_Func_1); return; } } else { uint16 v3 = E->khr_var_03; bool v4 = __CFADD__uint16(E->khr_var_05, v3); E->khr_var_03 = E->khr_var_05 + v3; uint16 v5 = E->khr_var_04 + v4 + E->khr_var_02; if ((int16)(v5 - E->khr_var_00) < 0) v5 = E->khr_var_00; E->khr_var_02 = v5; uint16 v6 = E->khr_var_02 + E->khr_var_F; E->khr_var_F = v6; if (sign16(v6 - 128)) { E->khr_var_A = FUNC16(KiHunter_Func_1); return; } } uint16 r20 = E->khr_var_B + CosineMult8bit(E->khr_var_F, E->khr_var_11) - E->base.x_pos; if (Enemy_MoveRight_IgnoreSlopes(k, INT16_SHL16(r20))) { if ((E->khr_var_04 & 0x8000) == 0) { E->khr_var_06 = 0; E->khr_var_07 = -1; } else { E->khr_var_06 = 0; E->khr_var_07 = 1; } goto LABEL_24; } EnemyFunc_C8AD(k); r20 = E->khr_var_C + SineMult8bit(E->khr_var_F, E->khr_var_12) - E->base.y_pos; if (Enemy_MoveDown(k, INT16_SHL16(r20))) { LABEL_24: E->khr_var_A = FUNC16(KiHunter_Func_3); E->khr_var_08 = 0; E->khr_var_09 = -1; } } void KiHunter_Func_3(uint16 k) { // 0xA8F4ED Enemy_KiHunter *E = Get_KiHunter(k); if (Enemy_MoveRight_IgnoreSlopes(k, __PAIR32__(E->khr_var_07, E->khr_var_06)) || (EnemyFunc_C8AD(k), Enemy_MoveDown(k, __PAIR32__(E->khr_var_09, E->khr_var_08))) || (int16)(E->base.y_pos - E->khr_var_0D) < 0) { E->khr_var_A = FUNC16(KiHunter_Func_1); } } const uint16 *KiHunter_Instr_1(uint16 k, const uint16 *jp) { // 0xA8F526 uint16 result = addr_kKiHunter_Ilist_E9FA; uint16 r18 = addr_kKiHunter_Ilist_EA4E; Enemy_KiHunter *E = Get_KiHunter(k); if ((E->khr_var_07 & 0x8000) == 0) { result = addr_kKiHunter_Ilist_EA24; r18 = addr_kKiHunter_Ilist_EA5E; } E->base.current_instruction = r18; E->base.instruction_timer = 1; Enemy_KiHunter *E1 = Get_KiHunter(k + 64); if (E1->khr_var_A == FUNC16(KiHunter_Func_9)) { E1->base.current_instruction = r18; E1->base.instruction_timer = 1; } return INSTR_RETURN_ADDR(result); } void KiHunter_Func_4(uint16 k) { // 0xA8F55A Enemy_KiHunter *E = Get_KiHunter(k); if (Enemy_MoveDown(k, __PAIR32__(E->khr_var_09, E->khr_var_08))) { E->khr_var_A = FUNC16(KiHunter_Func_5); } else { uint16 khr_var_08 = E->khr_var_08; bool v3 = __CFADD__uint16(g_word_A8F182, khr_var_08); E->khr_var_08 = g_word_A8F182 + khr_var_08; E->khr_var_09 += g_word_A8F184 + v3; } } void KiHunter_Func_5(uint16 k) { // 0xA8F58B Enemy_KiHunter *E = Get_KiHunter(k); E->khr_var_A = addr_locret_A8F5E3; E->khr_var_08 = 0; E->khr_var_09 = (random_number & 1) - 8; if ((int16)(E->base.x_pos - samus_x_pos) >= 0) { E->khr_var_06 = 0; E->khr_var_07 = -2; E->base.current_instruction = addr_kKiHunter_Ilist_EA8A; } else { E->khr_var_06 = 0; E->khr_var_07 = 2; E->base.current_instruction = addr_kKiHunter_Ilist_EAA6; } E->base.instruction_timer = 1; } const uint16 *KiHunter_Instr_2(uint16 k, const uint16 *jp) { // 0xA8F5E4 Get_KiHunter(cur_enemy_index)->khr_var_A = FUNC16(KiHunter_Func_6); return jp; } void KiHunter_Func_6(uint16 k) { // 0xA8F5F0 Enemy_KiHunter *E = Get_KiHunter(k); if (Enemy_MoveDown(k, __PAIR32__(E->khr_var_09, E->khr_var_08))) { if ((E->khr_var_09 & 0x8000) != 0) { E->khr_var_09 = 1; } else { E->khr_var_08 = 0; E->khr_var_09 = -4; E->khr_var_A = addr_locret_A8F5E3; E->khr_var_0F = 12; uint16 v4 = addr_kKiHunter_Ilist_EAC2; if (!sign16(E->base.current_instruction + 0x155A)) v4 = addr_kKiHunter_Ilist_EADA; E->base.current_instruction = v4; E->base.instruction_timer = 1; } } else { if (Enemy_MoveRight_IgnoreSlopes(k, __PAIR32__(E->khr_var_07, E->khr_var_06))) { E->khr_var_07 = -E->khr_var_07; } else { EnemyFunc_C8AD(k); uint16 khr_var_08 = E->khr_var_08; bool v3 = __CFADD__uint16(g_word_A8F182, khr_var_08); E->khr_var_08 = g_word_A8F182 + khr_var_08; E->khr_var_09 += g_word_A8F184 + v3; } } } const uint16 *KiHunter_Instr_3(uint16 k, const uint16 *jp) { // 0xA8F67F Get_KiHunter(cur_enemy_index)->khr_var_A = FUNC16(KiHunter_Func_7); return jp; } void KiHunter_Func_7(uint16 k) { // 0xA8F68B Enemy_KiHunter *E = Get_KiHunter(k); uint16 v2 = E->khr_var_0F - 1; E->khr_var_0F = v2; if (!v2) { uint16 v3 = FUNC16(KiHunter_Func_5); uint16 v4 = abs16(E->base.x_pos - samus_x_pos); if (sign16(v4 - 96)) v3 = FUNC16(KiHunter_Func_8); E->khr_var_A = v3; } } void KiHunter_Func_8(uint16 k) { // 0xA8F6B3 uint16 v1 = addr_kKiHunter_Ilist_EAF2; Enemy_KiHunter *E = Get_KiHunter(k); if ((int16)(E->base.x_pos - samus_x_pos) < 0) v1 = addr_kKiHunter_Ilist_EB10; E->base.current_instruction = v1; E->base.instruction_timer = 1; E->khr_var_A = addr_locret_A8F5E3; } const uint16 *KiHunter_Instr_4(uint16 k, const uint16 *jp) { // 0xA8F6D2 sub_A8F6DC(k, addr_loc_A8CF18); return jp; } const uint16 *KiHunter_Instr_5(uint16 k, const uint16 *jp) { // 0xA8F6D8 sub_A8F6DC(k, addr_loc_A8CF26); return jp; } void sub_A8F6DC(uint16 k, uint16 j) { // 0xA8F6DC QueueSfx2_Max6(0x4C); SpawnEnemyProjectileWithGfx(0, cur_enemy_index, j); Get_KiHunter(cur_enemy_index)->khr_var_0F = 24; } void KiHunter_Func_9(uint16 k) { // 0xA8F6F3 int v1 = k >> 1; Enemy_KiHunter *E = Get_KiHunter(k); E->base.x_pos = enemy_drawing_queue[v1 + 91]; E->base.y_pos = enemy_drawing_queue[v1 + 93]; } void KiHunter_Shot(void) { // 0xA8F701 NormalEnemyShotAi(); uint16 old_cur_enemy_index = cur_enemy_index; Enemy_KiHunter *EK = Get_KiHunter(cur_enemy_index); Enemy_KiHunter *E1 = Get_KiHunter(cur_enemy_index + 64); uint16 health = EK->base.health; if (health) { if (health == E1->khr_parameter_1 || (int16)(health - E1->khr_parameter_1) < 0) { if (!EK->khr_var_14) { EK->khr_var_14 = 1; EK->khr_var_A = FUNC16(KiHunter_Func_4); EK->khr_var_08 = 0; EK->khr_var_09 = 1; cur_enemy_index = old_cur_enemy_index + 64; if (E1->khr_var_A != FUNC16(KiHunter_Func_10)) { E1->khr_var_07 = E1->base.y_pos; E1->khr_var_08 = E1->base.x_pos; KiHunter_Func_17(); KiHunter_Func_12(); KiHunter_Func_13(); E1->khr_var_F = -8192; E1->khr_var_A = FUNC16(KiHunter_Func_10); E1->khr_var_00 = FUNC16(KiHunter_Func_11); E1->khr_var_06 = E1->khr_var_07 - E1->khr_var_0B; E1->khr_var_05 = E1->base.x_pos; E1->khr_var_B = E1->khr_var_0A; E1->base.current_instruction = addr_kKiHunter_Ilist_EA7E; E1->base.spritemap_pointer = addr_kSpritemap_Nothing_A8; E1->base.instruction_timer = 1; E1->base.timer = 0; E1->base.properties |= kEnemyProps_ProcessedOffscreen; } cur_enemy_index = old_cur_enemy_index; } } else { E1->base.ai_handler_bits = EK->base.ai_handler_bits; E1->base.frozen_timer = EK->base.frozen_timer; E1->base.invincibility_timer = EK->base.invincibility_timer; E1->base.flash_timer = EK->base.flash_timer; } } else { E1->base.properties = 512; } } void CallKiHunterBFunc(uint32 ea) { switch (ea) { case fnKiHunter_Func_11: KiHunter_Func_11(); return; case fnKiHunter_Func_14: KiHunter_Func_14(); return; default: Unreachable(); } } void KiHunter_Func_10(uint16 k) { // 0xA8F7CF uint16 r18 = Get_KiHunter(cur_enemy_index)->khr_var_00; CallKiHunterBFunc(r18 | 0xA80000); } void KiHunter_Func_11(void) { // 0xA8F7DB int16 v2; Enemy_KiHunter *E = Get_KiHunter(cur_enemy_index); E->khr_var_F += *(uint16 *)((uint8 *)&kCommonEnemySpeeds_Quadratic[2] + (8 * HIBYTE(E->khr_var_B)) + 1); E->base.y_pos = E->khr_var_06 + SineMult8bit(HIBYTE(E->khr_var_F), g_byte_A8F186) - E->khr_var_04; E->base.x_pos = E->khr_var_05 + CosineMult8bit(HIBYTE(E->khr_var_F), g_byte_A8F186) - E->khr_var_03; if (sign16(E->khr_var_F + 0x4000)) { KiHunter_Func_16(cur_enemy_index); } else { v2 = E->khr_var_B - 384; if (v2 < 0) v2 = 256; E->khr_var_B = v2; } } void KiHunter_Func_12(void) { // 0xA8F851 uint16 v1 = CosineMult8bit(0xE0, g_byte_A8F186); Enemy_KiHunter *E = Get_KiHunter(cur_enemy_index); E->khr_var_03 = v1; E->khr_var_04 = SineMult8bit(0xE0, g_byte_A8F186); } void KiHunter_Func_13(void) { // 0xA8F87F uint16 v1 = CosineMult8bit(0xA0, g_byte_A8F186); Enemy_KiHunter *E = Get_KiHunter(cur_enemy_index); E->khr_var_01 = v1; E->khr_var_02 = SineMult8bit(0xA0, g_byte_A8F186); } void KiHunter_Func_14(void) { // 0xA8F8AD int16 khr_var_07; Enemy_KiHunter *E = Get_KiHunter(cur_enemy_index); E->khr_var_F += *(uint16 *)((uint8 *)kCommonEnemySpeeds_Quadratic + (8 * HIBYTE(E->khr_var_B)) + 1); uint16 r20 = E->khr_var_06 + SineMult8bit(HIBYTE(E->khr_var_F), g_byte_A8F186) - E->khr_var_02 - E->base.y_pos; if (Enemy_MoveDown(cur_enemy_index, INT16_SHL16(r20))) { E->base.properties |= kEnemyProps_Deleted; E->base.x_pos = E->khr_var_08; khr_var_07 = E->khr_var_07; E->base.y_pos = khr_var_07; } else { E->base.x_pos = E->khr_var_05 + CosineMult8bit(HIBYTE(E->khr_var_F), g_byte_A8F186) - E->khr_var_01; if (!sign16(E->khr_var_F + 0x4000)) { KiHunter_Func_15(cur_enemy_index); return; } khr_var_07 = E->khr_var_B - 384; if (khr_var_07 < 0) khr_var_07 = 256; } Get_KiHunter(cur_enemy_index)->khr_var_B = khr_var_07; } void KiHunter_Func_15(uint16 k) { // 0xA8F947 Enemy_KiHunter *E = Get_KiHunter(k); E->khr_var_00 = FUNC16(KiHunter_Func_11); E->khr_var_B = E->khr_var_0A; E->khr_var_F = -8192; E->khr_var_05 = E->base.x_pos; E->khr_var_06 = E->base.y_pos; } void KiHunter_Func_16(uint16 k) { // 0xA8F96A Enemy_KiHunter *E = Get_KiHunter(k); E->khr_var_00 = FUNC16(KiHunter_Func_14); E->khr_var_B = E->khr_var_0A; E->khr_var_F = -24576; E->khr_var_05 = E->base.x_pos; E->khr_var_06 = E->base.y_pos; } void KiHunter_Func_17(void) { // 0xA8F98D uint16 v5; Enemy_KiHunter *E = Get_KiHunter(cur_enemy_index); E->khr_var_0A = 0; E->khr_var_B = 0; do { uint16 v3 = E->khr_var_0A + 384; E->khr_var_0A = v3; v3 >>= 8; v5 = *(uint16 *)((uint8 *)kCommonEnemySpeeds_Quadratic + (8 * v3) + 1) + E->khr_var_D; E->khr_var_D = v5; } while (sign16(v5 - 0x2000)); }