Files
sm-vita/src/sm_a9.c
2023-03-07 00:23:44 +01:00

6852 lines
223 KiB
C

// Enemy AI - Mother Brain(complete), Shitroid &dead monsters
#include "ida_types.h"
#include "variables.h"
#include "funcs.h"
#include "enemy_types.h"
#include "sm_rtl.h"
#define g_word_A98929 ((uint16*)RomPtr(0xa98929))
static const uint16 g_word_A98B5D[5] = { 0x10, 0x10, 8, 8, 0x10 };
static const uint16 g_word_A98B67[5] = { 0x20, 0x20, 0x18, 0x18, 0x20 };
static const uint16 g_word_A98B71[5] = { 0xf8, 0xf8, 0xf0, 0xf0, 0xf6 };
#define g_off_A98B7B ((uint16*)RomPtr(0xa98b7b))
static const uint16 g_word_A98C61[4] = { 0xfff8, 2, 0xfffc, 6 };
static const uint8 g_byte_A98F7D[2] = { 9, 0x12 };
static const uint16 g_word_A98F7F[8] = { 0x3d, 0x54, 0x20, 0x35, 0x5a, 0x43, 0x67, 0x29 };
static const int16 g_word_A993BB[4] = { 0, -1, 0, 1 };
static const int16 g_word_A993C3[4] = { 0, 1, -1, 1 };
static const uint16 g_word_A99E0F[13] = { 0x6f, 0x6f, 0x6f, 0x7e, 0x6f, 0x6f, 0x7e, 0x6f, 0x6f, 0x7e, 0x7e, 0x6f, 0x6f };
#define g_word_A9B099 ((uint16*)RomPtr(0xa9b099))
#define g_word_A9B109 ((uint16*)RomPtr(0xa9b109))
#define g_word_A9B10F ((uint16*)RomPtr(0xa9b10f))
static const uint16 g_word_A9B393[8] = { 8, 0x6c, 0x18, 0x80, 9, 0x90, 0x18, 0x74 };
static const uint8 g_byte_A9B546[8] = { 0, 1, 1, 0, 0, 0, 0, 0 };
static const uint8 g_byte_A9B5A1[8] = { 2, 1, 1, 0, 0, 0, 0, 0 };
#define g_off_A9B6D4 ((uint16*)RomPtr(0xa9b6d4))
static const uint8 g_byte_A9B6DC[3] = { 0x40, 0x80, 0xc0 };
static const uint8 g_byte_A9B6DF[3] = { 0x10, 0x20, 0xd0 };
static const int16 g_word_A9B72C[28] = {
-1, -17, 0, 0, -1, -1, 0, -1, 0, 0, -1, 0, 0, 0, -17, -1,
-1, -1, 0, 0, 0, -17, -1, -1, -1, -1, -1, -1,
};
static const int16 g_word_A9BCA6[8] = { -8, 6, -4, 2, 3, -6, 8, 0 };
static const int16 g_word_A9BCB6[8] = { -7, 2, 5, -4, 6, -2, -6, 7 };
#define MotherBrain_RainbowBeamPalettes ((uint16*)RomPtr(0xade434))
static const uint8 g_byte_A9BEEE[16] = { 2, 0, 2, 0, 6, 0, 6, 0, 8, 0, 8, 0, 10, 0, 10, 0 };
static const uint16 g_word_A9BEFE[8] = { 0x500, 0x500, 0x200, 0x200, 0xc0, 0xc0, 0x40, 0x40 };
static const int16 g_word_A9C049[8] = { 0x10, 0x10, 0x20, 0x20, 0x30, 0x30, 0x40, 0x40 };
static const uint16 g_word_A9C544 = 1;
#define g_off_A9C61E ((uint16*)RomPtr(0xa9c61e))
#define g_off_A9C664 ((uint16*)RomPtr(0xa9c664))
#define kShitroid_FadingToBlack ((uint16*)RomPtr(0xade8e2))
#define g_word_A9CDFC ((uint16*)RomPtr(0xa9cdfc))
#define kShitroid_HealthBasedPalettes_Shell ((uint16*)RomPtr(0xade7e2))
#define kShitroid_HealthBasedPalettes_Innards ((uint16*)RomPtr(0xade882))
#define g_off_A9D260 ((uint16*)RomPtr(0xa9d260))
#define g_word_A9D583 ((uint16*)RomPtr(0xa9d583))
#define g_word_A9D549 ((uint16*)RomPtr(0xa9d549))
#define g_word_A9D67C ((uint16*)RomPtr(0xa9d67c))
#define g_word_A9D69C ((uint16*)RomPtr(0xa9d69c))
#define kDeadTorizo_TileData ((uint16*)RomPtr(0xb7a800))
#define g_off_A9D86A ((uint16*)RomPtr(0xa9d86a))
#define g_off_A9D870 ((uint16*)RomPtr(0xa9d870))
#define g_off_A9D897 ((uint16*)RomPtr(0xa9d897))
#define g_off_A9D89B ((uint16*)RomPtr(0xa9d89b))
#define g_off_A9D8C0 ((uint16*)RomPtr(0xa9d8c0))
#define g_off_A9D8C6 ((uint16*)RomPtr(0xa9d8c6))
#define g_word_A9D951 ((uint16*)RomPtr(0xa9d951))
#define g_word_A9D959 ((uint16*)RomPtr(0xa9d959))
static const int8 g_byte_A9F56A[16] = { 0x10, 0xf, 0xe, 0xd, 0xc, 0xb, 0xa, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
void CallCorpseRottingMove(uint32 ea, uint16 k, uint16 j) {
switch (ea) {
case fnTorizo_CorpseRottingCopyFunc: Torizo_CorpseRottingCopyFunc(k, j); return;
case fnSidehopper_CorpseRottingCopyFunc_0: Sidehopper_CorpseRottingCopyFunc_0(k, j); return;
case fnSidehopper_CorpseRottingCopyFunc_2: Sidehopper_CorpseRottingCopyFunc_2(k, j); return;
case fnZoomer_CorpseRottingCopyFunc_0: Zoomer_CorpseRottingCopyFunc_0(k, j); return;
case fnZoomer_CorpseRottingCopyFunc_2: Zoomer_CorpseRottingCopyFunc_2(k, j); return;
case fnZoomer_CorpseRottingCopyFunc_4: Zoomer_CorpseRottingCopyFunc_4(k, j); return;
case fnRipper_CorpseRottingCopyFunc_0: Ripper_CorpseRottingCopyFunc_0(k, j); return;
case fnRipper_CorpseRottingCopyFunc_2: Ripper_CorpseRottingCopyFunc_2(k, j); return;
case fnSkree_CorpseRottingCopyFunc_0: Skree_CorpseRottingCopyFunc_0(k, j); return;
case fnSkree_CorpseRottingCopyFunc_2: Skree_CorpseRottingCopyFunc_2(k, j); return;
case fnSkree_CorpseRottingCopyFunc_4: Skree_CorpseRottingCopyFunc_4(k, j); return;
case fnMotherBrain_CorpseRottingCopyFunc: MotherBrain_CorpseRottingCopyFunc(k, j); return;
case fnTorizo_CorpseRottingMoveFunc: Torizo_CorpseRottingMoveFunc(k, j); return;
case fnSidehopper_CorpseRottingMoveFunc_0: Sidehopper_CorpseRottingMoveFunc_0(k, j); return;
case fnSidehopper_CorpseRottingMoveFunc_2: Sidehopper_CorpseRottingMoveFunc_2(k, j); return;
case fnZoomer_CorpseRottingMoveFunc_0: Zoomer_CorpseRottingMoveFunc_0(k, j); return;
case fnZoomer_CorpseRottingMoveFunc_2: Zoomer_CorpseRottingMoveFunc_2(k, j); return;
case fnZoomer_CorpseRottingMoveFunc_4: Zoomer_CorpseRottingMoveFunc_4(k, j); return;
case fnRipper_CorpseRottingMoveFunc_0: Ripper_CorpseRottingMoveFunc_0(k, j); return;
case fnRipper_CorpseRottingMoveFunc_2: Ripper_CorpseRottingMoveFunc_2(k, j); return;
case fnSkree_CorpseRottingMoveFunc_0: Skree_CorpseRottingMoveFunc_0(k, j); return;
case fnSkree_CorpseRottingMoveFunc_2: Skree_CorpseRottingMoveFunc_2(k, j); return;
case fnSkree_CorpseRottingMoveFunc_4: Skree_CorpseRottingMoveFunc_4(k, j); return;
case fnMotherBrain_CorpseRottingMoveFunc: MotherBrain_CorpseRottingMoveFunc(k, j); return;
default: Unreachable();
}
}
void CallCorpseRottingInit(uint32 ea) {
switch (ea) {
case fnTorizo_CorpseRottingInitFunc: Torizo_CorpseRottingInitFunc(); return;
case fnSidehopper_CorpseRottingInitFunc_0: Sidehopper_CorpseRottingInitFunc_0(); return;
case fnSidehopper_CorpseRottingInitFunc_2: Sidehopper_CorpseRottingInitFunc_2(); return;
case fnZoomer_CorpseRottingInitFunc_0: Zoomer_CorpseRottingInitFunc_0(); return;
case fnZoomer_CorpseRottingInitFunc_2: Zoomer_CorpseRottingInitFunc_2(); return;
case fnZoomer_CorpseRottingInitFunc_4: Zoomer_CorpseRottingInitFunc_4(); return;
case fnRipper_CorpseRottingInitFunc_0: Ripper_CorpseRottingInitFunc_0(); return;
case fnRipper_CorpseRottingInitFunc_2: Ripper_CorpseRottingInitFunc_2(); return;
case fnSkree_CorpseRottingInitFunc_0: Skree_CorpseRottingInitFunc_0(); return;
case fnSkree_CorpseRottingInitFunc_2: Skree_CorpseRottingInitFunc_2(); return;
case fnSkree_CorpseRottingInitFunc_4: Skree_CorpseRottingInitFunc_4(); return;
case fnMotherBrain_CorpseRottingInitFunc: MotherBrain_CorpseRottingInitFunc(); return;
default: Unreachable();
}
}
void CallCorpseRottingFinish(uint32 ea) {
switch (ea) {
case fnMotherBrain_CorpseRottingFinished: MotherBrain_CorpseRottingFinished(); return;
case fnDeadTorizo_CorpseRottingFinished: DeadTorizo_CorpseRottingFinished(); return;
case fnCorpseRottingRotEntryFinishedHook: CorpseRottingRotEntryFinishedHook(); return;
default: Unreachable();
}
}
void CallMotherBrainFunc(uint32 ea) {
switch (ea) {
case fnMotherBrainsBrain_SetupBrainToDraw: MotherBrainsBrain_SetupBrainToDraw(); return;
case fnMotherBrainsBody_FirstPhase_DoubleRet: Unreachable(); return;
case fnMotherBrainBody_0_Wait: MotherBrainBody_0_Wait(); return;
case fnMotherBrainBody_1_ClearBottomLeftTube: MotherBrainBody_1_ClearBottomLeftTube(); return;
case fnMotherBrainBody_2_SpawnTopRightTubeFalling: MotherBrainBody_2_SpawnTopRightTubeFalling(); return;
case fnMotherBrainBody_3_ClearCeilingBlock9: MotherBrainBody_3_ClearCeilingBlock9(); return;
case fnMotherBrainBody_4_SpawnTopLeftTubeFalling: MotherBrainBody_4_SpawnTopLeftTubeFalling(); return;
case fnMotherBrainBody_4_ClearCeilingBlock6: MotherBrainBody_4_ClearCeilingBlock6(); return;
case fnMotherBrainBody_5_SpawnTubeFallingEnemy1: MotherBrainBody_5_SpawnTubeFallingEnemy1(); return;
case fnMotherBrainBody_6_ClearBottomRightTube: MotherBrainBody_6_ClearBottomRightTube(); return;
case fnMotherBrainBody_7_SpawnTubeFallingEnemy2: MotherBrainBody_7_SpawnTubeFallingEnemy2(); return;
case fnMotherBrainBody_8_ClearBottomMiddleLeftTube: MotherBrainBody_8_ClearBottomMiddleLeftTube(); return;
case fnMotherBrainBody_9_SpawnTopMiddleLeftFalling: MotherBrainBody_9_SpawnTopMiddleLeftFalling(); return;
case fnMotherBrainBody_10_ClearCeilingTubeColumn7: MotherBrainBody_10_ClearCeilingTubeColumn7(); return;
case fnMotherBrainBody_11_SpawnTopMiddleRightFalling: MotherBrainBody_11_SpawnTopMiddleRightFalling(); return;
case fnMotherBrainBody_12_ClearCeilingTubeColumn8: MotherBrainBody_12_ClearCeilingTubeColumn8(); return;
case fnMotherBrainBody_13_SpawnTubeFallingEnemy3: MotherBrainBody_13_SpawnTubeFallingEnemy3(); return;
case fnMotherBrainBody_14_ClearBottomMiddleRightTube: MotherBrainBody_14_ClearBottomMiddleRightTube(); return;
case fnMotherBrainBody_15_SpawnTubeFallingEnemy4: MotherBrainBody_15_SpawnTubeFallingEnemy4(); return;
case fnMotherBrainBody_16_ClearBottomMiddleTubes: MotherBrainBody_16_ClearBottomMiddleTubes(); return;
case fnMotherBrainBody_FakeDeath_Descent_0_Pause: MotherBrainBody_FakeDeath_Descent_0_Pause(); return;
case fnMotherBrainBody_FakeDeath_Descent_1: MotherBrainBody_FakeDeath_Descent_1(); return;
case fnMotherBrainBody_FakeDeath_Descent_2: MotherBrainBody_FakeDeath_Descent_2(); return;
case fnMotherBrainBody_FakeDeath_Descent_3: MotherBrainBody_FakeDeath_Descent_3(); return;
case fnMotherBrainBody_FakeDeath_Descent_4: MotherBrainBody_FakeDeath_Descent_4(); return;
case fnMotherBrainBody_FakeDeath_Descent_5: MotherBrainBody_FakeDeath_Descent_5(); return;
case fnMotherBrainBody_FakeDeath_Descent_6: MotherBrainBody_FakeDeath_Descent_6(); return;
case fnMotherBrainBody_FakeDeath_Ascent_0_DrawBG1Row23: MotherBrainBody_FakeDeath_Ascent_0_DrawBG1Row23(); return;
case fnMotherBrainBody_FakeDeath_Ascent_1_DrawBG1Row45: MotherBrainBody_FakeDeath_Ascent_1_DrawBG1Row45(); return;
case fnMotherBrainBody_FakeDeath_Ascent_2_DrawBG1Row67: MotherBrainBody_FakeDeath_Ascent_2_DrawBG1Row67(); return;
case fnMotherBrainBody_FakeDeath_Ascent_3_DrawBG1Row89: MotherBrainBody_FakeDeath_Ascent_3_DrawBG1Row89(); return;
case fnMotherBrainBody_FakeDeath_Ascent_4_DrawBG1RowAB: MotherBrainBody_FakeDeath_Ascent_4_DrawBG1RowAB(); return;
case fnMotherBrainBody_FakeDeath_Ascent_5_DrawBG1RowCD: MotherBrainBody_FakeDeath_Ascent_5_DrawBG1RowCD(); return;
case fnMotherBrainBody_FakeDeath_Ascent_6_SetupPhase2Gfx: MotherBrainBody_FakeDeath_Ascent_6_SetupPhase2Gfx(); return;
case fnMotherBrainBody_FakeDeath_Ascent_7_SetupPhase2Brain: MotherBrainBody_FakeDeath_Ascent_7_SetupPhase2Brain(); return;
case fnMotherBrainBody_FakeDeath_Ascent_8_Pause: MotherBrainBody_FakeDeath_Ascent_8_Pause(); return;
case fnMotherBrainBody_FakeDeath_Ascent_9_PrepareRise: MotherBrainBody_FakeDeath_Ascent_9_PrepareRise(); return;
case fnMotherBrainBody_FakeDeath_Ascent_10_LoadLegTiles: MotherBrainBody_FakeDeath_Ascent_10_LoadLegTiles(); return;
case fnMotherBrainBody_FakeDeath_Ascent_11_ContinuePause: MotherBrainBody_FakeDeath_Ascent_11_ContinuePause(); return;
case fnMotherBrainBody_FakeDeath_Ascent_12_StartMusic: MotherBrainBody_FakeDeath_Ascent_12_StartMusic(); return;
case fnMotherBrainBody_FakeDeath_Ascent_13_Raise: MotherBrainBody_FakeDeath_Ascent_13_Raise(); return;
case fnMotherBrainBody_FakeDeath_Ascent_14_WaitForUncouching: MotherBrainBody_FakeDeath_Ascent_14_WaitForUncouching(); return;
case fnMotherBrainBody_FakeDeath_Ascent_15_TransitionFromGrey: MotherBrainBody_FakeDeath_Ascent_15_TransitionFromGrey(); return;
case fnMotherBrainBody_2ndphase_16_ShakeHeadMenacingly: MotherBrainBody_2ndphase_16_ShakeHeadMenacingly(); return;
case fnMotherBrainBody_2ndphase_17_BringHeadBackUp: MotherBrainBody_2ndphase_17_BringHeadBackUp(); return;
case fnMotherBrainBody_2ndphase_18_FinishStretching: MotherBrainBody_2ndphase_18_FinishStretching(); return;
case fnMotherBrain_Phase3_Death_0: MotherBrain_Phase3_Death_0(); return;
case fnMotherBrain_Phase3_Death_1: MotherBrain_Phase3_Death_1(); return;
case fnMotherBrain_Phase3_Death_2: MotherBrain_Phase3_Death_2(); return;
case fnMotherBrain_Phase3_Death_3: MotherBrain_Phase3_Death_3(); return;
case fnMotherBrain_Phase3_Death_4: MotherBrain_Phase3_Death_4(); return;
case fnMotherBrain_Phase3_Death_5: MotherBrain_Phase3_Death_5(); return;
case fnMotherBrain_Phase3_Death_6: MotherBrain_Phase3_Death_6(); return;
case fnMotherBrain_Phase3_Death_7: MotherBrain_Phase3_Death_7(); return;
case fnMotherBrain_Phase3_Death_8: MotherBrain_Phase3_Death_8(); return;
case fnMotherBrain_Phase3_Death_9: MotherBrain_Phase3_Death_9(); return;
case fnMotherBrain_Phase3_Death_10: MotherBrain_Phase3_Death_10(); return;
case fnMotherBrain_Phase3_Death_11: MotherBrain_Phase3_Death_11(); return;
case fnMotherBrain_Phase3_Death_12: MotherBrain_Phase3_Death_12(); return;
case fnMotherBrain_Phase3_Death_13: MotherBrain_Phase3_Death_13(); return;
case fnMotherBrain_Phase3_Death_14_20framedelay: MotherBrain_Phase3_Death_14_20framedelay(); return;
case fnMotherBrain_Phase3_Death_15_LoadEscapeTimerTiles: MotherBrain_Phase3_Death_15_LoadEscapeTimerTiles(); return;
case fnMotherBrain_Phase3_Death_16_StartEscape: MotherBrain_Phase3_Death_16_StartEscape(); return;
case fnMotherBrain_Phase3_Death_17_SpawnTimeBomb: MotherBrain_Phase3_Death_17_SpawnTimeBomb(); return;
case fnMotherBrain_Phase3_Death_18_TypesZebesText: MotherBrain_Phase3_Death_18_TypesZebesText(); return;
case fnMotherBrain_Phase3_Death_19_EscapeDoorExploding: MotherBrain_Phase3_Death_19_EscapeDoorExploding(); return;
case fnMotherBrain_Phase3_Death_20_BlowUpEscapeDoor: MotherBrain_Phase3_Death_20_BlowUpEscapeDoor(); return;
case fnMotherBrain_Phase3_Death_21_KeepEarthquakeGoing: MotherBrain_Phase3_Death_21_KeepEarthquakeGoing(); return;
case fnMotherBrain_Body_Phase2_Thinking: MotherBrain_Body_Phase2_Thinking(); return;
case fnMotherBrain_Body_Phase2_TryAttack: MotherBrain_Body_Phase2_TryAttack(); return;
case fnMotherBrain_FiringBomb_DecideOnWalking: MotherBrain_FiringBomb_DecideOnWalking(); return;
case fnMotherBrain_FiringBomb_WalkingBackwards: MotherBrain_FiringBomb_WalkingBackwards(); return;
case fnMotherBrain_FiringBomb_Crouch: MotherBrain_FiringBomb_Crouch(); return;
case fnMotherBrain_FiringBomb_Fired: MotherBrain_FiringBomb_Fired(); return;
case fnMotherBrain_FiringBomb_Standup: MotherBrain_FiringBomb_Standup(); return;
case fnMotherBomb_FiringLaser_PositionHead: MotherBomb_FiringLaser_PositionHead(); return;
case fnMotherBomb_FiringLaser_PositionHeadSlowlyFire: MotherBomb_FiringLaser_PositionHeadSlowlyFire(); return;
case fnMotherBomb_FiringLaser_FinishAttack: MotherBomb_FiringLaser_FinishAttack(); return;
case fnMotherBomb_FiringDeathBeam: MotherBomb_FiringDeathBeam(); return;
case fnMotherBomb_FiringRainbowBeam_0: MotherBomb_FiringRainbowBeam_0(); return;
case fnMotherBomb_FiringRainbowBeam_1_StartCharge: MotherBomb_FiringRainbowBeam_1_StartCharge(); return;
case fnMotherBomb_FiringRainbowBeam_2_RetractNeck: MotherBomb_FiringRainbowBeam_2_RetractNeck(); return;
case fnMotherBomb_FiringRainbowBeam_3_Wait: MotherBomb_FiringRainbowBeam_3_Wait(); return;
case fnMotherBomb_FiringRainbowBeam_4_ExtendNeckDown: MotherBomb_FiringRainbowBeam_4_ExtendNeckDown(); return;
case fnMotherBomb_FiringRainbowBeam_5_StartFiring: MotherBomb_FiringRainbowBeam_5_StartFiring(); return;
case fnMotherBomb_FiringRainbowBeam_6_MoveSamusToWall: MotherBomb_FiringRainbowBeam_6_MoveSamusToWall(); return;
case fnMotherBomb_FiringRainbowBeam_7_DelayFrame: MotherBomb_FiringRainbowBeam_7_DelayFrame(); return;
case fnMotherBomb_FiringRainbowBeam_8_StartDrainSamus: MotherBomb_FiringRainbowBeam_8_StartDrainSamus(); return;
case fnMotherBomb_FiringRainbowBeam_9_DrainingSamus: MotherBomb_FiringRainbowBeam_9_DrainingSamus(); return;
case fnMotherBomb_FiringRainbowBeam_10_FinishFiringRainbow: MotherBomb_FiringRainbowBeam_10_FinishFiringRainbow(); return;
case fnMotherBomb_FiringRainbowBeam_11_LetSamusFall: MotherBomb_FiringRainbowBeam_11_LetSamusFall(); return;
case fnMotherBomb_FiringRainbowBeam_12_WaitForSamusHitGround: MotherBomb_FiringRainbowBeam_12_WaitForSamusHitGround(); return;
case fnMotherBomb_FiringRainbowBeam_13_LowerHead: MotherBomb_FiringRainbowBeam_13_LowerHead(); return;
case fnMotherBomb_FiringRainbowBeam_14_DecideNextAction: MotherBomb_FiringRainbowBeam_14_DecideNextAction(); return;
case fnMotherBrain_Phase2Cut_0: MotherBrain_Phase2Cut_0(); return;
case fnMotherBrain_Phase2Cut_1: MotherBrain_Phase2Cut_1(); return;
case fnMotherBrain_Phase2Cut_2: MotherBrain_Phase2Cut_2(); return;
case fnMotherBrain_Phase2Cut_3: MotherBrain_Phase2Cut_3(); return;
case fnMotherBrain_Phase2Cut_4: MotherBrain_Phase2Cut_4(); return;
case fnMotherBrain_Phase2Cut_5: MotherBrain_Phase2Cut_5(); return;
case fnnullsub_364: return;
case fnMotherBrain_DrainedByShitroid_0: MotherBrain_DrainedByShitroid_0(); return;
case fnMotherBrain_DrainedByShitroid_1: MotherBrain_DrainedByShitroid_1(); return;
case fnMotherBrain_DrainedByShitroid_2: MotherBrain_DrainedByShitroid_2(); return;
case fnMotherBrain_DrainedByShitroid_3: MotherBrain_DrainedByShitroid_3(); return;
case fnMotherBrain_DrainedByShitroid_4: MotherBrain_DrainedByShitroid_4(); return;
case fnMotherBrain_DrainedByShitroid_5: MotherBrain_DrainedByShitroid_5(); return;
case fnMotherBrain_DrainedByShitroid_6: MotherBrain_DrainedByShitroid_6(); return;
case fnMotherBrain_DrainedByShitroid_7: MotherBrain_DrainedByShitroid_7(); return;
case fnMotherBrain_Phase2_Revive_0: MotherBrain_Phase2_Revive_0(); return;
case fnMotherBrain_Phase2_Revive_1: MotherBrain_Phase2_Revive_1(); return;
case fnMotherBrain_Phase2_Revive_2: MotherBrain_Phase2_Revive_2(); return;
case fnMotherBrain_Phase2_Revive_3: MotherBrain_Phase2_Revive_3(); return;
case fnMotherBrain_Phase2_Revive_4: MotherBrain_Phase2_Revive_4(); return;
case fnMotherBrain_Phase2_Revive_5: MotherBrain_Phase2_Revive_5(); return;
case fnMotherBrain_Phase2_Revive_6: MotherBrain_Phase2_Revive_6(); return;
case fnMotherBrain_Phase2_Revive_7: MotherBrain_Phase2_Revive_7(); return;
case fnMotherBrain_Phase2_Revive_8: MotherBrain_Phase2_Revive_8(); return;
case fnMotherBrain_Phase2_MurderShitroid_1: MotherBrain_Phase2_MurderShitroid_1(); return;
case fnMotherBrain_Phase2_MurderShitroid_2: MotherBrain_Phase2_MurderShitroid_2(); return;
case fnMotherBrain_Phase2_PrepareForFinalShitroid: MotherBrain_Phase2_PrepareForFinalShitroid(); return;
case fnMotherBrain_Phase2_ExecuteFinalkShitroid: MotherBrain_Phase2_ExecuteFinalkShitroid(); return;
case fnnullsub_363: return;
case fnMotherBrain_Phase3_Recover_MakeDistance: MotherBrain_Phase3_Recover_MakeDistance(); return;
case fnMotherBrain_Phase3_Recover_SetupForFight: MotherBrain_Phase3_Recover_SetupForFight(); return;
case fnMotherBrain_Phase3_Fighting_Main: MotherBrain_Phase3_Fighting_Main(); return;
case fnMotherBrain_Phase3_Fighting_Cooldown: MotherBrain_Phase3_Fighting_Cooldown(); return;
case fnnullsub_365: return;
case fnnullsub_367: return;
case fnMotherBrainsBrain_SetupBrainAndNeckToDraw: MotherBrainsBrain_SetupBrainAndNeckToDraw(); return;
default: Unreachable();
}
}
void Enemy_GrappleReact_CancelBeam_A9(void) { // 0xA9800F
Enemy_SwitchToFrozenAi();
}
void Enemy_NormalFrozenAI_A9(void) { // 0xA98041
NormalEnemyFrozenAI();
}
uint16 EnemyInstr_Sleep_A9(uint16 k, uint16 j) { // 0xA9812F
gEnemyData(k)->current_instruction = j - 2;
return 0;
}
void MotherBrainsBody_Init(void) { // 0xA98687
for (int i = 4094; i >= 0; i -= 2)
tilemap_stuff[i >> 1] = 824;
MotherBrain_SetBodyInstrs(addr_kMotherBrain_Ilist_9C13);
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->base.vram_tiles_index = 0;
E->base.properties |= kEnemyProps_BlockPlasmaBeam | kEnemyProps_Tangible | kEnemyProps_Invisible;
E->base.palette_index = 0;
WriteColorsToTargetPalette(0xa9, 0x162u, addr_kMotherBrainPalette_4__plus__2, 0xFu);
WriteColorsToTargetPalette(0xa9, 0x1E2u, addr_kMotherBrainPalette_3__plus__2, 0xFu);
E->mbn_var_00 = 0;
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->mbn_var_02 = 0;
E->mbn_var_04 = 2;
E1->mbn_var_A = FUNC16(MotherBrainsBrain_SetupBrainToDraw);
E->mbn_var_A = FUNC16(MotherBrainsBody_FirstPhase_DoubleRet);
LoadFxEntry(1u);
uint16 v3 = 0, v4;
do {
v4 = v3;
SpawnEnemyProjectileWithRoomGfx(addr_kEproj_MotherBrainRoomTurrets, v3);
v3 = v4 + 1;
} while ((uint16)(v4 + 1) < 0xCu);
}
void MotherBrainsBrain_Init(void) { // 0xA98705
InitializeEnemyCorpseRotting(0x40u, addr_stru_A9DE08);
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->base.health = 3000;
MotherBrain_SetBrainUnusedInstrs(addr_kMotherBrain_Ilist_9C13);
E1->base.vram_tiles_index = 0;
E1->base.properties |= 0x1100u;
E1->base.palette_index = 512;
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_0C = 512;
E->mbn_var_0D = 512;
MotherBrain_SetBrainInstrs(addr_stru_A99C21);
MotherBrain_SetupBrainNormalPal();
}
void MotherBrainsBody_Hurt(void) { // 0xA9873E
MotherBrain_Pal_HandleRoomPal();
Enemy_MotherBrain *E = Get_MotherBrain(0);
if (E->mbn_var_A == (uint16)fnMotherBrainsBody_FirstPhase_DoubleRet) {
MotherBrainsBody_FirstPhase_DoubleRet();
return;
}
CallMotherBrainFunc(E->mbn_var_A | 0xA90000);
MotherBrain_HandlePalette();
MotherBrain_SamusCollDetect();
MotherBrain_Pal_ProcessInvincibility();
if (Get_MotherBrain(0x40u)->mbn_var_02)
mov24(&unpause_hook, fnMotherBrainsBody_UnpauseHook);
}
void MotherBrainsBody_UnpauseHook(void) { // 0xA98763
Enemy_MotherBrain *E = Get_MotherBrain(0);
if (E->mbn_var_16)
QueueSfx1_Max6(0x40u);
if ((E->base.extra_properties & 4) != 0) {
enemy_bg2_tilemap_size = 2048;
nmi_flag_bg2_enemy_vram_transfer = 1;
}
}
void MotherBrainsBody_Powerbomb(void) { // 0xA98787
NormalEnemyPowerBombAiSkipDeathAnim_CurEnemy();
MotherBrainsBrain_Hurt();
}
void MotherBrainsBrain_Hurt(void) { // 0xA9878B
mov24(&enemy_gfx_drawn_hook, 0xA98786u);
EnemyData *v0 = gEnemyData(0);
if ((v0[1].properties & 0x100) != 0)
CallMotherBrainFunc(v0[1].ai_var_A | 0xA90000);
}
void MotherBrainsBrain_SetupBrainAndNeckToDraw(void) { // 0xA987A2
if (!time_is_frozen_flag)
MotherBrain_HandleNeck();
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->base.x_pos = E1->mbn_var_2E;
E1->base.y_pos = E1->mbn_var_2F - 21;
mov24(&enemy_gfx_drawn_hook, 0xA987C9u);
}
void MotherBrain_DrawBrainNeck_EnemyGfxDrawHook(void) { // 0xA987C9
MotherBrain_DrawBrain();
MotherBrain_DrawNeck();
}
void MotherBrainsBrain_SetupBrainToDraw(void) { // 0xA987D0
mov24(&enemy_gfx_drawn_hook, 0xA987DDu);
}
void MotherBrainsBrain_GfxDrawHook(void) { // 0xA987DD
MotherBrain_DrawBrain();
}
void MotherBrainsBody_FirstPhase_DoubleRet(void) { // 0xA987E1
if (CheckEventHappened(2u)) {
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->mbn_var_00 = earthquake_timer;
if (sign16(samus_x_pos - 236)) {
if (!E1->base.health) {
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_1D = 1;
E->mbn_var_00 = 1;
DisableMinimapAndMarkBossRoomAsExplored();
QueueMusic_Delayed8(6u);
MotherBrain_SealWall();
}
}
}
MotherBrain_SamusCollDetect();
}
void MotherBrainBody_FakeDeath_Descent_0_Pause(void) { // 0xA9881D
Enemy_MotherBrainBody *E = Get_MotherBrainBody(0);
E->mbby_var_A = FUNC16(MotherBrainBody_FakeDeath_Descent_1);
E->mbby_var_F = 64;
MotherBrainBody_FakeDeath_Descent_1();
}
void MotherBrainBody_FakeDeath_Descent_1(void) { // 0xA98829
Enemy_MotherBrainBody *E = Get_MotherBrainBody(0);
if ((--E->mbby_var_F & 0x8000u) != 0) {
CallSomeSamusCode(0);
*(uint16 *)scrolls = scrolls[0];
E->mbby_var_A = FUNC16(MotherBrainBody_FakeDeath_Descent_2);
E->mbby_var_F = 32;
MotherBrainBody_FakeDeath_Descent_2();
}
}
void MotherBrainBody_FakeDeath_Descent_2(void) { // 0xA9884D
Enemy_MotherBrainBody *E = Get_MotherBrainBody(0);
if ((--E->mbby_var_F & 0x8000u) != 0) {
QueueMusic_Delayed8(0);
QueueMusic_Delayed8(0xFF21u);
E->mbby_var_A = FUNC16(MotherBrainBody_FakeDeath_Descent_3);
E->mbby_var_F = 12;
MotherBrainBody_FakeDeath_Descent_3();
}
}
void MotherBrainBody_FakeDeath_Descent_3(void) { // 0xA9886C
Enemy_MotherBrainBody *E = Get_MotherBrainBody(0);
if ((--E->mbby_var_F & 0x8000u) != 0) {
CallSomeSamusCode(1u);
E->mbby_var_A = FUNC16(MotherBrainBody_FakeDeath_Descent_4);
E->mbby_var_F = 8;
MotherBrainBody_FakeDeath_Descent_4();
}
}
void MotherBrainBody_FakeDeath_Descent_4(void) { // 0xA98884
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0) {
MotherBrain_Pal_BeginScreenFlash();
LoadFxEntry(2u);
Get_MotherBrain(0x40u)->mbn_var_E = FUNC16(MotherBrainBody_0_Wait);
E->mbn_var_A = FUNC16(MotherBrainBody_FakeDeath_Descent_5);
E->mbn_var_F = 0;
E->mbn_var_37 = 0;
static const SpawnHardcodedPlmArgs unk_A988AD = { 0x0e, 0x02, 0xb6b3 };
SpawnHardcodedPlm(&unk_A988AD);
}
}
void MotherBrainBody_FakeDeath_Descent_5(void) { // 0xA988B2
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0) {
E->mbn_var_F = 8;
uint16 v2 = E->mbn_var_37 + 1;
E->mbn_var_37 = v2;
if (MotherBrain_FadeToGray_FakeDeath(v2 - 1) & 1)
E->mbn_var_A = FUNC16(MotherBrainBody_FakeDeath_Descent_6);
}
MotherBrainBody_FakeDeath_Descent_6();
}
void MotherBrainBody_FakeDeath_Descent_6(void) { // 0xA988D3
Enemy_MotherBrainBody *E = Get_MotherBrainBody(0x40u);
CallMotherBrainFunc(E->mbby_var_E | 0xA90000);
MotherBrain_HandleFakeDeathExplosions();
}
void MotherBrain_HandleFakeDeathExplosions(void) { // 0xA988DD
int16 v1;
int16 v2;
Enemy_MotherBrain *E = Get_MotherBrain(0);
v1 = E->mbn_var_38 - 1;
if (v1 < 0) {
E->mbn_var_38 = 8;
v2 = E->mbn_var_39 - 1;
if (v2 < 0)
v2 = 7;
E->mbn_var_39 = v2;
int v3 = (uint16)(4 * v2) >> 1;
R18_ = g_word_A98929[v3];
R20_ = g_word_A98929[v3 + 1];
uint16 v4 = 3;
if (random_number < 0x4000u)
v4 = 12;
SpawnEnemyProjectileWithRoomGfx(addr_kEproj_DustCloudExplosion, v4);
QueueSfx2_Max3(0x24u);
} else {
E->mbn_var_38 = v1;
}
}
void MotherBrainBody_0_Wait(void) { // 0xA98949
int16 v1;
uint16 v0 = 0;
v1 = 0;
do {
if (!*(uint16 *)((char *)enemy_projectile_id + v0))
++v1;
v0 += 2;
} while ((int16)(v0 - 36) < 0);
if ((int16)(v1 - 4) >= 0) {
SpawnEnemy(0xA9u, addr_stru_A98AE5);
Get_MotherBrainBody(0x40u)->mbby_var_E = FUNC16(MotherBrainBody_1_ClearBottomLeftTube);
}
}
static const SpawnHardcodedPlmArgs unk_A98972 = { 0x05, 0x09, 0xb6c3 };
static const SpawnHardcodedPlmArgs unk_A989D6 = { 0x06, 0x02, 0xb6b3 };
static const SpawnHardcodedPlmArgs unk_A989FE = { 0x0a, 0x09, 0xb6c7 };
static const SpawnHardcodedPlmArgs unk_A98A26 = { 0x06, 0x0a, 0xb6bb };
static const SpawnHardcodedPlmArgs unk_A98A58 = { 0x07, 0x02, 0xb6b7 };
static const SpawnHardcodedPlmArgs unk_A98A8A = { 0x08, 0x02, 0xb6b7 };
static const SpawnHardcodedPlmArgs unk_A989A4 = { 0x09, 0x02, 0xb6b3 };
static const SpawnHardcodedPlmArgs unk_A98AB2 = { 0x09, 0x0a, 0xb6bb };
static const SpawnHardcodedPlmArgs unk_A98ADA = { 0x07, 0x07, 0xb6bf };
void MotherBrainBody_1_ClearBottomLeftTube(void) { // 0xA9896E
SpawnHardcodedPlm(&unk_A98972);
Enemy_MotherBrainBody *E = Get_MotherBrainBody(0x40u);
E->mbby_var_E = FUNC16(MotherBrainBody_2_SpawnTopRightTubeFalling);
E->mbby_var_F = 32;
}
void MotherBrainBody_2_SpawnTopRightTubeFalling(void) { // 0xA98983
Enemy_MotherBrainBody *E = Get_MotherBrainBody(0x40u);
if ((--E->mbby_var_F & 0x8000u) != 0) {
R18_ = 152;
R20_ = 47;
SpawnEnemyProjectileWithRoomGfx(0xCC5Bu, 0x2Fu);
E->mbby_var_E = -30304;
}
}
void MotherBrainBody_3_ClearCeilingBlock9(void) { // 0xA989A0
SpawnHardcodedPlm(&unk_A989A4);
Enemy_MotherBrainBody *E = Get_MotherBrainBody(0x40u);
E->mbby_var_E = FUNC16(MotherBrainBody_4_SpawnTopLeftTubeFalling);
E->mbby_var_F = 32;
}
void MotherBrainBody_4_SpawnTopLeftTubeFalling(void) { // 0xA989B5
Enemy_MotherBrainBody *E = Get_MotherBrainBody(0x40u);
if ((--E->mbby_var_F & 0x8000u) != 0) {
R18_ = 104;
R20_ = 47;
SpawnEnemyProjectileWithRoomGfx(addr_kEproj_MotherBrainTubeFalling_TopLeft, 0x2Fu);
E->mbby_var_E = FUNC16(MotherBrainBody_4_ClearCeilingBlock6);
}
}
void MotherBrainBody_4_ClearCeilingBlock6(void) { // 0xA989D2
SpawnHardcodedPlm(&unk_A989D6);
Enemy_MotherBrainBody *E = Get_MotherBrainBody(0x40u);
E->mbby_var_E = FUNC16(MotherBrainBody_5_SpawnTubeFallingEnemy1);
E->mbby_var_F = 32;
}
void MotherBrainBody_5_SpawnTubeFallingEnemy1(void) { // 0xA989E7
Enemy_MotherBrainBody *E = Get_MotherBrainBody(0x40u);
if ((--E->mbby_var_F & 0x8000u) != 0) {
SpawnEnemy(0xA9u, addr_stru_A98AF5);
E->mbby_var_E = FUNC16(MotherBrainBody_6_ClearBottomRightTube);
}
}
void MotherBrainBody_6_ClearBottomRightTube(void) { // 0xA989FA
SpawnHardcodedPlm(&unk_A989FE);
Enemy_MotherBrainBody *E = Get_MotherBrainBody(0x40u);
E->mbby_var_E = FUNC16(MotherBrainBody_7_SpawnTubeFallingEnemy2);
E->mbby_var_F = 32;
}
void MotherBrainBody_7_SpawnTubeFallingEnemy2(void) { // 0xA98A0F
Enemy_MotherBrainBody *E = Get_MotherBrainBody(0x40u);
if ((--E->mbby_var_F & 0x8000u) != 0) {
SpawnEnemy(0xA9u, addr_stru_A98B05);
E->mbby_var_E = FUNC16(MotherBrainBody_8_ClearBottomMiddleLeftTube);
}
}
void MotherBrainBody_8_ClearBottomMiddleLeftTube(void) { // 0xA98A22
SpawnHardcodedPlm(&unk_A98A26);
Enemy_MotherBrainBody *E = Get_MotherBrainBody(0x40u);
E->mbby_var_E = FUNC16(MotherBrainBody_9_SpawnTopMiddleLeftFalling);
E->mbby_var_F = 32;
}
void MotherBrainBody_9_SpawnTopMiddleLeftFalling(void) { // 0xA98A37
Enemy_MotherBrainBody *E = Get_MotherBrainBody(0x40u);
if ((--E->mbby_var_F & 0x8000u) != 0) {
R18_ = 120;
R20_ = 59;
SpawnEnemyProjectileWithRoomGfx(addr_kEproj_MotherBrainTubeFalling_TopMiddleLeft, 0x3Bu);
E->mbby_var_E = FUNC16(MotherBrainBody_10_ClearCeilingTubeColumn7);
}
}
void MotherBrainBody_10_ClearCeilingTubeColumn7(void) { // 0xA98A54
SpawnHardcodedPlm(&unk_A98A58);
Enemy_MotherBrainBody *E = Get_MotherBrainBody(0x40u);
E->mbby_var_E = FUNC16(MotherBrainBody_11_SpawnTopMiddleRightFalling);
E->mbby_var_F = 32;
}
void MotherBrainBody_11_SpawnTopMiddleRightFalling(void) { // 0xA98A69
Enemy_MotherBrainBody *E = Get_MotherBrainBody(0x40u);
if ((--E->mbby_var_F & 0x8000u) != 0) {
R18_ = 136;
R20_ = 59;
SpawnEnemyProjectileWithRoomGfx(addr_kEproj_MotherBrainTubeFalling_TopMiddleRight, 0x3Bu);
E->mbby_var_E = FUNC16(MotherBrainBody_12_ClearCeilingTubeColumn8);
}
}
void MotherBrainBody_12_ClearCeilingTubeColumn8(void) { // 0xA98A86
SpawnHardcodedPlm(&unk_A98A8A);
Enemy_MotherBrainBody *E = Get_MotherBrainBody(0x40u);
E->mbby_var_E = FUNC16(MotherBrainBody_13_SpawnTubeFallingEnemy3);
E->mbby_var_F = 32;
}
void MotherBrainBody_13_SpawnTubeFallingEnemy3(void) { // 0xA98A9B
Enemy_MotherBrainBody *E = Get_MotherBrainBody(0x40u);
if ((--E->mbby_var_F & 0x8000u) != 0) {
SpawnEnemy(0xA9u, FUNC16(EnemyProj_Init_0x8bde_SkreeDownLeft));
E->mbby_var_E = FUNC16(MotherBrainBody_14_ClearBottomMiddleRightTube);
}
}
void MotherBrainBody_14_ClearBottomMiddleRightTube(void) { // 0xA98AAE
SpawnHardcodedPlm(&unk_A98AB2);
Enemy_MotherBrainBody *E = Get_MotherBrainBody(0x40u);
E->mbby_var_E = FUNC16(MotherBrainBody_15_SpawnTubeFallingEnemy4);
E->mbby_var_F = 2;
}
void MotherBrainBody_15_SpawnTubeFallingEnemy4(void) { // 0xA98AC3
Enemy_MotherBrainBody *E = Get_MotherBrainBody(0x40u);
if ((--E->mbby_var_F & 0x8000u) != 0) {
SpawnEnemy(0xA9u, addr_stru_A98B25);
E->mbby_var_E = FUNC16(MotherBrainBody_16_ClearBottomMiddleTubes);
}
}
void MotherBrainBody_16_ClearBottomMiddleTubes(void) { // 0xA98AD6
SpawnHardcodedPlm(&unk_A98ADA);
Get_MotherBrainBody(0x40u)->mbby_var_E = addr_locret_A98AE4;
}
void MotherBrainsTubesFalling_Init(void) { // 0xA98B35
Enemy_MotherBrainsTubesFalling *E = Get_MotherBrainsTubesFalling(cur_enemy_index);
int v1 = E->mbtfg_parameter_1 >> 1;
E->base.x_width = g_word_A98B5D[v1];
E->base.y_height = g_word_A98B67[v1];
E->mbtfg_var_B = g_word_A98B71[v1];
E->mbtfg_var_D = 0;
E->mbtfg_var_E = 0;
E->mbtfg_var_C = 0;
E->mbtfg_var_A = g_off_A98B7B[v1];
}
void CallMotherBrainsTubesFalling(uint32 ea, uint16 k) {
switch (ea) {
case fnMotherBrainsTubesFalling_Main_NonMain: MotherBrainsTubesFalling_Main_NonMain(k); return;
case fnMotherBrainsTubesFalling_WaitToFall: MotherBrainsTubesFalling_WaitToFall(k); return;
case fnMotherBrainsTubesFalling_Falling: MotherBrainsTubesFalling_Falling(k); return;
default: Unreachable();
}
}
void MotherBrainsTubesFalling_Main(uint16 k) { // 0xA98B85
Enemy_MotherBrainsTubesFalling *E = Get_MotherBrainsTubesFalling(k);
CallMotherBrainsTubesFalling(E->mbtfg_var_A | 0xA90000, k);
}
void MotherBrainsTubesFalling_Main_NonMain(uint16 k) { // 0xA98B88
Enemy_MotherBrainsTubesFalling *E = Get_MotherBrainsTubesFalling(k);
uint16 v2 = E->mbtfg_var_C + 6;
E->mbtfg_var_C = v2;
Enemy_IncreaseYpos(k, v2);
if ((int16)(E->base.y_pos - E->mbtfg_var_B) < 0)
MotherBrainsTubesFalling_HandleSmoke(k);
else
MotherBrainsTubesFalling_Explode(k);
}
void MotherBrainsTubesFalling_HandleSmoke(uint16 k) { // 0xA98B9D
Enemy_MotherBrainsTubesFalling *E = Get_MotherBrainsTubesFalling(k);
if ((--E->mbtfg_var_D & 0x8000u) != 0)
MotherBrainsTubesFalling_SpawnSmoke(k);
}
void MotherBrainsTubesFalling_Explode(uint16 k) { // 0xA98BA6
Enemy_MotherBrainsTubesFalling *E = Get_MotherBrainsTubesFalling(k);
E->base.properties |= kEnemyProps_Deleted;
R18_ = E->base.x_pos;
R20_ = E->base.y_pos;
SpawnEnemyProjectileWithRoomGfx(addr_kEproj_DustCloudExplosion, 3u);
QueueSfx2_Max3(0x24u);
}
void MotherBrainsTubesFalling_WaitToFall(uint16 k) { // 0xA98BCB
Enemy_MotherBrainsTubesFalling *E = Get_MotherBrainsTubesFalling(k);
if ((--E->mbtfg_parameter_2 & 0x8000u) != 0) {
E->mbtfg_var_A = FUNC16(MotherBrainsTubesFalling_Falling);
MotherBrainsTubesFalling_Falling(k);
}
}
void MotherBrainsTubesFalling_Falling(uint16 k) { // 0xA98BD6
Enemy_MotherBrainsTubesFalling *E = Get_MotherBrainsTubesFalling(k);
uint16 v2 = E->mbtfg_var_C + 6;
E->mbtfg_var_C = v2;
Enemy_IncreaseYpos(k, v2);
uint16 ypos = E->base.y_pos;
if (!sign16(ypos - 244))
E->base.properties |= kEnemyProps_Invisible;
Enemy_MotherBrainsTubesFalling *E1 = Get_MotherBrainsTubesFalling(0x40u);
E1->base.y_pos = ypos - 56;
if (sign16(E1->base.y_pos - 0xc4)) {
MotherBrainsTubesFalling_HandleSmoke(k);
} else {
MotherBrain_Pal_EndScreenFlash();
EnableEarthquakeAframes(0x19u);
hdma_object_channels_bitmask[0] = 0;
hdma_object_channels_bitmask[1] = 0;
// BUG!
//E->mbtfg_var_C = 0;
E1->base.y_pos = 196;
Enemy_MotherBrainsTubesFalling *E0 = Get_MotherBrainsTubesFalling(0);
E0->base.x_pos = 59;
E0->base.y_pos = 279;
MotherBrain_SetupNeckForFakeAscent();
E0->mbtfg_var_A = FUNC16(MotherBrainBody_FakeDeath_Ascent_0_DrawBG1Row23);
MotherBrainsTubesFalling_Explode(cur_enemy_index);
}
}
void MotherBrainsTubesFalling_SpawnSmoke(uint16 k) { // 0xA98C36
Enemy_MotherBrainsTubesFalling *E = Get_MotherBrainsTubesFalling(k);
E->mbtfg_var_D = 8;
uint16 v2 = ((uint8)E->mbtfg_var_E + 1) & 3;
E->mbtfg_var_E = v2;
R18_ = E->base.x_pos + g_word_A98C61[v2];
R20_ = 208;
SpawnEnemyProjectileWithRoomGfx(addr_kEproj_DustCloudExplosion, 9u);
}
static const SpawnHardcodedPlmArgs unk_A98C8B = { 0x02, 0x02, 0xb67b };
static const SpawnHardcodedPlmArgs unk_A98C93 = { 0x02, 0x03, 0xb67f };
static const SpawnHardcodedPlmArgs unk_A98CA2 = { 0x02, 0x04, 0xb683 };
static const SpawnHardcodedPlmArgs unk_A98CAA = { 0x02, 0x05, 0xb687 };
static const SpawnHardcodedPlmArgs unk_A98CB9 = { 0x02, 0x06, 0xb68b };
static const SpawnHardcodedPlmArgs unk_A98CC1 = { 0x02, 0x07, 0xb68f };
static const SpawnHardcodedPlmArgs unk_A98CD0 = { 0x02, 0x08, 0xb693 };
static const SpawnHardcodedPlmArgs unk_A98CD8 = { 0x02, 0x09, 0xb697 };
static const SpawnHardcodedPlmArgs unk_A98CE7 = { 0x02, 0x0a, 0xb69b };
static const SpawnHardcodedPlmArgs unk_A98CEF = { 0x02, 0x0b, 0xb69f };
static const SpawnHardcodedPlmArgs unk_A98CFE = { 0x02, 0x0c, 0xb6a3 };
static const SpawnHardcodedPlmArgs unk_A98D06 = { 0x02, 0x0d, 0xb6a7 };
void MotherBrainBody_FakeDeath_Ascent_0_DrawBG1Row23(void) { // 0xA98C87
SpawnHardcodedPlm(&unk_A98C8B);
SpawnHardcodedPlm(&unk_A98C93);
Get_MotherBrainBody(0)->mbby_var_A = FUNC16(MotherBrainBody_FakeDeath_Ascent_1_DrawBG1Row45);
}
void MotherBrainBody_FakeDeath_Ascent_1_DrawBG1Row45(void) { // 0xA98C9E
SpawnHardcodedPlm(&unk_A98CA2);
SpawnHardcodedPlm(&unk_A98CAA);
Get_MotherBrainBody(0)->mbby_var_A = FUNC16(MotherBrainBody_FakeDeath_Ascent_2_DrawBG1Row67);
}
void MotherBrainBody_FakeDeath_Ascent_2_DrawBG1Row67(void) { // 0xA98CB5
SpawnHardcodedPlm(&unk_A98CB9);
SpawnHardcodedPlm(&unk_A98CC1);
Get_MotherBrainBody(0)->mbby_var_A = FUNC16(MotherBrainBody_FakeDeath_Ascent_3_DrawBG1Row89);
}
void MotherBrainBody_FakeDeath_Ascent_3_DrawBG1Row89(void) { // 0xA98CCC
SpawnHardcodedPlm(&unk_A98CD0);
SpawnHardcodedPlm(&unk_A98CD8);
Get_MotherBrainBody(0)->mbby_var_A = FUNC16(MotherBrainBody_FakeDeath_Ascent_4_DrawBG1RowAB);
}
void MotherBrainBody_FakeDeath_Ascent_4_DrawBG1RowAB(void) { // 0xA98CE3
SpawnHardcodedPlm(&unk_A98CE7);
SpawnHardcodedPlm(&unk_A98CEF);
Get_MotherBrainBody(0)->mbby_var_A = FUNC16(MotherBrainBody_FakeDeath_Ascent_5_DrawBG1RowCD);
}
void MotherBrainBody_FakeDeath_Ascent_5_DrawBG1RowCD(void) { // 0xA98CFA
SpawnHardcodedPlm(&unk_A98CFE);
SpawnHardcodedPlm(&unk_A98D06);
Get_MotherBrainBody(0)->mbby_var_A = FUNC16(MotherBrainBody_FakeDeath_Ascent_6_SetupPhase2Gfx);
}
void MotherBrainBody_FakeDeath_Ascent_6_SetupPhase2Gfx(void) { // 0xA98D11
*(uint16 *)&layer2_scroll_x = 257;
*(uint16 *)&reg_BG2SC &= 0xFFFCu;
WriteColorsToPalette(0x142u, 0xa9, addr_kMotherBrainPalette_1__plus__2, 0xFu);
WriteColorsToPalette(0x162u, 0xa9, addr_kMotherBrainPalette_0__plus__2, 0xFu);
Get_MotherBrain(0)->mbn_var_A = FUNC16(MotherBrainBody_FakeDeath_Ascent_7_SetupPhase2Brain);
nmi_flag_bg2_enemy_vram_transfer = 1;
Get_MotherBrain(0x40u)->mbn_var_02 = 1;
}
void MotherBrainBody_FakeDeath_Ascent_7_SetupPhase2Brain(void) { // 0xA98D49
fx_layer_blending_config_a = 52;
Enemy_MotherBrainBody *E = Get_MotherBrainBody(0x40u);
E->mbby_var_A = FUNC16(MotherBrainsBrain_SetupBrainAndNeckToDraw);
Enemy_MotherBrainBody *E0 = Get_MotherBrainBody(0);
E0->base.properties &= ~kEnemyProps_Tangible;
E->base.properties &= ~0x400u;
E->base.health = 18000;
E0->mbby_var_A = FUNC16(MotherBrainBody_FakeDeath_Ascent_8_Pause);
E0->mbby_var_F = 128;
MotherBrainBody_FakeDeath_Ascent_8_Pause();
}
void MotherBrainBody_FakeDeath_Ascent_8_Pause(void) { // 0xA98D79
Enemy_MotherBrainBody *E = Get_MotherBrainBody(0);
if ((--E->mbby_var_F & 0x8000u) != 0) {
E->mbby_var_A = FUNC16(MotherBrainBody_FakeDeath_Ascent_9_PrepareRise);
E->mbby_var_F = 32;
MotherBrainBody_FakeDeath_Ascent_9_PrepareRise();
}
}
void MotherBrainBody_FakeDeath_Ascent_9_PrepareRise(void) { // 0xA98D8B
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0) {
E->mbn_var_09 = MotherBrainRisingHdmaObject();
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->base.properties |= 0x100u;
MotherBrain_SetBrainInstrs(addr_stru_A99C21);
E->mbn_var_A = FUNC16(MotherBrainBody_FakeDeath_Ascent_10_LoadLegTiles);
E->mbn_var_F = 256;
MotherBrainBody_FakeDeath_Ascent_10_LoadLegTiles();
}
}
void MotherBrainBody_FakeDeath_Ascent_10_LoadLegTiles(void) { // 0xA98DB4
if (ProcessSpriteTilesTransfers(0xa9, addr_stru_A98F8F)) {
Get_MotherBrainBody(0)->mbby_var_A = FUNC16(MotherBrainBody_FakeDeath_Ascent_11_ContinuePause);
MotherBrainBody_FakeDeath_Ascent_11_ContinuePause();
}
}
void MotherBrainBody_FakeDeath_Ascent_11_ContinuePause(void) { // 0xA98DC3
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0) {
E->base.x_pos = 59;
E->base.y_pos = 279;
reg_BG2HOFS = -27;
reg_BG2VOFS = -217;
E->mbn_var_04 = 7;
E->mbn_var_A = FUNC16(MotherBrainBody_FakeDeath_Ascent_12_StartMusic);
}
}
void MotherBrainBody_FakeDeath_Ascent_12_StartMusic(void) { // 0xA98DEC
MotherBrain_SetBodyInstrs(addr_kMotherBrain_Ilist_9A02);
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->base.instruction_timer = 1;
Enemy_MotherBrain *E0 = Get_MotherBrain(0);
E0->base.properties &= ~kEnemyProps_Invisible;
E0->base.x_pos = 59;
E0->base.y_pos = 279;
reg_BG2HOFS = -27;
reg_BG2VOFS = -217;
QueueMusic_Delayed8(5u);
earthquake_type = 2;
earthquake_timer = 256;
E1->mbn_var_34 = 80;
E1->mbn_var_31 = 1;
E1->mbn_var_32 = 8;
E1->mbn_var_33 = 6;
E0->mbn_var_A = FUNC16(MotherBrainBody_FakeDeath_Ascent_13_Raise);
}
void MotherBrainBody_FakeDeath_Ascent_13_Raise(void) { // 0xA98E4D
Enemy_MotherBrain *E = Get_MotherBrain(0);
uint16 v1;
if ((nmi_frame_counter_word & 3) != 0
|| (MotherBrain_SpawnDustCloudsForAscent(),
R18_ = 2,
reg_BG2VOFS += 2,
v1 = E->base.y_pos - 2,
E->base.y_pos = v1,
v1 >= 0xBDu)) {
} else {
enemy_bg2_tilemap_size = 320;
E->base.y_pos = 188;
earthquake_timer = 0;
hdma_object_channels_bitmask[E->mbn_var_09 >> 1] = 0;
MotherBrain_SetBodyInstrs(addr_kMotherBrain_Ilist_99AA);
E->mbn_var_A = FUNC16(MotherBrainBody_FakeDeath_Ascent_14_WaitForUncouching);
MotherBrainBody_FakeDeath_Ascent_14_WaitForUncouching();
}
}
void MotherBrainBody_FakeDeath_Ascent_14_WaitForUncouching(void) { // 0xA98E95
Enemy_MotherBrain *E = Get_MotherBrain(0);
if (!E->mbn_var_02) {
E->mbn_var_37 = 0;
E->mbn_var_A = FUNC16(MotherBrainBody_FakeDeath_Ascent_15_TransitionFromGrey);
E->mbn_var_F = 0;
}
}
void MotherBrainBody_FakeDeath_Ascent_15_TransitionFromGrey(void) { // 0xA98EAA
Enemy_MotherBrain *E0 = Get_MotherBrain(0);
if ((--E0->mbn_var_F & 0x8000u) != 0) {
E0->mbn_var_F = 4;
uint16 v3 = E0->mbn_var_37 + 1;
E0->mbn_var_37 = v3;
if (MotherBrain_FadeFromGray_FakeDeath(v3 - 1) & 1) {
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->mbn_var_10 = 1;
E0->mbn_var_00 = 2;
E1->mbn_var_12 = 1;
E1->mbn_var_32 = 6;
E1->mbn_var_33 = 6;
E1->mbn_var_34 = 1280;
E0->mbn_var_A = FUNC16(MotherBrainBody_2ndphase_16_ShakeHeadMenacingly);
E0->mbn_var_F = 23;
}
}
}
void MotherBrainBody_2ndphase_16_ShakeHeadMenacingly(void) { // 0xA98EF5
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0) {
MotherBrain_SetBrainInstrs(addr_kMotherBrain_Ilist_9B7F);
E->mbn_var_A = FUNC16(MotherBrainBody_2ndphase_17_BringHeadBackUp);
Get_MotherBrain(0x40u)->mbn_var_34 = 64;
E->mbn_var_F = 256;
MotherBrainBody_2ndphase_17_BringHeadBackUp();
}
}
void MotherBrainBody_2ndphase_17_BringHeadBackUp(void) { // 0xA98F14
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0) {
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->mbn_var_32 = 2;
E1->mbn_var_33 = 4;
E->mbn_var_A = FUNC16(MotherBrainBody_2ndphase_18_FinishStretching);
E->mbn_var_F = 64;
MotherBrainBody_2ndphase_18_FinishStretching();
}
}
void MotherBrainBody_2ndphase_18_FinishStretching(void) { // 0xA98F33
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0) {
Get_MotherBrain(0x40u)->mbn_var_14 = 1;
E->mbn_var_A = FUNC16(MotherBrain_Body_Phase2_Thinking);
}
}
void MotherBrain_SpawnDustCloudsForAscent(void) { // 0xA98F46
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
if ((--E->mbn_var_F & 0x8000u) != 0)
E->mbn_var_F = 7;
R18_ = g_word_A98F7F[E->mbn_var_F];
R20_ = 212;
SpawnEnemyProjectileWithRoomGfx(
addr_kEproj_DustCloudExplosion,
g_byte_A98F7D[(uint16)(random_number & 0x100) >> 8]);
QueueSfx2_Max3(0x29u);
}
void MotherBrain_SetupNeckForFakeAscent(void) { // 0xA9903F
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
E->mbn_var_24 = 2;
E->mbn_var_27 = 10;
E->mbn_var_2D = 10;
E->mbn_var_2A = 20;
E->mbn_var_30 = 20;
E->mbn_var_20 = 18432;
E->mbn_var_21 = 20480;
E->mbn_var_34 = 256;
}
void MotherBrain_HandleNeckLower(void) { // 0xA99072
uint16 mbn_var_32 = Get_MotherBrain(0x40u)->mbn_var_32;
if (mbn_var_32) {
switch (mbn_var_32) {
case 2u:
MotherBrain_HandleNeckLower_2_BobDown();
break;
case 4u:
MotherBrain_HandleNeckLower_4_BobUp();
break;
case 6u:
MotherBrain_HandleNeckLower_6_Lower();
break;
case 8u:
MotherBrain_HandleNeckLower_8_Raise();
break;
default:
Unreachable();
while (1)
;
}
} else {
MotherBrain_HandleNeckLower_0();
}
}
void MotherBrain_HandleNeckLower_0(void) { // 0xA99084
;
}
void MotherBrain_HandleNeckLower_2_BobDown(void) { // 0xA99085
int16 v1;
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
v1 = E->mbn_var_20 - E->mbn_var_34;
if ((uint16)v1 < 0x2800u) {
E->mbn_var_32 = 4;
v1 = 10240;
}
E->mbn_var_20 = v1;
}
void MotherBrain_HandleNeckLower_4_BobUp(void) { // 0xA990A2
int16 v1;
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
if (sign16(E->base.y_pos - 60)) {
E->mbn_var_32 = 2;
} else {
v1 = E->mbn_var_34 + E->mbn_var_20;
if ((uint16)v1 >= 0x9000u) {
E->mbn_var_32 = 2;
v1 = -28672;
}
E->mbn_var_20 = v1;
}
}
void MotherBrain_HandleNeckLower_6_Lower(void) { // 0xA990CF
int16 v1;
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
v1 = E->mbn_var_20 - E->mbn_var_34;
if ((uint16)v1 < 0x3000u) {
E->mbn_var_32 = 0;
v1 = 12288;
}
E->mbn_var_20 = v1;
}
void MotherBrain_HandleNeckLower_8_Raise(void) { // 0xA990EC
int16 v1;
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
v1 = E->mbn_var_34 + E->mbn_var_20;
if ((uint16)v1 >= 0x9000u) {
E->mbn_var_32 = 0;
v1 = -28672;
}
E->mbn_var_20 = v1;
}
void MotherBrain_HandleNeckUpper(void) { // 0xA99109
int16 v2;
int16 v6;
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
uint16 mbn_var_33 = E->mbn_var_33;
if (mbn_var_33) {
switch (mbn_var_33) {
case 2u:
if ((int16)(E->base.y_pos + 4 - samus_y_pos) < 0) {
v2 = E->mbn_var_21 - E->mbn_var_34;
if ((uint16)v2 < 0x2000u) {
E->mbn_var_33 = 4;
v2 = 0x2000;
}
E->mbn_var_21 = v2;
} else {
E->mbn_var_32 = 4;
E->mbn_var_33 = 4;
}
break;
case 4u: {
R18_ = E->mbn_var_20 + 2048;
uint16 v4 = E->mbn_var_34 + E->mbn_var_21;
if (v4 >= R18_) {
E->mbn_var_33 = 2;
v4 = R18_;
}
E->mbn_var_21 = v4;
break;
}
case 6u: {
v6 = E->mbn_var_21 - E->mbn_var_34;
if ((uint16)v6 < 0x2000u) {
E->mbn_var_33 = 0;
v6 = 0x2000;
}
E->mbn_var_21 = v6;
break;
}
case 8u: {
R18_ = E->mbn_var_20 + 2048;
uint16 v8 = E->mbn_var_34 + E->mbn_var_21;
if (v8 >= R18_) {
E->mbn_var_33 = 0;
v8 = R18_;
}
E->mbn_var_21 = v8;
break;
}
default:
Unreachable();
while (1)
;
}
}
}
void MotherBrain_HandleNeck(void) { // 0xA991B8
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_0A = E->base.x_pos - 80;
E->mbn_var_0B = E->base.y_pos + 46;
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
if (E1->mbn_var_31) {
MotherBrain_HandleNeckLower();
MotherBrain_HandleNeckUpper();
}
R18_ = HIBYTE(E1->mbn_var_20);
E1->mbn_var_22 = E->mbn_var_0A + ComputeSinMult(E1->mbn_var_24) + 112;
E1->mbn_var_23 = E->mbn_var_0B + ComputeCosMult(E1->mbn_var_24) - 96;
E1->mbn_var_25 = E->mbn_var_0A + ComputeSinMult(E1->mbn_var_27) + 112;
E1->mbn_var_26 = E->mbn_var_0B + ComputeCosMult(E1->mbn_var_27) - 96;
E1->mbn_var_28 = E->mbn_var_0A + ComputeSinMult(E1->mbn_var_2A) + 112;
E1->mbn_var_29 = E->mbn_var_0B + ComputeCosMult(E1->mbn_var_2A) - 96;
R18_ = HIBYTE(E1->mbn_var_21);
E1->mbn_var_2B = E1->mbn_var_28 + ComputeSinMult(E1->mbn_var_2D);
E1->mbn_var_2C = E1->mbn_var_29 + ComputeCosMult(E1->mbn_var_2D);
E1->mbn_var_2E = E1->mbn_var_28 + ComputeSinMult(E1->mbn_var_30);
E1->mbn_var_2F = E1->mbn_var_29 + ComputeCosMult(E1->mbn_var_30);
}
uint16 CallMotherBrainInstr(uint32 ea, uint16 k) {
switch (ea) {
case fnMotherBrain_Instr_Goto: return MotherBrain_Instr_Goto(k);
case fnMotherBrain_Instr_EnableNeckMovementGoto: return MotherBrain_Instr_EnableNeckMovementGoto(k);
case fnMotherBrain_Instr_DisableNeckMovement: return MotherBrain_Instr_DisableNeckMovement(k);
case fnMotherBrain_Instr_QueueSfx2: return MotherBrain_Instr_QueueSfx2(k);
case fnMotherBrain_Instr_QueueSfx3: return MotherBrain_Instr_QueueSfx3(k);
case fnMotherBrain_Instr_SpawnDroolEproj: return MotherBrain_Instr_SpawnDroolEproj(k);
case fnMotherBrain_Instr_SpawnPurpleBreath: return MotherBrain_Instr_SpawnPurpleBreath(k);
case fnMotherBrain_Instr_SetMainShakeTimer50: return MotherBrain_Instr_SetMainShakeTimer50(k);
case fnMotherBrain_Instr_GotoEitherOr: return MotherBrain_Instr_GotoEitherOr(k);
case fnMotherBrain_Instr_MaybeGoto: return MotherBrain_Instr_MaybeGoto(k);
case fnMotherBrain_Instr_MaybeGoto2: return MotherBrain_Instr_MaybeGoto2(k);
case fnMotherBrain_Instr_Goto2: return MotherBrain_Instr_Goto2(k);
case fnMotherBrain_Instr_QueueShitroidAttackSfx: return MotherBrain_Instr_QueueShitroidAttackSfx(k);
case fnMotherBrain_Instr_SpawnBlueRingEproj: return MotherBrain_Instr_SpawnBlueRingEproj(k);
case fnMotherBrain_Instr_AimRingsAtShitroid: return MotherBrain_Instr_AimRingsAtShitroid(k);
case fnMotherBrain_Instr_AimRingsAtSamus: return MotherBrain_Instr_AimRingsAtSamus(k);
case fnMotherBrain_Instr_IncrShitroidAttackCtr: return MotherBrain_Instr_IncrShitroidAttackCtr(k);
case fnMotherBrain_Instr_SetShitroidAttackCtr0: return MotherBrain_Instr_SetShitroidAttackCtr0(k);
case fnMotherBrain_Instr_SpawnBombEproj: return MotherBrain_Instr_SpawnBombEproj(k);
case fnMotherBrain_Instr_SpawnLaserEproj: return MotherBrain_Instr_SpawnLaserEproj(k);
case fnMotherBrain_Instr_SpawnRainbowEproj: return MotherBrain_Instr_SpawnRainbowEproj(k);
case fnMotherBrain_Instr_SetupFxForRainbowBeam: return MotherBrain_Instr_SetupFxForRainbowBeam(k);
default: return Unreachable();
}
}
int MotherBrain_Func_1_DoubleRet(void) {
int16 v1;
int16 mbn_var_21;
int16 v5;
Enemy_MotherBrain *E = Get_MotherBrain(0);
if (time_is_frozen_flag) {
mbn_var_21 = E->mbn_var_21;
if (mbn_var_21 >= 0)
return -1;
return *((uint16 *)RomPtr_A9(mbn_var_21) + 1);
} else {
v1 = E->mbn_var_21;
if (v1 >= 0)
return -1;
uint16 v4 = E->mbn_var_21;
v5 = *(uint16 *)RomPtr_A9(v1);
if (v5 < 0)
goto LABEL_10;
if ((int16)(v5 - E->mbn_var_20) >= 0) {
++E->mbn_var_20;
return *((uint16 *)RomPtr_A9(v4) + 1);
} else {
for (v4 += 4; ; ) {
v5 = *(uint16 *)RomPtr_A9(v4);
if (v5 >= 0)
break;
LABEL_10:
R0_.addr = v5;
v4 = CallMotherBrainInstr((uint16)v5 | 0xA90000, v4 + 2);
}
E->mbn_var_20 = 1;
E->mbn_var_21 = v4;
return *((uint16 *)RomPtr_A9(v4) + 1);
}
}
}
void MotherBrain_DrawNeck(void) { // 0xA99303
if ((Get_MotherBrain(0)->base.properties & kEnemyProps_Invisible) == 0) {
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
R18_ = E->mbn_var_2E;
R20_ = E->mbn_var_2F;
MotherBrain_DrawNeckSegment();
R18_ = E->mbn_var_2B;
R20_ = E->mbn_var_2C;
MotherBrain_DrawNeckSegment();
R18_ = E->mbn_var_28;
R20_ = E->mbn_var_29;
MotherBrain_DrawNeckSegment();
R18_ = E->mbn_var_25;
R20_ = E->mbn_var_26;
MotherBrain_DrawNeckSegment();
R18_ = E->mbn_var_22;
R20_ = E->mbn_var_23;
MotherBrain_DrawNeckSegment();
}
}
void MotherBrain_DrawBrain(void) { // 0xA99357
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
if (E->mbn_var_14 && !E->mbn_var_15 && (random_number & 0x8000u) == 0)
SpawnEnemyProjectileWithRoomGfx(addr_kEproj_MotherBrainPurpleBreathSmall, random_number);
int tt = MotherBrain_Func_1_DoubleRet();
if (tt < 0)
return;
uint16 v2 = tt;
uint16 mbn_var_0D = Get_MotherBrain(0)->mbn_var_0D;
if (E->base.flash_timer & 1)
mbn_var_0D = 0;
R22_ = mbn_var_0D;
uint16 mbn_var_00 = E->mbn_var_00;
uint16 flash_timer;
if (mbn_var_00) {
flash_timer = mbn_var_00 - 1;
E->mbn_var_00 = flash_timer;
} else {
flash_timer = E->base.flash_timer;
if (!flash_timer)
flash_timer = E->base.shake_timer;
}
int v6 = (uint8)(flash_timer & 6) >> 1;
R18_ = E->base.x_pos + g_word_A993BB[v6];
if ((int16)(R18_ + 32 - layer1_x_pos) >= 0) {
R20_ = E->base.y_pos + g_word_A993C3[v6];
MotherBrain_AddSpritemapToOam(v2);
}
}
void MotherBrain_DrawNeckSegment(void) { // 0xA993CB
int v0 = (uint8)(Get_MotherBrain(0x40u)->base.flash_timer & 6) >> 1;
R18_ += g_word_A993BB[v0];
R20_ += g_word_A993C3[v0];
R22_ = Get_MotherBrain(0)->mbn_var_0C;
MotherBrain_AddSpritemapToOam(addr_kMotherBrain_Sprmap_A694);
}
void MotherBrain_AddSpritemapToOam(uint16 j) { // 0xA993EE
int16 *v5;
int16 v6;
int16 v7;
char v8; // t0
int16 v10;
int16 v12;
OamEnt *v13;
int16 v15;
int16 v17;
uint16 *v1 = (uint16 *)RomPtr_A9(j);
uint16 v2 = j + 2;
R24_ = *v1;
uint16 v3 = oam_next_ptr;
do {
uint8 *v4 = RomPtr_A9(v2);
v5 = (int16 *)v4;
v6 = v4[2] << 8;
if ((v4[2] & 0x80) != 0)
v6 |= 0xFFu;
v8 = v6;
LOBYTE(v7) = HIBYTE(v6);
HIBYTE(v7) = v8;
uint16 v9 = R20_ + v7;
bool v11 = v9 < layer1_y_pos;
v10 = v9 - layer1_y_pos;
v11 = !v11;
if (v10 >= 0) {
R26_ = v10;
v12 = R18_ + v11 + *(uint16 *)v4 - layer1_x_pos;
v13 = gOamEnt(v3);
*(uint16 *)&v13->xcoord = v12;
if ((v12 & 0x100) != 0) {
int v14 = v3 >> 1;
R28_ = kOamExtra_Address_And_X8Large[v14];
v15 = kOamExtra_X8Small_And_Large[v14] | *(uint16 *)RomPtr_RAM(R28_);
*(uint16 *)RomPtr_RAM(R28_) = v15;
}
if (*v5 < 0) {
int v16 = v3 >> 1;
R28_ = kOamExtra_Address_And_X8Large[v16];
v17 = kOamExtra_X8Small_And_Large[v16 + 1] | *(uint16 *)RomPtr_RAM(R28_);
*(uint16 *)RomPtr_RAM(R28_) = v17;
}
*(uint16 *)&v13->ycoord = R26_;
*(uint16 *)&v13->charnum = R22_ | *(int16 *)((char *)v5 + 3);
v3 = (v3 + 4) & 0x1FF;
}
v2 += 5;
--R24_;
} while (R24_);
oam_next_ptr = v3;
}
void MotherBrain_CalculateRainbowBeamHdma(void) { // 0xA99466
MotherBrain_CalcHdma();
}
void MotherBrain_MoveBodyDownScrollLeft(uint16 k, uint16 a) { // 0xA99552
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->base.y_pos += a;
reg_BG2VOFS -= a;
R20_ = k + 34;
reg_BG2HOFS = k + 34 - E->base.x_pos;
}
void MotherBrain_MoveBodyDown(uint16 a) { // 0xA99579
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->base.y_pos += a;
reg_BG2VOFS -= a;
reg_BG2HOFS = 34 - E->base.x_pos;
}
void MotherBrain_FootstepEffect(void) { // 0xA99599
earthquake_type = 1;
earthquake_timer = 4;
if (Get_MotherBrain(0)->mbn_var_00 == 3)
printf("Write to rom!\n");
// word_80914D = 22;
}
uint16 MotherBrain_Instr_MoveBodyUp10Left4(uint16 k, uint16 j) { // 0xA995B6
MotherBrain_MoveBodyDownScrollLeft(4u, 0xFFF6u);
return j;
}
uint16 MotherBrain_Instr_MoveBodyUp16Left4(uint16 k, uint16 j) { // 0xA995C0
MotherBrain_MoveBodyDownScrollLeft(4u, 0xFFF0u);
return j;
}
uint16 MotherBrain_Instr_MoveBodyUp12Right2(uint16 k, uint16 j) { // 0xA995CA
MotherBrain_MoveBodyDownScrollLeft(0xFFFEu, 0xFFF4u);
return j;
}
uint16 MotherBrain_Instr_MoveDown12Left4(uint16 k, uint16 j) { // 0xA995DE
MotherBrain_MoveBodyDownScrollLeft(4u, 0xCu);
return j;
}
uint16 MotherBrain_Instr_MoveDown16Right2(uint16 k, uint16 j) { // 0xA995E8
MotherBrain_MoveBodyDownScrollLeft(0xFFFEu, 0x10u);
return j;
}
uint16 MotherBrain_Instr_MoveDown10Right2(uint16 k, uint16 j) { // 0xA995F2
MotherBrain_MoveBodyDownScrollLeft(0xFFFEu, 0xAu);
return j;
}
uint16 MotherBrain_Instr_MoveUp2Right1(uint16 k, uint16 j) { // 0xA995FC
Enemy_MotherBrain *E = Get_MotherBrain(0);
++E->base.x_pos;
MotherBrain_MoveBodyDown(0xFFFEu);
return j;
}
uint16 MotherBrain_Instr_MoveRight2(uint16 k, uint16 j) { // 0xA9960C
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->base.x_pos += 2;
MotherBrain_MoveBodyDown(0);
return j;
}
uint16 MotherBrain_Instr_MoveUp1(uint16 k, uint16 j) { // 0xA9961C
MotherBrain_MoveBodyDown(1u);
return j;
}
uint16 MotherBrain_Instr_MoveUp1Right3_Sfx(uint16 k, uint16 j) { // 0xA99622
MotherBrain_FootstepEffect();
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->base.x_pos += 3;
MotherBrain_MoveBodyDown(1u);
return j;
}
uint16 MotherBrain_Instr_Down2Right15(uint16 k, uint16 j) { // 0xA99638
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->base.x_pos += 15;
MotherBrain_MoveBodyDown(0xFFFEu);
return j;
}
uint16 MotherBrain_Instr_Down4Right6(uint16 k, uint16 j) { // 0xA99648
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->base.x_pos += 6;
MotherBrain_MoveBodyDown(0xFFFCu);
return j;
}
uint16 MotherBrain_Instr_Up4Left2(uint16 k, uint16 j) { // 0xA99658
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->base.x_pos -= 2;
MotherBrain_MoveBodyDown(4u);
return j;
}
uint16 MotherBrain_Instr_Up2Left1_Sfx(uint16 k, uint16 j) { // 0xA99668
MotherBrain_FootstepEffect();
Enemy_MotherBrain *E = Get_MotherBrain(0);
--E->base.x_pos;
MotherBrain_MoveBodyDown(2u);
return j;
}
uint16 MotherBrain_Instr_Up2Left1_Sfx2(uint16 k, uint16 j) { // 0xA9967E
MotherBrain_FootstepEffect();
Enemy_MotherBrain *E = Get_MotherBrain(0);
--E->base.x_pos;
MotherBrain_MoveBodyDown(2u);
return j;
}
uint16 MotherBrain_Instr_MoveLeft2(uint16 k, uint16 j) { // 0xA99694
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->base.x_pos -= 2;
MotherBrain_MoveBodyDown(0);
return j;
}
uint16 MotherBrain_Instr_MoveDown1(uint16 k, uint16 j) { // 0xA996A4
MotherBrain_MoveBodyDown(0xFFFFu);
return j;
}
uint16 MotherBrain_Instr_MoveDown1Left3(uint16 k, uint16 j) { // 0xA996AA
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->base.x_pos -= 3;
MotherBrain_MoveBodyDown(0xFFFFu);
return j;
}
uint16 MotherBrain_Instr_MoveUp2Left15_Sfx(uint16 k, uint16 j) { // 0xA996BA
MotherBrain_FootstepEffect();
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->base.x_pos -= 15;
MotherBrain_MoveBodyDown(2u);
return j;
}
uint16 MotherBrain_Instr_MoveUp4Left6(uint16 k, uint16 j) { // 0xA996D0
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->base.x_pos -= 6;
MotherBrain_MoveBodyDown(4u);
return j;
}
uint16 MotherBrain_Instr_MoveDown4Right2(uint16 k, uint16 j) { // 0xA996E0
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->base.x_pos += 2;
MotherBrain_MoveBodyDown(0xFFFCu);
return j;
}
uint16 MotherBrain_Instr_MoveDown2Right1(uint16 k, uint16 j) { // 0xA996F0
Enemy_MotherBrain *E = Get_MotherBrain(0);
++E->base.x_pos;
MotherBrain_MoveBodyDown(0xFFFEu);
return j;
}
uint16 MotherBrain_Instr_SetPose_Standing(uint16 k, uint16 j) { // 0xA99700
Get_MotherBrain(0)->mbn_var_02 = 0;
return j;
}
uint16 MotherBrain_Instr_SetPose_Walking(uint16 k, uint16 j) { // 0xA99708
Get_MotherBrain(0)->mbn_var_02 = 1;
return j;
}
uint16 MotherBrain_Instr_SetPose_Crouched(uint16 k, uint16 j) { // 0xA99710
Get_MotherBrain(0)->mbn_var_02 = 3;
return j;
}
uint16 MotherBrain_Instr_SetPose_CrouchedTrans(uint16 k, uint16 j) { // 0xA99718
Get_MotherBrain(0)->mbn_var_02 = 2;
return j;
}
uint16 MotherBrain_Instr_SetPose_DeathBeamMode(uint16 k, uint16 j) { // 0xA99720
Get_MotherBrain(0)->mbn_var_02 = 4;
return j;
}
uint16 MotherBrain_Instr_SetPose_LeaningDown(uint16 k, uint16 j) { // 0xA99728
Get_MotherBrain(0)->mbn_var_02 = 6;
return j;
}
uint16 MotherBrain_Instr_SpawnEprojToOffset(uint16 k, uint16 j) { // 0xA99AC8
uint8 *v2 = RomPtr_A9(j);
Enemy_MotherBrain *E = Get_MotherBrain(0);
R18_ = E->base.x_pos + *(uint16 *)v2;
R20_ = E->base.y_pos + *((uint16 *)v2 + 1);
SpawnEnemyProjectileWithRoomGfx(addr_kEproj_DustCloudExplosion, *((uint16 *)v2 + 2));
return j + 6;
}
uint16 MotherBrain_Instr_SpawnDeathBeamEproj(uint16 k, uint16 j) { // 0xA99AEF
uint16 v2;
printf("A undefined\n"); v2 = 0;
QueueSfx2_Max6(0x63u);
SpawnEnemyProjectileWithGfx(v2, 0x40u, addr_kEproj_MotherBrainDeathBeamCharging);
return j;
}
uint16 MotherBrain_Instr_IncrBeamAttackPhase(uint16 k, uint16 j) { // 0xA99B05
Enemy_MotherBrain *E = Get_MotherBrain(0);
++E->mbn_var_17;
return j;
}
uint16 MotherBrain_Instr_Goto(uint16 k) { // 0xA99B0F
return *(uint16 *)RomPtr_A9(k);
}
uint16 MotherBrain_Instr_EnableNeckMovementGoto(uint16 k) { // 0xA99B14
Get_MotherBrain(0x40u)->mbn_var_31 = 1;
return *(uint16 *)RomPtr_A9(k);
}
uint16 MotherBrain_Instr_DisableNeckMovement(uint16 k) { // 0xA99B20
Get_MotherBrain(0x40u)->mbn_var_31 = 0;
return k;
}
uint16 MotherBrain_Instr_QueueSfx2(uint16 k) { // 0xA99B28
uint16 *v2 = (uint16 *)RomPtr_A9(k);
QueueSfx2_Max6(*v2);
return k + 2;
}
uint16 MotherBrain_Instr_QueueSfx3(uint16 k) { // 0xA99B32
uint16 *v2 = (uint16 *)RomPtr_A9(k);
QueueSfx3_Max6(*v2);
return k + 2;
}
uint16 MotherBrain_Instr_SpawnDroolEproj(uint16 k) { // 0xA99B3C
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
if (E->mbn_var_12) {
uint16 v2 = E->mbn_var_13 + 1;
if (!sign16(E->mbn_var_13 - 5))
v2 = 0;
E->mbn_var_13 = v2;
uint16 v3 = addr_kEproj_MotherBrainDrool;
if (!sign16(E->mbn_var_34 - 128))
v3 = addr_kEproj_MotherBrainDyingDrool;
SpawnEnemyProjectileWithRoomGfx(v3, E->mbn_var_13);
}
return k;
}
uint16 MotherBrain_Instr_SpawnPurpleBreath(uint16 k) { // 0xA99B6D
uint16 v2;
printf("A undefined\n"); v2 = 0;
SpawnEnemyProjectileWithRoomGfx(addr_kEproj_MotherBrainPurpleBreathBig, v2);
return k;
}
uint16 MotherBrain_Instr_SetMainShakeTimer50(uint16 k) { // 0xA99B77
Get_MotherBrain(0x40u)->mbn_var_00 = 50;
return k;
}
uint16 MotherBrain_Instr_GotoEitherOr(uint16 k) { // 0xA99C65
uint16 result = addr_stru_A99C5F;
if ((random_number & 0xFFFu) >= 0xFE0)
return addr_stru_A99C47;
return result;
}
uint16 MotherBrain_Instr_MaybeGoto(uint16 k) { // 0xA99CAD
if (random_number < 0xF000u)
return addr_stru_A99C9F;
return k;
}
uint16 MotherBrain_Instr_MaybeGoto2(uint16 k) { // 0xA99D0D
if ((random_number & 0xFFFu) < 0xEC0)
return MotherBrain_Instr_Goto2(k);
return k;
}
uint16 MotherBrain_Instr_QueueShitroidAttackSfx(uint16 k) { // 0xA99DF7
if (Get_MotherBrain(0)->mbn_var_13 != 11)
QueueSfx2_Max6(g_word_A99E0F[0]);
return k;
}
uint16 MotherBrain_Instr_Goto2(uint16 k) { // 0xA99D21
return addr_stru_A99CD1;
}
uint16 MotherBrain_Instr_SpawnBlueRingEproj(uint16 k) { // 0xA99E29
Enemy_MotherBrain *E = Get_MotherBrain(0);
SpawnEnemyProjectileWithRoomGfx(addr_kEproj_MotherBrainBlueRingLasers, E->mbn_var_1A);
return k;
}
uint16 MotherBrain_Instr_AimRingsAtShitroid(uint16 k) { // 0xA99E37
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
Enemy_MotherBrain *E1 = Get_MotherBrain(E->mbn_var_0A);
R18_ = E1->base.x_pos - E->base.x_pos - 10;
R20_ = E1->base.y_pos - E->base.y_pos - 16;
MotherBrain_Instr_AimRings();
return k;
}
uint16 MotherBrain_Instr_AimRingsAtSamus(uint16 k) { // 0xA99E5B
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
R18_ = samus_x_pos - E->base.x_pos - 10;
R20_ = samus_y_pos - E->base.y_pos - 16;
MotherBrain_Instr_AimRings();
return k;
}
void MotherBrain_Instr_AimRings(void) { // 0xA99E77
uint16 v0 = (uint8)-(int8)(CalculateAngleFromXY() + 0x80);
if (!sign8(v0 - 16)) {
if ((uint8)v0 < 0x48u)
goto LABEL_6;
LABEL_5:
LOBYTE(v0) = 72;
goto LABEL_6;
}
if (sign8(v0 + 64))
goto LABEL_5;
LOBYTE(v0) = 16;
LABEL_6:
Get_MotherBrain(0)->mbn_var_1A = v0;
}
uint16 MotherBrain_Instr_IncrShitroidAttackCtr(uint16 k) { // 0xA99EA3
int16 v3;
Enemy_MotherBrain *E = Get_MotherBrain(0);
v3 = E->mbn_var_13 + 1;
if ((uint16)v3 >= 0xCu)
v3 = 12;
E->mbn_var_13 = v3;
return k;
}
uint16 MotherBrain_Instr_SetShitroidAttackCtr0(uint16 k) { // 0xA99EB5
Get_MotherBrain(0)->mbn_var_13 = 0;
return k;
}
uint16 MotherBrain_Instr_SpawnBombEproj(uint16 k) { // 0xA99EBD
uint16 *v2 = (uint16 *)RomPtr_A9(k);
SpawnEnemyProjectileWithRoomGfx(addr_kEproj_MotherBrainBomb, *v2);
return k + 2;
}
uint16 MotherBrain_Instr_SpawnLaserEproj(uint16 k) { // 0xA99F46
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
E->mbn_var_31 = 0;
R18_ = E->base.x_pos + 16;
R20_ = E->base.y_pos + 4;
SpawnEnemyProjectileWithRoomGfx(addr_stru_86A17B, 1u);
return k;
}
uint16 MotherBrain_Instr_SpawnRainbowEproj(uint16 k) { // 0xA99F84
uint16 v2;
printf("A undefined\n"); v2 = 0;
SpawnEnemyProjectileWithRoomGfx(addr_kEproj_MotherBrainRainbowBeamCharging, v2);
return k;
}
uint16 MotherBrain_Instr_SetupFxForRainbowBeam(uint16 k) { // 0xA99F8E
Get_MotherBrain(0x40u)->mbn_var_14 = 0;
MotherBrain_SetupBrainPalForLaser();
QueueSfx2_Max6(0x7Fu);
return k;
}
void MotherBrain_Phase3_Death_0(void) { // 0xA9AEE1
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->base.properties |= kEnemyProps_Tangible;
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->base.properties |= 0x400u;
E->mbn_var_04 = 0;
if (MotherBrain_MakeWalkBackwards(0x28u, 6u) & 1) {
E->mbn_var_A = FUNC16(MotherBrain_Phase3_Death_1);
E->mbn_var_F = 128;
MotherBrain_Phase3_Death_1();
}
}
void MotherBrain_Phase3_Death_1(void) { // 0xA9AF12
MotherBrain_GenerateSmokyExplosions();
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0)
E->mbn_var_A = FUNC16(MotherBrain_Phase3_Death_2);
}
void MotherBrain_Phase3_Death_2(void) { // 0xA9AF21
MotherBrain_GenerateSmokyExplosions();
if (MotherBrain_MakeWalkForwards(2u, 0x60u) & 1) {
MotherBrain_SetBrainInstrs(addr_kMotherBrain_Ilist_9C39);
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->mbn_var_32 = 6;
E1->mbn_var_33 = 6;
E1->mbn_var_34 = 1280;
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_A = FUNC16(MotherBrain_Phase3_Death_3);
E->mbn_var_F = 32;
}
}
void MotherBrain_Phase3_Death_3(void) { // 0xA9AF54
MotherBrain_GenerateSmokyExplosions();
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0) {
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->mbn_var_32 = 0;
E1->mbn_var_33 = 0;
E1->mbn_var_12 = 0;
E1->mbn_var_14 = 0;
E1->mbn_var_10 = 0;
E1->mbn_var_11 = 0;
for (int i = 28; i >= 0; i -= 2)
palette_buffer[(i >> 1) + 241] = palette_buffer[(i >> 1) + 145];
MotherBrain_HealthBasedPaletteHandling();
E->mbn_var_0D = 3584;
E1->mbn_var_E = 0;
E1->mbn_var_F = 0;
E->mbn_var_A = FUNC16(MotherBrain_Phase3_Death_4);
MotherBrain_Phase3_Death_4();
}
}
void MotherBrain_Phase3_Death_4(void) { // 0xA9AF9D
MotherBrain_GenerateMixedExplosions();
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0) {
E->mbn_var_37 = 0;
E->mbn_var_A = FUNC16(MotherBrain_Phase3_Death_5);
E->mbn_var_F = 0;
MotherBrain_Phase3_Death_5();
}
}
void MotherBrain_Phase3_Death_5(void) { // 0xA9AFB6
HandleMotherBrainBodyFlickering();
MotherBrain_GenerateMixedExplosions();
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0) {
E->mbn_var_F = 16;
uint16 v2 = E->mbn_var_37 + 1;
E->mbn_var_37 = v2;
if (MotherBrain_FadePalToBlack(v2 - 1) & 1) {
enemy_bg2_tilemap_size = 710;
for (int i = 710; i >= 0; i -= 2)
tilemap_stuff[i >> 1] = 824;
nmi_flag_bg2_enemy_vram_transfer = 1;
E->base.properties = E->base.properties & 0xDEFF | 0x100;
E->base.extra_properties = 0;
E->mbn_var_A = FUNC16(MotherBrain_Phase3_Death_6);
E->mbn_var_F = 16;
}
}
}
void MotherBrain_Phase3_Death_6(void) { // 0xA9B013
MotherBrain_GenerateMixedExplosions();
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0)
E->mbn_var_A = FUNC16(MotherBrain_Phase3_Death_7);
}
void MotherBrain_GenerateSmokyExplosions(void) { // 0xA9B022
R22_ = addr_word_A9B10F;
R24_ = 2;
MotherBrain_GenerateExplosions(0x10u);
}
void MotherBrain_GenerateMixedExplosions(void) { // 0xA9B031
R22_ = addr_word_A9B109;
R24_ = 4;
MotherBrain_GenerateExplosions(8u);
}
void MotherBrain_GenerateExplosions(uint16 a) { // 0xA9B03E
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
bool v2 = (--E->mbn_var_E & 0x8000u) != 0;
if (v2) {
E->mbn_var_E = a;
v2 = (--E->mbn_var_F & 0x8000u) != 0;
if (v2)
E->mbn_var_F = 6;
uint16 v3 = 16 * E->mbn_var_F;
uint16 v4 = R24_;
uint16 v9;
do {
v9 = v4;
int v5 = v3 >> 1;
R18_ = g_word_A9B099[v5];
R20_ = g_word_A9B099[v5 + 1];
uint16 *v6 = (uint16 *)RomPtr_A9(R22_);
uint16 v7 = *v6;
uint16 Random = NextRandom();
if (Random >= 0x4000u) {
v7 = v6[1];
if (Random >= 0xE000u)
v7 = v6[2];
}
SpawnEnemyProjectileWithRoomGfx(addr_kEproj_MotherBrainDeathExplosion, v7);
v3 += 4;
v4 = v9 - 1;
} while (v9 != 1);
QueueSfx3_Max3(0x13u);
}
}
void MotherBrain_Phase3_Death_7(void) { // 0xA9B115
MotherBrain_SetBrainInstrs(addr_kMotherBrain_Ilist_9C29);
Get_MotherBrain(0x40u)->mbn_var_A = FUNC16(MotherBrainsBrain_SetupBrainToDraw);
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_F = 0;
E->mbn_var_A = FUNC16(MotherBrain_Phase3_Death_8);
MotherBrain_Phase3_Death_8();
}
void MotherBrain_Phase3_Death_8(void) { // 0xA9B12D
int16 v3;
Enemy_MotherBrain *E = Get_MotherBrain(0);
uint16 v1 = E->mbn_var_F + 32;
E->mbn_var_F = v1;
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
v3 = E1->base.y_pos + HIBYTE(v1);
if ((uint16)v3 >= 0xC4u) {
EnableEarthquakeAframes(2u);
E->mbn_var_A = FUNC16(MotherBrain_Phase3_Death_9);
E->mbn_var_F = 256;
v3 = 196;
}
E1->base.y_pos = v3;
}
void MotherBrain_Phase3_Death_9(void) { // 0xA9B15E
if (ProcessSpriteTilesTransfers(0xa9, addr_stru_A99003)) {
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_A = FUNC16(MotherBrain_Phase3_Death_10);
E->mbn_var_F = 32;
}
}
void MotherBrain_Phase3_Death_10(void) { // 0xA9B173
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0) {
E->mbn_var_37 = 0;
E->mbn_var_A = FUNC16(MotherBrain_Phase3_Death_11);
E->mbn_var_F = 0;
}
}
void MotherBrain_Phase3_Death_11(void) { // 0xA9B189
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0) {
uint16 v2 = E->mbn_var_37 + 1;
E->mbn_var_37 = v2;
if (MotherBrain_FadeToGray_RealDeath(v2 - 1) & 1) {
MotherBrain_SetBrainInstrs(addr_kMotherBrain_Ilist_9D25);
E->mbn_var_A = FUNC16(MotherBrain_Phase3_Death_12);
E->mbn_var_F = 256;
} else {
E->mbn_var_F = 16;
}
}
}
void MotherBrain_Phase3_Death_12(void) { // 0xA9B1B8
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0) {
E->mbn_var_A = FUNC16(MotherBrain_Phase3_Death_13);
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->base.properties |= 0x400u;
E->mbn_var_04 = 0;
}
}
void MotherBrain_Phase3_Death_13(void) { // 0xA9B1D5
if (ProcessCorpseRotting(0x40u) & 1) {
uint16 dms_var_53 = Get_DeadMonsters(0x40u)->dms_var_53;
ProcessCorpseRottingVramTransfers(dms_var_53);
} else {
Enemy_DeadMonsters *E1 = Get_DeadMonsters(0x40u);
E1->base.properties = E1->base.properties & 0xDEFF | 0x100;
E1->base.extra_properties = 0;
QueueMusic_Delayed8(0);
QueueMusic_Delayed8(0xFF24u);
E1 = Get_DeadMonsters(0);
E1->dms_var_A = FUNC16(MotherBrain_Phase3_Death_14_20framedelay);
E1->dms_var_F = 20;
MotherBrain_Phase3_Death_14_20framedelay();
}
}
void MotherBrain_Phase3_Death_14_20framedelay(void) { // 0xA9B211
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0) {
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->base.x_pos = 0;
E1->base.y_pos = 0;
E->mbn_var_A = FUNC16(MotherBrain_Phase3_Death_15_LoadEscapeTimerTiles);
}
}
void MotherBrain_CorpseRottingFinished(void) { // 0xA9B223
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
R18_ = E1->base.x_pos + (random_number & 0x1F) - 16;
R20_ = E1->base.y_pos + 16;
SpawnEnemyProjectileWithRoomGfx(addr_kEproj_DustCloudExplosion, 0xAu);
if ((enemy_damage_routine_exec_count & 7) == 0)
QueueSfx2_Max3(0x10u);
}
void MotherBrain_Phase3_Death_15_LoadEscapeTimerTiles(void) { // 0xA9B258
if (ProcessSpriteTilesTransfers(0xa6, addr_stru_A6C4CB)) {
Get_MotherBrain(0)->mbn_var_A = FUNC16(MotherBrain_Phase3_Death_16_StartEscape);
MotherBrain_Phase3_Death_16_StartEscape();
}
}
void MotherBrain_Phase3_Death_16_StartEscape(void) { // 0xA9B26D
if (ProcessSpriteTilesTransfers(0xa9, addr_stru_A9902F)) {
WriteColorsToPalette(0x122u, 0xa9, addr_kMotherBrainPalette_5__plus__2, 0xEu);
QueueMusic_Delayed8(7u);
earthquake_type = 5;
earthquake_timer = -1;
SpawnPalfxObject(addr_kPalfx_FFC9);
SpawnPalfxObject(addr_kPalfx_FFCD);
SpawnPalfxObject(addr_kPalfx_FFD1);
SpawnPalfxObject(addr_kPalfx_FFD5);
Get_MotherBrain(0x40u)->mbn_var_02 = 0;
SetupZebesEscapeTypewriter();
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_F = 32;
uint16 v1 = FUNC16(MotherBrain_Phase3_Death_17_SpawnTimeBomb);
if (!japanese_text_flag)
v1 = FUNC16(MotherBrain_Phase3_Death_18_TypesZebesText);
E->mbn_var_A = v1;
}
}
void MotherBrain_Phase3_Death_17_SpawnTimeBomb(void) { // 0xA9B2D1
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0) {
E->mbn_var_A = FUNC16(MotherBrain_Phase3_Death_18_TypesZebesText);
SpawnEnemyProjectileWithRoomGfx(
addr_kEproj_TimeBombSetJapaneseText,
FUNC16(MotherBrain_Phase3_Death_18_TypesZebesText));
}
MotherBrain_Phase3_Death_18_TypesZebesText();
}
void MotherBrain_Phase3_Death_18_TypesZebesText(void) { // 0xA9B2E3
if (HandleTypewriterText_Ext(0x2610u) & 1) {
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_A = FUNC16(MotherBrain_Phase3_Death_19_EscapeDoorExploding);
E->mbn_var_F = 32;
}
}
void MotherBrain_Phase3_Death_19_EscapeDoorExploding(void) { // 0xA9B2F9
MotherBrain_GenerateEscapeDoorExploding();
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0) {
CallSomeSamusCode(0xFu);
timer_status = 2;
SetBossBitForCurArea(2u);
SetEventHappened(0xEu);
E->mbn_var_A = FUNC16(MotherBrain_Phase3_Death_20_BlowUpEscapeDoor);
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->mbn_var_E = 0;
E1->mbn_var_F = 0;
}
}
void MotherBrain_Phase3_Death_20_BlowUpEscapeDoor(void) { // 0xA9B32A
static const SpawnHardcodedPlmArgs unk_A9B337 = { 0x00, 0x06, 0xb677 };
MotherBrain_ExplodeEscapeDoor();
Get_MotherBrain(0)->mbn_var_A = FUNC16(MotherBrain_Phase3_Death_21_KeepEarthquakeGoing);
SpawnHardcodedPlm(&unk_A9B337);
}
void MotherBrain_Phase3_Death_21_KeepEarthquakeGoing(void) { // 0xA9B33C
if (!earthquake_timer)
--earthquake_timer;
}
void MotherBrain_GenerateEscapeDoorExploding(void) { // 0xA9B346
int16 v1;
int16 v2;
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
v1 = E->mbn_var_E - 1;
E->mbn_var_E = v1;
if (v1 < 0) {
E->mbn_var_E = 4;
v2 = E->mbn_var_F - 1;
E->mbn_var_F = v2;
if (v2 < 0)
E->mbn_var_F = 3;
int v3 = (uint16)(4 * E->mbn_var_F) >> 1;
R18_ = g_word_A9B393[v3];
R20_ = g_word_A9B393[v3 + 1];
uint16 v4 = 3;
if (NextRandom() < 0x4000u)
v4 = 12;
SpawnEnemyProjectileWithRoomGfx(addr_kEproj_DustCloudExplosion, v4);
QueueSfx2_Max3(0x24u);
}
}
void MotherBrain_ExplodeEscapeDoor(void) { // 0xA9B3A3
uint16 v0 = 0, v1;
do {
v1 = v0;
SpawnEnemyProjectileWithRoomGfx(addr_kEproj_MotherBrainExplodedEscapeDoor, v0);
v0 = v1 + 1;
} while ((uint16)(v1 + 1) < 8u);
}
void MotherBrain_SamusCollDetect(void) { // 0xA9B3B6
char v1; // cf
Enemy_MotherBrain *E0 = Get_MotherBrain(0);
R26_ = E0->mbn_var_04;
v1 = R26_ & 1;
R26_ >>= 1;
if (!v1
|| (R18_ = E0->base.x_pos,
R20_ = E0->base.y_pos,
!(MotherBrain_SamusCollDetectPart(addr_word_A9B427) & 1))) {
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
v1 = R26_ & 1;
R26_ >>= 1;
if (!v1
|| (R18_ = E->base.x_pos,
R20_ = E->base.y_pos,
!(MotherBrain_SamusCollDetectPart(0xB439u) & 1))) {
v1 = R26_ & 1;
R26_ >>= 1;
if (v1) {
R18_ = E->mbn_var_25;
R20_ = E->mbn_var_26;
if (!(MotherBrain_SamusCollDetectPart(0xB44Bu) & 1)) {
R18_ = E->mbn_var_28;
R20_ = E->mbn_var_29;
if (!(MotherBrain_SamusCollDetectPart(0xB44Bu) & 1)) {
R18_ = E->mbn_var_2B;
R20_ = E->mbn_var_2C;
MotherBrain_SamusCollDetectPart(0xB44Bu);
}
}
}
}
}
}
uint8 MotherBrain_SamusCollDetectPart(uint16 k) { // 0xA9B455
int16 v5;
uint16 *v1 = (uint16 *)RomPtr_A9(k);
if (!*v1)
return 0;
R22_ = *v1;
for (int i = k + 2; ; i += 8) {
uint16 v3, v4;
if ((int16)(samus_y_pos - R20_) >= 0) {
R24_ = samus_y_pos - R20_;
v3 = *((uint16 *)RomPtr_A9(i) + 3);
} else {
R24_ = R20_ - samus_y_pos;
v3 = *((uint16 *)RomPtr_A9(i) + 1);
}
if ((int16)(samus_y_radius + abs16(v3) - R24_) >= 0) {
if ((int16)(samus_x_pos - R18_) >= 0) {
R24_ = samus_x_pos - R18_;
v4 = *((uint16 *)RomPtr_A9(i) + 2);
} else {
R24_ = R18_ - samus_x_pos;
v4 = *(uint16 *)RomPtr_A9(i);
}
v5 = samus_x_radius + abs16(v4) - R24_;
if (v5 >= 0)
break;
}
if (!--R22_)
return 0;
}
if (sign16(v5 - 4))
v5 = 4;
extra_samus_x_displacement = v5;
extra_samus_y_displacement = 4;
extra_samus_x_subdisplacement = 0;
extra_samus_y_subdisplacement = 0;
samus_invincibility_timer = 96;
samus_knockback_timer = 5;
knockback_x_dir = 1;
if (sign16(samus_y_pos - 192))
samus_y_dir = 2;
if ((int16)(Get_MotherBrain(0)->base.x_pos + 24 - samus_x_pos) < 0)
MotherBrain_HurtSamus();
return 1;
}
void MotherBrainsBody_Shot(void) { // 0xA9B503
CreateDudShot();
}
void MotherBrainsBrain_Shot(void) { // 0xA9B507
int16 v2;
Enemy_MotherBrain *E = Get_MotherBrain(0);
if (E->mbn_var_00) {
MotherBrain_Phase23_ShotReaction();
if (E->mbn_var_00 == 1)
CreateDudShot();
else
NormalEnemyShotAiSkipDeathAnim_CurEnemy();
} else {
uint16 v1 = HIBYTE(projectile_type[collision_detection_index]) & 7;
if (g_byte_A9B546[v1]) {
plm_room_arguments[39] += g_byte_A9B546[v1];
QueueSfx2_Max6(0x6Eu);
v2 = 13;
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
uint16 flash_timer = E1->base.flash_timer;
if (flash_timer) {
if (flash_timer & 1)
v2 = 14;
}
E1->base.flash_timer = v2;
NormalEnemyShotAiSkipDeathAnim_CurEnemy();
}
}
}
void MotherBrain_Phase23_ShotReaction(void) { // 0xA9B562
int16 v1;
Enemy_MotherBrain *E = Get_MotherBrain(0);
if (E->mbn_var_00 == 4 && MotherBrain_DetermineShotReactionType() == 2) {
MotherBrain_Phase3_BeamShotReaction();
} else {
if (MotherBrain_DetermineShotReactionType() == 1 || (v1 = E->mbn_var_07 - 256, v1 < 0))
v1 = 0;
E->mbn_var_07 = v1;
}
}
uint16 MotherBrain_DetermineShotReactionType(void) { // 0xA9B58E
return g_byte_A9B5A1[HIBYTE(projectile_type[collision_detection_index]) & 7];
}
void MotherBrain_Phase3_BeamShotReaction(void) { // 0xA9B5A9
int16 v1;
Enemy_MotherBrain *E = Get_MotherBrain(0);
v1 = E->mbn_var_07 - 266;
if (v1 < 0) {
Get_MotherBrain(0x40u)->mbn_var_18 = FUNC16(MotherBrain_Phase3_Neck_SetupHyperBeamRecoil);
v1 = 0;
E->mbn_var_F = 0;
}
E->mbn_var_07 = v1;
}
void MotherBrainsBrain_Touch(void) { // 0xA9B5C6
int16 v0;
if (samus_movement_type == 3) {
v0 = 13;
EnemyData *v1 = gEnemyData(0);
uint16 flash_timer = v1[1].flash_timer;
if (flash_timer) {
if (flash_timer & 1)
v0 = 14;
}
v1[1].flash_timer = v0;
}
}
void MotherBrain_HurtSamus(void) { // 0xA9B5E1
Ridley_Func_98();
samus_invincibility_timer = 96;
samus_knockback_timer = 5;
knockback_x_dir = (int16)(samus_x_pos - Get_MotherBrain(cur_enemy_index)->base.x_pos) >= 0;
}
void MotherBrain_Body_Phase2_Thinking(void) { // 0xA9B605
Enemy_MotherBrain *E = Get_MotherBrain(0);
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
if (!E1->base.health) {
E->mbn_var_A = FUNC16(MotherBomb_FiringRainbowBeam_0);
MotherBomb_FiringRainbowBeam_0();
return;
}
if (!E->mbn_var_02) {
if (!sign16(E1->base.health - 4500)) {
if (random_number >= 0x1000u) {
LABEL_6:
MotherBrain_HandleWalking();
return;
}
LABEL_7:
E->mbn_var_A = FUNC16(MotherBrain_Body_Phase2_TryAttack);
return;
}
if (random_number < 0x2000u)
goto LABEL_6;
if (random_number >= 0xA000u)
goto LABEL_7;
E->mbn_var_A = FUNC16(MotherBomb_FiringDeathBeam);
}
}
void MotherBrain_Body_Phase2_TryAttack(void) { // 0xA9B64B
int16 v0;
Enemy_MotherBrain *E = Get_MotherBrain(0);
v0 = 2 * E->mbn_var_18;
if (v0) {
if (v0 == 2) {
MotherBrain_Phase2_Attack_Cooldown();
} else {
if (v0 != 4) {
Unreachable();
while (1)
;
}
MotherBrain_Phase2_Attack_End();
}
} else {
E->mbn_parameter_1 = 64;
++E->mbn_var_18;
if (MotherBrain_Phase2_DecideAttackStrategy_DoubleRet())
return;
uint16 v2 = addr_byte_A9B6DC;
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
if (abs16(E1->base.y_pos + 4 - samus_y_pos) < 0x20u)
v2 = addr_byte_A9B6DF;
uint16 v4 = 0;
uint8 *v5 = RomPtr_A9(v2);
if ((uint8)random_number >= *v5) {
v4 = 2;
if ((uint8)random_number >= v5[1]) {
v4 = 4;
if ((uint8)random_number >= v5[2])
v4 = 6;
}
}
uint16 v6 = g_off_A9B6D4[v4 >> 1];
if (v6 == (uint16)addr_kMotherBrain_Ilist_9ECC) {
if (sign16(E1->mbn_var_05 - 1)) {
E->mbn_var_A = FUNC16(MotherBrain_FiringBomb_DecideOnWalking);
MotherBrain_FiringBomb_DecideOnWalking();
}
} else if (v6 == (uint16)addr_kMotherBrain_Ilist_9F34) {
E->mbn_var_A = FUNC16(MotherBomb_FiringLaser_PositionHead);
MotherBomb_FiringLaser_PositionHead();
} else {
MotherBrain_SetBrainInstrs(v6);
}
}
}
uint8 MotherBrain_Phase2_DecideAttackStrategy_DoubleRet(void) { // 0xA9B6E2
if (g_word_A9B72C[samus_movement_type]) {
if (sign16((uint8)random_number - 128)) {
return 0;
} else {
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
if (sign16(E1->mbn_var_05 - 1)) {
Get_MotherBrain(0)->mbn_var_A = FUNC16(MotherBrain_FiringBomb_DecideOnWalking);
MotherBrain_FiringBomb_DecideOnWalking();
return 1;
}
return 0;
}
} else {
if (sign16((uint8)random_number - 128)) {
Get_MotherBrain(0)->mbn_var_A = FUNC16(MotherBomb_FiringLaser_PositionHead);
MotherBomb_FiringLaser_PositionHead();
} else {
MotherBrain_SetBrainInstrs(addr_kMotherBrain_Ilist_9D3D);
}
return 1;
}
}
void MotherBrain_Phase2_Attack_Cooldown(void) { // 0xA9B764
Enemy_MotherBrain *E = Get_MotherBrain(0);
if (E->mbn_parameter_1-- == 1)
++E->mbn_var_18;
}
void MotherBrain_Phase2_Attack_End(void) { // 0xA9B773
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_18 = 0;
E->mbn_var_A = FUNC16(MotherBrain_Body_Phase2_Thinking);
}
void MotherBrain_FiringBomb_DecideOnWalking(void) { // 0xA9B781
if (random_number >= 0xFF80u) {
MotherBrain_FiringBomb_DecideOnCrouching();
return;
}
uint16 v0 = 64;
if (random_number < 0x6000u)
v0 = 96;
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((int16)(v0 - E->base.x_pos) >= 0
|| (E->mbn_var_F = v0, MotherBrain_MakeWalkBackwards(v0, 6u) & 1)) {
MotherBrain_FiringBomb_DecideOnCrouching();
} else {
E->mbn_var_A = FUNC16(MotherBrain_FiringBomb_WalkingBackwards);
}
}
void MotherBrain_FiringBomb_WalkingBackwards(void) { // 0xA9B7AC
Enemy_MotherBrain *E = Get_MotherBrain(0);
if (MotherBrain_MakeWalkBackwards(E->mbn_var_F, 6u) & 1)
MotherBrain_FiringBomb_DecideOnCrouching();
}
void MotherBrain_FiringBomb_DecideOnCrouching(void) { // 0xA9B7B7
if (NextRandom() >= 0x8000u) {
Get_MotherBrain(0)->mbn_var_A = FUNC16(MotherBrain_FiringBomb_Crouch);
MotherBrain_FiringBomb_Crouch();
} else {
MotherBrain_B7CB();
}
}
void MotherBrain_FiringBomb_Crouch(void) { // 0xA9B7C6
if (MotherBrain_MakeHerCrouch() & 1)
MotherBrain_B7CB();
}
void MotherBrain_B7CB(void) { // 0xA9B7CB
uint16 v0 = addr_kMotherBrain_Ilist_9ECC;
Enemy_MotherBrain *E = Get_MotherBrain(0);
if (E->mbn_var_1F)
v0 = addr_kMotherBrain_Ilist_9F00;
MotherBrain_SetBrainInstrs(v0);
E->mbn_var_A = FUNC16(MotherBrain_FiringBomb_Fired);
E->mbn_var_F = 44;
}
void MotherBrain_FiringBomb_Fired(void) { // 0xA9B7E8
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0) {
if (MotherBrain_MakeHerStandUp() & 1) {
MotherBrain_FiringBomb_Finish();
} else {
E->mbn_var_A = FUNC16(MotherBrain_FiringBomb_Standup);
MotherBrain_FiringBomb_Standup();
}
}
}
void MotherBrain_FiringBomb_Standup(void) { // 0xA9B7F8
if (MotherBrain_MakeHerStandUp() & 1)
MotherBrain_FiringBomb_Finish();
}
void MotherBrain_FiringBomb_Finish(void) { // 0xA9B7FD
uint16 v0 = FUNC16(MotherBrain_Body_Phase2_Thinking);
Enemy_MotherBrain *E = Get_MotherBrain(0);
if (E->mbn_var_1F)
v0 = FUNC16(MotherBrain_Phase2_MurderShitroid_1);
E->mbn_var_A = v0;
}
void MotherBomb_FiringLaser_PositionHead(void) { // 0xA9B80E
int16 v0;
v0 = 8;
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
if ((int16)(E1->base.y_pos - samus_y_pos) < 0)
v0 = 6;
E1->mbn_var_32 = v0;
E1->mbn_var_33 = v0;
E1->mbn_var_34 = 512;
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_A = FUNC16(MotherBomb_FiringLaser_PositionHeadSlowlyFire);
E->mbn_var_F = 4;
}
void MotherBomb_FiringLaser_PositionHeadSlowlyFire(void) { // 0xA9B839
int16 v2;
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0) {
v2 = 256;
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
if ((E1->mbn_var_34 & 0x8000u) != 0)
v2 = -256;
E1->mbn_var_34 = v2;
MotherBrain_SetBrainInstrs(addr_kMotherBrain_Ilist_9F34);
E->mbn_var_A = FUNC16(MotherBomb_FiringLaser_FinishAttack);
E->mbn_var_F = 16;
}
}
void MotherBomb_FiringLaser_FinishAttack(void) { // 0xA9B863
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0) {
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->mbn_var_32 = 4;
E1->mbn_var_33 = 4;
E->mbn_var_A = FUNC16(MotherBrain_Body_Phase2_Thinking);
MotherBrain_Body_Phase2_Thinking();
}
}
static Func_V *const off_A9B887[4] = { // 0xA9B87D
MotherBomb_FiringDeathBeam_0,
MotherBomb_FiringDeathBeam_1,
MotherBomb_FiringDeathBeam_2,
MotherBomb_FiringDeathBeam_3,
};
void MotherBomb_FiringDeathBeam(void) {
int v0 = (uint16)(2 * Get_MotherBrain(0)->mbn_var_17) >> 1;
off_A9B887[v0]();
}
void MotherBomb_FiringDeathBeam_0(void) { // 0xA9B88F
if (MotherBrain_MakeWalkBackwards(0x28u, 8u) & 1) {
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->mbn_var_32 = 8;
E1->mbn_var_33 = 6;
Enemy_MotherBrain *E = Get_MotherBrain(0);
++E->mbn_var_17;
}
}
void MotherBomb_FiringDeathBeam_1(void) { // 0xA9B8B2
if (!Get_MotherBrain(0x40u)->mbn_var_05) {
MotherBrain_SetBodyInstrs(addr_kMotherBrain_Ilist_9A42);
Enemy_MotherBrain *E = Get_MotherBrain(0);
++E->mbn_var_17;
}
}
void MotherBomb_FiringDeathBeam_2(void) { // 0xA9B8C8
;
}
void MotherBomb_FiringDeathBeam_3(void) { // 0xA9B8C9
MotherBrain_SetBrainInstrs(addr_kMotherBrain_Ilist_9C87);
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->mbn_var_32 = 2;
E1->mbn_var_33 = 4;
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_17 = 0;
E->mbn_var_A = FUNC16(MotherBrain_Body_Phase2_Thinking);
}
void MotherBomb_FiringRainbowBeam_0(void) { // 0xA9B8EB
MotherBrain_SetBrainInstrs(addr_kMotherBrain_Ilist_9C87);
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->mbn_var_34 = 64;
E1->mbn_var_31 = 1;
E1->mbn_var_32 = 2;
E1->mbn_var_33 = 4;
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_A = FUNC16(MotherBomb_FiringRainbowBeam_1_StartCharge);
E->mbn_var_F = 256;
}
void MotherBomb_FiringRainbowBeam_1_StartCharge(void) { // 0xA9B91A
Enemy_MotherBomb *E = Get_MotherBomb(0);
if ((--E->mbb_var_F & 0x8000u) != 0) {
MotherBrain_SetBrainInstrs(addr_kMotherBrain_Ilist_9F6C);
E->mbb_var_A = FUNC16(MotherBomb_FiringRainbowBeam_2_RetractNeck);
MotherBomb_FiringRainbowBeam_2_RetractNeck();
}
}
void MotherBomb_FiringRainbowBeam_2_RetractNeck(void) { // 0xA9B92B
if (MotherBrain_WalkBackwardsSlowlyAndRetractHead(0x28u) & 1) {
Enemy_MotherBomb *E = Get_MotherBomb(0);
E->mbb_var_A = FUNC16(MotherBomb_FiringRainbowBeam_3_Wait);
E->mbb_var_F = 256;
MotherBomb_FiringRainbowBeam_3_Wait();
}
}
void MotherBomb_FiringRainbowBeam_3_Wait(void) { // 0xA9B93F
Enemy_MotherBomb *E = Get_MotherBomb(0);
if ((--E->mbb_var_F & 0x8000u) != 0) {
QueueSfx2_Max6(0x71u);
E->mbb_var_A = FUNC16(MotherBomb_FiringRainbowBeam_4_ExtendNeckDown);
MotherBomb_FiringRainbowBeam_4_ExtendNeckDown();
}
}
void MotherBomb_FiringRainbowBeam_4_ExtendNeckDown(void) { // 0xA9B951
cooldown_timer = 8;
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->mbn_var_32 = 6;
E1->mbn_var_33 = 6;
E1->mbn_var_34 = 1280;
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_A = FUNC16(MotherBomb_FiringRainbowBeam_5_StartFiring);
E->mbn_var_F = 16;
MotherBomb_FiringRainbowBeam_5_StartFiring();
}
void MotherBomb_FiringRainbowBeam_5_StartFiring(void) { // 0xA9B975
MotherBrain_AimBeamAndIncrWidth();
if (!power_bomb_flag) {
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0 && !power_bomb_flag) {
cooldown_timer = 0;
MotherBrain_BodyRainbowBeamPalAnimIndex0();
MotherBrain_SetBrainInstrs(addr_kMotherBrain_Ilist_9C77);
E->mbn_var_33 = 512;
E->mbn_var_09 = SpawnMotherBrainRainbowBeamHdma();
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->mbn_var_34 = 64;
E1->mbn_var_31 = 1;
E1->mbn_var_32 = 2;
E1->mbn_var_33 = 4;
E->mbn_parameter_1 = 0;
E->mbn_parameter_2 = 0;
uint16 v4 = 5;
if ((int16)(samus_health - 700) < 0)
v4 = 24;
CallSomeSamusCode(v4);
E->mbn_var_15 = 6;
E->mbn_var_A = FUNC16(MotherBomb_FiringRainbowBeam_6_MoveSamusToWall);
}
}
}
void MotherBomb_FiringRainbowBeam_6_MoveSamusToWall(void) { // 0xA9B9E5
MotherBrain_PlayRainbowBeamSfx();
MotherBrain_HandleRainbowBeamPalette();
MotherBrain_AimBeamAndIncrWidth();
MotherBrain_HandleRainbowBeamExplosions();
if (MotherBrain_MoveSamusTowardsWallDueToBeam() & 1) {
Enemy_MotherBomb *E = Get_MotherBomb(0);
E->mbb_var_A = FUNC16(MotherBomb_FiringRainbowBeam_7_DelayFrame);
E->mbb_var_F = 0;
}
}
void MotherBomb_FiringRainbowBeam_7_DelayFrame(void) { // 0xA9BA00
MotherBrain_PlayRainbowBeamSfx();
MotherBrain_HandleRainbowBeamPalette();
MotherBrain_AimBeamAndIncrWidth();
MotherBrain_HandleRainbowBeamExplosions();
MotherBrain_MoveSamusTowardsWallDueToBeam();
Enemy_MotherBomb *E = Get_MotherBomb(0);
if ((--E->mbb_var_F & 0x8000u) != 0) {
earthquake_type = 8;
earthquake_timer = 8;
E->mbb_var_A = FUNC16(MotherBomb_FiringRainbowBeam_8_StartDrainSamus);
}
}
void MotherBomb_FiringRainbowBeam_8_StartDrainSamus(void) { // 0xA9BA27
Enemy_MotherBomb *E = Get_MotherBomb(0);
E->mbb_var_A = FUNC16(MotherBomb_FiringRainbowBeam_9_DrainingSamus);
E->mbb_var_F = 299;
earthquake_timer = 299;
earthquake_type = 8;
MotherBomb_FiringRainbowBeam_9_DrainingSamus();
}
void MotherBomb_FiringRainbowBeam_9_DrainingSamus(void) { // 0xA9BA3C
MotherBrain_PlayRainbowBeamSfx();
MotherBrain_HandleRainbowBeamPalette();
MotherBrain_AimBeamAndIncrWidth();
MotherBrain_HandleRainbowBeamExplosions();
Samus_DamageDueToRainbowBeam();
Samus_DecrementAmmoDueToRainbowBeam();
MotherBrain_MoveSamusTowardsMiddleOfWall();
Enemy_MotherBomb *E = Get_MotherBomb(0);
if ((--E->mbb_var_F & 0x8000u) != 0)
E->mbb_var_A = FUNC16(MotherBomb_FiringRainbowBeam_10_FinishFiringRainbow);
}
void MotherBomb_FiringRainbowBeam_10_FinishFiringRainbow(void) { // 0xA9BA5E
MotherBrain_PlayRainbowBeamSfx();
MotherBrain_HandleRainbowBeamPalette();
MotherBrain_AimBeam();
MotherBrain_HandleRainbowBeamExplosions();
Enemy_MotherBrain *E = Get_MotherBrain(0);
uint16 v1 = E->mbn_var_33 - 384;
E->mbn_var_33 = v1;
if (sign16(v1 - 512)) {
E->mbn_var_33 = 512;
E->mbn_parameter_1 = -256;
E->mbn_parameter_2 = 0;
hdma_object_channels_bitmask[E->mbn_var_09 >> 1] = 0;
earthquake_timer = 0;
MotherBrain_SetBrainInstrs(addr_kMotherBrain_Ilist_9C87);
MotherBrain_SetupBrainNormalPal();
MotherBrain_WriteDefaultPalette();
QueueSfx1_Max6(2u);
E->mbn_var_16 = 0;
CallSomeSamusCode(1u);
cooldown_timer = 8;
E->mbn_var_A = FUNC16(MotherBomb_FiringRainbowBeam_11_LetSamusFall);
}
}
void MotherBomb_FiringRainbowBeam_11_LetSamusFall(void) { // 0xA9BAC4
SomeMotherBrainScripts(0);
Get_MotherBomb(0)->mbb_var_A = FUNC16(MotherBomb_FiringRainbowBeam_12_WaitForSamusHitGround);
MotherBomb_FiringRainbowBeam_12_WaitForSamusHitGround();
}
void MotherBomb_FiringRainbowBeam_12_WaitForSamusHitGround(void) { // 0xA9BAD1
if (MotherBrain_MoveSamusForFallingAfterBeam() & 1)
Get_MotherBomb(0)->mbb_var_A = FUNC16(MotherBomb_FiringRainbowBeam_13_LowerHead);
}
void MotherBomb_FiringRainbowBeam_13_LowerHead(void) { // 0xA9BADD
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->mbn_var_34 = 64;
E1->mbn_var_31 = 1;
E1->mbn_var_32 = 2;
E1->mbn_var_33 = 4;
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_A = FUNC16(MotherBomb_FiringRainbowBeam_14_DecideNextAction);
E->mbn_var_F = 128;
}
void MotherBomb_FiringRainbowBeam_14_DecideNextAction(void) { // 0xA9BB06
Enemy_MotherBomb *E = Get_MotherBomb(0);
if ((--E->mbb_var_F & 0x8000u) != 0) {
if (sign16(samus_health - 400)) {
MotherBrain_MakeWalkForwards(0xAu, E->base.x_pos + 16);
E->mbb_var_A = FUNC16(MotherBrain_Phase2Cut_0);
} else {
E->mbb_var_A = FUNC16(MotherBomb_FiringRainbowBeam_0);
}
}
}
void MotherBrain_PlayRainbowBeamSfx(void) { // 0xA9BB2E
int16 mbn_var_15;
Enemy_MotherBrain *E = Get_MotherBrain(0);
mbn_var_15 = E->mbn_var_15;
if (mbn_var_15 >= 0) {
E->mbn_var_15 = mbn_var_15 - 1;
QueueSfx1_Max6(0x40u);
E->mbn_var_16 = 1;
}
}
uint8 MotherBrain_WalkBackwardsSlowlyAndRetractHead(uint16 a) { // 0xA9BB48
uint8 rv = MotherBrain_MakeWalkBackwards(a, 0xAu);
if (rv)
MotherBrain_RetractHead();
return rv;
}
void MotherBrain_RetractHead(void) { // 0xA9BB51
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
E->mbn_var_34 = 80;
E->mbn_var_31 = 1;
E->mbn_var_32 = 8;
E->mbn_var_33 = 6;
}
void MotherBrain_AimBeamAndIncrWidth(void) { // 0xA9BB6E
int16 v1;
Enemy_MotherBrain *E = Get_MotherBrain(0);
v1 = E->mbn_var_33 + 384;
if (!sign16(E->mbn_var_33 - 2688))
v1 = 3072;
E->mbn_var_33 = v1;
MotherBrain_AimBeam();
}
void MotherBrain_AimBeam(void) { // 0xA9BB82
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
R18_ = samus_x_pos - E->base.x_pos - 16;
R20_ = samus_y_pos - E->base.y_pos - 4;
uint16 v1 = (uint8)-(int8)(CalculateAngleFromXY() + 0x80);
Get_MotherBrain(0)->mbn_var_31 = v1;
}
void MotherBrain_CalculateRainbowBeamHdma_(void) { // 0xA9BBB0
MotherBrain_CalculateRainbowBeamHdma();
}
uint8 MotherBrain_MoveSamusTowardsWallDueToBeam(void) { // 0xA9BBB5
uint8 v0 = MotherBrain_MoveSamusHorizTowardsWall(0x1000u);
if (!v0) {
R18_ = Get_MotherBrain(0)->mbn_var_31;
uint16 v1 = Math_MultByCos(0x1000u);
MotherBrain_MoveSamusVerticallyTowardsCeilingFloor(v1);
}
return v0;
}
void MotherBrain_MoveSamusTowardsMiddleOfWall(void) { // 0xA9BBCF
uint16 v0 = 64;
if ((int16)(124 - samus_y_pos) < 0)
v0 = -64;
MotherBrain_MoveSamusVerticallyTowardsCeilingFloor(v0);
}
uint8 MotherBrain_MoveSamusForFallingAfterBeam(void) { // 0xA9BBE1
int16 v1;
Enemy_MotherBrain *E = Get_MotherBrain(0);
v1 = E->mbn_parameter_1 + 2;
if (v1 >= 0)
v1 = 0;
E->mbn_parameter_1 = v1;
MotherBrain_MoveSamusHorizTowardsWall(v1);
uint16 v2 = E->mbn_parameter_2 + 24;
E->mbn_parameter_2 = v2;
return MotherBrain_MoveSamusVerticallyTowardsCeilingFloor(v2) & 1;
}
uint8 MotherBrain_MoveSamusVerticallyTowardsCeilingFloor(uint16 a) { // 0xA9BBFD
int carry = HIBYTE(samus_y_subpos) + LOBYTE(a);
HIBYTE(samus_y_subpos) = carry;
HIBYTE(samus_prev_y_subpos) = carry;
uint16 v4 = samus_y_pos + (int8)(a >> 8) + (carry >> 8), v6;
if (sign16(v4 - 48)) {
v6 = 48;
} else {
if (sign16(v4 - 192)) {
samus_prev_y_pos = samus_y_pos = v4;
return 0;
}
v6 = 192;
}
samus_prev_y_pos = samus_y_pos = v6;
samus_y_subpos = 0;
samus_prev_y_subpos = 0;
return 1;
}
uint8 MotherBrain_MoveSamusHorizTowardsWall(uint16 a) { // 0xA9BC3F
int carry = HIBYTE(samus_x_subpos) + LOBYTE(a);
HIBYTE(samus_x_subpos) = carry;
HIBYTE(samus_prev_x_subpos) = carry;
uint16 v4 = samus_x_pos + (int8)(a >> 8) + (carry >> 8);
if (sign16(v4 - 235)) {
samus_x_pos = v4;
samus_prev_x_pos = v4;
return 0;
} else {
samus_x_pos = 235;
samus_prev_x_pos = 235;
samus_x_subpos = 0;
samus_prev_x_subpos = 0;
return 1;
}
}
void MotherBrain_HandleRainbowBeamExplosions(void) { // 0xA9BC76
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_parameter_2 & 0x8000u) != 0) {
E->mbn_parameter_2 = 8;
++E->mbn_parameter_1;
int v2 = E->mbn_parameter_1 & 7;
R18_ = g_word_A9BCA6[v2];
R20_ = g_word_A9BCB6[v2];
SpawnEnemyProjectileWithRoomGfx(addr_kEproj_MotherBrainRainbowBeamExplosion, R20_);
QueueSfx2_Max6(0x24u);
}
}
void MotherBrain_BodyRainbowBeamPalAnimIndex0(void) { // 0xA9BCC6
Get_MotherBrain(0x40u)->mbn_var_01 = 0;
}
void MotherBrain_WriteDefaultPalette(void) { // 0xA9BCCE
WriteColorsToPalette(0x82u, 0xa9, addr_kMotherBrainsBrain_Palette__plus__2, 0xFu);
WriteColorsToPalette(0x122u, 0xa9, addr_kMotherBrainsBrain_Palette__plus__2, 0xFu);
WriteColorsToPalette(0x162u, 0xa9, addr_kMotherBrainPalette_0__plus__2, 0xFu);
}
void MotherBrain_WritePhase2DeathPalette(void) { // 0xA9BCF6
MotherBrain_WritePalette(MotherBrain_RainbowBeamPalettes[6]);
}
void MotherBrain_HandleRainbowBeamPalette(void) { // 0xA9BCFD
if ((Get_MotherBrain(0)->base.frame_counter & 2) != 0) {
uint16 mbn_var_01 = Get_MotherBrain(0x40u)->mbn_var_01;
uint16 v1;
do {
v1 = mbn_var_01;
mbn_var_01 = MotherBrain_RainbowBeamPalettes[mbn_var_01 >> 1];
} while (!mbn_var_01);
uint16 v2 = v1 + 2;
Get_MotherBrain(0x40u)->mbn_var_01 = v2;
MotherBrain_WritePalette(*(uint16 *)((char *)MotherBrain_RainbowBeamPalettes + v2 - 2));
}
}
void MotherBrain_WritePalette(uint16 j) { // 0xA9BD1D
WriteColorsToPalette(0x82u, 0xad, j, 15);
WriteColorsToPalette(0x122u, 0xad, j, 15);
WriteColorsToPalette(0x162u, 0xad, j + 30, 15);
}
void MotherBrain_Phase2Cut_0(void) { // 0xA9BD45
uint16 v0 = SuitDamageDivision(0x50u);
if ((int16)(4 * v0 + 20 - samus_health) >= 0) {
Get_MotherBrain(0)->mbn_var_A = FUNC16(MotherBrain_Phase2Cut_1);
} else if ((random_number & 0xFFFu) < 0xFA0) {
if ((Get_MotherBrain(0)->base.frame_counter & 0x1F) == 0)
MotherBrain_MaybeStandupOrLeanDown();
} else {
uint16 v1;
if ((int16)(SuitDamageDivision(0xA0u) + 20 - samus_health) >= 0
|| (v1 = addr_kMotherBrain_Ilist_9ECC, (random_number & 0xFFFu) < 0xFF0)) {
v1 = addr_kMotherBrain_Ilist_9D7F;
}
MotherBrain_SetBrainInstrs(v1);
}
}
void MotherBrain_Phase2Cut_1(void) { // 0xA9BD98
if (MotherBrain_MakeHerStandUp() & 1) {
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_A = FUNC16(MotherBrain_Phase2Cut_2);
E->mbn_var_F = 16;
MotherBrain_Phase2Cut_2();
}
}
void MotherBrain_Phase2Cut_2(void) { // 0xA9BDA9
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0) {
MotherBrain_SetBrainInstrs(addr_kMotherBrain_Ilist_9B7F);
E->mbn_var_A = FUNC16(MotherBrain_Phase2Cut_3);
E->mbn_var_F = 256;
}
}
void MotherBrain_Phase2Cut_3(void) { // 0xA9BDC1
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0) {
MotherBrain_SetBrainInstrs(addr_kMotherBrain_Ilist_9F6C);
E->mbn_var_A = FUNC16(MotherBrain_Phase2Cut_4);
MotherBrain_Phase2Cut_4();
}
}
void MotherBrain_Phase2Cut_4(void) { // 0xA9BDD2
if (ProcessSpriteTilesTransfers(0xa9, addr_stru_A98FE5)) {
MotherBrain_RetractHead();
MotherBrain_SpawnShitroidInCutscene();
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_A = FUNC16(MotherBrain_Phase2Cut_5);
E->mbn_var_F = 256;
}
}
void MotherBrain_Phase2Cut_5(void) { // 0xA9BDED
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0) {
MotherBrain_BodyRainbowBeamPalAnimIndex0();
MotherBrain_SetBrainInstrs(addr_kMotherBrain_Ilist_9C77);
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->mbn_var_32 = 6;
E1->mbn_var_33 = 6;
E1->mbn_var_34 = 1280;
QueueSfx2_Max6(0x71u);
E->mbn_var_A = FUNC16(nullsub_364);
}
}
void MotherBrain_SpawnShitroidInCutscene(void) { // 0xA9BE1B
Get_MotherBrain(0x40u)->mbn_var_0A = SpawnEnemy(0xA9u, addr_stru_A9BE28);
}
void MotherBrain_DrainedByShitroid_0(void) { // 0xA9BE38
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_00 = 3;
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->mbn_var_32 = 8;
E1->mbn_var_33 = 8;
E1->mbn_var_34 = 1792;
E->mbn_var_A = FUNC16(MotherBrain_DrainedByShitroid_1);
E->mbn_var_F = 48;
MotherBrain_DrainedByShitroid_1();
}
void MotherBrain_DrainedByShitroid_1(void) { // 0xA9BE5D
MotherBrain_HandleRainbowBeamPalette();
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0) {
E->mbn_var_A = FUNC16(MotherBrain_DrainedByShitroid_2);
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->mbn_var_08 = FUNC16(MotherBrain_PainfulWalkForwards);
E1->mbn_var_06 = 0;
E1->mbn_var_07 = 2;
E1->mbn_var_32 = 2;
E1->mbn_var_33 = 4;
}
}
void CallMotherBrainPainfulWalk(uint32 ea) {
switch (ea) {
case fnMotherBrain_PainfulWalkForwards: MotherBrain_PainfulWalkForwards(); return;
case fnMotherBrain_PainfulWalkingForwards: MotherBrain_PainfulWalkingForwards(); return;
case fnMotherBrain_PainfulWalkBackwards: MotherBrain_PainfulWalkBackwards(); return;
case fnMotherBrain_PainfulWalkingBackwards: MotherBrain_PainfulWalkingBackwards(); return;
default: Unreachable();
}
}
void MotherBrain_DrainedByShitroid_2(void) { // 0xA9BE96
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
if (!E1->mbn_var_00)
E1->mbn_var_00 = 50;
MotherBrain_HandleRainbowBeamPalette();
R18_ = E1->mbn_var_08;
CallMotherBrainPainfulWalk(R18_ | 0xA90000);
uint16 v2 = 2 * E1->mbn_var_06;
E1->mbn_var_07 = g_byte_A9BEEE[v2];
E1->mbn_var_34 = g_word_A9BEFE[v2 >> 1];
if (E1->mbn_var_06 == 6) {
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_16 = 0;
E1->mbn_var_10 = 0;
MotherBrain_WritePhase2DeathPalette();
QueueSfx1_Max6(2u);
E->mbn_var_A = FUNC16(MotherBrain_DrainedByShitroid_3);
}
}
void MotherBrain_DrainedByShitroid_3(void) { // 0xA9BF0E
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
R18_ = E1->mbn_var_08;
CallMotherBrainPainfulWalk(R18_ | 0xA90000);
if (sign16(E1->mbn_var_06 - 8)) {
} else {
E1->mbn_var_34 = 64;
E1->mbn_var_32 = 8;
E1->mbn_var_33 = 8;
MotherBrain_SetBrainInstrs(addr_kMotherBrain_Ilist_9C39);
Get_MotherBrain(0)->mbn_var_A = FUNC16(MotherBrain_DrainedByShitroid_4);
MotherBrain_DrainedByShitroid_4();
}
}
void MotherBrain_DrainedByShitroid_4(void) { // 0xA9BF41
if (MotherBrain_MakeWalkBackwards(0x28u, 0) & 1) {
Get_MotherBrain(0)->mbn_var_A = FUNC16(MotherBrain_DrainedByShitroid_5);
Get_MotherBrain(0x40u)->mbn_var_33 = 0;
MotherBrain_DrainedByShitroid_5();
}
}
void MotherBrain_DrainedByShitroid_5(void) { // 0xA9BF56
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
if (!*(uint32 *)&E1->mbn_var_32) {
E1->mbn_var_12 = E1->mbn_var_33 | E1->mbn_var_32;
Enemy_MotherBrain *E = Get_MotherBrain(0);
if (!E->mbn_var_02) {
MotherBrain_SetBodyInstrs(addr_kMotherBrain_Ilist_9A26);
E->mbn_var_A = FUNC16(MotherBrain_DrainedByShitroid_6);
E->mbn_var_F = 64;
}
}
}
void MotherBrain_DrainedByShitroid_6(void) { // 0xA9BF7D
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0) {
E->mbn_var_37 = 0;
E->mbn_var_A = FUNC16(MotherBrain_DrainedByShitroid_7);
E->mbn_var_F = 16;
MotherBrain_DrainedByShitroid_7();
}
}
void MotherBrain_DrainedByShitroid_7(void) { // 0xA9BF95
Enemy_MotherBrain *E = Get_MotherBrain(0);
bool v2 = (--E->mbn_var_F & 0x8000u) != 0;
uint16 v3;
if (v2
&& (E->mbn_var_F = 16,
v3 = E->mbn_var_37 + 1,
E->mbn_var_37 = v3,
MotherBrain_FadeToGray_Drained(v3 - 1) & 1)) {
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->base.health = -29536;
E->mbn_var_1F = 1;
E1->mbn_var_14 = 0;
E->mbn_var_00 = 2;
E->mbn_var_A = FUNC16(MotherBrain_Phase2_Revive_0);
}
}
void MotherBrain_PainfulWalkForwards(void) { // 0xA9BFD0
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
if (MotherBrain_MakeWalkForwards(E->mbn_var_07, 0x48u) & 1) {
E->mbn_var_08 = FUNC16(MotherBrain_PainfulWalkingForwards);
MotherBrain_SetPainfulWalkingTimer();
}
}
void MotherBrain_PainfulWalkingForwards(void) { // 0xA9BFE8
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
uint16 v1 = E->mbn_var_09 - 1;
E->mbn_var_09 = v1;
if (!v1) {
++E->mbn_var_06;
E->mbn_var_08 = FUNC16(MotherBrain_PainfulWalkBackwards);
}
}
void MotherBrain_PainfulWalkBackwards(void) { // 0xA9C004
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
if (MotherBrain_MakeWalkBackwards(0x28u, E->mbn_var_07) & 1) {
E->mbn_var_08 = FUNC16(MotherBrain_PainfulWalkingBackwards);
MotherBrain_SetPainfulWalkingTimer();
}
}
void MotherBrain_PainfulWalkingBackwards(void) { // 0xA9C01C
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
uint16 v1 = E->mbn_var_09 - 1;
E->mbn_var_09 = v1;
if (!v1) {
++E->mbn_var_06;
E->mbn_var_08 = FUNC16(MotherBrain_PainfulWalkForwards);
}
}
void MotherBrain_SetPainfulWalkingTimer(void) { // 0xA9C038
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
E->mbn_var_09 = LOBYTE(g_word_A9C049[E->mbn_var_06]);
}
void MotherBrain_Phase2_Revive_0(void) { // 0xA9C059
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_A = FUNC16(MotherBrain_Phase2_Revive_1);
E->mbn_var_F = 768;
}
void MotherBrain_Phase2_Revive_1(void) { // 0xA9C066
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0) {
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->mbn_var_14 = 1;
E1->mbn_var_12 = 1;
E->mbn_var_A = FUNC16(MotherBrain_Phase2_Revive_2);
E->mbn_var_F = 224;
MotherBrain_Phase2_Revive_2();
}
}
void MotherBrain_Phase2_Revive_2(void) { // 0xA9C082
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_A = FUNC16(MotherBrain_Phase2_Revive_3);
E->mbn_var_37 = 0;
MotherBrain_Phase2_Revive_3();
}
void MotherBrain_Phase2_Revive_3(void) { // 0xA9C08F
Enemy_MotherBrain *E = Get_MotherBrain(0);
bool v1 = (--E->mbn_var_F & 0x8000u) != 0;
uint16 v2;
if (v1
&& (E->mbn_var_F = 16,
v2 = E->mbn_var_37 + 1,
E->mbn_var_37 = v2,
MotherBrain_FadeFromGray_Drained(v2 - 1) & 1)) {
E->mbn_var_A = FUNC16(MotherBrain_Phase2_Revive_4);
Get_MotherBrain(0x40u)->mbn_var_10 = 1;
MotherBrain_SetupBrainNormalPal();
MotherBrain_Phase2_Revive_4();
}
}
void MotherBrain_Phase2_Revive_4(void) { // 0xA9C0BA
if (MotherBrain_MakeHerStandUp() & 1) {
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->mbn_var_32 = 6;
E1->mbn_var_33 = 6;
E1->mbn_var_34 = 1280;
E1->mbn_var_31 = 1;
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_A = FUNC16(MotherBrain_Phase2_Revive_5);
E->mbn_var_F = 16;
MotherBrain_Phase2_Revive_5();
}
}
void MotherBrain_Phase2_Revive_5(void) { // 0xA9C0E4
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0) {
MotherBrain_SetBrainInstrs(addr_kMotherBrain_Ilist_9BB3);
E->mbn_var_A = FUNC16(MotherBrain_Phase2_Revive_6);
E->mbn_var_F = 128;
MotherBrain_Phase2_Revive_6();
}
}
void MotherBrain_Phase2_Revive_6(void) { // 0xA9C0FB
Enemy_MotherBrain *E = Get_MotherBrain(0);
bool v1 = (--E->mbn_var_F & 0x8000u) != 0;
if (v1 && MotherBrain_MakeWalkForwards(4u, 0x50u) & 1) {
E->mbn_var_A = FUNC16(MotherBrain_Phase2_Revive_7);
E->mbn_var_1F = 2;
Get_MotherBrain(0x40u)->mbn_var_11 = 1;
}
}
void MotherBrain_Phase2_Revive_7(void) { // 0xA9C11E
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_13 = 0;
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->mbn_var_31 = 1;
E1->mbn_var_32 = 2;
E1->mbn_var_33 = 4;
E1->mbn_var_34 = 64;
E->mbn_var_A = FUNC16(MotherBrain_Phase2_Revive_8);
MotherBrain_Phase2_Revive_8();
}
void MotherBrain_Phase2_Revive_8(void) { // 0xA9C147
if (MotherBrain_MakeHerStandUp() & 1) {
Get_MotherBrain(0)->mbn_var_A = FUNC16(MotherBrain_Phase2_MurderShitroid_1);
MotherBrain_MakeWalkForwards(0xAu, 0x50u);
MotherBrain_Phase2_MurderShitroid_1();
}
}
void MotherBrain_Phase2_MurderShitroid_1(void) { // 0xA9C15C
MotherBrain_MaybeStandupOrLeanDown();
if ((random_number & 0x8000u) != 0) {
uint16 v0 = addr_kMotherBrain_Ilist_9DBB;
if (Get_MotherBrain(0x40u)->mbn_var_0A)
v0 = addr_kMotherBrain_Ilist_9DB1;
MotherBrain_SetBrainInstrs(v0);
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_A = FUNC16(MotherBrain_Phase2_MurderShitroid_2);
E->mbn_var_F = 64;
}
}
void MotherBrain_Phase2_MurderShitroid_2(void) { // 0xA9C182
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0)
E->mbn_var_A = FUNC16(MotherBrain_Phase2_MurderShitroid_1);
}
void MotherBrain_Phase2_PrepareForFinalShitroid(void) { // 0xA9C18E
MotherBrain_MakeHerStandUp();
MotherBrain_MakeWalkBackwards(0x40u, 4u);
}
void MotherBrain_Phase2_ExecuteFinalkShitroid(void) { // 0xA9C19A
MotherBrain_SetBrainInstrs(addr_kMotherBrain_Ilist_9DB1);
Get_MotherBrain(0)->mbn_var_A = FUNC16(nullsub_363);
}
void MotherBrain_MaybeStandupOrLeanDown(void) { // 0xA9C1A7
uint16 mbn_var_02 = Get_MotherBrain(0)->mbn_var_02;
if (mbn_var_02) {
if (mbn_var_02 == 6 && (uint8)random_number >= 0xC0u)
MotherBrain_MakeHerStandUp();
} else if ((uint8)random_number >= 0xC0u) {
MotherBrain_MakeHerLeanDown();
}
}
void MotherBrain_Phase3_Recover_MakeDistance(void) { // 0xA9C1CF
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_00 = 4;
E->mbn_var_A = FUNC16(MotherBrain_Phase3_Recover_SetupForFight);
E->mbn_var_F = 32;
MotherBrain_MakeWalkBackwards(E->base.x_pos - 14, 2u);
}
void MotherBrain_Phase3_Recover_SetupForFight(void) { // 0xA9C1F0
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0) {
E->mbn_var_A = FUNC16(MotherBrain_Phase3_Fighting_Main);
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->mbn_var_18 = FUNC16(MotherBrain_Phase3_Neck_Normal);
E1->mbn_var_1A = FUNC16(MotherBrain_Phase3_Walk_TryToInchForward);
MotherBrain_Phase3_Fighting_Main();
}
}
void MotherBrain_Phase3_Fighting_Main(void) { // 0xA9C209
if (Get_MotherBrain(0x40u)->base.health) {
MotherBrain_Phase3_NeckHandler();
MotherBrain_Phase3_WalkHandler();
Enemy_MotherBrain *E = Get_MotherBrain(0);
if (!E->mbn_var_02 && !E->mbn_var_06 && (random_number & 0x8000u) != 0) {
uint16 v1 = addr_kMotherBrain_Ilist_9F00;
if ((uint8)random_number >= 0x80)
v1 = addr_kMotherBrain_Ilist_9DBB;
MotherBrain_SetBrainInstrs(v1);
E->mbn_var_A = FUNC16(MotherBrain_Phase3_Fighting_Cooldown);
E->mbn_var_F = 64;
}
} else {
Get_MotherBrain(0)->mbn_var_A = FUNC16(MotherBrain_Phase3_Death_0);
}
}
void MotherBrain_Phase3_Fighting_Cooldown(void) { // 0xA9C24E
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((--E->mbn_var_F & 0x8000u) != 0)
E->mbn_var_A = FUNC16(MotherBrain_Phase3_Fighting_Main);
}
void CallMotherBrainWallkFunc1A(uint32 ea) {
switch (ea) {
case fnMotherBrain_Phase3_Walk_TryToInchForward: MotherBrain_Phase3_Walk_TryToInchForward(); return;
case fnMotherBrain_Phase3_Walk_RetreatQuickly: MotherBrain_Phase3_Walk_RetreatQuickly(); return;
case fnMotherBrain_Phase3_Walk_RetreatSlowly: MotherBrain_Phase3_Walk_RetreatSlowly(); return;
default: Unreachable();
}
}
void MotherBrain_Phase3_WalkHandler(void) { // 0xA9C25A
if (!Get_MotherBrain(0)->mbn_var_02) {
R18_ = Get_MotherBrain(0x40u)->mbn_var_1A;
CallMotherBrainWallkFunc1A(R18_ | 0xA90000);
}
}
void MotherBrain_Phase3_Walk_TryToInchForward(void) { // 0xA9C26A
Enemy_MotherBrain *E = Get_MotherBrain(0);
uint16 mbn_var_07 = E->mbn_var_07;
if (mbn_var_07) {
uint16 v3 = mbn_var_07 + 32;
E->mbn_var_07 = v3;
if (v3 >= 0x100u) {
uint16 v4 = E->base.x_pos + 1;
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->mbn_var_1B = v4;
if (MotherBrain_MakeWalkForwards((random_number & 2) + 4, E1->mbn_var_1B) & 1)
E->mbn_var_07 = 128;
}
} else {
uint16 v6 = E->base.x_pos - 14;
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->mbn_var_1B = v6;
E1->mbn_var_1A = FUNC16(MotherBrain_Phase3_Walk_RetreatQuickly);
MotherBrain_Phase3_Walk_RetreatQuickly();
}
}
void MotherBrain_Phase3_Walk_RetreatQuickly(void) { // 0xA9C2B3
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
if (MotherBrain_MakeWalkBackwards(E->mbn_var_1B, 2u) & 1) {
E->mbn_var_1B = Get_MotherBrain(0)->base.x_pos - 14;
E->mbn_var_1A = FUNC16(MotherBrain_Phase3_Walk_RetreatSlowly);
}
}
void MotherBrain_Phase3_Walk_RetreatSlowly(void) { // 0xA9C2D2
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
if (MotherBrain_MakeWalkBackwards(E->mbn_var_1B, 4u) & 1)
MotherBrain_SetToTryToInchForward(0x40u);
}
void MotherBrain_SetToTryToInchForward(uint16 a) { // 0xA9C313
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_07 = a;
Enemy_MotherBrain *E1 = Get_MotherBrain(0x40u);
E1->mbn_var_1A = FUNC16(MotherBrain_Phase3_Walk_TryToInchForward);
E1->mbn_var_1B = E->base.x_pos + 1;
}
void CallMotherBrainNeckFunc(uint32 ea) {
switch (ea) {
case fnnullsub_369: return;
case fnMotherBrain_Phase3_Neck_Normal: MotherBrain_Phase3_Neck_Normal(); return;
case fnMotherBrain_Phase3_Neck_SetupRecoilRecovery: MotherBrain_Phase3_Neck_SetupRecoilRecovery(); return;
case fnMotherBrain_Phase3_Neck_RecoilRecovery: MotherBrain_Phase3_Neck_RecoilRecovery(); return;
case fnMotherBrain_Phase3_Neck_SetupHyperBeamRecoil: MotherBrain_Phase3_Neck_SetupHyperBeamRecoil(); return;
case fnMotherBrain_Phase3_Neck_HyperBeamRecoil: MotherBrain_Phase3_Neck_HyperBeamRecoil(); return;
default: Unreachable();
}
}
void MotherBrain_Phase3_NeckHandler(void) { // 0xA9C327
R18_ = Get_MotherBrain(0x40u)->mbn_var_18;
CallMotherBrainNeckFunc(R18_ | 0xA90000);
}
void MotherBrain_Phase3_Neck_Normal(void) { // 0xA9C330
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
E->mbn_var_32 = 1;
E->mbn_var_34 = 128;
E->mbn_var_32 = 2;
E->mbn_var_33 = 4;
E->mbn_var_18 = addr_locret_A9C353;
}
void MotherBrain_Phase3_Neck_SetupRecoilRecovery(void) { // 0xA9C354
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
E->mbn_var_31 = 1;
E->mbn_var_34 = 1280;
E->mbn_var_32 = 6;
E->mbn_var_33 = 6;
E->mbn_var_18 = FUNC16(MotherBrain_Phase3_Neck_RecoilRecovery);
E->mbn_var_19 = 16;
MotherBrain_Phase3_Neck_RecoilRecovery();
}
void MotherBrain_Phase3_Neck_RecoilRecovery(void) { // 0xA9C37B
int16 v1;
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
v1 = E->mbn_var_19 - 1;
if (v1 < 0) {
MotherBrain_SetBrainInstrs(addr_kMotherBrain_Ilist_9DBB);
E->mbn_var_18 = FUNC16(MotherBrain_Phase3_Neck_Normal);
} else {
E->mbn_var_19 = v1;
}
}
void MotherBrain_Phase3_Neck_SetupHyperBeamRecoil(void) { // 0xA9C395
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
E->mbn_var_31 = 1;
Get_MotherBrain(0)->mbn_var_06 = 1;
MotherBrain_SetBrainInstrs(addr_kMotherBrain_Ilist_9BE7);
E->mbn_var_00 = 50;
E->mbn_var_34 = 2304;
E->mbn_var_32 = 8;
E->mbn_var_33 = 8;
E->mbn_var_18 = FUNC16(MotherBrain_Phase3_Neck_HyperBeamRecoil);
E->mbn_var_19 = 11;
MotherBrain_Phase3_Neck_HyperBeamRecoil();
}
void MotherBrain_Phase3_Neck_HyperBeamRecoil(void) { // 0xA9C3CD
int16 v2;
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
v2 = E->mbn_var_19 - 1;
if (v2 < 0) {
E->mbn_var_34 = 128;
Get_MotherBrain(0)->mbn_var_06 = 0;
E->mbn_var_18 = FUNC16(MotherBrain_Phase3_Neck_SetupRecoilRecovery);
} else {
E->mbn_var_19 = v2;
}
}
void MoveEnemyWithVelocity(void) { // 0xA9C3EF
EnemyData *v0 = gEnemyData(cur_enemy_index);
uint16 ai_var_B = v0->ai_var_B;
int carry = HIBYTE(v0->x_subpos) + LOBYTE(ai_var_B);
HIBYTE(v0->x_subpos) = carry;
v0->x_pos += (int8)(ai_var_B >> 8) + (carry >> 8);
uint16 ai_var_C = v0->ai_var_C;
carry = HIBYTE(v0->y_subpos) + LOBYTE(ai_var_C);
HIBYTE(v0->y_subpos) = carry;
v0->y_pos += (int8)(ai_var_C >> 8) + (carry >> 8);
}
void MotherBrain_SetBodyInstrs(uint16 a) { // 0xA9C42D
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->base.current_instruction = a;
E->base.instruction_timer = 1;
E->base.timer = 0;
}
void MotherBrain_SetBrainUnusedInstrs(uint16 a) { // 0xA9C43A
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
E->base.current_instruction = a;
E->base.instruction_timer = 1;
E->base.timer = 0;
}
void MotherBrain_SetBrainInstrs(uint16 a) { // 0xA9C447
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_21 = a;
E->mbn_var_20 = 1;
}
void Enemy_SetInstrList(uint16 k, uint16 a) { // 0xA9C453
EnemyData *v2 = gEnemyData(k);
v2->current_instruction = a;
v2->instruction_timer = 1;
v2->timer = 0;
}
uint16 ComputeSinMult(uint16 a) { // 0xA9C460
return sub_A9C46C(R18_, a);
}
uint16 ComputeCosMult(uint16 a) { // 0xA9C465
return sub_A9C46C(R18_ + 64, a);
}
uint16 sub_A9C46C(uint16 a, uint16 j) { // 0xA9C46C
uint16 v2 = kSinCosTable8bit_Sext[((uint16)((2 * a) & 0x1FE) >> 1) + 64];
WriteReg(M7A, v2);
WriteReg(M7A, HIBYTE(v2));
WriteReg(M7B, j);
return ReadRegWord(MPYM);
}
void Enemy_IncreaseYpos(uint16 k, uint16 a) { // 0xA9C4A9
EnemyData *v2 = gEnemyData(k);
int carry = HIBYTE(v2->y_subpos) + LOBYTE(a);
HIBYTE(v2->y_subpos) = carry;
v2->y_pos += (int8)(a >> 8) + (carry >> 8);
}
void Samus_DecrementAmmoDueToRainbowBeam(void) { // 0xA9C4C4
if ((enemy_damage_routine_exec_count & 3) == 0 && samus_missiles) {
uint16 v0 = samus_missiles - g_word_A9C544;
if (sign16(samus_missiles - g_word_A9C544 - 1)) {
if (hud_item_index == 1)
hud_item_index = 0;
v0 = 0;
samus_auto_cancel_hud_item_index = 0;
}
samus_missiles = v0;
}
if ((enemy_damage_routine_exec_count & 3) == 0 && samus_super_missiles) {
uint16 v1 = samus_super_missiles - g_word_A9C544;
if (sign16(samus_super_missiles - g_word_A9C544 - 1)) {
if (hud_item_index == 2)
hud_item_index = 0;
v1 = 0;
samus_auto_cancel_hud_item_index = 0;
}
samus_super_missiles = v1;
}
if (samus_power_bombs) {
uint16 v2 = samus_power_bombs - g_word_A9C544;
if (sign16(samus_power_bombs - g_word_A9C544 - 1)) {
if (hud_item_index == 3)
hud_item_index = 0;
v2 = 0;
samus_auto_cancel_hud_item_index = 0;
}
samus_power_bombs = v2;
}
}
void Samus_PlayGainingLosingHealthSfx(void) { // 0xA9C546
if (!sign16(samus_health - 81) && (enemy_damage_routine_exec_count & 7) == 0)
QueueSfx3_Max3(0x2Du);
}
void Samus_DamageDueToShitroid(void) { // 0xA9C560
int16 v0;
v0 = -4;
if (equipped_items & 1)
v0 = -3;
uint16 v1 = samus_health + (equipped_items & 1) + v0;
if (sign16(v1 - 2))
v1 = 1;
samus_health = v1;
}
void Samus_DamageDueToRainbowBeam(void) { // 0xA9C57D
uint16 v0 = samus_health + (equipped_items & 1) - 2;
if (sign16(v0 - 1))
v0 = 0;
samus_health = v0;
Samus_PlayGainingLosingHealthSfx();
}
uint8 Samus_HealDueToShitroid(void) { // 0xA9C59F
if ((int16)(samus_health + 1 - samus_max_health) < 0) {
++samus_health;
Samus_PlayGainingLosingHealthSfx();
return 1;
} else {
samus_health = samus_max_health;
Samus_PlayGainingLosingHealthSfx();
return 0;
}
}
uint8 ProcessSpriteTilesTransfers(uint8 db, uint16 k) { // 0xA9C5BE
VramWriteEntry *v7;
Enemy_MotherBrain *E = Get_MotherBrain(0);
uint16 mbn_var_22 = E->mbn_var_22;
if (!mbn_var_22)
mbn_var_22 = k;
uint16 v3 = mbn_var_22;
uint16 v4 = vram_write_queue_tail;
uint8 *v5 = RomPtrWithBank(db, mbn_var_22);
uint16 v6 = *(uint16 *)v5;
if (*(uint16 *)v5) {
v7 = gVramWriteEntry(vram_write_queue_tail);
v7->size = v6;
*(VoidP *)((char *)&v7->src.addr + 1) = *(uint16 *)(v5 + 3);
v7->src.addr = *((uint16 *)v5 + 1);
v7->vram_dst = *(uint16 *)(v5 + 5);
vram_write_queue_tail = v4 + 7;
E->mbn_var_22 = v3 + 7;
v6 = *(uint16 *)RomPtrWithBank(db, E->mbn_var_22);
if (v6)
return 0;
}
E->mbn_var_22 = v6;
return 1;
}
uint8 MotherBrain_MakeWalkForwards(uint16 j, uint16 a) { // 0xA9C601
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((int16)(a - E->base.x_pos) >= 0) {
if (E->mbn_var_02)
return 0;
if (sign16(E->base.x_pos - 128)) {
MotherBrain_SetBodyInstrs(g_off_A9C61E[j >> 1]);
return 0;
}
}
return 1;
}
uint8 MotherBrain_MakeWalkBackwards(uint16 a, uint16 j) { // 0xA9C647
Enemy_MotherBrain *E = Get_MotherBrain(0);
if ((int16)(a - E->base.x_pos) < 0) {
if (E->mbn_var_02)
return 0;
if (!sign16(E->base.x_pos - 48)) {
MotherBrain_SetBodyInstrs(g_off_A9C664[j >> 1]);
return 0;
}
}
return 1;
}
uint8 MotherBrain_MakeHerStandUp(void) { // 0xA9C670
uint16 mbn_var_02 = Get_MotherBrain(0)->mbn_var_02;
if (mbn_var_02) {
uint16 v1 = addr_kMotherBrain_Ilist_99C6;
if (mbn_var_02 != 3) {
if (mbn_var_02 != 6)
return 0;
v1 = addr_kMotherBrain_Ilist_99E2;
}
MotherBrain_SetBodyInstrs(v1);
return 0;
}
return 1;
}
uint8 MotherBrain_MakeHerCrouch(void) { // 0xA9C68E
uint16 mbn_var_02 = Get_MotherBrain(0)->mbn_var_02;
if (mbn_var_02) {
if (mbn_var_02 == 3)
return 1;
} else {
MotherBrain_SetBodyInstrs(addr_kMotherBrain_Ilist_9A0A);
}
return 0;
}
uint8 MotherBrain_MakeHerLeanDown(void) { // 0xA9C6A3
uint16 mbn_var_02 = Get_MotherBrain(0)->mbn_var_02;
if (mbn_var_02) {
if (mbn_var_02 == 6)
return 1;
} else {
MotherBrain_SetBodyInstrs(addr_kMotherBrain_Ilist_99F2);
}
return 0;
}
void MotherBrain_HandleWalking(void) { // 0xA9C6B8
Enemy_MotherBrain *E = Get_MotherBrain(0);
if (!E->mbn_var_02) {
uint16 mbn_var_07 = E->mbn_var_07;
if (mbn_var_07) {
uint16 v2;
v2 = mbn_var_07 + 6;
E->mbn_var_07 = v2;
if (v2 >= 0x100u) {
LABEL_4:
E->mbn_var_07 = 128;
if (sign16(E->base.x_pos - 128))
MotherBrain_SetBodyInstrs(addr_kMotherBrain_Ilist_97A4);
return;
}
if (!sign16(E->base.x_pos - 48))
return;
} else {
E->mbn_var_07 = 1;
if (!sign16(E->base.x_pos - 48)) {
MotherBrain_SetBodyInstrs(addr_kMotherBrain_Ilist_98C6);
return;
}
}
if (sign16((random_number & 0xFFF) - 4032))
return;
goto LABEL_4;
}
}
void ShitroidInCutscene_Init(void) { // 0xA9C710
Enemy_ShitroidInCutscene *E = Get_ShitdroidInCutscene(cur_enemy_index);
E->base.properties |= kEnemyProps_DisableSamusColl | kEnemyProps_BlockPlasmaBeam;
E->base.palette_index = 3584;
E->base.current_instruction = addr_kShitroid_Ilist_CFA2;
E->base.instruction_timer = 1;
E->sice_var_04 = 1;
E->base.timer = 0;
E->sice_var_E = 10;
E->base.vram_tiles_index = 160;
E->base.x_pos = 320;
E->base.y_pos = 96;
E->sice_var_B = 0;
E->sice_var_C = 0;
E->sice_var_09 = 0;
E->sice_var_A = FUNC16(ShitroidInCutscene_DashOntoScreen);
E->sice_var_F = 248;
E->sice_var_0F = FUNC16(Shitroid_HandleCutscenePalette);
WriteColorsToPalette(0x1E2u, 0xa9, addr_kMotherBrainPalette_2__plus__2, 0xFu);
}
void CallShitroidCutsceneFuncA(uint32 ea, uint16 k) {
switch (ea) {
case fnnullsub_367: return;
case fnShitroidInCutscene_DashOntoScreen: ShitroidInCutscene_DashOntoScreen(k); return;
case fnShitroidInCutscene_CurveTowardsBrain: ShitroidInCutscene_CurveTowardsBrain(k); return;
case fnShitroidInCutscene_GetIntoFace: ShitroidInCutscene_GetIntoFace(k); return;
case fnShitroidInCutscene_LatchOntoBrain: ShitroidInCutscene_LatchOntoBrain(k); return;
case fnShitroidInCutscene_SetMotherBrainToStumbleBack: ShitroidInCutscene_SetMotherBrainToStumbleBack(k); return;
case fnShitroidInCutscene_ActivateRainbowBeam: ShitroidInCutscene_ActivateRainbowBeam(k); return;
case fnShitroidInCutscene_BrainTurnsToCorpse: ShitroidInCutscene_BrainTurnsToCorpse(k); return;
case fnShitroidInCutscene_StopDraining: ShitroidInCutscene_StopDraining(k); return;
case fnShitroidInCutscene_LetGoAndSpawnDust: ShitroidInCutscene_LetGoAndSpawnDust(k); return;
case fnShitroidInCutscene_MoveUpToCeiling: ShitroidInCutscene_MoveUpToCeiling(k); return;
case fnShitroidInCutscene_MoveToSamus: ShitroidInCutscene_MoveToSamus(k); return;
case fnShitroidInCutscene_LatchOntoSamus: ShitroidInCutscene_LatchOntoSamus(k); return;
case fnShitroidInCutscene_HealSamusToFullHealth: ShitroidInCutscene_HealSamusToFullHealth(k); return;
case fnShitroidInCutscene_IdleUntilToNoHealth: ShitroidInCutscene_IdleUntilToNoHealth(k); return;
case fnShitroidInCutscene_ReleaseSamus: ShitroidInCutscene_ReleaseSamus(k); return;
case fnShitroidInCutscene_StareDownMotherBrain: ShitroidInCutscene_StareDownMotherBrain(k); return;
case fnShitroidInCutscene_FlyOffScreen: ShitroidInCutscene_FlyOffScreen(k); return;
case fnShitroidInCutscene_MoveToFinalChargeStart: ShitroidInCutscene_MoveToFinalChargeStart(k); return;
case fnShitroidInCutscene_InitiateFinalCharge: ShitroidInCutscene_InitiateFinalCharge(k); return;
case fnShitroidInCutscene_FinalCharge: ShitroidInCutscene_FinalCharge(k); return;
case fnShitroidInCutscene_ShitroidFinalBelow: ShitroidInCutscene_ShitroidFinalBelow(k); return;
case fnShitroidInCutscene_PlaySamusTheme: ShitroidInCutscene_PlaySamusTheme(k); return;
case fnShitroidInCutscene_PrepareSamusHyperbeam: ShitroidInCutscene_PrepareSamusHyperbeam(k); return;
case fnShitroidInCutscene_DeathSequence: ShitroidInCutscene_DeathSequence(k); return;
case fnShitroidInCutscene_UnloadShitroid: ShitroidInCutscene_UnloadShitroid(k); return;
case fnShitroidInCutscene_LetSamusRainbowMore: ShitroidInCutscene_LetSamusRainbowMore(k); return;
case fnShitroidInCutscene_FinishCutscene: ShitroidInCutscene_FinishCutscene(k); return;
default: Unreachable();
}
}
void CallShitroidCutsceneFunc0F(uint32 ea) {
switch (ea) {
case fnnullsub_368: return;
case fnnullsub_338: return;
case fnShitroid_HandleCutscenePalette: Shitroid_HandleCutscenePalette(); return;
case fnShitroid_HandleCutscenePalette_LowHealth: Shitroid_HandleCutscenePalette_LowHealth(); return;
default: Unreachable();
}
}
void ShitroidInCutscene_Main(void) { // 0xA9C779
Enemy_ShitroidInCutscene *E = Get_ShitdroidInCutscene(cur_enemy_index);
E->base.shake_timer = 0;
CallShitroidCutsceneFuncA(E->sice_var_A | 0xA90000, cur_enemy_index);
MoveEnemyWithVelocity();
ShitroidInCutscene_Flashing(cur_enemy_index);
ShitroidInCutscene_HandleHealthBasedPalette(cur_enemy_index);
R18_ = Get_ShitdroidInCutscene(cur_enemy_index)->sice_var_0F;
CallShitroidCutsceneFunc0F(R18_ | 0xA90000);
}
void ShitroidInCutscene_Flashing(uint16 k) { // 0xA9C79C
int16 v1;
v1 = 3584;
Enemy_ShitroidInCutscene *E = Get_ShitdroidInCutscene(k);
uint16 sice_var_06 = E->sice_var_06;
if (sice_var_06) {
uint16 v4 = sice_var_06 - 1;
E->sice_var_06 = v4;
if ((v4 & 2) != 0)
v1 = 0;
}
E->base.palette_index = v1;
}
void ShitroidInCutscene_HandleCry(void) { // 0xA9C7B7
Enemy_ShitroidInCutscene *E = Get_ShitdroidInCutscene(0);
if (E->sice_var_14) {
E->sice_var_14 = 0;
QueueSfx2_Max6(0x72u);
}
}
void ShitroidInCutscene_DashOntoScreen(uint16 k) { // 0xA9C7CC
Enemy_ShitroidInCutscene *E = Get_ShitdroidInCutscene(k);
if ((--E->sice_var_F & 0x8000u) != 0) {
E->sice_var_0A = -10240;
E->sice_var_0B = 2560;
E->sice_var_A = FUNC16(ShitroidInCutscene_CurveTowardsBrain);
E->sice_var_F = 10;
ShitroidInCutscene_CurveTowardsBrain(k);
}
}
void ShitroidInCutscene_CurveTowardsBrain(uint16 k) { // 0xA9C7EC
R18_ = -384;
R20_ = -20480;
R22_ = 2560;
ShitroidInCutscene_UpdateSpeedAndAngle(k);
Enemy_ShitroidInCutscene *E = Get_ShitroidInCutscene(k);
if ((--E->sice_var_F & 0x8000u) != 0) {
E->sice_var_A = FUNC16(ShitroidInCutscene_GetIntoFace);
E->sice_var_F = 9;
}
}
void ShitroidInCutscene_GetIntoFace(uint16 k) { // 0xA9C811
bool v3; // sf
R18_ = -1536;
R20_ = -32256;
R22_ = 3584;
ShitroidInCutscene_UpdateSpeedAndAngle(k);
Enemy_ShitroidInCutscene *E = Get_ShitroidInCutscene(0x40u);
R18_ = E->base.x_pos;
R20_ = E->base.y_pos;
R22_ = 4;
R24_ = 4;
if (!(Shitroid_Func_2(k) & 1)
|| (E = Get_ShitroidInCutscene(k), v3 = (int16)(E->sice_var_F - 1) < 0, --E->sice_var_F, v3)) {
Get_ShitroidInCutscene(k)->sice_var_A = FUNC16(ShitroidInCutscene_LatchOntoBrain);
SomeMotherBrainScripts(1u);
}
}
void ShitroidInCutscene_LatchOntoBrain(uint16 k) { // 0xA9C851
Enemy_ShitroidInCutscene *E = Get_ShitroidInCutscene(0x40u);
R18_ = E->base.x_pos;
R20_ = E->base.y_pos - 24;
Shitroid_Func_GraduallyAccelerateTowards0x400(k, 0);
R22_ = 8;
R24_ = 8;
if (!(Shitroid_Func_2(k) & 1))
Get_ShitroidInCutscene(k)->sice_var_A = FUNC16(ShitroidInCutscene_SetMotherBrainToStumbleBack);
}
void ShitroidInCutscene_SetMotherBrainToStumbleBack(uint16 k) { // 0xA9C879
Enemy_ShitroidInCutscene *E = Get_ShitroidInCutscene(0);
MotherBrain_MakeWalkBackwards(E->base.x_pos - 1, 2u);
Get_ShitroidInCutscene(k)->sice_var_A = FUNC16(ShitroidInCutscene_ActivateRainbowBeam);
ShitroidInCutscene_ActivateRainbowBeam(k);
}
void ShitroidInCutscene_ActivateRainbowBeam(uint16 k) { // 0xA9C889
Enemy_ShitroidInCutscene *E1 = Get_ShitdroidInCutscene(0x40u);
R18_ = E1->base.x_pos;
R20_ = E1->base.y_pos - 24;
if (Shitroid_AccelerateTowardsPoint(k, 0x200u) & 1) {
Enemy_ShitroidInCutscene *E = Get_ShitdroidInCutscene(k);
E->sice_var_B = 0;
E->sice_var_C = 0;
E->base.x_pos = E1->base.x_pos;
E->base.y_pos = E1->base.y_pos - 24;
Enemy_SetInstrList(k, addr_kShitroid_Ilist_CFB8);
E->sice_var_A = FUNC16(ShitroidInCutscene_BrainTurnsToCorpse);
E->sice_var_E = 1;
Enemy_ShitroidInCutscene *E0 = Get_ShitdroidInCutscene(0);
E0->sice_var_A = FUNC16(MotherBrain_DrainedByShitroid_0);
QueueSfx1_Max6(0x40u);
E0->sice_var_16 = 1;
}
}
void ShitroidInCutscene_BrainTurnsToCorpse(uint16 k) { // 0xA9C8E2
Enemy_ShitroidInCutscene *E = Get_ShitdroidInCutscene(k);
Enemy_ShitroidInCutscene *E1 = Get_ShitdroidInCutscene(0x40u);
int v2 = (uint8)(E->base.frame_counter & 6) >> 1;
E->base.x_pos = E1->base.x_pos + g_word_A993BB[v2];
E->base.y_pos = E1->base.y_pos + g_word_A993C3[v2] - 24;
if (Get_ShitdroidInCutscene(0)->sice_var_1F) {
E->sice_var_A = FUNC16(ShitroidInCutscene_StopDraining);
E->sice_var_F = 64;
}
}
void ShitroidInCutscene_StopDraining(uint16 k) { // 0xA9C915
Enemy_ShitroidInCutscene *E = Get_ShitroidInCutscene(k);
Enemy_ShitroidInCutscene *E1 = Get_ShitroidInCutscene(0x40u);
E->base.x_pos = E1->base.x_pos;
E->base.y_pos = E1->base.y_pos - 24;
if ((--E->sice_var_F & 0x8000u) != 0) {
Enemy_SetInstrList(k, addr_kShitroid_Ilist_CFA2);
E->sice_var_E = 10;
E->sice_var_A = FUNC16(ShitroidInCutscene_LetGoAndSpawnDust);
E->sice_var_F = 32;
E->sice_var_B = 0;
E->sice_var_C = 0;
}
}
void ShitroidInCutscene_LetGoAndSpawnDust(uint16 k) { // 0xA9C94B
Enemy_ShitroidInCutscene *E = Get_ShitdroidInCutscene(k);
if ((--E->sice_var_F & 0x8000u) != 0) {
ShitroidInCutscene_SpawnThreeDustClouds();
E->sice_var_A = addr_loc_A9C959;
}
ShitroidInCutscene_MoveUpToCeiling(k);
}
void ShitroidInCutscene_MoveUpToCeiling(uint16 k) { // 0xA9C959
R18_ = Get_ShitdroidInCutscene(0x40u)->base.x_pos;
R20_ = 0;
Shitroid_Func_GraduallyAccelerateTowards0x400(k, 0);
R22_ = 4;
R24_ = 4;
if (!(Shitroid_Func_2(k) & 1)) {
SomeMotherBrainScripts(4u);
Enemy_ShitroidInCutscene *E = Get_ShitdroidInCutscene(k);
E->sice_var_A = FUNC16(ShitroidInCutscene_MoveToSamus);
E->sice_var_0E = addr_stru_A9CA24;
}
}
void ShitroidInCutscene_SpawnThreeDustClouds(void) { // 0xA9C98C
R20_ = -8;
ShitroidInCutscene_SpawnOneDustCloudAt(0xFFF0u);
R20_ = -16;
ShitroidInCutscene_SpawnOneDustCloudAt(0);
R20_ = -8;
ShitroidInCutscene_SpawnOneDustCloudAt(0x10u);
}
void ShitroidInCutscene_SpawnOneDustCloudAt(uint16 a) { // 0xA9C9AA
Enemy_ShitroidInCutscene *E = Get_ShitroidInCutscene(0x40u);
R18_ = E->base.x_pos + a;
R20_ += E->base.y_pos;
SpawnEnemyProjectileWithRoomGfx(addr_kEproj_DustCloudExplosion, 9u);
}
void CallShitroidMoveFunc(uint32 ea, uint16 k, uint16 j) {
switch (ea) {
case fnShitroid_GraduallyAccelerateTowards0x8: Shitroid_GraduallyAccelerateTowards0x8(k, j); return;
case fnShitroid_GraduallyAccelerateTowards0x10: Shitroid_GraduallyAccelerateTowards0x10(k, j); return;
default: Unreachable();
}
}
void ShitroidInCutscene_MoveToSamus(uint16 k) { // 0xA9C9C3
int16 v4;
Enemy_ShitroidInCutscene *E = Get_ShitdroidInCutscene(k);
E->sice_var_04 = 0;
E->sice_var_09 = 1;
if ((random_number & 0xFFFu) >= 0xFA0)
QueueSfx2_Max6(0x52u);
uint16 sice_var_0E = E->sice_var_0E;
uint16 *v3 = (uint16 *)RomPtr_A9(sice_var_0E);
R18_ = *v3;
R20_ = v3[1];
R22_ = v3[3];
CallShitroidMoveFunc(R22_ | 0xA90000, k, v3[2]);
R22_ = 4;
R24_ = 4;
if (!(Shitroid_Func_2(k) & 1)) {
v4 = *((uint16 *)RomPtr_A9(sice_var_0E) + 4);
if (v4 < 0) {
E->sice_var_A = v4;
} else {
E->sice_var_0E += 8;
}
}
}
void ShitroidInCutscene_LatchOntoSamus(uint16 k) { // 0xA9CA66
R18_ = samus_x_pos;
R20_ = samus_y_pos - 20;
Shitroid_Func_GraduallyAccelerateTowards0x400(k, 0);
}
void ShitroidInCutscene_HealSamusToFullHealth(uint16 k) { // 0xA9CA7A
Enemy_ShitroidInCutscene *E = Get_ShitdroidInCutscene(k);
E->sice_var_04 = 0;
ShitroidInCutscene_HandleCry();
int v2 = (uint8)(E->base.frame_counter & 6) >> 1;
E->base.x_pos = samus_x_pos + g_word_A993BB[v2];
E->base.y_pos = samus_y_pos + g_word_A993C3[v2] - 20;
if (!(Samus_HealDueToShitroid() & 1)) {
samus_reserve_health = samus_max_reserve_health;
E->sice_var_A = FUNC16(ShitroidInCutscene_IdleUntilToNoHealth);
E->sice_var_0F = FUNC16(nullsub_368);
}
}
void ShitroidInCutscene_IdleUntilToNoHealth(uint16 k) { // 0xA9CABD
ShitroidInCutscene_HandleCry();
Enemy_ShitroidInCutscene *E = Get_ShitdroidInCutscene(k);
uint16 sice_var_06 = E->sice_var_06;
if (sice_var_06) {
int v3 = (uint8)(sice_var_06 & 6) >> 1;
E->base.x_pos = samus_x_pos + 2 * g_word_A993BB[v3];
E->base.y_pos = samus_y_pos + 2 * g_word_A993C3[v3] - 20;
}
if (!E->base.health) {
E->base.health = 320;
E->sice_var_A = FUNC16(ShitroidInCutscene_ReleaseSamus);
E->sice_var_E = 10;
E->sice_var_D = 0;
E->sice_var_0F = FUNC16(Shitroid_HandleCutscenePalette_LowHealth);
E->sice_var_04 = 1;
E->sice_var_09 = 0;
}
}
void ShitroidInCutscene_ReleaseSamus(uint16 k) { // 0xA9CB13
QueueSfx2_Max6(0x72u);
Get_ShitdroidInCutscene(0x40u)->sice_var_0B = 1;
Get_ShitdroidInCutscene(k)->sice_var_A = FUNC16(ShitroidInCutscene_StareDownMotherBrain);
Get_ShitdroidInCutscene(0)->sice_var_A = FUNC16(MotherBrain_Phase2_PrepareForFinalShitroid);
ShitroidInCutscene_StareDownMotherBrain(k);
}
void ShitroidInCutscene_StareDownMotherBrain(uint16 k) { // 0xA9CB2D
R18_ = samus_x_pos - 4;
R20_ = 96;
Shitroid_GraduallyAccelerateTowards0x10(k, 0);
R22_ = 4;
R24_ = 4;
if (!(Shitroid_Func_2(k) & 1))
Get_ShitroidInCutscene(k)->sice_var_A = FUNC16(ShitroidInCutscene_FlyOffScreen);
}
void ShitroidInCutscene_FlyOffScreen(uint16 k) { // 0xA9CB56
R18_ = 272;
R20_ = 64;
Shitroid_GraduallyAccelerateTowards0x10(k, 0);
R22_ = 4;
R24_ = 4;
if (!(Shitroid_Func_2(k) & 1))
Get_ShitroidInCutscene(k)->sice_var_A = FUNC16(ShitroidInCutscene_MoveToFinalChargeStart);
}
void ShitroidInCutscene_MoveToFinalChargeStart(uint16 k) { // 0xA9CB7B
R18_ = 305;
R20_ = 160;
Shitroid_GraduallyAccelerateTowards0x10(k, 0);
R22_ = 4;
R24_ = 4;
if (!(Shitroid_Func_2(k) & 1)) {
Enemy_ShitroidInCutscene *E = Get_ShitdroidInCutscene(k);
E->base.health = 79;
Get_ShitdroidInCutscene(0x40u)->sice_var_0B = 0;
Get_ShitdroidInCutscene(0)->sice_var_A = FUNC16(MotherBrain_Phase2_ExecuteFinalkShitroid);
E->sice_var_A = FUNC16(ShitroidInCutscene_InitiateFinalCharge);
}
}
void ShitroidInCutscene_InitiateFinalCharge(uint16 k) { // 0xA9CBB3
R18_ = 290;
R20_ = 128;
Shitroid_Func_GraduallyAccelerateTowards0x400(k, 0xAu);
R22_ = 4;
R24_ = 4;
if (!(Shitroid_Func_2(k) & 1))
Get_ShitroidInCutscene(k)->sice_var_A = FUNC16(ShitroidInCutscene_FinalCharge);
}
void ShitroidInCutscene_FinalCharge(uint16 k) { // 0xA9CBD8
Enemy_ShitroidInCutscene *E1 = Get_ShitdroidInCutscene(0x40u);
R18_ = E1->base.x_pos;
R20_ = E1->base.y_pos - 32;
Shitroid_Func_GraduallyAccelerateTowards0x400(k, 0xCu);
Enemy_ShitroidInCutscene *E = Get_ShitdroidInCutscene(k);
if (!E->base.health) {
E->sice_var_0F = FUNC16(nullsub_338);
E->base.vram_tiles_index = 4256;
QueueSfx3_Max6(0x19u);
TurnOffLightsForShitroidDeath();
Enemy_SetInstrList(k, addr_kShitroid_Ilist_CFCE);
E->sice_var_B = 0;
E->sice_var_C = 0;
Get_ShitdroidInCutscene(0)->sice_var_A = addr_locret_A9C18D;
QueueMusic_Delayed8(0);
E->sice_var_A = FUNC16(ShitroidInCutscene_ShitroidFinalBelow);
E->sice_var_F = 16;
E->sice_var_10 = E->base.x_pos;
E->sice_var_11 = E->base.y_pos;
ShitroidInCutscene_ShitroidFinalBelow(k);
}
}
void ShitroidInCutscene_ShitroidFinalBelow(uint16 k) { // 0xA9CC3E
ShitroidInCutscene_Shake(k);
Enemy_ShitroidInCutscene *E = Get_ShitdroidInCutscene(k);
if ((--E->sice_var_F & 0x8000u) != 0) {
E->base.x_pos = E->sice_var_10;
E->base.y_pos = E->sice_var_11;
E->sice_var_A = FUNC16(ShitroidInCutscene_PlaySamusTheme);
E->sice_var_F = 56;
ShitroidInCutscene_PlaySamusTheme(k);
}
}
void ShitroidInCutscene_PlaySamusTheme(uint16 k) { // 0xA9CC60
Enemy_ShitroidInCutscene *E = Get_ShitroidInCutscene(k);
if ((--E->sice_var_F & 0x8000u) != 0) {
QueueMusic_Delayed8(0xFF48u);
QueueMusic_Delayed8(5u);
E->sice_var_A = FUNC16(ShitroidInCutscene_PrepareSamusHyperbeam);
E->sice_var_F = 12;
ShitroidInCutscene_PrepareSamusHyperbeam(k);
}
}
void ShitroidInCutscene_PrepareSamusHyperbeam(uint16 k) { // 0xA9CC7F
Enemy_ShitroidInCutscene *E = Get_ShitdroidInCutscene(k);
if ((--E->sice_var_F & 0x8000u) != 0) {
CallSomeSamusCode(0x19u);
Get_ShitdroidInCutscene(0x40u)->sice_var_16 = FUNC16(SamusRainbowPaletteFunc_ActivateWhenEnemyLow);
E->sice_var_A = FUNC16(ShitroidInCutscene_DeathSequence);
}
}
void ShitroidInCutscene_DeathSequence(uint16 k) { // 0xA9CC99
HandleSamusRainbowPaletteAnimation(k);
ShitroidInCutscene_AccelerateDownwards(k);
if (ShitroidInCutscene_FadeShitroidToBlack(k) & 1) {
Enemy_ShitroidInCutscene *E = Get_ShitroidInCutscene(k);
E->base.properties |= kEnemyProps_Invisible;
E->sice_var_A = FUNC16(ShitroidInCutscene_UnloadShitroid);
E->sice_var_F = 128;
} else {
ShitroidInCutscene_HandleShitroidDeathExplosions(k);
ShitroidInCutscene_HandleEnemyBlinking(k);
}
}
void ShitroidInCutscene_UnloadShitroid(uint16 k) { // 0xA9CCC0
HandleSamusRainbowPaletteAnimation(k);
Enemy_ShitroidInCutscene *E = Get_ShitroidInCutscene(k);
bool v2 = (--E->sice_var_F & 0x8000u) != 0;
if (v2 && ProcessSpriteTilesTransfers(0xa9, addr_stru_A98FC7)) {
E->sice_var_A = FUNC16(ShitroidInCutscene_LetSamusRainbowMore);
E->sice_var_F = 176;
ShitroidInCutscene_LetSamusRainbowMore(k);
}
}
void ShitroidInCutscene_LetSamusRainbowMore(uint16 k) { // 0xA9CCDE
Enemy_ShitroidInCutscene *E = Get_ShitdroidInCutscene(k);
if ((--E->sice_var_F & 0x8000u) != 0) {
E->sice_var_A = FUNC16(ShitroidInCutscene_FinishCutscene);
Get_ShitdroidInCutscene(0)->sice_var_37 = 0;
ShitroidInCutscene_FinishCutscene(k);
}
}
void ShitroidInCutscene_FinishCutscene(uint16 k) { // 0xA9CCF0
Enemy_ShitroidInCutscene *E = Get_ShitdroidInCutscene(0);
uint16 v2 = E->sice_var_37 + 1;
E->sice_var_37 = v2;
if (MotherBrain_Phase3_TurnLightsBackOn(v2 - 1) & 1) {
E->sice_var_A = FUNC16(MotherBrain_Phase3_Recover_MakeDistance);
CallSomeSamusCode(0x17u);
SomeMotherBrainScripts(3u);
Get_ShitdroidInCutscene(k)->base.properties |= kEnemyProps_Deleted;
Get_ShitdroidInCutscene(0x40u)->sice_var_0A = 0;
}
}
void CallSamusRainbowPaletteFunc(uint32 ea, uint16 k) {
switch (ea) {
case fnSamusRainbowPaletteFunc_ActivateWhenEnemyLow: SamusRainbowPaletteFunc_ActivateWhenEnemyLow(k); return;
case fnSamusRainbowPaletteFunc_GraduallySlowDown: SamusRainbowPaletteFunc_GraduallySlowDown(); return;
default: Unreachable();
}
}
void HandleSamusRainbowPaletteAnimation(uint16 k) { // 0xA9CD27
R18_ = Get_ShitdroidInCutscene(0x40u)->sice_var_16;
CallSamusRainbowPaletteFunc(R18_ | 0xA90000, k);
}
void SamusRainbowPaletteFunc_ActivateWhenEnemyLow(uint16 k) { // 0xA9CD30
if ((int16)(Get_ShitdroidInCutscene(k)->base.y_pos + 16 - samus_y_pos) >= 0) {
CallSomeSamusCode(0x16u);
Get_ShitdroidInCutscene(0x40u)->sice_var_16 = FUNC16(SamusRainbowPaletteFunc_GraduallySlowDown);
}
}
void SamusRainbowPaletteFunc_GraduallySlowDown(void) { // 0xA9CD4B
Enemy_ShitroidInCutscene *E = Get_ShitdroidInCutscene(0x40u);
uint16 sice_var_1D = E->sice_var_1D;
E->sice_var_1D = sice_var_1D + 768;
if (sice_var_1D >= 0xFD00u) {
uint16 v2 = special_samus_palette_frame + 1;
if (!sign16(special_samus_palette_frame - 9))
v2 = 10;
special_samus_palette_frame = v2;
}
}
uint8 ShitroidInCutscene_FadeShitroidToBlack(uint16 k) { // 0xA9CD69
int16 v2;
Enemy_ShitroidInCutscene *E = Get_ShitdroidInCutscene(k);
if (sign16(E->base.y_pos - 128))
return 0;
v2 = E->sice_var_0C - 1;
if (v2 >= 0) {
E->sice_var_0C = v2;
return 0;
}
E->sice_var_0C = 8;
uint16 v4 = E->sice_var_0D + 1;
if (!sign16(E->sice_var_0D - 6))
return 1;
E->sice_var_0D = v4;
WriteColorsToPalette(0x1E2u, 0xad, kShitroid_FadingToBlack[v4], 0xEu);
return 0;
}
void ShitroidInCutscene_HandleShitroidDeathExplosions(uint16 k) { // 0xA9CDB1
int16 v2;
Enemy_ShitroidInCutscene *E = Get_ShitdroidInCutscene(k);
v2 = E->sice_var_08 - 1;
if (v2 < 0) {
E->sice_var_08 = 4;
uint16 v3 = E->sice_var_07 + 1;
if (!sign16(E->sice_var_07 - 9))
v3 = 0;
E->sice_var_07 = v3;
int v4 = (uint16)(4 * v3) >> 1;
R18_ = E->base.x_pos + g_word_A9CDFC[v4];
R20_ = E->base.y_pos + g_word_A9CDFC[v4 + 1];
SpawnEnemyProjectileWithRoomGfx(addr_kEproj_DustCloudExplosion, 3u);
QueueSfx3_Max3(0x13u);
} else {
E->sice_var_08 = v2;
}
}
void ShitroidInCutscene_HandleEnemyBlinking(uint16 k) { // 0xA9CE24
Enemy_ShitroidInCutscene *E = Get_ShitroidInCutscene(k);
if ((E->base.frame_counter & 1) != 0)
E->base.properties &= ~kEnemyProps_Invisible;
else
E->base.properties |= kEnemyProps_Invisible;
}
void ShitroidInCutscene_AccelerateDownwards(uint16 k) { // 0xA9CE40
int16 v2;
Enemy_ShitroidInCutscene *E = Get_ShitroidInCutscene(k);
v2 = abs16(E->sice_var_B) - 32;
if (v2 < 0)
v2 = 0;
E->sice_var_B = sign16(E->sice_var_B) ? -v2 : v2;
E->sice_var_C += 2;
}
void ShitroidInCutscene_HandleHealthBasedPalette(uint16 k) { // 0xA9CE69
Enemy_ShitroidInCutscene *E = Get_ShitdroidInCutscene(k);
if (E->sice_var_09) {
uint16 health = E->base.health;
if (sign16(health - 2560)) {
uint16 v3 = 2;
if (sign16(health - 2240)) {
v3 = 4;
if (sign16(health - 1920)) {
v3 = 6;
if (sign16(health - 1600)) {
v3 = 8;
if (sign16(health - 1280)) {
v3 = 10;
if (sign16(health - 960)) {
v3 = 12;
if (sign16(health - 640))
v3 = 14;
}
}
}
}
}
uint16 v5 = v3;
uint16 v4 = kShitroid_HealthBasedPalettes_Shell[v3 >> 1];
WriteColorsToPalette(0x1E2u, 0xad, v4, 4);
WriteColorsToPalette(0x1F4u, 0xad, v4 + 8, 5);
WriteColorsToPalette(0x1EAu, 0xad, kShitroid_HealthBasedPalettes_Innards[v5 >> 1], 5u);
}
}
}
void ShitroidInCutscene_Shake(uint16 k) { // 0xA9CEDB
Enemy_ShitroidInCutscene *E = Get_ShitdroidInCutscene(k);
--E->sice_var_C;
int v2 = (uint8)(E->base.frame_counter & 6) >> 1;
E->base.x_pos = E->sice_var_10 + g_word_A993BB[v2];
E->base.y_pos = E->sice_var_11 + g_word_A993C3[v2];
}
void ShitroidInCutscene_Touch(void) { // 0xA9CF03
Enemy_ShitroidInCutscene *E = Get_ShitroidInCutscene(cur_enemy_index);
if (E->sice_var_A == (uint16)FUNC16(ShitroidInCutscene_LatchOntoSamus)) {
R18_ = samus_x_pos;
R20_ = samus_y_pos - 20;
if (Shitroid_AccelerateTowardsPoint(cur_enemy_index, 0x10u) & 1) {
E->sice_var_B = 0;
E->sice_var_C = 0;
E->sice_var_A = FUNC16(ShitroidInCutscene_HealSamusToFullHealth);
}
}
}
void ShitroidInCutscene_UpdateSpeedAndAngle(uint16 k) { // 0xA9CF31
Enemy_ShitroidInCutscene *E = Get_ShitdroidInCutscene(k);
if (R22_ != E->sice_var_0B) {
if ((int16)(R22_ - E->sice_var_0B) >= 0) {
uint16 v3 = E->sice_var_0B + 32;
if (!sign16(v3 - R22_))
v3 = R22_;
E->sice_var_0B = v3;
} else {
uint16 v2 = E->sice_var_0B - 32;
if (sign16(v2 - R22_))
v2 = R22_;
E->sice_var_0B = v2;
}
}
uint16 v4;
if ((R18_ & 0x8000u) != 0) {
v4 = E->sice_var_0A + R18_;
if (sign16(v4 - R20_))
LABEL_13:
v4 = R20_;
} else {
v4 = E->sice_var_0A + R18_;
if (!sign16(v4 - R20_))
goto LABEL_13;
}
E->sice_var_0A = v4;
R18_ = HIBYTE(v4);
E->sice_var_B = Math_MultBySin(E->sice_var_0B);
E->sice_var_C = Math_MultByCos(E->sice_var_0B);
}
uint16 Shitroid_Instr_1(uint16 k, uint16 j) { // 0xA9CFB4
return addr_kShitroid_Ilist_CFA2;
}
uint16 Shitroid_Instr_2(uint16 k, uint16 j) { // 0xA9CFCA
return addr_kShitroid_Ilist_CFB8;
}
void MotherBrain_Pal_ProcessInvincibility(void) { // 0xA9CFD4
if (Get_MotherBrain(0)->mbn_var_00 == 4) {
uint16 flash_timer = Get_MotherBrain(0x40u)->base.flash_timer;
if (flash_timer >> 1) {
if (!(flash_timer & 1)) {
for (int i = 28; i >= 0; i -= 2) {
int v2 = i >> 1;
uint16 v3 = palette_buffer[v2 + 129];
palette_buffer[v2 + 145] = v3;
palette_buffer[v2 + 177] = v3;
palette_buffer[v2 + 65] = v3;
}
}
}
}
}
void MotherBrain_Pal_BeginScreenFlash(void) { // 0xA9CFFD
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_0E = addr_stru_A9D046;
E->mbn_var_0F = 1;
}
void MotherBrain_Pal_EndScreenFlash(void) { // 0xA9D00C
Enemy_MotherBrain *E = Get_MotherBrain(0);
E->mbn_var_0E = 0;
E->mbn_var_0F = 0;
MotherBrain_Pal_WriteRoomPal(addr_word_A9D082);
}
void MotherBrain_Pal_HandleRoomPal(void) { // 0xA9D01C
uint16 j = HandleRoomPaletteInstructionList(ADDR16_OF_RAM(*enemy_ram7800) + 28);
if (j)
MotherBrain_Pal_WriteRoomPal(j);
}
void MotherBrain_Pal_WriteRoomPal(uint16 j) { // 0xA9D025
WriteColorsToPalette(0x68u, 0xa9, j, 12);
WriteColorsToPalette(0xA6u, 0xa9, j + 24, 12);
WriteColorsToPalette(0xE6u, 0xa9, j + 24, 12);
}
uint16 HandleRoomPaletteInstructionList(uint16 a) { // 0xA9D192
int16 v4;
R0_.addr = a;
R3_.addr = a + 2;
R0_.bank = 126;
R3_.bank = 126;
uint16 *v1 = (uint16 *)IndirPtr(&R0_, 0);
if ((*v1 & 0x8000u) == 0)
return 0;
uint16 v3 = *v1;
v4 = *(uint16 *)RomPtr_A9(*v1);
if (v4 < 0)
goto LABEL_8;
if (v4 == *(uint16 *)IndirPtr(&R3_, 0)) {
for (v3 += 4; ; ) {
v4 = *(uint16 *)RomPtr_A9(v3);
if (!v4)
break;
if (v4 >= 0) {
IndirWriteWord(&R3_, 0, 1u);
IndirWriteWord(&R0_, 0, v3);
return *((uint16 *)RomPtr_A9(v3) + 1);
}
LABEL_8:
R6_ = v4;
v3 = CallMotherBrainInstr((uint16)v4 | 0xA90000, v3 + 2);
}
IndirWriteWord(&R0_, 0, 0);
IndirWriteWord(&R3_, 0, 0);
return 0;
} else {
uint8 *v5 = IndirPtr(&R3_, 0);
IndirWriteWord(&R3_, 0, *(uint16 *)v5 + 1);
return *((uint16 *)RomPtr_A9(v3) + 1);
}
}
void MotherBrain_HandlePalette(void) { // 0xA9D1E4
Enemy_MotherBrain *E = Get_MotherBrain(0x40u);
if (E->mbn_var_10)
MotherBrain_HandleBrainPal();
if (E->mbn_var_11)
MotherBrain_HealthBasedPaletteHandling();
}
void MotherBrain_SetupBrainNormalPal(void) { // 0xA9D1F8
Get_MotherBrain(0)->mbn_var_E = 10;
}
void MotherBrain_SetupBrainPalForLaser(void) { // 0xA9D1FF
Get_MotherBrain(0)->mbn_var_E = 514;
}
void MotherBrain_HandleBrainPal(void) { // 0xA9D206
char mbn_var_D_high;
char mbn_var_D;
Enemy_MotherBrain *E = Get_MotherBrain(0);
if (E->mbn_var_00 != 1) {
mbn_var_D_high = HIBYTE(E->mbn_var_D);
if (mbn_var_D_high) {
HIBYTE(E->mbn_var_D) = mbn_var_D_high - 1;
} else {
R18_ = g_off_A9D260[HIBYTE(E->mbn_var_E) >> 1];
HIBYTE(E->mbn_var_D) = E->mbn_var_E;
mbn_var_D = E->mbn_var_D;
if (mbn_var_D
|| Get_MotherBrain(0x40u)->mbn_var_A == (uint16)FUNC16(MotherBrainsBrain_SetupBrainAndNeckToDraw)) {
uint8 v4 = (mbn_var_D + 1) & 7;
LOBYTE(E->mbn_var_D) = v4;
uint16 v5 = 290;
if (E->mbn_var_0D != 512)
v5 = 482;
WriteColorsToPalette(v5, 0xa9, R18_ + 8 * v4, 3u);
}
}
}
}
void WriteColorsToPalette(uint16 k, uint8 db, uint16 j, uint16 a) { // 0xA9D2E4
R18_ = a;
do {
palette_buffer[k >> 1] = *(uint16 *)RomPtrWithBank(db, j);
k += 2;
j += 2;
--R18_;
} while (R18_);
}
void WriteColorsToTargetPalette(uint8 db, uint16 k, uint16 j, uint16 a) { // 0xA9D2F6
R18_ = a;
do {
target_palettes[k >> 1] = *(uint16 *)RomPtrWithBank(db, j);
k += 2;
j += 2;
--R18_;
} while (R18_);
}
void DeadTorizo_Init(void) { // 0xA9D308
for (int i = 4094; i >= 0; i -= 2)
tilemap_stuff[i >> 1] = 0;
Enemy_DeadTorizo *E = Get_DeadTorizo(0);
E->dto_var_A = FUNC16(DeadTorizo_WaitForSamusColl);
E->base.properties |= 0xA000u;
E->base.current_instruction = addr_kDeadTorizo_Ilist_D6DC;
E->base.instruction_timer = 1;
E->base.timer = 0;
E->base.palette_index = 512;
E->dto_var_B = 0;
E->dto_var_C = 8;
E->dto_var_04 = 0;
E->dto_var_02 = 15;
E->dto_var_03 = 0;
InitializeEnemyCorpseRotting(0, addr_stru_A9DD58);
}
void CallDeadTorizoFuncA(uint32 ea) {
switch (ea) {
case fnDeadTorizo_WaitForSamusColl: DeadTorizo_WaitForSamusColl(cur_enemy_index); return;
case fnDeadTorizo_Rotting: DeadTorizo_Rotting(); return;
case fnDeadTorizo_PreRotDelay: DeadTorizo_PreRotDelay(); return;
case fnnullsub_361: return;
default: Unreachable();
}
}
void DeadTorizo_Main(void) { // 0xA9D368
Enemy_DeadTorizo *E = Get_DeadTorizo(0);
if ((E->base.properties & kEnemyProps_Tangible) == 0 && DeadTorizo_Func_0() & 1) {
E->base.properties |= kEnemyProps_Tangible;
E->dto_var_A = FUNC16(DeadTorizo_Rotting);
}
mov24(&enemy_gfx_drawn_hook, 0xA9D39Au);
CallDeadTorizoFuncA(E->dto_var_A | 0xA90000);
DeadTorizo_Func_1();
}
void DeadTorizo_MainGfxHook(void) { // 0xA9D39A
R22_ = 0;
R18_ = 296;
R20_ = 187;
MotherBrain_AddSpritemapToOam(addr_kDeadTorizo_Sprmap_D761);
}
void DeadTorizo_WaitForSamusColl(uint16 k) { // 0xA9D3AD
if (k == enemy_index_colliding_dirs[0]
|| k == enemy_index_colliding_dirs[1]
|| k == enemy_index_colliding_dirs[2]
|| k == enemy_index_colliding_dirs[3]) {
Get_DeadTorizo(0)->dto_var_A = FUNC16(DeadTorizo_PreRotDelay);
}
}
void DeadTorizo_PreRotDelay(void) { // 0xA9D3C8
Enemy_DeadTorizo *E = Get_DeadTorizo(0);
uint16 v1 = E->dto_var_04 + 1;
E->dto_var_04 = v1;
if (v1 >= 0x10u) {
E->base.properties |= kEnemyProps_Tangible;
E->dto_var_A = FUNC16(DeadTorizo_Rotting);
DeadTorizo_Rotting();
}
}
void DeadTorizo_Rotting(void) { // 0xA9D3E6
Enemy_DeadTorizo *E = Get_DeadTorizo(0);
uint16 v1 = E->dto_var_03 + 1;
E->dto_var_03 = v1;
if (v1 >= 0xFu) {
E->dto_var_03 = 0;
uint16 dto_var_02 = E->dto_var_02;
if (dto_var_02) {
DeadTorizo_CopyLineOfSandHeapTileData(dto_var_02);
--E->dto_var_02;
}
}
++E->dto_var_C;
MoveEnemyWithVelocity();
if (!(ProcessCorpseRotting(0) & 1))
E->dto_var_A = FUNC16(nullsub_361);
}
void DeadTorizo_Powerbomb(void) { // 0xA9D42A
if ((Get_DeadTorizo(0)->base.properties & kEnemyProps_Tangible) == 0)
DeadTorizo_Shot();
}
void DeadTorizo_Shot(void) { // 0xA9D433
Enemy_DeadTorizo *E = Get_DeadTorizo(0);
E->base.properties |= kEnemyProps_Tangible;
E->dto_var_A = FUNC16(DeadTorizo_Rotting);
}
uint8 DeadTorizo_Func_0(void) { // 0xA9D443
int16 v5;
uint16 v3, v4;
Enemy_DeadTorizo *E = Get_DeadTorizo(0);
R18_ = E->base.x_pos;
R20_ = E->base.y_pos;
uint16 *v1 = (uint16 *)RomPtr_A9(addr_kDeadTorizo_Hitbox_D77C);
if (!*v1)
return 0;
R22_ = *v1;
for (int i = 0xd77c + 2; ; i += 8) {
if ((int16)(samus_y_pos - R20_) >= 0) {
R24_ = samus_y_pos - R20_;
v3 = *((uint16 *)RomPtr_A9(i) + 3);
} else {
R24_ = R20_ - samus_y_pos;
v3 = *((uint16 *)RomPtr_A9(i) + 1);
}
if ((int16)(samus_y_radius + abs16(v3) - R24_) >= 0) {
if ((int16)(samus_x_pos - R18_) >= 0) {
R24_ = samus_x_pos - R18_;
v4 = *((uint16 *)RomPtr_A9(i) + 2);
} else {
R24_ = R18_ - samus_x_pos;
v4 = *(uint16 *)RomPtr_A9(i);
}
v5 = samus_x_radius + abs16(v4) - R24_;
if (v5 >= 0)
break;
}
if (!--R22_)
return 0;
}
if (sign16(v5 - 4))
v5 = 4;
extra_samus_x_displacement = v5;
extra_samus_y_displacement = 4;
extra_samus_x_subdisplacement = 0;
extra_samus_y_subdisplacement = 0;
return 1;
}
void DeadTorizo_Func_1(void) { // 0xA9D4CF
VramWriteEntry *v5;
VramWriteEntry *v10;
Enemy_DeadTorizo *E = Get_DeadTorizo(0);
uint16 v1 = E->dto_var_00 + 1;
E->dto_var_00 = v1;
uint16 v3 = vram_write_queue_tail;
if (v1 & 1) {
uint16 v8 = 0;
uint16 v9 = g_word_A9D583[0];
do {
v10 = gVramWriteEntry(v3);
v10->size = v9;
int v11 = v8 >> 1;
*(VoidP *)((char *)&v10->src.addr + 1) = g_word_A9D583[v11 + 1];
v10->src.addr = g_word_A9D583[v11 + 2];
v10->vram_dst = g_word_A9D583[v11 + 3];
v3 += 7;
v8 += 8;
v9 = g_word_A9D583[v8 >> 1];
} while (v9);
} else {
uint16 v2 = 0;
uint16 v4 = g_word_A9D549[0];
do {
v5 = gVramWriteEntry(v3);
v5->size = v4;
int v6 = v2 >> 1;
*(VoidP *)((char *)&v5->src.addr + 1) = g_word_A9D549[v6 + 1];
v5->src.addr = g_word_A9D549[v6 + 2];
v5->vram_dst = g_word_A9D549[v6 + 3];
v3 += 7;
v2 += 8;
v4 = g_word_A9D549[v2 >> 1];
} while (v4);
}
Get_DeadEnemy(0)->dey_var_22 = 0;
vram_write_queue_tail = v3;
}
void DeadTorizo_CorpseRottingFinished(void) { // 0xA9D5BD
R18_ = (random_number & 0x1F) + 272;
R20_ = 188;
SpawnEnemyProjectileWithRoomGfx(addr_kEproj_DustCloudExplosion, 0xAu);
if ((enemy_damage_routine_exec_count & 7) == 0)
QueueSfx2_Max6(0x10u);
}
void DeadTorizo_CopyLineOfSandHeapTileData(uint16 a) { // 0xA9D5EA
uint16 v1 = g_word_A9D67C[a];
int v2 = g_word_A9D69C[a] >> 1;
*(uint16 *)(&g_byte_7E9500 + v1) = kDeadTorizo_TileData[v2];
*(uint16 *)(&g_byte_7E9510 + v1) = kDeadTorizo_TileData[v2 + 8];
*(uint16 *)(&g_byte_7E9520 + v1) = kDeadTorizo_TileData[v2 + 16];
*(uint16 *)(&g_byte_7E9530 + v1) = kDeadTorizo_TileData[v2 + 24];
*(uint16 *)(&g_byte_7E9540 + v1) = kDeadTorizo_TileData[v2 + 32];
*(uint16 *)(&g_byte_7E9550 + v1) = kDeadTorizo_TileData[v2 + 40];
*(uint16 *)(&g_byte_7E9560 + v1) = kDeadTorizo_TileData[v2 + 48];
*(uint16 *)(&g_byte_7E9570 + v1) = kDeadTorizo_TileData[v2 + 56];
*(uint16 *)(&g_byte_7E9580 + v1) = kDeadTorizo_TileData[v2 + 64];
*(uint16 *)(&g_byte_7E9590 + v1) = kDeadTorizo_TileData[v2 + 72];
*(uint16 *)(&g_byte_7E95A0 + v1) = kDeadTorizo_TileData[v2 + 80];
*(uint16 *)(&g_byte_7E95B0 + v1) = kDeadTorizo_TileData[v2 + 88];
*(uint16 *)(&g_byte_7E95C0 + v1) = kDeadTorizo_TileData[v2 + 96];
*(uint16 *)(&g_byte_7E95D0 + v1) = kDeadTorizo_TileData[v2 + 104];
*(uint16 *)(&g_byte_7E95E0 + v1) = kDeadTorizo_TileData[v2 + 112];
*(uint16 *)(&g_byte_7E95F0 + v1) = kDeadTorizo_TileData[v2 + 120];
*(uint16 *)(&g_byte_7E9600 + v1) = kDeadTorizo_TileData[v2 + 128];
*(uint16 *)(&g_byte_7E9610 + v1) = kDeadTorizo_TileData[v2 + 136];
}
void DeadSidehopper_Init(void) { // 0xA9D7B6
uint16 dsr_parameter_1 = Get_DeadSidehopper(cur_enemy_index)->dsr_parameter_1;
if (dsr_parameter_1) {
if (dsr_parameter_1 != 2) {
Unreachable();
while (1)
;
}
DeadSidehopper_Init_1();
} else {
DeadSidehopper_Init_0();
}
}
void DeadSidehopper_Init_0(void) { // 0xA9D7C4
Enemy_DeadSidehopper *E = Get_DeadSidehopper(cur_enemy_index);
E->base.properties = E->base.properties & 0x77FF | kEnemyProps_ProcessedOffscreen;
if ((Get_DeadSidehopper(0)->base.properties & kEnemyProps_Invisible) != 0)
E->base.properties |= kEnemyProps_Deleted;
E->dsr_var_08 = 0;
E->dsr_var_0A = 96;
E->dsr_var_0B = 256;
E->base.x_pos = 488;
E->base.y_pos = 184;
E->dsr_var_A = FUNC16(DeadSidehopper_Alive_WaitForActivate);
E->base.palette_index = 512;
E->base.y_height = 21;
Enemy_SetInstrList(cur_enemy_index, addr_kDeadMonsters_Ilist_ECE3);
InitializeEnemyCorpseRotting(cur_enemy_index, addr_stru_A9DD68);
}
void DeadSidehopper_Init_1(void) { // 0xA9D825
Enemy_DeadSidehopper *E = Get_DeadSidehopper(cur_enemy_index);
E->dsr_var_08 = -1;
E->dsr_var_A = FUNC16(DeadSidehopper_WaitForSamusColl);
E->base.palette_index = 3584;
Enemy_SetInstrList(cur_enemy_index, addr_kDeadMonsters_Ilist_ECEF);
InitializeEnemyCorpseRotting(cur_enemy_index, addr_stru_A9DD78);
}
void DeadZoomer_Init(void) { // 0xA9D849
EnemyData *v1 = gEnemyData(cur_enemy_index);
v1->palette_index = 3584;
v1->ai_var_A = FUNC16(DeadZoomer_WaitForSamusColl);
int v2 = v1->parameter_1 >> 1;
Enemy_SetInstrList(cur_enemy_index, g_off_A9D86A[v2]);
InitializeEnemyCorpseRotting(cur_enemy_index, g_off_A9D870[v2]);
}
void DeadRipper_Init(void) { // 0xA9D876
EnemyData *v1 = gEnemyData(cur_enemy_index);
v1->palette_index = 3584;
v1->ai_var_A = FUNC16(DeadRipper_WaitForSamusColl);
int v2 = v1->parameter_1 >> 1;
Enemy_SetInstrList(cur_enemy_index, g_off_A9D897[v2]);
InitializeEnemyCorpseRotting(cur_enemy_index, g_off_A9D89B[v2]);
}
void DeadSkree_Init(void) { // 0xA9D89F
EnemyData *v1 = gEnemyData(cur_enemy_index);
v1->palette_index = 3584;
v1->ai_var_A = FUNC16(DeadSkree_WaitForSamusColl);
int v2 = v1->parameter_1 >> 1;
Enemy_SetInstrList(cur_enemy_index, g_off_A9D8C0[v2]);
InitializeEnemyCorpseRotting(cur_enemy_index, g_off_A9D8C6[v2]);
}
void DeadSidehopper_Powerbomb(void) { // 0xA9D8CC
if (Get_DeadSidehopper(cur_enemy_index)->dsr_var_08 >= 8u)
DeadSidehopper_Shot();
else
DeadSidehopper_Main();
}
void CallDeadSidehopperFunc(uint32 ea, uint16 k) {
switch (ea) {
case fnDeadSidehopper_Activated: DeadSidehopper_Activated(k); return;
case fnDeadSidehopper_Alive_WaitForActivate: DeadSidehopper_Alive_WaitForActivate(k); return;
case fnDeadSidehopper_WaitForSamusColl: DeadSidehopper_WaitForSamusColl(k); return;
case fnDeadZoomer_WaitForSamusColl: DeadZoomer_WaitForSamusColl(k); return;
case fnDeadSkree_WaitForSamusColl: DeadSkree_WaitForSamusColl(k); return;
case fnDeadRipper_WaitForSamusColl: DeadRipper_WaitForSamusColl(k); return;
case fnDeadSidehopper_PreRotDelay: DeadSidehopper_PreRotDelay(k); return;
case fnDeadZoomer_PreRotDelay: DeadZoomer_PreRotDelay(k); return;
case fnDeadSkree_PreRotDelay: DeadSkree_PreRotDelay(k); return;
case fnDeadRipper_PreRotDelay: DeadRipper_PreRotDelay(k); return;
case fnDeadSidehopper_Rotting: DeadSidehopper_Rotting(k); return;
case fnDeadZoomer_Rotting: DeadZoomer_Rotting(k); return;
case fnDeadSkree_Rotting: DeadSkree_Rotting(k); return;
case fnDeadRipper_Rotting: DeadRipper_Rotting(k); return;
case fnDeadMonsters_Func_1: DeadMonsters_Func_1(k); return;
case fnDeadMonsters_Func_2: DeadMonsters_Func_2(k); return;
case fnDeadMonsters_Func_5: DeadMonsters_Func_5(k); return;
case fnnullsub_362: return;
case fnnullsub_268: return;
default: Unreachable();
}
}
void DeadSidehopper_Main(void) { // 0xA9D8DB
Enemy_DeadSidehopper *E = Get_DeadSidehopper(cur_enemy_index);
CallDeadSidehopperFunc(E->dsr_var_A | 0xA90000, cur_enemy_index);
}
void DeadSidehopper_Alive_WaitForActivate(uint16 k) { // 0xA9D8E2
if (sign16(layer1_x_pos - 513)) {
Get_DeadSidehopper(k)->dsr_var_A = FUNC16(DeadSidehopper_Activated);
DeadSidehopper_Activated(k);
}
}
void DeadSidehopper_Activated(uint16 k) { // 0xA9D8F1
if (DeadMonsters_Func_3(k) & 1) {
Enemy_DeadSidehopper *E = Get_DeadSidehopper(k);
E->dsr_var_06 = ((uint8)E->dsr_var_06 + 1) & 3;
Enemy_SetInstrList(k, addr_kDeadMonsters_Ilist_ECAC);
E->dsr_var_A = FUNC16(nullsub_362);
}
}
void DeadMonsters_Func_1(uint16 k) { // 0xA9D910
Enemy_DeadMonsters *E = Get_DeadMonsters(k);
E->dms_var_A = FUNC16(DeadMonsters_Func_2);
E->dms_var_F = 64;
}
void DeadMonsters_Func_2(uint16 k) { // 0xA9D91D
Enemy_DeadMonsters *E = Get_DeadMonsters(k);
if ((--E->dms_var_F & 0x8000u) != 0) {
if (E->dms_var_08) {
E->dms_var_A = FUNC16(DeadMonsters_Func_5);
} else {
E->dms_var_A = FUNC16(DeadSidehopper_Activated);
Enemy_SetInstrList(k, addr_kDeadMonsters_Ilist_ECE3);
int v3 = (uint16)(2 * E->dms_var_06) >> 1;
E->dms_var_0B = g_word_A9D951[v3];
E->dms_var_0A = g_word_A9D959[v3];
}
}
}
uint8 DeadMonsters_Func_3(uint16 k) { // 0xA9D961
Enemy_DeadMonsters *E = Get_DeadMonsters(k);
DeadMonsters_Func_4(k, E->dms_var_0A);
uint16 v2 = 32;
if ((E->dms_var_0B & 0x8000u) == 0)
v2 = 128;
uint16 v3 = E->dms_var_0B + v2;
E->dms_var_0B = v3;
R18_ = v3;
if (sign16(E->base.x_pos - 544)) {
int full = HIBYTE(E->base.y_subpos) + LOBYTE(v3);
HIBYTE(E->base.y_subpos) = full;
uint16 v12 = E->base.y_pos + (int8)(v3 >> 8) + (full >> 8);
E->base.y_pos = v12;
return sign16(v12 - 184) == 0;
} else {
R18_ = v3 << 8;
R20_ = (int8)(v3 >> 8);
return Enemy_MoveDown(k);
}
}
void DeadMonsters_Func_4(uint16 k, uint16 a) { // 0xA9D9C7
R18_ = a;
Enemy_DeadMonsters *E = Get_DeadMonsters(k);
if (sign16(E->base.x_pos - 544)) {
int full = HIBYTE(E->base.x_subpos) + LOBYTE(a);
HIBYTE(E->base.x_subpos) = full;
E->base.x_pos += (int8)(a >> 8) + (full >> 8);
} else {
R18_ = a << 8;
R20_ = (int8)(a >> 8);
Enemy_MoveRight_IgnoreSlopes(k);
}
}
void DeadMonsters_Func_5(uint16 k) { // 0xA9DA08
Enemy_DeadMonsters *E = Get_DeadMonsters(k);
uint16 v2 = E->dms_var_07 + 1;
E->dms_var_07 = v2;
if (v2 >= 8u) {
E->dms_var_07 = 0;
WriteColorsToPalette(
0x122u,
0xa9, 32 * (E->dms_var_08 - 1) - 0x1434,
0xFu);
uint16 v3 = cur_enemy_index;
uint16 v5 = E->dms_var_08 + 1;
E->dms_var_08 = v5;
if (v5 >= 8u) {
Enemy_SetInstrList(v3, addr_kDeadMonsters_Ilist_ECE9);
E->dms_var_A = FUNC16(DeadSidehopper_WaitForSamusColl);
E->base.properties |= 0x8000u;
E->base.y_height = 12;
}
}
}
void DeadSidehopper_WaitForSamusColl(uint16 k) { // 0xA9DA64
DeadMonsters_WaitForSamusColl(k, FUNC16(DeadSidehopper_PreRotDelay));
}
void DeadZoomer_WaitForSamusColl(uint16 k) { // 0xA9DA69
DeadMonsters_WaitForSamusColl(k, FUNC16(DeadZoomer_PreRotDelay));
}
void DeadSkree_WaitForSamusColl(uint16 k) { // 0xA9DA6E
DeadMonsters_WaitForSamusColl(k, FUNC16(DeadSkree_PreRotDelay));
}
void DeadRipper_WaitForSamusColl(uint16 k) { // 0xA9DA73
DeadMonsters_WaitForSamusColl(k, FUNC16(DeadRipper_PreRotDelay));
}
void DeadMonsters_WaitForSamusColl(uint16 k, uint16 j) { // 0xA9DA76
if (k == enemy_index_colliding_dirs[0]
|| k == enemy_index_colliding_dirs[1]
|| k == enemy_index_colliding_dirs[2]
|| k == enemy_index_colliding_dirs[3]) {
Get_DeadMonsters(k)->dms_var_A = j;
}
}
void DeadSidehopper_PreRotDelay(uint16 k) { // 0xA9DA8F
DeadMonsters_PreRotDelay_Common(k, FUNC16(DeadSidehopper_Rotting));
}
void DeadZoomer_PreRotDelay(uint16 k) { // 0xA9DA94
DeadMonsters_PreRotDelay_Common(k, FUNC16(DeadZoomer_Rotting));
}
void DeadRipper_PreRotDelay(uint16 k) { // 0xA9DA99
DeadMonsters_PreRotDelay_Common(k, FUNC16(DeadRipper_Rotting));
}
void DeadSkree_PreRotDelay(uint16 k) { // 0xA9DA9E
DeadMonsters_PreRotDelay_Common(k, FUNC16(DeadSkree_Rotting));
}
void DeadMonsters_PreRotDelay_Common(uint16 k, uint16 j) { // 0xA9DAA1
Enemy_DeadMonsters *E = Get_DeadMonsters(k);
if (++E->dms_var_B >= 0x10u) {
E->dms_var_A = j;
E->base.properties |= kEnemyProps_Tangible;
}
}
void DeadSidehopper_Rotting(uint16 k) { // 0xA9DABA
uint8 v1 = ProcessCorpseRotting(k);
if (!(v1 & 1))
Get_DeadMonsters(cur_enemy_index)->dms_var_A = FUNC16(DeadSidehopper_WaitForSamusColl);
uint16 dms_var_53 = Get_DeadMonsters(cur_enemy_index)->dms_var_53;
ProcessCorpseRottingVramTransfers(dms_var_53);
}
void DeadZoomer_Rotting(uint16 k) { // 0xA9DAD0
uint8 v1 = ProcessCorpseRotting(k);
if (!(v1 & 1))
Get_DeadMonsters(cur_enemy_index)->dms_var_A = FUNC16(nullsub_268);
uint16 dms_var_53 = Get_DeadMonsters(cur_enemy_index)->dms_var_53;
ProcessCorpseRottingVramTransfers(dms_var_53);
}
void DeadRipper_Rotting(uint16 k) { // 0xA9DAE6
uint8 v1 = ProcessCorpseRotting(k);
if (!(v1 & 1))
Get_DeadMonsters(cur_enemy_index)->dms_var_A = FUNC16(nullsub_268);
uint16 dms_var_53 = Get_DeadMonsters(cur_enemy_index)->dms_var_53;
ProcessCorpseRottingVramTransfers(dms_var_53);
}
void DeadSkree_Rotting(uint16 k) { // 0xA9DAFC
uint8 v1 = ProcessCorpseRotting(k);
if (!(v1 & 1))
Get_DeadMonsters(cur_enemy_index)->dms_var_A = FUNC16(nullsub_268);
uint16 dms_var_53 = Get_DeadMonsters(cur_enemy_index)->dms_var_53;
ProcessCorpseRottingVramTransfers(dms_var_53);
}
uint8 ProcessCorpseRotting(uint16 k) { // 0xA9DB12
int16 *v5;
int16 v7;
int16 v8;
Enemy_DeadMonsters *EK = Get_DeadMonsters(k);
Enemy_DeadMonsters *E0 = Get_DeadMonsters(0);
E0->dms_var_45 = EK->dms_var_57;
E0->dms_var_46 = EK->dms_var_58;
E0->dms_var_47 = EK->dms_var_59;
E0->dms_var_48 = EK->dms_var_5A;
E0->dms_var_49 = EK->dms_var_5B;
E0->dms_var_44 = EK->dms_var_56;
E0->dms_var_42 = EK->dms_var_54;
E0->dms_var_43 = EK->dms_var_55;
uint16 dms_var_52 = EK->dms_var_52;
uint16 v4 = 0;
uint16 v15;
uint16 *v6;
while (1) {
v15 = v4;
v5 = (int16 *)RomPtr_7E(dms_var_52);
v6 = (uint16 *)v5;
if (*v5 >= 0)
break;
LABEL_12:
dms_var_52 += 4;
v4 = v15 + 1;
E0 = Get_DeadMonsters(0);
if ((int16)(v15 + 1 - E0->dms_var_45) >= 0)
return (uint16)(v15 + 1) >= E0->dms_var_45;
}
v7 = v5[1];
if (v7) {
v8 = v7 - 1;
v5[1] = v8;
if ((uint16)v8 < 4u) {
E0 = Get_DeadMonsters(0);
R18_ = E0->dms_var_42;
if (v15 >= E0->dms_var_47)
R18_ = E0->dms_var_43;
R20_ = E0->dms_var_44;
R22_ = 169;
CopyMoveCorpseRottingRotEntry(*v6);
}
goto LABEL_12;
}
Enemy_DeadMonsters *E = Get_DeadMonsters(0);
R18_ = E->dms_var_43;
R20_ = E->dms_var_44;
R22_ = 169;
uint16 *v11 = (uint16 *)RomPtr_7E(dms_var_52);
CopyMoveCorpseRottingRotEntry(*v11);
uint16 v12 = *(uint16 *)RomPtr_7E(dms_var_52) + 2;
if (v12 < E->dms_var_46) {
LABEL_11:
*(uint16 *)RomPtr_7E(dms_var_52) = v12;
goto LABEL_12;
}
R18_ = E->dms_var_49;
CallCorpseRottingFinish(R18_ | 0xA90000);
if (v15 < Get_DeadMonsters(0)->dms_var_46) {
v12 = -1;
goto LABEL_11;
}
return 0;
}
void CopyMoveCorpseRottingRotEntry(uint16 a) { // 0xA9DBE0
Enemy_DeadMonsters *E = Get_DeadMonsters(0);
E->dms_var_41 = a;
uint16 v1 = (uint16)(a & 0xFFF8) >> 2;
uint16 v2 = a & 7;
uint8 *v4 = IndirPtr(&R20_, v1);
if (v2 >= 6u) {
uint16 v6 = *(uint16 *)v4 + 2 * v2;
CallCorpseRottingMove(R18_ | 0xA90000, E->dms_var_48 + v6, v6);
} else {
uint16 v5 = *(uint16 *)v4 + 2 * v2;
CallCorpseRottingMove(R18_ | 0xA90000, v5, v5);
}
}
void CorpseRottingRotEntryFinishedHook(void) { // 0xA9DC08
EnemyData *v0 = gEnemyData(cur_enemy_index);
R18_ = v0->x_pos + (random_number & 0x1A) - 14;
R20_ = v0->y_pos + 16;
SpawnEnemyProjectileWithRoomGfx(addr_kEproj_DustCloudExplosion, 0xAu);
if ((enemy_damage_routine_exec_count & 7) == 0)
QueueSfx2_Max3(0x10u);
}
void InitializeCorpseRottingDataTable(uint16 k, uint16 a) { // 0xA9DC40
int16 v2;
v2 = a - 1;
R18_ = 0;
do {
*(uint16 *)RomPtr_7E(k) = v2;
uint16 v3 = k + 2;
*(uint16 *)RomPtr_7E(v3) = R18_;
k = v3 + 2;
R18_ += 2;
--v2;
} while (v2 >= 0);
}
void InitializeEnemyCorpseRotting(uint16 k, uint16 j) { // 0xA9DC5F
uint8 *v2 = RomPtr_A9(j);
Enemy_DeadMonsters *E = Get_DeadMonsters(k);
E->dms_var_52 = *(uint16 *)v2;
E->dms_var_53 = *((uint16 *)v2 + 1);
E->dms_var_54 = *((uint16 *)v2 + 2);
E->dms_var_55 = *((uint16 *)v2 + 3);
E->dms_var_5B = *((uint16 *)v2 + 7);
uint16 v4 = *((uint16 *)v2 + 6);
E->dms_var_56 = v4;
E->dms_var_5A = *((uint16 *)RomPtr_A9(v4) + 1) - 12;
uint16 *v5 = (uint16 *)RomPtr_A9(j);
uint16 v6 = v5[4];
E->dms_var_57 = v6--;
E->dms_var_58 = v6;
E->dms_var_59 = v6 - 1;
InitializeCorpseRottingDataTable(*v5, v5[4]);
R18_ = v5[5];
CallCorpseRottingInit(R18_ | 0xA90000);
}
void ProcessCorpseRottingVramTransfers(uint16 k) { // 0xA9DCB9
VramWriteEntry *v3;
uint16 v1 = vram_write_queue_tail;
uint16 v2 = *(uint16 *)RomPtr_A9(k);
do {
v3 = gVramWriteEntry(v1);
v3->size = v2;
uint8 *v4 = RomPtr_A9(k);
*(VoidP *)((char *)&v3->src.addr + 1) = *((uint16 *)v4 + 1);
v3->src.addr = *((uint16 *)v4 + 2);
v3->vram_dst = *((uint16 *)v4 + 3);
v1 += 7;
k += 8;
v2 = *(uint16 *)RomPtr_A9(k);
} while (v2);
Get_DeadEnemy(0)->dey_var_22 = 0;
vram_write_queue_tail = v1;
}
void DeadZoomer_Powerbomb(void) { // 0xA9DCED
if ((gEnemyData(cur_enemy_index)->properties & kEnemyProps_Tangible) == 0)
DeadZoomer_Shot();
}
void DeadZoomer_Shot(void) { // 0xA9DCF8
DeadSidehopper_DD34(FUNC16(DeadZoomer_Rotting));
}
void DeadRipper_Powerbomb(void) { // 0xA9DCFD
if ((gEnemyData(cur_enemy_index)->properties & kEnemyProps_Tangible) == 0)
DeadRipper_Shot();
}
void DeadRipper_Shot(void) { // 0xA9DD08
DeadSidehopper_DD34(FUNC16(DeadRipper_Rotting));
}
void DeadSkree_Powerbomb(void) { // 0xA9DD0D
if ((gEnemyData(cur_enemy_index)->properties & kEnemyProps_Tangible) == 0)
DeadSkree_Shot();
}
void DeadSkree_Shot(void) { // 0xA9DD18
DeadSidehopper_DD34(FUNC16(DeadSkree_Rotting));
}
void DeadSidehopper_Shot(void) { // 0xA9DD1D
Enemy_DeadSidehopper *E = Get_DeadSidehopper(cur_enemy_index);
if ((E->base.properties & kEnemyProps_Tangible) != 0 || E->dsr_var_08 < 8u)
;
else
DeadSidehopper_DD31();
}
void DeadSidehopper_DD31(void) { // 0xA9DD31
DeadSidehopper_DD34(FUNC16(DeadSidehopper_Rotting));
}
void DeadSidehopper_DD34(uint16 a) { // 0xA9DD34
Enemy_DeadSidehopper *E = Get_DeadSidehopper(cur_enemy_index);
E->dsr_var_A = a;
E->base.properties |= kEnemyProps_ProcessedOffscreen | kEnemyProps_Tangible;
}
void DeadSidehopper_Touch(void) { // 0xA9DD44
if (Get_DeadSidehopper(cur_enemy_index)->dsr_var_08 < 8u)
NormalEnemyTouchAiSkipDeathAnim_CurEnemy();
else
DeadSidehopper_DD31();
}
void Torizo_CorpseRottingInitFunc(void) { // 0xA9DE18
uint8 *v0 = RomPtr_7E(0x2060u);
uint8 *v1 = RomPtr_B7(addr_kDeadTorizo_TileData__plus__288);
MemCpy(v0, v1, 0xC0u);
uint8 *v2 = RomPtr_7E(0x21A0u);
uint8 *v3 = RomPtr_B7(addr_kDeadTorizo_TileData__plus__800);
MemCpy(v2, v3, 0xC0u);
uint8 *v4 = RomPtr_7E(0x22C0u);
uint8 *v5 = RomPtr_B7(addr_kDeadTorizo_TileData__plus__1280);
MemCpy(v4, v5, 0x100u);
uint8 *v6 = RomPtr_7E(0x2400u);
uint8 *v7 = RomPtr_B7(addr_kDeadTorizo_TileData__plus__1792);
MemCpy(v6, v7, 0x100u);
uint8 *v8 = RomPtr_7E(0x2540u);
uint8 *v9 = RomPtr_B7(addr_kDeadTorizo_TileData__plus__2304);
MemCpy(v8, v9, 0x100u);
uint8 *v10 = RomPtr_7E(0x2680u);
uint8 *v11 = RomPtr_B7(addr_kDeadTorizo_TileData__plus__2816);
MemCpy(v10, v11, 0x100u);
uint8 *v12 = RomPtr_7E(0x27C0u);
uint8 *v13 = RomPtr_B7(addr_kDeadTorizo_TileData__plus__3328);
MemCpy(v12, v13, 0x100u);
uint8 *v14 = RomPtr_7E(0x2900u);
uint8 *v15 = RomPtr_B7(addr_kDeadTorizo_TileData__plus__3840);
MemCpy(v14, v15, 0x100u);
uint8 *v16 = RomPtr_7E(0x2A40u);
uint8 *v17 = RomPtr_B7(addr_kDeadTorizo_TileData__plus__4352);
MemCpy(v16, v17, 0x100u);
uint8 *v18 = RomPtr_7E(0x2B60u);
uint8 *v19 = RomPtr_B7(addr_kDeadTorizo_TileData__plus__4832);
MemCpy(v18, v19, 0x120u);
uint8 *v20 = RomPtr_7E(0x2C80u);
uint8 *v21 = RomPtr_B7(addr_kDeadTorizo_TileData__plus__5312);
MemCpy(v20, v21, 0x140u);
uint8 *v22 = RomPtr_7E(0x2DC0u);
uint8 *v23 = RomPtr_B7(addr_kDeadTorizo_TileData__plus__5824);
MemCpy(v22, v23, 0x140u);
}
void Sidehopper_CorpseRottingInitFunc_0(void) { // 0xA9DEC1
uint8 *v0 = RomPtr_7E(0x2040u);
uint8 *v1 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__64);
MemCpy(v0, v1, 0x60u);
uint8 *v2 = RomPtr_7E(0x20A0u);
uint8 *v3 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__512);
MemCpy(v2, v3, 0xA0u);
uint8 *v4 = RomPtr_7E(0x2140u);
uint8 *v5 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__1024);
MemCpy(v4, v5, 0xA0u);
uint8 *v6 = RomPtr_7E(0x21E0u);
uint8 *v7 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__1536);
MemCpy(v6, v7, 0xA0u);
uint8 *v8 = RomPtr_7E(0x2280u);
uint8 *v9 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__2048);
MemCpy(v8, v9, 0xA0u);
}
void Sidehopper_CorpseRottingInitFunc_2(void) { // 0xA9DF08
uint8 *v0 = RomPtr_7E(0x2320u);
uint8 *v1 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__288);
MemCpy(v0, v1, 0x40u);
uint8 *v2 = RomPtr_7E(0x23C0u);
uint8 *v3 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__800);
MemCpy(v2, v3, 0xA0u);
uint8 *v4 = RomPtr_7E(0x2460u);
uint8 *v5 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__1312);
MemCpy(v4, v5, 0xA0u);
uint8 *v6 = RomPtr_7E(0x2500u);
uint8 *v7 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__1824);
MemCpy(v6, v7, 0xA0u);
uint8 *v8 = RomPtr_7E(0x25A0u);
uint8 *v9 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__2336);
MemCpy(v8, v9, 0xA0u);
}
void Zoomer_CorpseRottingInitFunc_0(void) { // 0xA9DF4F
uint8 *v0 = RomPtr_7E(0x2940u);
uint8 *v1 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__2656);
MemCpy(v0, v1, 0x60u);
uint8 *v2 = RomPtr_7E(0x29A0u);
uint8 *v3 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__3168);
MemCpy(v2, v3, 0x60u);
}
void Zoomer_CorpseRottingInitFunc_2(void) { // 0xA9DF6C
uint8 *v0 = RomPtr_7E(0x2A00u);
uint8 *v1 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__2752);
MemCpy(v0, v1, 0x60u);
uint8 *v2 = RomPtr_7E(0x2A60u);
uint8 *v3 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__3264);
MemCpy(v2, v3, 0x60u);
}
void Zoomer_CorpseRottingInitFunc_4(void) { // 0xA9DF89
uint8 *v0 = RomPtr_7E(0x2AC0u);
uint8 *v1 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__2848);
MemCpy(v0, v1, 0x60u);
uint8 *v2 = RomPtr_7E(0x2B20u);
uint8 *v3 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__3360);
MemCpy(v2, v3, 0x60u);
}
void Ripper_CorpseRottingInitFunc_0(void) { // 0xA9DFA6
uint8 *v0 = RomPtr_7E(0x2B80u);
uint8 *v1 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__2560);
MemCpy(v0, v1, 0x60u);
uint8 *v2 = RomPtr_7E(0x2BE0u);
uint8 *v3 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__3072);
MemCpy(v2, v3, 0x60u);
}
void Ripper_CorpseRottingInitFunc_2(void) { // 0xA9DFC3
uint8 *v0 = RomPtr_7E(0x2C40u);
uint8 *v1 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__2944);
MemCpy(v0, v1, 0x60u);
uint8 *v2 = RomPtr_7E(0x2CA0u);
uint8 *v3 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__3456);
MemCpy(v2, v3, 0x60u);
}
void Skree_CorpseRottingInitFunc_0(void) { // 0xA9DFE0
uint8 *v0 = RomPtr_7E(0x2640u);
uint8 *v1 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__672);
MemCpy(v0, v1, 0x40u);
uint8 *v2 = RomPtr_7E(0x2680u);
uint8 *v3 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__1184);
MemCpy(v2, v3, 0x40u);
uint8 *v4 = RomPtr_7E(0x26C0u);
uint8 *v5 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__1696);
MemCpy(v4, v5, 0x40u);
uint8 *v6 = RomPtr_7E(0x2700u);
uint8 *v7 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__2208);
MemCpy(v6, v7, 0x40u);
}
void Skree_CorpseRottingInitFunc_2(void) { // 0xA9E019
uint8 *v0 = RomPtr_7E(0x2740u);
uint8 *v1 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__224);
MemCpy(v0, v1, 0x40u);
uint8 *v2 = RomPtr_7E(0x2780u);
uint8 *v3 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__736);
MemCpy(v2, v3, 0x40u);
uint8 *v4 = RomPtr_7E(0x27C0u);
uint8 *v5 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__1248);
MemCpy(v4, v5, 0x40u);
uint8 *v6 = RomPtr_7E(0x2800u);
uint8 *v7 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__1760);
MemCpy(v6, v7, 0x40u);
}
void Skree_CorpseRottingInitFunc_4(void) { // 0xA9E052
uint8 *v0 = RomPtr_7E(0x2840u);
uint8 *v1 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__448);
MemCpy(v0, v1, 0x40u);
uint8 *v2 = RomPtr_7E(0x2880u);
uint8 *v3 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__960);
MemCpy(v2, v3, 0x40u);
uint8 *v4 = RomPtr_7E(0x28C0u);
uint8 *v5 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__1472);
MemCpy(v4, v5, 0x40u);
uint8 *v6 = RomPtr_7E(0x2900u);
uint8 *v7 = RomPtr_B7(addr_kDeadMonsters_TileData__plus__1984);
MemCpy(v6, v7, 0x40u);
}
void MotherBrain_CorpseRottingInitFunc(void) { // 0xA9E08B
uint8 *v0 = RomPtr_7E(0x9000u);
uint8 *v1 = RomPtr_B7(addr_kMotherBrain_Misc_TileData__plus__192);
MemCpy(v0, v1, 0xC0u);
uint8 *v2 = RomPtr_7E(0x90E0u);
uint8 *v3 = RomPtr_B7(addr_kMotherBrain_Misc_TileData__plus__704);
MemCpy(v2, v3, 0xC0u);
uint8 *v4 = RomPtr_7E(0x91C0u);
uint8 *v5 = RomPtr_B7(addr_kMotherBrain_Misc_TileData__plus__1216);
MemCpy(v4, v5, 0xC0u);
uint8 *v6 = RomPtr_7E(0x92A0u);
uint8 *v7 = RomPtr_B7(addr_kMotherBrain_Misc_TileData__plus__1728);
MemCpy(v6, v7, 0xC0u);
uint8 *v8 = RomPtr_7E(0x9380u);
uint8 *v9 = RomPtr_B7(addr_kMotherBrain_Misc_TileData__plus__2240);
MemCpy(v8, v9, 0xE0u);
uint8 *v10 = RomPtr_7E(0x9460u);
uint8 *v11 = RomPtr_B7(addr_kMotherBrain_Misc_TileData__plus__2752);
MemCpy(v10, v11, 0xE0u);
}
void Torizo_CorpseRottingMoveFunc(uint16 j, uint16 k) { // 0xA9E272
Enemy_DeadMonsters *E = Get_DeadMonsters(0);
if (E->dms_var_41 >= 0x50u) {
if (sign16(E->dms_var_41 - 94)) {
int v3 = k >> 1;
int v4 = j >> 1;
tilemap_stuff[v4 + 1] = tilemap_stuff[v3];
tilemap_stuff[v4 + 9] = tilemap_stuff[v3 + 8];
}
int v5 = k >> 1;
tilemap_stuff[v5] = 0;
tilemap_stuff[v5 + 8] = 0;
}
if (E->dms_var_41 >= 0x48u) {
if (sign16(E->dms_var_41 - 94)) {
int v6 = k >> 1;
int v7 = j >> 1;
tilemap_stuff[v7 + 17] = tilemap_stuff[v6 + 16];
tilemap_stuff[v7 + 25] = tilemap_stuff[v6 + 24];
}
int v8 = k >> 1;
tilemap_stuff[v8 + 16] = 0;
tilemap_stuff[v8 + 24] = 0;
}
if (E->dms_var_41 >= 0x10u) {
if (sign16(E->dms_var_41 - 94)) {
int v9 = k >> 1;
int v10 = j >> 1;
tilemap_stuff[v10 + 33] = tilemap_stuff[v9 + 32];
tilemap_stuff[v10 + 41] = tilemap_stuff[v9 + 40];
}
int v11 = k >> 1;
tilemap_stuff[v11 + 32] = 0;
tilemap_stuff[v11 + 40] = 0;
}
if (sign16(E->dms_var_41 - 94)) {
int v12 = k >> 1;
int v13 = j >> 1;
tilemap_stuff[v13 + 49] = tilemap_stuff[v12 + 48];
tilemap_stuff[v13 + 57] = tilemap_stuff[v12 + 56];
}
int v14 = k >> 1;
tilemap_stuff[v14 + 48] = 0;
tilemap_stuff[v14 + 56] = 0;
if (sign16(E->dms_var_41 - 94)) {
int v15 = j >> 1;
tilemap_stuff[v15 + 65] = tilemap_stuff[v14 + 64];
tilemap_stuff[v15 + 73] = tilemap_stuff[v14 + 72];
}
tilemap_stuff[v14 + 64] = 0;
tilemap_stuff[v14 + 72] = 0;
if (sign16(E->dms_var_41 - 94)) {
int v16 = j >> 1;
tilemap_stuff[v16 + 81] = tilemap_stuff[v14 + 80];
tilemap_stuff[v16 + 89] = tilemap_stuff[v14 + 88];
}
tilemap_stuff[v14 + 80] = 0;
tilemap_stuff[v14 + 88] = 0;
if (sign16(E->dms_var_41 - 94)) {
int v17 = j >> 1;
tilemap_stuff[v17 + 97] = tilemap_stuff[v14 + 96];
tilemap_stuff[v17 + 105] = tilemap_stuff[v14 + 104];
}
tilemap_stuff[v14 + 96] = 0;
tilemap_stuff[v14 + 104] = 0;
if (sign16(E->dms_var_41 - 94)) {
int v18 = j >> 1;
tilemap_stuff[v18 + 113] = tilemap_stuff[v14 + 112];
tilemap_stuff[v18 + 121] = tilemap_stuff[v14 + 120];
}
tilemap_stuff[v14 + 112] = 0;
tilemap_stuff[v14 + 120] = 0;
if (sign16(E->dms_var_41 - 94)) {
int v19 = j >> 1;
tilemap_stuff[v19 + 129] = tilemap_stuff[v14 + 128];
tilemap_stuff[v19 + 137] = tilemap_stuff[v14 + 136];
}
tilemap_stuff[v14 + 128] = 0;
tilemap_stuff[v14 + 136] = 0;
if (E->dms_var_41 >= 0x10u) {
if (sign16(E->dms_var_41 - 94)) {
int v20 = j >> 1;
tilemap_stuff[v20 + 145] = tilemap_stuff[v14 + 144];
tilemap_stuff[v20 + 153] = tilemap_stuff[v14 + 152];
}
tilemap_stuff[v14 + 144] = 0;
tilemap_stuff[v14 + 152] = 0;
}
}
void Torizo_CorpseRottingCopyFunc(uint16 j, uint16 k) { // 0xA9E38B
Enemy_DeadMonsters *E = Get_DeadMonsters(0);
if (E->dms_var_41 >= 0x50u && sign16(E->dms_var_41 - 94)) {
int v3 = k >> 1;
int v4 = j >> 1;
tilemap_stuff[v4 + 1] = tilemap_stuff[v3];
tilemap_stuff[v4 + 9] = tilemap_stuff[v3 + 8];
}
if (E->dms_var_41 >= 0x48u && sign16(E->dms_var_41 - 94)) {
int v5 = k >> 1;
int v6 = j >> 1;
tilemap_stuff[v6 + 17] = tilemap_stuff[v5 + 16];
tilemap_stuff[v6 + 25] = tilemap_stuff[v5 + 24];
}
if (E->dms_var_41 >= 0x10u && sign16(E->dms_var_41 - 94)) {
int v7 = k >> 1;
int v8 = j >> 1;
tilemap_stuff[v8 + 33] = tilemap_stuff[v7 + 32];
tilemap_stuff[v8 + 41] = tilemap_stuff[v7 + 40];
}
if (sign16(E->dms_var_41 - 94)) {
int v9 = k >> 1;
int v10 = j >> 1;
tilemap_stuff[v10 + 49] = tilemap_stuff[v9 + 48];
tilemap_stuff[v10 + 57] = tilemap_stuff[v9 + 56];
}
if (sign16(E->dms_var_41 - 94)) {
int v11 = k >> 1;
int v12 = j >> 1;
tilemap_stuff[v12 + 65] = tilemap_stuff[v11 + 64];
tilemap_stuff[v12 + 73] = tilemap_stuff[v11 + 72];
}
if (sign16(E->dms_var_41 - 94)) {
int v13 = k >> 1;
int v14 = j >> 1;
tilemap_stuff[v14 + 81] = tilemap_stuff[v13 + 80];
tilemap_stuff[v14 + 89] = tilemap_stuff[v13 + 88];
}
if (sign16(E->dms_var_41 - 94)) {
int v15 = k >> 1;
int v16 = j >> 1;
tilemap_stuff[v16 + 97] = tilemap_stuff[v15 + 96];
tilemap_stuff[v16 + 105] = tilemap_stuff[v15 + 104];
}
if (sign16(E->dms_var_41 - 94)) {
int v17 = k >> 1;
int v18 = j >> 1;
tilemap_stuff[v18 + 113] = tilemap_stuff[v17 + 112];
tilemap_stuff[v18 + 121] = tilemap_stuff[v17 + 120];
}
if (sign16(E->dms_var_41 - 94)) {
int v19 = k >> 1;
int v20 = j >> 1;
tilemap_stuff[v20 + 129] = tilemap_stuff[v19 + 128];
tilemap_stuff[v20 + 137] = tilemap_stuff[v19 + 136];
}
if (E->dms_var_41 >= 0x10u) {
if (sign16(E->dms_var_41 - 94)) {
int v21 = k >> 1;
int v22 = j >> 1;
tilemap_stuff[v22 + 145] = tilemap_stuff[v21 + 144];
tilemap_stuff[v22 + 153] = tilemap_stuff[v21 + 152];
}
}
}
void Sidehopper_CorpseRottingMoveFunc_0(uint16 j, uint16 k) { // 0xA9E468
Enemy_DeadMonsters *E = Get_DeadMonsters(0);
if (E->dms_var_41 >= 8u) {
if (sign16(E->dms_var_41 - 38)) {
int v3 = k >> 1;
int v4 = j >> 1;
tilemap_stuff[v4 + 1] = tilemap_stuff[v3];
tilemap_stuff[v4 + 9] = tilemap_stuff[v3 + 8];
}
int v5 = k >> 1;
tilemap_stuff[v5] = 0;
tilemap_stuff[v5 + 8] = 0;
}
if (E->dms_var_41 >= 8u) {
if (sign16(E->dms_var_41 - 38)) {
int v6 = k >> 1;
int v7 = j >> 1;
tilemap_stuff[v7 + 17] = tilemap_stuff[v6 + 16];
tilemap_stuff[v7 + 25] = tilemap_stuff[v6 + 24];
}
int v8 = k >> 1;
tilemap_stuff[v8 + 16] = 0;
tilemap_stuff[v8 + 24] = 0;
}
if (sign16(E->dms_var_41 - 38)) {
int v9 = k >> 1;
int v10 = j >> 1;
tilemap_stuff[v10 + 33] = tilemap_stuff[v9 + 32];
tilemap_stuff[v10 + 41] = tilemap_stuff[v9 + 40];
}
int v11 = k >> 1;
tilemap_stuff[v11 + 32] = 0;
tilemap_stuff[v11 + 40] = 0;
if (sign16(E->dms_var_41 - 38)) {
int v12 = j >> 1;
tilemap_stuff[v12 + 49] = tilemap_stuff[v11 + 48];
tilemap_stuff[v12 + 57] = tilemap_stuff[v11 + 56];
}
tilemap_stuff[v11 + 48] = 0;
tilemap_stuff[v11 + 56] = 0;
if (sign16(E->dms_var_41 - 38)) {
int v13 = j >> 1;
tilemap_stuff[v13 + 65] = tilemap_stuff[v11 + 64];
tilemap_stuff[v13 + 73] = tilemap_stuff[v11 + 72];
}
tilemap_stuff[v11 + 64] = 0;
tilemap_stuff[v11 + 72] = 0;
}
void Sidehopper_CorpseRottingCopyFunc_0(uint16 j, uint16 k) { // 0xA9E4F5
Enemy_DeadMonsters *E = Get_DeadMonsters(0);
if (E->dms_var_41 >= 8u && sign16(E->dms_var_41 - 38)) {
int v3 = k >> 1;
int v4 = j >> 1;
tilemap_stuff[v4 + 1] = tilemap_stuff[v3];
tilemap_stuff[v4 + 9] = tilemap_stuff[v3 + 8];
}
if (E->dms_var_41 >= 8u && sign16(E->dms_var_41 - 38)) {
int v5 = k >> 1;
int v6 = j >> 1;
tilemap_stuff[v6 + 17] = tilemap_stuff[v5 + 16];
tilemap_stuff[v6 + 25] = tilemap_stuff[v5 + 24];
}
if (sign16(E->dms_var_41 - 38)) {
int v7 = k >> 1;
int v8 = j >> 1;
tilemap_stuff[v8 + 33] = tilemap_stuff[v7 + 32];
tilemap_stuff[v8 + 41] = tilemap_stuff[v7 + 40];
}
if (sign16(E->dms_var_41 - 38)) {
int v9 = k >> 1;
int v10 = j >> 1;
tilemap_stuff[v10 + 49] = tilemap_stuff[v9 + 48];
tilemap_stuff[v10 + 57] = tilemap_stuff[v9 + 56];
}
if (sign16(E->dms_var_41 - 38)) {
int v11 = k >> 1;
int v12 = j >> 1;
tilemap_stuff[v12 + 65] = tilemap_stuff[v11 + 64];
tilemap_stuff[v12 + 73] = tilemap_stuff[v11 + 72];
}
}
void Sidehopper_CorpseRottingMoveFunc_2(uint16 j, uint16 k) { // 0xA9E564
Enemy_DeadMonsters *E = Get_DeadMonsters(0);
if (sign16(E->dms_var_41 - 38)) {
int v3 = k >> 1;
int v4 = j >> 1;
tilemap_stuff[v4 + 401] = tilemap_stuff[v3 + 400];
tilemap_stuff[v4 + 409] = tilemap_stuff[v3 + 408];
}
int v5 = k >> 1;
tilemap_stuff[v5 + 400] = 0;
tilemap_stuff[v5 + 408] = 0;
if (sign16(E->dms_var_41 - 38)) {
int v6 = j >> 1;
tilemap_stuff[v6 + 417] = tilemap_stuff[v5 + 416];
tilemap_stuff[v6 + 425] = tilemap_stuff[v5 + 424];
}
tilemap_stuff[v5 + 416] = 0;
tilemap_stuff[v5 + 424] = 0;
if (E->dms_var_41 >= 8u) {
if (sign16(E->dms_var_41 - 38)) {
int v7 = j >> 1;
tilemap_stuff[v7 + 433] = tilemap_stuff[v5 + 432];
tilemap_stuff[v7 + 441] = tilemap_stuff[v5 + 440];
}
tilemap_stuff[v5 + 432] = 0;
tilemap_stuff[v5 + 440] = 0;
}
if (E->dms_var_41 >= 8u) {
if (sign16(E->dms_var_41 - 38)) {
int v8 = j >> 1;
tilemap_stuff[v8 + 449] = tilemap_stuff[v5 + 448];
tilemap_stuff[v8 + 457] = tilemap_stuff[v5 + 456];
}
tilemap_stuff[v5 + 448] = 0;
tilemap_stuff[v5 + 456] = 0;
}
if (E->dms_var_41 >= 8u) {
if (sign16(E->dms_var_41 - 38)) {
int v9 = j >> 1;
tilemap_stuff[v9 + 465] = tilemap_stuff[v5 + 464];
tilemap_stuff[v9 + 473] = tilemap_stuff[v5 + 472];
}
tilemap_stuff[v5 + 464] = 0;
tilemap_stuff[v5 + 472] = 0;
}
}
void Sidehopper_CorpseRottingCopyFunc_2(uint16 j, uint16 k) { // 0xA9E5F6
Enemy_DeadMonsters *E = Get_DeadMonsters(0);
if (sign16(E->dms_var_41 - 38)) {
int v3 = k >> 1;
int v4 = j >> 1;
tilemap_stuff[v4 + 401] = tilemap_stuff[v3 + 400];
tilemap_stuff[v4 + 409] = tilemap_stuff[v3 + 408];
}
if (sign16(E->dms_var_41 - 38)) {
int v5 = k >> 1;
int v6 = j >> 1;
tilemap_stuff[v6 + 417] = tilemap_stuff[v5 + 416];
tilemap_stuff[v6 + 425] = tilemap_stuff[v5 + 424];
}
if (E->dms_var_41 >= 8u && sign16(E->dms_var_41 - 38)) {
int v7 = k >> 1;
int v8 = j >> 1;
tilemap_stuff[v8 + 433] = tilemap_stuff[v7 + 432];
tilemap_stuff[v8 + 441] = tilemap_stuff[v7 + 440];
}
if (E->dms_var_41 >= 8u && sign16(E->dms_var_41 - 38)) {
int v9 = k >> 1;
int v10 = j >> 1;
tilemap_stuff[v10 + 449] = tilemap_stuff[v9 + 448];
tilemap_stuff[v10 + 457] = tilemap_stuff[v9 + 456];
}
if (E->dms_var_41 >= 8u) {
if (sign16(E->dms_var_41 - 38)) {
int v11 = k >> 1;
int v12 = j >> 1;
tilemap_stuff[v12 + 465] = tilemap_stuff[v11 + 464];
tilemap_stuff[v12 + 473] = tilemap_stuff[v11 + 472];
}
}
}
void Zoomer_CorpseRottingMoveFunc_0(uint16 j, uint16 k) { // 0xA9E66A
Enemy_DeadMonsters *E = Get_DeadMonsters(0);
if (sign16(E->dms_var_41 - 14)) {
int v3 = k >> 1;
int v4 = j >> 1;
tilemap_stuff[v4 + 1185] = tilemap_stuff[v3 + 1184];
tilemap_stuff[v4 + 1193] = tilemap_stuff[v3 + 1192];
}
int v5 = k >> 1;
tilemap_stuff[v5 + 1184] = 0;
tilemap_stuff[v5 + 1192] = 0;
if (sign16(E->dms_var_41 - 14)) {
int v6 = j >> 1;
tilemap_stuff[v6 + 1201] = tilemap_stuff[v5 + 1200];
tilemap_stuff[v6 + 1209] = tilemap_stuff[v5 + 1208];
}
tilemap_stuff[v5 + 1200] = 0;
tilemap_stuff[v5 + 1208] = 0;
if (sign16(E->dms_var_41 - 14)) {
int v7 = j >> 1;
tilemap_stuff[v7 + 1217] = tilemap_stuff[v5 + 1216];
tilemap_stuff[v7 + 1225] = tilemap_stuff[v5 + 1224];
}
tilemap_stuff[v5 + 1216] = 0;
tilemap_stuff[v5 + 1224] = 0;
}
void Zoomer_CorpseRottingCopyFunc_0(uint16 j, uint16 k) { // 0xA9E6B9
Enemy_DeadMonsters *E = Get_DeadMonsters(0);
if (sign16(E->dms_var_41 - 14)) {
int v3 = k >> 1;
int v4 = j >> 1;
tilemap_stuff[v4 + 1185] = tilemap_stuff[v3 + 1184];
tilemap_stuff[v4 + 1193] = tilemap_stuff[v3 + 1192];
}
if (sign16(E->dms_var_41 - 14)) {
int v5 = k >> 1;
int v6 = j >> 1;
tilemap_stuff[v6 + 1201] = tilemap_stuff[v5 + 1200];
tilemap_stuff[v6 + 1209] = tilemap_stuff[v5 + 1208];
}
if (sign16(E->dms_var_41 - 14)) {
int v7 = k >> 1;
int v8 = j >> 1;
tilemap_stuff[v8 + 1217] = tilemap_stuff[v7 + 1216];
tilemap_stuff[v8 + 1225] = tilemap_stuff[v7 + 1224];
}
}
void Zoomer_CorpseRottingMoveFunc_2(uint16 j, uint16 k) { // 0xA9E6F6
Enemy_DeadMonsters *E = Get_DeadMonsters(0);
if (sign16(E->dms_var_41 - 14)) {
int v3 = k >> 1;
int v4 = j >> 1;
tilemap_stuff[v4 + 1281] = tilemap_stuff[v3 + 1280];
tilemap_stuff[v4 + 1289] = tilemap_stuff[v3 + 1288];
}
int v5 = k >> 1;
tilemap_stuff[v5 + 1280] = 0;
tilemap_stuff[v5 + 1288] = 0;
if (sign16(E->dms_var_41 - 14)) {
int v6 = j >> 1;
tilemap_stuff[v6 + 1297] = tilemap_stuff[v5 + 1296];
tilemap_stuff[v6 + 1305] = tilemap_stuff[v5 + 1304];
}
tilemap_stuff[v5 + 1296] = 0;
tilemap_stuff[v5 + 1304] = 0;
if (sign16(E->dms_var_41 - 14)) {
int v7 = j >> 1;
tilemap_stuff[v7 + 1313] = tilemap_stuff[v5 + 1312];
tilemap_stuff[v7 + 1321] = tilemap_stuff[v5 + 1320];
}
tilemap_stuff[v5 + 1312] = 0;
tilemap_stuff[v5 + 1320] = 0;
}
void Zoomer_CorpseRottingCopyFunc_2(uint16 j, uint16 k) { // 0xA9E745
Enemy_DeadMonsters *E = Get_DeadMonsters(0);
if (sign16(E->dms_var_41 - 14)) {
int v3 = k >> 1;
int v4 = j >> 1;
tilemap_stuff[v4 + 1281] = tilemap_stuff[v3 + 1280];
tilemap_stuff[v4 + 1289] = tilemap_stuff[v3 + 1288];
}
if (sign16(E->dms_var_41 - 14)) {
int v5 = k >> 1;
int v6 = j >> 1;
tilemap_stuff[v6 + 1297] = tilemap_stuff[v5 + 1296];
tilemap_stuff[v6 + 1305] = tilemap_stuff[v5 + 1304];
}
if (sign16(E->dms_var_41 - 14)) {
int v7 = k >> 1;
int v8 = j >> 1;
tilemap_stuff[v8 + 1313] = tilemap_stuff[v7 + 1312];
tilemap_stuff[v8 + 1321] = tilemap_stuff[v7 + 1320];
}
}
void Zoomer_CorpseRottingMoveFunc_4(uint16 j, uint16 k) { // 0xA9E782
Enemy_DeadMonsters *E = Get_DeadMonsters(0);
if (sign16(E->dms_var_41 - 14)) {
int v3 = k >> 1;
int v4 = j >> 1;
tilemap_stuff[v4 + 1377] = tilemap_stuff[v3 + 1376];
tilemap_stuff[v4 + 1385] = tilemap_stuff[v3 + 1384];
}
int v5 = k >> 1;
tilemap_stuff[v5 + 1376] = 0;
tilemap_stuff[v5 + 1384] = 0;
if (sign16(E->dms_var_41 - 14)) {
int v6 = j >> 1;
tilemap_stuff[v6 + 1393] = tilemap_stuff[v5 + 1392];
tilemap_stuff[v6 + 1401] = tilemap_stuff[v5 + 1400];
}
tilemap_stuff[v5 + 1392] = 0;
tilemap_stuff[v5 + 1400] = 0;
if (sign16(E->dms_var_41 - 14)) {
int v7 = j >> 1;
tilemap_stuff[v7 + 1409] = tilemap_stuff[v5 + 1408];
tilemap_stuff[v7 + 1417] = tilemap_stuff[v5 + 1416];
}
tilemap_stuff[v5 + 1408] = 0;
tilemap_stuff[v5 + 1416] = 0;
}
void Zoomer_CorpseRottingCopyFunc_4(uint16 j, uint16 k) { // 0xA9E7D1
Enemy_DeadMonsters *E = Get_DeadMonsters(0);
if (sign16(E->dms_var_41 - 14)) {
int v3 = k >> 1;
int v4 = j >> 1;
tilemap_stuff[v4 + 1377] = tilemap_stuff[v3 + 1376];
tilemap_stuff[v4 + 1385] = tilemap_stuff[v3 + 1384];
}
if (sign16(E->dms_var_41 - 14)) {
int v5 = k >> 1;
int v6 = j >> 1;
tilemap_stuff[v6 + 1393] = tilemap_stuff[v5 + 1392];
tilemap_stuff[v6 + 1401] = tilemap_stuff[v5 + 1400];
}
if (sign16(E->dms_var_41 - 14)) {
int v7 = k >> 1;
int v8 = j >> 1;
tilemap_stuff[v8 + 1409] = tilemap_stuff[v7 + 1408];
tilemap_stuff[v8 + 1417] = tilemap_stuff[v7 + 1416];
}
}
void Ripper_CorpseRottingMoveFunc_0(uint16 j, uint16 k) { // 0xA9E80E
Enemy_DeadMonsters *E = Get_DeadMonsters(0);
if (sign16(E->dms_var_41 - 14)) {
int v3 = k >> 1;
int v4 = j >> 1;
tilemap_stuff[v4 + 1473] = tilemap_stuff[v3 + 1472];
tilemap_stuff[v4 + 1481] = tilemap_stuff[v3 + 1480];
}
int v5 = k >> 1;
tilemap_stuff[v5 + 1472] = 0;
tilemap_stuff[v5 + 1480] = 0;
if (sign16(E->dms_var_41 - 14)) {
int v6 = j >> 1;
tilemap_stuff[v6 + 1489] = tilemap_stuff[v5 + 1488];
tilemap_stuff[v6 + 1497] = tilemap_stuff[v5 + 1496];
}
tilemap_stuff[v5 + 1488] = 0;
tilemap_stuff[v5 + 1496] = 0;
if (sign16(E->dms_var_41 - 14)) {
int v7 = j >> 1;
tilemap_stuff[v7 + 1505] = tilemap_stuff[v5 + 1504];
tilemap_stuff[v7 + 1513] = tilemap_stuff[v5 + 1512];
}
tilemap_stuff[v5 + 1504] = 0;
tilemap_stuff[v5 + 1512] = 0;
}
void Ripper_CorpseRottingCopyFunc_0(uint16 j, uint16 k) { // 0xA9E85D
Enemy_DeadMonsters *E = Get_DeadMonsters(0);
if (sign16(E->dms_var_41 - 14)) {
int v3 = k >> 1;
int v4 = j >> 1;
tilemap_stuff[v4 + 1473] = tilemap_stuff[v3 + 1472];
tilemap_stuff[v4 + 1481] = tilemap_stuff[v3 + 1480];
}
if (sign16(E->dms_var_41 - 14)) {
int v5 = k >> 1;
int v6 = j >> 1;
tilemap_stuff[v6 + 1489] = tilemap_stuff[v5 + 1488];
tilemap_stuff[v6 + 1497] = tilemap_stuff[v5 + 1496];
}
if (sign16(E->dms_var_41 - 14)) {
int v7 = k >> 1;
int v8 = j >> 1;
tilemap_stuff[v8 + 1505] = tilemap_stuff[v7 + 1504];
tilemap_stuff[v8 + 1513] = tilemap_stuff[v7 + 1512];
}
}
void Ripper_CorpseRottingMoveFunc_2(uint16 j, uint16 k) { // 0xA9E89A
Enemy_DeadMonsters *E = Get_DeadMonsters(0);
if (sign16(E->dms_var_41 - 14)) {
int v3 = k >> 1;
int v4 = j >> 1;
tilemap_stuff[v4 + 1569] = tilemap_stuff[v3 + 1568];
tilemap_stuff[v4 + 1577] = tilemap_stuff[v3 + 1576];
}
int v5 = k >> 1;
tilemap_stuff[v5 + 1568] = 0;
tilemap_stuff[v5 + 1576] = 0;
if (sign16(E->dms_var_41 - 14)) {
int v6 = j >> 1;
tilemap_stuff[v6 + 1585] = tilemap_stuff[v5 + 1584];
tilemap_stuff[v6 + 1593] = tilemap_stuff[v5 + 1592];
}
tilemap_stuff[v5 + 1584] = 0;
tilemap_stuff[v5 + 1592] = 0;
if (sign16(E->dms_var_41 - 14)) {
int v7 = j >> 1;
tilemap_stuff[v7 + 1601] = tilemap_stuff[v5 + 1600];
tilemap_stuff[v7 + 1609] = tilemap_stuff[v5 + 1608];
}
tilemap_stuff[v5 + 1600] = 0;
tilemap_stuff[v5 + 1608] = 0;
}
void Ripper_CorpseRottingCopyFunc_2(uint16 j, uint16 k) { // 0xA9E8E9
Enemy_DeadMonsters *E = Get_DeadMonsters(0);
if (sign16(E->dms_var_41 - 14)) {
int v3 = k >> 1;
int v4 = j >> 1;
tilemap_stuff[v4 + 1569] = tilemap_stuff[v3 + 1568];
tilemap_stuff[v4 + 1577] = tilemap_stuff[v3 + 1576];
}
if (sign16(E->dms_var_41 - 14)) {
int v5 = k >> 1;
int v6 = j >> 1;
tilemap_stuff[v6 + 1585] = tilemap_stuff[v5 + 1584];
tilemap_stuff[v6 + 1593] = tilemap_stuff[v5 + 1592];
}
if (sign16(E->dms_var_41 - 14)) {
int v7 = k >> 1;
int v8 = j >> 1;
tilemap_stuff[v8 + 1601] = tilemap_stuff[v7 + 1600];
tilemap_stuff[v8 + 1609] = tilemap_stuff[v7 + 1608];
}
}
void Skree_CorpseRottingMoveFunc_0(uint16 j, uint16 k) { // 0xA9E926
Enemy_DeadMonsters *E = Get_DeadMonsters(0);
if (sign16(E->dms_var_41 - 30)) {
int v3 = k >> 1;
int v4 = j >> 1;
tilemap_stuff[v4 + 801] = tilemap_stuff[v3 + 800];
tilemap_stuff[v4 + 809] = tilemap_stuff[v3 + 808];
}
int v5 = k >> 1;
tilemap_stuff[v5 + 800] = 0;
tilemap_stuff[v5 + 808] = 0;
if (sign16(E->dms_var_41 - 30)) {
int v6 = j >> 1;
tilemap_stuff[v6 + 817] = tilemap_stuff[v5 + 816];
tilemap_stuff[v6 + 825] = tilemap_stuff[v5 + 824];
}
tilemap_stuff[v5 + 816] = 0;
tilemap_stuff[v5 + 824] = 0;
}
void Skree_CorpseRottingCopyFunc_0(uint16 j, uint16 k) { // 0xA9E95B
Enemy_DeadMonsters *E = Get_DeadMonsters(0);
if (sign16(E->dms_var_41 - 30)) {
int v3 = k >> 1;
int v4 = j >> 1;
tilemap_stuff[v4 + 801] = tilemap_stuff[v3 + 800];
tilemap_stuff[v4 + 809] = tilemap_stuff[v3 + 808];
}
if (sign16(E->dms_var_41 - 30)) {
int v5 = k >> 1;
int v6 = j >> 1;
tilemap_stuff[v6 + 817] = tilemap_stuff[v5 + 816];
tilemap_stuff[v6 + 825] = tilemap_stuff[v5 + 824];
}
}
void Skree_CorpseRottingMoveFunc_2(uint16 j, uint16 k) { // 0xA9E984
Enemy_DeadMonsters *E = Get_DeadMonsters(0);
if (sign16(E->dms_var_41 - 30)) {
int v3 = k >> 1;
int v4 = j >> 1;
tilemap_stuff[v4 + 929] = tilemap_stuff[v3 + 928];
tilemap_stuff[v4 + 937] = tilemap_stuff[v3 + 936];
}
int v5 = k >> 1;
tilemap_stuff[v5 + 928] = 0;
tilemap_stuff[v5 + 936] = 0;
if (sign16(E->dms_var_41 - 30)) {
int v6 = j >> 1;
tilemap_stuff[v6 + 945] = tilemap_stuff[v5 + 944];
tilemap_stuff[v6 + 953] = tilemap_stuff[v5 + 952];
}
tilemap_stuff[v5 + 944] = 0;
tilemap_stuff[v5 + 952] = 0;
}
void Skree_CorpseRottingCopyFunc_2(uint16 j, uint16 k) { // 0xA9E9B9
Enemy_DeadMonsters *E = Get_DeadMonsters(0);
if (sign16(E->dms_var_41 - 30)) {
int v3 = k >> 1;
int v4 = j >> 1;
tilemap_stuff[v4 + 929] = tilemap_stuff[v3 + 928];
tilemap_stuff[v4 + 937] = tilemap_stuff[v3 + 936];
}
if (sign16(E->dms_var_41 - 30)) {
int v5 = k >> 1;
int v6 = j >> 1;
tilemap_stuff[v6 + 945] = tilemap_stuff[v5 + 944];
tilemap_stuff[v6 + 953] = tilemap_stuff[v5 + 952];
}
}
void Skree_CorpseRottingMoveFunc_4(uint16 j, uint16 k) { // 0xA9E9E2
Enemy_DeadMonsters *E = Get_DeadMonsters(0);
if (sign16(E->dms_var_41 - 30)) {
int v3 = k >> 1;
int v4 = j >> 1;
tilemap_stuff[v4 + 1057] = tilemap_stuff[v3 + 1056];
tilemap_stuff[v4 + 1065] = tilemap_stuff[v3 + 1064];
}
int v5 = k >> 1;
tilemap_stuff[v5 + 1056] = 0;
tilemap_stuff[v5 + 1064] = 0;
if (sign16(E->dms_var_41 - 30)) {
int v6 = j >> 1;
tilemap_stuff[v6 + 1073] = tilemap_stuff[v5 + 1072];
tilemap_stuff[v6 + 1081] = tilemap_stuff[v5 + 1080];
}
tilemap_stuff[v5 + 1072] = 0;
tilemap_stuff[v5 + 1080] = 0;
}
void Skree_CorpseRottingCopyFunc_4(uint16 j, uint16 k) { // 0xA9EA17
Enemy_DeadMonsters *E = Get_DeadMonsters(0);
if (sign16(E->dms_var_41 - 30)) {
int v3 = k >> 1;
int v4 = j >> 1;
tilemap_stuff[v4 + 1057] = tilemap_stuff[v3 + 1056];
tilemap_stuff[v4 + 1065] = tilemap_stuff[v3 + 1064];
}
if (sign16(E->dms_var_41 - 30)) {
int v5 = k >> 1;
int v6 = j >> 1;
tilemap_stuff[v6 + 1073] = tilemap_stuff[v5 + 1072];
tilemap_stuff[v6 + 1081] = tilemap_stuff[v5 + 1080];
}
}
void MotherBrain_CorpseRottingMoveFunc(uint16 j, uint16 k) { // 0xA9EA40
Enemy_DeadMonsters *E = Get_DeadMonsters(0);
if (E->dms_var_41 >= 0x10u) {
if (sign16(E->dms_var_41 - 46)) {
*(uint16 *)((char *)&g_word_7E9002 + j) = *(uint16 *)((char *)&kraid_unk9000 + k);
*(uint16 *)((char *)&g_word_7E9012 + j) = *(uint16 *)((char *)&g_word_7E900F + k + 1);
}
*(uint16 *)((char *)&kraid_unk9000 + k) = 0;
*(uint16 *)((char *)&g_word_7E900F + k + 1) = 0;
}
if (E->dms_var_41 >= 8u) {
if (sign16(E->dms_var_41 - 46)) {
*(uint16 *)((char *)&g_word_7E9022 + j) = *(uint16 *)((char *)&g_word_7E9020 + k);
*(uint16 *)((char *)&g_word_7E9032 + j) = *(uint16 *)((char *)&g_word_7E9030 + k);
}
*(uint16 *)((char *)&g_word_7E9020 + k) = 0;
*(uint16 *)((char *)&g_word_7E9030 + k) = 0;
}
if (sign16(E->dms_var_41 - 46)) {
*(uint16 *)((char *)&g_word_7E9042 + j) = *(uint16 *)((char *)&g_word_7E9040 + k);
*(uint16 *)((char *)&g_word_7E9052 + j) = *(uint16 *)((char *)&g_word_7E9050 + k);
}
*(uint16 *)((char *)&g_word_7E9040 + k) = 0;
*(uint16 *)((char *)&g_word_7E9050 + k) = 0;
if (sign16(E->dms_var_41 - 46)) {
*(uint16 *)((char *)&g_word_7E9062 + j) = *(uint16 *)((char *)&g_word_7E9060 + k);
*(uint16 *)((char *)&g_word_7E9072 + j) = *(uint16 *)((char *)&g_word_7E9070 + k);
}
*(uint16 *)((char *)&g_word_7E9060 + k) = 0;
*(uint16 *)((char *)&g_word_7E9070 + k) = 0;
if (sign16(E->dms_var_41 - 46)) {
*(uint16 *)((char *)&g_word_7E9082 + j) = *(uint16 *)((char *)&g_word_7E9080 + k);
*(uint16 *)((char *)&g_word_7E9092 + j) = *(uint16 *)((char *)&g_word_7E9090 + k);
}
*(uint16 *)((char *)&g_word_7E9080 + k) = 0;
*(uint16 *)((char *)&g_word_7E9090 + k) = 0;
if (E->dms_var_41 >= 8u) {
if (sign16(E->dms_var_41 - 46)) {
*(uint16 *)((char *)&g_word_7E90A2 + j) = *(uint16 *)((char *)&g_word_7E90A0 + k);
*(uint16 *)((char *)&g_word_7E90B2 + j) = *(uint16 *)((char *)&g_word_7E90B0 + k);
}
*(uint16 *)((char *)&g_word_7E90A0 + k) = 0;
*(uint16 *)((char *)&g_word_7E90B0 + k) = 0;
}
if (E->dms_var_41 >= 0x20u) {
if (sign16(E->dms_var_41 - 46)) {
*(uint16 *)((char *)&g_word_7E90C2 + j) = *(uint16 *)((char *)&g_word_7E90C0 + k);
*(uint16 *)((char *)&g_word_7E90D2 + j) = *(uint16 *)((char *)&g_word_7E90D0 + k);
}
*(uint16 *)((char *)&g_word_7E90C0 + k) = 0;
*(uint16 *)((char *)&g_word_7E90D0 + k) = 0;
}
}
void MotherBrain_CorpseRottingCopyFunc(uint16 j, uint16 k) { // 0xA9EB0B
Enemy_DeadMonsters *E = Get_DeadMonsters(0);
if (E->dms_var_41 >= 0x10u && sign16(E->dms_var_41 - 46)) {
*(uint16 *)((char *)&g_word_7E9002 + j) = *(uint16 *)((char *)&kraid_unk9000 + k);
*(uint16 *)((char *)&g_word_7E9012 + j) = *(uint16 *)((char *)&g_word_7E900F + k + 1);
}
if (E->dms_var_41 >= 8u && sign16(E->dms_var_41 - 46)) {
*(uint16 *)((char *)&g_word_7E9022 + j) = *(uint16 *)((char *)&g_word_7E9020 + k);
*(uint16 *)((char *)&g_word_7E9032 + j) = *(uint16 *)((char *)&g_word_7E9030 + k);
}
if (sign16(E->dms_var_41 - 46)) {
*(uint16 *)((char *)&g_word_7E9042 + j) = *(uint16 *)((char *)&g_word_7E9040 + k);
*(uint16 *)((char *)&g_word_7E9052 + j) = *(uint16 *)((char *)&g_word_7E9050 + k);
}
if (sign16(E->dms_var_41 - 46)) {
*(uint16 *)((char *)&g_word_7E9062 + j) = *(uint16 *)((char *)&g_word_7E9060 + k);
*(uint16 *)((char *)&g_word_7E9072 + j) = *(uint16 *)((char *)&g_word_7E9070 + k);
}
if (sign16(E->dms_var_41 - 46)) {
*(uint16 *)((char *)&g_word_7E9082 + j) = *(uint16 *)((char *)&g_word_7E9080 + k);
*(uint16 *)((char *)&g_word_7E9092 + j) = *(uint16 *)((char *)&g_word_7E9090 + k);
}
if (E->dms_var_41 >= 8u && sign16(E->dms_var_41 - 46)) {
*(uint16 *)((char *)&g_word_7E90A2 + j) = *(uint16 *)((char *)&g_word_7E90A0 + k);
*(uint16 *)((char *)&g_word_7E90B2 + j) = *(uint16 *)((char *)&g_word_7E90B0 + k);
}
if (E->dms_var_41 >= 0x20u) {
if (sign16(E->dms_var_41 - 46)) {
*(uint16 *)((char *)&g_word_7E90C2 + j) = *(uint16 *)((char *)&g_word_7E90C0 + k);
*(uint16 *)((char *)&g_word_7E90D2 + j) = *(uint16 *)((char *)&g_word_7E90D0 + k);
}
}
}
uint16 sub_A9ECD0(uint16 k, uint16 j) { // 0xA9ECD0
uint16 v2 = FUNC16(DeadMonsters_Func_1);
Enemy_DeadMonsters *E = Get_DeadMonsters(k);
if (E->dms_var_08)
v2 = FUNC16(DeadMonsters_Func_5);
E->dms_var_A = v2;
return j;
}
uint8 Shitroid_Func_1(uint16 k, uint16 j) { // 0xA9EED1
Enemy_Shitroid *E = Get_Shitroid(j);
Enemy_Shitroid *G = Get_Shitroid(k);
R18_ = G->base.x_width + E->base.x_width + 1;
uint16 v4 = abs16(E->base.x_pos - G->base.x_pos);
bool v5 = v4 >= R18_;
if (v4 < R18_) {
R18_ = G->base.y_height + E->base.y_height + 1;
return abs16(E->base.y_pos - G->base.y_pos) >= R18_;
}
return v5;
}
uint8 Shitroid_Func_2(uint16 k) { // 0xA9EF06
Enemy_Shitroid *E = Get_Shitroid(k);
R26_ = E->base.x_width + R22_ + 1;
uint16 v2 = abs16(R18_ - E->base.x_pos);
bool v3 = v2 >= R26_;
if (v2 < R26_) {
R26_ = E->base.y_height + R24_ + 1;
return abs16(R20_ - E->base.y_pos) >= R26_;
}
return v3;
}
void Shitroid_Init(void) { // 0xA9EF37
for (int i = 4094; i >= 0; i -= 2)
tilemap_stuff[i >> 1] = 0;
Enemy_Shitroid *E = Get_Shitroid(cur_enemy_index);
E->base.properties |= kEnemyProps_DisableSamusColl | kEnemyProps_BlockPlasmaBeam;
E->base.palette_index = 1024;
E->base.current_instruction = addr_kShitroid_Ilist_F90E;
E->base.instruction_timer = 1;
E->base.timer = 0;
uint16 v2 = FUNC16(Shitroid_Func_4);
if ((layer1_x_pos & 0x8000u) != 0) {
E->base.properties |= kEnemyProps_Tangible | kEnemyProps_Invisible;
v2 = FUNC16(Shitroid_Func_3);
}
E->shitr_var_A = v2;
E->shitr_var_B = 0;
E->shitr_var_C = 0;
E->shitr_var_E = 10;
E->shitr_parameter_2 = 0;
WriteColorsToTargetPalette(0xa9, 0x120u, addr_word_A9F8C6, 0x10u);
WriteColorsToTargetPalette(0xa9, 0x140u, addr_kShitroidInCutscene_Palette, 0x10u);
WriteColorsToTargetPalette(0xa9, 0x1E0u, addr_kDeadSidehopper_Palette_0, 0x10u);
}
void Shitroid_Powerbomb(void) { // 0xA9EFBA
if (Get_Shitroid(cur_enemy_index)->shitr_parameter_2)
Shitroid_Func_26(cur_enemy_index);
Shitroid_Main();
}
void CallShitroidFunc(uint32 ea, uint16 k) {
switch (ea) {
case fnShitroid_Func_3: Shitroid_Func_3(k); return;
case fnShitroid_Func_4: Shitroid_Func_4(); return;
case fnShitroid_Func_5: Shitroid_Func_5(k); return;
case fnShitroid_Func_6: Shitroid_Func_6(k); return;
case fnShitroid_Func_7: Shitroid_Func_7(k); return;
case fnShitroid_Func_8: Shitroid_Func_8(k); return;
case fnShitroid_Func_9: Shitroid_Func_9(k); return;
case fnShitroid_Func_10: Shitroid_Func_10(k); return;
case fnShitroid_Func_11: Shitroid_Func_11(k); return;
case fnShitroid_Func_12: Shitroid_Func_12(k); return;
case fnShitroid_Func_13: Shitroid_Func_13(k); return;
case fnShitroid_Func_14: Shitroid_Func_14(k); return;
case fnShitroid_Func_15: Shitroid_Func_15(k); return;
case fnShitroid_Func_16: Shitroid_Func_16(k); return;
case fnShitroid_Func_17: Shitroid_Func_17(k); return;
case fnShitroid_Func_18: Shitroid_Func_18(k); return;
case fnShitroid_Func_19: Shitroid_Func_19(k); return;
case fnShitroid_Func_20: Shitroid_Func_20(); return;
case fnShitroid_Func_21: Shitroid_Func_21(); return;
case fnShitroid_Func_22: Shitroid_Func_22(k); return;
case fnShitroid_Func_23: Shitroid_Func_23(); return;
case fnShitroid_Func_24: Shitroid_Func_24(k); return;
case fnShitroid_Func_25: Shitroid_Func_25(k); return;
default: Unreachable();
}
}
void Shitroid_Main(void) { // 0xA9EFC5
Enemy_Shitroid *E = Get_Shitroid(cur_enemy_index);
E->base.health = 0x7FFF;
CallShitroidFunc(E->shitr_var_A | 0xA90000, cur_enemy_index);
MoveEnemyWithVelocity();
if (!palette_change_num)
Shitroid_HandleNormalPalette();
}
void Shitroid_Func_3(uint16 k) { // 0xA9EFDF
Enemy_Shitroid *E = Get_Shitroid(k);
E->shitr_var_B = 0;
E->shitr_var_C = 0;
}
static const SpawnHardcodedPlmArgs unk_A9F00E = { 0x30, 0x03, 0xb767 };
static const SpawnHardcodedPlmArgs unk_A9F016 = { 0x1f, 0x03, 0xb767 };
void Shitroid_Func_4(void) { // 0xA9EFE6
if (sign16(layer1_x_pos - 513)) {
layer1_x_pos = 512;
*(uint16 *)scrolls = scrolls[0];
*(uint16 *)&scrolls[2] = scrolls[2];
SpawnHardcodedPlm(&unk_A9F00E);
SpawnHardcodedPlm(&unk_A9F016);
Enemy_Shitroid *E = Get_Shitroid(cur_enemy_index);
E->shitr_var_A = FUNC16(Shitroid_Func_5);
E->shitr_var_04 = 1;
}
}
void Shitroid_Func_5(uint16 k) { // 0xA9F02B
Enemy_Shitroid *E = Get_Shitroid(k);
E->shitr_var_A = FUNC16(Shitroid_Func_6);
E->shitr_var_F = 464;
Shitroid_Func_6(k);
}
void Shitroid_Func_6(uint16 k) { // 0xA9F037
Enemy_Shitroid *E = Get_Shitroid(k);
if ((--E->shitr_var_F & 0x8000u) != 0) {
QueueMusic_Delayed8(5u);
E->shitr_var_A = FUNC16(Shitroid_Func_7);
Shitroid_Func_7(k);
}
}
void Shitroid_Func_7(uint16 k) { // 0xA9F049
R18_ = 584;
R20_ = 74;
Shitroid_Func_GraduallyAccelerateTowards0x400(k, 0xFu);
R22_ = 1;
R24_ = 1;
if (!(Shitroid_Func_2(k) & 1))
Get_Shitroid(k)->shitr_var_A = FUNC16(Shitroid_Func_8);
}
void Shitroid_Func_8(uint16 k) { // 0xA9F06D
Enemy_Shitroid *E = Get_Shitroid(k + 64);
R18_ = E->base.x_pos;
R20_ = E->base.y_pos - 32;
Shitroid_Func_GraduallyAccelerateTowards0x400(k, 0xFu);
if (!(Shitroid_Func_1(k, k + 64) & 1))
Get_Shitroid(k)->shitr_var_A = FUNC16(Shitroid_Func_9);
}
void Shitroid_Func_9(uint16 k) { // 0xA9F094
Enemy_Shitroid *E1 = Get_Shitroid(k + 64);
R18_ = E1->base.x_pos;
R20_ = E1->base.y_pos - 32;
if (Shitroid_AccelerateTowardsPoint(k, 0x200u) & 1) {
Enemy_Shitroid *E = Get_Shitroid(k);
E->shitr_var_B = 0;
E->shitr_var_C = 0;
E->base.x_pos = E1->base.x_pos;
E->base.y_pos = E1->base.y_pos - 32;
E->base.current_instruction = addr_kShitroid_Ilist_F924;
E->base.instruction_timer = 1;
E->base.timer = 0;
E->shitr_var_A = FUNC16(Shitroid_Func_10);
E->shitr_var_E = 1;
E->shitr_parameter_2 = 0;
E->shitr_var_F = 320;
}
}
void Shitroid_Func_10(uint16 k) { // 0xA9F0E6
Enemy_Shitroid *E = Get_Shitroid(k);
int v2 = (uint8)(E->base.frame_counter & 6) >> 1;
Enemy_Shitroid *E1 = Get_Shitroid(k + 64);
E->base.x_pos = E1->base.x_pos + g_word_A993BB[v2];
E->base.y_pos = E1->base.y_pos + g_word_A993C3[v2] - 32;
if (E->shitr_var_F-- == 1) {
E->shitr_var_A = FUNC16(Shitroid_Func_11);
E->base.current_instruction = addr_kShitroid_Ilist_F906;
E->base.instruction_timer = 1;
E->base.timer = 0;
E->shitr_var_E = 10;
}
}
void Shitroid_Func_11(uint16 k) { // 0xA9F125
Get_Shitroid(0x40u)->shitr_var_08 = 1;
Enemy_Shitroid *E = Get_Shitroid(k);
E->shitr_var_A = FUNC16(Shitroid_Func_12);
E->shitr_var_F = 192;
Shitroid_Func_12(k);
}
static const SpawnHardcodedPlmArgs unk_A9F173 = { 0x30, 0x03, 0xb763 };
static const SpawnHardcodedPlmArgs unk_A9F17B = { 0x1f, 0x03, 0xb763 };
void Shitroid_Func_12(uint16 k) { // 0xA9F138
Enemy_Shitroid *E = Get_Shitroid(k);
R18_ = E->base.x_pos;
R20_ = 104;
Shitroid_Func_GraduallyAccelerateTowards0x400(k, 0);
if ((--E->shitr_var_F & 0x8000u) != 0) {
E->shitr_var_A = FUNC16(Shitroid_Func_13);
E->shitr_parameter_2 = 1;
*(uint16 *)scrolls |= 0x100u;
*(uint16 *)&scrolls[2] |= 0x100u;
SpawnHardcodedPlm(&unk_A9F173);
SpawnHardcodedPlm(&unk_A9F17B);
}
}
void Shitroid_Func_13(uint16 k) { // 0xA9F180
Enemy_Shitroid *E = Get_Shitroid(k);
uint16 v2 = abs16(E->base.x_pos - samus_x_pos);
uint16 shitro_var_02;
if (v2 >= 8u) {
shitro_var_02 = E->shitr_var_02;
if (shitro_var_02) {
if ((--shitro_var_02 & 0x8000u) != 0)
shitro_var_02 = 0;
}
} else {
shitro_var_02 = (v2 >= 8u) + E->shitr_var_02 + 2;
}
E->shitr_var_02 = shitro_var_02;
if (shitro_var_02 >= 0x100u || sign16(samus_x_pos - 512)) {
Get_Shitroid(cur_enemy_index)->shitr_var_A = FUNC16(Shitroid_Func_14);
} else {
uint16 shitro_var_01 = E->shitr_var_01;
uint16 v5;
if (shitro_var_01) {
E->shitr_var_01 = shitro_var_01 - 1;
v5 = samus_y_pos;
} else {
v5 = 80;
if ((random_number & 0xFFFu) >= 0xFE0)
E->shitr_var_01 = 32;
}
R20_ = v5;
R18_ = samus_x_pos;
Shitroid_Func_GraduallyAccelerateTowards0x400(cur_enemy_index, 0xAu);
}
}
void Shitroid_Func_14(uint16 k) { // 0xA9F1FA
R18_ = samus_x_pos;
R20_ = samus_y_pos - 32;
Shitroid_Func_GraduallyAccelerateTowards0x400(k, 0xFu);
}
void Shitroid_Func_15(uint16 k) { // 0xA9F20E
CallSomeSamusCode(0x12u);
Get_Shitroid(0)->shitr_var_A = FUNC16(Shitroid_Func_16);
Shitroid_Func_16(k);
}
void Shitroid_Func_16(uint16 k) { // 0xA9F21B
Enemy_Shitroid *E = Get_Shitroid(k);
if (samus_health < 2u) {
samus_x_speed_divisor = 0;
bomb_counter = 0;
E->shitr_var_A = FUNC16(Shitroid_Func_17);
E->shitr_var_B = 0;
E->shitr_var_C = 0;
Enemy_SetInstrList(k, addr_kShitroid_Ilist_F906);
E->shitr_var_E = 10;
CallSomeSamusCode(0x13u);
SomeMotherBrainScripts(0);
E->shitr_var_04 = 0;
QueueMusic_Delayed8(7u);
} else {
cooldown_timer = 8;
bomb_counter = 5;
samus_x_speed_divisor = 2;
if (!sign16(samus_y_speed - 4))
samus_y_speed = 2;
int v2 = (uint8)(E->base.frame_counter & 6) >> 1;
E->base.x_pos = samus_x_pos + g_word_A993BB[v2];
E->base.y_pos = samus_y_pos + g_word_A993C3[v2] - 20;
Samus_DamageDueToShitroid();
}
}
void Shitroid_Func_17(uint16 k) { // 0xA9F2A2
Enemy_Shitroid *E = Get_Shitroid(k);
E->shitr_var_A = FUNC16(Shitroid_Func_18);
E->shitr_var_F = 120;
Shitroid_Func_18(k);
}
void Shitroid_Func_18(uint16 k) { // 0xA9F2AE
Enemy_Shitroid *E = Get_Shitroid(k);
if ((--E->shitr_var_F & 0x8000u) != 0) {
E->shitr_var_A = FUNC16(Shitroid_Func_19);
E->shitr_var_F = 192;
Shitroid_Func_19(k);
}
}
void Shitroid_Func_19(uint16 k) { // 0xA9F2C0
R18_ = samus_x_pos;
R20_ = 104;
Shitroid_Func_GraduallyAccelerateTowards0x400(cur_enemy_index, 0);
Enemy_Shitroid *E = Get_Shitroid(cur_enemy_index);
if ((--E->shitr_var_F & 0x8000u) != 0) {
QueueSfx2_Max6(0x7Du);
E->shitr_var_A = FUNC16(Shitroid_Func_20);
E->shitr_var_F = 88;
E->base.current_instruction = addr_kShitroid_Ilist_F924;
E->base.instruction_timer = 1;
E->base.timer = 0;
Shitroid_Func_20();
}
}
void Shitroid_Func_20(void) { // 0xA9F2FB
R18_ = samus_x_pos - 64;
R20_ = 100;
Shitroid_Func_GraduallyAccelerateTowards0x400(cur_enemy_index, 0);
Enemy_Shitroid *E = Get_Shitroid(cur_enemy_index);
if ((--E->shitr_var_F & 0x8000u) != 0) {
E->shitr_var_A = FUNC16(Shitroid_Func_21);
E->shitr_var_F = 88;
Shitroid_Func_21();
}
}
void Shitroid_Func_21(void) { // 0xA9F324
R18_ = samus_x_pos + 96;
R20_ = 104;
Shitroid_Func_GraduallyAccelerateTowards0x400(cur_enemy_index, 0);
Enemy_Shitroid *E = Get_Shitroid(cur_enemy_index);
if ((--E->shitr_var_F & 0x8000u) != 0) {
E->shitr_var_A = FUNC16(Shitroid_Func_24);
E->shitr_var_F = 256;
E->base.current_instruction = addr_kShitroid_Ilist_F93A;
E->base.instruction_timer = 1;
E->base.timer = 0;
}
}
void Shitroid_Func_22(uint16 k) { // 0xA9F360
QueueSfx2_Max6(0x52u);
Get_Shitroid(k)->shitr_var_A = FUNC16(Shitroid_Func_23);
Shitroid_Func_23();
}
void Shitroid_Func_23(void) { // 0xA9F36D
R18_ = -128;
R20_ = 64;
Shitroid_Func_GraduallyAccelerateTowards0x400(cur_enemy_index, 0);
R22_ = 8;
R24_ = 8;
if (!(Shitroid_Func_2(cur_enemy_index) & 1)) {
Enemy_Shitroid *E = Get_Shitroid(cur_enemy_index);
E->shitr_var_B = 0;
E->shitr_var_C = 0;
E->base.properties &= ~(kEnemyProps_DisableSamusColl | kEnemyProps_Invisible);
E->shitr_var_A = FUNC16(Shitroid_Func_3);
}
}
void Shitroid_Func_24(uint16 k) { // 0xA9F3A3
Enemy_Shitroid *E = Get_Shitroid(k);
if ((--E->shitr_var_F & 0x8000u) != 0) {
SomeMotherBrainScripts(2u);
E->shitr_parameter_2 = 1;
E->shitr_var_A = FUNC16(Shitroid_Func_25);
Shitroid_Func_25(k);
} else {
Shitroid_Func_27(k);
}
}
void Shitroid_Func_25(uint16 k) { // 0xA9F3BE
if (Shitroid_Func_27(k) & 1)
Shitroid_F3C4(k);
}
void Shitroid_F3C4(uint16 k) { // 0xA9F3C4
Get_Shitroid(k)->shitr_var_A = FUNC16(Shitroid_Func_22);
}
void Shitroid_Func_26(uint16 k) { // 0xA9F3CB
if (Get_Shitroid(k)->shitr_var_A == (uint16)FUNC16(Shitroid_Func_25))
Shitroid_F3C4(k);
}
uint8 Shitroid_Func_27(uint16 k) { // 0xA9F3D4
Enemy_Shitroid *E = Get_Shitroid(k);
uint16 v2 = abs16(E->base.x_pos - samus_x_pos);
uint16 shitro_var_02;
if (v2 >= 2u) {
shitro_var_02 = E->shitr_var_02;
if (shitro_var_02) {
if ((--shitro_var_02 & 0x8000u) != 0)
shitro_var_02 = 0;
}
} else {
shitro_var_02 = (v2 >= 2u) + E->shitr_var_02 + 2;
}
E->shitr_var_02 = shitro_var_02;
uint16 shitro_var_01 = E->shitr_var_01;
uint16 v5;
if (shitro_var_01) {
E->shitr_var_01 = shitro_var_01 - 1;
v5 = samus_y_pos - 18;
} else {
v5 = 80;
if ((random_number & 0xFFFu) >= 0xFE0)
E->shitr_var_01 = 32;
}
R20_ = v5;
R18_ = samus_x_pos;
Shitroid_Func_GraduallyAccelerateTowards0x400(cur_enemy_index, 8u);
return Get_Shitroid(cur_enemy_index)->shitr_var_02 >= 0x400u || sign16(samus_x_pos - 128);
}
void Shitroid_Func_GraduallyAccelerateTowards0x400(uint16 k, uint16 j) { // 0xA9F451
R26_ = 1024;
Shitroid_GraduallyAccelerateTowardsPt(k, j);
}
void Shitroid_GraduallyAccelerateTowards0x4(uint16 k, uint16 j) { // 0xA9F458
R26_ = 4;
Shitroid_GraduallyAccelerateTowardsPt(k, j);
}
void Shitroid_GraduallyAccelerateTowards0x8(uint16 k, uint16 j) { // 0xA9F45F
R26_ = 8;
Shitroid_GraduallyAccelerateTowardsPt(k, j);
}
void Shitroid_GraduallyAccelerateTowards0x10(uint16 k, uint16 j) { // 0xA9F466
R26_ = 16;
Shitroid_GraduallyAccelerateTowardsPt(k, j);
}
void Shitroid_GraduallyAccelerateTowardsPt(uint16 k, uint16 j) { // 0xA9F46B
int16 v3;
int16 v5;
int16 v6;
int16 shitr_var_C;
int16 v9;
R24_ = g_byte_A9F56A[j];
Shitroid_GraduallyAccelerateHoriz(k);
Enemy_Shitroid *E = Get_Shitroid(k);
v3 = E->base.y_pos - R20_;
if (v3) {
if (v3 >= 0) {
uint16 RegWord = SnesDivide(v3, R24_);
if (!RegWord)
RegWord = 1;
R22_ = RegWord;
shitr_var_C = E->shitr_var_C;
if (shitr_var_C >= 0)
shitr_var_C = shitr_var_C - 8 - R22_;
v9 = shitr_var_C - R22_;
if (sign16(v9 + 1280))
v9 = -1280;
E->shitr_var_C = v9;
} else {
uint16 v4 = SnesDivide(R20_ - E->base.y_pos, R24_);
if (!v4)
v4 = 1;
R22_ = v4;
v5 = E->shitr_var_C;
if (v5 < 0)
v5 += R22_ + 8;
v6 = R22_ + v5;
if (!sign16(v6 - 1280))
v6 = 1280;
E->shitr_var_C = v6;
}
}
}
void Shitroid_GraduallyAccelerateHoriz(uint16 k) { // 0xA9F4E6
int16 v2;
int16 v4;
char v5; // cf
int16 v7;
int16 shitr_var_B;
int16 v11;
Enemy_Shitroid *E = Get_Shitroid(k);
v2 = E->base.x_pos - R18_;
if (v2) {
if (v2 >= 0) {
uint16 RegWord = SnesDivide(v2, R24_);
if (!RegWord)
RegWord = 1;
R22_ = RegWord;
shitr_var_B = E->shitr_var_B;
if (shitr_var_B >= 0) {
uint16 v13 = E->shitr_var_B;
v5 = Shitroid_CheckIfOnScreen(k) & 1;
uint16 v10 = v13;
if (v5)
v10 = v13 - R26_;
shitr_var_B = v10 - 8 - R22_;
}
v11 = shitr_var_B - R22_;
if (sign16(v11 + 2048))
v11 = -2048;
E->shitr_var_B = v11;
} else {
uint16 v3 = SnesDivide(R18_ - E->base.x_pos, R24_);
if (!v3)
v3 = 1;
R22_ = v3;
v4 = E->shitr_var_B;
if (v4 < 0) {
uint16 v12 = E->shitr_var_B;
v5 = Shitroid_CheckIfOnScreen(k) & 1;
uint16 v6 = v12;
if (v5)
v6 = R26_ + v12;
v4 = R22_ + v6 + 8;
}
v7 = R22_ + v4;
if (!sign16(v7 - 2048))
v7 = 2048;
E->shitr_var_B = v7;
}
}
}
uint8 Shitroid_CheckIfOnScreen(uint16 k) { // 0xA9F57A
int16 y_pos;
int16 v3;
int16 x_pos;
int16 v5;
Enemy_Shitroid *E = Get_Shitroid(k);
y_pos = E->base.y_pos;
uint8 result = 1;
if (y_pos >= 0) {
v3 = y_pos + 96 - layer1_y_pos;
if (v3 >= 0) {
if (sign16(v3 - 416)) {
x_pos = E->base.x_pos;
if (x_pos >= 0) {
v5 = x_pos + 16 - layer1_x_pos;
if (v5 >= 0) {
if (sign16(v5 - 288))
return 0;
}
}
}
}
}
return result;
}
uint8 Shitroid_AccelerateTowardsPoint(uint16 k, uint16 a) { // 0xA9F5A6
R22_ = a;
R28_ = 0;
Shitroid_AccelerateTowardsX(k);
Shitroid_AccelerateTowardsY(k);
R28_ >>= 1;
uint8 v2 = R28_ & 1;
R28_ >>= 1;
return v2;
}
void Shitroid_AccelerateTowardsY(uint16 k) { // 0xA9F5B5
Enemy_Shitroid *E = Get_Shitroid(k);
int16 v2 = E->base.y_pos - R20_;
if (!v2) {
++R28_;
return;
}
if (v2 >= 0) {
uint16 v7 = E->shitr_var_C - R22_;
if (sign16(v7 + 1280))
v7 = -1280;
E->shitr_var_C = v7;
if ((int16)(E->base.y_pos + (int8)(v7 >> 8) - R20_) <= 0) {
E->shitr_var_C = 0;
++R28_;
}
} else {
uint16 v3 = R22_ + E->shitr_var_C;
if (!sign16(v3 - 1280))
v3 = 1280;
E->shitr_var_C = v3;
if ((int16)(E->base.y_pos + (int8)(v3 >> 8) - R20_) >= 0) {
E->shitr_var_C = 0;
++R28_;
}
}
}
void Shitroid_AccelerateTowardsX(uint16 k) { // 0xA9F615
Enemy_Shitroid *E = Get_Shitroid(k);
if ((int16)(E->base.x_pos - R18_) >= 0) {
uint16 v6 = E->shitr_var_B - R22_;
if (sign16(v6 + 1280))
v6 = -1280;
E->shitr_var_B = v6;
if ((int16)(E->base.x_pos + (int8)(v6 >> 8) - R18_) <= 0) {
E->shitr_var_B = 0;
++R28_;
}
} else {
uint16 v2 = R22_ + E->shitr_var_B;
if (!sign16(v2 - 1280))
v2 = 1280;
E->shitr_var_B = v2;
if ((int16)(E->base.x_pos + (int8)(v2 >> 8) - R18_) >= 0) {
E->shitr_var_B = 0;
++R28_;
}
}
}
void Shitroid_HandleNormalPalette(void) { // 0xA9F677
R18_ = 330;
R22_ = addr_word_A9F6D1;
Shitroid_HandleCutscenePalette_Common();
}
void Shitroid_HandleCutscenePalette(void) { // 0xA9F683
R18_ = 490;
R22_ = addr_word_A9F6D1;
Shitroid_HandleCutscenePalette_Common();
}
void Shitroid_HandleCutscenePalette_LowHealth(void) { // 0xA9F68F
R18_ = 490;
R22_ = addr_word_A9F711;
Shitroid_HandleCutscenePalette_Common();
}
void Shitroid_HandleCutscenePalette_Common(void) { // 0xA9F699
char shitro_var_D_high;
Enemy_Shitroid *E = Get_Shitroid(cur_enemy_index);
shitro_var_D_high = HIBYTE(E->shitr_var_D);
if (shitro_var_D_high) {
HIBYTE(E->shitr_var_D) = shitro_var_D_high - 1;
} else {
HIBYTE(E->shitr_var_D) = E->shitr_var_E;
uint8 v3 = (LOBYTE(E->shitr_var_D) + 1) & 7;
LOBYTE(E->shitr_var_D) = v3;
uint16 v4 = Shitroid_HandleCrySoundEffect(cur_enemy_index, v3);
WriteColorsToPalette(R18_, 0xa9, R22_ + 8 * v4, 4u);
}
}
uint16 Shitroid_HandleCrySoundEffect(uint16 k, uint16 a) { // 0xA9F751
if (a == 5) {
Enemy_Shitroid *E = Get_Shitroid(k);
if (E->shitr_var_04) {
uint16 v3 = E->shitr_var_05 + 1;
E->shitr_var_05 = v3;
if (v3 >= 4u) {
E->shitr_var_05 = 0;
uint16 v4 = 114;
if (E->shitr_var_E < 0xAu)
v4 = 120;
QueueSfx2_Max6(v4);
}
}
return 5;
}
return a;
}
void Shitroid_Touch(void) { // 0xA9F789
Enemy_Shitroid *E = Get_Shitroid(cur_enemy_index);
if (E->shitr_parameter_2) {
Shitroid_Func_26(cur_enemy_index);
if (samus_movement_type == 3 && !sign16(samus_x_pos - 512)) {
R18_ = samus_x_pos - E->base.x_pos;
R20_ = samus_y_pos - E->base.y_pos;
R18_ = (uint8)(0x80 - CalculateAngleFromXY() + 0x80);
uint16 v4 = Math_MultBySin(0x40u);
E->shitr_var_B += v4;
uint16 v6 = Math_MultByCos(0x40u);
E->shitr_var_C += v6;
} else if (E->shitr_var_A == (uint16)FUNC16(Shitroid_Func_14)) {
R18_ = samus_x_pos;
R20_ = samus_y_pos - 32;
if (Shitroid_AccelerateTowardsPoint(cur_enemy_index, 0x200u) & 1) {
E->base.current_instruction = addr_kShitroid_Ilist_F924;
E->base.instruction_timer = 1;
E->base.timer = 0;
E->shitr_var_E = 1;
E->shitr_parameter_2 = 0;
E->shitr_var_B = 0;
E->shitr_var_C = 0;
E->shitr_var_A = FUNC16(Shitroid_Func_15);
}
} else if (E->shitr_var_A == (uint16)FUNC16(Shitroid_Func_13)) {
E->shitr_var_A = FUNC16(Shitroid_Func_14);
}
}
}
void Shitroid_Shot(void) { // 0xA9F842
Enemy_Shitroid *E = Get_Shitroid(cur_enemy_index);
if (E->shitr_parameter_2) {
Shitroid_Func_26(cur_enemy_index);
R18_ = projectile_x_pos[0] - E->base.x_pos;
R20_ = projectile_y_pos[0] - E->base.y_pos;
R18_ = (uint8)-CalculateAngleFromXY();
uint16 v1 = 8 * projectile_damage[collision_detection_index];
if (v1 >= 0xF0u)
v1 = 240;
uint16 a = v1;
uint16 v2 = Math_MultBySin(v1);
E->shitr_var_B += v2;
uint16 v4 = Math_MultByCos(a);
E->shitr_var_C += v4;
}
}
uint16 Shitroid_Instr_3(uint16 k, uint16 j) { // 0xA9F920
return addr_kShitroid_Ilist_F90E;
}
uint16 Shitroid_Instr_4(uint16 k, uint16 j) { // 0xA9F936
return addr_kShitroid_Ilist_F924;
}
uint16 Shitroid_Instr_6(uint16 k, uint16 j) { // 0xA9F990
return addr_kShitroid_Ilist_F93A;
}
uint16 Shitroid_Instr_5(uint16 k, uint16 j) { // 0xA9F994
if ((random_number & 0x8000u) == 0)
return *(uint16 *)RomPtr_A9(j);
QueueSfx2_Max6(0x52u);
return j + 2;
}