4945 lines
141 KiB
C
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;
|
|
}
|