// Enemy AI - inc. Torizo & Tourian statue #include "ida_types.h" #include "variables.h" #include "funcs.h" #include "enemy_types.h" static const uint16 g_word_AAB096 = 6; static const uint16 g_word_AAB098 = 5; static const uint16 g_word_AAB09A = 3; static const int16 g_word_AAC3EE[16] = { -9, -6, -7, 5, -16, -7, 0, 0, 9, 6, 7, -5, 16, 7, 0, 0 }; static const int16 g_word_AAC40E[8] = { 0, -6, -6, -7, 0, 0, 0, 0 }; static const int16 g_word_AAC440[16] = { -9, -6, -7, 5, -16, -7, 0, 0, 9, 6, 7, -5, 16, 7, 0, 0 }; static const int16 g_word_AAC460[8] = { 0, -6, -6, -7, 0, 0, 0, 0 }; static const int16 g_word_AAC4BD[20] = { -5, 0, -5, -19, -16, -7, 0, -7, -17, -18, 5, 0, 5, 19, 16, 7, 0, 7, 17, 18, }; static const int16 g_word_AAC532[20] = { -5, 0, -5, -0x13, -0x10, -7, 0, -7, -0x11, -0x12, 5, 0, 5, 0x13, 0x10, 7, 0, 7, 0x11, 0x12, }; static const int16 g_word_AAC95F[2] = { 0xdb, 0x1a8 }; static const int16 g_word_AAC963[2] = { 0xb3, 0x90 }; #define g_off_AAC967 ((uint16*)RomPtr(0xaac967)) static const int16 g_word_AAC96B[2] = { 0x2800, 0x2800 }; static const int16 g_word_AAC96F[2] = { 0x12, 0x12 }; static const int16 g_word_AAC973[2] = { 0x30, 0x29 }; static const uint16 kTorizo_Palette[16] = { 0x3800, 0x3ff, 0x33b, 0x216, 0x113, 0x6b1e, 0x4a16, 0x3591, 0x20e9, 0x1580, 0x1580, 0x1580, 0x1580, 0x1580, 0x1580, 0x1580 }; static const uint16 kTorizo_Palettes_1[16] = { 0x3800, 0x2df, 0x1d7, 0xac, 0x5a73, 0x41ad, 0x2d08, 0x1863, 0x1486, 0x145, 0x145, 0x145, 0x7fff, 0x145, 0x145, 0 }; static const uint16 kTorizo_Palettes_2[16] = { 0x3800, 0x679f, 0x5299, 0x252e, 0x14aa, 0x5efc, 0x4657, 0x35b2, 0x2d70, 0x5b7f, 0x3df8, 0x2d0e, 0x5f5f, 0x5e1a, 0x5d35, 0xc63 }; static const uint16 kTorizo_Palettes_3[16] = { 0x3800, 0x4aba, 0x35b2, 0x847, 3, 0x4215, 0x2970, 0x18cb, 0x1089, 0x463a, 0x28b3, 0x1809, 0x6f7f, 0x51fd, 0x4113, 0xc63 }; static const uint16 kTorizo_Palettes_4[16] = { 0x3800, 0x56ba, 0x41b2, 0x1447, 0x403, 0x4e15, 0x3570, 0x24cb, 0x1868, 0x6f7f, 0x51f8, 0x410e, 0x31f, 0x1da, 0xf5, 0xc63 }; static const uint16 kTorizo_Palettes_5[16] = { 0x3800, 0x4215, 0x2d0d, 2, 0, 0x3970, 0x20cb, 0xc26, 0x403, 0x463a, 0x28b3, 0x1809, 0x6f7f, 0x51fd, 0x4113, 0xc63 }; static const uint16 kTorizo_Palettes_6[16] = { 0x3800, 0x6ab5, 0x49b0, 0x1c45, 0xc01, 0x5613, 0x416d, 0x2cc9, 0x2066, 0x5714, 0x31cc, 0x14e3, 0x5630, 0x3569, 0x1883, 0xc66 }; static const uint16 kTorizo_Palettes_7[16] = { 0x3800, 0x5610, 0x350b, 0x800, 0, 0x416e, 0x2cc8, 0x1823, 0xc01, 0x6a31, 0x4caa, 0x2406, 0x7f7b, 0x75f4, 0x4d10, 0xc63 }; static const uint16 kTorizo_Palettes_8[16] = { 0x3800, 0x4bbe, 0x6b9, 0xa8, 0, 0x173a, 0x276, 0x1f2, 0x14d, 0x73e0, 0x4f20, 0x2a20, 0x7fe0, 0x5aa0, 0x5920, 0x43 }; static const uint16 kTorizo_Palettes_10[16] = { 0x3800, 0x3719, 0x214, 3, 0, 0x295, 0x1d1, 0x14d, 0xa8, 0x4b40, 0x25e0, 0xe0, 0x6b40, 0x4600, 0x4480, 0 }; static const int16 g_word_AAD59A[20] = { -5, 0, -5, -19, -16, -7, 0, -7, -17, -18, 5, 0, 5, 19, 16, 7, 0, 7, 17, 18, }; #define g_off_AAD810 ((uint16*)RomPtr(0xaad810)) #define g_word_AAD765 ((uint16*)RomPtr(0xaad765)) #define g_word_AAD785 ((uint16*)RomPtr(0xaad785)) #define g_off_AADF13 ((uint16*)RomPtr(0xaadf13)) #define g_off_AADF21 ((uint16*)RomPtr(0xaadf21)) #define kSine ((uint16*)RomPtr(0xaae0bd)) #define kCosine ((uint16*)RomPtr(0xaae13d)) #define kNegativeSine ((uint16*)RomPtr(0xaae1bd)) #define kNegativeCosine_0 ((uint16*)RomPtr(0xaae23d)) #define kNegativeCosine ((uint16*)RomPtr(0xaae03d)) #define g_off_AADD15 ((uint16*)RomPtr(0xaadd15)) #define g_word_AADE95 ((uint16*)RomPtr(0xaade95)) #define g_word_AADEA3 ((uint16*)RomPtr(0xaadea3)) #define g_word_AADEB1 ((uint16*)RomPtr(0xaadeb1)) #define g_off_AADEDB ((uint16*)RomPtr(0xaadedb)) static const uint16 g_word_AADEE9[7] = { 0, 0x20, 0x60, 0xc0, 0x140, 0x1a0, 0x1e0 }; #define g_word_AADEF7 ((uint16*)RomPtr(0xaadef7)) #define g_word_AADECD ((uint16*)RomPtr(0xaadecd)) #define g_word_AAE630 ((uint16*)RomPtr(0xaae630)) #define g_word_AAE670 ((uint16*)RomPtr(0xaae670)) #define g_word_AAE6B0 ((uint16*)RomPtr(0xaae6b0)) #define kN00bTubeCracks_Palette2 ((uint16*)RomPtr(0xaae2dd)) #define g_off_AAE7A2 ((uint16*)RomPtr(0xaae7a2)) static const uint16 kChozoStatue_Palette[16] = { 0x3800, 0x633f, 0x4a9f, 0x2ddf, 0x6739, 0x4e73, 0x318c, 0x18c6, 0x27ff, 0x1af7, 0xdce, 0xc6, 0x3fff, 0x2b39, 0x7fff, 0 }; static const int16 kChozoStatue_Palettes[16] = { 0x3800, 0x633f, 0x4a9f, 0x2ddf, 0x4210, 0x318c, 0x2108, 0x1084, 0x27ff, 0x1af7, 0xdce, 0xc6, 0x3fff, 0x2b39, 0x5294, 0, }; static const int16 kChozoStatue_Palettes2[16] = { 0x3800, 0x633f, 0x4a9f, 0x2ddf, 0x2f7c, 0x2295, 0x118d, 0x8e8, 0x27ff, 0x1af7, 0xdce, 0xc6, 0x3fff, 0x2b39, 0x73df, 0x43, }; static const int16 kChozoStatue_Palettes3[16] = { 0x3800, 0x633f, 0x4a9f, 0x2ddf, 0x2295, 0x118d, 0x8e8, 0x85, 0x27ff, 0x1af7, 0xdce, 0xc6, 0x3fff, 0x2b39, 0x5294, 1, }; void Enemy_GrappleReact_CancelBeam_AA(void) { // 0xAA800F Enemy_SwitchToFrozenAi(); } void Enemy_NormalFrozenAI_AA(void) { // 0xAA8041 NormalEnemyFrozenAI(); } uint16 Enemy_ClearAiPreInstr_AA(uint16 k, uint16 j) { // 0xAA8074 gEnemyData(k)->ai_preinstr = FUNC16(nullsub_171_AA); return j; } uint16 Enemy_SetAiPreInstr_AA(uint16 k, uint16 j) { // 0xAA806B gEnemyData(k)->ai_preinstr = *(uint16 *)RomPtr_AA(j); return j + 2; } uint16 EnemyInstr_StopScript_AA(uint16 k, uint16 j) { // 0xAA807C EnemyData *v2 = gEnemyData(k); v2->properties |= kEnemyProps_Deleted; return 0; } uint16 EnemyInstr_Goto_AA(uint16 k, uint16 j) { // 0xAA80ED return *(uint16 *)RomPtr_AA(j); } uint16 EnemyInstr_DecTimerAndGoto2_AA(uint16 k, uint16 j) { // 0xAA8110 EnemyData *v2 = gEnemyData(k); if (v2->timer-- == 1) return j + 2; else return EnemyInstr_Goto_AA(k, j); } uint16 EnemyInstr_SetTimer_AA(uint16 k, uint16 j) { // 0xAA8123 uint16 v2 = *(uint16 *)RomPtr_AA(j); gEnemyData(k)->timer = v2; return j + 2; } uint16 EnemyInstr_Sleep_AA(uint16 k, uint16 j) { // 0xAA812F gEnemyData(k)->current_instruction = j - 2; return 0; } uint16 EnemyInstr_WaitNframes_AA(uint16 k, uint16 j) { // 0xAA813A uint16 v2 = *(uint16 *)RomPtr_AA(j); EnemyData *v3 = gEnemyData(k); v3->instruction_timer = v2; v3->current_instruction = j + 2; return 0; } uint16 EnemyInstr_CopyToVram_AA(uint16 k, uint16 j) { // 0xAA814B VramWriteEntry *v4; uint16 v2 = vram_write_queue_tail; uint8 *v3 = RomPtr_AA(j); v4 = gVramWriteEntry(vram_write_queue_tail); v4->size = *(uint16 *)v3; v4->src.addr = *((uint16 *)v3 + 1); *(VoidP *)((char *)&v4->src.addr + 1) = *(uint16 *)(v3 + 3); v4->vram_dst = *(uint16 *)(v3 + 5); vram_write_queue_tail = v2 + 7; return j + 7; } uint16 Torizo_Instr_3(uint16 k, uint16 j) { // 0xAAB09C uint16 v2 = *(uint16 *)RomPtr_AA(j); Get_Torizo(k)->toriz_var_E = v2; return j + 2; } uint16 Torizo_Instr_31(uint16 k, uint16 j) { // 0xAAB11D Enemy_Torizo *E = Get_Torizo(k); E->toriz_parameter_2 = E->toriz_parameter_2 | 0x8000; SpawnEnemyProjectileWithGfx(0, k, addr_stru_86A95B); SpawnEnemyProjectileWithGfx(0, k, addr_stru_86A95B); SpawnEnemyProjectileWithGfx(0, k, addr_stru_86A95B); SpawnEnemyProjectileWithGfx(0, k, addr_stru_86A95B); SpawnEnemyProjectileWithGfx(0, k, addr_stru_86A95B); SpawnEnemyProjectileWithGfx(0, k, addr_stru_86A95B); return j; } uint16 Torizo_Instr_33(uint16 k, uint16 j) { // 0xAAB1BE Enemy_Torizo *E = Get_Torizo(k); E->toriz_parameter_2 |= 0x4000u; return j; } uint16 Torizo_Instr_36(uint16 k, uint16 j) { // 0xAAB224 Enemy_Torizo *E = Get_Torizo(k); E->base.properties &= ~kEnemyProps_Invisible; return j; } uint16 Torizo_Instr_37(uint16 k, uint16 j) { // 0xAAB22E Enemy_Torizo *E = Get_Torizo(k); E->base.properties |= kEnemyProps_Invisible; return j; } uint16 Torizo_Instr_35(uint16 k, uint16 j) { // 0xAAB238 for (int i = 30; i >= 0; i -= 2) { int v3 = i >> 1; target_palettes[v3 + 160] = 0; target_palettes[v3 + 144] = 0; } return j; } uint16 Torizo_Instr_38(uint16 k, uint16 j) { // 0xAAB24D SetBossBitForCurArea(4u); QueueMusic_Delayed8(g_word_AAB09A); if (area_index) Enemy_ItemDrop_GoldenTorizo(k); else Enemy_ItemDrop_BombTorizo(k); return j; } uint16 Torizo_Instr_6(uint16 k, uint16 j) { // 0xAAB271 sub_82DAF7(0x600u); return j; } uint16 Torizo_Instr_5(uint16 k, uint16 j) { // 0xAAB94D Torizo_C268(); return j; } uint16 Torizo_Instr_9(uint16 k, uint16 j) { // 0xAAB951 QueueMusic_Delayed8(g_word_AAB098); SpawnPalfxObject(addr_stru_8DF759); return j; } void Torizo_C20A(uint16 k) { // 0xAAC20A int16 v2; Enemy_Torizo *E = Get_Torizo(k); if ((E->toriz_parameter_1 & 0x8000u) != 0) v2 = 512; else v2 = -512; E->toriz_var_A = v2; E->toriz_var_B = -1472; E->toriz_var_C = 40; E->base.instruction_timer = 1; } void Torizo_C22D(uint16 k) { // 0xAAC22D int16 v2; Enemy_Torizo *E = Get_Torizo(k); if ((E->toriz_parameter_1 & 0x8000u) != 0) v2 = -768; else v2 = 768; E->toriz_var_A = v2; E->toriz_var_B = -1152; E->toriz_var_C = 40; E->base.instruction_timer = 1; } void Torizo_C250(void) { // 0xAAC250 for (int i = 30; i >= 0; i -= 2) { int v1 = i >> 1; target_palettes[v1 + 160] = kTorizo_Palettes_3[v1]; target_palettes[v1 + 144] = kTorizo_Palettes_2[v1]; } } void Torizo_C268(void) { // 0xAAC268 for (int i = 30; i >= 0; i -= 2) { int v1 = i >> 1; target_palettes[v1 + 160] = kTorizo_Palettes_5[v1]; target_palettes[v1 + 144] = kTorizo_Palettes_4[v1]; } } void Torizo_C280(void) { // 0xAAC280 for (int i = 30; i >= 0; i -= 2) { int v1 = i >> 1; target_palettes[v1 + 160] = kTorizo_Palettes_7[v1]; target_palettes[v1 + 144] = kTorizo_Palettes_6[v1]; } } void Torizo_C298(void) { // 0xAAC298 for (int i = 30; i >= 0; i -= 2) { int v1 = i >> 1; target_palettes[v1 + 160] = kTorizo_Palettes_10[v1]; target_palettes[v1 + 144] = kTorizo_Palettes_8[v1]; } } void Torizo_C2B0(void) { // 0xAAC2B0 for (int i = 30; i >= 0; i -= 2) { int v1 = i >> 1; palette_buffer[v1 + 160] = kTorizo_Palettes_5[v1]; palette_buffer[v1 + 144] = kTorizo_Palettes_4[v1]; } } uint16 Torizo_Instr_7(uint16 k, uint16 j) { // 0xAAC2C8 return j; } uint16 Torizo_Instr_2(uint16 k, uint16 j) { // 0xAAC2C9 Get_Torizo(k)->toriz_var_04 = 30583; return j; } uint16 Torizo_Instr_8(uint16 k, uint16 j) { // 0xAAC2D1 Get_Torizo(k)->toriz_var_04 = 0; return j; } uint16 Torizo_Instr_25(uint16 k, uint16 j) { // 0xAAC2D9 if ((Get_Torizo(k)->toriz_parameter_2 & 0x4000) != 0) return *(uint16 *)RomPtr_AA(j); j += 2; if (area_index) return *(uint16 *)RomPtr_AA(j); else return j + 2; } uint16 Torizo_Instr_22(uint16 k, uint16 j) { // 0xAAC2ED uint16 v2 = *(uint16 *)RomPtr_AA(j); Get_Torizo(k)->toriz_var_00 = v2; return j + 2; } uint16 Torizo_Instr_19(uint16 k, uint16 j) { // 0xAAC2F7 return Get_Torizo(k)->toriz_var_00; } uint16 Torizo_Instr_32(uint16 k, uint16 j) { // 0xAAC2FD return Get_Torizo(k)->toriz_var_01; } uint16 Torizo_Instr_30(uint16 k, uint16 j) { // 0xAAC303 uint16 a = *(uint16 *)RomPtr_AA(j); for (int i = 5; i >= 0; --i) SpawnEnemyProjectileWithRoomGfx(addr_kEproj_BombTorizoLowHealthExplode, a); Enemy_Torizo *E = Get_Torizo(k); E->base.current_instruction = j + 2; E->base.flash_timer = 40; E->base.instruction_timer = 40; return 0; } uint16 Torizo_Instr_34(uint16 k, uint16 j) { // 0xAAC32F printf("A undefined\n"); SpawnEnemyProjectileWithRoomGfx(addr_kEproj_BombTorizoDeathExplosion, 0); Enemy_Torizo *E = Get_Torizo(k); E->base.current_instruction = j; E->base.flash_timer = 1; E->base.instruction_timer = 1; return 0; } uint16 Torizo_Instr_24(uint16 k, uint16 j) { // 0xAAC34A printf("A undefined\n"); SpawnEnemyProjectileWithRoomGfx(addr_kEproj_TourianLandingDustCloudsRightFoot, 0); SpawnEnemyProjectileWithRoomGfx(addr_stru_86AFF3, 0); return j; } uint16 Torizo_Instr_12(uint16 k, uint16 j) { // 0xAAC35B uint16 health = Get_Torizo(k)->base.health; if (health < 0x15Eu) SpawnEnemyProjectileWithGfx(health, k, addr_kEproj_BombTorizoLowHealthInitialDrool); return j; } uint16 Torizo_Instr_10(uint16 k, uint16 j) { // 0xAAC36D Enemy_Torizo *E = Get_Torizo(k); E->toriz_parameter_1 |= 0x4000u; return j; } uint16 Torizo_Instr_11(uint16 k, uint16 j) { // 0xAAC377 Enemy_Torizo *E = Get_Torizo(k); E->toriz_parameter_1 &= 0x1FFFu; ++E->toriz_var_09; return j; } uint16 Torizo_Instr_29(uint16 k, uint16 j) { // 0xAAC38A Enemy_Torizo *E = Get_Torizo(k); E->toriz_parameter_1 = E->toriz_parameter_1 & 0x1FFF | 0x8000; ++E->toriz_var_09; return j; } uint16 Torizo_Instr_1(uint16 k, uint16 j) { // 0xAAC3A0 Enemy_Torizo *E = Get_Torizo(k); E->toriz_parameter_1 = E->toriz_parameter_1 & 0x1FFF | 0x2000; ++E->toriz_var_09; return j; } uint16 Torizo_Instr_28(uint16 k, uint16 j) { // 0xAAC3B6 Enemy_Torizo *E = Get_Torizo(k); E->toriz_parameter_1 = E->toriz_parameter_1 & 0x1FFF | 0xA000; ++E->toriz_var_09; return j; } uint16 Torizo_Instr_4(uint16 k, uint16 j) { // 0xAAC3CC uint16 v2 = *(uint16 *)RomPtr_AA(j); Enemy_Torizo *E = Get_Torizo(k); E->base.x_pos += g_word_AAC3EE[v2 >> 1]; E->base.y_pos += g_word_AAC40E[(uint8)(v2 & 0xF) >> 1]; return j + 2; } uint16 Torizo_Instr_40(uint16 k, uint16 j) { // 0xAAC41E uint16 v2 = *(uint16 *)RomPtr_AA(j); Enemy_Torizo *E = Get_Torizo(k); E->base.x_pos -= g_word_AAC440[v2 >> 1]; E->base.y_pos -= g_word_AAC460[(uint8)(v2 & 0xF) >> 1]; return j + 2; } uint16 Torizo_Instr_16(uint16 k, uint16 j) { // 0xAAC470 R18_ = 0; R20_ = g_word_AAC4BD[*(uint16 *)RomPtr_AA(j) >> 1]; Enemy_Torizo *E = Get_Torizo(k); E->toriz_var_A = R20_; if (Enemy_MoveRight_IgnoreSlopes(k) & 1) { E->toriz_var_03 = 0; if ((E->toriz_parameter_1 & 0x8000u) != 0) return addr_kTorizo_Ilist_B962; else return addr_kTorizo_Ilist_BDD8; } else { EnemyFunc_C8AD(k); if (((E->toriz_parameter_1 ^ (samus_x_pos - E->base.x_pos)) & 0x8000u) == 0) { if (!E->toriz_var_03) E->toriz_var_03 = 72; return j + 2; } else { return j + 2; } } } uint16 Torizo_Instr_27(uint16 k, uint16 j) { // 0xAAC4E5 R18_ = 0; R20_ = g_word_AAC532[*(uint16 *)RomPtr_AA(j) >> 1]; Enemy_Torizo *E = Get_Torizo(k); E->toriz_var_A = R20_; if (Enemy_MoveRight_IgnoreSlopes(k) & 1) { E->toriz_var_03 = 0; if ((E->toriz_parameter_1 & 0x8000u) != 0) return addr_kTorizo_Ilist_BD0E; else return addr_kTorizo_Ilist_C188; } else { EnemyFunc_C8AD(k); if (((E->toriz_parameter_1 ^ (samus_x_pos - E->base.x_pos)) & 0x8000u) == 0) { if (!E->toriz_var_03) E->toriz_var_03 = 72; return j + 2; } else { return j + 2; } } } uint16 Torizo_Instr_23(uint16 k, uint16 j) { // 0xAAC55A if ((Get_Torizo(k)->toriz_var_B & 0x8000u) != 0) return *(uint16 *)RomPtr_AA(j); else return j + 2; } uint16 Torizo_Instr_14(uint16 k, uint16 j) { // 0xAAC567 if (CompareDistToSamus_X(k, 0x38u) & 1) return j + 2; Enemy_Torizo *E = Get_Torizo(k); if (((E->toriz_parameter_1 ^ (samus_x_pos - E->base.x_pos)) & 0x8000u) == 0) return j + 2; E->toriz_var_00 = j + 2; return *(uint16 *)RomPtr_AA(j); } uint16 Torizo_Instr_15(uint16 k, uint16 j) { // 0xAAC58B if (CompareDistToSamus_X(k, 0x20u) & 1 || (Torizo_Func_12(k) & 0x8000u) != 0) return j + 2; Torizo_C22D(k); return *(uint16 *)RomPtr_AA(j); } uint16 Torizo_Instr_26(uint16 k, uint16 j) { // 0xAAC5A4 Get_Torizo(k)->toriz_var_00 = j + 4; if (samus_missiles < 5u || ((nmi_frame_counter_word + (samus_x_pos & 1) + (samus_x_pos >> 1)) & 8) != 0) return *(uint16 *)RomPtr_AA(j); else return *((uint16 *)RomPtr_AA(j) + 1); } uint16 Torizo_Instr_18(uint16 k, uint16 j) { // 0xAAC5CB printf("A unknown\n"); SpawnEnemyProjectileWithGfx(0, k, addr_kEproj_BombTorizosChozoOrbs); SpawnEnemyProjectileWithGfx(0, k, addr_kEproj_BombTorizosChozoOrbs); SpawnEnemyProjectileWithGfx(0, k, addr_kEproj_BombTorizosChozoOrbs); return j; } uint16 Torizo_Instr_20(uint16 k, uint16 j) { // 0xAAC5E3 uint16 *v2 = (uint16 *)RomPtr_AA(j); SpawnEnemyProjectileWithGfx(*v2, k, addr_kEproj_BombTorizoSonicBoom); return j + 2; } uint16 Torizo_Instr_44(uint16 k, uint16 j) { // 0xAAC5F2 uint16 *v2 = (uint16 *)RomPtr_AA(j); SpawnEnemyProjectileWithGfx(*v2, k, addr_kEproj_GoldenTorizoSonicBoom); return j + 2; } uint16 Torizo_Instr_21(uint16 k, uint16 j) { // 0xAAC601 uint16 *v2 = (uint16 *)RomPtr_AA(j); SpawnEnemyProjectileWithRoomGfx(addr_kEproj_BombTorizoExplosiveSwipe, *v2); return j + 2; } uint16 Torizo_Instr_17(uint16 k, uint16 j) { // 0xAAC610 QueueSfx2_Max6(0x27u); return j; } uint16 Torizo_Instr_13(uint16 k, uint16 j) { // 0xAAC618 QueueSfx2_Max6(0x4Bu); return j; } void Torizo_C620(uint16 k) { // 0xAAC620 if (!area_index && (random_number & 0x8142) == 0) { uint16 health = Get_Torizo(k)->base.health; if (health) { if (health < 0x15Eu) SpawnEnemyProjectileWithGfx(health, k, addr_kEproj_BombTorizoLowHealthInitialDrool); } } } void Torizo_C643(uint16 k) { // 0xAAC643 int16 torizo_var_B; int16 v3; R18_ = 0; R20_ = 0; Enemy_Torizo *E = Get_Torizo(k); torizo_var_B = E->toriz_var_B; if (torizo_var_B < 0) --R20_; *(uint16 *)((char *)&R18_ + 1) = torizo_var_B; if (Enemy_MoveDown(k) & 1) { v3 = E->toriz_var_B; if (v3 >= 0 && v3 != 256) { earthquake_type = 4; earthquake_timer = 32; E->toriz_var_B = 256; } } else { E->toriz_var_B += 40; } } void Torizo_Hurt(void) { // 0xAAC67E Torizo_C620(cur_enemy_index); if (Get_Torizo(cur_enemy_index)->base.flash_timer & 1) { for (int i = 30; i >= 0; i -= 2) { int v2 = i >> 1; palette_buffer[v2 + 160] = 0x7FFF; palette_buffer[v2 + 144] = 0x7FFF; } } else { Torizo_C2B0(); } } void CallTorizoFunc(uint32 ea, uint16 k) { switch (ea) { case fnnullsub_270: return; case fnTorizo_Func_3: Torizo_Func_3(k); return; case fnTorizo_Func_4: Torizo_Func_4(k); return; case fnTorizo_Func_1: Torizo_Func_1(k); return; case fnTorizo_Func_9: Torizo_Func_9(k); return; case fnTorizo_Func_10: Torizo_Func_10(k); return; case fnTorizo_D5E6: Torizo_D5E6(k); return; default: Unreachable(); } } void Torizo_Main(void) { // 0xAAC6A4 Enemy_Torizo *E = Get_Torizo(cur_enemy_index); CallTorizoFunc(E->toriz_var_E | 0xAA0000, cur_enemy_index); } void Torizo_Func_2(uint16 k) { // 0xAAC6AC Torizo_C643(k); if (!(sub_82DAF7(0x600u) & 1)) Get_Torizo(k)->toriz_var_E = FUNC16(nullsub_270); } void Torizo_Func_3(uint16 k) { // 0xAAC6BF Torizo_C620(k); Torizo_C643(k); } void Torizo_Func_4(uint16 k) { // 0xAAC6C6 Enemy_Torizo *E = Get_Torizo(k); E->base.properties |= kEnemyProps_Tangible; uint16 v2 = 78; while (plm_header_ptr[v2 >> 1] != (uint16)addr_kPlmHeader_D6EA) { v2 -= 2; if ((v2 & 0x8000u) != 0) { QueueMusic_Delayed8(g_word_AAB096); E->base.properties &= ~kEnemyProps_Tangible; ++E->base.current_instruction; ++E->base.current_instruction; E->base.instruction_timer = 1; return; } } } void Torizo_Func_1(uint16 k) { // 0xAAC6FF Torizo_C620(k); Enemy_Torizo *E = Get_Torizo(k); if ((E->toriz_parameter_2 & 0x8000u) != 0 || E->base.health >= 0x15Eu) { if ((E->toriz_parameter_2 & 0x4000) != 0 || E->base.health >= 0x64u) { CallEnemyPreInstr(E->toriz_var_F | 0xAA0000); } else { uint16 v2; if ((E->toriz_parameter_1 & 0x8000u) != 0) v2 = addr_kTorizo_Ilist_BD0E; else v2 = addr_kTorizo_Ilist_C188; E->toriz_var_00 = v2; E->base.current_instruction = addr_kTorizo_Ilist_B155; E->base.instruction_timer = 1; } } else { E->toriz_var_01 = E->base.current_instruction; E->base.current_instruction = addr_kTorizo_Ilist_B0E5; E->base.instruction_timer = 1; } } void Torizo_Func_5(uint16 k) { // 0xAAC752 uint16 v3; uint16 v8; Enemy_Torizo *E = Get_Torizo(k); if ((E->toriz_parameter_2 & 0x4000) != 0) { uint16 torizo_var_03 = E->toriz_var_03; if (!torizo_var_03 || (v8 = torizo_var_03 - 1, (E->toriz_var_03 = v8) != 0)) { R18_ = 0; uint16 v10 = abs16(E->toriz_var_A) + 1; if (v10 >= 0x10u) v10 = 15; R20_ = v10; if (!(Enemy_MoveDown(k) & 1)) { uint16 v11; if ((E->toriz_parameter_1 & 0x8000u) != 0) v11 = addr_off_AAC0F2; else v11 = addr_off_AABC78; E->base.current_instruction = v11; E->base.instruction_timer = 1; E->toriz_var_B = 256; E->toriz_var_A = 0; } } else { E->toriz_var_03 = 0; uint16 v9; if ((E->toriz_parameter_1 & 0x8000u) != 0) v9 = addr_kTorizo_Ilist_BD0E; else v9 = addr_kTorizo_Ilist_C188; E->base.current_instruction = v9; E->base.instruction_timer = 1; } } else { uint16 v2 = E->toriz_var_03; if (!v2 || (v3 = v2 - 1, (E->toriz_var_03 = v3) != 0)) { R18_ = 0; uint16 v5 = abs16(E->toriz_var_A) + 1; if (v5 >= 0x10u) v5 = 15; R20_ = v5; if (!(Enemy_MoveDown(k) & 1)) { uint16 v6; if ((E->toriz_parameter_1 & 0x8000u) != 0) v6 = addr_off_AAC0F2; else v6 = addr_off_AABC78; E->base.current_instruction = v6; E->base.instruction_timer = 1; E->toriz_var_B = 256; E->toriz_var_A = 0; } } else { E->toriz_var_03 = 0; uint16 v4; if ((E->toriz_parameter_1 & 0x8000u) != 0) v4 = addr_kTorizo_Ilist_B962; else v4 = addr_kTorizo_Ilist_BDD8; E->base.current_instruction = v4; E->base.instruction_timer = 1; } } } void Torizo_Func_6(uint16 k) { // 0xAAC828 Torizo_C643(k); } void Torizo_Func_7(uint16 k) { // 0xAAC82C int16 torizo_var_A; int16 torizo_var_B; R18_ = 0; R20_ = 0; Enemy_Torizo *E = Get_Torizo(k); torizo_var_A = E->toriz_var_A; if (torizo_var_A < 0) --R20_; *(uint16 *)((char *)&R18_ + 1) = torizo_var_A; Enemy_MoveRight_IgnoreSlopes(k); EnemyFunc_C8AD(k); R18_ = 0; R20_ = 0; torizo_var_B = E->toriz_var_B; if (torizo_var_B < 0) --R20_; *(uint16 *)((char *)&R18_ + 1) = torizo_var_B; if (Enemy_MoveDown(k) & 1) { E->base.current_instruction = E->toriz_var_00; E->base.instruction_timer = 1; E->toriz_var_B = 256; earthquake_type = 4; earthquake_timer = 32; } else { E->toriz_var_B += E->toriz_var_C; } } void Torizo_Init(void) { // 0xAAC87F Enemy_Torizo *E = Get_Torizo(cur_enemy_index); if (CheckBossBitForCurArea(4u) & 1) { E->base.properties |= kEnemyProps_Deleted; } else { int v2 = area_index >> 1; E->base.properties |= g_word_AAC96B[v2]; E->base.extra_properties |= 4u; E->base.x_width = g_word_AAC96F[v2]; E->base.y_height = g_word_AAC973[v2]; E->toriz_var_E = FUNC16(Torizo_Func_3); E->base.instruction_timer = 1; E->base.timer = 0; E->base.palette_index = 0; E->toriz_var_F = addr_locret_AAC95E; E->base.current_instruction = g_off_AAC967[v2]; E->base.spritemap_pointer = addr_kTorizo_ExtSprmap_87D0; E->base.x_pos = g_word_AAC95F[v2]; E->base.y_pos = g_word_AAC963[v2]; E->toriz_var_A = 0; E->toriz_var_B = 256; for (int i = 30; i >= 0; i -= 2) { int v4 = i >> 1; target_palettes[v4 + 240] = kTorizo_Palettes_1[v4]; target_palettes[v4 + 176] = kTorizo_Palette[v4]; } if (area_index) { Torizo_C280(); if (joypad1_lastkeys == 0xC0C0) { samus_health = 700; samus_max_health = 700; samus_max_reserve_health = 300; samus_reserve_health = 300; samus_missiles = 100; samus_max_missiles = 100; samus_super_missiles = 20; samus_max_super_missiles = 20; samus_power_bombs = 20; samus_max_power_bombs = 20; equipped_items = -3273; collected_items = -3273; equipped_beams = 4111; collected_beams = 4111; } } else { Torizo_C250(); SpawnBombTorizoHaze(); } } } void GoldTorizo_Touch(void) { // 0xAAC977 NormalEnemyTouchAiSkipDeathAnim_CurEnemy(); } void Torizo_Shot(void) { // 0xAAC97C if (area_index) { GoldTorizo_Shot(); } else { Enemy_Torizo *E = Get_Torizo(cur_enemy_index); if (!(E->toriz_var_04 | E->base.flash_timer)) { NormalEnemyShotAiSkipDeathAnim_CurEnemy(); if (!E->base.health) { E->toriz_var_E = FUNC16(nullsub_270); E->base.current_instruction = addr_kTorizo_Ilist_B1C8; E->base.instruction_timer = 1; E->toriz_parameter_2 |= 0xC000u; E->base.properties |= kEnemyProps_Tangible; } } } } void Torizo_Func_8(void) { // 0xAAC9C2 if (area_index) Torizo_D658(); } uint16 Torizo_Instr_39(uint16 k, uint16 j) { // 0xAACACE if (Get_Torizo(k)->base.y_pos == 375) return j + 2; else return *(uint16 *)RomPtr_AA(j); } uint16 Torizo_Instr_41(uint16 k, uint16 j) { // 0xAACADE Torizo_C298(); return j; } uint16 Torizo_Instr_42(uint16 k, uint16 j) { // 0xAACAE2 QueueMusic_Delayed8(5u); Enemy_Torizo *E = Get_Torizo(k); E->base.x_width = 18; E->base.y_height = 48; SpawnPalfxObject(addr_stru_8DF75D); return j; } uint16 Torizo_Instr_48(uint16 k, uint16 j) { // 0xAACDD7 Enemy_Torizo *E = Get_Torizo(k); E->toriz_parameter_2 &= ~0x1000u; return j; } uint16 Torizo_Instr_57(uint16 k, uint16 j) { // 0xAAD0E9 printf("A unknown\n"); SpawnEnemyProjectileWithRoomGfx(addr_stru_86B1C0, 0); return j; } uint16 Torizo_Instr_58(uint16 k, uint16 j) { // 0xAAD0F3 int16 v2; v2 = 34; while (*(uint16 *)((char *)enemy_projectile_id + (uint16)v2) != 0xB1C0) { v2 -= 2; if (v2 < 0) return j + 2; } return *(uint16 *)RomPtr_AA(j); } uint16 Torizo_Instr_59(uint16 k, uint16 j) { // 0xAAD17B Enemy_Torizo *E = Get_Torizo(k); E->toriz_var_06 &= ~0x8000u; return j; } uint16 Torizo_Instr_62(uint16 k, uint16 j) { // 0xAAD187 Enemy_Torizo *E = Get_Torizo(k); E->toriz_var_06 |= 0x8000u; return j; } uint16 Torizo_Instr_63(uint16 k, uint16 j) { // 0xAAD1E7 Enemy_Torizo *E = Get_Torizo(k); E->toriz_parameter_2 &= ~0x2000u; return j; } void GoldTorizo_Main(void) { // 0xAAD369 Enemy_Torizo *E = Get_Torizo(cur_enemy_index); if (samus_pose == kPose_1B_FaceR_SpaceJump || samus_pose == kPose_1C_FaceL_SpaceJump) { ++E->toriz_var_07; } else { E->toriz_var_07 = 0; } CallTorizoFunc(E->toriz_var_E | 0xAA0000, cur_enemy_index); } uint16 Torizo_Instr_56(uint16 k, uint16 j) { // 0xAAD38F QueueSfx2_Max6(0x34u); return j; } uint16 Torizo_Instr_60(uint16 k, uint16 j) { // 0xAAD397 QueueSfx2_Max6(0x67u); return j; } uint16 Torizo_Instr_46(uint16 k, uint16 j) { // 0xAAD39F QueueSfx2_Max6(0x48u); return j; } uint16 Torizo_Func_12(uint16 k) { // 0xAAD3A7 Enemy_Torizo *E = Get_Torizo(k); return E->toriz_parameter_1 ^ (E->base.x_pos - samus_x_pos); } void Torizo_Func_11(uint16 k) { // 0xAAD3B2 Enemy_Torizo *E = Get_Torizo(k); SetGoldenTorizoPalette(E->base.health); } void GoldTorizo_Hurt(void) { // 0xAAD3BA Torizo_C620(cur_enemy_index); if (gEnemyData(cur_enemy_index)->flash_timer & 1) { for (int i = 30; i >= 0; i -= 2) { int v2 = i >> 1; palette_buffer[v2 + 160] = 0x7FFF; palette_buffer[v2 + 144] = 0x7FFF; } } else { Torizo_Func_11(cur_enemy_index); } } uint16 Torizo_Instr_47(uint16 k, uint16 j) { // 0xAAD3E0 uint16 v2 = 0; printf("A unknown\n"); SpawnEnemyProjectileWithRoomGfx(addr_kEproj_GoldenTorizoSuperMissile, v2); return j; } uint16 Torizo_Instr_49(uint16 k, uint16 j) { // 0xAAD3EA if ((Torizo_Func_12(k) & 0x8000u) == 0 || !(CompareDistToSamus_X(k, 4u) & 1) || CompareDistToSamus_X(k, 0x28u) & 1 || samus_pose != kPose_1D_FaceR_Morphball_Ground && samus_pose != kPose_1E_MoveR_Morphball_Ground && samus_pose != kPose_1F_MoveL_Morphball_Ground && samus_pose != kPose_79_FaceR_Springball_Ground && samus_pose != kPose_7A_FaceL_Springball_Ground && samus_pose != kPose_7B_MoveR_Springball_Ground && samus_pose != kPose_7C_MoveL_Springball_Ground) { return j + 2; } Get_Torizo(k)->toriz_var_09 = 0; return *(uint16 *)RomPtr_AA(j); } uint16 Torizo_Instr_61(uint16 k, uint16 j) { // 0xAAD436 uint16 *v2 = (uint16 *)RomPtr_AA(j); SpawnEnemyProjectileWithRoomGfx(addr_kEproj_GoldenTorizoEyeBeam, *v2); return j + 2; } uint16 Torizo_Instr_53(uint16 k, uint16 j) { // 0xAAD445 if ((Torizo_Func_12(k) & 0x8000u) != 0 || !(CompareDistToSamus_X(k, 0x20u) & 1) || CompareDistToSamus_X(k, 0x60u) & 1 || (NextRandom() & 0x110) != 0) { return j + 2; } Get_Torizo(k)->toriz_var_00 = j + 2; return *(uint16 *)RomPtr_AA(j); } uint16 Torizo_Instr_55(uint16 k, uint16 j) { // 0xAAD474 Enemy_Torizo *E = Get_Torizo(k); if (E->base.health > 0x788u || (NextRandom() & 0x102) != 0) return j + 2; E->toriz_var_09 = 0; E->toriz_var_00 = j + 2; return *(uint16 *)RomPtr_AA(j); } uint16 Torizo_Instr_52(uint16 k, uint16 j) { // 0xAAD49B Enemy_Torizo *E = Get_Torizo(k); if (E->base.health <= 0x2A30u || (E->toriz_parameter_2 & 0x2000) == 0) return j + 2; E->toriz_var_00 = j + 2; return *(uint16 *)RomPtr_AA(j); } uint16 Torizo_Instr_50(uint16 k, uint16 j) { // 0xAAD4BA if (!(CompareDistToSamus_X(k, 0x70u) & 1)) return j + 2; if ((Torizo_Func_12(k) & 0x8000u) != 0) return j + 2; Enemy_Torizo *E = Get_Torizo(k); if (E->toriz_var_07 <= 0x168u && ((joypad1_lastkeys & 0x300) == 0 || (NextRandom() & 0x101) == 0)) return j + 2; E->toriz_var_09 = 0; Torizo_C20A(k); return *(uint16 *)RomPtr_AA(j); } uint16 Torizo_Instr_43(uint16 k, uint16 j) { // 0xAAD4F3 uint16 v2; printf("A unknown\n"); v2 = 0; SpawnEnemyProjectileWithGfx(v2, k, addr_kEproj_GoldenTorizosChozoOrbs); return j; } uint16 Torizo_Instr_51(uint16 k, uint16 j) { // 0xAAD4FD Enemy_Torizo *E = Get_Torizo(k); if (E->toriz_var_09 < 8u && (CompareDistToSamus_X(k, 0x20u) & 1 || (Torizo_Func_12(k) & 0x8000u) != 0)) return j + 2; E->toriz_var_09 = 0; Torizo_C22D(k); return *(uint16 *)RomPtr_AA(j); } uint16 Torizo_Instr_45(uint16 k, uint16 j) { // 0xAAD526 Get_Torizo(k)->toriz_var_00 = j + 4; if (samus_missiles < 0x20u || (((uint8)nmi_frame_counter_word + (samus_x_pos & 1) + (uint8)(samus_x_pos >> 1)) & 8) != 0) { return *(uint16 *)RomPtr_AA(j); } else { return *((uint16 *)RomPtr_AA(j) + 1); } } uint16 Torizo_Instr_54(uint16 k, uint16 j) { // 0xAAD54D R18_ = 0; R20_ = g_word_AAD59A[*(uint16 *)RomPtr_AA(j) >> 1]; Enemy_Torizo *E = Get_Torizo(k); E->toriz_var_A = R20_; if (Enemy_MoveRight_IgnoreSlopes(k) & 1) { E->toriz_var_03 = 0; if ((E->toriz_parameter_1 & 0x8000u) != 0) return addr_kTorizo_Ilist_D203; else return addr_kTorizo_Ilist_D2BF; } else { EnemyFunc_C8AD(k); if (((E->toriz_parameter_1 ^ (samus_x_pos - E->base.x_pos)) & 0x8000u) == 0) { if (!E->toriz_var_03) E->toriz_var_03 = 16; return j + 2; } else { return j + 2; } } } void Torizo_Func_9(uint16 k) { // 0xAAD5C2 Enemy_Torizo *E = Get_Torizo(cur_enemy_index); if (samus_y_pos > 0x140u && samus_x_pos > 0x170u) { ++E->base.current_instruction; ++E->base.current_instruction; E->base.instruction_timer = 1; } } void Torizo_Func_10(uint16 k) { // 0xAAD5DF Torizo_C620(k); Torizo_C643(k); } void Torizo_D5E6(uint16 k) { // 0xAAD5E6 Torizo_C620(k); Enemy_Torizo *E = Get_Torizo(k); CallEnemyPreInstr(E->toriz_var_F | 0xAA0000); } void Torizo_D5ED(uint16 k) { // 0xAAD5ED Torizo_C643(k); } void Torizo_D5F1(uint16 k) { // 0xAAD5F1 uint16 v3; Enemy_Torizo *E = Get_Torizo(k); uint16 torizo_var_03 = E->toriz_var_03; if (!torizo_var_03 || (v3 = torizo_var_03 - 1, (E->toriz_var_03 = v3) != 0)) { R18_ = 0; uint16 v5 = abs16(E->toriz_var_A) + 1; if (v5 >= 0x10u) v5 = 15; R20_ = v5; if (!(Enemy_MoveDown(k) & 1)) { uint16 v6; if ((E->toriz_parameter_1 & 0x8000u) != 0) v6 = addr_off_AAC0F2; else v6 = addr_off_AABC78; E->base.current_instruction = v6; E->base.instruction_timer = 1; E->toriz_var_B = 256; E->toriz_var_A = 0; } } else { E->toriz_var_03 = 0; uint16 v4; if ((E->toriz_parameter_1 & 0x8000u) != 0) v4 = addr_kTorizo_Ilist_D203; else v4 = addr_kTorizo_Ilist_D2BF; E->base.current_instruction = v4; E->base.instruction_timer = 1; } } void Torizo_D658(void) { // 0xAAD658 Enemy_Torizo *E = Get_Torizo(cur_enemy_index); if (!E->base.flash_timer && !E->toriz_var_04) Torizo_D6A6(); } void GoldTorizo_Shot(void) { // 0xAAD667 Enemy_Torizo *E = Get_Torizo(cur_enemy_index); if (!E->base.flash_timer) { if (E->toriz_var_04) { Torizo_D6A6(); return; } if ((E->toriz_parameter_2 & 0x1000) != 0) goto LABEL_11; uint16 v2, v3; v2 = 2 * collision_detection_index; v3 = projectile_type[collision_detection_index] & 0xF00; E->toriz_var_05 = v3; if (v3 == 256) { Torizo_D6D1(cur_enemy_index, v2); return; } if (v3 != 512) { LABEL_11: E->toriz_parameter_2 |= 0x2000u; Torizo_D6A6(); } else { Torizo_D6F7(cur_enemy_index, v2); } } } void Torizo_D6A6(void) { // 0xAAD6A6 NormalEnemyShotAiSkipDeathAnim_CurEnemy(); Enemy_Torizo *E = Get_Torizo(cur_enemy_index); if (!E->base.health) { E->base.current_instruction = addr_kTorizo_Ilist_B1C8; E->base.instruction_timer = 1; E->toriz_parameter_2 |= 0xC000u; E->base.properties |= kEnemyProps_Tangible; } } void Torizo_D6D1(uint16 k, uint16 j) { // 0xAAD6D1 projectile_dir[j >> 1] &= ~0x10u; Enemy_Torizo *E = Get_Torizo(k); E->toriz_var_E = FUNC16(nullsub_270); E->base.instruction_timer = 1; uint16 v3; if ((E->toriz_parameter_1 & 0x8000u) != 0) v3 = addr_kTorizo_Ilist_D2AD; else v3 = addr_kTorizo_Ilist_D1F1; E->base.current_instruction = v3; } void Torizo_D6F7(uint16 k, uint16 j) { // 0xAAD6F7 Enemy_Torizo *E = Get_Torizo(cur_enemy_index); if ((Torizo_Func_12(k) & 0x8000u) == 0) { E->toriz_parameter_2 |= 0x1000u; E->toriz_var_E = FUNC16(nullsub_270); projectile_dir[j >> 1] |= 0x10u; E->base.instruction_timer = 1; uint16 v3; if ((E->toriz_parameter_1 & 0x2000) != 0) { if ((E->toriz_parameter_1 & 0x8000u) != 0) v3 = addr_kTorizo_Ilist_CEFF; else v3 = addr_kTorizo_Ilist_CE43; } else if ((E->toriz_parameter_1 & 0x8000u) != 0) { v3 = addr_kTorizo_Ilist_CEA5; } else { v3 = addr_kTorizo_Ilist_CDE1; } E->base.current_instruction = v3; } else { Torizo_D6A6(); } } void TourianEntranceStatue_Init(void) { // 0xAAD7C8 EnemyData *v0 = gEnemyData(cur_enemy_index); v0->palette_index = 0; v0->instruction_timer = 1; v0->timer = 0; uint16 v1 = g_off_AAD810[v0->parameter_1 >> 1]; v0->current_instruction = v1; if (!v0->parameter_1) { printf("A unknown\n"); SpawnEnemyProjectileWithRoomGfx(addr_kEproj_TourianStatueBaseDecoration, 0); SpawnEnemyProjectileWithRoomGfx(addr_kEproj_TourianStatueRidley, 0); SpawnEnemyProjectileWithRoomGfx(addr_kEproj_TourianStatuePhantoon, 0); } for (int i = 30; i >= 0; i -= 2) { int v5 = i >> 1; target_palettes[v5 + 240] = g_word_AAD785[v5]; target_palettes[v5 + 160] = g_word_AAD765[v5]; } } uint16 Shaktool_Instr_2(uint16 k, uint16 j) { // 0xAAD931 Enemy_Shaktool *E = Get_Shaktool(k); Enemy_Shaktool *EX = Get_Shaktool(E->shakt_var_E + 192); return Shaktool_D956(k, j, EX->shakt_var_D ^ 0x80); } uint16 Shaktool_Instr_3(uint16 k, uint16 j) { // 0xAAD93F Enemy_Shaktool *E = Get_Shaktool(k); Enemy_Shaktool *EX = Get_Shaktool(E->shakt_var_E + 192); return Shaktool_D956(k, j, EX->shakt_var_D); } uint16 Shaktool_Instr_4(uint16 k, uint16 j) { // 0xAAD94A Enemy_Shaktool *E = Get_Shaktool(k); return Shaktool_D956(k, j, *(uint16 *)((char *)&E->shakt_var_A + 1) ^ 0x80); } uint16 Shaktool_Instr_5(uint16 k, uint16 j) { // 0xAAD953 Enemy_Shaktool *E = Get_Shaktool(k); return Shaktool_D956(k, j, *(uint16 *)((char *)&E->shakt_var_A + 1)); } uint16 Shaktool_D956(uint16 k, uint16 j, uint16 a) { // 0xAAD956 int16 v4; int16 v8; R18_ = 0; R20_ = 0; int v3 = (uint16)(2 * (uint8)a) >> 1; v4 = kSinCosTable8bit_Sext[v3 + 64]; if (v4 < 0) --R20_; *(uint16 *)((char *)&R18_ + 1) = v4; Enemy_Shaktool *E = Get_Shaktool(k); uint16 x_subpos = E->base.x_subpos; bool v7 = __CFADD__uint16(R18_, x_subpos); E->base.x_subpos = R18_ + x_subpos; E->base.x_pos += R20_ + v7; R18_ = 0; R20_ = 0; v8 = kSinCosTable8bit_Sext[v3]; if (v8 < 0) --R20_; *(uint16 *)((char *)&R18_ + 1) = v8; uint16 y_subpos = E->base.y_subpos; v7 = __CFADD__uint16(R18_, y_subpos); E->base.y_subpos = R18_ + y_subpos; E->base.y_pos += R20_ + v7; return j; } uint16 Shaktool_Instr_6(uint16 k, uint16 j) { // 0xAAD99F return j; } void Shaktool_Func_2(uint16 k) { // 0xAAD9A0 printf("A unknown!\n"); SpawnEnemyProjectileWithGfx(0, k, addr_kEproj_ShaktoolAttackFrontCircle); SpawnEnemyProjectileWithGfx(0, k, addr_kEproj_ShaktoolAttackMiddleCircle); SpawnEnemyProjectileWithGfx(0, k, addr_kEproj_ShaktoolAttackBackCircle); } uint16 Shaktool_Instr_1(uint16 k, uint16 j) { // 0xAAD9BA uint16 shakt_var_E = Get_Shaktool(k)->shakt_var_E; Get_Shaktool(shakt_var_E)->shakt_var_F = g_off_AADEDB[0]; Get_Shaktool(shakt_var_E + 64)->shakt_var_F = g_off_AADEDB[1]; Get_Shaktool(shakt_var_E + 128)->shakt_var_F = g_off_AADEDB[2]; Get_Shaktool(shakt_var_E + 192)->shakt_var_F = g_off_AADEDB[3]; Get_Shaktool(shakt_var_E + 256)->shakt_var_F = g_off_AADEDB[4]; Get_Shaktool(shakt_var_E + 320)->shakt_var_F = g_off_AADEDB[5]; Get_Shaktool(shakt_var_E + 384)->shakt_var_F = g_off_AADEDB[6]; return j; } void Shaktool_DAE5(uint16 k) { // 0xAADAE5 if ((NextRandom() & 0x8431) == 0) { for (int i = 12; i >= 0; i -= 2) { Enemy_Shaktool *E = Get_Shaktool(k); E->shakt_var_F = FUNC16(nullsub_274); E->base.current_instruction = g_off_AADF21[i >> 1]; E->base.instruction_timer = 1; k -= 64; } } } void Shaktool_DB0E(uint16 k, uint16 a) { // 0xAADB0E uint16 shakt_var_E = Get_Shaktool(k)->shakt_var_E; Get_Shaktool(shakt_var_E)->shakt_parameter_1 = a; Get_Shaktool(shakt_var_E + 64)->shakt_parameter_1 = a; Get_Shaktool(shakt_var_E + 128)->shakt_parameter_1 = a; Get_Shaktool(shakt_var_E + 192)->shakt_parameter_1 = a; Get_Shaktool(shakt_var_E + 256)->shakt_parameter_1 = a; Get_Shaktool(shakt_var_E + 320)->shakt_parameter_1 = a; Get_Shaktool(shakt_var_E + 384)->shakt_parameter_1 = a; } void Shaktool_DB27(uint16 k, uint16 a) { // 0xAADB27 uint16 shakto_var_E = Get_Shaktool(k)->shakt_var_E; Get_Shaktool(shakto_var_E)->shakt_var_A = a; Get_Shaktool(shakto_var_E + 64)->shakt_var_A = a; Get_Shaktool(shakto_var_E + 128)->shakt_var_A = a; Get_Shaktool(shakto_var_E + 192)->shakt_var_A = a; Get_Shaktool(shakto_var_E + 256)->shakt_var_A = a; Get_Shaktool(shakto_var_E + 320)->shakt_var_A = a; Get_Shaktool(shakto_var_E + 384)->shakt_var_A = a; } void Shaktool_DB40(uint16 k, uint16 a) { // 0xAADB40 uint16 shakto_var_E = Get_Shaktool(k)->shakt_var_E; Get_Shaktool(shakto_var_E)->shakt_var_B = a; Get_Shaktool(shakto_var_E + 64)->shakt_var_B = a; Get_Shaktool(shakto_var_E + 128)->shakt_var_B = a; Get_Shaktool(shakto_var_E + 192)->shakt_var_B = a; Get_Shaktool(shakto_var_E + 256)->shakt_var_B = a; Get_Shaktool(shakto_var_E + 320)->shakt_var_B = a; Get_Shaktool(shakto_var_E + 384)->shakt_var_B = a; } void Shaktool_DB59(uint16 k) { // 0xAADB59 uint16 shakto_var_E; uint16 shakto_var_B; uint16 v7; uint16 v10; uint16 x_subpos; uint16 y_subpos; uint16 x_pos; uint16 y_pos; shakto_var_E = Get_Shaktool(k)->shakt_var_E; Enemy_Shaktool *Shaktool = Get_Shaktool(shakto_var_E + 192); Shaktool->shakt_var_D ^= 0x8000u; Enemy_Shaktool *v3 = Get_Shaktool(shakto_var_E + 384); shakto_var_B = v3->shakt_var_B; Enemy_Shaktool *v5 = Get_Shaktool(shakto_var_E + 64); v3->shakt_var_B = (v5->shakt_var_B ^ 0x8000) & 0xFF00; v5->shakt_var_B = (shakto_var_B ^ 0x8000) & 0xFF00; Enemy_Shaktool *v6 = Get_Shaktool(shakto_var_E + 320); v7 = v6->shakt_var_B; Enemy_Shaktool *v8 = Get_Shaktool(shakto_var_E + 128); v6->shakt_var_B = (v8->shakt_var_B ^ 0x8000) & 0xFF00; v8->shakt_var_B = (v7 ^ 0x8000) & 0xFF00; Enemy_Shaktool *v9 = Get_Shaktool(shakto_var_E + 256); v10 = v9->shakt_var_B; Enemy_Shaktool *v11 = Get_Shaktool(shakto_var_E + 192); v9->shakt_var_B = (v11->shakt_var_B ^ 0x8000) & 0xFF00; v11->shakt_var_B = (v10 ^ 0x8000) & 0xFF00; Enemy_Shaktool *v12 = Get_Shaktool(shakto_var_E + 384); x_subpos = v12->base.x_subpos; Enemy_Shaktool *v14 = Get_Shaktool(shakto_var_E); v12->base.x_subpos = v14->base.x_subpos; v14->base.x_subpos = x_subpos; y_subpos = v12->base.y_subpos; v12->base.y_subpos = v14->base.y_subpos; v14->base.y_subpos = y_subpos; x_pos = v12->base.x_pos; v12->base.x_pos = v14->base.x_pos; v14->base.x_pos = x_pos; y_pos = v12->base.y_pos; v12->base.y_pos = v14->base.y_pos; v14->base.y_pos = y_pos; Get_Shaktool(shakto_var_E + 64)->base.x_subpos = 0x8000; Get_Shaktool(shakto_var_E + 128)->base.x_subpos = 0x8000; Get_Shaktool(shakto_var_E + 192)->base.x_subpos = 0x8000; Get_Shaktool(shakto_var_E + 256)->base.x_subpos = 0x8000; Get_Shaktool(shakto_var_E + 320)->base.x_subpos = 0x8000; Get_Shaktool(shakto_var_E + 64)->base.y_subpos = 0x8000; Get_Shaktool(shakto_var_E + 128)->base.y_subpos = 0x8000; Get_Shaktool(shakto_var_E + 192)->base.y_subpos = 0x8000; Get_Shaktool(shakto_var_E + 256)->base.y_subpos = 0x8000; Get_Shaktool(shakto_var_E + 320)->base.y_subpos = 0x8000; } void Shaktool_DC07(uint16 k) { // 0xAADC07 Enemy_Shaktool *E = Get_Shaktool(k); uint16 v2; if ((E->shakt_parameter_1 & 0x8000u) != 0) v2 = E->shakt_var_B - E->shakt_var_A; else v2 = E->shakt_var_A - E->shakt_var_B; E->shakt_var_C = 4 * HIBYTE(v2); } void Shaktool_DC2A(uint16 k) { // 0xAADC2A int16 v4; int16 v7; Enemy_Shaktool *E = Get_Shaktool(k); uint16 v2 = 2 * HIBYTE(E->shakt_var_B); R18_ = 0; R20_ = 0; int v3 = v2 >> 1; v4 = kSine[v3]; if (v4 < 0) --R20_; *(uint16 *)((char *)&R18_ + 1) = v4; int v5 = k >> 1; bool v6 = __CFADD__uint16(enemy_drawing_queue[v5 + 92], R18_); E->base.x_subpos = enemy_drawing_queue[v5 + 92] + R18_; E->base.x_pos = enemy_drawing_queue[v5 + 91] + v6 + R20_; R18_ = 0; R20_ = 0; v7 = kNegativeCosine[v3]; if (v7 < 0) --R20_; *(uint16 *)((char *)&R18_ + 1) = v7; v6 = __CFADD__uint16(enemy_drawing_queue[v5 + 94], R18_); E->base.y_subpos = enemy_drawing_queue[v5 + 94] + R18_; E->base.y_pos = enemy_drawing_queue[v5 + 93] + v6 + R20_; } void Shaktool_DC6F(uint16 k) { // 0xAADC6F Enemy_Shaktool *E = Get_Shaktool(k); Shaktool_DB40(k, E->shakt_var_A); uint16 shakto_var_E = E->shakt_var_E; Get_Shaktool(shakto_var_E)->shakt_var_C = g_word_AADEE9[0]; Get_Shaktool(shakto_var_E + 64)->shakt_var_C = g_word_AADEE9[1]; Get_Shaktool(shakto_var_E + 128)->shakt_var_C = g_word_AADEE9[2]; Get_Shaktool(shakto_var_E + 192)->shakt_var_C = g_word_AADEE9[3]; Get_Shaktool(shakto_var_E + 256)->shakt_var_C = g_word_AADEE9[4]; Get_Shaktool(shakto_var_E + 320)->shakt_var_C = g_word_AADEE9[5]; Get_Shaktool(shakto_var_E + 384)->shakt_var_C = g_word_AADEE9[6]; } void Shaktool_Hurt(void) { // 0xAADCA3 Enemy_Shaktool *E = Get_Shaktool(cur_enemy_index); CallEnemyPreInstr(E->shakt_var_F | 0xAA0000); } void Shaktool_DCAC(uint16 k) { // 0xAADCAC Shaktool_DC2A(k); Enemy_Shaktool *E = Get_Shaktool(k); uint16 shakto_var_C; if ((E->shakt_parameter_1 & 0x4000) != 0) { E->shakt_var_A += 256; shakto_var_C = 256; } else { shakto_var_C = E->shakt_var_C; } E->shakt_var_B += sign16(E->shakt_parameter_1) ? -shakto_var_C : shakto_var_C; } void Shaktool_DCD7(uint16 k) { // 0xAADCD7 int16 v2; Shaktool_DCAC(k); Enemy_Shaktool *E = Get_Shaktool(k); R18_ = E->shakt_var_B ^ 0x8000; v2 = R18_ + ((uint16)(Get_Shaktool(k + 64)->shakt_var_B - R18_) >> 1); if ((E->shakt_var_D & 0x8000u) != 0) HIBYTE(v2) ^= 0x80; uint16 v3 = (HIBYTE(v2) + 8) & 0xE0; LOBYTE(E->shakt_var_D) = v3; E->base.current_instruction = g_off_AADD15[(uint16)(v3 >> 4) >> 1]; E->base.instruction_timer = 1; } void Shaktool_DD25(uint16 k) { // 0xAADD25 char v6; // t0 int16 v7; Enemy_Shaktool *E = Get_Shaktool(k); uint16 y_pos = E->base.y_pos; uint16 x_pos = E->base.x_pos; Shaktool_DCAC(k); uint16 v12 = E->base.y_pos; uint16 v11 = E->base.x_pos; E->base.x_pos = x_pos; E->base.y_pos = y_pos; R18_ = 0; R20_ = v11 - x_pos; if (Enemy_MoveRight_IgnoreSlopes(k) & 1 || (E->base.y_pos = y_pos, R18_ = 0, R20_ = v12 - y_pos, Enemy_MoveDown(k) & 1)) { if ((E->shakt_parameter_1 & 0x2000) != 0) { Shaktool_DB0E(k, (E->shakt_parameter_1 ^ 0x8000) & 0x8FFF); } else { E->base.x_pos = x_pos; E->base.y_pos = y_pos; Shaktool_DB59(k); Shaktool_DB0E(cur_enemy_index, E->shakt_parameter_1 | 0x2000); Shaktool_DB0E(cur_enemy_index, E->shakt_parameter_1 & 0xBFFF); } E->shakt_var_D = 0; uint16 v5 = CalculateAngleOfEnemyXfromEnemyY(k, E->shakt_var_E); v6 = v5; LOBYTE(v5) = HIBYTE(v5); HIBYTE(v5) = v6; v7 = v5 & 0xFF00; uint16 v8; if ((E->shakt_parameter_1 & 0x8000u) != 0) v8 = v7 - 0x4000; else v8 = v7 + 0x4000; Shaktool_DB27(k, v8); for (int i = 12; i >= 0; i -= 2) { Shaktool_DC07(k); Enemy_Shaktool *EK = Get_Shaktool(k); EK->shakt_var_F = FUNC16(nullsub_274); EK->base.current_instruction = g_off_AADF13[i >> 1]; EK->base.instruction_timer = 1; k -= 64; } } else { E->base.x_pos = v11; E->base.y_pos = v12; if ((E->shakt_parameter_1 & 0x4000) != 0) { E->shakt_var_A += 256; } else { if (((E->shakt_var_A ^ E->shakt_var_B) & 0xFF00) == 0) { Shaktool_DC6F(k); E->shakt_var_D = 30720; Shaktool_DB0E(k, E->shakt_parameter_1 & 0xDFFF); E->shakt_var_D = HIBYTE(E->shakt_var_D) << 8; } uint16 v2 = E->shakt_var_D + E->shakt_var_C; E->shakt_var_D = v2; if (v2 >= 0xF000u) Shaktool_DB0E(k, E->shakt_parameter_1 | 0x4000); } } } void Shaktool_Init(void) { // 0xAADE43 Enemy_Shaktool *E = Get_Shaktool(cur_enemy_index); E->base.instruction_timer = 1; E->base.timer = 0; E->shakt_var_A = 0; E->shakt_var_D = 0; uint16 shakto_parameter_2 = E->shakt_parameter_2; int v3 = shakto_parameter_2 >> 1; E->base.properties |= g_word_AADE95[v3]; E->shakt_var_E = cur_enemy_index - g_word_AADEA3[v3]; E->shakt_var_F = *(uint16 *)((char *)g_off_AADEDB + shakto_parameter_2); E->shakt_var_C = *(uint16 *)((char *)g_word_AADEE9 + shakto_parameter_2) - g_word_AADEF7[v3]; E->shakt_var_B = g_word_AADEB1[v3]; E->base.current_instruction = g_word_AADEB1[v3 + 7]; E->base.layer = g_word_AADECD[v3]; if (shakto_parameter_2) Shaktool_DC2A(cur_enemy_index); } void Shaktool_Touch(void) { // 0xAADF2F NormalEnemyTouchAi(); } void Shaktool_Shot(void) { // 0xAADF34 NormalEnemyShotAi(); Enemy_Shaktool *E = Get_Shaktool(cur_enemy_index); if (!E->base.health) { uint16 shakto_var_E = E->shakt_var_E; Get_Shaktool(shakto_var_E)->base.properties = 512; Get_Shaktool(shakto_var_E + 64)->base.properties = 512; Get_Shaktool(shakto_var_E + 128)->base.properties = 512; Get_Shaktool(shakto_var_E + 192)->base.properties = 512; Get_Shaktool(shakto_var_E + 256)->base.properties = 512; Get_Shaktool(shakto_var_E + 320)->base.properties = 512; Get_Shaktool(shakto_var_E + 384)->base.properties = 512; } } uint16 Shaktool_Instr_9(uint16 k, uint16 j) { // 0xAAE429 fx_timer = 32; fx_y_vel = 64; return j; } uint16 Shaktool_Instr_11(uint16 k, uint16 j) { // 0xAAE436 fx_base_y_pos = 722; return j; } uint16 Shaktool_Instr_10(uint16 k, uint16 j) { // 0xAAE43D CallSomeSamusCode(1u); return j; } void sub_AAE445(uint16 k) { // 0xAAE445 EnemyData *v1 = gEnemyData(k); if (v1->parameter_1) { v1->current_instruction = addr_kShaktool_Ilist_E3A7; v1->instruction_timer = 1; } } uint16 Shaktool_Instr_8(uint16 k, uint16 j) { // 0xAAE57F QueueSfx2_Max6(0x1Cu); return j; } uint16 Shaktool_Instr_13(uint16 k, uint16 j) { // 0xAAE587 QueueSfx2_Max6(0x4Bu); return j; } uint16 Shaktool_Instr_12(uint16 k, uint16 j) { // 0xAAE58F Enemy_Shaktool *e = Get_Shaktool(k); uint16 arg = *(uint16 *)RomPtr_AA(j); CalculateBlockContainingPixelPos(e->base.x_pos + arg, e->base.y_pos + 28); if ((level_data[room_width_in_blocks + cur_block_index] & 0xF000) == 0xA000) { SpawnPLM(addr_kPlmHeader_D113); SpawnEnemyProjectileWithRoomGfx(addr_kEproj_WreckedShipChozoSpikeFootsteps_1, arg); } return j + 2; } uint16 Shaktool_Instr_7(uint16 k, uint16 j) { // 0xAAE5D8 int16 v4; int16 v5; uint16 v2 = *(uint16 *)RomPtr_AA(j); Enemy_Shaktool *E = Get_Shaktool(k); E->shakt_var_C = v2; R18_ = 0; R20_ = 0; v4 = g_word_AAE630[E->shakt_var_C >> 1]; if (v4 < 0) --R20_; *(uint16 *)((char *)&R18_ + 1) = v4; Enemy_MoveRight_IgnoreSlopes(k); R18_ = 0; R20_ = 0; v5 = abs16(g_word_AAE630[E->shakt_var_C >> 1]); if (v5 < 0) --R20_; *(uint16 *)((char *)&R18_ + 1) = v5; Enemy_MoveDown(k); EnemyFunc_C8AD(k); int v6 = E->shakt_var_C >> 1; samus_x_pos = g_word_AAE670[v6] + E->base.x_pos; samus_y_pos = g_word_AAE6B0[v6] + E->base.y_pos; return j + 2; } uint16 Shaktool_Instr_14(uint16 k, uint16 j) { // 0xAAE6F0 CallSomeSamusCode(1u); *(uint16 *)&scrolls[6] = 0; *(uint16 *)&scrolls[8] = 0; *(uint16 *)&scrolls[9] = 0; *(uint16 *)&scrolls[13] = 1; static const SpawnHardcodedPlmArgs unk_AAE711 = { 0x17, 0x1d, 0xd6fc }; SpawnHardcodedPlm(&unk_AAE711); return j; } void N00bTubeCracks_Init(void) { // 0xAAE716 for (int i = 62; i >= 0; i -= 2) target_palettes[(i >> 1) + 144] = kN00bTubeCracks_Palette2[i >> 1]; } void ChozoStatue_Init(void) { // 0xAAE725 EnemyData *v0 = gEnemyData(cur_enemy_index); v0->properties |= kEnemyProps_DisableSamusColl | kEnemyProps_ProcessedOffscreen | 0x8000; v0->spritemap_pointer = addr_kSpritemap_Nothing_AA; v0->instruction_timer = 1; v0->timer = 0; v0->ai_preinstr = FUNC16(nullsub_276); v0->parameter_1 = 0; v0->palette_index = 0; gEnemyData(0)->layer = 0; uint16 parameter_2 = v0->parameter_2; v0->current_instruction = g_off_AAE7A2[parameter_2 >> 1]; if (parameter_2) { sub_AAE784(); } else { for (int i = 30; i >= 0; i -= 2) { int v3 = i >> 1; target_palettes[v3 + 160] = kChozoStatue_Palettes[v3]; target_palettes[v3 + 144] = kChozoStatue_Palette[v3]; } static const SpawnHardcodedPlmArgs unk_AAE77F = { 0x17, 0x1d, 0xd6fc }; static const SpawnHardcodedPlmArgs unk_AAE777 = { 0x4a, 0x17, 0xd6ee }; SpawnHardcodedPlm(&unk_AAE777); SpawnHardcodedPlm(&unk_AAE77F); } } static const SpawnHardcodedPlmArgs unk_AAE79D = { 0x0c, 0x1d, 0xd6d6 }; void sub_AAE784(void) { // 0xAAE784 for (int i = 30; i >= 0; i -= 2) { int v1 = i >> 1; target_palettes[v1 + 160] = kChozoStatue_Palettes3[v1]; target_palettes[v1 + 144] = kChozoStatue_Palettes2[v1]; } SpawnHardcodedPlm(&unk_AAE79D); } void ChozoStatue_Main(void) { // 0xAAE7A7 EnemyData *v0 = gEnemyData(cur_enemy_index); CallEnemyPreInstr(v0->ai_preinstr | 0xAA0000); } void Shaktool_PreInstr_0(uint16 k) { // 0xAAE7AE if ((*(uint16 *)&boss_bits_for_area[area_index] & 1) != 0) { Enemy_Shaktool *E = Get_Shaktool(k); if (E->shakt_parameter_1) { E->base.current_instruction = addr_kShaktool_Ilist_E461; E->base.instruction_timer = 1; E->shakt_var_A = -256; E->shakt_var_B = 256; } } }