Files
sm-vita/src/sm_a6.c
2023-04-04 23:12:08 +02:00

4945 lines
141 KiB
C

// Enemy AI - inc. Ridley & zebetites
#include "ida_types.h"
#include "variables.h"
#include "sm_rtl.h"
#include "funcs.h"
#include "enemy_types.h"
#define g_byte_A6E269 ((uint8*)RomFixedPtr(0xa6e269))
#define g_word_A6E2AA ((uint16*)RomFixedPtr(0xa6e2aa))
#define g_word_A6E30A ((uint16*)RomFixedPtr(0xa6e30a))
#define g_word_A6E46A ((uint16*)RomFixedPtr(0xa6e46a))
#define g_off_A6A4EB ((uint16*)RomFixedPtr(0xa6a4eb))
#define g_off_A6A743 ((uint16*)RomFixedPtr(0xa6a743))
#define g_word_A6AE4D ((uint16*)RomFixedPtr(0xa6ae4d))
#define g_word_A6AF2F ((uint16*)RomFixedPtr(0xa6af2f))
#define g_word_A6B00F ((uint16*)RomFixedPtr(0xa6b00f))
#define g_off_A6ACDA ((uint16*)RomFixedPtr(0xa6acda))
#define g_off_A6AD45 ((uint16*)RomFixedPtr(0xa6ad45))
#define g_word_A6B60D ((uint16*)RomFixedPtr(0xa6b60d))
#define g_word_A6B63B ((uint16*)RomFixedPtr(0xa6b63b))
#define g_word_A6B6C8 ((uint16*)RomFixedPtr(0xa6b6c8))
#define g_word_A6B9D5 ((uint16*)RomFixedPtr(0xa6b9d5))
#define g_word_A6B9DB ((uint16*)RomFixedPtr(0xa6b9db))
#define g_off_A6B965 ((uint16*)RomFixedPtr(0xa6b965))
#define g_off_A6B96D ((uint16*)RomFixedPtr(0xa6b96d))
#define g_word_A6B9D5 ((uint16*)RomFixedPtr(0xa6b9d5))
#define g_word_A6B9DB ((uint16*)RomFixedPtr(0xa6b9db))
#define g_word_A6B94D ((uint16*)RomFixedPtr(0xa6b94d))
#define g_word_A6B959 ((uint16*)RomFixedPtr(0xa6b959))
#define g_word_A6BB48 ((uint16*)RomFixedPtr(0xa6bb48))
#define g_word_A6BB4E ((uint16*)RomFixedPtr(0xa6bb4e))
#define g_word_A6C1DF ((uint16*)RomFixedPtr(0xa6c1df))
#define g_off_A6C7BA ((uint16*)RomFixedPtr(0xa6c7ba))
#define g_word_A6C804 ((uint16*)RomFixedPtr(0xa6c804))
#define g_off_A6C808 ((uint16*)RomFixedPtr(0xa6c808))
#define g_word_A6C836 ((uint16*)RomFixedPtr(0xa6c836))
#define g_off_A6C83A ((uint16*)RomFixedPtr(0xa6c83a))
#define g_word_A6C868 ((uint16*)RomFixedPtr(0xa6c868))
#define g_off_A6C86C ((uint16*)RomFixedPtr(0xa6c86c))
#define g_word_A6C89A ((uint16*)RomFixedPtr(0xa6c89a))
#define g_off_A6C89E ((uint16*)RomFixedPtr(0xa6c89e))
#define g_word_A6C8CC ((uint16*)RomFixedPtr(0xa6c8cc))
#define g_off_A6C8D0 ((uint16*)RomFixedPtr(0xa6c8d0))
#define g_word_A6C6CE ((uint16*)RomFixedPtr(0xa6c6ce))
#define g_off_A6C6E6 ((uint16*)RomFixedPtr(0xa6c6e6))
#define g_word_A6CC12 ((uint16*)RomFixedPtr(0xa6cc12))
#define g_word_A6CC18 ((uint16*)RomFixedPtr(0xa6cc18))
#define g_off_A6DB02 ((uint16*)RomFixedPtr(0xa6db02))
#define kRidley_Ilist_DCBA ((uint16*)RomFixedPtr(0xa6dcba))
#define g_off_A6EFF5 ((uint16*)RomFixedPtr(0xa6eff5))
#define g_off_A6F001 ((uint16*)RomFixedPtr(0xa6f001))
#define g_off_A6F72B ((uint16*)RomFixedPtr(0xa6f72b))
#define g_off_A6F52C ((uint16*)RomFixedPtr(0xa6f52c))
#define g_word_A6F840 ((uint16*)RomFixedPtr(0xa6f840))
#define g_off_A6F900 ((uint16*)RomFixedPtr(0xa6f900))
#define g_word_A6FC03 ((uint16*)RomFixedPtr(0xa6fc03))
#define g_word_A6FC0B ((uint16*)RomFixedPtr(0xa6fc0b))
#define g_off_A6FC13 ((uint16*)RomFixedPtr(0xa6fc13))
#define g_word_A6FC1B ((uint16*)RomFixedPtr(0xa6fc1b))
#define g_word_A6FC23 ((uint16*)RomFixedPtr(0xa6fc23))
#define g_word_A6FC2B ((uint16*)RomFixedPtr(0xa6fc2b))
#define g_off_A6FD4A ((uint16*)RomFixedPtr(0xa6fd4a))
#define g_off_A6FD54 ((uint16*)RomFixedPtr(0xa6fd54))
static PairU16 NuclearWaffle_Func_6(uint16 a);
static int BabyMetroid_DBCB_DoubleRetEx(uint16 a);
static uint8 Ridley_Func_40_Carry();
static uint8 Ridley_Func_40_Sign();
static const uint16 g_word_A686F1[2] = { 0x1000, 0x1800 };
static const uint16 g_word_A68DBB = 5;
static const uint16 g_word_A68DBD = 0xa;
static const uint16 g_word_A68DBF = 0xf;
static const uint16 g_word_A68DC1 = 0x14;
static const uint16 g_word_A68DC3 = 0x19;
static const uint16 g_word_A68DC5 = 0x1e;
static const uint16 g_word_A68DC7 = 0x23;
static const uint16 g_word_A68DC9 = 0x28;
static const uint16 g_word_A68DCB = 0x2d;
static const uint16 g_word_A68DCD = 0x32;
static const uint16 g_word_A68DCF = 0x37;
static const uint16 g_word_A68DD1 = 0x3c;
static const uint16 g_word_A68DD3 = 0x41;
static const uint16 g_word_A68DD5 = 0x46;
static const uint16 g_word_A68DD7 = 0x4b;
static const uint16 g_word_A68DD9 = 0x50;
static const uint16 g_word_A68DDB = 0x55;
static const uint16 g_word_A68DDD = 0x5a;
static const uint16 g_word_A68DDF = 0x5f;
static const uint16 g_word_A68DE1 = 0x64;
static const uint16 g_word_A68DE3 = 0x69;
static const uint16 g_word_A68DE5 = 0x6e;
static const uint16 g_word_A68DE7 = 0x18;
static const uint16 g_word_A68DE9 = 0x18;
static const uint16 g_word_A68DEB = 0x18;
static const uint16 g_word_A68DED = 0x18;
static const uint16 g_word_A68DEF = 0x18;
static const uint16 g_word_A68DF1 = 0x18;
static const uint16 g_word_A68DF3 = 0x18;
static const uint16 g_word_A68DF5 = 0x18;
static const uint16 g_word_A68DF7 = 0x18;
static const uint16 g_word_A68DF9 = 0x18;
static const uint16 g_word_A68DFB = 0x18;
static const uint16 g_word_A68DFD = 0x18;
static const uint16 g_word_A68DFF = 0x18;
static const uint16 g_word_A68E01 = 0x18;
static const uint16 g_word_A68E03 = 0x18;
static const uint16 g_word_A68E05 = 0x18;
static const uint16 g_word_A68E07 = 0x18;
static const uint16 g_word_A68E09 = 0x18;
static const uint16 g_word_A68E0B = 0x14;
static const uint16 g_word_A68E0D = 0x10;
static const uint16 g_word_A68E0F = 0xc;
static const uint16 g_word_A68E11 = 8;
static const uint16 g_word_A695F6[4] = { 0x190, 0xf0, 0xf0, 0x190 };
static const uint16 g_word_A695FE[4] = { 0xffe8, 0xfff4, 0x18, 0xc };
static const uint16 g_word_A69606[4] = { 0x180, 0x100, 0x100, 0x180 };
static const uint16 g_word_A69A48[8] = { 0xfe00, 0xfb00, 0xfc00, 0xfb00, 0x200, 0xfb00, 0x400, 0xfb00 };
static const uint16 g_word_A6B288 = 8;
static const uint16 g_word_A6BBEB[3] = { 0x40, 0, 0xd0 };
static const uint16 g_word_A6BC62[3] = { 0xb0, 0, 0x50 };
static const int16 g_word_A6C66E[20] = { -24, -24, -20, 20, 16, -30, 30, -3, 14, -13, -2, 18, -2, -32, -31, 8, -4, -10, 19, 19 };
static const int16 g_word_A6CF54[3] = { 0x20, 0, -0x20 };
static const uint8 g_byte_A6D61F[16] = { 0x10, 0xf, 0xe, 0xd, 0xc, 0xb, 0xa, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
static const uint8 g_byte_A6D712[16] = { 0x10, 0xf, 0xe, 0xd, 0xc, 0xb, 0xa, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
static const uint16 g_word_A6D9ED[8] = { 0xc, 0xe, 0x10, 0x12, 0x1c, 0x20, 0x28, 0x30 };
void Enemy_GrappleReact_NoInteract_A6(void) { // 0xA68000
SwitchEnemyAiToMainAi();
}
void Enemy_GrappleReact_CancelBeam_A6(void) { // 0xA6800F
Enemy_SwitchToFrozenAi();
}
void Enemy_NormalTouchAI_A6(void) { // 0xA68023
NormalEnemyTouchAi();
}
void Enemy_NormalShotAI_A6(void) { // 0xA6802D
NormalEnemyShotAi();
}
void Enemy_NormalFrozenAI_A6(void) { // 0xA68041
NormalEnemyFrozenAI();
}
void Boulder_Init(void) { // 0xA686F5
int16 boulder_parameter_2_high;
Enemy_Boulder *E = Get_Boulder(cur_enemy_index);
E->boulder_var_C = 0;
E->boulder_var_B = 0;
E->boulder_var_D = 2;
E->boulder_var_A = FUNC16(Boulder_Func_1);
E->boulder_var_04 = E->base.x_pos;
uint16 y_pos = E->base.y_pos;
E->boulder_var_05 = y_pos;
E->boulder_var_03 = y_pos;
E->boulder_var_02 = E->base.y_subpos;
boulder_parameter_2_high = HIBYTE(E->boulder_parameter_2);
if (!HIBYTE(E->boulder_parameter_2)) {
boulder_parameter_2_high = 1;
E->boulder_var_07 = 1;
}
E->base.y_pos = E->boulder_var_05 - boulder_parameter_2_high;
E->boulder_var_00 = -LOBYTE(E->boulder_parameter_2);
E->boulder_var_06 = LOBYTE(E->base.current_instruction);
E->base.current_instruction = addr_kBoulder_Ilist_86A7;
uint16 boulder_parameter_1_high = HIBYTE(E->boulder_parameter_1);
E->boulder_var_E = boulder_parameter_1_high;
if (!boulder_parameter_1_high) {
E->boulder_var_00 = -E->boulder_var_00;
E->base.current_instruction = addr_kBoulder_Ilist_86CB;
}
E->boulder_var_01 = 2;
if (LOBYTE(E->boulder_parameter_1))
E->boulder_var_01 = 5;
}
void CallBoulderFunc(uint32 ea) {
switch (ea) {
case fnBoulder_Func_1: Boulder_Func_1(); return;
case fnBoulder_Func_2: Boulder_Func_2(); return;
case fnBoulder_Func_3: Boulder_Func_3(); return;
case fnBoulder_Func_4: Boulder_Func_4(); return;
case fnBoulder_Func_5: Boulder_Func_5(); return;
case fnBoulder_Func_6: Boulder_Func_6(); return;
default: Unreachable();
}
}
void Boulder_Main(void) { // 0xA68793
Enemy_Boulder *E = Get_Boulder(cur_enemy_index);
CallBoulderFunc(E->boulder_var_A | 0xA60000);
}
void Boulder_Func_1(void) { // 0xA6879A
int16 SamusEnemyDelta_Y;
int16 v3;
int16 SamusEnemyDelta_X;
SamusEnemyDelta_Y = GetSamusEnemyDelta_Y(cur_enemy_index);
if (SamusEnemyDelta_Y >= 0) {
Enemy_Boulder *E = Get_Boulder(cur_enemy_index);
if ((int16)(SamusEnemyDelta_Y - E->boulder_var_06) < 0) {
if (E->boulder_var_E) {
SamusEnemyDelta_X = GetSamusEnemyDelta_X(cur_enemy_index);
if (SamusEnemyDelta_X < 0 && (int16)(SamusEnemyDelta_X - E->boulder_var_00) >= 0) {
E->boulder_var_A = FUNC16(Boulder_Func_2);
if (E->boulder_var_07)
E->boulder_var_A = FUNC16(Boulder_Func_5);
}
} else {
v3 = GetSamusEnemyDelta_X(cur_enemy_index);
if (v3 >= 0 && (int16)(v3 - E->boulder_var_00) < 0) {
E->boulder_var_A = FUNC16(Boulder_Func_2);
if (E->boulder_var_07)
E->boulder_var_A = FUNC16(Boulder_Func_5);
}
}
}
}
}
void Boulder_Func_2(void) { // 0xA687ED
Enemy_Boulder *E = Get_Boulder(cur_enemy_index);
Boulder_Func_9(8 * HIBYTE(E->boulder_var_C));
if ((int16)(E->base.y_pos - E->boulder_var_05) < 0) {
uint16 v1 = E->boulder_var_C + 256;
E->boulder_var_C = v1;
if (!sign16(v1 - 20480))
E->boulder_var_C = 20480;
} else {
E->base.y_pos = E->boulder_var_05;
E->boulder_var_A = FUNC16(Boulder_Func_3);
E->boulder_var_C = 0x2000;
}
}
void Boulder_Func_3(void) { // 0xA68832
int16 v1;
Enemy_Boulder *E = Get_Boulder(cur_enemy_index);
Boulder_Func_9(8 * HIBYTE(E->boulder_var_C) + 4);
v1 = E->boulder_var_C - 256;
E->boulder_var_C = v1;
if (v1 >= 0) {
uint16 v2 = 8 * HIBYTE(E->boulder_var_B);
if (E->boulder_var_E)
v2 += 4;
Boulder_Func_7(v2);
uint16 v3 = E->boulder_var_B + 32;
E->boulder_var_B = v3;
if (!sign16(v3 - 20480))
E->boulder_var_B = 20480;
} else {
E->boulder_var_C = 0;
E->boulder_var_A = FUNC16(Boulder_Func_4);
}
}
void Boulder_Func_4(void) { // 0xA6888B
Enemy_Boulder *E = Get_Boulder(cur_enemy_index);
int v1 = (8 * HIBYTE(E->boulder_var_C)) >> 1;
if (Enemy_MoveDown(cur_enemy_index, kCommonEnemySpeeds_Quadratic32[v1 >> 1])) {
QueueSfx2_Max6(0x42);
if (E->boulder_var_E == 2) {
E->base.properties |= kEnemyProps_Deleted;
eproj_spawn_pt = (Point16U){ E->base.x_pos, E->base.y_pos };
SpawnEprojWithRoomGfx(addr_kEproj_DustCloudExplosion, 0x11);
QueueSfx2_Max6(0x43);
} else {
E->boulder_var_A = FUNC16(Boulder_Func_3);
E->boulder_var_C = g_word_A686F1[E->boulder_var_D - 1];
if ((--E->boulder_var_D & 0x8000) != 0) {
E->boulder_var_03 = E->base.y_pos;
E->boulder_var_02 = E->base.y_subpos;
E->boulder_var_A = FUNC16(Boulder_Func_5);
}
}
} else {
E->boulder_var_C += 256;
uint16 v3 = 8 * HIBYTE(E->boulder_var_B);
if (E->boulder_var_E)
v3 += 4;
Boulder_Func_7(v3);
uint16 v4 = E->boulder_var_B + 32;
E->boulder_var_B = v4;
if (!sign16(v4 - 20480))
E->boulder_var_B = 20480;
}
}
void Boulder_Func_5(void) { // 0xA68942
Enemy_Boulder *E = Get_Boulder(cur_enemy_index);
uint16 v2 = 8 * HIBYTE(E->boulder_var_B);
int v3 = v2 >> 1;
Enemy_MoveDown(cur_enemy_index, kCommonEnemySpeeds_Quadratic32[v3 >> 1] + (E->boulder_var_01 << 16));
E->base.y_pos -= E->boulder_var_01;
if (E->boulder_var_E)
v2 += 4;
int v4 = v2 >> 1;
if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index, kCommonEnemySpeeds_Quadratic32[v4 >> 1])) {
E->base.properties |= 0x300;
E->boulder_var_A = FUNC16(Boulder_Func_6);
QueueSfx2_Max6(0x42);
eproj_spawn_pt = (Point16U){ E->base.x_pos, E->base.y_pos };
SpawnEprojWithRoomGfx(addr_kEproj_DustCloudExplosion, 0x11);
QueueSfx2_Max6(0x43);
} else {
uint16 v5 = E->boulder_var_B + 64;
E->boulder_var_B = v5;
if (!sign16(v5 - 0x4000))
E->boulder_var_B = 0x4000;
if (E->base.y_pos == E->boulder_var_03 && E->base.y_subpos == E->boulder_var_02)
E->boulder_var_01 = 0;
}
E->boulder_var_03 = E->base.y_pos;
E->boulder_var_02 = E->base.y_subpos;
}
void Boulder_Func_6(void) { // 0xA689FC
;
}
void Boulder_Func_7(uint16 j) { // 0xA68A00
Enemy_Boulder *E = Get_Boulder(cur_enemy_index);
int v3 = j >> 1;
AddToHiLo(&E->base.x_pos, &E->base.x_subpos, __PAIR32__(kCommonEnemySpeeds_Quadratic[v3 + 1], kCommonEnemySpeeds_Quadratic[v3]));
}
void Boulder_Func_8(uint16 j) { // 0xA68A1D
Enemy_Boulder *E = Get_Boulder(cur_enemy_index);
int v3 = j >> 1;
AddToHiLo(&E->base.x_pos, &E->base.x_subpos, __PAIR32__(kCommonEnemySpeeds_Linear[v3 + 1], kCommonEnemySpeeds_Linear[v3]));
}
void Boulder_Func_9(uint16 j) { // 0xA68A3A
Enemy_Boulder *E = Get_Boulder(cur_enemy_index);
int v3 = j >> 1;
AddToHiLo(&E->base.y_pos, &E->base.y_subpos, __PAIR32__(kCommonEnemySpeeds_Quadratic[v3 + 1], kCommonEnemySpeeds_Quadratic[v3]));
}
void SpikeyPlatform_Init(void) { // 0xA68B2F
Enemy_SpikeyPlatform *E = Get_SpikeyPlatform(cur_enemy_index);
E->base.current_instruction = addr_kSpikeyPlatform_Ilist_8B29;
E->spm_var_A = FUNC16(SpikeyPlatform_Func_1);
uint16 v1 = 8 * LOBYTE(E->spm_parameter_1);
E->spm_var_02 = v1;
int v2 = v1 >> 1;
E->spm_var_E = kCommonEnemySpeeds_Linear[v2 + 1];
E->spm_var_F = kCommonEnemySpeeds_Linear[v2];
E->spm_var_D = E->base.y_pos + HIBYTE(E->spm_parameter_2);
E->spm_var_C = E->base.y_pos;
uint16 spm_parameter_2_low = LOBYTE(E->spm_parameter_2);
E->spm_var_00 = spm_parameter_2_low;
E->spm_var_B = spm_parameter_2_low;
}
void SpikeyPlatform2ndEnemy_Init(void) { // 0xA68B85
int v0 = cur_enemy_index >> 1;
EnemyData *v1 = gEnemyData(cur_enemy_index);
v1->x_pos = enemy_drawing_queue[v0 + 91];
v1->y_pos = enemy_drawing_queue[v0 + 93] + 12;
}
void SpikeyPlatform2ndEnemy_Main(void) { // 0xA68B99
int v0 = cur_enemy_index >> 1;
EnemyData *v1 = gEnemyData(cur_enemy_index);
v1->x_pos = enemy_drawing_queue[v0 + 91];
v1->y_pos = enemy_drawing_queue[v0 + 93] + 12;
}
void CallSpikeyPlatformFunc(uint32 ea, uint16 k) {
switch (ea) {
case fnSpikeyPlatform_Func_1: SpikeyPlatform_Func_1(); return;
case fnSpikeyPlatform_Func_2: SpikeyPlatform_Func_2(); return;
case fnSpikeyPlatform_Func_3: SpikeyPlatform_Func_3(k); return;
case fnSpikeyPlatform_Func_4: SpikeyPlatform_Func_4(); return;
default: Unreachable();
}
}
void SpikeyPlatform_Main(void) { // 0xA68BAD
Enemy_SpikeyPlatform *E = Get_SpikeyPlatform(cur_enemy_index);
CallSpikeyPlatformFunc(E->spm_var_A | 0xA60000, cur_enemy_index);
}
void SpikeyPlatform_Func_1(void) { // 0xA68BB4
Enemy_SpikeyPlatform *E = Get_SpikeyPlatform(cur_enemy_index);
if (!--E->spm_var_B) {
E->spm_var_B = E->spm_var_00;
E->spm_var_02 = 8 * LOBYTE(E->spm_parameter_1);
E->spm_var_A = FUNC16(SpikeyPlatform_Func_2);
}
}
void SpikeyPlatform_Func_2(void) { // 0xA68BDC
Enemy_SpikeyPlatform *E = Get_SpikeyPlatform(cur_enemy_index);
E->spm_var_01 = E->base.y_pos;
int v1 = E->spm_var_02 >> 1;
AddToHiLo(&E->base.y_pos, &E->base.y_subpos, __PAIR32__(kCommonEnemySpeeds_Linear[v1], kCommonEnemySpeeds_Linear[v1 + 1]));
if ((int16)(E->base.y_pos - E->spm_var_D) >= 0) {
E->spm_var_03 = 64;
E->spm_var_A = FUNC16(SpikeyPlatform_Func_3);
E->base.y_pos = E->spm_var_D;
QueueSfx2_Max6(0x1B);
}
if (SpikeyPlatform_Func_5(cur_enemy_index))
extra_samus_y_displacement += E->base.y_pos - E->spm_var_01;
int16 v4 = E->spm_var_02 + 8;
if (!sign16(E->spm_var_02 - 504))
v4 = 512;
E->spm_var_02 = v4;
}
void SpikeyPlatform_Func_3(uint16 k) { // 0xA68C4A
Enemy_SpikeyPlatform *E = Get_SpikeyPlatform(k);
uint16 v2 = E->spm_var_03 - 1;
E->spm_var_03 = v2;
if (!v2)
E->spm_var_A = FUNC16(SpikeyPlatform_Func_4);
}
void SpikeyPlatform_Func_4(void) { // 0xA68C5D
Enemy_SpikeyPlatform *E = Get_SpikeyPlatform(cur_enemy_index);
E->spm_var_01 = E->base.y_pos;
AddToHiLo(&E->base.y_pos, &E->base.y_subpos, -0x8000);
if ((int16)(E->base.y_pos - E->spm_var_C) < 0) {
E->spm_var_A = FUNC16(SpikeyPlatform_Func_1);
E->base.y_pos = E->spm_var_C;
}
if (SpikeyPlatform_Func_5(cur_enemy_index))
extra_samus_y_displacement += E->base.y_pos - E->spm_var_01;
}
uint16 SpikeyPlatform_Func_5(uint16 k) { // 0xA68CA1
Enemy_SpikeyPlatform *E = Get_SpikeyPlatform(k);
uint16 v2 = abs16(samus_x_pos - E->base.x_pos);
bool v3 = v2 < samus_x_radius;
uint16 v4 = v2 - samus_x_radius;
if (!v3 && v4 >= E->base.x_width)
return 0;
if ((int16)(samus_y_pos + 5 - E->base.y_pos) < 0) {
uint16 v6 = E->base.y_pos - (samus_y_pos + 5);
v3 = v6 < samus_y_radius;
uint16 v7 = v6 - samus_y_radius;
if (v3 || v7 == E->base.y_height || v7 < E->base.y_height)
return -1;
}
return 0;
}
const uint16 *FireGeyser_Instr_1(uint16 k, const uint16 *jp) { // 0xA68DAF
QueueSfx2_Max6(0x61);
return jp;
}
const uint16 *FireGeyser_Instr_2(uint16 k, const uint16 *jp) { // 0xA68E13
uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DBB;
Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64);
E->base.y_pos = v2;
E->base.y_height = g_word_A68DE7;
E->base.x_width = 8;
return jp;
}
const uint16 *FireGeyser_Instr_3(uint16 k, const uint16 *jp) { // 0xA68E2D
uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DBD;
Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64);
E->base.y_pos = v2;
E->base.y_height = g_word_A68DE9;
return jp;
}
const uint16 *FireGeyser_Instr_4(uint16 k, const uint16 *jp) { // 0xA68E41
uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DBF;
Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64);
E->base.y_pos = v2;
E->base.y_height = g_word_A68DEB;
return jp;
}
const uint16 *FireGeyser_Instr_5(uint16 k, const uint16 *jp) { // 0xA68E55
uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DC1;
Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64);
E->base.y_pos = v2;
E->base.y_height = g_word_A68DED;
return jp;
}
const uint16 *FireGeyser_Instr_6(uint16 k, const uint16 *jp) { // 0xA68E69
uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DC3;
Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64);
E->base.y_pos = v2;
E->base.y_height = g_word_A68DEF;
return jp;
}
const uint16 *FireGeyser_Instr_7(uint16 k, const uint16 *jp) { // 0xA68E7D
uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DC5;
Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64);
E->base.y_pos = v2;
E->base.y_height = g_word_A68DF1;
return jp;
}
const uint16 *FireGeyser_Instr_8(uint16 k, const uint16 *jp) { // 0xA68E91
uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DC7;
Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64);
E->base.y_pos = v2;
E->base.y_height = g_word_A68DF3;
return jp;
}
const uint16 *FireGeyser_Instr_9(uint16 k, const uint16 *jp) { // 0xA68EA5
uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DC9;
Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64);
E->base.y_pos = v2;
E->base.y_height = g_word_A68DF5;
return jp;
}
const uint16 *FireGeyser_Instr_10(uint16 k, const uint16 *jp) { // 0xA68EB9
uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DCB;
Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64);
E->base.y_pos = v2;
E->base.y_height = g_word_A68DF7;
return jp;
}
const uint16 *FireGeyser_Instr_11(uint16 k, const uint16 *jp) { // 0xA68ECD
uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DCD;
Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64);
E->base.y_pos = v2;
E->base.y_height = g_word_A68DF9;
return jp;
}
const uint16 *FireGeyser_Instr_12(uint16 k, const uint16 *jp) { // 0xA68EE1
uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DCF;
Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64);
E->base.y_pos = v2;
E->base.y_height = g_word_A68DFB;
return jp;
}
const uint16 *FireGeyser_Instr_13(uint16 k, const uint16 *jp) { // 0xA68EF5
uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DD1;
Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64);
E->base.y_pos = v2;
E->base.y_height = g_word_A68DFD;
return jp;
}
const uint16 *FireGeyser_Instr_14(uint16 k, const uint16 *jp) { // 0xA68F09
uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DD3;
Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64);
E->base.y_pos = v2;
E->base.y_height = g_word_A68DFF;
return jp;
}
const uint16 *FireGeyser_Instr_15(uint16 k, const uint16 *jp) { // 0xA68F1D
uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DD5;
Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64);
E->base.y_pos = v2;
E->base.y_height = g_word_A68E01;
return jp;
}
const uint16 *FireGeyser_Instr_16(uint16 k, const uint16 *jp) { // 0xA68F31
uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DD7;
Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64);
E->base.y_pos = v2;
E->base.y_height = g_word_A68E03;
return jp;
}
const uint16 *FireGeyser_Instr_17(uint16 k, const uint16 *jp) { // 0xA68F45
uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DD9;
Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64);
E->base.y_pos = v2;
E->base.y_height = g_word_A68E05;
return jp;
}
const uint16 *FireGeyser_Instr_18(uint16 k, const uint16 *jp) { // 0xA68F59
uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DDB;
Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64);
E->base.y_pos = v2;
E->base.y_height = g_word_A68E07;
return jp;
}
const uint16 *FireGeyser_Instr_19(uint16 k, const uint16 *jp) { // 0xA68F6D
uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DDD;
Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64);
E->base.y_pos = v2;
E->base.y_height = g_word_A68E09;
return jp;
}
const uint16 *FireGeyser_Instr_20(uint16 k, const uint16 *jp) { // 0xA68F81
uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DDF;
Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64);
E->base.y_pos = v2;
E->base.y_height = g_word_A68E0B;
return jp;
}
const uint16 *FireGeyser_Instr_21(uint16 k, const uint16 *jp) { // 0xA68F95
uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DE1;
Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64);
E->base.y_pos = v2;
E->base.y_height = g_word_A68E0D;
return jp;
}
const uint16 *FireGeyser_Instr_22(uint16 k, const uint16 *jp) { // 0xA68FA9
uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DE3;
Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64);
E->base.y_pos = v2;
E->base.y_height = g_word_A68E0F;
return jp;
}
const uint16 *FireGeyser_Instr_23(uint16 k, const uint16 *jp) { // 0xA68FBD
uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DE5;
Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64);
E->base.y_pos = v2;
E->base.y_height = g_word_A68E11;
return jp;
}
const uint16 *FireGeyser_Instr_24(uint16 k, const uint16 *jp) { // 0xA68FD1
Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index);
E->fgr_var_C = 1;
Enemy_FireGeyser *E1 = Get_FireGeyser(cur_enemy_index + 64);
E1->base.x_width = 0;
E1->base.y_height = 0;
E->base.y_pos = E->fgr_var_D;
E->base.properties |= kEnemyProps_Invisible;
E1->base.properties |= 0x400;
return jp;
}
void FireGeyser_Init(void) { // 0xA68FFC
Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index);
E->base.current_instruction = addr_kFireGeyser_Ilist_8DA9;
if (!E->fgr_parameter_2) {
E->base.current_instruction = addr_kFireGeyser_Ilist_8D1B;
E->fgr_var_A = FUNC16(FireGeyser_Func_1);
E->fgr_var_D = E->base.y_pos;
E->base.x_width = 0;
}
}
void CallFireGeyserFunc(uint32 ea) {
switch (ea) {
case fnFireGeyser_Func_1: FireGeyser_Func_1(); return;
case fnFireGeyser_Func_2: FireGeyser_Func_2(); return;
default: Unreachable();
}
}
void FireGeyser_Main(void) { // 0xA69023
Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index);
if (!E->fgr_parameter_2)
CallFireGeyserFunc(E->fgr_var_A | 0xA60000);
}
void FireGeyser_Func_1(void) { // 0xA6902F
Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index);
if ((--E->fgr_var_B & 0x8000) != 0) {
E->fgr_var_A = FUNC16(FireGeyser_Func_2);
E->fgr_var_C = 0;
E->base.instruction_timer = 1;
E->base.timer = 0;
E->base.current_instruction = addr_kFireGeyser_Ilist_8D1B;
E->base.properties &= ~kEnemyProps_Invisible;
Enemy_FireGeyser *E1 = Get_FireGeyser(cur_enemy_index + 64);
E1->base.properties &= ~0x400;
}
}
void FireGeyser_Func_2(void) { // 0xA69062
Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index);
if (E->fgr_var_C) {
E->fgr_var_B = E->fgr_parameter_1;
E->base.properties |= kEnemyProps_Invisible;
E->fgr_var_A = FUNC16(FireGeyser_Func_1);
}
}
void NuclearWaffle_Init(void) { // 0xA694C4
Enemy_NuclearWaffle *E = Get_NuclearWaffle(cur_enemy_index);
E->base.current_instruction = addr_kNuclearWaffle_Ilist_9490;
E->nwe_var_C = LOBYTE(E->nwe_parameter_1);
E->nwe_var_D = HIBYTE(E->nwe_parameter_1);
E->nwe_var_E = LOBYTE(E->nwe_parameter_2);
uint16 nwe_parameter_2_high = HIBYTE(E->nwe_parameter_2);
E->nwe_var_F = nwe_parameter_2_high;
E->nwe_var_B = nwe_parameter_2_high;
E->nwe_var_A = FUNC16(NuclearWaffle_Func_1);
int v2 = (uint16)(4 * E->nwe_var_E) >> 1;
uint16 v3 = g_word_A695F6[v2];
E->nwe_var_23 = v3;
E->nwe_var_21 = v3;
E->nwe_var_2E = g_word_A695F6[v2 + 1];
E->nwe_var_2B = g_word_A695FE[v2];
E->nwe_var_2C = g_word_A695FE[v2 + 1];
E->nwe_var_30 = g_word_A69606[v2];
E->nwe_var_2F = g_word_A69606[v2 + 1];
uint16 v4 = 8 * E->nwe_var_C;
if (!E->nwe_var_E)
v4 += 4;
int v5 = v4 >> 1;
E->nwe_var_25 = kCommonEnemySpeeds_Linear[v5];
E->nwe_var_24 = kCommonEnemySpeeds_Linear[v5 + 1];
E->nwe_var_26 = E->base.x_pos;
E->nwe_var_27 = E->base.y_pos;
uint16 v6 = E->nwe_var_26 + CosineMult8bit(E->nwe_var_23, E->nwe_var_D);
E->nwe_var_28 = v6;
E->base.x_pos = v6;
uint16 v7 = E->nwe_var_27 + SineMult8bit(E->nwe_var_23, E->nwe_var_D);
E->nwe_var_29 = v7;
E->base.y_pos = v7;
uint16 v8 = 8;
E->nwe_var_2A = 8;
do {
SpawnEprojWithGfx(v8, cur_enemy_index, addr_kEproj_NuclearWaffleBody);
v8 = E->nwe_var_2A - 2;
E->nwe_var_2A = v8;
} while (v8);
E->nwe_var_2A = 6;
uint16 v15;
do {
uint16 v13 = E->base.vram_tiles_index | E->base.palette_index;
E->nwe_var_34 = v13;
uint16 r18 = CreateSpriteAtPos(E->base.x_pos, E->base.y_pos, 43, v13);
Get_NuclearWaffle(cur_enemy_index + E->nwe_var_2A)->nwe_var_10 = r18;
v15 = E->nwe_var_2A - 2;
E->nwe_var_2A = v15;
} while (v15);
}
void CallNuclearWaffleFunc(uint32 ea) {
switch (ea) {
case fnNuclearWaffle_Func_1: NuclearWaffle_Func_1(); return;
case fnNuclearWaffle_Func_2: NuclearWaffle_Func_2(); return;
default: Unreachable();
}
}
void NuclearWaffle_Main(void) { // 0xA6960E
Enemy_NuclearWaffle *E = Get_NuclearWaffle(cur_enemy_index);
CallNuclearWaffleFunc(E->nwe_var_A | 0xA60000);
}
void NuclearWaffle_Func_1(void) { // 0xA69615
Enemy_NuclearWaffle *E = Get_NuclearWaffle(cur_enemy_index);
if ((--E->nwe_var_B & 0x8000) != 0) {
E->nwe_var_B = E->nwe_var_F;
E->nwe_var_21 = E->nwe_var_23;
E->nwe_var_A = FUNC16(NuclearWaffle_Func_2);
E->nwe_var_33 = 0;
E->nwe_var_08 = 0;
E->nwe_var_09 = 0;
E->nwe_var_0A = 0;
E->nwe_var_0B = 0;
E->nwe_var_0C = 0;
E->nwe_var_0D = 0;
E->nwe_var_0E = 0;
E->nwe_var_0F = 0;
E->nwe_var_18 = 0;
E->nwe_var_19 = 0;
E->nwe_var_1A = 0;
E->nwe_var_1B = 0;
E->nwe_var_1C = 0;
E->nwe_var_1D = 0;
E->nwe_var_1E = 0;
E->nwe_var_1F = 0;
E->base.properties |= kEnemyProps_ProcessedOffscreen;
}
}
void NuclearWaffle_Func_2(void) { // 0xA69682
Enemy_NuclearWaffle *E = Get_NuclearWaffle(cur_enemy_index);
uint16 varE32 = E->nwe_var_D;
PairU16 pair = NuclearWaffle_Func_6(E->nwe_var_21);
uint16 v8 = pair.j;
if (pair.j != E->nwe_var_33) {
CreateSpriteAtPos(E->base.x_pos, E->base.y_pos, 46, E->nwe_var_34);
CreateSpriteAtPos(E->base.x_pos, E->base.y_pos, pair.k + 44, E->nwe_var_34);
NuclearWaffle_Func_7(pair.j);
}
E->nwe_var_33 = v8;
uint16 tmp;
uint16 v4 = NuclearWaffle_Func_5(E->nwe_var_21, &tmp);
E->base.x_pos = E->nwe_var_26 + CosineMult8bit(v4, E->nwe_var_D);
uint16 v5 = NuclearWaffle_Func_5(E->nwe_var_21, &tmp);
E->base.y_pos = E->nwe_var_27 + SineMult8bit(v5, E->nwe_var_D);
NuclearWaffle_Func_3(varE32);
NuclearWaffle_Func_4(varE32);
AddToHiLo(&E->nwe_var_21, &E->nwe_var_20, __PAIR32__(E->nwe_var_25, E->nwe_var_24));
}
void NuclearWaffle_Func_3(uint16 varE32) { // 0xA69721
Enemy_NuclearWaffle *E = Get_NuclearWaffle(cur_enemy_index);
uint16 v12;
E->nwe_var_2A = 8;
uint16 R36 = E->nwe_var_2C + E->nwe_var_21;
uint16 r28;
do {
R36 -= E->nwe_var_2B;
Enemy_NuclearWaffle *ET = Get_NuclearWaffle(cur_enemy_index + E->nwe_var_2A);
uint16 nwe_var_00 = ET->nwe_var_00;
PairU16 pair = NuclearWaffle_Func_6(R36);
uint16 v13 = pair.j;
if (pair.j != ET->nwe_var_08) {
int v5 = nwe_var_00 >> 1;
CreateSpriteAtPos(eproj_x_pos[v5], eproj_y_pos[v5], 46, E->nwe_var_34);
CreateSpriteAtPos(eproj_x_pos[v5], eproj_y_pos[v5], pair.k + 44, E->nwe_var_34);
NuclearWaffle_Func_7(pair.j);
}
ET->nwe_var_08 = v13;
uint16 v7 = NuclearWaffle_Func_5(R36, &r28);
int v10 = nwe_var_00 >> 1;
eproj_x_pos[v10] = E->nwe_var_26 + CosineMult8bit(v7, varE32);
uint16 v11 = NuclearWaffle_Func_5(R36, &r28);
eproj_y_pos[v10] = E->nwe_var_27 + SineMult8bit(v11, varE32);
v12 = E->nwe_var_2A - 2;
E->nwe_var_2A = v12;
} while (v12);
if (r28) {
E->nwe_var_A = FUNC16(NuclearWaffle_Func_1);
E->base.properties &= ~kEnemyProps_ProcessedOffscreen;
}
}
void NuclearWaffle_Func_4(uint16 varE32) { // 0xA697E9
Enemy_NuclearWaffle *E = Get_NuclearWaffle(cur_enemy_index);
E->nwe_var_2A = 6;
uint16 R36 = E->nwe_var_21;
uint16 v12;
uint16 r28 = 0;
do {
R36 -= E->nwe_var_2B;
Enemy_NuclearWaffle *ET = Get_NuclearWaffle(cur_enemy_index + E->nwe_var_2A);
uint16 nwe_var_10 = ET->nwe_var_10;
PairU16 pair = NuclearWaffle_Func_6(R36);
uint16 v13 = pair.j;
if (pair.j != ET->nwe_var_18) {
uint16 r38 = E->nwe_var_34;
int v5 = nwe_var_10 >> 1;
CreateSpriteAtPos(sprite_x_pos[v5], sprite_y_pos[v5], 46, r38);
CreateSpriteAtPos(sprite_x_pos[v5], sprite_y_pos[v5], pair.k + 44, r38);
NuclearWaffle_Func_7(pair.j);
}
ET->nwe_var_18 = v13;
uint16 v6 = NuclearWaffle_Func_5(R36, &r28);
uint16 v7 = CosineMult8bit(v6, varE32);
uint16 R32 = E->nwe_var_26 + v7;
uint16 v9 = NuclearWaffle_Func_5(R36, &r28);
uint16 R34 = E->nwe_var_27 + SineMult8bit(v9, varE32);
sprite_x_pos[nwe_var_10 >> 1] = R32;
sprite_y_pos[nwe_var_10 >> 1] = R34;
v12 = E->nwe_var_2A - 2;
E->nwe_var_2A = v12;
} while (v12);
}
uint16 NuclearWaffle_Func_5(uint16 a, uint16 *r28_out) { // 0xA698AD
*r28_out = 0;
Enemy_NuclearWaffle *E = Get_NuclearWaffle(cur_enemy_index);
if (!E->nwe_var_E) {
if ((int16)(a - E->nwe_var_2E) >= 0) {
if ((int16)(a - E->nwe_var_23) < 0)
return a;
return E->nwe_var_23;
}
LABEL_8:
++(*r28_out);
return E->nwe_var_2E;
}
if ((int16)(a - E->nwe_var_2E) >= 0)
goto LABEL_8;
if ((int16)(a - E->nwe_var_23) < 0)
return E->nwe_var_23;
return a;
}
static PairU16 NuclearWaffle_Func_6(uint16 a) { // 0xA698E7
Enemy_NuclearWaffle *E = Get_NuclearWaffle(cur_enemy_index);
if (E->nwe_var_E) {
if ((int16)(a - E->nwe_var_2F) >= 0) {
return (PairU16) { 1, 2 };
} else if ((int16)(a - E->nwe_var_30) >= 0) {
return (PairU16) { 0, 1 };
} else {
return (PairU16) { 0, 0 };
}
} else if ((int16)(a - E->nwe_var_2F) < 0) {
return (PairU16) { 0, 2 };
} else if ((int16)(a - E->nwe_var_30) < 0) {
return (PairU16) { 1, 1 };
} else {
return (PairU16) { 0, 0 };
}
}
void NuclearWaffle_Func_7(uint16 r30) { // 0xA6993F
if (r30 != 2)
QueueSfx2_Max6(0x5E);
}
void FakeKraid_Init(void) { // 0xA69A58
uint16 v0 = (random_number & 3) + 2;
Enemy_FakeKraid *E = Get_FakeKraid(cur_enemy_index);
E->fkd_var_D = v0;
E->fkd_var_E = v0;
v0 += 64;
E->fkd_var_03 = v0;
v0 += 32;
E->fkd_var_04 = v0;
E->fkd_var_05 = v0 - 48;
E->fkd_var_07 = 0;
E->base.properties |= kEnemyProps_DisableSamusColl;
E->base.instruction_timer = 1;
E->base.timer = 0;
E->fkd_var_B = -4;
E->fkd_var_C = -4;
uint16 v2 = addr_stru_A699AE;
if ((int16)(E->base.x_pos - samus_x_pos) < 0) {
E->fkd_var_B = 4;
E->fkd_var_C = 4;
v2 = addr_stru_A699FC;
}
E->base.current_instruction = v2;
}
void FakeKraid_Main(void) { // 0xA69AC2
Enemy_FakeKraid *E = Get_FakeKraid(cur_enemy_index);
uint16 fkd_var_07 = E->fkd_var_07;
uint16 v3 = fkd_var_07 + 2;
if (!sign16(fkd_var_07 - 4))
v3 = 0;
E->fkd_var_07 = v3;
FakeKraid_Func_1(cur_enemy_index, fkd_var_07);
}
void FakeKraid_Func_1(uint16 k, uint16 j) { // 0xA69ADC
Enemy_FakeKraid *ET = Get_FakeKraid(k + j);
uint16 fkd_var_03 = ET->fkd_var_03;
if (fkd_var_03) {
ET->fkd_var_03 = fkd_var_03 - 1;
} else {
ET->fkd_var_03 = (random_number & 0x3F) + 16;
Enemy_FakeKraid *E = Get_FakeKraid(k);
E->fkd_var_06 = j;
uint16 v6 = addr_kEproj_MiniKraidSpikesLeft;
int16 fkd_var_C = E->fkd_var_C;
if (fkd_var_C >= 0)
v6 = addr_kEproj_MiniKraidSpikesRight;
SpawnEprojWithGfx(0, k, v6);
if (!CheckIfEnemyIsOnScreen())
QueueSfx2_Max6(0x3F);
}
}
const uint16 *FakeKraid_Instr_2(uint16 k, const uint16 *jp) { // 0xA69B26
Enemy_FakeKraid *E = Get_FakeKraid(cur_enemy_index);
if (E->fkd_var_E)
--E->fkd_var_E;
if (E->fkd_var_D-- == 1) {
E->fkd_var_D = (random_number & 3) + 7;
} else {
if (!(Enemy_MoveRight_IgnoreSlopes(cur_enemy_index, INT16_SHL16(E->fkd_var_B))))
goto LABEL_7;
}
E->fkd_var_B = -E->fkd_var_B;
LABEL_7:
E->fkd_var_C = -4;
if ((int16)(E->base.x_pos - samus_x_pos) < 0)
E->fkd_var_C = 4;
return jp;
}
const uint16 *FakeKraid_Instr_1(uint16 k, const uint16 *jp) { // 0xA69B74
Enemy_FakeKraid *E = Get_FakeKraid(cur_enemy_index);
if (E->fkd_var_E) {
if ((E->fkd_var_C & 0x8000) != 0) {
if ((Get_FakeKraid(cur_enemy_index)->fkd_var_B & 0x8000) == 0)
return INSTR_RETURN_ADDR(addr_stru_A699C6);
return INSTR_RETURN_ADDR(addr_stru_A699AE);
} else {
if ((E->fkd_var_B & 0x8000) != 0)
return INSTR_RETURN_ADDR(addr_stru_A69A14);
return INSTR_RETURN_ADDR(addr_stru_A699FC);
}
} else {
E->fkd_var_E = (random_number & 3) + 3;
if ((E->fkd_var_C & 0x8000) != 0)
return INSTR_RETURN_ADDR(addr_kFakeKraid_Ilist_99DC);
return INSTR_RETURN_ADDR(addr_kFakeKraid_Ilist_9A2A);
}
}
const uint16 *FakeKraid_Instr_3(uint16 k, const uint16 *jp) { // 0xA69BB2
if (CheckIfEnemyIsOnScreen() == 0)
QueueSfx2_Max6(0x16);
return jp;
}
const uint16 *FakeKraid_Instr_4(uint16 k, const uint16 *jp) { // 0xA69BC4
FakeKraid_InstrHelper_45(k, 0, 0xFFFC);
return jp;
}
void FakeKraid_InstrHelper_45(uint16 k, uint16 j, uint16 a) { // 0xA69BCB
uint16 ka = cur_enemy_index;
Enemy_FakeKraid *E = Get_FakeKraid(cur_enemy_index);
E->fkd_var_02 = a;
int v5 = j >> 1;
E->fkd_var_00 = g_word_A69A48[v5];
uint16 v6 = g_word_A69A48[v5 + 1];
E->fkd_var_01 = v6;
SpawnEprojWithGfx(v6, cur_enemy_index, addr_kEproj_MiniKraidSpit);
E->fkd_var_00 = g_word_A69A48[v5 + 2];
uint16 v8 = g_word_A69A48[v5 + 3];
E->fkd_var_01 = v8;
SpawnEprojWithGfx(v8, ka, addr_kEproj_MiniKraidSpit);
}
const uint16 *FakeKraid_Instr_5(uint16 k, const uint16 *jp) { // 0xA69C02
FakeKraid_InstrHelper_45(k, 8, 4);
return jp;
}
void sub_A69C0B(void) { // 0xA69C0B
EnemyData *v0 = gEnemyData(cur_enemy_index);
special_death_item_drop_x_origin_pos = v0->x_pos;
special_death_item_drop_y_origin_pos = v0->y_pos;
NormalEnemyPowerBombAiSkipDeathAnim_CurEnemy();
FakeKraid_9C50();
}
void FakeKraid_Touch(void) { // 0xA69C22
Enemy_FakeKraid *E = Get_FakeKraid(cur_enemy_index);
special_death_item_drop_x_origin_pos = E->base.x_pos;
special_death_item_drop_y_origin_pos = E->base.y_pos;
NormalEnemyTouchAiSkipDeathAnim_CurEnemy();
FakeKraid_9C50();
}
void FakeKraid_Shot(void) { // 0xA69C39
Enemy_FakeKraid *E = Get_FakeKraid(cur_enemy_index);
special_death_item_drop_x_origin_pos = E->base.x_pos;
special_death_item_drop_y_origin_pos = E->base.y_pos;
NormalEnemyShotAiSkipDeathAnim_CurEnemy();
FakeKraid_9C50();
}
void FakeKraid_9C50(void) { // 0xA69C50
if (!Get_FakeKraid(cur_enemy_index)->base.health) {
EnemyDeathAnimation(cur_enemy_index, 3);
Enemy_ItemDrop_MiniKraid(cur_enemy_index);
}
}
void CeresRidley_Init(void) { // 0xA6A0F5
int16 v4;
int16 v8;
Enemy_CeresRidley *E = Get_CeresRidley(0);
if ((boss_bits_for_area[area_index] & 1) != 0) {
E->base.properties |= kEnemyProps_Tangible | kEnemyProps_Deleted | kEnemyProps_Invisible;
} else {
for (int i = 4094; i >= 0; i -= 2)
tilemap_stuff[i >> 1] = 0;
DisableMinimapAndMarkBossRoomAsExplored();
E->cry_parameter_1 = 0;
E->cry_parameter_2 = 0;
Ridley_Func_99(addr_kRidley_Ilist_E538);
E->base.palette_index = 3584;
E->cry_var_0C = 3584;
E->base.extra_properties |= 4;
E->cry_var_01 = 0;
E->cry_var_0D = 0;
earthquake_type = 0;
earthquake_timer = 0;
Ridley_Func_92();
Ridley_Func_117();
if (area_index == 2) {
E->base.properties |= kEnemyProps_BlockPlasmaBeam | kEnemyProps_Tangible;
E->base.x_pos = 96;
E->base.y_pos = 394;
E->cry_var_A = FUNC16(CeresRidley_Func_3);
E->cry_var_B = 0;
E->cry_var_C = 0;
E->base.layer = 5;
E->cry_var_01 = 0;
E->cry_var_02 = 1;
E->cry_var_20 = 64;
E->cry_var_21 = 416;
E->cry_var_22 = 64;
E->cry_var_23 = 224;
E->cry_var_10 = 2;
E->cry_var_1C = 120;
WriteColorsToTargetPalette(0xa6, 0x140, addr_word_A6E1CF, 0x20);
uint16 v3 = 0;
v4 = 15;
do {
int v5 = v3 >> 1;
target_palettes[v5 + 113] = 0;
target_palettes[v5 + 241] = 0;
v3 += 2;
--v4;
} while (v4);
} else {
E->base.properties |= kEnemyProps_BlockPlasmaBeam | kEnemyProps_Tangible;
E->base.x_pos = 186;
E->base.y_pos = 169;
ceres_status = 0;
E->cry_var_10 = 0;
E->cry_var_02 = 0;
tilemap_stuff[1] = 1;
E->cry_var_1C = 15;
E->cry_var_A = FUNC16(CeresRidley_Func_3);
E->cry_var_B = 0;
E->cry_var_C = 0;
E->cry_var_20 = -32;
E->cry_var_21 = 176;
E->cry_var_22 = 40;
E->cry_var_23 = 224;
WriteColorsToTargetPalette(0xa6, 0x140, addr_word_A6E16F, 0x20);
uint16 v7 = 482;
v8 = 15;
do {
target_palettes[v7 >> 1] = 0;
v7 += 2;
--v8;
} while (v8);
E->cry_var_03 = addr_kBabyMetroid_Ilist_BF31;
E->cry_var_04 = 1;
gRam8800_Default(0)->var_40 = FUNC16(Ridley_Func_50);
E->cry_var_07 = 5;
QueueMusic_Delayed8(0);
}
}
}
void CallRidleyFunc(uint32 ea) {
switch (ea) {
case fnCeresRidley_Func_2: CeresRidley_Func_2(); return;
case fnCeresRidley_Func_3: CeresRidley_Func_3(); return;
case fnCeresRidley_A377: CeresRidley_A377(); return;
case fnCeresRidley_Func_4: CeresRidley_Func_4(); return;
case fnCeresRidley_Func_5: CeresRidley_Func_5(); return;
case fnCeresRidley_Func_6: CeresRidley_Func_6(); return;
case fnCeresRidley_Func_7: CeresRidley_Func_7(); return;
case fnCeresRidley_Func_9: CeresRidley_Func_9(); return;
case fnCeresRidley_Func_10: CeresRidley_Func_10(); return;
case fnCeresRidley_Func_11: CeresRidley_Func_11(); return;
case fnCeresRidley_Func_13: CeresRidley_Func_13(); return;
case fnCeresRidley_A7F9: CeresRidley_A7F9(); return;
case fnCeresRidley_Func_14: CeresRidley_Func_14(); return;
case fnCeresRidley_Func_15: CeresRidley_Func_15(); return;
case fnCeresRidley_Func_16: CeresRidley_Func_16(); return;
case fnCeresRidley_Func_17: CeresRidley_Func_17(); return;
case fnCeresRidley_Func_18: CeresRidley_Func_18(); return;
case fnCeresRidley_Func_19: CeresRidley_Func_19(); return;
case fnCeresRidley_Func_20: CeresRidley_Func_20(); return;
case fnCeresRidley_Func_21: CeresRidley_Func_21(); return;
case fnCeresRidley_Func_22: CeresRidley_Func_22(); return;
case fnCeresRidley_Func_23: CeresRidley_Func_23(); return;
case fnCeresRidley_Func_24: CeresRidley_Func_24(); return;
case fnnullsub_233: return;
case fnCeresRidley_Func_26: CeresRidley_Func_26(); return;
case fnRidley_Func_3: Ridley_Func_3(); return;
case fnRidley_Func_3b: Ridley_Func_3b(); return;
case fnRidley_Func_5: Ridley_Func_5(); return;
case fnRidley_Func_6: Ridley_Func_6(); return;
case fnRidley_Func_8: Ridley_Func_8(); return;
case fnRidley_B455: Ridley_B455(); return;
case fnRidley_Func_9: Ridley_Func_9(); return;
case fnRidley_Func_10: Ridley_Func_10(); return;
case fnRidley_Func_11: Ridley_Func_11(); return;
case fnRidley_Func_12: Ridley_Func_12(); return;
case fnRidley_Func_13: Ridley_Func_13(); return;
case fnRidley_Func_14: Ridley_Func_14(); return;
case fnRidley_Func_15: Ridley_Func_15(); return;
case fnRidley_Func_16: Ridley_Func_16(); return;
case fnRidley_Func_19: Ridley_Func_19(); return;
case fnRidley_Func_20: Ridley_Func_20(); return;
case fnRidley_Func_21: Ridley_Func_21(); return;
case fnRidley_Func_22: Ridley_Func_22(); return;
case fnRidley_Func_33: Ridley_Func_33(); return;
case fnRidley_Func_33b: Ridley_Func_33b(); return;
case fnRidley_Func_34: Ridley_Func_34(); return;
case fnRidley_Func_35: Ridley_Func_35(); return;
case fnRidley_Func_36: Ridley_Func_36(); return;
case fnRidley_Func_43: Ridley_Func_43(); return;
case fnRidley_Func_44: Ridley_Func_44(); return;
case fnRidley_Func_45: Ridley_Func_45(); return;
case fnRidley_Func_46: Ridley_Func_46(); return;
case fnRidley_Func_47: Ridley_Func_47(); return;
case fnRidley_Func_54: Ridley_Func_54(); return;
case fnRidley_Func_63: Ridley_Func_63(); return;
case fnRidley_C53E: Ridley_C53E(); return;
case fnRidley_C551: Ridley_C551(); return;
case fnRidley_Func_64: Ridley_Func_64(); return;
case fnRidley_Func_65: Ridley_Func_65(); return;
case fnRidley_Func_66: Ridley_Func_66(); return;
case fnRidley_Func_67: Ridley_Func_67(); return;
case fnnullsub_349: return;
default: Unreachable();
}
}
void CeresRidley_Main(void) { // 0xA6A288
Enemy_CeresRidley *E = Get_CeresRidley(0);
E->base.health = 0x7FFF;
CallRidleyFunc(E->cry_var_A | 0xA60000);
if (!ceres_status) {
if (Get_CeresRidley(0)->cry_var_02) {
Ridley_Func_102();
Ridley_Func_112();
Ridley_Func_115();
CeresRidley_Func_1();
Ridley_Func_70();
Ridley_Func_101();
Ridley_Func_118();
sub_A6DB2A();
Ridley_Func_120();
}
Ridley_A2DC();
}
}
void CeresRidley_Func_1(void) { // 0xA6A2BD
if (random_number >= 0xFF00)
tilemap_stuff[15] = (random_number & 0xF) + 8;
}
void CeresRidley_Hurt(void) { // 0xA6A2D3
Ridley_Func_102();
sub_A6DB2A();
Ridley_Func_120();
Ridley_A2DC();
}
void Ridley_A2DC(void) { // 0xA6A2DC
Ridley_Func_49();
if (Get_CeresRidley(0)->cry_var_02) {
mov24(&enemy_gfx_drawn_hook, 0xA6A2F2);
} else {
Ridley_A2F2();
}
}
void Ridley_A2F2(void) { // 0xA6A2F2
if (!ceres_status)
DrawBabyMetroid_0();
Enemy_CeresRidley *E = Get_CeresRidley(0x40);
if (E->cry_var_B) {
// bug
static const int16 g_word_A6A321[4] = { 0, -1024, -4, -1 };
DrawSpritemap(0xA6, addr_kCeresRidley_Sprmap_A329,
E->base.x_pos + g_word_A6A321[earthquake_timer & 3], E->base.y_pos, 1024);
}
}
void CeresRidley_Func_2(void) { // 0xA6A354
Enemy_CeresRidley *E = Get_CeresRidley(0);
E->cry_var_B = 0;
E->cry_var_C = 0;
}
void CeresRidley_Func_3(void) { // 0xA6A35B
int16 v1;
if (door_transition_flag_enemies) {
} else {
Enemy_CeresRidley *E = Get_CeresRidley(0);
E->cry_var_A = FUNC16(CeresRidley_A377);
v1 = 512;
if (area_index == 2)
v1 = 170;
E->cry_var_F = v1;
CeresRidley_A377();
}
}
void CeresRidley_A377(void) { // 0xA6A377
Enemy_CeresRidley *E = Get_CeresRidley(0);
if ((--E->cry_var_F & 0x8000) != 0) {
E->cry_var_A = FUNC16(CeresRidley_Func_4);
E->cry_var_E = 0;
E->cry_var_F = 0;
}
}
void CeresRidley_Func_4(void) { // 0xA6A389
int16 v2;
Enemy_CeresRidley *E = Get_CeresRidley(0);
if ((E->cry_var_E & 0x8000) == 0) {
uint16 cry_var_E = E->cry_var_E;
if (++E->cry_var_F) {
E->cry_var_F = 0;
v2 = g_byte_A6E269[cry_var_E];
if (v2 == 255) {
E->cry_var_E = 0;
E->cry_var_A = FUNC16(CeresRidley_Func_5);
E->cry_var_02 = 1;
} else {
E->cry_var_E = cry_var_E + 1;
int v3 = (uint16)(6 * v2) >> 1;
palette_buffer[252] = g_word_A6E2AA[v3];
palette_buffer[253] = g_word_A6E2AA[v3 + 1];
palette_buffer[254] = g_word_A6E2AA[v3 + 2];
}
}
}
}
void CeresRidley_Func_5(void) { // 0xA6A3DF
int16 v2;
int16 v5;
Enemy_CeresRidley *E = Get_CeresRidley(0);
if (++E->cry_var_F >= 2) {
E->cry_var_F = 0;
uint16 cry_var_E = E->cry_var_E;
uint16 r18 = 290, r20 = 482;
v2 = 11;
do {
v5 = v2;
uint16 v3 = g_word_A6E30A[cry_var_E >> 1];
palette_buffer[r18 >> 1] = v3;
palette_buffer[r20 >> 1] = v3;
cry_var_E += 2;
r18 += 2;
r20 += 2;
v2 = v5 - 1;
} while (v5 != 1);
if (cry_var_E >= 0x160) {
if (area_index == 2)
E->base.layer = 2;
E->base.properties &= ~kEnemyProps_Tangible;
E->cry_var_E = 0;
E->cry_var_A = FUNC16(CeresRidley_Func_6);
E->cry_var_F = 4;
QueueMusic_Delayed8(5);
} else {
E->cry_var_E = cry_var_E;
}
}
}
void CeresRidley_Func_6(void) { // 0xA6A455
Enemy_CeresRidley *E = Get_CeresRidley(0);
if ((--E->cry_var_F & 0x8000) != 0) {
Ridley_Func_99(addr_kRidley_Ilist_E690);
E->cry_var_F = 0;
E->cry_var_A = FUNC16(CeresRidley_Func_7);
if (area_index != 2)
E->cry_var_F = 252;
}
}
void CeresRidley_Func_7(void) { // 0xA6A478
Enemy_CeresRidley *E = Get_CeresRidley(0);
if (area_index == 2) {
bool v1 = (--E->cry_var_F & 0x8000) != 0;
if (!v1)
return;
E->cry_var_F = 2;
uint16 v2 = E->cry_var_E + 1;
E->cry_var_E = v2;
if (!(CeresRidley_Func_8(v2 - 1) & 1))
return;
fx_target_y_pos = 440;
fx_y_vel = -96;
fx_timer = 32;
} else {
bool v1 = (--E->cry_var_F & 0x8000) != 0;
if (!v1)
return;
}
E->cry_var_E = 0;
Ridley_Func_99(addr_kRidley_Ilist_E91D);
E->cry_var_08 = 8;
E->cry_var_09 = 8;
Ridley_Func_95();
tilemap_stuff[0] = 1;
E->cry_var_A = FUNC16(CeresRidley_Func_2);
}
uint8 CeresRidley_Func_8(uint16 a) { // 0xA6A4D6
uint16 v1 = g_off_A6A4EB[a];
if (!v1)
return 1;
WriteColorsToPalette(0xE2, 0xa6, v1, 0xE);
return 0;
}
void CeresRidley_Func_9(void) { // 0xA6A6AF
Enemy_CeresRidley *E = Get_CeresRidley(0);
E->cry_var_C -= 16;
if (sign16(E->base.y_pos - 112)) {
E->cry_var_A = FUNC16(CeresRidley_Func_10);
CeresRidley_Func_10();
}
}
void CeresRidley_Func_10(void) { // 0xA6A6C8
Enemy_CeresRidley *E = Get_CeresRidley(0);
E->cry_var_C += 20;
if (sign16(E->base.y_pos - 80)) {
E->cry_var_A = FUNC16(CeresRidley_Func_11);
E->cry_var_01 = 1;
}
}
void CeresRidley_Func_11(void) { // 0xA6A6E8
uint16 v1;
Enemy_CeresRidley *E = Get_CeresRidley(0);
if (E->cry_var_0D >= 0x64) {
E->cry_var_01 = 0;
E->cry_var_A = FUNC16(Ridley_Func_44);
Ridley_Func_44();
} else if (sign16(samus_health - 30)) {
E->cry_var_01 = 0;
E->cry_var_A = FUNC16(CeresRidley_Func_22);
CeresRidley_Func_22();
} else if (!(CeresRidley_Func_12() & 1)
|| (v1 = E->cry_var_00 + 1, E->cry_var_00 = v1, v1 >= 0x7C)) {
E->cry_var_A = g_off_A6A743[random_number & 0xF];
E->cry_var_00 = 0;
}
}
uint8 CeresRidley_Func_12(void) { // 0xA6A763
Rect16U rect = { 192, 100, 8, 8 };
Ridley_Func_106(0, 0, rect.x, rect.y);
return Shitroid_Func_2(0, rect);
}
void CeresRidley_Func_13(void) { // 0xA6A782
Enemy_CeresRidley *E = Get_CeresRidley(0);
uint16 v1 = abs16(E->cry_var_C);
if (v1 < 0x80)
v1 = 128;
E->cry_var_C = sign16(E->cry_var_C) ? -v1 : v1;
Ridley_Func_106(0, 0, E->base.x_pos, 88);
if (sign16(E->base.y_pos - 80)) {
uint16 v3 = E->cry_var_00 + 1;
E->cry_var_00 = v3;
if (v3 >= 0x30)
E->cry_var_A = FUNC16(CeresRidley_Func_16);
} else if (sign16(E->base.y_pos - 128)) {
E->cry_var_17 = E->base.x_pos;
E->cry_var_18 = E->base.y_pos;
Ridley_Func_99(addr_kRidley_Ilist_E73A);
E->cry_var_A = addr_loc_A6A7F9;
E->cry_var_00 = 224;
CeresRidley_A7F9();
}
}
void CeresRidley_A7F9(void) { // 0xA6A7F9
uint16 r22 = sign16(random_number) ? -(random_number & 7) : (random_number & 7);
Enemy_CeresRidley *E = Get_CeresRidley(0);
uint16 r18 = E->cry_var_17 + r22;
uint16 r20 = E->cry_var_18 + r22;
Ridley_Func_106(0, 0, r18, r20);
int16 v4 = E->cry_var_00 - 1;
E->cry_var_00 = v4;
if (v4 < 0) {
E->cry_var_00 = 0;
E->cry_var_A = FUNC16(CeresRidley_Func_11);
}
}
void CeresRidley_Func_14(void) { // 0xA6A83C
Ridley_Func_99(addr_kRidley_Ilist_E548);
Enemy_CeresRidley *E = Get_CeresRidley(0);
E->cry_var_A = FUNC16(CeresRidley_Func_15);
E->cry_var_F = 64;
CeresRidley_Func_15();
}
void CeresRidley_Func_15(void) { // 0xA6A84E
bool v2; // sf
Enemy_CeresRidley *E = Get_CeresRidley(0);
uint16 r18 = samus_x_pos;
uint16 v0 = samus_y_pos - 68;
if (sign16(samus_y_pos - 132))
v0 = 64;
uint16 r20 = v0;
Ridley_Func_106(0, 0xD, r18, r20);
Rect16U rect = { r18, r20, 2, 2 };
if (!Shitroid_Func_2(0, rect)
|| (v2 = (int16)(E->cry_var_F - 1) < 0, --E->cry_var_F, v2)) {
E->cry_var_00 = 0;
E->cry_var_A = FUNC16(CeresRidley_Func_11);
}
}
void CeresRidley_Func_16(void) { // 0xA6A88D
Enemy_CeresRidley *E = Get_CeresRidley(0);
E->cry_var_A = FUNC16(CeresRidley_Func_17);
E->cry_var_F = 10;
E->cry_var_0A = 0;
tilemap_stuff[1] = 0;
CeresRidley_Func_17();
}
void CeresRidley_Func_17(void) { // 0xA6A8A4
Ridley_Func_106(0, 1, 192, 80);
Enemy_CeresRidley *E = Get_CeresRidley(0);
if (sign16(E->base.y_pos - 96)) {
E->cry_var_A = FUNC16(CeresRidley_Func_18);
E->cry_var_F = 10;
E->cry_var_0A = 0;
}
}
void CeresRidley_Func_18(void) { // 0xA6A8D4
Ridley_Func_111(-32, -1024, 768);
Enemy_CeresRidley *E = Get_CeresRidley(0);
if ((--E->cry_var_F & 0x8000) != 0) {
E->cry_var_A = FUNC16(CeresRidley_Func_19);
E->cry_var_F = 36;
}
}
void CeresRidley_Func_19(void) { // 0xA6A8F8
Ridley_Func_111(-512, -16384, 768);
Enemy_CeresRidley *E = Get_CeresRidley(0);
if ((--E->cry_var_F & 0x8000) != 0) {
E->cry_var_A = FUNC16(CeresRidley_Func_20);
E->cry_var_F = 28;
tilemap_stuff[2] = 1;
}
}
void CeresRidley_Func_20(void) { // 0xA6A923
Ridley_Func_111(-512, -30720, 768);
Enemy_CeresRidley *E = Get_CeresRidley(0);
if ((--E->cry_var_F & 0x8000) != 0) {
E->cry_var_A = FUNC16(CeresRidley_Func_21);
E->cry_var_F = 1;
}
}
void CeresRidley_Func_21(void) { // 0xA6A947
Ridley_Func_111(-768, -30720, 768);
Enemy_CeresRidley *E = Get_CeresRidley(0);
if ((--E->cry_var_F & 0x8000) != 0) {
E->cry_var_A = FUNC16(CeresRidley_Func_11);
E->cry_var_00 = 0;
tilemap_stuff[1] = 1;
}
}
void CeresRidley_Func_22(void) { // 0xA6A971
Enemy_CeresRidley *E = Get_CeresRidley(0);
E->cry_var_20 = -192;
Ridley_Func_106(0, 1, 192, -128);
if (sign16(E->base.y_pos + 128))
CeresRidley_A994();
}
void CeresRidley_A994(void) { // 0xA6A994
Enemy_CeresRidley *E = Get_CeresRidley(0);
E->cry_var_A = FUNC16(CeresRidley_Func_23);
E->cry_var_F = 64;
CeresRidley_Func_23();
}
void CeresRidley_Func_23(void) { // 0xA6A9A0
Enemy_CeresRidley *E = Get_CeresRidley(0);
if ((--E->cry_var_F & 0x8000) != 0) {
CeresRidley_Func_25();
E->cry_var_B = 0;
E->cry_var_C = 0;
tilemap_stuff[0] = 0;
E->cry_var_A = FUNC16(CeresRidley_Func_24);
WriteColorsToPalette(0xA2, 0xa6, addr_word_A6A9E3, 0xF);
WriteColorsToPalette(0x42, 0xa6, addr_word_A6AA01, 8);
WriteColorsToPalette(0x1E2, 0xa6, addr_word_A6AA01, 8);
}
}
void CeresRidley_Func_24(void) { // 0xA6AA11
Get_CeresRidley(0)->cry_var_A = FUNC16(nullsub_233);
ceres_status = 1;
CeresRidley_Func_27();
}
void CeresRidley_Func_25(void) { // 0xA6AA20
SpawnEnemy(0xA6, addr_stru_A6AA2F);
SpawnEnemy(0xA6, addr_stru_A6AA3F);
}
void CeresRidley_Func_26(void) { // 0xA6AA50
Ridley_Func_61();
}
void CeresRidley_Func_27(void) { // 0xA6AA54
reg_BGMODE_fake = 7;
irq_enable_mode7 = 1;
reg_M7SEL = 0x80;
reg_M7A = 256;
reg_M7B = 256;
reg_M7C = 256;
reg_M7D = 256;
reg_M7X = 64;
reg_M7Y = 64;
Enemy_CeresRidley *E = Get_CeresRidley(0);
E->cry_var_32 = 0;
E->cry_var_33 = 0;
E->cry_var_0A = 1;
E->cry_var_34 = -128;
reg_BG1HOFS = -128;
E->cry_var_35 = 32;
reg_BG1VOFS = 32;
E->cry_var_30 = 2048;
E->cry_var_31 = 1024;
}
void HandleCeresRidleyGetawayCutscene(void) { // 0xA6AAAF
if (!Get_CeresRidley(0)->cry_var_32)
CeresRidley_Func_28();
}
void CeresRidley_Func_28(void) { // 0xA6AABD
Enemy_CeresRidley *E = Get_CeresRidley(0);
uint16 cry_var_33 = E->cry_var_33;
E->cry_var_33 = cry_var_33 + 2;
if (!cry_var_33)
QueueSfx2_Max6(0x4E);
if (cry_var_33 == 208) {
Samus_SetPushedOutOfCeresRidley();
earthquake_type = 35;
earthquake_timer = 64;
}
int v2 = cry_var_33 >> 1;
if (g_word_A6AE4D[v2] == 0xFFFF) {
++E->cry_var_32;
reg_BGMODE_fake = 9;
reg_M7SEL = 0;
reg_M7A = 0;
reg_M7B = 0;
reg_M7C = 0;
reg_M7D = 0;
reg_M7X = 0;
reg_M7Y = 0;
reg_BG1HOFS = 0;
reg_BG1VOFS = 0;
E->cry_var_A = FUNC16(Ridley_Func_54);
E->cry_var_F = 0;
} else {
E->cry_var_30 = g_word_A6AE4D[v2];
uint16 v3 = g_word_A6AF2F[v2] + E->cry_var_35;
E->cry_var_35 = v3;
reg_BG1VOFS = v3;
uint16 v4 = E->cry_var_34 - g_word_A6B00F[v2];
E->cry_var_34 = v4;
reg_BG1HOFS = v4;
CeresRidley_Func_35(E->cry_var_30);
E->cry_var_0A += 48;
CeresRidley_Func_29();
CeresRidley_Func_33();
CeresRidley_Func_34();
}
}
static uint16 CeresMult(uint16 a, uint16 b) {
uint16 r = abs16(a) * b >> 8;
return sign16(a) ? -r : r;
}
void CeresRidley_Func_29(void) { // 0xA6AB5F
Enemy_CeresRidley *E = Get_CeresRidley(0);
uint16 r18 = HIBYTE(E->cry_var_0A);
reg_M7A = CeresMult(CeresRidley_AC30(r18 + 64, 0x100), E->cry_var_30);
reg_M7B = CeresMult(CeresRidley_AC30(r18, 0x100), E->cry_var_30);
reg_M7C = CeresMult(-CeresRidley_AC30(r18, 0x100), E->cry_var_30);
reg_M7D = CeresMult(CeresRidley_AC30(r18 + 64, 0x100), E->cry_var_30);
}
int16 CeresRidley_AC30(uint16 a, int16 r20) { // 0xA6AC30
return (int16)kSinCosTable8bit_Sext[(a & 0xff) + 64] * r20 >> 8;
}
void CeresRidley_Func_33(void) { // 0xA6ACBC
if ((nmi_frame_counter_word & 3) == 0) {
Enemy_CeresRidley *E = Get_CeresRidley(0);
uint16 v1 = (E->cry_var_36 + 1) & 3;
E->cry_var_36 = v1;
QueueMode7Transfers(0xA6, g_off_A6ACDA[v1]);
}
}
void CeresRidley_Func_34(void) { // 0xA6AD27
if ((nmi_frame_counter_word & 7) == 0) {
Enemy_CeresRidley *E = Get_CeresRidley(0);
uint16 v1 = (E->cry_var_37 + 1) & 1;
E->cry_var_37 = v1;
QueueMode7Transfers(0xA6, g_off_A6AD45[v1]);
}
}
void CeresRidley_Func_35(uint16 a) { // 0xA6B0EF
WriteColorsToPalette(0xA2, 0xa6, 32 * HIBYTE(a) - 0x4EF9, 0xF);
}
void Ridley_Main(void) { // 0xA6B227
int16 v1;
Enemy_Ridley *E = Get_Ridley(0);
v1 = E->ridley_var_24 - 4;
if (v1 < 0)
v1 = 0;
E->ridley_var_24 = v1;
Ridley_Func_39();
Ridley_Func_42();
CallRidleyFunc(E->ridley_var_A | 0xA60000);
if (E->ridley_var_02) {
Ridley_Func_102();
Ridley_Func_112();
Ridley_Func_115();
Ridley_Func_70();
Ridley_Func_129();
sub_A6DB2A();
Ridley_Func_120();
Ridley_Func_118();
if (E->ridley_var_1B)
Ridley_Func_30();
}
Ridley_Func_100();
}
void Ridley_Func_1(void) { // 0xA6B26F
Enemy_Ridley *E = Get_Ridley(0);
if (!(E->ridley_var_1B | E->ridley_var_1E)) {
if (Ridley_Func_26(4, 4) & 1)
Ridley_Func_37();
}
}
void Ridley_Func_2(void) { // 0xA6B28A
Enemy_Ridley *E = Get_Ridley(0);
E->ridley_var_24 = 0;
E->base.frame_counter = 1;
Ridley_Hurt();
}
void Ridley_Hurt(void) { // 0xA6B297
Enemy_Ridley *E = Get_Ridley(0);
if ((E->base.frame_counter & 1) == 0) {
Ridley_Func_39();
Ridley_Func_42();
CallRidleyFunc(E->ridley_var_A | 0xA60000);
if (!Get_Ridley(0)->ridley_var_02) {
LABEL_7:
if (Get_Ridley(0)->ridley_var_1B)
Ridley_Func_30();
return;
}
Ridley_Func_112();
Ridley_Func_115();
Ridley_Func_70();
}
Ridley_Func_129();
Ridley_Func_102();
sub_A6DB2A();
Ridley_Func_120();
Ridley_Func_100();
Ridley_Func_118();
uint16 v2 = E->ridley_var_24 + 1;
if ((int16)(v2 - g_word_A6B288) >= 0)
v2 = g_word_A6B288;
E->ridley_var_24 = v2;
if ((int16)(E->ridley_var_24 - g_word_A6B288) >= 0)
goto LABEL_7;
}
void Ridley_Func_3(void) { // 0xA6B2F3
Rect16U rect = { 64, 256, 8, 8 };
Ridley_Func_104_0(0, 14, rect.x, rect.y);
if (!Shitroid_Func_2(0, rect)) {
Enemy_Ridley *E = Get_Ridley(0);
E->ridley_var_01 = 1;
E->ridley_var_A = FUNC16(Ridley_Func_3b);
Ridley_Func_3b();
}
}
void Ridley_Func_3b(void) { // 0xA6B321
uint16 r18 = Ridley_Func_4();
int v0 = 2 * (NextRandom() & 7);
uint16 v1 = *(uint16 *)&RomPtr_A6(r18)[v0];
Enemy_Ridley *E = Get_Ridley(0);
E->ridley_var_A = v1;
CallRidleyFunc(E->ridley_var_A | 0xA60000);
}
uint16 Ridley_Func_4(void) { // 0xA6B335
uint16 r18;
if (samus_movement_type == 3) {
r18 = addr_off_A6B3CC;
} else {
Enemy_Ridley *E = Get_Ridley(0);
uint16 health = E->base.health;
if (health) {
if (sign16(health - 14400)) {
r18 = addr_off_A6B38C;
} else if (Ridley_Func_41() & 1) {
r18 = addr_off_A6B3BC;
} else if ((Ridley_Func_40_Carry() & 1) != 0) {
r18 = addr_off_A6B3AC;
} else {
r18 = sign16(E->base.health - 9000) ? addr_off_A6B39C : addr_off_A6B38C;
}
} else {
r18 = addr_off_A6B3DC;
++E->ridley_var_25;
}
}
return r18;
}
void Ridley_Func_5(void) { // 0xA6B3EC
Enemy_Ridley *E = Get_Ridley(0);
E->ridley_var_A = FUNC16(Ridley_Func_6);
E->ridley_var_F = 128;
Ridley_Func_6();
}
void Ridley_Func_6(void) { // 0xA6B3F8
Enemy_Ridley *E = Get_Ridley(0);
if ((--E->ridley_var_F & 0x8000) != 0)
goto LABEL_5;
uint16 v2;
v2 = 192;
if (E->ridley_var_10)
v2 = 96;
Rect16U rect = { v2, 256, 8, 8 };
Ridley_Func_104_0(0, Ridley_Func_7(), rect.x, rect.y);
if (!Shitroid_Func_2(0, rect)) {
LABEL_5:
E->ridley_var_A = FUNC16(Ridley_Func_3b);
}
}
uint16 Ridley_Func_7(void) { // 0xA6B42E
static const uint16 g_word_A6B439[4] = { 4, 8, 0xa, 0xc };
return g_word_A6B439[Get_Ridley(0)->ridley_var_12];
}
void Ridley_Func_8(void) { // 0xA6B441
Enemy_Ridley *E = Get_Ridley(0);
E->ridley_var_A = addr_loc_A6B455;
E->ridley_var_00 = 10;
E->ridley_var_0A = 0;
Ridley_B455();
}
void Ridley_B455(void) { // 0xA6B455
Enemy_Ridley *E = Get_Ridley(0);
uint16 v1 = 192;
if (E->ridley_var_10)
v1 = 64;
Rect16U rect = { v1, 128, 8, 8 };
Ridley_Func_104_0(0, 1, rect.x, rect.y);
if (!Shitroid_Func_2(0, rect)) {
E->ridley_var_A = FUNC16(Ridley_Func_9);
E->ridley_var_00 = 32;
E->ridley_var_0A = 0;
}
}
void Ridley_Func_9(void) { // 0xA6B493
Enemy_Ridley *E = Get_Ridley(0);
if (E->ridley_var_10) {
Ridley_Func_111(32, 512, 1152);
} else {
Ridley_Func_111(-32, -512, 1152);
}
uint16 ridley_var_00 = E->ridley_var_00;
if (ridley_var_00) {
E->ridley_var_00 = ridley_var_00 - 1;
} else {
E->ridley_var_A = FUNC16(Ridley_Func_10);
E->ridley_var_00 = 20;
}
}
void Ridley_Func_10(void) { // 0xA6B4D1
Enemy_Ridley *E = Get_Ridley(0);
if (E->ridley_var_10)
Ridley_Func_111(320, 0x4000, 1280);
else
Ridley_Func_111(-320, -16384, 1280);
uint16 ridley_var_00 = E->ridley_var_00;
if (ridley_var_00) {
E->ridley_var_00 = ridley_var_00 - 1;
} else {
E->ridley_var_A = FUNC16(Ridley_Func_11);
E->ridley_var_00 = 16;
tilemap_stuff[2] = 1;
}
}
void Ridley_Func_11(void) { // 0xA6B516
Enemy_Ridley *E = Get_Ridley(0);
if (E->ridley_var_10)
Ridley_Func_111(512, 30720, 768);
else
Ridley_Func_111(-512, -30720, 768);
uint16 ridley_var_00 = E->ridley_var_00;
if (ridley_var_00) {
E->ridley_var_00 = ridley_var_00 - 1;
} else {
E->ridley_var_A = FUNC16(Ridley_Func_12);
E->ridley_var_00 = 32;
}
}
void Ridley_Func_12(void) { // 0xA6B554
Enemy_Ridley *E = Get_Ridley(0);
if (E->ridley_var_10) {
Ridley_Func_111(1024, 30720, 768);
} else {
Ridley_Func_111(-1024, -30720, 768);
}
uint16 ridley_var_00 = E->ridley_var_00;
if (ridley_var_00) {
E->ridley_var_00 = ridley_var_00 - 1;
} else {
E->ridley_var_A = FUNC16(Ridley_Func_13);
E->ridley_var_00 = 32;
Ridley_Func_114();
}
}
void Ridley_Func_13(void) { // 0xA6B594
Ridley_Func_111(0, 0x8000, 448);
Enemy_Ridley *E = Get_Ridley(0);
uint16 ridley_var_00 = E->ridley_var_00;
if (ridley_var_00) {
E->ridley_var_00 = ridley_var_00 - 1;
} else {
E->ridley_var_A = Ridley_Func_40_Carry() ? FUNC16(Ridley_Func_33) : FUNC16(Ridley_Func_3b);
}
}
void Ridley_Func_14(void) { // 0xA6B5C4
tilemap_stuff[15] = 11;
tilemap_stuff[9] = 384;
Enemy_Ridley *E = Get_Ridley(0);
E->ridley_var_A = FUNC16(Ridley_Func_15);
E->ridley_var_F = (random_number & 0x1F) + 32;
Ridley_Func_15();
}
void Ridley_Func_15(void) { // 0xA6B5E5
Enemy_Ridley *E = Get_Ridley(0);
if (Ridley_Func_17(g_word_A6B60D[E->ridley_var_10]) & 1) {
Ridley_Func_18();
} else if ((--E->ridley_var_F & 0x8000) != 0) {
E->ridley_var_A = FUNC16(Ridley_Func_16);
E->ridley_var_F = 128;
Ridley_Func_114();
}
}
void Ridley_Func_16(void) { // 0xA6B613
Enemy_Ridley *E = Get_Ridley(0);
if (Ridley_Func_17(g_word_A6B63B[E->ridley_var_10]) & 1) {
Ridley_Func_18();
} else if ((--E->ridley_var_F & 0x8000) != 0) {
E->ridley_var_A = FUNC16(Ridley_Func_15);
E->ridley_var_F = 128;
Ridley_Func_114();
}
}
uint8 Ridley_Func_17(uint16 r18) { // 0xA6B641
uint16 v0 = samus_y_pos;
if (!sign16(samus_y_pos - 352))
v0 = 352;
Ridley_Func_104_0(0, Ridley_Func_7(), r18, v0);
tilemap_stuff[2] = 1;
if (samus_movement_type != 3)
return 1;
if ((uint8)random_number >= 0x80) {
Enemy_Ridley *E = Get_Ridley(0);
if (!E->ridley_var_0F && E->ridley_var_10 != 1)
Ridley_Func_99(addr_kRidley_Ilist_E73A);
}
return 0;
}
void Ridley_Func_18(void) { // 0xA6B68B
tilemap_stuff[9] = 240;
tilemap_stuff[15] = 16;
tilemap_stuff[0] = 1;
Get_Ridley(0)->ridley_var_A = FUNC16(Ridley_Func_19);
}
void Ridley_Func_19(void) { // 0xA6B6A7
Enemy_Ridley *E = Get_Ridley(0);
if (sign16(E->base.y_pos - 288)) {
Ridley_Func_114();
E->ridley_var_A = FUNC16(Ridley_Func_20);
E->ridley_var_F = 32;
Ridley_Func_20();
} else {
Ridley_Func_104_0(0, 0, g_word_A6B6C8[E->ridley_var_10], 288);
}
}
void Ridley_Func_20(void) { // 0xA6B6DD
Enemy_Ridley *E = Get_Ridley(0);
Ridley_Func_104_0(0, 0, E->base.x_pos, 288);
if ((--E->ridley_var_F & 0x8000) != 0) {
Ridley_Func_71();
Ridley_Func_29();
E->ridley_var_A = FUNC16(Ridley_Func_21);
E->ridley_var_F = (random_number & 0x3F) + 128;
}
}
void Ridley_Func_21(void) { // 0xA6B70E
int16 v1;
if (Ridley_Func_25() & 1) {
Ridley_Func_24();
Ridley_Func_27();
} else {
Enemy_Ridley *E = Get_Ridley(0);
v1 = tilemap_stuff[6] + E->ridley_var_C;
if (!sign16(v1 - 1536))
v1 = 1536;
E->ridley_var_C = v1;
if (Ridley_Func_23() & 1) {
eproj_spawn_pt = (Point16U) { tilemap_stuff[82], tilemap_stuff[83] + 12 };
SpawnEprojWithRoomGfx(addr_kEproj_DustCloudExplosion, 9);
QueueSfx2_Max6(0x76);
earthquake_type = 13;
earthquake_timer = 4;
Ridley_Func_28();
Ridley_Func_29();
Ridley_Func_93(0x2026, addr_word_A6D37C);
tilemap_stuff[20] = 3072;
tilemap_stuff[30] = 3072;
tilemap_stuff[40] = 3072;
tilemap_stuff[50] = 3072;
tilemap_stuff[60] = 3072;
tilemap_stuff[70] = 3072;
tilemap_stuff[80] = 3072;
tilemap_stuff[0] = 4;
uint16 v2 = E->ridley_var_26 + 1;
if (!sign16(E->ridley_var_26 - 1)) {
if (E->ridley_var_10 != 1)
Ridley_Func_99(addr_kRidley_Ilist_E73A);
v2 = 0;
}
E->ridley_var_26 = v2;
E->ridley_var_A = FUNC16(Ridley_Func_22);
}
}
}
void Ridley_Func_22(void) { // 0xA6B7B9
Enemy_Ridley *E = Get_Ridley(0);
bool v1;
if (!(Ridley_Func_41() & 1)
|| (v1 = (int16)(E->ridley_var_F - 1) < 0, --E->ridley_var_F, v1)) {
Ridley_Func_24();
E->ridley_var_A = FUNC16(Ridley_Func_3b);
} else {
uint16 ridley_var_C = E->ridley_var_C;
v1 = (int16)(tilemap_stuff[7] + ridley_var_C) < 0;
E->ridley_var_C = tilemap_stuff[7] + ridley_var_C;
if (!v1) {
E->ridley_var_C = 0;
E->ridley_var_A = FUNC16(Ridley_Func_21);
}
}
}
uint8 Ridley_Func_23(void) { // 0xA6B7E7
uint8 v0 = Ridley_Func_103(tilemap_stuff[82], tilemap_stuff[83] + 16) & 1;
if (!v0) {
v0 = Ridley_Func_103(tilemap_stuff[72], tilemap_stuff[73] + 18) & 1;
if (!v0) {
v0 = Ridley_Func_103(tilemap_stuff[62], tilemap_stuff[63] + 18) & 1;
if (!v0) {
v0 = Ridley_Func_103(tilemap_stuff[52], tilemap_stuff[53] + 18) & 1;
if (!v0)
return Ridley_Func_103(tilemap_stuff[42], tilemap_stuff[43] + 18) & 1;
}
}
}
return v0;
}
void Ridley_Func_24(void) { // 0xA6B84D
tilemap_stuff[0] = 1;
tilemap_stuff[10] = 1;
}
uint8 Ridley_Func_25(void) { // 0xA6B859
if ((Ridley_Func_40_Carry() & 1) != 0)
return Ridley_Func_26(4, 4) & 1;
else
return 0;
}
uint8 Ridley_Func_26(uint16 k, uint16 j) { // 0xA6B865
Enemy_Ridley *E = Get_Ridley(0);
Rect16U rect = {
E->base.x_pos + g_word_A6B9D5[E->ridley_var_10], E->base.y_pos + g_word_A6B9DB[E->ridley_var_1D >> 1],
k, j
};
return Ridley_Func_124(rect);
}
void Ridley_Func_27(void) { // 0xA6B889
int16 ridley_var_C;
Enemy_Ridley *E = Get_Ridley(0);
ridley_var_C = E->ridley_var_C;
if (ridley_var_C >= 0)
ridley_var_C = -ridley_var_C;
if (!sign16(ridley_var_C + 512))
ridley_var_C = -512;
E->ridley_var_C = ridley_var_C;
Ridley_Func_24();
E->ridley_var_A = FUNC16(Ridley_Func_33b);
Ridley_Func_33b();
}
void Ridley_Func_28(void) { // 0xA6B8A9
Enemy_Ridley *E = Get_Ridley(0);
if (!E->ridley_var_B)
E->ridley_var_B = E->base.x_pos & 0x80 ? -0xc0 : 0xc0;
if (((E->ridley_var_B ^ (E->base.x_pos - samus_x_pos)) & 0x8000) == 0) {
uint16 x_pos;
x_pos = E->base.x_pos;
if ((int16)(x_pos - E->ridley_var_22) >= 0) {
if ((int16)(x_pos - E->ridley_var_23) < 0) {
if (random_number < 0x555)
return;
goto LABEL_7;
}
goto LABEL_15;
}
LABEL_13:
if ((E->ridley_var_B & 0x8000) == 0)
return;
LABEL_7:
E->ridley_var_B = -E->ridley_var_B;
return;
}
uint16 v4;
v4 = E->base.x_pos;
if ((int16)(v4 - E->ridley_var_22) < 0)
goto LABEL_13;
if ((int16)(v4 - E->ridley_var_23) >= 0) {
LABEL_15:
if ((E->ridley_var_B & 0x8000) != 0)
return;
goto LABEL_7;
}
if (random_number < 0x555)
goto LABEL_7;
}
void Ridley_Func_29(void) { // 0xA6B90F
int v0 = random_number & 3;
uint16 r18 = g_off_A6B965[v0], r20 = g_off_A6B96D[v0];
Enemy_Ridley *E = Get_Ridley(0);
uint16 v2 = 2 * (E->ridley_var_12 + 2);
int v3 = v2 >> 1;
tilemap_stuff[7] = g_word_A6B94D[v3];
tilemap_stuff[6] = g_word_A6B959[v3];
E->ridley_var_C = *(uint16 *)&RomPtr_A6(r20)[v2];
const uint8 *v4 = RomPtr_A6(r18);
uint16 t = *(uint16 *)&v4[v2];
E->ridley_var_B = sign16(E->ridley_var_B) ? -t : t;
}
void Ridley_Func_30(void) { // 0xA6B9E1
Enemy_Ridley *E = Get_Ridley(0);
uint16 ridley_var_14 = E->ridley_var_14, v3, v6;
if (ridley_var_14) {
int16 v2 = abs16(ridley_var_14) - 4;
if (v2 >= 0)
v3 = sign16(ridley_var_14) ? -v2 : v2;
else
v3 = 0;
E->ridley_var_14 = v3;
}
uint16 ridley_var_15 = E->ridley_var_15;
if (ridley_var_15) {
int16 v5 = abs16(ridley_var_15) - 4;
if (v5 >= 0)
v6 = sign16(ridley_var_15) ? -v5 : v5;
else
v6 = 0;
E->ridley_var_15 = v6;
}
samus_x_pos = E->ridley_var_14 + E->base.x_pos + g_word_A6B9D5[E->ridley_var_10];
samus_y_pos = E->ridley_var_15 + E->base.y_pos + g_word_A6B9DB[E->ridley_var_1D >> 1];
}
void Ridley_Func_31(void) { // 0xA6BA54
Enemy_Ridley *E = Get_Ridley(0);
E->ridley_var_14 = samus_x_pos - (E->base.x_pos + g_word_A6B9D5[E->ridley_var_10]);
E->ridley_var_15 = samus_y_pos - (E->base.y_pos + g_word_A6B9DB[E->ridley_var_1D >> 1]);
}
void Ridley_Func_32(void) { // 0xA6BA85
Enemy_Ridley *E = Get_Ridley(0);
if (sign16(E->ridley_var_25 - 10)) {
if (power_bomb_flag) {
E->ridley_var_A = FUNC16(Ridley_Func_43);
Ridley_Func_43();
} else {
E->ridley_var_A = FUNC16(Ridley_Func_5);
tilemap_stuff[2] = 1;
}
} else {
Ridley_Func_126();
E->ridley_var_A = FUNC16(Ridley_C53E);
Ridley_C53E();
}
}
void Ridley_Func_33(void) { // 0xA6BAB7
Enemy_Ridley *E = Get_Ridley(0);
uint16 v1;
int16 v2;
uint16 r18, r20;
if ((Ridley_Func_40_Carry() & 1) != 0
&& (!E->ridley_var_1F)
&& ((r18 = g_word_A6BB48[E->ridley_var_10], r20 = E->base.x_pos - samus_x_pos,
((r18 ^ r20) & 0x8000) == 0)
|| (v1 = abs16(r20), sign16(v1 - 32)))
&& (int16)(E->base.y_pos + 35 - samus_y_pos) < 0) {
v2 = -16;
if (E->ridley_var_10)
v2 = 16;
Ridley_Func_104_0(0, g_word_A6BB4E[E->ridley_var_12], samus_x_pos + v2, samus_y_pos - 4);
Rect16U rect = { E->base.x_pos + g_word_A6B9D5[E->ridley_var_10], E->base.y_pos + 35, 8, 12 };
if (Ridley_Func_124(rect)) {
E->ridley_var_C = -E->ridley_var_C;
if (E->base.health) {
if (power_bomb_flag) {
Ridley_Func_37();
E->ridley_var_A = FUNC16(Ridley_Func_43);
Ridley_Func_43();
} else {
Ridley_Func_33b();
}
} else {
if (!E->ridley_var_1B)
Ridley_Func_37();
Ridley_Func_126();
E->ridley_var_A = FUNC16(Ridley_Func_63);
Ridley_Func_63();
}
}
} else {
Ridley_Func_32();
}
}
void Ridley_Func_33b(void) { // 0xA6BB8F
int16 v1;
Enemy_Ridley *E = Get_Ridley(0);
E->ridley_var_17 = g_word_A6BBEB[E->ridley_var_10];
v1 = E->base.y_pos - 64;
if (sign16(E->base.y_pos - 320))
v1 = 256;
E->ridley_var_18 = v1;
if (!E->ridley_var_1B)
Ridley_Func_37();
E->ridley_var_A = FUNC16(Ridley_Func_34);
E->ridley_var_F = 32;
Ridley_Func_34();
}
void Ridley_Func_34(void) { // 0xA6BBC4
Enemy_Ridley *E = Get_Ridley(0);
Ridley_Func_104_0(0, 0, E->ridley_var_17, E->ridley_var_18);
if ((--E->ridley_var_F & 0x8000) != 0) {
E->ridley_var_A = FUNC16(Ridley_Func_35);
E->ridley_var_F = 32;
}
}
void Ridley_Func_35(void) { // 0xA6BBF1
Enemy_Ridley *E = Get_Ridley(0);
if ((--E->ridley_var_F & 0x8000) != 0) {
tilemap_stuff[15] = 8;
tilemap_stuff[9] = 240;
Ridley_Func_38();
E->ridley_var_A = FUNC16(Ridley_Func_36);
E->ridley_var_F = 64;
} else {
Ridley_Func_104_0(0, 0, E->ridley_var_17, 256);
}
}
void Ridley_Func_36(void) { // 0xA6BC2E
Enemy_Ridley *E = Get_Ridley(0);
if ((--E->ridley_var_F & 0x8000) != 0) {
tilemap_stuff[15] = 16;
tilemap_stuff[9] = 240;
E->ridley_var_A = FUNC16(Ridley_Func_3b);
} else {
Ridley_Func_104_0(0, 0, g_word_A6BC62[E->ridley_var_10], 224);
}
}
void Ridley_Func_37(void) { // 0xA6BC68
Ridley_Func_31();
Enemy_Ridley *E = Get_Ridley(0);
E->base.properties |= kEnemyProps_Tangible;
E->ridley_var_1B = 1;
CallSomeSamusCode(0);
Ridley_Func_119(1);
}
void Ridley_Func_38(void) { // 0xA6BC84
tilemap_stuff[2] = 1;
tilemap_stuff[0] = 1;
Enemy_Ridley *E = Get_Ridley(0);
if ((E->ridley_var_01 & 0x8000) == 0) {
E->ridley_var_1E = Ridley_Func_40_Sign() ? 6 : 10;
}
E->ridley_var_1B = 0;
CallSomeSamusCode(1);
Ridley_Func_119(0);
}
void Ridley_Func_39(void) { // 0xA6BCB4
int16 ridley_var_01;
Enemy_Ridley *E = Get_Ridley(0);
ridley_var_01 = E->ridley_var_01;
if (ridley_var_01 >= 0) {
if (ridley_var_01) {
if (Ridley_Func_121() & 1) {
E->base.properties |= kEnemyProps_Tangible;
return;
}
E->base.properties &= ~kEnemyProps_Tangible;
}
uint16 ridley_var_1E = E->ridley_var_1E;
if (ridley_var_1E) {
uint16 v3 = ridley_var_1E - 1;
E->ridley_var_1E = v3;
if (!v3 && (E->ridley_var_01 & 0x8000) == 0)
E->base.properties &= ~kEnemyProps_Tangible;
}
}
}
static const uint8 byte_A6BD04[28] = {
0x80, 0x80, 0x80, 0, 0xff, 0x80, 0x80, 0xff, 0xff, 0xff, 0x80, 0, 0, 0x80, 0x80, 0x80,
0x80, 0xff, 0xff, 0xff, 0x80, 0x80, 0, 0x80, 0x80, 0, 0, 0x80,
};
static uint8 Ridley_Func_40_Carry(void) {
return (byte_A6BD04[samus_movement_type] & 0x80) != 0;
}
static uint8 Ridley_Func_40_Sign(void) {
return (byte_A6BD04[samus_movement_type] & 0x40) != 0;
}
uint8 Ridley_Func_41(void) { // 0xA6BD20
return sign16(samus_y_pos - 352) == 0;
}
void Ridley_Func_42(void) { // 0xA6BD2C
int16 ridley_var_01;
Enemy_Ridley *E = Get_Ridley(0);
ridley_var_01 = E->ridley_var_01;
if (ridley_var_01 > 0 && ridley_var_01 != 2 && power_bomb_flag && !E->ridley_var_1B) {
Ridley_Func_24();
E->ridley_var_A = FUNC16(Ridley_Func_33);
}
}
void Ridley_Func_43(void) { // 0xA6BD4E
if (power_bomb_flag) {
Get_Ridley(0)->ridley_var_01 = 2;
uint16 r18 = sign16(power_bomb_explosion_x_pos - 128) ? 192 : 80;
uint16 r20 = sign16(power_bomb_explosion_y_pos - 256) ? 384 : 192;
Ridley_Func_104_0(0, Ridley_Func_7(), r18, r20);
} else {
Enemy_Ridley *E = Get_Ridley(0);
E->ridley_var_01 = 1;
E->ridley_var_A = E->ridley_var_1B ? FUNC16(Ridley_Func_33b) : FUNC16(Ridley_Func_3b);
}
}
void Ridley_Func_44(void) { // 0xA6BD9A
Ridley_Func_106(0, 1, 192, 128);
Enemy_Ridley *E = Get_Ridley(0);
if (!sign16(E->base.x_pos - 192))
E->ridley_var_A = FUNC16(Ridley_Func_45);
}
void Ridley_Func_45(void) { // 0xA6BDBC
Enemy_Ridley *E = Get_Ridley(0);
E->ridley_var_20 = -192;
Ridley_Func_106(0, 1, 192, -128);
if (sign16(E->base.y_pos - 32)) {
E->ridley_var_40 = FUNC16(Ridley_Func_52);
E->ridley_var_A = FUNC16(Ridley_Func_46);
E->ridley_var_F = 21;
}
}
void Ridley_Func_46(void) { // 0xA6BDF2
Enemy_Ridley *E = Get_Ridley(0);
if ((--E->ridley_var_F & 0x8000) != 0) {
Ridley_Func_99(addr_kRidley_Ilist_E658);
E->ridley_var_A = FUNC16(Ridley_Func_47);
Ridley_Func_47();
}
}
void Ridley_Func_47(void) { // 0xA6BE03
Enemy_Ridley *E = Get_Ridley(0);
Ridley_Func_104_0(0, 12, E->ridley_var_42 - 10, E->ridley_var_44 - 56);
Rect16U rect = { E->base.x_pos + 14, E->base.y_pos + 66, 4, 4 };
if (Ridley_Func_48(rect) & 1) {
E->ridley_var_1B = 1;
Ridley_Func_119(1);
E->ridley_var_C = -512;
E->ridley_var_40 = FUNC16(Ridley_Func_51);
E->ridley_var_A = FUNC16(CeresRidley_Func_22);
}
}
uint8 Ridley_Func_48(Rect16U rect) { // 0xA6BE61
Enemy_Ridley *E = Get_Ridley(0);
uint16 v1 = abs16(E->ridley_var_42 - rect.x);
bool v2 = v1 < 4;
uint16 v3 = v1 - 4;
uint8 result = 0;
if (v2 || v3 < rect.w) {
uint16 v4 = abs16(E->ridley_var_44 - rect.y);
v2 = v4 < 4;
uint16 v5 = v4 - 4;
if (v2 || v5 < rect.h)
return 1;
}
return result;
}
void CallRidleyFunc_var40(uint32 ea) {
switch (ea) {
case fnRidley_Func_50: Ridley_Func_50(); return;
case fnRidley_Func_51: Ridley_Func_51(); return; // 0xa6beb3
case fnRidley_Func_52: Ridley_Func_52(); return; // 0xa6beca
case fnRidley_Func_53: Ridley_Func_53(); return; // 0xa6bedc
case fnnullsub_348: return; // 0xa6bf19
default: Unreachable();
}
}
void Ridley_Func_49(void) { // 0xA6BE93
CallRidleyFunc_var40(Get_Ridley(0)->ridley_var_40 | 0xA60000);
}
void Ridley_Func_50(void) { // 0xA6BE9C
Enemy_Ridley *E = Get_Ridley(0);
E->ridley_var_42 = E->base.x_pos - 16;
E->ridley_var_44 = E->base.y_pos + 22;
}
void Ridley_Func_51(void) { // 0xA6BEB3
Enemy_Ridley *E = Get_Ridley(0);
E->ridley_var_42 = E->base.x_pos + 14;
E->ridley_var_44 = E->base.y_pos + 66;
}
void Ridley_Func_52(void) { // 0xA6BECA
Enemy_Ridley *E = Get_Ridley(0);
E->ridley_var_45 = 0;
E->ridley_var_46 = 0;
E->ridley_var_40 = FUNC16(Ridley_Func_53);
Ridley_Func_53();
}
void Ridley_Func_53(void) { // 0xA6BEDC
Enemy_Ridley *E = Get_Ridley(0);
uint16 v1 = E->ridley_var_46 + 8;
E->ridley_var_46 = v1;
int t = HIBYTE(E->ridley_var_43) + (v1&0xff);
HIBYTE(E->ridley_var_43) = t;
E->ridley_var_44 += (int8)(v1 >> 8) + (t >> 8);
if (!sign16(E->ridley_var_44 - 192)) {
E->ridley_var_44 = 192;
E->ridley_var_40 = addr_locret_A6BF19;
}
}
void DrawBabyMetroid_0(void) { // 0xA6BF1A
int v0 = BabyMetroid_DBCB_DoubleRetEx(ADDR16_OF_RAM(*enemy_ram7800) + 6);
if (v0 < 0)
return;
Enemy_Ridley *E = Get_Ridley(0);
sub_A6DC13(v0, E->ridley_var_42, E->ridley_var_44, 0);
}
uint16 BabyMetroid_Instr_2(uint16 k) { // 0xA6BFC9
if (!Get_Ridley(0)->ridley_var_46 && (random_number & 1) != 0)
return BabyMetroid_Goto(k);
QueueSfx3_Max6(0x24);
return k + 2;
}
uint16 BabyMetroid_Instr_3(uint16 k) { // 0xA6BFE1
uint16 v1 = *(uint16 *)RomPtr_A6(k);
WriteColorsToPalette(0x162, 0xa6, v1, 0xF);
return k + 2;
}
uint16 BabyMetroid_Instr_1(uint16 k) { // 0xA6BFF2
if (Get_Ridley(0)->ridley_var_46)
return BabyMetroid_Goto(k);
else
return k + 2;
}
uint16 BabyMetroid_Goto(uint16 k) { // 0xA6BFF8
return *(uint16 *)RomPtr_A6(k);
}
void Ridley_Func_54(void) { // 0xA6C04E
uint16 ridley_var_F = Get_Ridley(0)->ridley_var_F;
if (ridley_var_F) {
switch (ridley_var_F) {
case 2:
Ridley_C08E();
break;
case 4:
Ridley_C09F();
break;
case 6:
Ridley_Func_56();
break;
case 8:
Ridley_Func_57();
break;
case 0xA:
Ridley_C104();
break;
case 0xC:
Ridley_Func_58();
break;
default:
Unreachable();
while (1)
;
}
} else {
Ridley_Func_55();
}
}
void Ridley_Func_55(void) { // 0xA6C062
palette_buffer[97] = palette_buffer[1];
palette_buffer[99] = palette_buffer[3];
palette_buffer[81] = palette_buffer[17];
palette_buffer[83] = palette_buffer[19];
Enemy_Ridley *E = Get_Ridley(0);
E->ridley_var_E = -15157;
++E->ridley_var_F;
++E->ridley_var_F;
Ridley_C08E();
}
void Ridley_C08E(void) { // 0xA6C08E
if (ProcessEscapeTimerTileTransfers() & 1) {
Enemy_Ridley *E = Get_Ridley(0);
E->ridley_var_E = -15106;
++E->ridley_var_F;
++E->ridley_var_F;
Ridley_C09F();
}
}
void Ridley_C09F(void) { // 0xA6C09F
if (ProcessEscapeTimerTileTransfers() & 1) {
Enemy_Ridley *E = Get_Ridley(0);
++E->ridley_var_F;
++E->ridley_var_F;
Ridley_Func_59();
E->ridley_var_E = 128;
QueueMusic_Delayed8(7);
}
}
void Ridley_Func_56(void) { // 0xA6C0BB
Ridley_Func_61();
Enemy_Ridley *E = Get_Ridley(0);
if (E->ridley_var_E-- == 1) {
E->ridley_var_3B = -15280;
E->ridley_var_3C = 0;
E->ridley_var_3D = 0;
E->ridley_var_3E = 0;
E->ridley_var_3F = 0;
E->ridley_var_E = 32;
if (!japanese_text_flag) {
++E->ridley_var_F;
++E->ridley_var_F;
}
++E->ridley_var_F;
++E->ridley_var_F;
}
}
void Ridley_Func_57(void) { // 0xA6C0F5
Enemy_Ridley *E = Get_Ridley(0);
if (E->ridley_var_E-- == 1) {
++E->ridley_var_F;
++E->ridley_var_F;
Ridley_Func_62();
}
Ridley_C104();
}
void Ridley_C104(void) { // 0xA6C104
Ridley_Func_61();
if (HandleTypewriterText_Ext(0x3582) & 1) {
Enemy_Ridley *E = Get_Ridley(0);
++E->ridley_var_F;
++E->ridley_var_F;
}
}
void Ridley_Func_58(void) { // 0xA6C117
Ridley_Func_61();
CeresRidley_Func_2();
Enemy_Ridley *E = Get_Ridley(0);
E->ridley_var_F = 0;
E->ridley_var_A = FUNC16(CeresRidley_Func_26);
timer_status = 1;
ceres_status = 2;
SetBossBitForCurArea(1);
}
void Ridley_Func_59(void) { // 0xA6C136
VramWriteEntry *v2;
uint16 v0 = vram_write_queue_tail;
const uint8 *v1 = RomPtr_A6(addr_byte_A6C15D);
v2 = gVramWriteEntry(vram_write_queue_tail);
v2->size = GET_WORD(v1);
*(VoidP *)((uint8 *)&v2->src.addr + 1) = GET_WORD(v1 + 3);
v2->src.addr = GET_WORD(v1 + 2);
v2->vram_dst = GET_WORD(v1 + 5);
vram_write_queue_tail = v0 + 7;
}
void Ridley_Func_60(void) { // 0xA6C176
int16 v1;
Enemy_Ridley *E = Get_Ridley(0);
v1 = E->ridley_var_39 + 1;
if (!sign16(E->ridley_var_39 - 31))
v1 = -31;
E->ridley_var_39 = v1;
palette_buffer[11] = abs16(E->ridley_var_39) & 0x1F;
}
void Ridley_Func_61(void) { // 0xA6C19C
if (!(door_transition_flag_enemies | palette_change_num) && (nmi_frame_counter_word & 3) == 0) {
Enemy_Ridley *E = Get_Ridley(0);
uint16 v1 = E->ridley_var_38 + 1;
if (v1 >= 0x10)
v1 = 0;
E->ridley_var_38 = v1;
int v2 = E->ridley_var_38 + 2 * v1;
palette_buffer[97] = g_word_A6C1DF[v2];
palette_buffer[98] = g_word_A6C1DF[v2 + 1];
palette_buffer[99] = g_word_A6C1DF[v2 + 2];
}
}
void SetupZebesEscapeTypewriter(void) { // 0xA6C23F
palette_buffer[157] = palette_buffer[125];
palette_buffer[158] = palette_buffer[126];
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_3B = addr_loc_A9C49C;
E->mbn_var_3C = 0;
E->mbn_var_3D = 0;
E->mbn_var_3E = 0;
E->mbn_var_3F = 0;
reg_BG2HOFS = 0;
reg_BG2VOFS = 0;
}
uint8 ProcessEscapeTimerTileTransfers(void) { // 0xA6C26E
VramWriteEntry *v4;
EnemyData *v0 = gEnemyData(0);
uint16 ai_var_E = v0->ai_var_E;
uint16 v2 = vram_write_queue_tail;
const uint8 *v3 = RomPtr_A6(ai_var_E);
uint8 result = 1;
if (GET_WORD(v3)) {
v4 = gVramWriteEntry(vram_write_queue_tail);
v4->size = GET_WORD(v3);
*(VoidP *)((uint8 *)&v4->src.addr + 1) = GET_WORD(v3 + 3);
v4->src.addr = GET_WORD(v3 + 2);
v4->vram_dst = GET_WORD(v3 + 5);
vram_write_queue_tail = v2 + 7;
v0->ai_var_E = ai_var_E + 7;
if (*(uint16 *)RomPtr_A6(v0->ai_var_E))
return 0;
}
return result;
}
uint8 HandleTypewriterText_Ext(uint16 a) { // 0xA6C2A7
uint16 r18 = a;
int16 v4;
VramWriteEntry *v12;
Enemy_MotherBrain *E = Get_MotherBrain(0);
uint16 mbn_var_3D = E->mbn_var_3D;
if (mbn_var_3D) {
E->mbn_var_3D = mbn_var_3D - 1;
return 0;
} else {
E->mbn_var_3D = E->mbn_var_3E;
int i, v7;
for (i = E->mbn_var_3B; ; i = v7 + 2) {
while (1) {
v4 = *(uint16 *)RomPtr_A6(i);
if (!v4)
return 1;
if (v4 != 1)
break;
uint16 v5 = i + 2;
uint16 v6 = *(uint16 *)RomPtr_A6(v5);
E->mbn_var_3E = v6;
i = v5 + 2;
}
if (v4 != 13)
break;
v7 = i + 2;
uint16 v8 = *(uint16 *)RomPtr_A6(v7);
E->mbn_var_3C = v8;
}
v4 = (uint8)v4;
if ((uint8)v4 == 32) {
++E->mbn_var_3C;
E->mbn_var_3B = i + 1;
return 0;
} else {
if ((uint8)v4 == 33)
v4 = 91;
E->mbn_var_3B = i + 1;
uint16 v11 = vram_write_queue_tail;
v12 = gVramWriteEntry(vram_write_queue_tail);
v12->size = 2;
*(VoidP *)((uint8 *)&v12->src.addr + 1) = 32256;
E->mbn_var_3A = r18 + v4 - 65;
v12->src.addr = ADDR16_OF_RAM(*extra_enemy_ram8000) + 52;
uint16 mbn_var_3C = E->mbn_var_3C;
v12->vram_dst = mbn_var_3C;
E->mbn_var_3C = mbn_var_3C + 1;
vram_write_queue_tail = v11 + 7;
uint16 v14 = E->mbn_var_3F + 1;
E->mbn_var_3F = v14;
if (!sign16(v14 - 2)) {
E->mbn_var_3F = 0;
if (area_index == 6)
QueueSfx2_Max3(0x45);
else
QueueSfx3_Max3(0xD);
}
return 0;
}
}
}
void Ridley_Func_62(void) { // 0xA6C383
int i;
VramWriteEntry *v3;
uint16 v0 = addr_stru_A6C3B8;
for (i = vram_write_queue_tail; ; i += 7) {
const uint8 *v2 = RomPtr_A6(v0);
if (!GET_WORD(v2))
break;
v3 = gVramWriteEntry(i);
v3->size = GET_WORD(v2);
*(VoidP *)((uint8 *)&v3->src.addr + 1) = GET_WORD(v2 + 3);
v3->src.addr = GET_WORD(v2 + 2);
v3->vram_dst = GET_WORD(v2 + 5);
v0 += 7;
}
vram_write_queue_tail = i;
}
void Ridley_Func_63(void) { // 0xA6C538
if (!(Ridley_Func_68() & 1))
Ridley_C53E();
}
void Ridley_C53E(void) { // 0xA6C53E
Ridley_Func_99(addr_kRidley_Ilist_E6C8);
Enemy_Ridley *E = Get_Ridley(0);
E->ridley_var_A = FUNC16(Ridley_C551);
E->ridley_var_F = 32;
}
void Ridley_C551(void) { // 0xA6C551
Ridley_Func_68();
Enemy_Ridley *E = Get_Ridley(0);
if ((--E->ridley_var_F & 0x8000) != 0) {
E->ridley_var_B = 0;
E->ridley_var_C = 0;
fx_target_y_pos = 528;
fx_y_vel = 64;
fx_timer = 1;
E->ridley_var_27 = 0;
E->ridley_var_28 = 0;
E->ridley_var_A = FUNC16(Ridley_Func_64);
E->ridley_var_F = 160;
Ridley_Func_64();
}
}
void Ridley_Func_64(void) { // 0xA6C588
Ridley_Func_69();
Enemy_Ridley *E = Get_Ridley(0);
if ((--E->ridley_var_F & 0x8000) != 0) {
if (E->ridley_var_1B)
Ridley_Func_38();
E->ridley_var_A = FUNC16(Ridley_Func_65);
E->ridley_var_B = 0;
E->ridley_var_C = 0;
RidleysExplosion_Func_2();
}
}
void Ridley_Func_65(void) { // 0xA6C5A8
Ridley_Func_69();
Enemy_Ridley *E = Get_Ridley(0);
E->ridley_var_02 = 0;
E->base.properties |= kEnemyProps_Invisible;
E->ridley_var_A = FUNC16(Ridley_Func_66);
E->ridley_var_F = 32;
}
void Ridley_Func_66(void) { // 0xA6C5C8
Enemy_Ridley *E = Get_Ridley(0);
if ((--E->ridley_var_F & 0x8000) != 0) {
E->ridley_var_A = FUNC16(Ridley_Func_67);
E->ridley_var_F = 256;
}
}
void Ridley_Func_67(void) { // 0xA6C5DA
Enemy_Ridley *E = Get_Ridley(0);
if ((--E->ridley_var_F & 0x8000) != 0) {
uint16 k = 0;
printf("Warning: X undefined\n");
SetBossBitForCurArea(1);
Enemy_ItemDrop_Ridley(k);
QueueMusic_Delayed8(3);
E->base.properties |= kEnemyProps_Deleted;
E->ridley_var_A = addr_locret_A6C600;
}
}
uint8 Ridley_Func_68(void) { // 0xA6C601
Rect16U rect = { 128, 328, 4, 4 };
Ridley_Func_104(0, 0, 0x10, rect.x, rect.y);
return Shitroid_Func_2(0, rect);
}
void Ridley_Func_69(void) { // 0xA6C623
int16 v1;
Enemy_Ridley *E = Get_Ridley(0);
v1 = E->ridley_var_27 - 1;
if (v1 < 0) {
E->ridley_var_27 = 4;
uint16 v2 = E->ridley_var_28 + 1;
if (!sign16(E->ridley_var_28 - 9))
v2 = 0;
E->ridley_var_28 = v2;
int v3 = (uint16)(4 * v2) >> 1;
eproj_spawn_pt = (Point16U){ E->base.x_pos + g_word_A6C66E[v3], E->base.y_pos + g_word_A6C66E[v3 + 1] };
SpawnEprojWithRoomGfx(addr_kEproj_DustCloudExplosion, 3);
QueueSfx2_Max3(0x24);
} else {
E->ridley_var_27 = v1;
}
}
void RidleysExplosion_Init(void) { // 0xA6C696
Enemy_Ridley *E = Get_Ridley(cur_enemy_index);
E->base.instruction_timer = 1;
E->base.timer = 0;
E->base.vram_tiles_index = 0;
E->base.palette_index = 3584;
uint16 ridley_parameter_1 = E->ridley_parameter_1;
E->ridley_var_F = g_word_A6C6CE[ridley_parameter_1 >> 1];
uint16 Random = NextRandom();
E->ridley_var_B = sign16(Random) ? -(Random & 0x130) : (Random & 0x130);
E->ridley_var_C = 0;
if (ridley_parameter_1) {
switch (ridley_parameter_1) {
case 2:
E->base.x_pos = tilemap_stuff[32];
E->base.y_pos = tilemap_stuff[33];
E->base.current_instruction = addr_kRidleysExplosion_Ilist_CA47;
break;
case 4:
E->base.x_pos = tilemap_stuff[42];
E->base.y_pos = tilemap_stuff[43];
E->base.current_instruction = addr_kRidleysExplosion_Ilist_CA4D;
break;
case 6:
E->base.x_pos = tilemap_stuff[52];
E->base.y_pos = tilemap_stuff[53];
E->base.current_instruction = addr_kRidleysExplosion_Ilist_CA4D;
break;
case 8:
E->base.x_pos = tilemap_stuff[62];
E->base.y_pos = tilemap_stuff[63];
E->base.current_instruction = addr_kRidleysExplosion_Ilist_CA53;
break;
case 0xA:
E->base.x_pos = tilemap_stuff[72];
E->base.y_pos = tilemap_stuff[73];
E->base.current_instruction = addr_kRidleysExplosion_Ilist_CA53;
break;
case 0xC:
E->base.x_pos = tilemap_stuff[82];
E->base.y_pos = tilemap_stuff[83];
E->base.current_instruction = g_off_A6C7BA[(uint8)((LOBYTE(tilemap_stuff[71]) + LOBYTE(tilemap_stuff[81]) + 8) & 0xF0) >> 4];
break;
case 0xE: {
uint16 v10 = 0;
Enemy_Ridley *E0 = Get_Ridley(0);
if (E0->ridley_var_10)
v10 = 2;
int v13 = v10 >> 1;
uint16 v14 = E0->base.x_pos + g_word_A6C804[v13];
E->base.x_pos = v14;
E->base.y_pos = E0->base.y_pos;
E->base.current_instruction = g_off_A6C808[v13];
break;
}
case 0x10: {
uint16 v16 = 0;
Enemy_Ridley *E0 = Get_Ridley(0);
if (E0->ridley_var_10)
v16 = 2;
int v19 = v16 >> 1;
uint16 v20 = E0->base.x_pos + g_word_A6C836[v19];
E->base.x_pos = v20;
E->base.y_pos = E0->base.y_pos + 22;
E->base.current_instruction = g_off_A6C83A[v19];
break;
}
case 0x12: {
uint16 v22 = 0;
Enemy_Ridley *E0 = Get_Ridley(0);
if (E0->ridley_var_10)
v22 = 2;
int v25 = v22 >> 1;
uint16 v26 = E0->base.x_pos + g_word_A6C868[v25];
E->base.x_pos = v26;
E->base.y_pos = E0->base.y_pos - 24;
E->base.current_instruction = g_off_A6C86C[v25];
break;
}
case 0x14: {
uint16 v28 = 0;
Enemy_Ridley *E0 = Get_Ridley(0);
if (E0->ridley_var_10)
v28 = 2;
int v31 = v28 >> 1;
uint16 v32 = E0->base.x_pos + g_word_A6C89A[v31];
E->base.x_pos = v32;
E->base.y_pos = E0->base.y_pos;
E->base.current_instruction = g_off_A6C89E[v31];
break;
}
case 0x16: {
uint16 v34 = 0;
Enemy_Ridley *E0 = Get_Ridley(0);
if (E0->ridley_var_10)
v34 = 2;
int v37 = v34 >> 1;
uint16 v38 = E0->base.x_pos + g_word_A6C8CC[v37];
E->base.x_pos = v38;
E->base.y_pos = E0->base.y_pos + 7;
E->base.current_instruction = g_off_A6C8D0[v37];
break;
}
default:
Unreachable();
while (1)
;
}
} else {
E->base.x_pos = tilemap_stuff[22];
E->base.y_pos = tilemap_stuff[23];
E->base.current_instruction = addr_kRidleysExplosion_Ilist_CA47;
}
}
void RidleysExplosion_Main(void) { // 0xA6C8D4
int16 v2;
RidleysExplosion_Func_1(cur_enemy_index);
Enemy_RidleysExplosion *E = Get_RidleysExplosion(cur_enemy_index);
v2 = abs16(E->ren_var_B) - 4;
if (v2 < 0)
v2 = 0;
E->ren_var_B = sign16(E->ren_var_B) ? -v2 : v2;
E->ren_var_C += 4;
MoveEnemyWithVelocity();
if ((--E->ren_var_F & 0x8000) != 0)
EnemyDeathAnimation(cur_enemy_index, 0);
}
void RidleysExplosion_Func_1(uint16 k) { // 0xA6C913
Enemy_RidleysExplosion *E = Get_RidleysExplosion(k);
uint16 v2 = E->base.frame_counter & 1, v3;
E->base.frame_counter = v2;
if (v2)
v3 = E->base.properties | kEnemyProps_Invisible;
else
v3 = E->base.properties & ~kEnemyProps_Invisible;
E->base.properties = v3;
}
void RidleysExplosion_Func_2(void) { // 0xA6C932
SpawnEnemy(0xA6, addr_stru_A6C9E7);
SpawnEnemy(0xA6, addr_stru_A6C9D7);
SpawnEnemy(0xA6, addr_stru_A6C9C7);
SpawnEnemy(0xA6, addr_stru_A6C9B7);
SpawnEnemy(0xA6, addr_stru_A6C9A7);
SpawnEnemy(0xA6, addr_stru_A6C997);
SpawnEnemy(0xA6, addr_stru_A6C987);
SpawnEnemy(0xA6, addr_stru_A6C9F7);
SpawnEnemy(0xA6, addr_stru_A6CA07);
SpawnEnemy(0xA6, addr_stru_A6CA27);
SpawnEnemy(0xA6, addr_stru_A6CA17);
SpawnEnemy(0xA6, addr_stru_A6CA37);
}
void locret_A6CB20(void) {}
static Func_V *const off_A6CB21[9] = { locret_A6CB20, Ridley_CBC0, Ridley_Func_71, Ridley_Func_72, Ridley_CBC7, Ridley_CBCE, Ridley_Func_73, Ridley_Func_74, Ridley_CBD5 };
void Ridley_Func_70(void) { // 0xA6CAF5
Ridley_Func_91();
off_A6CB21[tilemap_stuff[0]]();
Ridley_Func_86();
Ridley_Func_87();
Enemy_Ridley *E = Get_Ridley(0);
if (!(E->ridley_var_1B | (uint16)(samus_invincibility_timer | E->base.properties & kEnemyProps_Tangible)))
Ridley_Func_127();
}
void Ridley_Func_71(void) { // 0xA6CB33
tilemap_stuff[10] = 8;
Ridley_Func_75();
tilemap_stuff[0] = 3;
}
void Ridley_Func_72(void) { // 0xA6CB45
tilemap_stuff[10] = 8;
Ridley_Func_75();
}
void Ridley_Func_73(void) { // 0xA6CB4E
tilemap_stuff[10] = 3;
Ridley_Func_75();
tilemap_stuff[0] = 6;
}
void Ridley_Func_74(void) { // 0xA6CB60
tilemap_stuff[10] = 2;
Ridley_Func_75();
tilemap_stuff[0] = 7;
}
void Ridley_Func_75(void) { // 0xA6CB72
if (Get_Ridley(0)->ridley_var_10) {
tilemap_stuff[13] = 0x4000;
tilemap_stuff[14] = -1;
} else {
tilemap_stuff[14] = 0x4000;
tilemap_stuff[13] = -1;
}
Ridley_CBC7();
if (!(tilemap_stuff[76] | (uint16)(tilemap_stuff[66] | tilemap_stuff[56] | tilemap_stuff[46] | tilemap_stuff[36] | tilemap_stuff[26] | tilemap_stuff[16])))
tilemap_stuff[0] = 4;
}
void Ridley_CBC0(void) { // 0xA6CBC0
Ridley_Func_79();
Ridley_CBDC();
}
void Ridley_CBC7(void) { // 0xA6CBC7
Ridley_Func_83();
Ridley_CBDC();
}
void Ridley_CBCE(void) { // 0xA6CBCE
Ridley_Func_84();
Ridley_CBDC();
}
void Ridley_CBD5(void) { // 0xA6CBD5
Ridley_Func_81();
Ridley_CBDC();
}
void Ridley_CBDC(void) { // 0xA6CBDC
uint16 v0 = 7;
uint16 v1 = 0;
do {
Ridley_Func_88(v1);
v1 += 20;
} while (v0-- != 1);
}
void Ridley_Func_77(void) { // 0xA6CBFE
int v0 = Get_Ridley(0)->ridley_var_10;
tilemap_stuff[11] = g_word_A6CC12[v0];
tilemap_stuff[12] = g_word_A6CC18[v0];
}
uint8 Ridley_Func_78(void) { // 0xA6CC1E
return (tilemap_stuff[76] & (uint16)(tilemap_stuff[66] & tilemap_stuff[56] & tilemap_stuff[46] & tilemap_stuff[36] & tilemap_stuff[26] & tilemap_stuff[16])) != 0;
}
void Ridley_Func_79(void) { // 0xA6CC39
Ridley_Func_77();
if (Ridley_Func_78()) {
if (Ridley_Func_80_DoubleRet())
return;
}
if (!(tilemap_stuff[76] | (uint16)(tilemap_stuff[66] | tilemap_stuff[56] | tilemap_stuff[46] | tilemap_stuff[36] | tilemap_stuff[26] | tilemap_stuff[16]))) {
tilemap_stuff[16] = 0x8000;
tilemap_stuff[13] = -1;
tilemap_stuff[14] = -1;
uint16 v0 = 2;
if (samus_x_pos < 0x70)
v0 = 1;
tilemap_stuff[10] = v0;
}
}
uint8 Ridley_Func_80_DoubleRet(void) { // 0xA6CC7D
Enemy_Ridley *E = Get_Ridley(0);
bool retval = false;
uint16 v1;
if (tilemap_stuff[2] && (tilemap_stuff[13] & tilemap_stuff[14] & 0x8000) != 0)
goto LABEL_7;
if (!tilemap_stuff[1])
goto LABEL_9;
if ((uint8)random_number >= 0xF0) {
LABEL_7:
v1 = tilemap_stuff[2] - 1;
goto LABEL_8;
}
if (abs16(samus_x_pos - E->base.x_pos) < 0x80) {
v1 = 0;
LABEL_8:
Ridley_Func_89(v1);
retval = true;
}
LABEL_9:
tilemap_stuff[2] = 0;
return retval;
}
bool Ridley_Func_82_DoubleRet();
void Ridley_Func_81(void) { // 0xA6CCBD
Ridley_Func_77();
if (Ridley_Func_78() & 1) {
if (Ridley_Func_82_DoubleRet())
return;
}
if (!(tilemap_stuff[76] | (uint16)(tilemap_stuff[66] | tilemap_stuff[56] | tilemap_stuff[46] | tilemap_stuff[36] | tilemap_stuff[26] | tilemap_stuff[16]))) {
tilemap_stuff[16] = 0x8000;
tilemap_stuff[13] = -1;
tilemap_stuff[14] = -1;
uint16 v0 = 2;
if (samus_x_pos < 0x70)
v0 = 1;
tilemap_stuff[10] = v0;
}
}
bool Ridley_Func_82_DoubleRet(void) {
if (tilemap_stuff[2]) {
if ((tilemap_stuff[13] & tilemap_stuff[14] & 0x8000) != 0) {
Ridley_Func_89(1);
tilemap_stuff[2] = 0;
return true;
}
}
return false;
}
void Ridley_Func_83(void) { // 0xA6CD24
Enemy_Ridley *E = Get_Ridley(0);
Ridley_Func_77();
if (Ridley_Func_78() & 1
&& ((uint8)random_number >= 0xF0
|| (abs16(samus_x_pos - E->base.x_pos) < 0x80))
&& (tilemap_stuff[13] & tilemap_stuff[14] & 0x8000) != 0) {
tilemap_stuff[13] = 16128;
tilemap_stuff[10] = 8;
} else if (!(tilemap_stuff[76] | (uint16)(tilemap_stuff[66] | tilemap_stuff[56] | tilemap_stuff[46] | tilemap_stuff[36] | tilemap_stuff[26] | tilemap_stuff[16]))) {
if ((Get_Ridley(0)->ridley_var_C & 0x8000) == 0)
tilemap_stuff[0] = 5;
tilemap_stuff[13] = -1;
tilemap_stuff[14] = -1;
uint16 v1 = tilemap_stuff[8];
if (!tilemap_stuff[8] || (v1 = tilemap_stuff[8] - 1, (tilemap_stuff[8] = v1) != 0)) {
tilemap_stuff[10] = v1;
} else {
tilemap_stuff[16] = 0x8000;
Ridley_Func_85();
tilemap_stuff[10] = 8;
}
}
}
void Ridley_Func_84(void) { // 0xA6CDAA
Enemy_Ridley *E = Get_Ridley(0);
Ridley_Func_77();
if (Ridley_Func_78() & 1
&& ((uint8)random_number >= 0xF0
|| (abs16(samus_x_pos - E->base.x_pos) < 0x80))
&& (tilemap_stuff[13] & tilemap_stuff[14] & 0x8000) != 0) {
tilemap_stuff[13] = 16128;
tilemap_stuff[10] = 8;
} else if (!(tilemap_stuff[76] | (uint16)(tilemap_stuff[66] | tilemap_stuff[56] | tilemap_stuff[46] | tilemap_stuff[36] | tilemap_stuff[26] | tilemap_stuff[16]))) {
if ((E->ridley_var_C & 0x8000) == 0) {
tilemap_stuff[0] = 6;
tilemap_stuff[20] = 2560;
tilemap_stuff[30] = 2560;
tilemap_stuff[40] = 2560;
tilemap_stuff[50] = 2560;
tilemap_stuff[60] = 2560;
tilemap_stuff[70] = 2560;
tilemap_stuff[80] = 2560;
tilemap_stuff[21] = 0x4000;
tilemap_stuff[31] = 0x4000;
tilemap_stuff[41] = 0x4000;
tilemap_stuff[51] = 0x4000;
tilemap_stuff[61] = 0x4000;
tilemap_stuff[71] = 0x4000;
tilemap_stuff[81] = 0x4000;
tilemap_stuff[16] = 0x8000;
}
tilemap_stuff[13] = -1;
tilemap_stuff[14] = -1;
uint16 v1 = tilemap_stuff[8];
if (tilemap_stuff[8]) {
v1 = tilemap_stuff[8] - 1;
tilemap_stuff[8] = v1;
if (!v1) {
tilemap_stuff[16] = 0x8000;
Ridley_Func_85();
v1 = 8;
}
}
tilemap_stuff[10] = v1;
}
}
void Ridley_Func_85(void) { // 0xA6CE65
tilemap_stuff[21] = LOBYTE(tilemap_stuff[21]) | 0x4000;
tilemap_stuff[31] = LOBYTE(tilemap_stuff[31]) | 0x4000;
tilemap_stuff[41] = LOBYTE(tilemap_stuff[41]) | 0x4000;
tilemap_stuff[51] = LOBYTE(tilemap_stuff[51]) | 0x4000;
tilemap_stuff[61] = tilemap_stuff[21] & 0x4FF | 0x4000;
tilemap_stuff[71] = LOBYTE(tilemap_stuff[71]) | 0x4000;
tilemap_stuff[81] = LOBYTE(tilemap_stuff[81]) | 0x4000;
}
void Ridley_Func_86(void) { // 0xA6CEBA
int16 v1;
Enemy_Ridley *E = Get_Ridley(0);
tilemap_stuff[23] = tilemap_stuff[25] + E->base.y_pos + 16;
tilemap_stuff[33] = tilemap_stuff[35] + tilemap_stuff[23];
tilemap_stuff[43] = tilemap_stuff[45] + tilemap_stuff[35] + tilemap_stuff[23];
tilemap_stuff[53] = tilemap_stuff[55] + tilemap_stuff[43];
tilemap_stuff[63] = tilemap_stuff[65] + tilemap_stuff[55] + tilemap_stuff[43];
tilemap_stuff[73] = tilemap_stuff[75] + tilemap_stuff[63];
tilemap_stuff[83] = tilemap_stuff[85] + tilemap_stuff[75] + tilemap_stuff[63];
v1 = E->ridley_var_10 - 1;
if (E->ridley_var_10 != 1)
v1 = tilemap_stuff[24] + g_word_A6CF54[E->ridley_var_10];
tilemap_stuff[22] = E->base.x_pos + v1;
if (E->ridley_var_10 == 1) {
tilemap_stuff[32] = E->base.x_pos;
tilemap_stuff[42] = tilemap_stuff[32];
tilemap_stuff[52] = tilemap_stuff[32];
tilemap_stuff[62] = tilemap_stuff[32];
tilemap_stuff[72] = tilemap_stuff[32];
tilemap_stuff[82] = tilemap_stuff[32];
} else {
tilemap_stuff[32] = tilemap_stuff[34] + tilemap_stuff[22];
tilemap_stuff[42] = tilemap_stuff[44] + tilemap_stuff[34] + tilemap_stuff[22];
tilemap_stuff[52] = tilemap_stuff[54] + tilemap_stuff[42];
tilemap_stuff[62] = tilemap_stuff[64] + tilemap_stuff[54] + tilemap_stuff[42];
tilemap_stuff[72] = tilemap_stuff[74] + tilemap_stuff[62];
tilemap_stuff[82] = tilemap_stuff[84] + tilemap_stuff[74] + tilemap_stuff[62];
}
}
void Ridley_Func_87(void) { // 0xA6CF5A
if (tilemap_stuff[30]) {
if ((int16)(tilemap_stuff[30] - tilemap_stuff[29]) < 0)
tilemap_stuff[30] = 0;
uint16 v0 = tilemap_stuff[9] + tilemap_stuff[29];
if (!sign16(tilemap_stuff[9] + tilemap_stuff[29] - 6144))
v0 = 6144;
tilemap_stuff[29] = v0;
} else if ((int16)(2048 - tilemap_stuff[29]) < 0) {
tilemap_stuff[29] -= 128;
}
if (tilemap_stuff[40]) {
if ((int16)(tilemap_stuff[40] - tilemap_stuff[39]) < 0)
tilemap_stuff[40] = 0;
uint16 v1 = tilemap_stuff[9] + tilemap_stuff[39];
if (!sign16(tilemap_stuff[9] + tilemap_stuff[39] - 6144))
v1 = 6144;
tilemap_stuff[39] = v1;
} else if ((int16)(2048 - tilemap_stuff[39]) < 0) {
tilemap_stuff[39] -= 128;
}
if (tilemap_stuff[50]) {
if ((int16)(tilemap_stuff[50] - tilemap_stuff[49]) < 0)
tilemap_stuff[50] = 0;
uint16 v2 = tilemap_stuff[9] + tilemap_stuff[49];
if (!sign16(tilemap_stuff[9] + tilemap_stuff[49] - 5632))
v2 = 5632;
tilemap_stuff[49] = v2;
} else if ((int16)(2048 - tilemap_stuff[49]) < 0) {
tilemap_stuff[49] -= 128;
}
if (tilemap_stuff[60]) {
if ((int16)(tilemap_stuff[60] - tilemap_stuff[59]) < 0)
tilemap_stuff[60] = 0;
uint16 v3 = tilemap_stuff[9] + tilemap_stuff[59];
if (!sign16(tilemap_stuff[9] + tilemap_stuff[59] - 5632))
v3 = 5632;
tilemap_stuff[59] = v3;
} else if ((int16)(2048 - tilemap_stuff[59]) < 0) {
tilemap_stuff[59] -= 128;
}
if (tilemap_stuff[70]) {
if ((int16)(tilemap_stuff[70] - tilemap_stuff[69]) < 0)
tilemap_stuff[70] = 0;
uint16 v4 = tilemap_stuff[9] + tilemap_stuff[69];
if (!sign16(tilemap_stuff[9] + tilemap_stuff[69] - 4608))
v4 = 4608;
tilemap_stuff[69] = v4;
} else if ((int16)(2048 - tilemap_stuff[69]) < 0) {
tilemap_stuff[69] -= 128;
}
if (tilemap_stuff[80]) {
if ((int16)(tilemap_stuff[80] - tilemap_stuff[79]) < 0)
tilemap_stuff[80] = 0;
uint16 v5 = tilemap_stuff[9] + tilemap_stuff[79];
if (!sign16(tilemap_stuff[9] + tilemap_stuff[79] - 1280))
v5 = 1280;
tilemap_stuff[79] = v5;
} else if ((int16)(1280 - tilemap_stuff[79]) < 0) {
tilemap_stuff[79] -= 128;
}
}
void Ridley_Func_88(uint16 k) { // 0xA6D09F
int16 v6;
uint16 v2;
int v1 = k >> 1;
if ((tilemap_stuff[v1 + 16] & 0x8000) != 0) {
int v4 = k >> 1;
uint16 v5 = tilemap_stuff[v4 + 17];
if (v5 < tilemap_stuff[15]) {
tilemap_stuff[(k >> 1) + 17] += tilemap_stuff[10];
return;
}
if (v5 != 0xFFFF) {
tilemap_stuff[v4 + 17] = -1;
tilemap_stuff[v4 + 26] = 0x8000;
tilemap_stuff[v4 + 28] = tilemap_stuff[v4 + 18];
}
if ((tilemap_stuff[v4 + 18] & 0x8000) == 0) {
if ((tilemap_stuff[14] & 0x8000) != 0) {
v2 = tilemap_stuff[10] + tilemap_stuff[v4 + 21];
if ((int16)(v2 - tilemap_stuff[12]) >= 0) {
LABEL_15:
tilemap_stuff[v4 + 18] = 0x8000;
v2 = tilemap_stuff[12];
}
} else {
tilemap_stuff[v4 + 20] = 3072;
v2 = tilemap_stuff[10] + tilemap_stuff[v4 + 21];
if ((int16)(v2 - tilemap_stuff[14]) >= 0) {
if (!k || !tilemap_stuff[v4 + 6]) {
tilemap_stuff[v4 + 21] = tilemap_stuff[14];
LABEL_3:;
int v3 = k >> 1;
tilemap_stuff[v3 + 16] = 0;
tilemap_stuff[v3 + 17] = 0;
tilemap_stuff[v3 + 18] ^= 0x8000;
return;
}
goto LABEL_15;
}
}
LABEL_24:
tilemap_stuff[v4 + 21] = v2;
goto LABEL_25;
}
if ((tilemap_stuff[13] & 0x8000) != 0) {
v6 = tilemap_stuff[v4 + 21] - tilemap_stuff[10] - 1;
if ((int16)(v6 - tilemap_stuff[11]) < 0) {
LABEL_22:
tilemap_stuff[v4 + 18] = 0;
v2 = tilemap_stuff[11];
goto LABEL_24;
}
} else {
tilemap_stuff[v4 + 20] = 3072;
v6 = tilemap_stuff[v4 + 21] - tilemap_stuff[10] - 1;
if ((int16)(v6 - tilemap_stuff[13]) < 0) {
if (!k || !tilemap_stuff[v4 + 6]) {
tilemap_stuff[v4 + 21] = tilemap_stuff[13];
goto LABEL_3;
}
goto LABEL_22;
}
}
v2 = v6 + 1;
goto LABEL_24;
}
v2 = tilemap_stuff[v1 + 21];
LABEL_25:;
uint16 r18 = (uint8)v2;
if (k)
r18 = (uint8)(LOBYTE(tilemap_stuff[(k >> 1) + 11]) + r18);
int v7 = k >> 1;
tilemap_stuff[v7 + 24] = ComputeSinMult(HIBYTE(tilemap_stuff[v7 + 19]), r18);
tilemap_stuff[v7 + 25] = ComputeCosMult(HIBYTE(tilemap_stuff[v7 + 19]), r18);
}
void Ridley_Func_89(uint16 a) { // 0xA6D19D
uint16 v1, r18, r20;
int8 v2; // t0
v2 = a;
LOBYTE(v1) = 0;
HIBYTE(v1) = v2;
tilemap_stuff[5] = v1;
Enemy_Ridley *E = Get_Ridley(0);
if (E->ridley_var_10 != 1 && E->ridley_var_01) {
Point16U pt;
if (Ridley_Func_90(&pt)) {
r18 = pt.x - tilemap_stuff[22];
r20 = pt.y - tilemap_stuff[23];
} else {
r18 = samus_x_pos - tilemap_stuff[22];
r20 = samus_y_pos + 24 - tilemap_stuff[23];
}
r18 = (uint8)-(CalculateAngleFromXY(r18, r20) + 0x80);
if (E->ridley_var_10) {
uint16 v7 = r18;
if (r18 >= 0x18 && r18 < 0xE8)
v7 = 24;
uint16 v8 = tilemap_stuff[5] + v7 + 0x4000;
if (v8 >= tilemap_stuff[21]) {
tilemap_stuff[14] = v8;
tilemap_stuff[10] = 8;
}
} else {
uint16 v5 = r18;
if (r18 >= 0x18 && r18 < 0xE8)
v5 = 232;
uint16 v6 = v5 + 16128 - tilemap_stuff[5];
if (v6 < tilemap_stuff[21]) {
tilemap_stuff[13] = v6;
tilemap_stuff[10] = 8;
}
}
}
}
uint8 Ridley_Func_90(Point16U *out) { // 0xA6D242
Rect16U rect = { tilemap_stuff[82], tilemap_stuff[83], 64, 64 };
if (!projectile_counter)
return 0;
uint16 v1 = 0;
while (1) {
int v2 = v1 >> 1;
if ((HIBYTE(projectile_type[v2]) & 0xF) == 1 || (HIBYTE(projectile_type[v2]) & 0xF) == 2) {
uint16 v3 = abs16(projectile_x_pos[v2] - rect.x);
bool v4 = v3 < projectile_x_radius[v2];
uint16 v5 = v3 - projectile_x_radius[v2];
if (v4 || v5 < rect.w) {
uint16 v6 = abs16(projectile_y_pos[v2] - rect.y);
v4 = v6 < projectile_y_radius[v2];
uint16 v7 = v6 - projectile_y_radius[v2];
if (v4 || v7 < rect.h)
break;
}
}
v1 += 2;
if ((int16)(v1 - 10) >= 0)
return 0;
}
int v8 = v1 >> 1;
out->x = projectile_x_pos[v8];
out->y = projectile_y_pos[v8];
return 1;
}
void Ridley_Func_91(void) { // 0xA6D2AA
Enemy_Ridley *E = Get_Ridley(0);
if (!sign16(tilemap_stuff[10] - 8)) {
uint16 v1 = E->ridley_var_0E + 1;
E->ridley_var_0E = v1;
if (sign16(v1 - 16))
return;
if (!E->ridley_var_0F)
QueueSfx3_Max6(0x21);
}
E->ridley_var_0E = 0;
}
void Ridley_Func_92(void) { // 0xA6D2D6
tilemap_stuff[10] = 1;
tilemap_stuff[11] = 16368;
tilemap_stuff[12] = 16448;
tilemap_stuff[13] = -1;
tilemap_stuff[14] = -1;
tilemap_stuff[9] = 240;
tilemap_stuff[15] = 16;
tilemap_stuff[17] = 17;
tilemap_stuff[27] = 17;
tilemap_stuff[37] = 17;
tilemap_stuff[47] = 17;
tilemap_stuff[57] = 17;
tilemap_stuff[67] = 17;
tilemap_stuff[77] = 17;
Ridley_Func_93(0x2024, addr_word_A6D36E);
Ridley_Func_93(0x2026, addr_word_A6D37C);
Ridley_Func_93(0x202A, addr_word_A6D38A);
Ridley_Func_93(0x202C, addr_word_A6D398);
Ridley_Func_93(0x202E, addr_word_A6D3A6);
tilemap_stuff[16] = 0;
tilemap_stuff[26] = 0;
tilemap_stuff[36] = 0;
tilemap_stuff[46] = 0;
tilemap_stuff[56] = 0;
tilemap_stuff[66] = 0;
tilemap_stuff[76] = 0;
}
void Ridley_Func_93(uint16 j, uint16 k) { // 0xA6D3B4
uint16 *dst = (uint16*)(g_ram + j);
const uint16 *src = (const uint16 *)RomPtr_A6(k);
int v3 = 7;
do {
*dst = *src;
dst += 10, src++;
} while (--v3);
}
void Ridley_Func_94(void) { // 0xA6D3D4
Ridley_Func_D3DC(0);
}
void Ridley_Func_95(void) { // 0xA6D3D9
Ridley_Func_D3DC(0x8000);
}
void Ridley_Func_D3DC(uint16 a) { // 0xA6D3DC
tilemap_stuff[16] = a;
tilemap_stuff[26] = a;
tilemap_stuff[36] = a;
tilemap_stuff[46] = a;
tilemap_stuff[56] = a;
tilemap_stuff[66] = a;
tilemap_stuff[76] = a;
}
void Ridley_Func_96(void) { // 0xA6D3F9
int16 v0;
Ridley_Func_93(0x2026, addr_word_A6D37C);
v0 = 7;
uint16 v1 = 0;
do {
int v2 = v1 >> 1;
tilemap_stuff[v2 + 21] = 0x8000 - tilemap_stuff[v2 + 21];
tilemap_stuff[v2 + 18] |= 0x8000;
v1 += 20;
--v0;
} while (v0);
}
uint8 Ridley_Func_97(void) { // 0xA6D431
return (tilemap_stuff[76] & (uint16)(tilemap_stuff[66] & tilemap_stuff[56] & tilemap_stuff[46] & tilemap_stuff[36] & tilemap_stuff[26] & tilemap_stuff[16])) != 0;
}
void Ridley_Func_98(void) { // 0xA6D453
uint16 enemy_ptr = Get_Ridley(cur_enemy_index)->base.enemy_ptr;
const uint8 *v1 = RomPtr_A0(enemy_ptr);
Samus_DealDamage(SuitDamageDivision(GET_WORD(v1 + 6)));
}
void Ridley_Func_99(uint16 a) { // 0xA6D467
Enemy_Ridley *E = Get_Ridley(0);
E->base.current_instruction = a;
E->base.instruction_timer = 1;
E->base.timer = 0;
}
void Ridley_Func_100(void) { // 0xA6D474
int16 v0;
v0 = 0;
Enemy_Ridley *E = Get_Ridley(0);
uint16 health = E->base.health;
if (health < 0x2328) {
v0 = 1;
if (health < 0x1518) {
v0 = 2;
if (health < 0x708)
v0 = 3;
}
}
E->ridley_var_12 = v0;
if ((int16)(v0 - 1) >= 0)
Ridley_D495(v0 - 1);
}
void Ridley_D495(uint16 r18) { // 0xA6D495
if (!palette_change_num)
WriteColorsToPalette(0x1E2, 0xa6, 28 * r18 - 7062, 0xE);
}
void Ridley_Func_101(void) { // 0xA6D4B5
Enemy_Ridley *E = Get_Ridley(0);
if (E->ridley_var_01 && E->ridley_var_0D >= 0x32)
Ridley_D495((E->ridley_var_0D >= 0x46) ? 2 : 0);
}
void Ridley_Func_102(void) { // 0xA6D4DA
int16 v0;
v0 = 3584;
Enemy_Ridley *E = Get_Ridley(0);
if (E->base.flash_timer >= 2 && ((random_enemy_counter + 1) & 2) != 0)
v0 = 0;
E->ridley_var_0C = v0;
}
uint8 Ridley_Func_103(uint16 k, uint16 j) { // 0xA6D4F9
uint16 prod = Mult8x8(j >> 4, room_width_in_blocks);
return (level_data[prod + (k >> 4)] & 0xF000) != 0;
}
void Ridley_Func_104_0(uint16 k, uint16 j, uint16 r18, uint16 r20) { // 0xA6D523
Ridley_Func_104(k, j, 0, r18, r20);
}
void Ridley_Func_104(uint16 k, uint16 j, uint16 a, uint16 r18, uint16 r20) { // 0xA6D526
int16 v4;
int16 v6;
int16 v8;
int16 v9;
int16 v11;
int16 ridley_var_C;
int16 v17;
uint16 R26 = a;
uint16 r24 = g_byte_A6D61F[j];
Ridley_Func_105(k, r18, r24, a);
Enemy_Ridley *E = Get_Ridley(k);
v4 = E->base.y_pos - r20;
if (v4) {
if (v4 >= 0) {
uint16 RegWord = SnesDivide(v4, r24);
if (!RegWord)
RegWord = 1;
uint16 r22 = RegWord;
ridley_var_C = E->ridley_var_C;
bool v14 = 0;
if (ridley_var_C >= 0) {
uint16 v15 = ridley_var_C - R26;
v15 -= 8;
uint16 v16 = r22;
ridley_var_C = v15 - v16;
}
v17 = ridley_var_C - r22;
if (sign16(v17 + 1280))
v17 = -1280;
E->ridley_var_C = v17;
} else {
uint16 v5 = SnesDivide(r20 - E->base.y_pos, r24);
if (!v5)
v5 = 1;
uint16 r22 = v5;
v6 = E->ridley_var_C;
bool v7 = 0;
if (v6 < 0) {
v8 = R26 + v6;
v8 += 8;
v9 = v8;
v6 = r22 + v9;
}
v11 = r22 + v6;
if (!sign16(v11 - 1280))
v11 = 1280;
E->ridley_var_C = v11;
}
}
}
void Ridley_Func_105(uint16 k, uint16 r18, uint16 r24, uint16 r26) { // 0xA6D5A9
int16 v2;
int16 v4;
int16 v6;
int16 v7;
int16 v9;
int16 ridley_var_B;
int16 v15;
Enemy_Ridley *E = Get_Ridley(k);
v2 = E->base.x_pos - r18;
if (v2) {
if (v2 >= 0) {
uint16 RegWord = SnesDivide(v2, r24);
if (!RegWord)
RegWord = 1;
uint16 r22 = RegWord;
ridley_var_B = E->ridley_var_B;
bool v12 = 0;
if (ridley_var_B >= 0) {
uint16 v13 = ridley_var_B - r26;
v13 -= 8;
uint16 v14 = r22;
ridley_var_B = v13 - v14;
}
v15 = ridley_var_B - r22;
if (sign16(v15 + 1280))
v15 = -1280;
E->ridley_var_B = v15;
} else {
uint16 v3 = SnesDivide(r18 - E->base.x_pos, r24);
if (!v3)
v3 = 1;
uint16 r22 = v3;
v4 = E->ridley_var_B;
if (v4 < 0) {
v6 = r26 + v4;
v6 += 8;
v7 = v6;
v4 = r22 + v7;
}
v9 = r22 + v4;
if (!sign16(v9 - 1280))
v9 = 1280;
E->ridley_var_B = v9;
}
}
}
void Ridley_Func_106(uint16 k, uint16 j, uint16 r18, uint16 r20) { // 0xA6D62F
int16 v3;
int16 v5;
int16 v6;
int16 ridley_var_C;
int16 v9;
uint16 r24 = g_byte_A6D712[j];
Ridley_Func_107(k, r18, r24);
Enemy_Ridley *E = Get_Ridley(k);
v3 = E->base.y_pos - r20;
if (v3) {
if (v3 >= 0) {
uint16 RegWord = SnesDivide(v3, r24);
if (!RegWord)
RegWord = 1;
uint16 r22 = RegWord;
ridley_var_C = E->ridley_var_C;
if (ridley_var_C >= 0)
ridley_var_C = ridley_var_C - r22 - r22;
v9 = ridley_var_C - r22;
if (sign16(v9 + 1280))
v9 = -1280;
E->ridley_var_C = v9;
} else {
uint16 v4 = SnesDivide(r20 - E->base.y_pos, r24);
if (!v4)
v4 = 1;
uint16 r22 = v4;
v5 = E->ridley_var_C;
if (v5 < 0)
v5 += r22 + r22;
v6 = r22 + v5;
if (!sign16(v6 - 1280))
v6 = 1280;
E->ridley_var_C = v6;
}
}
}
void Ridley_Func_107(uint16 k, uint16 r18, uint16 r24) { // 0xA6D6A6
Enemy_Ridley *E = Get_Ridley(k);
int16 v2 = E->base.x_pos - r18;
if (!v2)
return;
if (v2 >= 0) {
uint16 RegWord = SnesDivide(v2, r24);
uint16 r22 = RegWord = RegWord ? RegWord : 1;
int16 s = E->ridley_var_B;
if (s >= 0)
s -= 2 * RegWord;
s -= RegWord;
E->ridley_var_B = sign16(s + 1280) ? -1280 : s;
} else {
uint16 v3 = SnesDivide(r18 - E->base.x_pos, r24);
uint16 r22 = v3 ? v3 : 1;
int16 s = E->ridley_var_B;
if (s < 0)
s += 2 * r22;
s += r22;
E->ridley_var_B = !sign16(s - 1280) ? 1280 : s;
}
}
void Ridley_Func_111(uint16 r18, uint16 r20, uint16 r22) { // 0xA6D800
Enemy_Ridley *E = Get_Ridley(0);
if (r22 != E->ridley_var_0B) {
if ((int16)(r22 - E->ridley_var_0B) >= 0) {
uint16 v2 = E->ridley_var_0B + 32;
if (!sign16(v2 - r22))
v2 = r22;
E->ridley_var_0B = v2;
} else {
uint16 v1 = E->ridley_var_0B - 32;
if (sign16(v1 - r22))
v1 = r22;
E->ridley_var_0B = v1;
}
}
uint16 v3;
if ((r18 & 0x8000) != 0) {
v3 = E->ridley_var_0A + r18;
if (sign16(v3 - r20))
LABEL_13:
v3 = r20;
} else {
v3 = E->ridley_var_0A + r18;
if (!sign16(v3 - r20))
goto LABEL_13;
}
E->ridley_var_0A = v3;
r18 = HIBYTE(v3);
E->ridley_var_B = Math_MultBySin(E->ridley_var_0B, r18);
E->ridley_var_C = Math_MultByCos(E->ridley_var_0B, r18);
}
void Ridley_Func_112(void) { // 0xA6D86B
Enemy_Ridley *Ridley;
uint16 v1;
Enemy_Ridley *v2;
uint16 ridley_var_23;
uint16 ridley_var_21;
Ridley = Get_Ridley(0);
Ridley->ridley_var_1F = 0;
v1 = cur_enemy_index;
v2 = Get_Ridley(cur_enemy_index);
int with_carry = HIBYTE(v2->base.x_subpos) + LOBYTE(v2->ridley_var_B);
HIBYTE(v2->base.x_subpos) = with_carry;
ridley_var_23 = v2->base.x_pos + (int8)(v2->ridley_var_B >> 8) + (with_carry >> 8);
if ((int16)(ridley_var_23 - Ridley->ridley_var_22) >= 0) {
if ((int16)(ridley_var_23 - Ridley->ridley_var_23) >= 0) {
v2->ridley_var_B = 0;
Ridley->ridley_var_1F = 2;
ridley_var_23 = Ridley->ridley_var_23;
}
v2->base.x_pos = ridley_var_23;
} else {
Ridley_Func_113(v1);
v2->base.x_pos = Ridley->ridley_var_22;
v2->ridley_var_B = 0;
Ridley->ridley_var_1F = 1;
}
with_carry = HIBYTE(v2->base.y_subpos) + LOBYTE(v2->ridley_var_C);
HIBYTE(v2->base.y_subpos) = with_carry;
ridley_var_21 = v2->base.y_pos + (int8)(v2->ridley_var_C >> 8) + (with_carry >> 8);
if ((int16)(ridley_var_21 - Ridley->ridley_var_20) >= 0) {
if ((int16)(ridley_var_21 - Ridley->ridley_var_21) >= 0) {
v2->ridley_var_C = 0;
Ridley->ridley_var_1F = 8;
ridley_var_21 = Ridley->ridley_var_21;
}
v2->base.y_pos = ridley_var_21;
} else {
v2->base.y_pos = Ridley->ridley_var_20;
v2->ridley_var_C = 0;
Ridley->ridley_var_1F = 4;
}
}
void Ridley_Func_113(uint16 k) { // 0xA6D914
if (area_index != 2) {
Enemy_Ridley *E = Get_Ridley(k);
uint16 r18 = abs16(E->ridley_var_B);
uint16 v2 = abs16(E->ridley_var_C);
if (v2 < r18)
v2 = r18;
if (v2 >= 0x280) {
uint16 v3;
if (area_index == 2)
v3 = 24;
else
v3 = 33;
earthquake_type = v3;
earthquake_timer = 12;
}
}
}
void Ridley_Func_114(void) { // 0xA6D955
Enemy_Ridley *E = Get_Ridley(0);
uint16 ridley_var_10 = E->ridley_var_10, v2;
if (!ridley_var_10) {
if (*(int16 *)((uint8 *)&E->base.enemy_ptr + 1) < 0)
return;
v2 = addr_kRidley_Ilist_E6F0;
goto LABEL_7;
}
if (ridley_var_10 != 1 && *(int16 *)((uint8 *)&E->base.enemy_ptr + 1) < 0) {
v2 = addr_kRidley_Ilist_E706;
LABEL_7:
E->base.current_instruction = v2;
E->base.instruction_timer = 2;
E->base.timer = 0;
}
}
void Ridley_Func_115(void) { // 0xA6D97D
int16 v1;
Ridley_Func_116();
Enemy_Ridley *E = Get_Ridley(0);
v1 = E->ridley_var_09 - E->ridley_var_08;
E->ridley_var_09 = v1;
if (v1 < 0) {
E->ridley_var_09 = 32;
uint16 v2 = E->ridley_var_07 + 1;
if (v2 >= 0xA)
v2 = 0;
E->ridley_var_07 = v2;
}
}
void Ridley_Func_116(void) { // 0xA6D9A8
Enemy_Ridley *E = Get_Ridley(0);
uint16 r18 = abs16(E->ridley_var_B);
uint16 v1 = r18 + abs16(E->ridley_var_C);
if (v1) {
uint16 v2 = v1 - r18;
if (sign16(v2 - r18))
v2 = r18;
int v5 = (((4 * v2) & 0xF00) >> 8);
if (v5 >= 7)
v5 = 7;
uint16 v6 = g_word_A6D9ED[v5];
if ((E->ridley_var_C & 0x8000) == 0)
v6 >>= 1;
E->ridley_var_08 = v6;
} else {
E->ridley_var_08 = 0;
}
}
void Ridley_Func_117(void) { // 0xA6D9FD
Enemy_Ridley *E = Get_Ridley(0);
E->ridley_var_05 = addr_word_A6DA71;
E->ridley_var_06 = 1;
}
void Ridley_Func_118(void) { // 0xA6DA0C
VramWriteEntry *v7;
Enemy_Ridley *E = Get_Ridley(0);
uint16 v1 = E->ridley_var_06 - 1;
E->ridley_var_06 = v1;
if (!v1) {
int i;
uint16 v3, *v4;
for (i = E->ridley_var_05; ; E->ridley_var_05 = i) {
v3 = i;
v4 = (uint16 *)RomPtr_A6(i);
i = *v4;
if ((*v4 & 0x8000) == 0)
break;
}
E->ridley_var_06 = i;
uint16 v6 = vram_write_queue_tail;
v7 = gVramWriteEntry(vram_write_queue_tail);
*(VoidP *)((uint8 *)&v7->src.addr + 1) = -20480;
*(VoidP *)((uint8 *)&v7[1].src.addr + 1) = -20480;
v7->src.addr = v4[1];
v7[1].src.addr = v4[2];
v7->vram_dst = 29216;
v7[1].vram_dst = 29472;
v7->size = 64;
v7[1].size = 64;
vram_write_queue_tail = v6 + 14;
gVramWriteEntry(v6 + 14)->size = 0;
E->ridley_var_05 = v3 + 6;
}
}
void Ridley_Func_119(uint8 carry) { // 0xA6DA8B
VramWriteEntry *v3;
uint16 v1 = addr_off_A6DAD0;
if (carry)
v1 = addr_off_A6DAD4;
uint16 v2 = vram_write_queue_tail;
v3 = gVramWriteEntry(vram_write_queue_tail);
*(VoidP *)((uint8 *)&v3->src.addr + 1) = -20480;
*(VoidP *)((uint8 *)&v3[1].src.addr + 1) = -20480;
const uint8 *v4 = RomPtr_A6(v1);
v3->src.addr = GET_WORD(v4);
v3[1].src.addr = GET_WORD(v4 + 2);
v3->vram_dst = 31424;
v3[1].vram_dst = 31680;
v3->size = 128;
v3[1].size = 128;
vram_write_queue_tail = v2 + 14;
gVramWriteEntry(v2 + 14)->size = 0;
}
void Ridley_Func_120(void) { // 0xA6DAD8
int16 ridley_var_10;
Enemy_Ridley *E = Get_Ridley(0);
ridley_var_10 = E->ridley_var_10;
if (ridley_var_10) {
if (ridley_var_10 == 1)
return;
ridley_var_10 = 10;
}
uint16 v2 = g_off_A6DB02[E->ridley_var_07 + ridley_var_10];
sub_A6DC13(v2, E->base.x_pos, E->base.y_pos, E->ridley_var_0C);
}
void sub_A6DB2A(void) { // 0xA6DB2A
if ((gEnemyData(0)->properties & kEnemyProps_Invisible) == 0) {
sub_A6DBC2(kRidley_Ilist_DCBA[(uint8)((LOBYTE(tilemap_stuff[71]) + LOBYTE(tilemap_stuff[81]) + 8) & 0xF0) >> 4],
tilemap_stuff[82], tilemap_stuff[83]);
sub_A6DBC2(0xDC9E, tilemap_stuff[72], tilemap_stuff[73]);
sub_A6DBC2(0xDC9E, tilemap_stuff[62], tilemap_stuff[63]);
sub_A6DBC2(0xDC97, tilemap_stuff[52], tilemap_stuff[53]);
sub_A6DBC2(0xDC97, tilemap_stuff[42], tilemap_stuff[43]);
sub_A6DBC2(0xDC90, tilemap_stuff[32], tilemap_stuff[33]);
sub_A6DBC2(0xDC90, tilemap_stuff[22], tilemap_stuff[23]);
}
}
void sub_A6DBC2(uint16 j, uint16 x, uint16 y) { // 0xA6DBC2
sub_A6DC13(j, x, y, Get_Ridley(0)->ridley_var_0C);
}
uint16 CallBabyMetroidInstr(uint32 ea, uint16 k) {
switch (ea) {
case fnBabyMetroid_Instr_2: return BabyMetroid_Instr_2(k);
case fnBabyMetroid_Instr_3: return BabyMetroid_Instr_3(k);
case fnBabyMetroid_Instr_1: return BabyMetroid_Instr_1(k);
case fnBabyMetroid_Instr_4: return BabyMetroid_Goto(k);
default: return Unreachable();
}
}
typedef struct BabyMetroidExecState {
uint16 ip;
uint16 timer;
} BabyMetroidExecState;
static int BabyMetroid_DBCB_DoubleRetEx(uint16 a) {
BabyMetroidExecState *st = (BabyMetroidExecState *)&g_ram[a];
if ((st->ip & 0x8000) == 0)
return -1; // double ret
uint16 v2 = st->ip;
const uint16 *v3 = (uint16 *)RomPtr_A6(v2);
if (sign16(v3[0]))
goto LABEL_7;
if (st->timer != v3[0]) {
st->timer++;
return v3[1];
}
v2 += 4;
for (; ; ) {
v3 = (uint16 *)RomPtr_A6(v2);
if (!sign16(v3[0]))
break;
LABEL_7:
v2 = CallBabyMetroidInstr(v3[0] | 0xA60000, v2 + 2);
}
st->timer = 1;
st->ip = v2;
return v3[1];
}
void sub_A6DC13(uint16 j, uint16 r18, uint16 r20, uint16 r22) { // 0xA6DC13
const uint8 *p = RomPtr_A6(j);
int n = GET_WORD(p);
p += 2;
int idx = oam_next_ptr;
do {
int16 v9 = r20 + (int8)p[2] - layer1_y_pos;
if (v9 >= 0 && sign16(v9 - 224)) {
uint16 x = r18 + GET_WORD(p) - layer1_x_pos;
OamEnt *v11 = gOamEnt(idx);
v11->xcoord = x;
v11->ycoord = v9;
*(uint16 *)&v11->charnum = r22 | GET_WORD(p + 3);
oam_ext[idx >> 5] |= (((x & 0x100) >> 8) | (*(int16 *)p < 0) * 2) << (2 * ((idx >> 2) & 7));
idx = (idx + 4) & 0x1FF;
}
p += 5;
} while (--n);
oam_next_ptr = idx;
}
uint8 Ridley_Func_121(void) { // 0xA6DE7A
int16 y_pos;
int16 v2;
int16 x_pos;
int16 v4;
Enemy_Ridley *E = Get_Ridley(0);
y_pos = E->base.y_pos;
uint8 result = 1;
if (y_pos >= 0) {
v2 = y_pos + 32 - layer1_y_pos;
if (v2 >= 0) {
if (sign16(v2 - 288)) {
x_pos = E->base.x_pos;
if (x_pos >= 0) {
v4 = x_pos + 32 - layer1_x_pos;
if (v4 >= 0) {
if (sign16(v4 - 320))
return 0;
}
}
}
}
}
return result;
}
uint16 Ridley_Func_122(Rect16U rect) { // 0xA6DEA6
int16 v2;
if (!projectile_counter)
return 0xffff;
uint16 result = 0;
while (1) {
int v1 = result >> 1;
v2 = projectile_type[v1];
if (v2 < 0) {
if (sign16((HIBYTE(v2) & 0xF) - 3)) {
uint16 v3 = abs16(projectile_x_pos[v1] - rect.x);
bool v4 = v3 < projectile_x_radius[v1];
uint16 v5 = v3 - projectile_x_radius[v1];
if (v4 || v5 < rect.w) {
uint16 v6 = abs16(projectile_y_pos[v1] - rect.y);
v4 = v6 < projectile_y_radius[v1];
uint16 v7 = v6 - projectile_y_radius[v1];
if (v4 || v7 < rect.h)
break;
}
}
}
result += 2;
if ((int16)(result - 10) >= 0)
return 0xffff;
}
int v8 = result >> 1;
projectile_x_pos[v8] = rect.x;
projectile_y_pos[v8] = rect.y;
projectile_dir[v8] |= 0x10;
return result;
}
void Ridley_Func_123(uint16 j) { // 0xA6DF08
int v1 = j >> 1;
uint16 v2;
if ((projectile_dir[v1] & 0xF) == 7) {
v2 = 1;
} else if ((projectile_dir[v1] & 0xF) == 2) {
v2 = 8;
} else {
v2 = 5;
}
projectile_dir[v1] = v2;
}
uint8 Ridley_Func_124(Rect16U rect) { // 0xA6DF29
uint16 v0 = abs16(samus_x_pos - rect.x);
bool v1 = v0 < samus_x_radius;
uint16 v2 = v0 - samus_x_radius;
if (v1 || v2 < rect.w) {
uint16 v3 = abs16(samus_y_pos - rect.y);
v1 = v3 < samus_y_radius;
uint16 v4 = v3 - samus_y_radius;
if (v1 || v4 < rect.h)
return 1;
}
return 0;
}
void sub_A6DF59(void) { // 0xA6DF59
NormalEnemyTouchAiSkipDeathAnim_CurEnemy();
}
void sub_A6DF60(void) { // 0xA6DF60
Ridley_Func_125();
}
void Ridley_Func_125(void) { // 0xA6DF66
Ridley_Func_98();
samus_invincibility_timer = 96;
samus_knockback_timer = 5;
knockback_x_dir = (int16)(samus_x_pos - Get_Ridley(cur_enemy_index)->base.x_pos) >= 0;
}
void Ridley_Shot(void) { // 0xA6DF8A
int16 v0;
if (area_index == 2) {
NormalEnemyShotAiSkipDeathAnim_CurEnemy();
} else {
v0 = 13;
Enemy_Ridley *E = Get_Ridley(0);
uint16 flash_timer = E->base.flash_timer;
if (flash_timer) {
if (flash_timer & 1)
v0 = 14;
}
E->base.flash_timer = v0;
++E->ridley_var_0D;
}
}
void Ridley_Powerbomb(void) { // 0xA6DFB2
NormalEnemyPowerBombAiSkipDeathAnim_CurEnemy();
}
void Ridley_Func_126(void) { // 0xA6DFB7
Enemy_Ridley *E = Get_Ridley(0);
if (!E->base.health && (E->ridley_var_01 & 0x8000) == 0) {
E->ridley_var_01 = -1;
E->base.properties |= kEnemyProps_Tangible;
E->ridley_var_A = FUNC16(Ridley_Func_63);
}
}
void Ridley_Func_127(void) { // 0xA6DFD9
Rect16U rect = { tilemap_stuff[82], tilemap_stuff[83], 14, 14 };
if (Ridley_Func_124(rect)) {
Enemy_Ridley *E = Get_Ridley(0);
Samus_DealDamage(SuitDamageDivision(E->ridley_var_1C));
samus_invincibility_timer = 96;
samus_knockback_timer = 5;
knockback_x_dir = (int16)(samus_x_pos - tilemap_stuff[82]) >= 0;
}
}
void Ridley_Func_128(void) { // 0xA6E01B
Enemy_Ridley *E = Get_Ridley(cur_enemy_index);
uint16 r18 = (uint8)-CalculateAngleFromXY(projectile_x_pos[0] - E->base.x_pos, projectile_y_pos[0] - E->base.y_pos);
uint16 v1 = 4 * projectile_damage[collision_detection_index];
if (v1 >= 0x300)
v1 = 768;
uint16 a = v1;
r18 = Math_MultBySin(v1, r18);
if (((E->ridley_var_B ^ r18) & 0x8000) != 0)
E->ridley_var_B += r18;
r18 = Math_MultByCos(a, r18);
if (((E->ridley_var_C ^ r18) & 0x8000) != 0)
E->ridley_var_C += r18;
}
void Ridley_Func_129(void) { // 0xA6E088
if ((Get_Ridley(0)->base.properties & kEnemyProps_Tangible) == 0) {
uint16 v0 = Ridley_Func_122((Rect16U) { tilemap_stuff[82], tilemap_stuff[83], 14, 14});
if (sign16(v0)) {
v0 = Ridley_Func_122((Rect16U) { tilemap_stuff[72], tilemap_stuff[73], 10, 10 });
if (sign16(v0))
return;
}
int v1 = v0 >> 1;
eproj_spawn_pt = (Point16U){ projectile_x_pos[v1], projectile_y_pos[v1] };
uint16 v2 = 12;
if ((HIBYTE(projectile_type[v1]) & 0xF) == 1) {
QueueSfx1_Max6(0x3D);
v2 = 6;
}
SpawnEprojWithRoomGfx(0xE509, v2);
}
}
const uint16 *Ridley_Instr_5(uint16 k, const uint16 *jp) { // 0xA6E4BE
Get_Ridley(0)->ridley_var_0F = 89;
QueueSfx2_Max6(0x59);
return jp;
}
const uint16 *Ridley_Instr_6(uint16 k, const uint16 *jp) { // 0xA6E4CA
Get_Ridley(0)->ridley_var_0F = 0;
return jp;
}
const uint16 *Ridley_Instr_10(uint16 k, const uint16 *jp) { // 0xA6E4D2
if (area_index == 2 || !sign16(samus_health - 30))
return jp + 1;
Get_Ridley(0)->ridley_var_00 = 8;
return INSTR_RETURN_ADDR(jp[0]);
}
const uint16 *Ridley_Instr_4(uint16 k, const uint16 *jp) { // 0xA6E4EE
if (Get_Ridley(0)->ridley_var_1B)
return INSTR_RETURN_ADDR(jp[0]);
else
return INSTR_RETURN_ADDR(jp[1]);
}
const uint16 *Ridley_Instr_3(uint16 k, const uint16 *jp) { // 0xA6E4F8
if (Get_Ridley(0)->ridley_var_1B)
return jp + 1;
else
return INSTR_RETURN_ADDR(jp[0]);
}
const uint16 *Ridley_Instr_2(uint16 k, const uint16 *jp) { // 0xA6E501
samus_prev_x_pos = samus_x_pos;
samus_prev_y_pos = samus_y_pos;
Get_Ridley(0)->ridley_var_1D = jp[0];
return jp + 1;
}
const uint16 *Ridley_Instr_1(uint16 k, const uint16 *jp) { // 0xA6E517
if (Get_Ridley(0)->ridley_var_10)
return INSTR_RETURN_ADDR(jp[0]);
else
return jp + 1;
}
const uint16 *Ridley_Instr_14(uint16 k, const uint16 *jp) { // 0xA6E51F
Enemy_Ridley *E = Get_Ridley(0);
E->base.x_pos += jp[0];
E->base.y_pos += jp[1];
return jp + 2;
}
const uint16 *Ridley_Instr_9(uint16 k, const uint16 *jp) { // 0xA6E71C
Get_Ridley(0)->ridley_var_10 = 0;
Ridley_Func_96();
return jp;
}
const uint16 *Ridley_Instr_7(uint16 k, const uint16 *jp) { // 0xA6E727
Get_Ridley(0)->ridley_var_10 = 1;
return jp;
}
const uint16 *Ridley_Instr_8(uint16 k, const uint16 *jp) { // 0xA6E72F
Get_Ridley(0)->ridley_var_10 = 2;
Ridley_Func_96();
return jp;
}
void Ridley_Func_131(uint16 k) { // 0xA6E828
Ridley_Func_132(k, 0);
Ridley_Func_132(k, 1);
Ridley_Func_132(k, 2);
Ridley_Func_132(k, 3);
}
void Ridley_Func_132(uint16 k, uint16 a) { // 0xA6E840
Get_Ridley(0)->ridley_parameter_1 = a;
SpawnEprojWithGfx(a, k, addr_stru_869634);
}
const uint16 *Ridley_Instr_11(uint16 k, const uint16 *jp) { // 0xA6E84D
uint16 r18;
Enemy_Ridley *E = Get_Ridley(0);
if (E->ridley_var_10) {
uint16 v4 = (uint8)-(CalculateAngleFromXY(samus_x_pos - (E->base.x_pos + 25), samus_y_pos - (E->base.y_pos - 43)) + 0x80);
if (v4 < 0x50) {
if (v4 >= 0x15)
goto LABEL_13;
} else if (v4 < 0xC0) {
v4 = 80;
LABEL_13:
r18 = v4;
goto LABEL_14;
}
v4 = 21;
goto LABEL_13;
}
uint16 v3;
v3 = (uint8)-(CalculateAngleFromXY(samus_x_pos - (E->base.x_pos - 25), samus_y_pos - (E->base.y_pos - 43)) + 0x80);
if (v3 >= 0xB0) {
if (v3 < 0xEB)
goto LABEL_7;
LABEL_6:
v3 = 235;
goto LABEL_7;
}
if (v3 < 0x40)
goto LABEL_6;
v3 = 176;
LABEL_7:
r18 = v3;
LABEL_14:
E->ridley_var_19 = Math_MultBySin(0x500, r18);
E->ridley_var_1A = Math_MultByCos(0x500, r18);
return jp;
}
const uint16 *Ridley_Instr_12(uint16 k, const uint16 *jp) { // 0xA6E904
return Ridley_E90C(k, jp, 0);
}
const uint16 *Ridley_Instr_13(uint16 k, const uint16 *jp) { // 0xA6E909
return Ridley_E90C(k, jp, 0xe);
}
const uint16 *Ridley_E90C(uint16 k, const uint16 *jp, uint16 a) { // 0xA6E90C
eproj_unk1995 = a;
Enemy_Ridley *E = Get_Ridley(0);
SpawnEprojWithRoomGfx(0x9642, E->ridley_var_10);
return jp;
}
const uint16 *Ridley_Instr_15(uint16 k, const uint16 *jp) { // 0xA6E969
Enemy_Ridley *E = Get_Ridley(0);
E->ridley_var_A = FUNC16(CeresRidley_Func_9);
E->ridley_var_C = -352;
return jp;
}
const uint16 *Ridley_Instr_16(uint16 k, const uint16 *jp) { // 0xA6E976
Enemy_Ridley *E = Get_Ridley(0);
E->ridley_var_A = FUNC16(Ridley_Func_3);
E->ridley_var_C = -352;
return jp;
}
void CeresSteam_Init(void) { // 0xA6EFB1
Enemy_CeresSteam *E = Get_CeresSteam(cur_enemy_index);
E->base.vram_tiles_index = 0;
E->base.properties |= kEnemyProps_DisableSamusColl;
E->base.extra_properties |= 4;
E->base.instruction_timer = 1;
E->base.timer = 0;
E->base.palette_index = 2560;
E->csm_var_D = (NextRandom() & 0x1F) + 1;
int v1 = E->csm_parameter_1;
E->base.current_instruction = g_off_A6EFF5[v1];
E->csm_var_A = g_off_A6F001[v1];
}
void CallCeresSteamFunc(uint32 ea, uint16 k) {
switch (ea) {
case fnnullsub_350: return; // 0xa6eff4
case fnCeresSteam_Func_1: CeresSteam_Func_1(k); return; // 0xa6f019
default: Unreachable();
}
}
void CeresSteam_Main(void) { // 0xA6F00D
Enemy_CeresSteam *E = Get_CeresSteam(cur_enemy_index);
E->base.health = 0x7FFF;
CallCeresSteamFunc(E->csm_var_A | 0xA60000, cur_enemy_index);
}
void CeresSteam_Func_1(uint16 k) { // 0xA6F019
Enemy_CeresSteam *E = Get_CeresSteam(k);
Point16U pt = CalcCeresSteamPos_Mode7((Point16U) { E->base.x_pos, E->base.y_pos });
EnemySpawnData *v3 = gEnemySpawnData(cur_enemy_index);
v3->xpos2 = pt.x - E->base.x_pos;
v3->ypos2 = pt.y - E->base.y_pos;
}
void CeresSteam_Touch(void) { // 0xA6F03F
Get_CeresSteam(cur_enemy_index)->base.health = 0x7FFF;
NormalEnemyTouchAi();
}
const uint16 *CeresSteam_Instr_1(uint16 k, const uint16 *jp) { // 0xA6F11D
Enemy_CeresSteam *E = Get_CeresSteam(k);
E->base.properties |= kEnemyProps_Tangible | kEnemyProps_Invisible;
return jp;
}
const uint16 *CeresSteam_Instr_2(uint16 k, const uint16 *jp) { // 0xA6F127
Enemy_CeresSteam *E = Get_CeresSteam(k);
if (E->csm_var_D-- != 1)
return INSTR_RETURN_ADDR(jp[0]);
return CeresSteam_Instr_3(k, (uint16 *)RomPtr_A6(jp[1]));
}
const uint16 *CeresSteam_Instr_3(uint16 k, const uint16 *jp) { // 0xA6F135
Enemy_CeresSteam *E = Get_CeresSteam(k);
E->base.properties &= 0xFAFF;
return jp;
}
const uint16 *CeresDoor_Instr_6(uint16 k, const uint16 *jp) { // 0xA6F63E
Enemy_CeresDoor *E = Get_CeresDoor(k);
if (abs16(E->base.x_pos - samus_x_pos) >= 0x30 || abs16(E->base.y_pos - samus_y_pos) >= 0x30)
return INSTR_RETURN_ADDR(*jp);
else
return jp + 1;
}
const uint16 *CeresDoor_Instr_4(uint16 k, const uint16 *jp) { // 0xA6F66A
if (*(uint16 *)&boss_bits_for_area[area_index] & 1)
return jp + 1;
else
return INSTR_RETURN_ADDR(*jp);
}
const uint16 *CeresDoor_Instr_8(uint16 k, const uint16 *jp) { // 0xA6F678
if (ceres_status)
return jp + 1;
else
return INSTR_RETURN_ADDR(*jp);
}
void CeresDoor_Func_6b(void) { // 0xA6F67F
if (ceres_status)
ceres_status = 0x8000;
}
const uint16 *CeresSteam_Instr_4(uint16 k, const uint16 *jp) { // 0xA6F68B
Enemy_CeresSteam *E = Get_CeresSteam(k);
E->base.properties |= kEnemyProps_Tangible;
return jp;
}
const uint16 *CeresDoor_Instr_1(uint16 k, const uint16 *jp) { // 0xA6F695
Enemy_CeresDoor *E = Get_CeresDoor(k);
E->base.properties &= ~kEnemyProps_Tangible;
return jp;
}
const uint16 *CeresDoor_Instr_3(uint16 k, const uint16 *jp) { // 0xA6F69F
Get_CeresDoor(k)->cdr_var_B = 1;
return jp;
}
const uint16 *CeresSteam_Instr_5(uint16 k, const uint16 *jp) { // 0xA6F6A6
Enemy_CeresSteam *E = Get_CeresSteam(k);
E->base.properties |= kEnemyProps_Invisible;
return jp;
}
const uint16 *CeresDoor_Instr_5(uint16 k, const uint16 *jp) { // 0xA6F6B0
Get_CeresDoor(k)->cdr_var_B = 0;
return CeresDoor_Instr_2(k, jp);
}
const uint16 *CeresDoor_Instr_2(uint16 k, const uint16 *jp) { // 0xA6F6B3
Enemy_CeresDoor *E = Get_CeresDoor(k);
E->base.properties &= ~kEnemyProps_Invisible;
return jp;
}
const uint16 *CeresDoor_Instr_7(uint16 k, const uint16 *jp) { // 0xA6F6BD
QueueSfx3_Max6(0x2C);
return jp;
}
void CeresDoor_Init(void) { // 0xA6F6C5
Enemy_CeresDoor *E = Get_CeresDoor(cur_enemy_index);
E->base.spritemap_pointer = addr_kCeresDoor_Sprmap_FAC7;
E->base.instruction_timer = 1;
E->base.timer = 0;
E->base.vram_tiles_index = 0;
E->base.palette_index = 1024;
int v2 = E->cdr_parameter_1;
E->cdr_var_A = g_off_A6F72B[v2];
E->base.current_instruction = g_off_A6F52C[v2];
E->cdr_var_B = 0;
CeresDoor_Func_1(cur_enemy_index);
uint16 v3;
if (ceres_status) {
v3 = addr_word_A6F50C + 2;
} else {
if (E->cdr_parameter_1 == 3) {
WriteColorsToTargetPalette(0xa6, 0x142, addr_kCeresDoor_Palette + 2, 0xF);
return;
}
v3 = addr_kCeresDoor_Palette + 2;
}
Get_CeresDoor(cur_enemy_index)->base.palette_index = 3584;
WriteColorsToTargetPalette(0xa6, 0x1E2, v3, 0xF);
}
void CeresDoor_Func_1(uint16 k) { // 0xA6F739
VramWriteEntry *v2;
if (Get_CeresDoor(k)->cdr_parameter_1 == 2) {
uint16 v1 = vram_write_queue_tail;
v2 = gVramWriteEntry(vram_write_queue_tail);
v2->size = 1024;
*(VoidP *)((uint8 *)&v2->src.addr + 1) = -20480;
v2->src.addr = -15360;
v2->vram_dst = 28672;
vram_write_queue_tail = v1 + 7;
}
}
void CallCeresDoor(uint32 ea) {
uint16 k = cur_enemy_index;
switch (ea) {
case fnCeresDoor_Func_2: CeresDoor_Func_2(); return; // 0xa6f76b
case fnCeresDoor_Func_3: CeresDoor_Func_3(); return; // 0xa6f770
case fnCeresDoor_Func_4: CeresDoor_Func_4(); return; // 0xa6f7a5
case fnCeresDoor_Func_5: CeresDoor_Func_5(k); return; // 0xa6f7bd
case fnCeresDoor_Func_6: CeresDoor_Func_6(k); return; // 0xa6f7dc
case fnCeresDoor_Func_7: CeresDoor_Func_7(); return; // 0xa6f850
default: Unreachable();
}
}
void CeresDoor_Main(void) { // 0xA6F765
Enemy_CeresDoor *E = Get_CeresDoor(cur_enemy_index);
CallCeresDoor(E->cdr_var_A | 0xA60000);
}
void CeresDoor_Func_2(void) { // 0xA6F76B
CeresDoor_F773(0x14);
}
void CeresDoor_Func_3(void) { // 0xA6F770
CeresDoor_F773(0x1D);
}
void CeresDoor_F773(uint16 j) { // 0xA6F773
if (ceres_status >= 2 && !earthquake_timer) {
if ((random_number & 0xFFF) < 0x80) {
earthquake_timer = 4;
earthquake_type = j + 6;
} else {
earthquake_timer = 2;
earthquake_type = j;
}
}
}
void CeresDoor_Func_4(void) { // 0xA6F7A5
CeresSteam_Instr_5(cur_enemy_index, 0);
if (ceres_status & 1) {
Get_CeresDoor(cur_enemy_index)->base.palette_index = 3584;
CeresDoor_Instr_2(cur_enemy_index, 0);
}
}
void CeresDoor_Func_5(uint16 k) { // 0xA6F7BD
CeresDoor_Func_7();
if (ceres_status >= 2) {
Enemy_CeresDoor *E = Get_CeresDoor(k);
E->cdr_var_A = FUNC16(CeresDoor_Func_6);
E->cdr_var_D = 48;
Enemy_CeresDoor *E0 = Get_CeresDoor(0);
E0->cdr_var_E = 0;
E0->cdr_var_F = 0;
}
}
void CeresDoor_Func_6(uint16 k) { // 0xA6F7DC
Enemy_CeresDoor *E = Get_CeresDoor(k);
bool v3 = (--E->cdr_var_D & 0x8000) != 0;
if (v3) {
E->base.properties |= kEnemyProps_Invisible;
E->cdr_var_A = FUNC16(CeresDoor_Func_7);
CeresDoor_Func_6b();
} else {
Enemy_CeresDoor *E0 = Get_CeresDoor(0);
v3 = (--E0->cdr_var_E & 0x8000) != 0;
if (v3) {
E0->cdr_var_E = 4;
v3 = (--E0->cdr_var_F & 0x8000) != 0;
if (v3)
E0->cdr_var_F = 3;
int v5 = (uint16)(4 * E0->cdr_var_F) >> 1;
eproj_spawn_pt = (Point16U){ E->base.x_pos + g_word_A6F840[v5], E->base.y_pos + g_word_A6F840[v5 + 1] };
uint16 v6 = 3;
if (NextRandom() < 0x4000)
v6 = 12;
SpawnEprojWithRoomGfx(0xE509, v6);
QueueSfx2_Max6(0x25);
}
}
}
void CeresDoor_Func_7(void) { // 0xA6F850
CeresDoor_Func_8();
if (!palette_change_num)
WriteColorsToPalette(
0x52,
0xa6, 2 * (nmi_frame_counter_word & 0x38) - 0x78F,
6);
}
void CeresDoor_Func_8(void) { // 0xA6F8F1
QueueMode7Transfers(0xA6, g_off_A6F900[(nmi_frame_counter_word & 2) >> 1]);
}
void Zebetites_Init(void) { // 0xA6FB72
Enemy_Zebetites *E = Get_Zebetites(cur_enemy_index);
E->base.properties |= 0xA000;
E->base.instruction_timer = 1;
E->base.timer = 0;
E->base.palette_index = 1024;
E->base.vram_tiles_index = 128;
E->zebet_var_C = 0;
uint16 v1 = FUNC16(Zebetites_Func_1);
if (E->zebet_parameter_1)
v1 = FUNC16(Zebetites_Func_2);
E->zebet_var_A = v1;
uint16 r18 = 0;
r18 = (r18 << 1) | CheckEventHappened(5);
r18 = (r18 << 1) | CheckEventHappened(4);
r18 = (r18 << 1) | CheckEventHappened(3);
uint16 v2 = r18;
E->zebet_var_D = r18;
if (sign16(v2 - 4)) {
int v3 = v2;
E->zebet_var_F = g_word_A6FC03[v3];
E->base.y_height = g_word_A6FC0B[v3];
E->base.current_instruction = g_off_A6FC13[v3];
E->base.x_pos = g_word_A6FC1B[v3];
uint16 v4;
if (E->zebet_parameter_1)
v4 = g_word_A6FC2B[v3];
else
v4 = g_word_A6FC23[v3];
E->base.y_pos = v4;
} else {
E->base.properties |= kEnemyProps_Deleted;
}
}
void CallZebetitesFunc(uint32 ea, uint16 k) {
switch (ea) {
case fnZebetites_Func_1: Zebetites_Func_1(k); return;
case fnZebetites_Func_2: Zebetites_Func_2(k); return;
case fnZebetites_Func_3: Zebetites_Func_3(); return;
default: Unreachable();
}
}
void Zebetites_Main(void) { // 0xA6FC33
if (!earthquake_timer)
Get_Zebetites(cur_enemy_index)->base.shake_timer = 0;
Enemy_Zebetites *E = Get_Zebetites(cur_enemy_index);
CallZebetitesFunc(E->zebet_var_A | 0xA60000, cur_enemy_index);
}
void Zebetites_Func_1(uint16 k) { // 0xA6FC41
Enemy_Zebetites *E = Get_Zebetites(k);
if ((E->zebet_var_F & 0x8000) != 0) {
uint16 new_k = Zebetites_Func_9();
Get_Zebetites(new_k)->zebet_parameter_2 = k;
Get_Zebetites(k)->zebet_parameter_2 = new_k;
}
Get_Zebetites(k)->zebet_var_A = FUNC16(Zebetites_Func_2);
Zebetites_Func_2(k);
}
void Zebetites_Func_2(uint16 k) { // 0xA6FC5B
if (!door_transition_flag_elevator_zebetites) {
Get_Zebetites(k)->zebet_var_A = FUNC16(Zebetites_Func_3);
Zebetites_Func_3();
}
}
void Zebetites_Func_3(void) { // 0xA6FC67
int16 v3;
Zebetites_Func_4();
Zebetites_Func_5();
Enemy_Zebetites *E = Get_Zebetites(cur_enemy_index);
uint16 health = E->base.health;
if (health) {
v3 = health + 1;
if (!sign16(v3 - 1000))
v3 = 1000;
E->base.health = v3;
} else if (E->zebet_parameter_1
|| (Zebetites_Func_6(), !sign16(E->zebet_var_D - 4))) {
EnemyDeathAnimation(cur_enemy_index, 0);
} else {
EnemyDeathAnimation(cur_enemy_index, 0);
Zebetites_Func_8();
}
}
void Zebetites_Func_6(void) { // 0xA6FCAA
int16 v1;
Enemy_Zebetites *E = Get_Zebetites(cur_enemy_index);
v1 = E->zebet_var_D + 1;
E->zebet_var_D = v1;
uint16 r18 = v1;
Zebetites_Func_7(3, (r18 >> 0) & 1);
Zebetites_Func_7(4, (r18 >> 1) & 1);
Zebetites_Func_7(5, (r18 >> 2) & 1);
}
void Zebetites_Func_7(uint16 j, uint8 a) { // 0xA6FCCB
if (a)
SetEventHappened(j);
else
ClearEventHappened(j);
}
void Zebetites_Func_8(void) { // 0xA6FCD9
SpawnEnemy(0xA6, addr_stru_A6FCE1);
}
uint16 Zebetites_Func_9(void) { // 0xA6FCF1
return SpawnEnemy(0xA6, addr_stru_A6FCF9);
}
void Zebetites_Func_5(void) { // 0xA6FD09
uint16 v0 = 0;
Enemy_Zebetites *E = Get_Zebetites(cur_enemy_index);
uint16 health = E->base.health;
if (sign16(health - 800)) {
v0 = 2;
if (sign16(health - 600)) {
v0 = 4;
if (sign16(health - 400)) {
v0 = 6;
if (sign16(health - 200))
v0 = 8;
}
}
}
int v3 = v0 >> 1;
uint16 v4 = g_off_A6FD4A[v3];
if ((E->zebet_var_F & 0x8000) != 0)
v4 = g_off_A6FD54[v3];
E->base.current_instruction = v4;
E->base.instruction_timer = 1;
E->base.timer = 0;
}
void Zebetites_Func_4(void) { // 0xA6FD5E
if (!palette_change_num && !Get_Zebetites(cur_enemy_index)->zebet_parameter_1) {
Enemy_Zebetites *E = Get_Zebetites(0);
uint16 v1 = (E->zebet_var_C + 1) & 7;
E->zebet_var_C = v1;
WriteColorsToPalette(0x158, 0xa6, 4 * v1 - 0x279, 2);
}
}
void Zebetites_Touch(void) { // 0xA6FDA7
NormalEnemyTouchAiSkipDeathAnim_CurEnemy();
}
void Zebetites_Shot(void) { // 0xA6FDAC
QueueSfx3_Max6(9);
NormalEnemyShotAiSkipDeathAnim_CurEnemy();
Enemy_Zebetites *E = Get_Zebetites(cur_enemy_index);
Enemy_Zebetites *G = Get_Zebetites(E->zebet_parameter_2);
G->base.health = E->base.health;
G->base.flash_timer = E->base.flash_timer;
}