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