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