Files
sm-vita/src/sm_91.c
2023-03-06 18:55:12 +01:00

5303 lines
142 KiB
C

// Aran
#include "ida_types.h"
#include "variables.h"
#include "funcs.h"
#include "sm_rtl.h"
static Func_V *const kSamusInputHandlers[28] = {
Samus_Input_00_Standing,
Samus_Input_01_Running,
Samus_Input_02_NormalJumping,
Samus_Input_03_SpinJumping,
Samus_Input_04_MorphBallOnGround,
Samus_Input_05_Crouching,
Samus_Input_06_Falling,
Samus_Input_07_Unused,
Samus_Input_08_MorphBallFalling,
Samus_Input_09_Unused,
Samus_Input_0A_KnockbackOrCrystalFlashEnding,
Samus_Input_0B_Unused,
Samus_Input_0C_Unused,
Samus_Input_0D_Unused,
Samus_Input_0E_TurningAroundOnGround,
Samus_Input_0F_CrouchingEtcTransition,
Samus_Input_10_Moonwalking,
Samus_Input_11_SpringBallOnGround,
Samus_Input_12_SpringBallInAir,
Samus_Input_13_SpringBallFalling,
Samus_Input_14_WallJumping,
Samus_Input_15_RanIntoWall,
Samus_Input_16_Grappling,
Samus_Input_17_TurningAroundJumping,
Samus_Input_18_TurningAroundFalling,
Samus_Input_19_DamageBoost,
Samus_Input_1A_GrabbedByDraygon,
Samus_Input_1B_ShinesparkEtc,
};
void Samus_InputHandler(void) { // 0x918000
kSamusInputHandlers[samus_movement_type]();
}
void Samus_Input_00_Standing(void) { // 0x91804D
if (samus_pose && samus_pose != kPose_9B_FaceF_VariaGravitySuit || !elevator_status)
Samus_LookupTransitionTable();
}
void Samus_Input_01_Running(void) { // 0x918066
Samus_LookupTransitionTable();
}
void Samus_Input_02_NormalJumping(void) { // 0x91806E
Samus_LookupTransitionTable();
}
void Samus_Input_03_SpinJumping(void) { // 0x918076
Samus_LookupTransitionTable();
}
void Samus_Input_04_MorphBallOnGround(void) { // 0x91807E
Samus_LookupTransitionTable();
}
void Samus_Input_07_Unused(void) { // 0x918086
;
}
void Samus_Input_05_Crouching(void) { // 0x918087
if (time_is_frozen_flag) {
Samus_Func20();
} else {
Samus_LookupTransitionTable();
if (!samus_movement_type) {
samus_y_pos -= 5;
samus_prev_y_pos -= 5;
}
}
}
void Samus_Input_06_Falling(void) { // 0x9180B6
Samus_LookupTransitionTable();
}
void Samus_Input_08_MorphBallFalling(void) { // 0x91810A
Samus_LookupTransitionTable();
}
void Samus_Input_09_Unused(void) { // 0x918112
;
}
void Samus_Input_0A_KnockbackOrCrystalFlashEnding(void) { // 0x918113
Samus_LookupTransitionTable();
if (samus_movement_type != kMovementType_0A_KnockbackOrCrystalFlashEnding) {
Samus_InitJump();
samus_knockback_timer = 0;
}
}
void Samus_Input_0B_Unused(void) { // 0x91812D
;
}
void Samus_Input_0C_Unused(void) { // 0x918132
Samus_LookupTransitionTable();
}
void Samus_Input_0D_Unused(void) { // 0x91813A
Samus_LookupTransitionTable();
}
void Samus_Input_0E_TurningAroundOnGround(void) { // 0x918142
Samus_LookupTransitionTable();
}
void Samus_Input_0F_CrouchingEtcTransition(void) { // 0x918146
;
}
void Samus_Input_10_Moonwalking(void) { // 0x918147
Samus_LookupTransitionTable();
}
void Samus_Input_11_SpringBallOnGround(void) { // 0x91814F
Samus_LookupTransitionTable();
}
void Samus_Input_12_SpringBallInAir(void) { // 0x918157
Samus_LookupTransitionTable();
}
void Samus_Input_13_SpringBallFalling(void) { // 0x91815F
Samus_LookupTransitionTable();
}
void Samus_Input_14_WallJumping(void) { // 0x918167
Samus_LookupTransitionTable();
}
void Samus_Input_15_RanIntoWall(void) { // 0x91816F
if (time_is_frozen_flag)
Samus_Func20();
else
Samus_LookupTransitionTable();
}
void Samus_Input_16_Grappling(void) { // 0x918181
Samus_LookupTransitionTable();
}
void Samus_Input_17_TurningAroundJumping(void) { // 0x918189
Samus_LookupTransitionTable();
}
void Samus_Input_18_TurningAroundFalling(void) { // 0x91818D
Samus_LookupTransitionTable();
}
void Samus_Input_19_DamageBoost(void) { // 0x918191
Samus_LookupTransitionTable();
}
void Samus_Input_1A_GrabbedByDraygon(void) { // 0x918199
Samus_LookupTransitionTable();
}
void Samus_Input_1B_ShinesparkEtc(void) { // 0x9181A1
Samus_LookupTransitionTable();
}
void Samus_LookupTransitionTable(void) { // 0x9181A9
PoseEntry *pe;
int16 v2;
PoseEntry *v5;
PoseEntry *v6;
if (joypad1_lastkeys) {
TranslateCustomControllerBindingsToDefault();
uint16 v0 = kPoseTransitionTable[samus_pose];
pe = get_PoseEntry(v0);
v2 = pe->new_input + 1;
if (pe->new_input != 0xFFFF) {
while (1) {
uint16 v3 = v2 - 1;
if (!v3 || (R18_ & v3) == 0) {
uint16 cur_input = get_PoseEntry(v0)->cur_input;
if (!cur_input || (R20_ & cur_input) == 0)
break;
}
v0 += 6;
v5 = get_PoseEntry(v0);
v2 = v5->new_input + 1;
if (v5->new_input == 0xFFFF)
goto LABEL_8;
}
v6 = get_PoseEntry(v0);
if (v6->new_pose != samus_pose) {
samus_new_pose = v6->new_pose;
bomb_jump_dir = 0;
}
}
} else {
LABEL_8:
UNUSED_word_7E0A18 = 0;
Samus_Pose_CancelGrapple();
}
}
void TranslateCustomControllerBindingsToDefault(void) { // 0x9181F4
R18_ = joypad1_newkeys & (kButton_Up | kButton_Down | kButton_Left | kButton_Right);
R20_ = joypad1_lastkeys & (kButton_Up | kButton_Down | kButton_Left | kButton_Right);
uint16 v0 = joypad1_newkeys;
if ((button_config_shoot_x & joypad1_newkeys) != 0) {
R18_ |= kButton_X;
v0 = joypad1_newkeys;
}
if ((button_config_jump_a & v0) != 0) {
R18_ |= kButton_A;
v0 = joypad1_newkeys;
}
if ((button_config_run_b & v0) != 0) {
R18_ |= kButton_B;
v0 = joypad1_newkeys;
}
if ((button_config_itemcancel_y & v0) != 0) {
R18_ |= kButton_Y;
v0 = joypad1_newkeys;
}
if ((button_config_aim_up_R & v0) != 0) {
if ((button_config_aim_up_R & (kButton_L | kButton_R)) != 0)
R18_ |= kButton_R;
v0 = joypad1_newkeys;
}
if ((button_config_aim_down_L & v0) != 0 && (button_config_aim_down_L & (kButton_L | kButton_R)) != 0)
R18_ |= kButton_L;
R18_ = ~R18_;
uint16 v1 = joypad1_lastkeys;
if ((button_config_shoot_x & joypad1_lastkeys) != 0) {
R20_ |= kButton_X;
v1 = joypad1_lastkeys;
}
if ((button_config_jump_a & v1) != 0) {
R20_ |= kButton_A;
v1 = joypad1_lastkeys;
}
if ((button_config_run_b & v1) != 0) {
R20_ |= kButton_B;
v1 = joypad1_lastkeys;
}
if ((button_config_itemcancel_y & v1) != 0) {
R20_ |= kButton_Y;
v1 = joypad1_lastkeys;
}
if ((button_config_aim_up_R & v1) != 0) {
if ((button_config_aim_up_R & (kButton_L | kButton_R)) != 0)
R20_ |= kButton_R;
v1 = joypad1_lastkeys;
}
if ((button_config_aim_down_L & v1) != 0 && (button_config_aim_down_L & (kButton_L | kButton_R)) != 0)
R20_ |= kButton_L;
R20_ = ~R20_;
}
void Samus_Pose_CancelGrapple(void) { // 0x9182D9
if (Samus_Pose_Func2() & 1 || *(&kPoseParams[0].new_pose_unless_buttons + (uint16)(8 * samus_pose)) == 255)
samus_new_pose = samus_pose;
else
samus_new_pose = *(&kPoseParams[0].new_pose_unless_buttons + (uint16)(8 * samus_pose));
}
static const uint8 kSamus_Pose_Func2_Tab[28] = { // 0x918304
2, 1, 1, 0, 6, 2, 8, 2, 1, 6, 2, 2, 2, 6, 2, 2,
2, 6, 6, 6, 6, 2, 6, 2, 2, 2, 2, 2,
};
uint8 Samus_Pose_Func2(void) {
uint16 v0 = kSamus_Pose_Func2_Tab[samus_movement_type];
if (v0 != 1)
goto LABEL_2;
if (!samus_x_base_speed && !samus_x_base_subspeed) {
v0 = 2;
LABEL_2:
samus_momentum_routine_index = v0;
return 0;
}
samus_momentum_routine_index = 1;
return 1;
}
void EnableDemoInput(void) { // 0x91834E
samus_input_handler = FUNC16(Samus_InputHandler_E91D);
demo_enable |= 0x8000u;
}
void DisableDemoInput(void) { // 0x91835F
samus_input_handler = FUNC16(Samus_InputHandler_E913);
demo_enable &= ~0x8000u;
}
void ResetDemoData(void) { // 0x918370
demo_input_pre_instr = 0;
demo_input_instr_timer = 0;
demo_input_instr_ptr = 0;
demo_timer_counter = 0;
xray_angle = 0;
demo_input = 0;
demo_input_new = 0;
demo_input_prev = 0;
demo_input_prev_new = 0;
demo_enable = 0;
}
void LoadDemoInputObject(uint16 a, uint16 j) { // 0x918395
DemoInputObject *dio;
xray_angle = a;
dio = get_DemoInputObject(j);
demo_input_pre_instr = dio->pre_instr;
demo_input_instr_ptr = dio->instr_ptr;
demo_input_instr_timer = 1;
demo_timer_counter = 0;
// Call(dio->ptr | 0x910000);
}
void DemoObjectInputHandler(void) { // 0x9183C0
if ((demo_enable & 0x8000u) != 0) {
if (demo_input_instr_ptr) {
ProcessDemoInputObject();
joypad1_input_samusfilter = demo_input_prev;
joypad1_newinput_samusfilter = demo_input_prev_new;
joypad1_lastkeys = demo_input;
demo_input_prev = demo_input;
joypad1_newkeys = demo_input_new;
demo_input_prev_new = demo_input_new;
}
}
}
void CallDemoPreInstr(uint32 ea) {
switch (ea) {
case fnDemoPreInstr_nullsub_162: return;
case fnDemoPreInstr_864F: DemoPreInstr_864F(); return;
case fnDemoPreInstr_866A: DemoPreInstr_866A(); return;
case fnDemoPreInstr_CheckLeaveDemo: DemoPreInstr_CheckLeaveDemo(); return;
case fnDemoPreInstr_8AB0: DemoPreInstr_8AB0(); return;
default: Unreachable();
}
}
uint16 CallDemoInstr(uint32 ea, uint16 k, uint16 j) {
switch (ea) {
case fnDemoInstr_Finish: return DemoInstr_Finish(k, j);
case fnDemoInstr_SetPreInstr: return DemoInstr_SetPreInstr(k, j);
case fnDemoInstr_ClearPreInstr: return DemoInstr_ClearPreInstr(k, j);
case fnDemoInstr_Goto: return DemoInstr_Goto(k, j);
case fnDemoInstr_DecTimerAndGoto: return DemoInstr_DecTimerAndGoto(k, j);
case fnDemoInstr_SetTimer: return DemoInstr_SetTimer(k, j);
case fnDemoInstr_Func2: return DemoInstr_Func2(k, j);
case fnDemoInstr_Disable: return DemoInstr_Disable(k, j);
case fnDemoInstr_Func3: return DemoInstr_Func3(k, j);
default: return Unreachable();
}
}
void ProcessDemoInputObject(void) { // 0x9183F2
CallDemoPreInstr(demo_input_pre_instr | 0x910000);
if (!--demo_input_instr_timer) {
uint16 v0 = demo_input_instr_ptr;
uint16 *v1;
while (1) {
v1 = (uint16 *)RomPtr_91(v0);
uint16 v2 = *v1;
if ((*v1 & 0x8000u) == 0)
break;
R18_ = *v1;
v0 = CallDemoInstr(v2 | 0x910000, 0, v0 + 2);
if (!v0)
return;
}
demo_input_instr_timer = *v1;
uint8 *v3 = RomPtr_91(v0);
demo_input = *((uint16 *)v3 + 1);
demo_input_new = *((uint16 *)v3 + 2);
demo_input_instr_ptr = v0 + 6;
}
}
uint16 DemoInstr_Finish(uint16 k, uint16 j) { // 0x918427
demo_input_instr_ptr = 0;
demo_input = 0;
demo_input_new = 0;
return 0;
}
uint16 DemoInstr_SetPreInstr(uint16 k, uint16 j) { // 0x918434
demo_input_pre_instr = *(uint16 *)RomPtr_91(j);
return j + 2;
}
uint16 DemoInstr_ClearPreInstr(uint16 k, uint16 j) { // 0x91843F
demo_input_pre_instr = 0x8447;
return j;
}
uint16 DemoInstr_Goto(uint16 k, uint16 j) { // 0x918448
return *(uint16 *)RomPtr_91(j);
}
uint16 DemoInstr_DecTimerAndGoto(uint16 k, uint16 j) { // 0x91844F
if (--demo_timer_counter)
return DemoInstr_Goto(k, j);
else
return j + 2;
}
uint16 DemoInstr_SetTimer(uint16 k, uint16 j) { // 0x918459
demo_timer_counter = *(uint16 *)RomPtr_91(j);
return j + 2;
}
uint16 DemoInstr_Func2(uint16 k, uint16 j) { // 0x9185FC
frame_handler_alfa = FUNC16(Samus_FrameHandlerAlfa_Func11);
frame_handler_beta = FUNC16(Samus_FrameHandlerBeta_Func17);
DisableDemoInput();
return j;
}
void DemoPreInstr_864F(void) { // 0x91864F
if (sign16(samus_x_pos - 178)) {
demo_input_pre_instr = FUNC16(DemoPreInstr_866A);
demo_input_instr_ptr = 0x8623;
demo_input_instr_timer = 1;
}
}
void DemoPreInstr_866A(void) { // 0x91866A
if (!enemy_projectile_x_pos[0]) {
demo_input_pre_instr = FUNC16(DemoPreInstr_nullsub_162);
demo_input_instr_ptr = addr_off_91864B;
demo_input_instr_timer = 1;
}
}
uint16 DemoInstr_Disable(uint16 k, uint16 j) { // 0x918682
frame_handler_alfa = FUNC16(EmptyFunction);
frame_handler_beta = FUNC16(EmptyFunction);
DisableDemoInput();
return j;
}
void UNUSED_DemoInstr_Func4(void) { // 0x9186FE
frame_handler_alfa = FUNC16(Samus_FrameHandlerAlfa_Func13);
samus_pose = kPose_02_FaceL_Normal;
SamusFunc_F433();
Samus_SetAnimationFrameIfPoseChanged();
samus_last_different_pose = samus_prev_pose;
*(uint16 *)&samus_last_different_pose_x_dir = *(uint16 *)&samus_prev_pose_x_dir;
samus_prev_pose = samus_pose;
*(uint16 *)&samus_prev_pose_x_dir = *(uint16 *)&samus_pose_x_dir;
DisableDemoInput();
samus_input_handler = FUNC16(nullsub_152);
}
uint16 DemoInstr_Func3(uint16 k, uint16 j) { // 0x918739
frame_handler_alfa = FUNC16(Samus_FrameHandlerAlfa_Func13);
samus_pose = kPose_02_FaceL_Normal;
SamusFunc_F433();
Samus_SetAnimationFrameIfPoseChanged();
samus_last_different_pose = samus_prev_pose;
*(uint16 *)&samus_last_different_pose_x_dir = *(uint16 *)&samus_prev_pose_x_dir;
samus_prev_pose = samus_pose;
*(uint16 *)&samus_prev_pose_x_dir = *(uint16 *)&samus_pose_x_dir;
DisableDemoInput();
samus_input_handler = FUNC16(nullsub_152);
return j;
}
static Func_V *const kDemoSetFuncPtrs_0[6] = { // 0x918790
DemoSetFunc_0,
DemoSetFunc_1,
DemoSetFunc_1,
DemoSetFunc_2,
DemoSetFunc_1,
DemoSetFunc_3,
};
static Func_V *const kDemoSetFuncPtrs_1[6] = {
DemoSetFunc_2,
DemoSetFunc_2,
DemoSetFunc_1,
DemoSetFunc_2,
DemoSetFunc_1,
DemoSetFunc_4,
};
static Func_V *const kDemoSetFuncPtrs_2[6] = {
DemoSetFunc_2,
DemoSetFunc_5,
DemoSetFunc_1,
DemoSetFunc_1,
DemoSetFunc_1,
DemoSetFunc_1,
};
static Func_V *const kDemoSetFuncPtrs_3[5] = {
DemoSetFunc_6,
DemoSetFunc_2,
DemoSetFunc_2,
DemoSetFunc_1,
DemoSetFunc_7,
};
static Func_V *const *const kDemoSetFuncPtrs[4] = {
kDemoSetFuncPtrs_0,
kDemoSetFuncPtrs_1,
kDemoSetFuncPtrs_2,
kDemoSetFuncPtrs_3,
};
void LoadDemoData(void) {
DemoSetDef *DemoSetDef;
R18_ = 16 * demo_scene;
uint16 v0 = 16 * demo_scene + kDemoSetDefPtrs[demo_set];
DemoSetDef = get_DemoSetDef(v0);
collected_items = DemoSetDef->items;
equipped_items = collected_items;
samus_max_missiles = DemoSetDef->missiles;
samus_missiles = samus_max_missiles;
samus_max_super_missiles = DemoSetDef->super_missiles;
samus_super_missiles = samus_max_super_missiles;
samus_max_power_bombs = DemoSetDef->power_bombs;
samus_power_bombs = samus_max_power_bombs;
samus_max_health = DemoSetDef->health;
samus_health = samus_max_health;
collected_beams = DemoSetDef->beams;
equipped_beams = DemoSetDef->equipped_beams_;
samus_reserve_health = 0;
ResetDemoData();
EnableDemoInput();
uint16 demo_obj = get_DemoSetDef(v0)->demo_obj;
LoadDemoInputObject(demo_obj, demo_obj);
R18_ = 2 * demo_scene;
kDemoSetFuncPtrs[demo_set][demo_scene]();
frame_handler_alfa = FUNC16(Samus_FrameHandlerAlfa_Func12);
frame_handler_beta = FUNC16(Samus_FrameHandlerBeta_Func14);
samus_momentum_routine_index = 0;
samus_special_transgfx_index = 0;
samus_hurt_switch_index = 0;
Samus_LoadSuitPalette();
UpdateBeamTilesAndPalette();
button_config_up = kButton_Up;
button_config_down = kButton_Down;
button_config_left = kButton_Left;
button_config_right = kButton_Right;
button_config_shoot_x = kButton_X;
button_config_jump_a = kButton_A;
button_config_run_b = kButton_B;
button_config_itemcancel_y = kButton_Y;
button_config_itemswitch = kButton_Select;
button_config_aim_up_R = kButton_R;
button_config_aim_down_L = kButton_L;
UNUSED_word_7E09E8 = 1;
debug_flag = 1;
moonwalk_flag = 0;
UNUSED_word_7E0DF8 = 0;
UNUSED_word_7E0DFA = 0;
UNUSED_word_7E0DFC = 0;
}
void DemoSetFunc_0(void) { // 0x918A33
MakeSamusFaceForward();
samus_draw_handler = FUNC16(SamusDrawHandler_Default);
}
void DemoSetFunc_3(void) { // 0x918A3E
DemoSetFunc_Common(0x1Fu);
}
void DemoSetFunc_7(void) { // 0x918A43
samus_health = 20;
DemoSetFunc_2();
}
void DemoSetFunc_2(void) { // 0x918A49
DemoSetFunc_Common(2u);
}
void DemoSetFunc_4(void) { // 0x918A4E
DemoSetFunc_Common(0x2Au);
}
void DemoSetFunc_1(void) { // 0x918A53
DemoSetFunc_Common(1u);
}
void DemoSetFunc_Common(uint16 a) { // 0x918A56
samus_pose = a;
SamusFunc_F433();
Samus_SetAnimationFrameIfPoseChanged();
samus_draw_handler = FUNC16(SamusDrawHandler_Default);
}
void DemoSetFunc_5(void) { // 0x918A68
samus_draw_handler = FUNC16(SamusDrawHandler_Default);
Projectile_Func7_Shinespark();
samus_pose = kPose_CD_FaceR_Shinespark_Diag;
SamusFunc_F433();
Samus_SetAnimationFrameIfPoseChanged();
}
void DemoSetFunc_6(void) { // 0x918A81
samus_draw_handler = FUNC16(SamusDrawHandler_Default);
Projectile_Func7_Shinespark();
samus_pose = kPose_CA_FaceL_Shinespark_Horiz;
SamusFunc_F433();
Samus_SetAnimationFrameIfPoseChanged();
}
void DemoPreInstr_CheckLeaveDemo(void) { // 0x918A9B
if (game_state == kGameState_44_TransitionFromDemo) {
demo_input_instr_ptr = addr_kDemoInstrs_LeaveDemo;
demo_input_instr_timer = 1;
}
}
void DemoPreInstr_8AB0(void) { // 0x918AB0
if (samus_movement_type != kMovementType_1A_GrabbedByDraygon) {
demo_input_pre_instr = FUNC16(DemoPreInstr_CheckLeaveDemo);
demo_input_instr_ptr = addr_stru_919346;
demo_input_instr_timer = 1;
}
}
static Func_V *const kXrayHdmaFuncs[5] = { // 0x91BE11
XrayHdmaFunc_BeamAimedR,
XrayHdmaFunc_BeamAimedU,
XrayHdmaFunc_BeamAimedD,
XrayHdmaFunc_BeamAimedL,
XrayHdmaFunc_BeamHoriz,
};
void CalculateXrayHdmaTable_OriginOffScreen(uint16 k, uint16 j) {
int16 v2;
uint16 v3;
LOBYTE(v2) = HIBYTE(k);
HIBYTE(v2) = k;
R22_ = v2 & 0xFF00;
R24_ = j;
R26_ = R18_ - R20_;
R26_ += (R26_ & 0x8000u) != 0 ? 0x100 : 0;
R28_ = R20_ + R18_;
if (!sign16(R20_ + R18_ - 257))
R28_ = R20_ + R18_ - 256;
if (!R20_ && (R18_ == 64 || R18_ == 192)) {
v3 = 8;
} else {
if (sign16(R26_ - 128)) {
if (sign16(R26_ - 64)) {
if (!sign16(R28_ - 64)) {
v3 = 0;
goto LABEL_16;
}
goto LABEL_13;
}
} else {
if (!sign16(R26_ - 192)) {
LABEL_13:
v3 = 2;
goto LABEL_16;
}
if (!sign16(R28_ - 192)) {
v3 = 6;
goto LABEL_16;
}
}
v3 = 4;
}
LABEL_16:;
uint16 v4 = R26_;
if (!sign16(R26_ - 128))
v4 = R26_ - 128;
g_word_7E001E = kTanTable[v4];
uint16 v5 = R28_;
if (!sign16(R28_ - 128))
v5 = R28_ - 128;
R32 = kTanTable[v5];
kXrayHdmaFuncs[v3 >> 1]();
}
void XrayHdmaFunc_BeamAimedR(void) { // 0x91BEC2
int16 v0;
int16 v2;
v0 = 2 * (R24_ - 1);
R34 = R22_;
R36 = R22_;
while (1) {
bool v1 = __CFADD__uint16(g_word_7E001E, R34);
R34 += g_word_7E001E;
if (v1)
break;
v0 -= 2;
if (v0 < 0) {
R18_ = 0;
goto LABEL_10;
}
}
IndirWriteWord(&R0_, v0, HIBYTE(R34) | 0xFF00);
R18_ = v0 + 2;
v2 = v0 - 2;
while (1) {
bool v1 = __CFADD__uint16(g_word_7E001E, R34);
R34 += g_word_7E001E;
if (v1)
break;
IndirWriteWord(&R0_, v2, HIBYTE(R34) | 0xFF00);
v2 -= 2;
if (v2 < 0)
goto LABEL_10;
}
do {
IndirWriteWord(&R0_, v2, 0xFFu);
v2 -= 2;
} while (v2 >= 0);
LABEL_10:;
uint16 v3 = 2 * R24_;
while (1) {
bool v1 = __CFADD__uint16(R32, R36);
R36 += R32;
if (v1)
break;
v3 += 2;
if ((int16)(v3 - 460) >= 0) {
R20_ = v3;
goto LABEL_19;
}
}
IndirWriteWord(&R0_, v3, HIBYTE(R36) | 0xFF00);
R20_ = v3 - 2;
uint16 v4;
v4 = v3 - 2 + 4;
while (1) {
bool v1 = __CFADD__uint16(R32, R36);
R36 += R32;
if (v1)
break;
IndirWriteWord(&R0_, v4, HIBYTE(R36) | 0xFF00);
v4 += 2;
if ((int16)(v4 - 460) >= 0)
goto LABEL_19;
}
do {
IndirWriteWord(&R0_, v4, 0xFFu);
v4 += 2;
} while ((int16)(v4 - 460) < 0);
LABEL_19:;
uint16 v5 = R18_;
do {
do {
IndirWriteWord(&R0_, v5, 0xFF00u);
v5 += 2;
} while ((int16)(v5 - R20_) < 0);
} while (v5 == R20_);
}
void XrayHdmaFunc_BeamAimedL(void) { // 0x91BF72
int16 v0;
int16 v2;
v0 = 2 * (R24_ - 1);
R34 = R22_;
R36 = R22_;
while (1) {
bool v1 = R36 >= R32;
R36 -= R32;
if (!v1)
break;
v0 -= 2;
if (v0 < 0) {
R18_ = 0;
goto LABEL_10;
}
}
IndirWriteWord(&R0_, v0, R36 & 0xFF00);
R18_ = v0 + 2;
v2 = v0 - 2;
while (1) {
bool v1 = R36 >= R32;
R36 -= R32;
if (!v1)
break;
IndirWriteWord(&R0_, v2, R36 & 0xFF00);
v2 -= 2;
if (v2 < 0)
goto LABEL_10;
}
do {
IndirWriteWord(&R0_, v2, 0xFFu);
v2 -= 2;
} while (v2 >= 0);
LABEL_10:;
uint16 v3 = 2 * R24_;
while (1) {
bool v1 = R34 >= g_word_7E001E;
R34 -= g_word_7E001E;
if (!v1)
break;
v3 += 2;
if ((int16)(v3 - 460) >= 0) {
R20_ = v3;
goto LABEL_19;
}
}
IndirWriteWord(&R0_, v3, R34 & 0xFF00);
R20_ = v3 - 2;
uint16 v4;
v4 = v3 - 2 + 4;
while (1) {
bool v1 = R34 >= g_word_7E001E;
R34 -= g_word_7E001E;
if (!v1)
break;
IndirWriteWord(&R0_, v4, R34 & 0xFF00);
v4 += 2;
if ((int16)(v4 - 460) >= 0)
goto LABEL_19;
}
do {
IndirWriteWord(&R0_, v4, 0xFFu);
v4 += 2;
} while ((int16)(v4 - 460) < 0);
LABEL_19:;
uint16 v5 = R18_;
do {
do {
IndirWriteWord(&R0_, v5, 0xFF00u);
v5 += 2;
} while ((int16)(v5 - R20_) < 0);
} while (v5 == R20_);
}
static Func_Y_V *const off_91C063[3] = { // 0x91C022
XrayHdmaFunc_BeamAimedUUR,
XrayHdmaFunc_BeamAimedUU,
XrayHdmaFunc_BeamAimedUUL,
};
void XrayHdmaFunc_BeamAimedU(void) {
uint16 v0;
R34 = R22_;
R36 = R22_;
if (sign16(R26_ - 192)) {
v0 = 0;
} else if (sign16(R28_ - 192)) {
v0 = 2;
} else {
v0 = 4;
}
R26_ = 2 * R24_;
off_91C063[v0 >> 1](2 * (R24_ - 1));
uint16 v1 = R18_;
do {
IndirWriteWord(&R0_, v1, 0xFFu);
v1 += 2;
} while ((int16)(v1 - 460) < 0);
}
void XrayHdmaFunc_BeamAimedUUR(uint16 v0) { // 0x91C069
int16 v2;
int16 v3;
int16 v4;
int16 v6;
v6 = v0;
while (1) {
bool v1 = __CFADD__uint16(g_word_7E001E, R34);
R34 += g_word_7E001E;
if (v1)
break;
v0 -= 2;
if (v0 < 0) {
R18_ = 0;
goto LABEL_12;
}
}
IndirWriteByte(&R0_, v0, HIBYTE(R34));
v2 = v0 - 2;
if (v2 >= 0) {
R18_ = v2 + 4;
while (1) {
bool v1 = __CFADD__uint16(g_word_7E001E, R34);
R34 += g_word_7E001E;
if (v1)
break;
IndirWriteByte(&R0_, v2, HIBYTE(R34));
v2 -= 2;
if (v2 < 0)
goto LABEL_12;
}
do {
IndirWriteByte(&R0_, v2, 0xFFu);
v2 -= 2;
} while (v2 >= 0);
} else {
R18_ = 2;
}
LABEL_12:
v3 = v6 + 1;
while (1) {
bool v1 = __CFADD__uint16(R32, R36);
R36 += R32;
if (v1)
break;
v3 -= 2;
if (v3 < 0) {
R20_ = 1;
goto LABEL_23;
}
}
IndirWriteByte(&R0_, v3, HIBYTE(R36));
v4 = v3 - 2;
if (v4 >= 0) {
R20_ = v4 + 4;
while (1) {
bool v1 = __CFADD__uint16(R32, R36);
R36 += R32;
if (v1)
break;
IndirWriteByte(&R0_, v4, HIBYTE(R36));
v4 -= 2;
if (v4 < 0)
goto LABEL_23;
}
do {
IndirWriteByte(&R0_, v4, 0xFFu);
v4 -= 2;
} while (v4 >= 0);
} else {
R20_ = 3;
}
LABEL_23:;
uint16 v5 = R18_;
do {
IndirWriteByte(&R0_, v5, 0);
v5 += 2;
} while ((int16)(v5 - R20_) < 0);
R18_ = R20_ - 1;
}
void XrayHdmaFunc_BeamAimedUU(uint16 j) { // 0x91C123
int16 v2;
int16 v3;
int16 v4;
uint16 v5 = j;
while (1) {
bool v1 = R34 >= g_word_7E001E;
R34 -= g_word_7E001E;
if (!v1)
break;
j -= 2;
if ((j & 0x8000u) != 0) {
R18_ = 0;
goto LABEL_12;
}
}
IndirWriteByte(&R0_, j, HIBYTE(R34));
v2 = j - 2;
if (v2 >= 0) {
R18_ = v2 + 4;
while (1) {
bool v1 = R34 >= g_word_7E001E;
R34 -= g_word_7E001E;
if (!v1)
break;
IndirWriteByte(&R0_, v2, HIBYTE(R34));
v2 -= 2;
if (v2 < 0)
goto LABEL_12;
}
do {
IndirWriteByte(&R0_, v2, 0);
v2 -= 2;
} while (v2 >= 0);
} else {
R18_ = 2;
}
LABEL_12:
v3 = v5 + 1;
while (1) {
bool v1 = __CFADD__uint16(R32, R36);
R36 += R32;
if (v1)
break;
v3 -= 2;
if (v3 < 0) {
R20_ = 1;
return;
}
}
IndirWriteByte(&R0_, v3, HIBYTE(R36));
v4 = v3 - 2;
if (v4 >= 0) {
R20_ = v4 + 4;
while (1) {
bool v1 = __CFADD__uint16(R32, R36);
R36 += R32;
if (v1)
break;
IndirWriteByte(&R0_, v4, HIBYTE(R36));
v4 -= 2;
if (v4 < 0)
return;
}
do {
IndirWriteByte(&R0_, v4, 0xFFu);
v4 -= 2;
} while (v4 >= 0);
} else {
R20_ = 3;
}
}
void XrayHdmaFunc_BeamAimedUUL(uint16 j) { // 0x91C1CA
int16 v2;
int16 v3;
int16 v4;
uint16 v6 = j;
while (1) {
bool v1 = R34 >= g_word_7E001E;
R34 -= g_word_7E001E;
if (!v1)
break;
j -= 2;
if ((j & 0x8000u) != 0) {
R18_ = 0;
goto LABEL_12;
}
}
IndirWriteByte(&R0_, j, HIBYTE(R34));
v2 = j - 2;
if (v2 >= 0) {
R18_ = v2 + 4;
while (1) {
bool v1 = R34 >= g_word_7E001E;
R34 -= g_word_7E001E;
if (!v1)
break;
IndirWriteByte(&R0_, v2, HIBYTE(R34));
v2 -= 2;
if (v2 < 0)
goto LABEL_12;
}
do {
IndirWriteByte(&R0_, v2, 0);
v2 -= 2;
} while (v2 >= 0);
} else {
R18_ = 2;
}
LABEL_12:
v3 = v6 + 1;
while (1) {
bool v1 = R36 >= R32;
R36 -= R32;
if (!v1)
break;
v3 -= 2;
if (v3 < 0) {
R20_ = 1;
goto LABEL_23;
}
}
IndirWriteByte(&R0_, v3, HIBYTE(R34));
v4 = v3 - 2;
if (v4 >= 0) {
R20_ = v4 + 4;
while (1) {
bool v1 = R36 >= R32;
R36 -= R32;
if (!v1)
break;
IndirWriteByte(&R0_, v4, HIBYTE(R36));
v4 -= 2;
if (v4 < 0)
goto LABEL_23;
}
do {
IndirWriteByte(&R0_, v4, 0);
v4 -= 2;
} while (v4 >= 0);
} else {
R20_ = 3;
}
LABEL_23:;
uint16 v5 = R20_;
do {
IndirWriteByte(&R0_, v5, 0xFFu);
v5 += 2;
} while ((int16)(v5 - R18_) < 0);
}
static Func_Y_V *const off_91C2B7[3] = { // 0x91C27F
XrayHdmaFunc_BeamAimedDDR,
XrayHdmaFunc_BeamAimedDD,
XrayHdmaFunc_BeamAimedDDL,
};
void XrayHdmaFunc_BeamAimedD(void) {
int16 v1;
uint16 v0;
R34 = R22_;
R36 = R22_;
if (sign16(R28_ - 128)) {
v0 = 0;
} else if (sign16(R26_ - 128)) {
v0 = 2;
} else {
v0 = 4;
}
off_91C2B7[v0 >> 1](R24_ * 2);
v1 = R18_;
do {
IndirWriteWord(&R0_, v1, 0xFFu);
v1 -= 2;
} while (v1 >= 0);
}
void XrayHdmaFunc_BeamAimedDDR(uint16 j) { // 0x91C2BD
uint16 v6 = j;
while (1) {
bool v1 = __CFADD__uint16(R32, R36);
R36 += R32;
if (v1)
break;
j += 2;
if ((int16)(j - 460) >= 0) {
R18_ = j;
goto LABEL_12;
}
}
IndirWriteWord(&R0_, j, *(uint16 *)((char *)&R36 + 1));
uint16 v2;
v2 = j + 2;
if ((int16)(v2 - 460) < 0) {
R18_ = v2 - 4;
while (1) {
bool v1 = __CFADD__uint16(R32, R36);
R36 += R32;
if (v1)
break;
IndirWriteWord(&R0_, v2, *(uint16 *)((char *)&R36 + 1));
v2 += 2;
if ((int16)(v2 - 460) >= 0)
goto LABEL_12;
}
do {
IndirWriteWord(&R0_, v2, 0xFFu);
v2 += 2;
} while ((int16)(v2 - 460) < 0);
} else {
R18_ = 458;
}
LABEL_12:;
uint16 v3 = v6 + 1;
while (1) {
bool v1 = __CFADD__uint16(g_word_7E001E, R34);
R34 += g_word_7E001E;
if (v1)
break;
v3 += 2;
if ((int16)(v3 - 460) >= 0) {
R20_ = v3;
goto LABEL_23;
}
}
IndirWriteByte(&R0_, v3, HIBYTE(R34));
uint16 v4;
v4 = v3 + 2;
if ((int16)(v4 - 460) < 0) {
R20_ = v4 - 4;
while (1) {
bool v1 = __CFADD__uint16(g_word_7E001E, R34);
R34 += g_word_7E001E;
if (v1)
break;
IndirWriteByte(&R0_, v4, HIBYTE(R34));
v4 += 2;
if ((int16)(v4 - 460) >= 0)
goto LABEL_23;
}
do {
IndirWriteByte(&R0_, v4, 0xFFu);
v4 += 2;
} while ((int16)(v4 - 460) < 0);
} else {
R20_ = 459;
}
LABEL_23:;
uint16 v5 = R18_;
do {
IndirWriteByte(&R0_, v5, 0);
v5 -= 2;
} while ((int16)(v5 - R20_) >= 0);
R18_ = R20_ - 1;
}
void XrayHdmaFunc_BeamAimedDD(uint16 j) { // 0x91C381
uint16 v5 = j;
if (R32) {
while (1) {
bool v1 = R36 >= R32;
R36 -= R32;
if (!v1)
break;
j += 2;
if ((int16)(j - 460) >= 0) {
R18_ = j;
goto LABEL_15;
}
}
IndirWriteWord(&R0_, j, *(uint16 *)((char *)&R36 + 1));
uint16 v2 = j + 2;
if ((int16)(v2 - 460) < 0) {
R18_ = v2 - 4;
while (1) {
bool v1 = R36 >= R32;
R36 -= R32;
if (!v1)
break;
IndirWriteWord(&R0_, v2, *(uint16 *)((char *)&R36 + 1));
v2 += 2;
if ((int16)(v2 - 460) >= 0)
goto LABEL_15;
}
do {
IndirWriteWord(&R0_, v2, 0);
v2 += 2;
} while ((int16)(v2 - 460) < 0);
} else {
R18_ = 458;
}
} else {
R18_ = j;
do {
IndirWriteWord(&R0_, j, 0);
j += 2;
} while ((int16)(j - 460) < 0);
}
LABEL_15:;
uint16 v3 = v5 + 1;
while (1) {
bool v1 = __CFADD__uint16(g_word_7E001E, R34);
R34 += g_word_7E001E;
if (v1)
break;
v3 += 2;
if ((int16)(v3 - 460) >= 0) {
R20_ = v3;
return;
}
}
IndirWriteByte(&R0_, v3, HIBYTE(R34));
uint16 v4 = v3 + 2;
if ((int16)(v4 - 460) < 0) {
R20_ = v4 - 4;
while (1) {
bool v1 = __CFADD__uint16(g_word_7E001E, R34);
R34 += g_word_7E001E;
if (v1)
break;
IndirWriteByte(&R0_, v4, HIBYTE(R34));
v4 += 2;
if ((int16)(v4 - 460) >= 0)
return;
}
do {
IndirWriteByte(&R0_, v4, 0xFFu);
v4 += 2;
} while ((int16)(v4 - 460) < 0);
} else {
R20_ = 459;
}
}
void XrayHdmaFunc_BeamAimedDDL(uint16 j) { // 0x91C446
uint16 v6 = j;
while (1) {
bool v1 = R36 >= R32;
R36 -= R32;
if (!v1)
break;
j += 2;
if ((int16)(j - 460) >= 0) {
R18_ = j;
goto LABEL_12;
}
}
IndirWriteWord(&R0_, j, *(uint16 *)((char *)&R36 + 1));
uint16 v2;
v2 = j + 2;
if ((int16)(v2 - 460) < 0) {
R18_ = v2 - 4;
while (1) {
bool v1 = R36 >= R32;
R36 -= R32;
if (!v1)
break;
IndirWriteWord(&R0_, v2, *(uint16 *)((char *)&R36 + 1));
v2 += 2;
if ((int16)(v2 - 460) >= 0)
goto LABEL_12;
}
do {
IndirWriteWord(&R0_, v2, 0);
v2 += 2;
} while ((int16)(v2 - 460) < 0);
} else {
R18_ = 458;
}
LABEL_12:;
uint16 v3 = v6 + 1;
while (1) {
bool v1 = R34 >= g_word_7E001E;
R34 -= g_word_7E001E;
if (!v1)
break;
v3 += 2;
if ((int16)(v3 - 460) >= 0) {
R20_ = v3;
goto LABEL_23;
}
}
IndirWriteByte(&R0_, v3, HIBYTE(R34));
uint16 v4;
v4 = v3 + 2;
if ((int16)(v4 - 460) < 0) {
R20_ = v4 - 4;
while (1) {
bool v1 = R34 >= g_word_7E001E;
R34 -= g_word_7E001E;
if (!v1)
break;
IndirWriteByte(&R0_, v4, HIBYTE(R34));
v4 += 2;
if ((int16)(v4 - 460) >= 0)
goto LABEL_23;
}
do {
IndirWriteByte(&R0_, v4, 0);
v4 += 2;
} while ((int16)(v4 - 460) < 0);
} else {
R20_ = 459;
}
LABEL_23:;
uint16 v5 = R20_;
do {
IndirWriteByte(&R0_, v5, 0xFFu);
v5 -= 2;
} while ((int16)(v5 - R18_) >= 0);
}
void XrayHdmaFunc_BeamHoriz(void) { // 0x91C505
int16 v1;
uint16 v0 = 2 * (R24_ - 1);
IndirWriteWord(&R0_, v0, 0xFF00u);
v1 = v0 - 2;
do {
if (*(uint16 *)IndirPtr(&R0_, v1) == 255)
break;
IndirWriteWord(&R0_, v1, 0xFFu);
v1 -= 2;
} while (v1 >= 0);
uint16 v2 = 2 * R24_;
do {
if (*(uint16 *)IndirPtr(&R0_, v2) == 255)
break;
IndirWriteWord(&R0_, v2, 0xFFu);
v2 += 2;
} while ((int16)(v2 - 460) < 0);
}
void CalculateXrayHdmaTable_OriginOnScreen(uint16 k, uint16 j) { // 0x91C54B
int16 v2;
uint16 v3;
LOBYTE(v2) = HIBYTE(k);
HIBYTE(v2) = k;
R22_ = v2 & 0xFF00;
R24_ = j;
R26_ = R18_ - R20_;
R26_ += (R26_ & 0x8000u) != 0 ? 0x100 : 0;
R28_ = R20_ + R18_;
if (!sign16(R20_ + R18_ - 257))
R28_ = R20_ + R18_ - 256;
if (!R20_ && (R18_ == 64 || R18_ == 192)) {
v3 = 8;
} else {
if (sign16(R26_ - 128)) {
if (sign16(R26_ - 64)) {
if (!sign16(R28_ - 64)) {
v3 = 0;
goto LABEL_16;
}
goto LABEL_13;
}
} else {
if (!sign16(R26_ - 192)) {
LABEL_13:
v3 = 2;
goto LABEL_16;
}
if (!sign16(R28_ - 192)) {
v3 = 6;
goto LABEL_16;
}
}
v3 = 4;
}
LABEL_16:;
uint16 v4 = R26_;
if (!sign16(R26_ - 128))
v4 = R26_ - 128;
g_word_7E001E = kTanTable[v4];
uint16 v5 = R28_;
if (!sign16(R28_ - 128))
v5 = R28_ - 128;
R32 = kTanTable[v5];
grapple_beam_unkD1E = 0;
static Func_V *const kXrayHdmaOnScreen_Funcs[5] = {
XrayHdmaOnScreen_BeamAimedR,
XrayHdmaOnScreen_BeamAimedU,
XrayHdmaOnScreen_BeamAimedD,
XrayHdmaOnScreen_BeamAimedL,
XrayHdmaOnScreen_BeamHoriz,
};
kXrayHdmaOnScreen_Funcs[v3 >> 1]();
}
void XrayHdmaOnScreen_BeamAimedR(void) { // 0x91C5FF
int16 v1;
uint16 v0 = 2 * (R24_ - 1);
IndirWriteWord(&R0_, v0, HIBYTE(R22_) | 0xFF00);
v1 = v0 - 2;
R34 = R22_;
R36 = R22_;
while (1) {
bool v2 = __CFADD__uint16(g_word_7E001E, R34);
R34 += g_word_7E001E;
if (v2)
break;
IndirWriteWord(&R0_, v1, HIBYTE(R34) | 0xFF00);
v1 -= 2;
if (v1 < 0)
goto LABEL_6;
}
do {
IndirWriteWord(&R0_, v1, 0xFFu);
v1 -= 2;
} while (v1 >= 0);
LABEL_6:;
uint16 v3 = 2 * R24_;
while (1) {
bool v2 = __CFADD__uint16(R32, R36);
R36 += R32;
if (v2)
break;
IndirWriteWord(&R0_, v3, HIBYTE(R36) | 0xFF00);
v3 += 2;
if ((int16)(v3 - 460) >= 0)
return;
}
do {
IndirWriteWord(&R0_, v3, 0xFFu);
v3 += 2;
} while ((int16)(v3 - 460) < 0);
}
void XrayHdmaOnScreen_BeamAimedL(void) { // 0x91C660
int16 v1;
uint16 v0 = 2 * (R24_ - 1);
IndirWriteWord(&R0_, v0, R22_ & 0xFF00);
v1 = v0 - 2;
R34 = R22_;
R36 = R22_;
while (1) {
bool v2 = R36 >= R32;
R36 -= R32;
if (!v2)
break;
IndirWriteWord(&R0_, v1, R36 & 0xFF00);
v1 -= 2;
if (v1 < 0)
goto LABEL_6;
}
do {
IndirWriteWord(&R0_, v1, 0xFFu);
v1 -= 2;
} while (v1 >= 0);
LABEL_6:;
uint16 v3 = 2 * R24_;
while (1) {
bool v2 = R34 >= g_word_7E001E;
R34 -= g_word_7E001E;
if (!v2)
break;
IndirWriteWord(&R0_, v3, R34 & 0xFF00);
v3 += 2;
if ((int16)(v3 - 460) >= 0)
return;
}
do {
IndirWriteWord(&R0_, v3, 0xFFu);
v3 += 2;
} while ((int16)(v3 - 460) < 0);
}
void XrayHdmaOnScreen_BeamAimedU(void) { // 0x91C6C1
uint16 v0 = 2 * (R24_ - 1);
IndirWriteByte(&R0_, v0++, HIBYTE(R22_));
IndirWriteByte(&R0_, v0, HIBYTE(R22_));
uint16 v1 = v0 - 3;
uint16 v2;
R34 = R22_;
R36 = R22_;
if (sign16(R26_ - 192)) {
v2 = 0;
} else if (sign16(R28_ - 192)) {
v2 = 2;
} else {
v2 = 4;
}
static Func_Y_V *const off_91C716[3] = {
XrayHdmaOnScreen_BeamAimedUUR,
XrayHdmaOnScreen_BeamAimedUU,
XrayHdmaOnScreen_BeamAimedUUL,
};
off_91C716[v2 >> 1](v1);
uint16 v3 = 2 * R24_;
do {
if (*(uint16 *)IndirPtr(&R0_, v3) == 255)
break;
IndirWriteWord(&R0_, v3, 0xFFu);
v3 += 2;
} while ((int16)(v3 - 460) < 0);
}
void XrayHdmaOnScreen_BeamAimedUUR(uint16 v0) { // 0x91C71C
int16 v2;
int16 v4;
v4 = v0;
while (1) {
bool v1 = __CFADD__uint16(g_word_7E001E, R34);
R34 += g_word_7E001E;
if (v1)
break;
IndirWriteByte(&R0_, v0, HIBYTE(R34));
v0 -= 2;
if ((v0 & 0x8000u) != 0)
goto LABEL_7;
}
grapple_beam_unkD1E = v0;
do {
IndirWriteByte(&R0_, v0, 0xFFu);
v0 -= 2;
} while ((v0 & 0x8000u) == 0);
LABEL_7:
v2 = v4 + 1;
while (1) {
bool v1 = __CFADD__uint16(R32, R36);
R36 += R32;
if (v1)
break;
IndirWriteByte(&R0_, v2, HIBYTE(R36));
v2 -= 2;
if (v2 < 0)
return;
}
do {
IndirWriteByte(&R0_, v2, 0xFFu);
v2 -= 2;
} while (v2 >= 0);
if (grapple_beam_unkD1E) {
for (int i = grapple_beam_unkD1E - 2; i >= 0; i -= 2)
IndirWriteWord(&R0_, i, 0xFFu);
}
}
void XrayHdmaOnScreen_BeamAimedUU(uint16 v0) { // 0x91C77F
int16 v2;
int16 v3;
v3 = v0;
while (1) {
bool v1 = R34 >= g_word_7E001E;
R34 -= g_word_7E001E;
if (!v1)
break;
IndirWriteByte(&R0_, v0, HIBYTE(R34));
v0 -= 2;
if (v0 < 0)
goto LABEL_6;
}
do {
IndirWriteByte(&R0_, v0, 0);
v0 -= 2;
} while (v0 >= 0);
LABEL_6:
v2 = v3 + 1;
while (1) {
bool v1 = __CFADD__uint16(R32, R36);
R36 += R32;
if (v1)
break;
IndirWriteByte(&R0_, v2, HIBYTE(R36));
v2 -= 2;
if (v2 < 0)
return;
}
do {
IndirWriteByte(&R0_, v2, 0xFFu);
v2 -= 2;
} while (v2 >= 0);
}
void XrayHdmaOnScreen_BeamAimedUUL(uint16 j) { // 0x91C7CB
int16 v2;
int16 v3;
int16 v5;
uint16 v4 = j;
while (1) {
bool v1 = R34 >= g_word_7E001E;
R34 -= g_word_7E001E;
if (!v1)
break;
IndirWriteByte(&R0_, j, HIBYTE(R34));
j -= 2;
if ((j & 0x8000u) != 0)
goto LABEL_6;
}
do {
IndirWriteByte(&R0_, j, 0);
j -= 2;
} while ((j & 0x8000u) == 0);
LABEL_6:
v2 = v4 + 1;
while (1) {
bool v1 = R36 >= R32;
R36 -= R32;
if (!v1)
break;
IndirWriteByte(&R0_, v2, HIBYTE(R36));
v2 -= 2;
if (v2 < 0)
return;
}
v5 = v2;
do {
IndirWriteByte(&R0_, v2, 0);
v2 -= 2;
} while (v2 >= 0);
v3 = v5 - 1;
do {
IndirWriteByte(&R0_, v3, 0xFFu);
v3 -= 2;
} while (v3 >= 0);
}
void XrayHdmaOnScreen_BeamAimedD(void) { // 0x91C822
int16 v3;
uint16 v2;
uint16 v0 = 2 * (R24_ - 1);
IndirWriteByte(&R0_, v0++, HIBYTE(R22_));
IndirWriteByte(&R0_, v0, HIBYTE(R22_));
uint16 v1 = v0 + 1;
R34 = R22_;
R36 = R22_;
if (sign16(R28_ - 128)) {
v2 = 0;
} else if (sign16(R26_ - 128)) {
v2 = 2;
} else {
v2 = 4;
}
static Func_Y_V *const off_91C874[3] = {
XrayHdmaOnScreen_BeamAimedDDR,
XrayHdmaOnScreen_BeamAimedDD,
XrayHdmaOnScreen_BeamAimedDDL,
};
off_91C874[v2 >> 1](v1);
v3 = 2 * (R24_ - 2);
do {
if (*(uint16 *)IndirPtr(&R0_, v3) == 255)
break;
IndirWriteWord(&R0_, v3, 0xFFu);
v3 -= 2;
} while (v3 >= 0);
}
void XrayHdmaOnScreen_BeamAimedDDR(uint16 j) { // 0x91C87A
uint16 v4 = j;
while (1) {
bool v1 = __CFADD__uint16(R32, R36);
R36 += R32;
if (v1)
break;
IndirWriteWord(&R0_, j, *(uint16 *)((char *)&R36 + 1));
j += 2;
if ((int16)(j - 460) >= 0)
goto LABEL_7;
}
grapple_beam_unkD1E = j;
do {
IndirWriteWord(&R0_, j, 0xFFu);
j += 2;
} while ((int16)(j - 460) < 0);
LABEL_7:;
uint16 v2 = v4 + 1;
while (1) {
bool v1 = __CFADD__uint16(g_word_7E001E, R34);
R34 += g_word_7E001E;
if (v1)
break;
IndirWriteByte(&R0_, v2, HIBYTE(R34));
v2 += 2;
if ((int16)(v2 - 460) >= 0)
return;
}
do {
IndirWriteByte(&R0_, v2, 0xFFu);
v2 += 2;
} while ((int16)(v2 - 460) < 0);
if (grapple_beam_unkD1E) {
uint16 v3 = grapple_beam_unkD1E + 2;
if ((int16)(grapple_beam_unkD1E - 458) < 0) {
do {
IndirWriteWord(&R0_, v3, 0xFFu);
v3 += 2;
} while ((int16)(v3 - 460) < 0);
}
}
}
void XrayHdmaOnScreen_BeamAimedDD(uint16 j) { // 0x91C8E8
uint16 v3 = j;
while (1) {
bool v1 = R36 >= R32;
R36 -= R32;
if (!v1)
break;
IndirWriteWord(&R0_, j, *(uint16 *)((char *)&R36 + 1));
j += 2;
if ((int16)(j - 460) >= 0)
goto LABEL_6;
}
do {
IndirWriteWord(&R0_, j, 0);
j += 2;
} while ((int16)(j - 460) < 0);
LABEL_6:;
uint16 v2 = v3 + 1;
while (1) {
bool v1 = __CFADD__uint16(g_word_7E001E, R34);
R34 += g_word_7E001E;
if (v1)
break;
IndirWriteByte(&R0_, v2, HIBYTE(R34));
v2 += 2;
if ((int16)(v2 - 460) >= 0)
return;
}
do {
IndirWriteByte(&R0_, v2, 0xFFu);
v2 += 2;
} while ((int16)(v2 - 460) < 0);
}
void XrayHdmaOnScreen_BeamAimedDDL(uint16 j) { // 0x91C939
uint16 v4 = j;
while (1) {
bool v1 = R36 >= R32;
R36 -= R32;
if (!v1)
break;
IndirWriteWord(&R0_, j, *(uint16 *)((char *)&R36 + 1));
j += 2;
if ((int16)(j - 460) >= 0)
goto LABEL_6;
}
do {
IndirWriteWord(&R0_, j, 0);
j += 2;
} while ((int16)(j - 460) < 0);
LABEL_6:;
uint16 v2 = v4 + 1;
while (1) {
bool v1 = R34 >= g_word_7E001E;
R34 -= g_word_7E001E;
if (!v1)
break;
IndirWriteByte(&R0_, v2, HIBYTE(R34));
v2 += 2;
if ((int16)(v2 - 460) >= 0)
return;
}
uint16 v5 = v2;
do {
IndirWriteByte(&R0_, v2, 0);
v2 += 2;
} while ((int16)(v2 - 460) < 0);
uint16 v3 = v5 - 1;
do {
IndirWriteByte(&R0_, v3, 0xFFu);
v3 += 2;
} while ((int16)(v3 - 460) < 0);
}
void XrayHdmaOnScreen_BeamHoriz(void) { // 0x91C998
int16 v1;
uint16 v0 = 2 * (R24_ - 1);
if (R18_ == 64)
IndirWriteWord(&R0_, v0, HIBYTE(R22_) | 0xFF00);
else
IndirWriteWord(&R0_, v0, R22_ & 0xFF00);
v1 = v0 - 2;
do {
IndirWriteWord(&R0_, v1, 0xFFu);
v1 -= 2;
} while (v1 >= 0);
uint16 v2 = 2 * R24_;
do {
IndirWriteWord(&R0_, v2, 0xFFu);
v2 += 2;
} while ((int16)(v2 - 460) < 0);
}
void XrayRunHandler(void) { // 0x91CAD6
#define unk_91CAF2 (*(SpawnHdmaObject_Args*)RomPtr(0x91caf2))
if (!time_is_frozen_flag && (button_config_run_b & joypad1_lastkeys) != 0) {
if (Xray_Initialize() & 1)
SpawnHdmaObject(0x91, &unk_91CAF2);
}
}
void Xray_SetupStage1_FreezeTimeBackup(uint16 k) { // 0x91CAF9
LOBYTE(time_is_frozen_flag) = 1;
*((uint8 *)hdma_object_A + (uint8)k) = reg_BG2HOFS;
*((uint8 *)hdma_object_A + (uint8)k + 1) = HIBYTE(reg_BG2HOFS);
*((uint8 *)hdma_object_B + (uint8)k) = reg_BG2VOFS;
*((uint8 *)hdma_object_B + (uint8)k + 1) = HIBYTE(reg_BG2VOFS);
*((uint8 *)hdma_object_C + (uint8)k) = reg_BG2SC;
}
void Xray_SetupStage2_ReadBg1_2ndScreen(void) { // 0x91CB1C
unsigned int v1;
uint16 v0 = vram_read_queue_tail;
v1 = vram_read_queue_tail;
*(uint16 *)((char *)&vram_read_queue[0].vram_target + vram_read_queue_tail) = ((reg_BG1SC & 0xFC) << 8) + 1024;
*(uint16 *)((char *)&vram_read_queue[0].dma_parameters + v1) = 129;
*(uint16 *)((char *)&vram_read_queue[0].dma_parameters + v0 + 1) = 57;
*(VoidP *)((char *)&vram_read_queue[0].src.addr + v0) = ADDR16_OF_RAM(ram4000) + 0x2800;
*(uint16 *)(&vram_read_queue[0].src.bank + v0) = 126;
*(uint16 *)((char *)&vram_read_queue[0].size + v0) = 2048;
vram_read_queue_tail = v0 + 9;
}
void Xray_SetupStage3_ReadBg1_1stScreen(void) { // 0x91CB57
unsigned int v1;
uint16 v0 = vram_read_queue_tail;
v1 = vram_read_queue_tail;
*(uint16 *)((char *)&vram_read_queue[0].vram_target + vram_read_queue_tail) = (reg_BG1SC & 0xFC) << 8;
*(uint16 *)((char *)&vram_read_queue[0].dma_parameters + v1) = 129;
*(uint16 *)((char *)&vram_read_queue[0].dma_parameters + v0 + 1) = 57;
*(VoidP *)((char *)&vram_read_queue[0].src.addr + v0) = ADDR16_OF_RAM(ram4000) + 0x2000;
*(uint16 *)(&vram_read_queue[0].src.bank + v0) = 126;
*(uint16 *)((char *)&vram_read_queue[0].size + v0) = 2048;
vram_read_queue_tail = v0 + 9;
}
void Xray_SetupStage4(void) { // 0x91CB8E
unsigned int v3;
int16 v6;
unsigned int v8;
R24_ = 4 * (((uint8)layer1_y_pos + (uint8)bg1_y_offset) & 0xF0);
R24_ += (uint8)((layer1_x_pos + bg1_x_offset) & 0xF0) >> 3;
R24_ += 4 * ((layer1_x_pos + bg1_x_offset) & 0x100);
R22_ = 0;
R20_ = 16;
do {
R18_ = 16;
R26_ = R24_ & 0x7E0;
R28_ = R24_ & 0x1F;
g_word_7E001E = 0;
do {
if (!sign16(g_word_7E001E + R28_ - 32)) {
R26_ = (R26_ + 1024) & 0x7E0;
R28_ = 0;
g_word_7E001E = 0;
}
uint16 v0 = g_word_7E001E + R28_ + R26_;
uint16 v11 = ram4000.xray_tilemaps[v0 + 4096];
uint16 v10 = ram4000.xray_tilemaps[v0 + 4097];
uint16 v9 = ram4000.xray_tilemaps[v0 + 4128];
uint16 v1 = ram4000.xray_tilemaps[v0 + 4129];
uint16 v2 = R22_;
v3 = R22_;
*(uint16 *)((char *)&ram4000.xray_tilemaps[33] + R22_) = v1;
*(uint16 *)((char *)&ram4000.xray_tilemaps[32] + v3) = v9;
*(uint16 *)((char *)&ram4000.xray_tilemaps[1] + v2) = v10;
*(uint16 *)((char *)ram4000.xray_tilemaps + v2) = v11;
R22_ += 4;
g_word_7E001E += 2;
--R18_;
} while (R18_);
Xray_SetupStage4_Func1();
R32 = R24_ & 0x400;
R24_ = (R24_ & 0x400) + ((R24_ + 64) & 0x3FF);
R22_ += 64;
--R20_;
} while (R20_);
assert((uint16)(layer1_y_pos >> 12) == 0);
uint16 prod = Mult8x8(layer1_y_pos >> 4, room_width_in_blocks);
v6 = layer1_x_pos >> 4;
R34 = prod + v6;
R22_ = 0;
R20_ = 16;
do {
Xray_SetupStage4_Func2();
R18_ = 16;
R36 = R34;
do {
Xray_SetupStage4_Func3();
--R18_;
} while (R18_);
uint16 v12 = R22_;
R22_ += 1984;
Xray_SetupStage4_Func3();
R22_ = v12 + 64;
R34 += room_width_in_blocks;
--R20_;
} while (R20_);
LoadXrayBlocks();
uint16 v7 = vram_read_queue_tail;
v8 = vram_read_queue_tail;
*(uint16 *)((char *)&vram_read_queue[0].vram_target + vram_read_queue_tail) = (reg_BG2SC & 0xFC) << 8;
*(uint16 *)((char *)&vram_read_queue[0].dma_parameters + v8) = 129;
*(uint16 *)((char *)&vram_read_queue[0].dma_parameters + v7 + 1) = 57;
*(VoidP *)((char *)&vram_read_queue[0].src.addr + v7) = 0x5000;
*(uint16 *)(&vram_read_queue[0].src.bank + v7) = 126;
*(uint16 *)((char *)&vram_read_queue[0].size + v7) = 2048;
vram_read_queue_tail = v7 + 9;
}
void Xray_SetupStage4_Func1(void) { // 0x91CCF1
int16 v0;
R32 = R26_;
v0 = g_word_7E001E + R28_;
if (!sign16(g_word_7E001E + R28_ - 32)) {
R32 = (R32 + 1024) & 0x7E0;
v0 = 0;
}
uint16 v1 = R32 + v0;
uint16 v6 = ram4000.xray_tilemaps[v1 + 4096];
uint16 v5 = ram4000.xray_tilemaps[v1 + 4097];
uint16 v4 = ram4000.xray_tilemaps[v1 + 4128];
uint16 v3 = ram4000.xray_tilemaps[v1 + 4129];
uint16 v2 = R22_ + 1984;
*(uint16 *)((char *)&ram4000.xray_tilemaps[33] + (uint16)(R22_ + 1984)) = v3;
*(uint16 *)((char *)&ram4000.xray_tilemaps[32] + v2) = v4;
*(uint16 *)((char *)&ram4000.xray_tilemaps[1] + v2) = v5;
*(uint16 *)((char *)ram4000.xray_tilemaps + v2) = v6;
}
void Xray_SetupStage4_Func2(void) { // 0x91CD42
// bug: passing 0xffff to this function is invalid and will read invalid memory.
if (R34 == 0)
return;
unsigned int v2;
int16 v3;
unsigned int v7;
unsigned int v11;
int16 v17;
PairU16 pay = Xray_HandleXrayedBlock(R34 - 1);
uint16 v1 = pay.k;
v2 = pay.j;
v3 = v2;
if (v1 != (uint16)FUNC16(Xray_Func9)) {
if (v1 != (uint16)FUNC16(Xray_Func11))
return;
v17 = v2;
uint16 v4 = *(uint16 *)&RomPtr_91(R3_.addr)[(uint16)(v2 + 8)];
uint16 top_left = tile_table.tables[v4].top_left;
uint16 top_right = tile_table.tables[v4].top_right;
uint16 bottom_left = tile_table.tables[v4].bottom_left;
uint16 bottom_right = tile_table.tables[v4].bottom_right;
uint16 v6 = R22_;
v7 = R22_;
*(uint16 *)((char *)&ram4000.xray_tilemaps[97] + R22_) = bottom_right;
*(uint16 *)((char *)&ram4000.xray_tilemaps[96] + v7) = bottom_left;
*(uint16 *)((char *)&ram4000.xray_tilemaps[65] + v6) = top_right;
*(uint16 *)((char *)&ram4000.xray_tilemaps[64] + v6) = top_left;
v3 = v17;
}
uint16 v8 = *(uint16 *)&RomPtr_91(R3_.addr)[(uint16)(v3 + 4)];
uint16 v18 = tile_table.tables[v8].top_left;
uint16 v16 = tile_table.tables[v8].top_right;
uint16 v14 = tile_table.tables[v8].bottom_left;
uint16 v9 = tile_table.tables[v8].bottom_right;
uint16 v10 = R22_;
v11 = R22_;
*(uint16 *)((char *)&ram4000.xray_tilemaps[33] + R22_) = v9;
*(uint16 *)((char *)&ram4000.xray_tilemaps[32] + v11) = v14;
*(uint16 *)((char *)&ram4000.xray_tilemaps[1] + v10) = v16;
*(uint16 *)((char *)ram4000.xray_tilemaps + v10) = v18;
}
void CallXrayFunc(uint32 ea, uint16 j) {
switch (ea) {
case fnXray_Func6: Xray_Func6(); return;
case fnXray_Func6B: Xray_Func6B(); return;
case fnXray_Func7: Xray_Func7(j); return;
case fnXray_Func9: Xray_Func9(j); return;
case fnXray_Func10: Xray_Func10(j); return;
case fnXray_Func11: Xray_Func11(j); return;
default: Unreachable();
}
}
void Xray_SetupStage4_Func3(void) { // 0x91CDBE
PairU16 v0;
v0 = Xray_HandleXrayedBlock(R36);
if (v0.k == 0xFFFF)
Xray_Func21(v0.j);
else
CallXrayFunc(R0_.addr | 0x910000, v0.j);
}
uint16 Xray_Func21(uint16 j) { // 0x91CDCB
R22_ += 4;
++R36;
return j;
}
#define stru_91D2D6 ((XrayBlockData*)RomPtr(0x91d2d6))
PairU16 Xray_HandleXrayedBlock(uint16 k) { // 0x91CDD6
VoidP value;
uint16 j;
R38 = BTS[k];
R40 = level_data[k] & 0xF000;
for (int i = 0; ; ++i) {
value = stru_91D2D6[i].value;
if (value == 0xFFFF)
break;
if (value == R40) {
R0_.addr = stru_91D2D6[i].addr;
for (j = 0; ; j += 4) {
value = *(uint16 *)&RomPtr_91(R0_.addr)[j];
if (value == 0xFFFF)
break;
if (value == 0xFF00 || value == R38) {
R3_.addr = *(uint16 *)&RomPtr_91(R0_.addr)[(uint16)(j + 2)];
j = 0;
value = *(uint16 *)RomPtr_91(R3_.addr);
R0_.addr = value;
return MakePairU16(value, j);
}
}
return MakePairU16(value, j);
}
}
return MakePairU16(value, 0);
}
void Xray_SomeDivide(void) { // 0x91CE2C
R44 = R36 / room_width_in_blocks;
R42 = R36 % room_width_in_blocks;
}
uint16 Xray_Func5(void) { // 0x91CE51
uint16 v1 = R42;
uint16 RegWord = room_width_in_blocks * (uint8)R44;
R46 = BTS[(uint16)(RegWord + v1)];
R48 = level_data[RegWord + v1] & 0xF000;
return R48;
}
void Xray_Func6(void) { // 0x91CE79
Xray_SomeDivide();
R48 = R40;
uint16 v0 = R38;
if (R38) {
if ((R38 & 0x80) != 0)
v0 = R38 | 0xFF00;
R46 = v0;
Xray_Func6D();
} else {
Xray_Func20();
}
}
void Xray_Func6D(void) { // 0x91CE8E
uint16 v1;
do {
do {
if ((int16)(R46 + R44) < 0) {
Xray_Func13(0xFFu);
Xray_Func21(0);
return;
}
R44 += R46;
v1 = Xray_Func5();
} while (v1 == 0xD000);
if (v1 != 20480) {
Xray_Func20();
return;
}
} while ((R46 & 0x80) == 0);
R46 = (uint8)R46 ^ 0xFF00;
Xray_Func6C();
}
void Xray_Func6B(void) { // 0x91CEBB
Xray_SomeDivide();
R48 = R40;
uint16 v0 = R38;
if (R38) {
if ((R38 & 0x80) != 0)
v0 = R38 | 0xFF00;
R46 = v0;
Xray_Func6C();
} else {
Xray_Func20();
}
}
void Xray_Func6C(void) { // 0x91CED0
while (1) {
if ((int16)(R46 + R42) < 0) {
Xray_Func13(0xFFu);
Xray_Func21(0); // ??
return;
}
R42 += R46;
uint16 v1 = Xray_Func5();
if (v1 == 0xD000) {
Xray_Func6D();
return;
}
if (v1 != 20480)
break;
if ((R46 & 0x80) != 0)
R46 = (uint8)R46 ^ 0xFF00;
}
Xray_Func20();
}
#define stru_91D2D6 ((XrayBlockData*)RomPtr(0x91d2d6))
void Xray_Func20(void) { // 0x91CEFD
int i;
int16 v1;
if (stru_91D2D6[1].value == R48) {
R0_.addr = stru_91D2D6[1].addr;
for (i = 0; ; i += 4) {
v1 = *(uint16 *)&RomPtr_91(R0_.addr)[i];
if (v1 == -1)
break;
if (v1 == -256 || v1 == R46) {
R3_.addr = *(uint16 *)&RomPtr_91(R0_.addr)[(uint16)(i + 2)] + 2;
Xray_Func12(0);
Xray_Func21(0);
return;
}
}
}
Xray_Func21(i);
}
uint16 Xray_Func7(uint16 j) { // 0x91CF36
uint16 v1 = j + 2;
Xray_Func12(v1);
return Xray_Func21(v1);
}
uint16 Xray_Func8(uint16 j) { // 0x91CF3E
uint16 v1 = j + 2;
if (area_index == 1)
Xray_Func12(v1);
return Xray_Func21(v1);
}
uint16 Xray_Func9(uint16 j) { // 0x91CF4E
uint16 v1 = j + 2;
Xray_Func12(v1);
if (R18_ != 1) {
v1 += 2;
Xray_Func14(v1);
}
return Xray_Func21(v1);
}
uint16 Xray_Func10(uint16 j) { // 0x91CF62
uint16 v1 = j + 2;
Xray_Func12(v1);
v1 += 2;
Xray_Func15(v1);
return Xray_Func21(v1);
}
uint16 Xray_Func11(uint16 j) { // 0x91CF6F
unsigned int v8;
uint16 v1 = j + 2;
Xray_Func12(v1);
uint16 v2 = v1 + 2;
if (R18_ != 1)
Xray_Func14(v2);
uint16 v3 = v2 + 2;
Xray_Func15(v3);
uint16 v4 = v3 + 2;
if (R18_ != 1) {
uint16 v5 = *(uint16 *)&RomPtr_91(R3_.addr)[v4];
uint16 top_left = tile_table.tables[v5].top_left;
uint16 top_right = tile_table.tables[v5].top_right;
uint16 bottom_left = tile_table.tables[v5].bottom_left;
uint16 bottom_right = tile_table.tables[v5].bottom_right;
uint16 v7 = R22_;
v8 = R22_;
*(uint16 *)((char *)&ram4000.xray_tilemaps[99] + R22_) = bottom_right;
*(uint16 *)((char *)&ram4000.xray_tilemaps[98] + v8) = bottom_left;
*(uint16 *)((char *)&ram4000.xray_tilemaps[67] + v7) = top_right;
*(uint16 *)((char *)&ram4000.xray_tilemaps[66] + v7) = top_left;
}
return Xray_Func21(v4);
}
void Xray_Func12(uint16 j) { // 0x91CFBF
uint8 *v1 = RomPtr_91(R3_.addr);
Xray_Func13(*(uint16 *)&v1[j]);
}
void Xray_Func13(uint16 a) { // 0x91CFC1
unsigned int v3;
uint16 v1 = a;
uint16 top_left = tile_table.tables[v1].top_left;
uint16 top_right = tile_table.tables[v1].top_right;
uint16 bottom_left = tile_table.tables[v1].bottom_left;
uint16 v2 = R22_;
v3 = R22_;
*(uint16 *)((char *)&ram4000.xray_tilemaps[33] + R22_) = tile_table.tables[v1].bottom_right;
*(uint16 *)((char *)&ram4000.xray_tilemaps[32] + v3) = bottom_left;
*(uint16 *)((char *)&ram4000.xray_tilemaps[1] + v2) = top_right;
*(uint16 *)((char *)ram4000.xray_tilemaps + v2) = top_left;
}
void Xray_Func14(uint16 j) { // 0x91CFEE
unsigned int v4;
uint16 v1 = *(uint16 *)&RomPtr_91(R3_.addr)[j];
uint16 top_left = tile_table.tables[v1].top_left;
uint16 top_right = tile_table.tables[v1].top_right;
uint16 bottom_left = tile_table.tables[v1].bottom_left;
uint16 bottom_right = tile_table.tables[v1].bottom_right;
uint16 v3 = R22_;
v4 = R22_;
*(uint16 *)((char *)&ram4000.xray_tilemaps[35] + R22_) = bottom_right;
*(uint16 *)((char *)&ram4000.xray_tilemaps[34] + v4) = bottom_left;
*(uint16 *)((char *)&ram4000.xray_tilemaps[3] + v3) = top_right;
*(uint16 *)((char *)&ram4000.xray_tilemaps[2] + v3) = top_left;
}
void Xray_Func15(uint16 j) { // 0x91D01D
unsigned int v4;
uint16 v1 = *(uint16 *)&RomPtr_91(R3_.addr)[j];
uint16 top_left = tile_table.tables[v1].top_left;
uint16 top_right = tile_table.tables[v1].top_right;
uint16 bottom_left = tile_table.tables[v1].bottom_left;
uint16 bottom_right = tile_table.tables[v1].bottom_right;
uint16 v3 = R22_;
v4 = R22_;
*(uint16 *)((char *)&ram4000.xray_tilemaps[97] + R22_) = bottom_right;
*(uint16 *)((char *)&ram4000.xray_tilemaps[96] + v4) = bottom_left;
*(uint16 *)((char *)&ram4000.xray_tilemaps[65] + v3) = top_right;
*(uint16 *)((char *)&ram4000.xray_tilemaps[64] + v3) = top_left;
}
void LoadBlockToXrayTilemap(uint16 a, uint16 k, uint16 j) { // 0x91D04C
R40 = a;
R24_ = layer1_x_pos >> 4;
if ((int16)(k - (layer1_x_pos >> 4)) >= 0) {
R24_ = k - (layer1_x_pos >> 4);
if ((((__PAIR32__(k - (layer1_x_pos >> 4), k) - ((layer1_x_pos >> 4) | 0x100000)) >> 16) & 0x8000u) != 0) {
R26_ = layer1_y_pos >> 4;
if ((int16)(j - (layer1_y_pos >> 4)) >= 0) {
R26_ = j - (layer1_y_pos >> 4);
if ((((__PAIR32__(j - (layer1_y_pos >> 4), j) - ((layer1_y_pos >> 4) | 0x100000)) >> 16) & 0x8000u) != 0) {
R22_ = 4 * (R24_ + 32 * R26_);
if ((R40 & 0x800) != 0)
Xray_Func16(R40 & 0x3FF);
else
Xray_Func13(R40 & 0x3FF);
}
}
}
}
}
void Xray_Func16(uint16 a) { // 0x91D0A6
unsigned int v3;
uint16 v1 = a;
uint16 top_left = tile_table.tables[v1].top_left;
uint16 top_right = tile_table.tables[v1].top_right;
uint16 bottom_left = tile_table.tables[v1].bottom_left;
uint16 v2 = R22_;
v3 = R22_;
*(uint16 *)((char *)&ram4000.xray_tilemaps[1] + R22_) = tile_table.tables[v1].bottom_right;
*(uint16 *)((char *)ram4000.xray_tilemaps + v3) = bottom_left;
*(uint16 *)((char *)&ram4000.xray_tilemaps[33] + v2) = top_right;
*(uint16 *)((char *)&ram4000.xray_tilemaps[32] + v2) = top_left;
}
void Xray_SetupStage5(void) { // 0x91D0D3
unsigned int v1;
if (CanXrayShowBlocks()) {
if (earthquake_timer) {
reg_BG1HOFS = layer1_x_pos + bg1_x_offset;
reg_BG1VOFS = layer1_y_pos + bg1_y_offset;
}
reg_BG2HOFS = reg_BG1HOFS & 0xF;
reg_BG2VOFS = reg_BG1VOFS & 0xF;
reg_BG2SC = 73;
}
uint16 v0 = vram_read_queue_tail;
v1 = vram_read_queue_tail;
*(uint16 *)((char *)&vram_read_queue[0].vram_target + vram_read_queue_tail) = ((reg_BG2SC & 0xFC) << 8) + 1024;
*(uint16 *)((char *)&vram_read_queue[0].dma_parameters + v1 + 1) = 57;
*(VoidP *)((char *)&vram_read_queue[0].src.addr + v0) = 0x5800;
*(uint16 *)(&vram_read_queue[0].src.bank + v0) = 126;
*(uint16 *)((char *)&vram_read_queue[0].size + v0) = 2048;
vram_read_queue_tail = v0 + 9;
}
bool CanXrayShowBlocks(void) { // 0x91D143
if (room_ptr == addr_kRoom_a66a || room_ptr == addr_kRoom_cefb)
return false;
if (fx_type == 0x24)
return false;
if (boss_id == 3 || boss_id == 6 || boss_id == 7 || boss_id == 8 || boss_id == 10)
return false;
return true;
}
void Xray_SetupStage6(void) { // 0x91D173
VramWriteEntry *v1;
if (CanXrayShowBlocks()) {
uint16 v0 = vram_write_queue_tail;
v1 = gVramWriteEntry(vram_write_queue_tail);
v1->size = 2048;
v1->src.addr = ADDR16_OF_RAM(ram4000);
*(uint16 *)&v1->src.bank = 126;
v1->vram_dst = (reg_BG2SC & 0xFC) << 8;
vram_write_queue_tail = v0 + 7;
}
}
void Xray_SetupStage7(void) { // 0x91D1A0
VramWriteEntry *v1;
if (CanXrayShowBlocks()) {
uint16 v0 = vram_write_queue_tail;
v1 = gVramWriteEntry(vram_write_queue_tail);
v1->size = 2048;
v1->src.addr = 0x4800;
*(uint16 *)&v1->src.bank = 126;
v1->vram_dst = ((reg_BG2SC & 0xFC) << 8) + 1024;
vram_write_queue_tail = v0 + 7;
}
mov24((LongPtr *)&demo_enable, 0x9800E4);
mov24((LongPtr *)((char *)&demo_num_input_frames + 1), 0x98C8E4u);
mov24((LongPtr *)&demo_input_prev_new, 0x999098u);
*(uint16 *)((char *)&demo_backup_prev_controller_input + 1) = 0;
demo_input_pre_instr = 0;
demo_input_instr_timer = 0;
demo_input_instr_ptr = 0;
demo_input = 0;
demo_input_new = 0;
if (samus_pose_x_dir == 4)
xray_angle = 192;
else
xray_angle = 64;
}
void HdmaobjPreInstr_XraySetup(uint16 k) { // 0x91D27F
int16 v1;
v1 = 4096;
if (fx_type == 36) {
if (!sign16((reg_COLDATA[0] & 0x1F) - 7))
goto LABEL_5;
goto LABEL_4;
}
v1 = 0x2000;
if (CanXrayShowBlocks()) {
v1 = 0x4000;
LABEL_4:
*(uint16 *)&reg_COLDATA[0] = 0x27;
*(uint16 *)&reg_COLDATA[1] = 0x47;
*(uint16 *)&reg_COLDATA[2] = 0x87;
}
LABEL_5:
fx_layer_blending_config_c |= v1;
}
void Xray_SetupStage8_SetBackdropColor(void) { // 0x91D2BC
palette_buffer[0] = 3171;
}
void sub_91D2D1(void) { // 0x91D2D1
;
}
void GameState_28_Unused_(void) { // 0x91D4DA
Unreachable();
}
void VariaSuitPickup(void) { // 0x91D4E4
suit_pickup_color_math_R = 48;
suit_pickup_color_math_G = 80;
suit_pickup_color_math_B = 0x80;
suit_pickup_palette_transition_color = 0;
Samus_CancelSpeedBoost();
samus_x_extra_run_speed = 0;
samus_x_extra_run_subspeed = 0;
samus_x_base_speed = 0;
samus_x_base_subspeed = 0;
samus_y_subspeed = 0;
samus_y_speed = 0;
samus_y_dir = 0;
used_for_ball_bounce_on_landing = 0;
samus_x_accel_mode = 0;
elevator_status = 0;
substate = 0;
suit_pickup_light_beam_pos = 0;
suit_pickup_light_beam_widening_speed = 256;
for (int i = 510; i >= 0; i -= 2)
hdma_table_1[i >> 1] = 255;
if (samus_movement_type == 3 || samus_movement_type == 20)
QueueSfx1_Max9(0x32u);
if ((equipped_items & 0x20) != 0)
samus_pose = kPose_9B_FaceF_VariaGravitySuit;
else
samus_pose = kPose_00_FaceF_Powersuit;
SamusFunc_F433();
Samus_SetAnimationFrameIfPoseChanged();
CallSomeSamusCode(0x15u);
samus_x_pos = layer1_x_pos + 120;
samus_prev_x_pos = layer1_x_pos + 120;
samus_y_pos = layer1_y_pos + 136;
samus_prev_y_pos = layer1_y_pos + 136;
QueueSfx2_Max6(0x56u);
static const SpawnHdmaObject_Args unk_91D59B = { 0x41, 0x26, 0xd5a2 };
SpawnHdmaObject(0x91, &unk_91D59B);
}
void GravitySuitPickup(void) { // 0x91D5BA
suit_pickup_color_math_R = 48;
suit_pickup_color_math_G = 73;
suit_pickup_color_math_B = -112;
suit_pickup_palette_transition_color = 1;
Samus_CancelSpeedBoost();
samus_x_extra_run_speed = 0;
samus_x_extra_run_subspeed = 0;
samus_x_base_speed = 0;
samus_x_base_subspeed = 0;
samus_y_subspeed = 0;
samus_y_speed = 0;
samus_y_dir = 0;
used_for_ball_bounce_on_landing = 0;
samus_x_accel_mode = 0;
elevator_status = 0;
substate = 0;
suit_pickup_light_beam_pos = 0;
suit_pickup_light_beam_widening_speed = 256;
for (int i = 510; i >= 0; i -= 2)
hdma_table_1[i >> 1] = 255;
if (samus_movement_type == kMovementType_03_SpinJumping || samus_movement_type == kMovementType_14_WallJumping)
QueueSfx1_Max9(0x32u);
if ((equipped_items & 1) != 0)
samus_pose = kPose_9B_FaceF_VariaGravitySuit;
else
samus_pose = kPose_00_FaceF_Powersuit;
SamusFunc_F433();
Samus_SetAnimationFrameIfPoseChanged();
CallSomeSamusCode(0x15u);
samus_x_pos = layer1_x_pos + 120;
samus_prev_x_pos = layer1_x_pos + 120;
samus_y_pos = layer1_y_pos + 136;
samus_prev_y_pos = layer1_y_pos + 136;
QueueSfx2_Max6(0x56u);
static const SpawnHdmaObject_Args unk_91D673 = { 0x41, 0x26, 0xd67a };
SpawnHdmaObject(0x91, &unk_91D673);
}
void InitializeSuitPickupHdma(void) { // 0x91D692
reg_TM = 19;
reg_TMW = 19;
reg_TS = 4;
reg_TSW = 4;
next_gameplay_CGWSEL = 16;
reg_W12SEL = 0;
reg_W34SEL = 2;
reg_WOBJSEL = 32;
next_gameplay_CGADSUB = 51;
reg_COLDATA[0] = suit_pickup_color_math_R;
reg_COLDATA[1] = suit_pickup_color_math_G;
reg_COLDATA[2] = suit_pickup_color_math_B;
mov24((LongPtr *)&demo_enable, 0x9800E4u);
mov24((LongPtr *)((char *)&demo_num_input_frames + 1), 0x98C8E4u);
mov24((LongPtr *)&demo_input_prev_new, 0x999098u);
*(uint16 *)((char *)&demo_backup_prev_controller_input + 1) = 0;
}
#define off_91D727 ((uint16*)RomPtr(0x91d727))
static Func_U8 *const off_91D72D[11] = { // 0x91D6F7
Samus_HandleScrewAttackSpeedBoostingPals,
Samus_SpeedBoosterShinePals,
(Func_U8 *)HandleMiscSamusPalette,
0,
0,
0,
Samus_HandleShinesparkingPals,
Samus_HandleCrystalFlashPals,
Samus_HandleXrayPals,
HandleVisorPalette,
nullsub_164,
};
void Samus_HandlePalette(void) {
if ((samus_special_super_palette_flags & 0x8000u) == 0
&& (HandleBeamChargePalettes() & 1
|| !(off_91D72D[timer_for_shine_timer]() & 1))) {
CopyToSamusSuitPalette(off_91D727[samus_suit_palette_index >> 1]);
}
HandleMiscSamusPalette();
}
#define kSamusPalette_HyperBeam ((uint16*)RomPtr(0x91d829))
#define kSamusPalette_NonPseudoScrew ((uint16*)RomPtr(0x91d7d5))
#define kSamusPalette_PseudoScrew ((uint16*)RomPtr(0x91d7ff))
uint8 HandleBeamChargePalettes(void) { // 0x91D743
if (charged_shot_glow_timer) {
if (hyper_beam_flag) {
if ((charged_shot_glow_timer & 1) == 0) {
if ((charged_shot_glow_timer & 0x1E) == 0) {
charged_shot_glow_timer = 0;
return 1;
}
CopyToSamusSuitPalette(kSamusPalette_HyperBeam[(uint8)(charged_shot_glow_timer & 0x1E) >> 1]);
}
--charged_shot_glow_timer;
return 0;
}
if (--charged_shot_glow_timer) {
for (int i = 28; i >= 0; i -= 2)
palette_buffer[(i >> 1) + 193] = 1023;
return 0;
} else {
return 1;
}
} else if (grapple_beam_function == (uint16)FUNC16(GrappleBeamFunc_Inactive)
&& flare_counter
&& !sign16(flare_counter - 60)) {
if (samus_contact_damage_index == 4)
R36 = kSamusPalette_PseudoScrew[samus_suit_palette_index >> 1];
else
R36 = kSamusPalette_NonPseudoScrew[samus_suit_palette_index >> 1];
uint16 v0 = *(uint16 *)RomPtr_91(R36 + samus_charge_palette_index);
CopyToSamusSuitPalette(v0);
uint16 v1 = samus_charge_palette_index + 2;
if (!sign16(samus_charge_palette_index - 10))
v1 = 0;
samus_charge_palette_index = v1;
return 0;
} else {
samus_charge_palette_index = 0;
return HandleVisorPalette();
}
}
#define word_9BA3C0 ((uint16*)RomPtr(0x9ba3c0))
uint8 HandleVisorPalette(void) { // 0x91D83F
int16 v2;
uint16 v3;
char v4; // t0
if (timer_for_shine_timer == 8)
return 0;
if (fx_layer_blending_config_a == 40 || fx_layer_blending_config_a == 42) {
uint16 v1 = samus_visor_palette_timer_index - 1;
samus_visor_palette_timer_index = v1;
if ((uint8)v1)
return 0;
samus_visor_palette_timer_index = v1 | 5;
palette_buffer[196] = word_9BA3C0[(uint16)((uint16)(v1 | 5) >> 8) >> 1];
v2 = ((uint16)(v1 | 5) >> 8) + 2;
if (sign16(v2 - 12)) {
v4 = v2;
LOBYTE(v3) = HIBYTE(v2);
HIBYTE(v3) = v4;
R18_ = v3;
samus_visor_palette_timer_index = v3 | (uint8)samus_visor_palette_timer_index;
} else {
samus_visor_palette_timer_index = (uint8)samus_visor_palette_timer_index | 0x600;
}
return 0;
} else {
samus_visor_palette_timer_index = 1537;
return 0;
}
}
#define kSamus_SpeedBoostingPalettes ((uint16*)RomPtr(0x91d998))
#define kSamus_HyperBeamPalettes ((uint16*)RomPtr(0x91d99e))
void HandleMiscSamusPalette(void) { // 0x91D8A5
if (!samus_special_super_palette_flags) {
uint16 v0 = samus_hurt_flash_counter;
if (!samus_hurt_flash_counter)
return;
if (samus_hurt_flash_counter == 2) {
if (!cinematic_function
&& (frame_handler_beta != (uint16)FUNC16(j_HandleDemoRecorder_2_0)
|| samus_pose != kPose_54_FaceL_Knockback)) {
QueueSfx1_Max6(0x35u);
goto LABEL_14;
}
v0 = samus_hurt_flash_counter;
}
if (!sign16(v0 - 7))
goto LABEL_17;
if ((v0 & 1) != 0) {
CopyToSamusSuitPalette(addr_word_9BA380);
goto LABEL_17;
}
LABEL_14:
if (cinematic_function)
CopyToSamusSuitPalette(addr_word_9BA3A0);
else
Samus_LoadSuitPalette();
LABEL_17:;
uint16 v1 = samus_hurt_flash_counter + 1;
samus_hurt_flash_counter = v1;
if (v1 == 40) {
if (grapple_beam_function == (uint16)FUNC16(GrappleBeamFunc_Inactive)) {
if (samus_movement_type == kMovementType_03_SpinJumping || samus_movement_type == kMovementType_14_WallJumping) {
CallSomeSamusCode(0x1Cu);
} else if (!sign16(flare_counter - 16) && (button_config_shoot_x & joypad1_lastkeys) != 0) {
play_resume_charging_beam_sfx = 1;
}
} else if (sign16(grapple_beam_function + 0x37AA)) {
QueueSfx1_Max9(6u);
}
} else if (!sign16(v1 - 60)) {
samus_hurt_flash_counter = 0;
}
return;
}
if ((samus_special_super_palette_flags & 0x8000u) != 0) {
CopyToSamusSuitPalette(kSamus_HyperBeamPalettes[samus_charge_palette_index]);
bool v2 = (--special_samus_palette_timer & 0x8000u) != 0;
if (!special_samus_palette_timer || v2) {
special_samus_palette_timer = special_samus_palette_frame;
if (!sign16(++samus_charge_palette_index - 10))
samus_charge_palette_index = 0;
}
} else {
if ((samus_special_super_palette_flags & 1) != 0)
CopyToSamusSuitPalette(kSamus_SpeedBoostingPalettes[samus_suit_palette_index >> 1]);
else
Samus_LoadSuitPalette();
++samus_special_super_palette_flags;
}
}
#define kSamusPal_ScrewAttack ((uint16*)RomPtr(0x91da4a))
#define kSamusPal_SpeedBoost ((uint16*)RomPtr(0x91daa9))
uint8 Samus_HandleScrewAttackSpeedBoostingPals(void) { // 0x91D9B2
if ((samus_suit_palette_index & 4) == 0) {
Samus_GetTopBottomBoundary();
if ((fx_y_pos & 0x8000u) != 0) {
if ((lava_acid_y_pos & 0x8000u) == 0 && sign16(lava_acid_y_pos - R20_))
return 1;
} else if (sign16(fx_y_pos - R20_) && (fx_liquid_options & 4) == 0) {
return 1;
}
}
if (samus_movement_type == kMovementType_03_SpinJumping) {
if ((equipped_items & 8) == 0)
goto LABEL_10;
if (samus_anim_frame) {
if (!sign16(samus_anim_frame - 27))
return 0;
goto LABEL_18;
}
goto LABEL_21;
}
if (samus_movement_type == kMovementType_14_WallJumping) {
if ((equipped_items & 8) == 0)
return 1;
if (!sign16(samus_anim_frame - 3)) {
LABEL_18:
R36 = kSamusPal_ScrewAttack[samus_suit_palette_index >> 1];
uint16 v1 = *(uint16 *)RomPtr_91(R36 + special_samus_palette_frame);
CopyToSamusSuitPalette(v1);
uint16 v2 = special_samus_palette_frame + 2;
if (!sign16(special_samus_palette_frame - 10))
v2 = 0;
special_samus_palette_frame = v2;
return 1;
}
LABEL_21:
special_samus_palette_frame = 0;
return 1;
}
LABEL_10:
if ((speed_boost_counter & 0xFF00) != 1024)
return 1;
bool v3 = (--special_samus_palette_timer & 0x8000u) != 0;
if (!special_samus_palette_timer || v3) {
special_samus_palette_timer = 4;
R36 = kSamusPal_SpeedBoost[samus_suit_palette_index >> 1];
uint16 v4 = *(uint16 *)RomPtr_91(R36 + special_samus_palette_frame);
CopyToSamusSuitPalette(v4);
uint16 v5 = special_samus_palette_frame + 2;
if (!sign16(special_samus_palette_frame - 6))
v5 = 6;
special_samus_palette_frame = v5;
}
return 1;
}
#define kSamusPal_SpeedBoostShine ((uint16*)RomPtr(0x91db10))
uint8 Samus_SpeedBoosterShinePals(void) { // 0x91DAC7
uint16 v0 = samus_shine_timer;
if (samus_shine_timer == 170) {
uint16 v4 = samus_shine_timer;
QueueSfx3_Max9(0xCu);
v0 = v4;
}
samus_shine_timer = v0 - 1;
if ((int16)(v0 - 1) <= 0) {
special_samus_palette_frame = 0;
timer_for_shine_timer = 0;
return 0;
} else {
R36 = kSamusPal_SpeedBoostShine[samus_suit_palette_index >> 1];
uint16 v1 = *(uint16 *)RomPtr_91(R36 + special_samus_palette_frame);
CopyToSamusSuitPalette(v1);
uint16 v2 = special_samus_palette_frame + 2;
if (!sign16(special_samus_palette_frame - 10))
v2 = 0;
special_samus_palette_frame = v2;
return 1;
}
}
#define kSamusPal_Shinespark ((uint16*)RomPtr(0x91db75))
uint8 Samus_HandleShinesparkingPals(void) { // 0x91DB3A
bool v0 = (--samus_shine_timer & 0x8000u) != 0;
if (!samus_shine_timer || v0) {
timer_for_shine_timer = 0;
special_samus_palette_frame = 0;
return 0;
} else {
R36 = kSamusPal_Shinespark[samus_suit_palette_index >> 1];
uint16 v1 = *(uint16 *)RomPtr_91(R36 + special_samus_palette_frame);
CopyToSamusSuitPalette(v1);
uint16 v2 = special_samus_palette_frame + 2;
if (!sign16(special_samus_palette_frame - 6))
v2 = 0;
special_samus_palette_frame = v2;
return 1;
}
}
#define stru_91DC00 ((SamusCrystalFlashPalTable*)RomPtr(0x91dc00))
#define off_91DC28 ((uint16*)RomPtr(0x91dc28))
uint8 Samus_HandleCrystalFlashPals(void) { // 0x91DB93
if ((samus_shine_timer & 0x8000u) != 0) {
WriteBeamPalette_A(equipped_beams);
timer_for_shine_timer = 0;
special_samus_palette_frame = 0;
special_samus_palette_timer = 0;
samus_shine_timer = 0;
return 0;
} else {
if ((int16)--samus_shine_timer <= 0) {
samus_shine_timer = 5;
Samus_Copy6PalColors(off_91DC28[special_samus_palette_frame >> 1]);
uint16 v0 = special_samus_palette_frame + 2;
if (!sign16(special_samus_palette_frame - 10))
v0 = 0;
special_samus_palette_frame = v0;
}
bool v1 = (int16)-- * (uint16 *)&suit_pickup_color_math_B < 0;
if (!*(uint16 *)&suit_pickup_color_math_B || v1) {
*(uint16 *)&suit_pickup_color_math_B = *(uint16 *)((char *)&stru_91DC00[0].timer + special_samus_palette_timer);
Samus_Copy10PalColors(*(VoidP *)((char *)&stru_91DC00[0].ptr + special_samus_palette_timer));
uint16 v2 = special_samus_palette_timer + 4;
if (!sign16(special_samus_palette_timer - 36))
v2 = 0;
special_samus_palette_timer = v2;
}
return 1;
}
}
void Samus_Copy10PalColors(uint16 v0) { // 0x91DC34
uint16 *v1 = (uint16 *)RomPtr_9B(v0);
palette_buffer[224] = *v1;
palette_buffer[225] = v1[1];
palette_buffer[226] = v1[2];
palette_buffer[227] = v1[3];
palette_buffer[228] = v1[4];
palette_buffer[229] = v1[5];
palette_buffer[230] = v1[6];
palette_buffer[231] = v1[7];
palette_buffer[232] = v1[8];
palette_buffer[233] = v1[9];
}
void Samus_Copy6PalColors(uint16 j) { // 0x91DC82
uint16 *v1 = (uint16 *)RomPtr_9B(j);
palette_buffer[234] = *v1;
palette_buffer[235] = v1[1];
palette_buffer[236] = v1[2];
palette_buffer[237] = v1[3];
palette_buffer[238] = v1[4];
palette_buffer[239] = v1[5];
}
uint8 Samus_HandleXrayPals(void) { // 0x91DCB4
if ((demo_timer_counter & 0x8000u) != 0) {
timer_for_shine_timer = 0;
special_samus_palette_frame = 0;
special_samus_palette_timer = 0;
demo_timer_counter = 0;
return 0;
} else {
if (!demo_timer_counter) {
if (sign16(demo_input_pre_instr - 2)) {
bool v0 = (--special_samus_palette_timer & 0x8000u) != 0;
if (!special_samus_palette_timer || v0) {
special_samus_palette_timer = 5;
palette_buffer[196] = word_9BA3C0[special_samus_palette_frame >> 1];
if (sign16(special_samus_palette_frame - 4))
special_samus_palette_frame += 2;
}
return 1;
}
special_samus_palette_frame = 6;
special_samus_palette_timer = 1;
demo_timer_counter = 1;
}
bool v2 = (--special_samus_palette_timer & 0x8000u) != 0;
if (special_samus_palette_timer && !v2)
return 1;
special_samus_palette_timer = 5;
palette_buffer[196] = word_9BA3C0[special_samus_palette_frame >> 1];
uint16 v3 = special_samus_palette_frame + 2;
if (!sign16(special_samus_palette_frame - 10))
v3 = 6;
special_samus_palette_frame = v3;
return 1;
}
}
uint8 nullsub_164(void) { // 0x91DD31
return 0;
}
void CopyToSamusSuitPalette(uint16 k) { // 0x91DD5B
uint16 *v1 = (uint16 *)RomPtr_9B(k);
palette_buffer[192] = *v1;
palette_buffer[193] = v1[1];
palette_buffer[194] = v1[2];
palette_buffer[195] = v1[3];
palette_buffer[196] = v1[4];
palette_buffer[197] = v1[5];
palette_buffer[198] = v1[6];
palette_buffer[199] = v1[7];
palette_buffer[200] = v1[8];
palette_buffer[201] = v1[9];
palette_buffer[202] = v1[10];
palette_buffer[203] = v1[11];
palette_buffer[204] = v1[12];
palette_buffer[205] = v1[13];
palette_buffer[206] = v1[14];
palette_buffer[207] = v1[15];
}
void CopyToSamusSuitTargetPalette(uint16 k) { // 0x91DDD7
uint16 *v1 = (uint16 *)RomPtr_9B(k);
target_palettes[192] = *v1;
target_palettes[193] = v1[1];
target_palettes[194] = v1[2];
target_palettes[195] = v1[3];
target_palettes[196] = v1[4];
target_palettes[197] = v1[5];
target_palettes[198] = v1[6];
target_palettes[199] = v1[7];
target_palettes[200] = v1[8];
target_palettes[201] = v1[9];
target_palettes[202] = v1[10];
target_palettes[203] = v1[11];
target_palettes[204] = v1[12];
target_palettes[205] = v1[13];
target_palettes[206] = v1[14];
target_palettes[207] = v1[15];
}
void Samus_CancelSpeedBoost(void) { // 0x91DE53
if (samus_has_momentum_flag) {
samus_has_momentum_flag = 0;
speed_boost_counter = 0;
special_samus_palette_frame = 0;
special_samus_palette_timer = 0;
if ((equipped_items & 0x20) != 0) {
CopyToSamusSuitPalette(addr_kSamusPalette_GravitySuit);
} else if ((equipped_items & 1) != 0) {
CopyToSamusSuitPalette(addr_kSamusPalette_VariaSuit);
} else {
CopyToSamusSuitPalette(addr_kSamusPalette_PowerSuit);
}
}
if ((speed_echoes_index & 0x8000u) == 0) {
speed_echoes_index = -1;
if (samus_pose_x_dir == 4) {
speed_echo_xspeed[0] = -8;
speed_echo_xspeed[1] = -8;
} else {
speed_echo_xspeed[0] = 8;
speed_echo_xspeed[1] = 8;
}
}
}
void Samus_LoadSuitPalette(void) { // 0x91DEBA
if ((equipped_items & 0x20) != 0) {
CopyToSamusSuitPalette(addr_kSamusPalette_GravitySuit);
} else if ((equipped_items & 1) != 0) {
CopyToSamusSuitPalette(addr_kSamusPalette_VariaSuit);
} else {
CopyToSamusSuitPalette(addr_kSamusPalette_PowerSuit);
}
}
void Samus_LoadSuitTargetPalette(void) { // 0x91DEE6
if ((equipped_items & 0x20) != 0) {
CopyToSamusSuitTargetPalette(addr_kSamusPalette_GravitySuit);
} else if ((equipped_items & 1) != 0) {
CopyToSamusSuitTargetPalette(addr_kSamusPalette_VariaSuit);
} else {
CopyToSamusSuitTargetPalette(addr_kSamusPalette_PowerSuit);
}
}
void Samus_RestoreHealth(uint16 a) { // 0x91DF12
R18_ = a;
uint16 v1 = a + samus_health;
samus_health = v1;
if ((int16)(v1 - samus_max_health) >= 0) {
uint16 v2 = samus_reserve_health + v1 - samus_max_health;
if ((int16)(v2 - samus_max_reserve_health) >= 0)
v2 = samus_max_reserve_health;
samus_reserve_health = v2;
if (v2) {
if (!reserve_health_mode)
reserve_health_mode = 1;
}
samus_health = samus_max_health;
}
}
void Samus_DealDamage(uint16 a) { // 0x91DF51
R18_ = a;
if ((a & 0x8000u) == 0) {
if (a != 300 && !time_is_frozen_flag) {
samus_health -= R18_;
if ((samus_health & 0x8000u) != 0)
samus_health = 0;
}
} else {
InvalidInterrupt_Crash();
}
}
void Samus_RestoreMissiles(uint16 a) { // 0x91DF80
uint16 v1 = samus_missiles + a;
samus_missiles = v1;
if ((int16)(v1 - samus_max_missiles) >= 0) {
R18_ = v1 - samus_max_missiles;
if (sign16(samus_max_missiles - 99)) {
samus_reserve_missiles += R18_;
if ((int16)(samus_reserve_missiles - samus_max_missiles) >= 0)
samus_reserve_missiles = samus_max_missiles;
} else {
samus_reserve_missiles += R18_;
if (!sign16(samus_reserve_missiles - 99))
samus_reserve_missiles = 99;
}
samus_missiles = samus_max_missiles;
}
}
void Samus_RestoreSuperMissiles(uint16 a) { // 0x91DFD3
uint16 v1 = samus_super_missiles + a;
samus_super_missiles = v1;
if ((int16)(v1 - samus_max_super_missiles) >= 0 && v1 != samus_max_super_missiles)
samus_super_missiles = samus_max_super_missiles;
}
void Samus_RestorePowerBombs(uint16 a) { // 0x91DFF0
uint16 v1 = samus_power_bombs + a;
samus_power_bombs = v1;
if ((int16)(v1 - samus_max_power_bombs) >= 0 && v1 != samus_max_power_bombs)
samus_power_bombs = samus_max_power_bombs;
}
void Samus_Initialize(void) { // 0x91E00D
static const uint16 word_909EAF = 0;
static const uint16 word_909EAD = 1;
static const uint16 word_909EB3 = 0;
static const uint16 word_909EB1 = 1;
static const uint16 word_909EA1 = 0x1c00;
static const uint16 word_909EA7 = 0;
R18_ = debug_invincibility;
uint16 v0 = 0xE0B;
do
*RomPtr_RAM(v0--) = 0;
while ((int16)(v0 - 0xA02) >= 0);
if (game_state != kGameState_40_TransitionToDemo) {
frame_handler_alfa = FUNC16(EmptyFunction);
if (loading_game_state == kGameState_34_CeresGoesBoom) {
frame_handler_beta = FUNC16(SetContactDamageIndexAndUpdateMinimap);
samus_draw_handler = FUNC16(SamusDrawHandler_Default);
samus_momentum_routine_index = -1;
samus_special_transgfx_index = 0;
samus_hurt_switch_index = 0;
Samus_LoadSuitPalette();
samus_input_handler = FUNC16(Samus_InputHandler_E913);
} else {
frame_handler_beta = FUNC16(Samus_Func16);
samus_draw_handler = FUNC16(SamusDrawHandler_Default);
samus_momentum_routine_index = 0;
samus_special_transgfx_index = 0;
samus_hurt_switch_index = 0;
samus_input_handler = FUNC16(Samus_InputHandler_E913);
debug_invincibility = R18_;
}
}
samus_new_pose = -1;
samus_new_pose_interrupted = -1;
samus_new_pose_transitional = -1;
if (area_index == 6)
frame_handler_gamma = FUNC16(Samus_Func3);
else
frame_handler_gamma = FUNC16(nullsub_152);
samus_movement_handler = FUNC16(Samus_MovementHandler_Normal);
UNUSED_word_7E0A5E = -2764;
samus_prev_health_for_flash = 50;
samus_visor_palette_timer_index = 1537;
uint16 v1 = 0;
do {
projectile_bomb_pre_instructions[v1 >> 1] = FUNC16(ProjPreInstr_Empty);
v1 += 2;
} while ((int16)(v1 - 20) < 0);
grapple_beam_function = FUNC16(GrappleBeamFunc_Inactive);
enable_horiz_slope_coll = 3;
samus_hurt_flash_counter = 0;
samus_special_super_palette_flags = 0;
absolute_moved_last_frame_x_fract = word_909EAF;
absolute_moved_last_frame_x = word_909EAD;
absolute_moved_last_frame_y_fract = word_909EB3;
absolute_moved_last_frame_y = word_909EB1;
for (int i = 510; i >= 0; i -= 2)
hdma_table_1[i >> 1] = 255;
samus_y_subaccel = word_909EA1;
samus_y_accel = word_909EA7;
fx_y_pos = -1;
lava_acid_y_pos = -1;
UpdateBeamTilesAndPalette();
cinematic_function = 0;
samus_pose = kPose_00_FaceF_Powersuit;
*(uint16 *)&samus_pose_x_dir = 0;
samus_prev_pose = 0;
*(uint16 *)&samus_prev_pose_x_dir = 0;
samus_last_different_pose = 0;
*(uint16 *)&samus_last_different_pose_x_dir = 0;
enemy_index_to_shake = -1;
hud_item_index = 0;
samus_auto_cancel_hud_item_index = 0;
samus_invincibility_timer = 0;
samus_knockback_timer = 0;
samus_hurt_flash_counter = 0;
debug_invincibility = 0;
if (game_state == kGameState_40_TransitionToDemo)
LoadDemoData();
samus_prev_health_for_flash = samus_health;
}
uint8 Xray_Initialize(void) { // 0x91E16D
static const uint8 byte_91E291[28] = {
1, 1, 0, 0, 0, 2, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0,
0, 0, 0, 0,
};
if (cooldown_timer == 7 && bomb_counter == 5 && samus_x_speed_divisor == 2
|| !sign16(samus_pose - kPose_A4_FaceR_LandJump)
&& (sign16(samus_pose - kPose_A8_FaceR_Grappling)
|| !sign16(samus_pose - kPose_E0_FaceR_LandJump_AimU) && sign16(samus_pose - kPose_E8_FaceR_Drained_CrouchFalling))
|| game_state != 8
|| power_bomb_explosion_status
|| samus_y_speed
|| samus_y_subspeed
|| !byte_91E291[samus_prev_movement_type]) {
return 0;
}
if (byte_91E291[samus_movement_type] == 1) {
if (samus_pose_x_dir == 4)
samus_new_pose_interrupted = kPose_D6_FaceL_Xray_Stand;
else
samus_new_pose_interrupted = kPose_D5_FaceR_Xray_Stand;
} else {
if (byte_91E291[samus_movement_type] != 2)
return 0;
if (samus_pose_x_dir == 4)
samus_new_pose_interrupted = kPose_DA_FaceL_Xray_Crouch;
else
samus_new_pose_interrupted = kPose_D9_FaceR_Xray_Crouch;
}
time_is_frozen_flag = 1;
samus_special_transgfx_index = 5;
for (int i = 510; i >= 0; i -= 2)
hdma_table_1[i >> 1] = 255;
DisableEnemyProjectiles();
DisablePLMs();
DisableAnimtiles();
DisablePaletteFx();
mov24((LongPtr *)&demo_enable, 0x980001);
*(uint16 *)((char *)&demo_num_input_frames + 1) = 0;
demo_input_prev = -26424;
mov24((LongPtr *)&demo_input_prev_new, 0x999098);
*(uint16 *)((char *)&demo_backup_prev_controller_input + 1) = 0;
demo_input_pre_instr = 0;
demo_input_instr_timer = 0;
demo_input_instr_ptr = 0;
demo_input = 0;
demo_input_new = 0;
if (samus_pose_x_dir == 4)
xray_angle = 192;
else
xray_angle = 64;
return 1;
}
void ResponsibleForXrayStandupGlitch(void) { // 0x91E2AD
if (samus_movement_type == kMovementType_05_Crouching) {
if (samus_pose_x_dir == 4)
samus_pose = kPose_28_FaceL_Crouch;
else
samus_pose = kPose_27_FaceR_Crouch;
} else if (samus_pose_x_dir == kPose_04_FaceL_AimU) {
samus_pose = kPose_02_FaceL_Normal;
} else {
samus_pose = kPose_01_FaceR_Normal;
}
SamusFunc_F433();
Samus_SetAnimationFrameIfPoseChanged();
samus_last_different_pose = samus_prev_pose;
*(uint16 *)&samus_last_different_pose_x_dir = *(uint16 *)&samus_prev_pose_x_dir;
samus_prev_pose = samus_pose;
*(uint16 *)&samus_prev_pose_x_dir = *(uint16 *)&samus_pose_x_dir;
samus_movement_handler = FUNC16(Samus_MovementHandler_Normal);
samus_input_handler = FUNC16(Samus_InputHandler_E913);
demo_timer_counter = -1;
R18_ = *(&kPoseParams[0].y_radius + (uint16)(8 * samus_pose)) - samus_y_radius;
if ((R18_ & 0x8000u) == 0) {
samus_y_pos -= R18_;
samus_prev_y_pos = samus_y_pos;
}
EnableEnemyProjectiles();
EnablePLMs();
EnableAnimtiles();
EnablePaletteFx();
}
void MakeSamusFaceForward(void) { // 0x91E3F6
if ((equipped_items & 0x20) != 0 || (equipped_items & 1) != 0)
samus_pose = kPose_9B_FaceF_VariaGravitySuit;
else
samus_pose = kPose_00_FaceF_Powersuit;
SamusFunc_F433();
Samus_SetAnimationFrameIfPoseChanged();
samus_last_different_pose = samus_prev_pose;
*(uint16 *)&samus_last_different_pose_x_dir = *(uint16 *)&samus_prev_pose_x_dir;
samus_prev_pose = samus_pose;
*(uint16 *)&samus_prev_pose_x_dir = *(uint16 *)&samus_pose_x_dir;
if (samus_y_radius != 24) {
samus_y_pos -= 3;
samus_prev_y_pos = samus_y_pos;
}
frame_handler_alfa = FUNC16(Samus_FrameHandlerAlfa_Func13);
frame_handler_beta = FUNC16(SetContactDamageIndexAndUpdateMinimap);
samus_new_pose = -1;
samus_new_pose_interrupted = -1;
samus_new_pose_transitional = -1;
samus_momentum_routine_index = 0;
samus_special_transgfx_index = 0;
samus_hurt_switch_index = 0;
CallSomeSamusCode(0x1Fu);
samus_x_extra_run_speed = 0;
samus_x_extra_run_subspeed = 0;
samus_x_base_speed = 0;
samus_x_base_subspeed = 0;
samus_y_subspeed = 0;
samus_y_speed = 0;
samus_y_dir = 0;
used_for_ball_bounce_on_landing = 0;
samus_x_accel_mode = 0;
flare_counter = 0;
flare_animation_frame = 0;
flare_slow_sparks_anim_frame = 0;
flare_fast_sparks_anim_frame = 0;
flare_animation_timer = 0;
flare_slow_sparks_anim_timer = 0;
flare_fast_sparks_anim_timer = 0;
Samus_LoadSuitPalette();
}
static Func_U8 *const kSomeMotherBrainScripts[5] = { // 0x91E4AD
SomeMotherBrainScripts_0,
SomeMotherBrainScripts_1,
SomeMotherBrainScripts_2,
SomeMotherBrainScripts_3_EnableHyperBeam,
SomeMotherBrainScripts_4,
};
void SomeMotherBrainScripts(uint16 a) {
if (kSomeMotherBrainScripts[a]() & 1) {
samus_last_different_pose = samus_prev_pose;
*(uint16 *)&samus_last_different_pose_x_dir = *(uint16 *)&samus_prev_pose_x_dir;
samus_prev_pose = samus_pose;
*(uint16 *)&samus_prev_pose_x_dir = *(uint16 *)&samus_pose_x_dir;
samus_new_pose = -1;
samus_new_pose_interrupted = -1;
samus_new_pose_transitional = -1;
samus_momentum_routine_index = 0;
samus_special_transgfx_index = 0;
samus_hurt_switch_index = 0;
}
}
uint8 SomeMotherBrainScripts_0(void) { // 0x91E4F8
R18_ = 21 - samus_y_radius;
samus_y_pos -= 21 - samus_y_radius;
samus_prev_y_pos = samus_y_pos;
if (samus_pose_x_dir == 4)
samus_pose = kPose_E9_FaceL_Drained_CrouchFalling;
else
samus_pose = kPose_E8_FaceR_Drained_CrouchFalling;
samus_anim_frame_skip = 2;
SamusFunc_F433();
Samus_SetAnimationFrameIfPoseChanged();
samus_y_radius = *(&kPoseParams[0].y_radius + (uint16)(8 * samus_pose));
samus_x_base_speed = 0;
samus_x_base_subspeed = 0;
samus_y_subspeed = 0;
samus_y_speed = 0;
samus_y_dir = 2;
flare_counter = 0;
flare_animation_frame = 0;
flare_slow_sparks_anim_frame = 0;
flare_fast_sparks_anim_frame = 0;
flare_animation_timer = 0;
flare_slow_sparks_anim_timer = 0;
flare_fast_sparks_anim_timer = 0;
Samus_LoadSuitPalette();
return 1;
}
uint8 SomeMotherBrainScripts_1(void) { // 0x91E571
samus_anim_frame_timer = 16;
samus_anim_frame = 0;
if (samus_pose_x_dir == 4)
samus_pose = kPose_EB_FaceL_Drained_Stand;
else
samus_pose = kPose_EA_FaceR_Drained_Stand;
frame_handler_gamma = FUNC16(nullsub_152);
return 1;
}
uint8 SomeMotherBrainScripts_2(void) { // 0x91E59B
if (samus_pose == kPose_E8_FaceR_Drained_CrouchFalling || samus_pose == kPose_E9_FaceL_Drained_CrouchFalling) {
samus_anim_frame_timer = 1;
samus_anim_frame = 13;
} else if (samus_pose == kPose_EA_FaceR_Drained_Stand || samus_pose == kPose_EB_FaceL_Drained_Stand) {
samus_anim_frame_timer = 1;
samus_anim_frame = 4;
}
samus_y_radius = *(&kPoseParams[0].y_radius + (uint16)(8 * samus_pose));
samus_x_base_speed = 0;
samus_x_base_subspeed = 0;
samus_y_subspeed = 0;
samus_y_speed = 0;
samus_y_dir = 2;
return 1;
}
uint8 SomeMotherBrainScripts_3_EnableHyperBeam(void) { // 0x91E5F0
equipped_beams = 4105;
UpdateBeamTilesAndPalette();
SpawnPalfxObject(addr_stru_8DE1F0);
hyper_beam_flag = FUNC16(Samus_InputHandler);
play_resume_charging_beam_sfx = 0;
return 0;
}
uint8 SomeMotherBrainScripts_4(void) { // 0x91E60C
samus_anim_frame_timer = 16;
samus_anim_frame = 8;
if (samus_pose_x_dir == 4)
samus_pose = kPose_E9_FaceL_Drained_CrouchFalling;
else
samus_pose = kPose_E8_FaceR_Drained_CrouchFalling;
return 1;
}
void nullsub_17(void) {}
static Func_V *const off_91E6E1[28] = { // 0x91E633
SamusFunc_E633_0,
nullsub_17,
nullsub_17,
SamusFunc_E633_3,
SamusFunc_E633_4,
nullsub_17,
nullsub_17,
nullsub_17,
SamusFunc_E633_4,
nullsub_17,
nullsub_17,
nullsub_17,
nullsub_17,
nullsub_17,
nullsub_17,
nullsub_17,
nullsub_17,
SamusFunc_E633_17,
SamusFunc_E633_17,
SamusFunc_E633_17,
SamusFunc_E633_20,
nullsub_17,
nullsub_17,
nullsub_17,
nullsub_17,
nullsub_17,
nullsub_17,
nullsub_17,
};
void SamusFunc_E633(void) {
off_91E6E1[samus_movement_type]();
if ((equipped_items & 0x2000) != 0) {
if (samus_has_momentum_flag && !speed_boost_counter) {
special_samus_palette_timer = speed_boost_counter;
special_samus_palette_frame = 0;
speed_boost_counter = kSpeedBoostToCtr[0];
}
} else {
speed_echoes_index = 0;
speed_echo_xspeed[0] = 0;
speed_echo_xspeed[1] = 0;
samus_has_momentum_flag = 0;
speed_boost_counter = 0;
special_samus_palette_frame = 0;
special_samus_palette_timer = 0;
speed_echo_xpos[0] = 0;
speed_echo_xpos[1] = 0;
speed_echo_ypos[0] = 0;
speed_echo_ypos[1] = 0;
}
if (grapple_beam_function == (uint16)FUNC16(GrappleBeamFunc_Inactive)) {
if ((equipped_beams & 0x1000) != 0) {
if (!sign16(flare_counter - 16))
QueueSfx1_Max6(0x41u);
} else {
flare_counter = 0;
flare_animation_frame = 0;
flare_slow_sparks_anim_frame = 0;
flare_fast_sparks_anim_frame = 0;
flare_animation_timer = 0;
flare_slow_sparks_anim_timer = 0;
flare_fast_sparks_anim_timer = 0;
}
} else {
LoadProjectilePalette(2u);
QueueSfx1_Max6(6u);
}
Samus_LoadSuitPalette();
if (sign16(samus_health - 31))
QueueSfx3_Max6(2u);
}
void Samus_UpdatePreviousPose_0(void) { // 0x91E719
samus_last_different_pose = samus_prev_pose;
*(uint16 *)&samus_last_different_pose_x_dir = *(uint16 *)&samus_prev_pose_x_dir;
samus_prev_pose = samus_pose;
*(uint16 *)&samus_prev_pose_x_dir = *(uint16 *)&samus_pose_x_dir;
}
void SamusFunc_E633_0(void) { // 0x91E733
if (samus_pose) {
if (samus_pose == kPose_9B_FaceF_VariaGravitySuit && (equipped_items & 1) == 0 && (equipped_items & 0x20) == 0) {
samus_pose = kPose_00_FaceF_Powersuit;
goto LABEL_10;
}
} else if ((equipped_items & 1) != 0 || (equipped_items & 0x20) != 0) {
samus_pose = kPose_9B_FaceF_VariaGravitySuit;
LABEL_10:
SamusFunc_F433();
Samus_SetAnimationFrameIfPoseChanged();
Samus_UpdatePreviousPose_0();
}
}
void SamusFunc_E633_3(void) { // 0x91E776
if (samus_pose_x_dir == 4)
*(uint16 *)&samus_prev_pose_x_dir = 260;
else
*(uint16 *)&samus_prev_pose_x_dir = 264;
if (samus_pose != kPose_81_FaceR_Screwattack && samus_pose != kPose_82_FaceL_Screwattack) {
if (samus_pose != kPose_1B_FaceR_SpaceJump && samus_pose != kPose_1C_FaceL_SpaceJump)
goto LABEL_18;
if ((equipped_items & 8) != 0) {
if (samus_pose_x_dir == 4)
samus_pose = kPose_82_FaceL_Screwattack;
else
samus_pose = kPose_81_FaceR_Screwattack;
goto LABEL_18;
}
goto LABEL_15;
}
if ((equipped_items & 8) == 0) {
LABEL_15:
if (samus_pose_x_dir == 4)
samus_pose = kPose_1A_FaceL_SpinJump;
else
samus_pose = kPose_19_FaceR_SpinJump;
}
LABEL_18:
SamusFunc_F433();
Samus_SetAnimationFrameIfPoseChanged();
if (samus_pose_x_dir == 4)
*(uint16 *)&samus_prev_pose_x_dir = 772;
else
*(uint16 *)&samus_prev_pose_x_dir = 776;
Samus_UpdatePreviousPose_0();
}
void SamusFunc_E633_4(void) { // 0x91E83A
if ((equipped_items & 2) != 0) {
if (samus_pose_x_dir == 4)
samus_pose = kPose_7A_FaceL_Springball_Ground;
else
samus_pose = kPose_79_FaceR_Springball_Ground;
SamusFunc_F433();
Samus_SetAnimationFrameIfPoseChanged();
Samus_UpdatePreviousPose_0();
}
}
void SamusFunc_E633_17(void) { // 0x91E867
if ((equipped_items & 2) == 0) {
if (samus_pose_x_dir == 4)
samus_pose = kPose_41_FaceL_Morphball_Ground;
else
samus_pose = kPose_1D_FaceR_Morphball_Ground;
SamusFunc_F433();
Samus_SetAnimationFrameIfPoseChanged();
Samus_UpdatePreviousPose_0();
}
}
void SamusFunc_E633_20(void) { // 0x91E894
if ((equipped_items & 8) != 0)
samus_anim_frame = 23;
else
samus_anim_frame = 3;
}
void nullsub_18(void) {
}
static Func_V *const kSamus_HandleTransFromBlockColl[6] = { // 0x91E8B6
nullsub_18,
Samus_HandleTransFromBlockColl_1,
Samus_HandleTransFromBlockColl_2,
Samus_HandleTransFromBlockColl_3,
Samus_HandleTransFromBlockColl_4,
Samus_HandleTransFromBlockColl_5,
};
void Samus_HandleTransFromBlockColl(void) {
if (input_to_pose_calc)
kSamus_HandleTransFromBlockColl[(uint16)(2 * (uint8)input_to_pose_calc) >> 1]();
}
void Samus_HandleTransFromBlockColl_3(void) { // 0x91E8D8
samus_new_pose = samus_pose;
samus_momentum_routine_index = 5;
}
void Samus_HandleTransFromBlockColl_4(void) { // 0x91E8E5
samus_new_pose = samus_pose;
samus_momentum_routine_index = 5;
}
#define word_91E921 ((uint16*)RomPtr(0x91e921))
uint8 nullsub_18_U8(void) {
return 0;
}
static Func_U8 *const off_91E951[6] = { // 0x91E8F2
Samus_HandleTransFromBlockColl_1_0,
Samus_HandleTransFromBlockColl_1_1,
Samus_HandleTransFromBlockColl_1_2,
Samus_HandleTransFromBlockColl_1_3,
nullsub_18_U8,
Samus_HandleTransFromBlockColl_1_5,
};
void Samus_HandleTransFromBlockColl_2(void) {
if (HIBYTE(input_to_pose_calc) != 4) {
uint16 v0 = 4 * HIBYTE(input_to_pose_calc);
if (samus_pose_x_dir == 4)
samus_new_pose = word_91E921[(v0 >> 1) + 1];
else
samus_new_pose = word_91E921[v0 >> 1];
samus_momentum_routine_index = 5;
}
}
void Samus_HandleTransFromBlockColl_1(void) { // 0x91E931
if (HIBYTE(input_to_pose_calc) != 4) {
if (off_91E951[(uint16)(2 * HIBYTE(input_to_pose_calc)) >> 1]() & 1)
samus_momentum_routine_index = 0;
else
samus_momentum_routine_index = 5;
}
}
#define word_91E9F3 ((uint16*)RomPtr(0x91e9f3))
uint8 Samus_HandleTransFromBlockColl_1_0(void) { // 0x91E95D
int16 v0;
if (samus_prev_movement_type2 == kMovementType_03_SpinJumping
|| samus_prev_movement_type2 == kMovementType_14_WallJumping) {
if (samus_pose_x_dir == 4)
samus_new_pose = kPose_A7_FaceL_LandSpinJump;
else
samus_new_pose = kPose_A6_FaceR_LandSpinJump;
return 0;
} else {
v0 = *(&kPoseParams[0].direction_shots_fired + (uint16)(8 * samus_pose));
if (v0 == 255) {
if (samus_pose_x_dir == 4)
samus_new_pose = kPose_A5_FaceL_LandJump;
else
samus_new_pose = kPose_A4_FaceR_LandJump;
return 0;
} else {
if (v0 != 2 && v0 != 7)
goto LABEL_6;
if ((button_config_shoot_x & joypad1_lastkeys) == 0) {
v0 = *(&kPoseParams[0].direction_shots_fired + (uint16)(8 * samus_pose));
LABEL_6:
samus_new_pose = word_91E9F3[v0];
return 0;
}
if (samus_pose_x_dir == 4)
samus_new_pose = kPose_E7_FaceL_LandJump_Fire;
else
samus_new_pose = kPose_E6_FaceR_LandJump_Fire;
return 0;
}
}
}
uint8 Samus_HandleTransFromBlockColl_1_1(void) { // 0x91EA07
int16 v0;
v0 = 2 * used_for_ball_bounce_on_landing;
if (2 * used_for_ball_bounce_on_landing) {
if (v0 == 2) {
samus_new_pose = samus_pose;
return 0;
}
if (v0 != 4) {
Unreachable();
while (1)
;
}
} else if (!sign16(samus_y_speed - 3)) {
samus_new_pose = samus_pose;
return 0;
}
if (samus_pose_x_dir == 4)
samus_new_pose = kPose_41_FaceL_Morphball_Ground;
else
samus_new_pose = kPose_1D_FaceR_Morphball_Ground;
return 0;
}
uint8 Samus_HandleTransFromBlockColl_1_2(void) { // 0x91EA48
if (samus_pose_x_dir == 4)
samus_new_pose = 66;
else
samus_new_pose = 32;
return 0;
}
uint8 Samus_HandleTransFromBlockColl_1_3(void) { // 0x91EA63
int16 v1;
if ((button_config_jump_a & joypad1_lastkeys) != 0) {
samus_new_pose = samus_pose;
return 0;
}
v1 = 2 * (uint8)used_for_ball_bounce_on_landing;
if (v1) {
if (v1 == 2) {
samus_new_pose = samus_pose;
return 0;
}
if (v1 != 4) {
Unreachable();
while (1)
;
}
} else if (!sign16(samus_y_speed - 3)) {
samus_new_pose = samus_pose;
return 0;
}
if (samus_pose_x_dir == 4)
samus_new_pose = kPose_7A_FaceL_Springball_Ground;
else
samus_new_pose = 121;
return 0;
}
uint8 Samus_HandleTransFromBlockColl_1_5(void) { // 0x91EAB6
samus_new_pose = samus_pose;
return 0;
}
void Samus_HandleTransFromBlockColl_5(void) { // 0x91EABE
if (samus_pose_x_dir == 4)
samus_new_pose = kPose_84_FaceL_Walljump;
else
samus_new_pose = kPose_83_FaceR_Walljump;
samus_momentum_routine_index = 5;
}
#define word_91EB74 ((uint16*)RomPtr(0x91eb74))
uint8 Samus_CheckWalkedIntoSomething(void) { // 0x91EADE
int16 v0;
if (samus_collides_with_solid_enemy && samus_movement_type == 1) {
v0 = samus_pose;
goto LABEL_13;
}
if (samus_new_pose == 0xFFFF || *(&kPoseParams[0].movement_type + (uint16)(8 * samus_new_pose)) != 1)
goto LABEL_14;
if (samus_pose_x_dir != 4) {
R18_ = 1;
samus_collision_direction = 1;
R20_ = 0;
if (!Samus_CheckSolidEnemyColl()) {
R18_ = 1;
samus_collision_direction = 1;
R20_ = 0;
goto LABEL_10;
}
LABEL_11:
v0 = samus_new_pose;
LABEL_13:
samus_new_pose = word_91EB74[(uint16)(2
* *(&kPoseParams[0].direction_shots_fired
+ (uint16)(8 * v0))) >> 1];
samus_collides_with_solid_enemy = 0;
return 1;
}
R18_ = 1;
R20_ = 0;
samus_collision_direction = 0;
if (Samus_CheckSolidEnemyColl())
goto LABEL_11;
R18_ = -1;
R20_ = 0;
samus_collision_direction = 0;
LABEL_10:
if (Samus_MoveRight_NoSolidColl() & 1)
goto LABEL_11;
LABEL_14:
samus_collides_with_solid_enemy = 0;
return 0;
}
void nullsub_19(void) {}
void nullsub_20(void) {}
void nullsub_21(void) {}
void nullsub_22(void) {}
static Func_V *const kSamus_HandleTransitionsA[9] = { // 0x91EB88
nullsub_18,
Samus_HandleTransitionsA_1,
Samus_HandleTransitionsA_2,
nullsub_21,
nullsub_22,
Samus_HandleTransitionsA_5,
Samus_HandleTransitionsA_6,
Samus_HandleTransitionsA_7,
Samus_HandleTransitionsA_8,
};
static Func_V *const kSamus_HandleTransitionsB[11] = {
nullsub_18,
Samus_HandleTransitionsB_1,
Samus_HandleTransitionsB_2,
Samus_HandleTransitionsB_3,
Samus_HandleTransitionsB_4,
Samus_HandleTransitionsB_5,
nullsub_19,
nullsub_20,
Samus_HandleTransitionsB_8,
Samus_HandleTransitionsB_9,
Samus_HandleTransitionsB_10,
};
static Func_V *const kSamus_HandleTransitionsC[9] = {
nullsub_18,
Samus_HandleTransitionsC_1,
Samus_HandleTransitionsC_2,
Samus_HandleTransitionsC_3,
Samus_HandleTransitionsC_4,
Samus_HandleTransitionsC_5,
Samus_HandleTransitionsC_6,
Samus_HandleTransitionsC_7,
Samus_HandleTransitionsC_8,
};
void Samus_HandleTransitions(void) {
if ((samus_new_pose_transitional & 0x8000u) == 0) {
if (samus_hurt_switch_index != 3) {
if (samus_hurt_switch_index == 1)
goto LABEL_7;
goto LABEL_6;
}
if (samus_special_transgfx_index != 9) {
LABEL_6:
samus_pose = samus_new_pose_transitional;
SamusFunc_F433();
Samus_SetAnimationFrameIfPoseChanged();
LABEL_7:
kSamus_HandleTransitionsC[samus_hurt_switch_index]();
LABEL_15:
samus_last_different_pose = samus_prev_pose;
*(uint16 *)&samus_last_different_pose_x_dir = *(uint16 *)&samus_prev_pose_x_dir;
samus_prev_pose = samus_pose;
*(uint16 *)&samus_prev_pose_x_dir = *(uint16 *)&samus_pose_x_dir;
goto LABEL_16;
}
}
if ((samus_new_pose_interrupted & 0x8000u) == 0) {
samus_pose = samus_new_pose_interrupted;
if (!(SamusFunc_F404() & 1))
kSamus_HandleTransitionsB[samus_special_transgfx_index]();
goto LABEL_15;
}
Samus_CheckWalkedIntoSomething();
if ((samus_new_pose & 0x8000u) == 0) {
samus_pose = samus_new_pose;
if (!(SamusFunc_F404() & 1))
kSamus_HandleTransitionsA[samus_momentum_routine_index]();
goto LABEL_15;
}
LABEL_16:
input_to_pose_calc = 0;
}
void Samus_HandleTransitionsA_1(void) { // 0x91EC50
if (samus_x_base_speed || samus_x_base_subspeed) {
uint16 v0 = (__PAIR32__(samus_x_extra_run_speed, samus_x_base_subspeed)
+ __PAIR32__(samus_x_base_speed, samus_x_extra_run_subspeed)) >> 16;
samus_x_base_subspeed += samus_x_extra_run_subspeed;
samus_x_base_speed = v0;
samus_x_accel_mode = 2;
Samus_CancelSpeedBoost();
samus_x_extra_run_subspeed = 0;
samus_x_extra_run_speed = 0;
SamusFunc_EC80();
} else {
Samus_HandleTransitionsA_2();
}
}
void Samus_HandleTransitionsA_6(void) { // 0x91EC85
samus_x_accel_mode = 0;
samus_x_base_speed = 0;
samus_x_base_subspeed = 0;
Samus_HandleTransitionsA_8();
}
void Samus_HandleTransitionsA_8(void) { // 0x91EC8E
Samus_CancelSpeedBoost();
samus_x_extra_run_subspeed = 0;
samus_x_extra_run_speed = 0;
SamusFunc_EC80();
}
void Samus_HandleTransitionsA_2(void) { // 0x91ECD0
samus_x_accel_mode = 0;
Samus_CancelSpeedBoost();
}
static const uint16 word_91ED36[12] = { // 0x91ECDA
5, 5, 9, 9, 0, 0, 0, 0,
0, 0, 0, 0,
};
void Samus_HandleTransitionsA_7(void) {
if (sign16(samus_pose - kPose_DB)) {
R18_ = word_91ED36[samus_pose - 53];
if (!R18_)
goto LABEL_5;
R20_ = 0;
LABEL_4:
samus_y_radius = *(&kPoseParams[0].y_radius + (uint16)(8 * samus_pose));
Samus_CollDetectChangedPose();
LABEL_5:
samus_y_pos += R18_;
samus_prev_y_pos = samus_y_pos;
if (used_for_ball_bounce_on_landing) {
used_for_ball_bounce_on_landing = 0;
samus_y_subspeed = 0;
samus_y_speed = 0;
samus_y_dir = 0;
}
return;
}
if (!sign16(samus_pose - kPose_F1_FaceR_CrouchTrans_AimU) && sign16(samus_pose - kPose_F7_FaceR_StandTrans_AimU)) {
R18_ = 5;
R20_ = 0;
goto LABEL_4;
}
}
static Func_U8 *const kSamus_HandleTransitionsB_1[28] = { // 0x91ED4E
Samus_HandleTransitionsB_1_0,
Samus_HandleTransitionsB_1_0,
Samus_HandleTransitionsB_1_0,
Samus_HandleTransitionsB_1_0,
Samus_HandleTransitionsB_1_4,
Samus_HandleTransitionsB_1_0,
Samus_HandleTransitionsB_1_6,
Samus_HandleTransitionsB_1_7,
Samus_HandleTransitionsB_1_4,
Samus_HandleTransitionsB_1_4,
Samus_HandleTransitionsB_1_10,
Samus_HandleTransitionsB_1_11,
Samus_HandleTransitionsB_1_11,
Samus_HandleTransitionsB_1_0,
Samus_HandleTransitionsB_1_11,
Samus_HandleTransitionsB_1_11,
Samus_HandleTransitionsB_1_0,
Samus_HandleTransitionsB_1_4,
Samus_HandleTransitionsB_1_4,
Samus_HandleTransitionsB_1_4,
Samus_HandleTransitionsB_1_0,
Samus_HandleTransitionsB_1_0,
Samus_HandleTransitionsB_1_10,
Samus_HandleTransitionsB_1_11,
Samus_HandleTransitionsB_1_11,
Samus_HandleTransitionsB_1_11,
Samus_HandleTransitionsB_1_11,
Samus_HandleTransitionsB_1_11,
};
void Samus_HandleTransitionsB_1(void) {
kSamus_HandleTransitionsB_1[samus_prev_movement_type2]();
Samus_SetSpeedForKnockback_Y();
bomb_jump_dir = 0;
samus_contact_damage_index = 0;
samus_hurt_flash_counter = 1;
}
uint8 Samus_HandleTransitionsB_1_10(void) { // 0x91EDA2
return 0;
}
uint8 Samus_HandleTransitionsB_1_11(void) { // 0x91EDA4
return 0;
}
uint8 Samus_HandleTransitionsB_1_6(void) { // 0x91EDA6
if (frame_handler_gamma == (uint16)FUNC16(Samus_Func9))
return 0;
else
return Samus_HandleTransitionsB_1_0();
}
uint8 Samus_HandleTransitionsB_1_0(void) { // 0x91EDB0
if (samus_pose_x_dir == 4) {
if (knockback_x_dir) {
if ((joypad1_lastkeys & 0x200) != 0)
knockback_dir = 5;
else
knockback_dir = 2;
} else if ((joypad1_lastkeys & 0x200) != 0) {
knockback_dir = 4;
} else {
knockback_dir = 1;
}
} else if (knockback_x_dir) {
if ((joypad1_lastkeys & 0x100) != 0)
knockback_dir = 5;
else
knockback_dir = 2;
} else if ((joypad1_lastkeys & 0x100) != 0) {
knockback_dir = 4;
} else {
knockback_dir = 1;
}
samus_movement_handler = FUNC16(Samus_MoveHandler_Knockback);
return 1;
}
uint8 Samus_HandleTransitionsB_1_4(void) { // 0x91EE27
if (samus_pose_x_dir == 4)
knockback_dir = 1;
else
knockback_dir = 2;
samus_movement_handler = FUNC16(Samus_MoveHandler_Knockback);
return 0;
}
uint8 Samus_HandleTransitionsB_1_7(void) { // 0x91EE48
if (samus_pose_x_dir == 4)
knockback_dir = 1;
else
knockback_dir = 2;
samus_movement_handler = FUNC16(Samus_MoveHandler_Knockback);
return 1;
}
void Samus_HandleTransitionsB_2(void) { // 0x91EE69
knockback_dir = 0;
samus_movement_handler = FUNC16(Samus_MovementHandler_Normal);
samus_y_speed = 0;
samus_y_subspeed = 0;
samus_y_dir = 0;
Samus_AlignBottomWithPrevPose();
}
void Samus_HandleTransitionsB_3(void) { // 0x91EE80
bomb_jump_dir = (uint8)bomb_jump_dir | 0x800;
samus_movement_handler = FUNC16(Samus_MoveHandler_BombJumpStart);
if (samus_input_handler != (uint16)FUNC16(Samus_InputHandler_E91D))
samus_input_handler = FUNC16(nullsub_152);
}
void Samus_HandleTransitionsB_4(void) { // 0x91EEA1
Samus_InitJump();
}
void Samus_HandleTransitionsB_5(void) { // 0x91EEA6
switch (samus_movement_type) {
case kMovementType_00_Standing:
goto LABEL_5;
case kMovementType_05_Crouching:
if (samus_pose_x_dir == 4)
xray_angle = 192;
else
xray_angle = 64;
goto LABEL_11;
case kMovementType_15_RanIntoWall:
case kMovementType_01_Running:
LABEL_5:
if (samus_pose_x_dir == 4)
xray_angle = 192;
else
xray_angle = 64;
LABEL_11:
samus_anim_frame = 2;
samus_anim_frame_timer = 63;
samus_movement_handler = FUNC16(SamusMovementType_Xray);
samus_input_handler = FUNC16(Samus_Func20_);
timer_for_shine_timer = 8;
special_samus_palette_timer = 1;
special_samus_palette_frame = 0;
samus_shine_timer = 0;
flare_counter = 0;
flare_animation_frame = 0;
flare_slow_sparks_anim_frame = 0;
flare_fast_sparks_anim_frame = 0;
flare_animation_timer = 0;
flare_slow_sparks_anim_timer = 0;
flare_fast_sparks_anim_timer = 0;
QueueSfx1_Max6(9u);
break;
}
}
void Samus_HandleTransitionsB_8(void) { // 0x91EF3B
samus_y_pos -= 5;
samus_prev_y_pos = samus_y_pos;
frame_handler_alfa = FUNC16(EmptyFunction);
}
void Samus_HandleTransitionsB_9(void) { // 0x91EF4F
int16 v0;
int16 v1;
GrappleBeamFunc_BD95();
v0 = samus_x_pos - samus_prev_x_pos;
if ((int16)(samus_x_pos - samus_prev_x_pos) < 0) {
if (sign16(v0 + 12))
samus_prev_x_pos = samus_x_pos + 12;
} else if (!sign16(v0 - 13)) {
samus_prev_x_pos = samus_x_pos - 12;
}
v1 = samus_y_pos - samus_prev_y_pos;
if ((int16)(samus_y_pos - samus_prev_y_pos) < 0) {
if (sign16(v1 + 12))
samus_prev_y_pos = samus_y_pos + 12;
} else if (!sign16(v1 - 13)) {
samus_prev_y_pos = samus_y_pos - 12;
}
Samus_CancelSpeedBoost();
samus_x_base_speed = 0;
samus_x_base_subspeed = 0;
samus_y_subspeed = 0;
samus_y_speed = 0;
samus_x_extra_run_speed = 0;
samus_x_extra_run_subspeed = 0;
}
void Samus_HandleTransitionsB_10(void) { // 0x91EFBC
GrappleBeamFunc_BEEB();
Samus_HandleTransitionsB_9B();
}
void Samus_HandleTransitionsB_9B(void) { // 0x91EF53
int16 v0;
int16 v1;
v0 = samus_x_pos - samus_prev_x_pos;
if ((int16)(samus_x_pos - samus_prev_x_pos) < 0) {
if (sign16(v0 + 12))
samus_prev_x_pos = samus_x_pos + 12;
} else if (!sign16(v0 - 13)) {
samus_prev_x_pos = samus_x_pos - 12;
}
v1 = samus_y_pos - samus_prev_y_pos;
if ((int16)(samus_y_pos - samus_prev_y_pos) < 0) {
if (sign16(v1 + 12))
samus_prev_y_pos = samus_y_pos + 12;
} else if (!sign16(v1 - 13)) {
samus_prev_y_pos = samus_y_pos - 12;
}
Samus_CancelSpeedBoost();
samus_x_base_speed = 0;
samus_x_base_subspeed = 0;
samus_y_subspeed = 0;
samus_y_speed = 0;
samus_x_extra_run_speed = 0;
samus_x_extra_run_subspeed = 0;
}
void nullsub_23(void) { // 0x91EFDE
}
static Func_V *const kSamus_HandleTransitionsA_5[7] = { // 0x91EFC4
sub_91EFC3,
Samus_HandleTransitionsA_5_1,
Samus_HandleTransitionsA_5_2,
nullsub_23,
Samus_HandleTransitionsA_5_4,
Samus_HandleTransitionsA_5_5,
Samus_HandleTransitionsA_5_6,
};
void Samus_HandleTransitionsA_5(void) {
kSamus_HandleTransitionsA_5[(uint16)(2 * (uint8)input_to_pose_calc) >> 1]();
}
void Samus_HandleTransitionsA_5_4(void) { // 0x91EFDF
samus_y_subspeed = 0;
samus_y_speed = 0;
UNUSED_word_7E0B1A = 0;
samus_y_dir = 2;
}
void Samus_HandleTransitionsA_5_2(void) { // 0x91EFEF
if (samus_y_dir != 1) {
used_for_ball_bounce_on_landing = 0;
samus_y_subspeed = 0;
samus_y_speed = 0;
samus_is_falling_flag = 1;
samus_y_dir = 2;
}
UNUSED_word_7E0A18 = 0;
}
void sub_91EFC3(void) {}
uint8 sub_91EFC3_rv(void) { return 0; }
static Func_U8 *const kSamus_HandleTransitionsA_5_1[6] = { // 0x91F010
Samus_HandleTransitionsA_5_1_0,
Samus_MorphBallBounceNoSpringballTrans,
Samus_HandleTransitionsA_5_1_2,
Samus_MorphBallBounceSpringballTrans,
sub_91EFC3_rv,
Samus_HandleTransitionsA_5_1_5,
};
void Samus_HandleTransitionsA_5_1(void) {
HandleLandingSoundEffectsAndGfx();
if (HIBYTE(input_to_pose_calc) == 4) {
SamusFunc_F1D3();
} else if (!(kSamus_HandleTransitionsA_5_1[(uint16)(2 * HIBYTE(input_to_pose_calc)) >> 1]() & 1)) {
UNUSED_word_7E0A18 = 0;
samus_x_accel_mode = 0;
samus_x_base_speed = 0;
samus_x_base_subspeed = 0;
SamusFunc_F1D3();
}
}
void HandleLandingSoundEffectsAndGfx(void) { // 0x91F046
if ((samus_prev_movement_type2 == kMovementType_03_SpinJumping
|| samus_prev_movement_type2 == kMovementType_14_WallJumping)
&& !cinematic_function) {
if (samus_prev_pose == kPose_81_FaceR_Screwattack || samus_prev_pose == kPose_82_FaceL_Screwattack)
QueueSfx1_Max6(0x34u);
else
QueueSfx1_Max6(0x32u);
}
if (samus_y_speed && !sign16(samus_y_speed - 5)) {
if (!cinematic_function)
QueueSfx3_Max6(4u);
} else {
if (!samus_y_subspeed)
return;
if (!cinematic_function)
QueueSfx3_Max6(5u);
}
HandleLandingGraphics();
}
static Func_V *const off_91F0AE[8] = { // 0x91F0A5
HandleLandingGraphics_Crateria,
HandleLandingGraphics_Brinstar,
HandleLandingGraphics_Norfair,
HandleLandingGraphics_Norfair,
HandleLandingGraphics_Maridia,
HandleLandingGraphics_Tourian,
HandleLandingGraphics_Ceres,
HandleLandingGraphics_Ceres,
};
void HandleLandingGraphics(void) {
off_91F0AE[(area_index)]();
}
void HandleLandingGraphics_Ceres(void) { // 0x91F0BE
atmospheric_gfx_frame_and_type[2] = 0;
atmospheric_gfx_frame_and_type[3] = 0;
}
static const uint8 g_byte_91F0F3[17] = { // 0x91F0C5
1, 0, 0, 0, 0, 2, 0, 4,
0, 4, 4, 4, 4, 0, 4, 0,
0,
};
void HandleLandingGraphics_Crateria(void) {
if (cinematic_function)
goto LABEL_13;
if (room_index == 28) {
HandleLandingGraphics_Norfair();
return;
}
if ((int16)(room_index - 16) >= 0)
goto LABEL_13;
if ((g_byte_91F0F3[room_index] & 1) == 0) {
if ((g_byte_91F0F3[room_index] & 2) != 0) {
if (!sign16(samus_y_pos - 944))
goto LABEL_14;
} else if ((g_byte_91F0F3[room_index] & 4) != 0) {
goto LABEL_14;
}
LABEL_13:
HandleLandingGraphics_Ceres();
return;
}
if (fx_type != 10)
goto LABEL_13;
LABEL_14:
HandleLandingGraphics_Maridia();
}
void HandleLandingGraphics_Maridia(void) { // 0x91F116
Samus_GetBottomBoundary();
if ((fx_y_pos & 0x8000u) == 0) {
if (sign16(fx_y_pos - R18_) && (fx_liquid_options & 4) == 0)
return;
LABEL_7:
atmospheric_gfx_frame_and_type[2] = 256;
atmospheric_gfx_frame_and_type[3] = 256;
atmospheric_gfx_anim_timer[2] = 3;
atmospheric_gfx_anim_timer[3] = 3;
atmospheric_gfx_x_pos[2] = samus_x_pos + 4;
atmospheric_gfx_x_pos[3] = samus_x_pos - 3;
atmospheric_gfx_y_pos[2] = R18_ - 4;
atmospheric_gfx_y_pos[3] = R18_ - 4;
return;
}
if ((lava_acid_y_pos & 0x8000u) != 0 || !sign16(lava_acid_y_pos - R18_))
goto LABEL_7;
}
void HandleLandingGraphics_Norfair(void) { // 0x91F166
Samus_GetBottomBoundary();
if ((fx_y_pos & 0x8000u) == 0) {
if (sign16(fx_y_pos - R18_) && (fx_liquid_options & 4) == 0)
return;
LABEL_7:
atmospheric_gfx_frame_and_type[2] = 1536;
atmospheric_gfx_frame_and_type[3] = 1536;
atmospheric_gfx_anim_timer[2] = 3;
atmospheric_gfx_anim_timer[3] = 3;
atmospheric_gfx_x_pos[2] = samus_x_pos + 8;
atmospheric_gfx_x_pos[3] = samus_x_pos - 8;
atmospheric_gfx_y_pos[2] = R18_;
atmospheric_gfx_y_pos[3] = R18_;
return;
}
if ((lava_acid_y_pos & 0x8000u) != 0 || !sign16(lava_acid_y_pos - R18_))
goto LABEL_7;
}
void HandleLandingGraphics_Brinstar(void) { // 0x91F1B2
if (room_index == 8)
HandleLandingGraphics_Norfair();
else
HandleLandingGraphics_Tourian();
}
void HandleLandingGraphics_Tourian(void) { // 0x91F1BA
if (!sign16(room_index - 5) && (sign16(room_index - 9) || room_index == 11)) {
HandleLandingGraphics_Norfair();
} else {
atmospheric_gfx_frame_and_type[2] = 0;
atmospheric_gfx_frame_and_type[3] = 0;
}
}
void SamusFunc_F1D3(void) { // 0x91F1D3
samus_is_falling_flag = 0;
UNUSED_word_7E0B1A = 0;
UNUSED_word_7E0B2A = 0;
samus_y_subspeed = 0;
samus_y_speed = 0;
samus_y_dir = 0;
UNUSED_word_7E0B38 = 0;
used_for_ball_bounce_on_landing = 0;
}
uint8 Samus_HandleTransitionsA_5_1_0(void) { // 0x91F1EC
if (samus_input_handler != (uint16)FUNC16(Samus_InputHandler_E91D))
samus_input_handler = FUNC16(HandleAutoJumpHack);
return 0;
}
static const uint16 g_word_909EB5 = 1;
static const uint16 g_word_909EB7 = 0;
uint8 Samus_MorphBallBounceNoSpringballTrans(void) { // 0x91F1FC
int16 v0;
v0 = 2 * used_for_ball_bounce_on_landing;
if (2 * used_for_ball_bounce_on_landing) {
if (v0 == 2) {
++used_for_ball_bounce_on_landing;
samus_y_dir = 1;
samus_y_subspeed = g_word_909EB7;
samus_y_speed = g_word_909EB5 - 1;
return 1;
}
if (v0 != 4) {
Unreachable();
while (1)
;
}
} else if (!sign16(samus_y_speed - 3)) {
++used_for_ball_bounce_on_landing;
samus_y_dir = 1;
samus_y_subspeed = g_word_909EB7;
samus_y_speed = g_word_909EB5;
return 1;
}
used_for_ball_bounce_on_landing = 0;
samus_y_dir = 0;
samus_y_subspeed = 0;
samus_y_speed = 0;
return 0;
}
uint8 Samus_HandleTransitionsA_5_1_2(void) { // 0x91F253
used_for_ball_bounce_on_landing = 0;
enable_horiz_slope_coll = 3;
return 0;
}
uint8 Samus_MorphBallBounceSpringballTrans(void) { // 0x91F25E
int16 v1;
if ((button_config_jump_a & joypad1_lastkeys) != 0) {
used_for_ball_bounce_on_landing = 0;
Samus_InitJump();
return 1;
}
v1 = 2 * (uint8)used_for_ball_bounce_on_landing;
if (v1) {
if (v1 == 2) {
used_for_ball_bounce_on_landing = 1538;
samus_y_dir = 1;
samus_y_subspeed = g_word_909EB7;
samus_y_speed = g_word_909EB5 - 1;
return 1;
}
if (v1 != 4) {
Unreachable();
while (1)
;
}
} else if (!sign16(samus_y_speed - 3)) {
used_for_ball_bounce_on_landing = 1537;
samus_y_dir = 1;
samus_y_subspeed = g_word_909EB7;
samus_y_speed = g_word_909EB5;
return 1;
}
used_for_ball_bounce_on_landing = 0;
samus_y_dir = 0;
samus_y_subspeed = 0;
samus_y_speed = 0;
return 0;
}
uint8 Samus_HandleTransitionsA_5_1_5(void) { // 0x91F2CE
used_for_ball_bounce_on_landing = 0;
return 0;
}
void Samus_HandleTransitionsA_5_5(void) { // 0x91F2D3
samus_x_accel_mode = 0;
samus_collides_with_solid_enemy = 0;
samus_is_falling_flag = 0;
UNUSED_word_7E0B1A = 0;
samus_x_base_speed = 0;
samus_x_base_subspeed = 0;
UNUSED_word_7E0A18 = 0;
QueueSfx3_Max6(5u);
}
void Samus_HandleTransitionsA_5_6(void) { // 0x91F2F0
if (samus_collides_with_solid_enemy) {
if (samus_prev_movement_type2 == 9) {
enable_horiz_slope_coll = samus_pose_x_dir != 4;
UNUSED_word_7E0A18 = 0;
}
}
}
void Samus_HandleTransitionsC_1(void) { // 0x91F31D
knockback_dir = 0;
samus_movement_handler = FUNC16(Samus_MovementHandler_Normal);
used_for_ball_bounce_on_landing = 0;
samus_y_subspeed = 0;
samus_y_speed = 0;
samus_is_falling_flag = 1;
samus_y_dir = 2;
Samus_AlignBottomWithPrevPose();
if (samus_input_handler != (uint16)FUNC16(Samus_InputHandler_E91D))
samus_input_handler = FUNC16(Samus_InputHandler_E913);
}
void Samus_HandleTransitionsC_2(void) { // 0x91F34E
Samus_AlignBottomWithPrevPose();
samus_movement_handler = FUNC16(Samus_MovementHandler_Normal);
if (game_state == kGameState_42_PlayingDemo)
samus_input_handler = FUNC16(Samus_InputHandler_E91D);
else
samus_input_handler = FUNC16(Samus_InputHandler_E913);
}
void Samus_HandleTransitionsC_3(void) { // 0x91F36E
used_for_ball_bounce_on_landing = 0;
samus_anim_frame_timer += samus_anim_frame_buffer;
}
void Samus_HandleTransitionsC_4(void) { // 0x91F37C
samus_x_pos = layer1_x_pos + 128;
samus_prev_x_pos = layer1_x_pos + 128;
samus_y_pos = layer1_y_pos + 128;
samus_prev_y_pos = layer1_y_pos + 128;
}
void Samus_HandleTransitionsC_5(void) { // 0x91F397
samus_y_pos += 5;
samus_prev_y_pos = samus_y_pos;
}
void Samus_HandleTransitionsC_6(void) { // 0x91F3A5
HandleJumpTransition();
}
void Samus_HandleTransitionsC_7(void) { // 0x91F3AA
int16 v0;
int16 v1;
v0 = samus_x_pos - samus_prev_x_pos;
if ((int16)(samus_x_pos - samus_prev_x_pos) < 0) {
if (sign16(v0 + 12))
samus_prev_x_pos = samus_x_pos + 12;
} else if (!sign16(v0 - 13)) {
samus_prev_x_pos = samus_x_pos - 12;
}
v1 = samus_y_pos - samus_prev_y_pos;
if ((int16)(samus_y_pos - samus_prev_y_pos) < 0) {
if (sign16(v1 + 12))
samus_prev_y_pos = samus_y_pos + 12;
} else if (!sign16(v1 - 13)) {
samus_prev_y_pos = samus_y_pos - 12;
}
}
void Samus_HandleTransitionsC_8(void) { // 0x91F3FD
Samus_HandleTransitionsC_1();
Samus_HandleTransitionsC_3();
}
uint8 SamusFunc_F404(void) { // 0x91F404
SamusPose v1;
v1 = samus_pose;
if (samus_pose != samus_prev_pose) {
HandleCollDueToChangedPose();
SamusFunc_F433();
HandleJumpTransition();
Samus_SetAnimationFrameIfPoseChanged();
samus_anim_frame_skip = 0;
}
return v1 != samus_pose;
}
void SamusFunc_F433(void) { // 0x91F433
*(uint16 *)&samus_pose_x_dir = *(uint16 *)(&kPoseParams[0].pose_x_dir + (uint16)(8 * samus_pose));
SamusFunc_F468();
if ((samus_prev_movement_type2 == kMovementType_03_SpinJumping
|| samus_prev_movement_type2 == kMovementType_14_WallJumping)
&& (equipped_items & 8) != 0) {
Samus_LoadSuitPalette();
}
}
static Func_U8 *const off_91F4A2[28] = { // 0x91F468
SamusFunc_F468_Standing,
SamusFunc_F468_Running,
SamusFunc_F468_NormalJump,
SamusFunc_F468_SpinJump,
SamusFunc_F468_MorphBall,
SamusFunc_F468_Crouching,
SamusFunc_F468_Falling,
SamusFunc_F468_Unused,
SamusFunc_F468_MorphBall,
SamusFunc_F468_Unused,
SamusFunc_F468_Unused,
SamusFunc_F468_Unused,
SamusFunc_F468_Unused,
SamusFunc_F468_Unused,
SamusFunc_F468_TurningAroundOnGround,
SamusFunc_F468_CrouchTransEtc,
SamusFunc_F468_Moonwalking,
SamusFunc_F468_Springball,
SamusFunc_F468_Springball,
SamusFunc_F468_Springball,
SamusFunc_F468_WallJumping,
SamusFunc_F468_Unused,
SamusFunc_F468_Unused,
SamusFunc_F468_TurnAroundJumping,
SamusFunc_F468_TurnAroundFalling,
SamusFunc_F468_DamageBoost,
SamusFunc_F468_Unused,
SamusFunc_F468_Shinespark,
};
void SamusFunc_F468(void) {
if (off_91F4A2[samus_movement_type]() & 1) {
*(uint16 *)&samus_pose_x_dir = *(uint16 *)(&kPoseParams[0].pose_x_dir + (uint16)(8 * samus_pose));
if ((*(uint16 *)&samus_pose_x_dir & 0xFF00) == 3584) {
off_91F4A2[14]();
*(uint16 *)&samus_pose_x_dir = *(uint16 *)(&kPoseParams[0].pose_x_dir + (uint16)(8 * samus_pose));
}
}
}
uint8 SamusFunc_F468_Unused(void) { // 0x91F4DA
return 0;
}
uint8 SamusFunc_F468_Standing(void) { // 0x91F4DC
if ((!*(&kPoseParams[0].direction_shots_fired + (uint16)(8 * samus_pose))
|| *(&kPoseParams[0].direction_shots_fired + (uint16)(8 * samus_pose)) == 9)
&& (!*(&kPoseParams[0].direction_shots_fired + (uint16)(8 * samus_prev_pose))
|| *(&kPoseParams[0].direction_shots_fired + (uint16)(8 * samus_prev_pose)) == 9)) {
samus_anim_frame_skip = 1;
}
return 0;
}
uint8 SamusFunc_F468_Running(void) { // 0x91F50C
if (samus_prev_movement_type2 == 1)
samus_anim_frame_skip = FUNC16(Samus_InputHandler);
if (!UNUSED_word_7E0DF8)
return 0;
if (samus_pose == (kPose_44_FaceL_Turn_Crouch | kPose_01_FaceR_Normal)) {
samus_pose = kPose_25_FaceR_Turn_Stand;
return 1;
}
if (samus_pose == (kPose_44_FaceL_Turn_Crouch | kPose_02_FaceL_Normal)) {
samus_pose = kPose_26_FaceL_Turn_Stand;
return 1;
}
return 0;
}
uint8 SamusFunc_F468_NormalJump(void) { // 0x91F543
if (samus_pose != kPose_4E_FaceL_Jump_NoAim_NoMove_NoGun) {
if (samus_pose == kPose_4D_FaceR_Jump_NoAim_NoMove_NoGun || samus_pose == kPose_15_FaceR_Jump_AimU) {
LABEL_7:
if (samus_shine_timer) {
samus_pose = kPose_C7_FaceR_ShinesparkWindup_Vert;
LABEL_11:
Projectile_Func7_Shinespark();
if (samus_prev_movement_type2 == kMovementType_02_NormalJumping)
samus_prev_y_pos = --samus_y_pos;
return 1;
}
goto LABEL_14;
}
if (samus_pose != kPose_16_FaceL_Jump_AimU && samus_pose != kPose_6A_FaceL_Jump_AimUL) {
if (samus_pose != kPose_69_FaceR_Jump_AimUR)
goto LABEL_14;
goto LABEL_7;
}
}
if (samus_shine_timer) {
samus_pose = kPose_C8_FaceL_ShinesparkWindup_Vert;
goto LABEL_11;
}
LABEL_14:
if (samus_x_extra_run_speed || samus_x_extra_run_subspeed)
samus_x_accel_mode = 2;
else
samus_x_accel_mode = 0;
if ((samus_pose == kPose_15_FaceR_Jump_AimU || samus_pose == kPose_16_FaceL_Jump_AimU)
&& (samus_prev_pose == kPose_55_FaceR_Jumptrans_AimU || samus_prev_pose == kPose_56_FaceL_Jumptrans_AimU)) {
samus_anim_frame_skip = 1;
}
if ((button_config_shoot_x & joypad1_newkeys) != 0)
new_projectile_direction_changed_pose = *(&kPoseParams[0].direction_shots_fired + (uint16)(8 * samus_pose)) | 0x8000;
return 0;
}
uint8 SamusFunc_F468_Crouching(void) { // 0x91F5EB
if ((samus_pose == kPose_85_FaceR_Crouch_AimU || samus_pose == kPose_86_FaceL_Crouch_AimU)
&& (samus_prev_pose == kPose_F1_FaceR_CrouchTrans_AimU || samus_prev_pose == kPose_F2_FaceL_CrouchTrans_AimU)) {
samus_anim_frame_skip = 1;
}
return 0;
}
uint8 SamusFunc_F468_Falling(void) { // 0x91F60D
if (samus_x_extra_run_speed || samus_x_extra_run_subspeed)
samus_x_accel_mode = 2;
else
samus_x_accel_mode = 0;
return 0;
}
uint8 SamusFunc_F468_SpinJump(void) { // 0x91F624
if (samus_prev_movement_type2 == kMovementType_03_SpinJumping
|| samus_prev_movement_type2 == kMovementType_14_WallJumping) {
samus_anim_frame_skip = 1;
if ((samus_prev_pose_x_dir & 0xF) == 8) {
if (*(uint16 *)&samus_pose_x_dir != 772)
goto LABEL_9;
} else if ((samus_prev_pose_x_dir & 0xF) != 4 || *(uint16 *)&samus_pose_x_dir != 776) {
goto LABEL_9;
}
uint16 v0 = (__PAIR32__(samus_x_extra_run_speed, samus_x_base_subspeed)
+ __PAIR32__(samus_x_base_speed, samus_x_extra_run_subspeed)) >> 16;
samus_x_base_subspeed += samus_x_extra_run_subspeed;
samus_x_base_speed = v0;
Samus_CancelSpeedBoost();
samus_x_extra_run_subspeed = 0;
samus_x_extra_run_speed = 0;
samus_x_accel_mode = 1;
}
LABEL_9:
if (samus_pose_x_dir == 4) {
if ((equipped_items & 0x20) == 0) {
Samus_GetTopBottomBoundary();
if ((fx_y_pos & 0x8000u) != 0) {
if ((lava_acid_y_pos & 0x8000u) == 0 && sign16(lava_acid_y_pos - R20_))
return 0;
} else if (sign16(fx_y_pos - R20_) && (fx_liquid_options & 4) == 0) {
return 0;
}
}
if ((equipped_items & 8) != 0) {
samus_pose = kPose_82_FaceL_Screwattack;
goto LABEL_40;
}
if ((equipped_items & 0x200) != 0) {
QueueSfx1_Max6(0x3Eu);
samus_pose = kPose_1C_FaceL_SpaceJump;
return 0;
}
if (!samus_anim_frame_skip && !cinematic_function) {
LABEL_22:
QueueSfx1_Max6(0x31u);
return 0;
}
return 0;
}
if ((equipped_items & 0x20) == 0) {
Samus_GetTopBottomBoundary();
if ((fx_y_pos & 0x8000u) != 0) {
if ((lava_acid_y_pos & 0x8000u) == 0 && sign16(lava_acid_y_pos - R20_))
return 0;
} else if (sign16(fx_y_pos - R20_) && (fx_liquid_options & 4) == 0) {
return 0;
}
}
if ((equipped_items & 8) != 0) {
samus_pose = kPose_81_FaceR_Screwattack;
LABEL_40:
if (!samus_anim_frame_skip)
QueueSfx1_Max6(0x33u);
return 0;
}
if ((equipped_items & 0x200) == 0) {
if (samus_anim_frame_skip || cinematic_function)
return 0;
goto LABEL_22;
}
QueueSfx1_Max6(0x3Eu);
samus_pose = kPose_1B_FaceR_SpaceJump;
return 0;
}
static Func_U8 *const off_91F790[12] = { // 0x91F758
Samus_CrouchTrans,
Samus_CrouchTrans,
Samus_MorphTrans,
Samus_MorphTrans,
MaybeUnused_sub_91F7F4,
MaybeUnused_sub_91F840,
Samus_StandOrUnmorphTrans,
Samus_StandOrUnmorphTrans,
Samus_StandOrUnmorphTrans,
Samus_StandOrUnmorphTrans,
Samus_StandOrUnmorphTrans,
Samus_StandOrUnmorphTrans,
};
static Func_U8 *const off_91F7A8[4] = {
Samus_MorphTrans,
Samus_MorphTrans,
Samus_StandOrUnmorphTrans,
Samus_StandOrUnmorphTrans,
};
uint8 SamusFunc_F468_CrouchTransEtc(void) {
uint16 v0;
if (sign16(samus_pose - kPose_F1_FaceR_CrouchTrans_AimU)) {
if (sign16(samus_pose - kPose_DB)) {
v0 = 2 * (samus_pose - 53);
LABEL_4:
samus_momentum_routine_index = 7;
return off_91F790[v0 >> 1]();
}
return off_91F7A8[samus_pose - 219]();
} else {
if (sign16(samus_pose - kPose_F7_FaceR_StandTrans_AimU)) {
v0 = 0;
goto LABEL_4;
}
samus_momentum_routine_index = 7;
}
return 0;
}
uint8 Samus_CrouchTrans(void) { // 0x91F7B0
if (!sign16((speed_boost_counter & 0xFF00) - 1024)) {
samus_shine_timer = 180;
timer_for_shine_timer = 1;
special_samus_palette_frame = 0;
}
return 0;
}
uint8 Samus_StandOrUnmorphTrans(void) { // 0x91F7CC
return 0;
}
uint8 Samus_MorphTrans(void) { // 0x91F7CE
if ((equipped_items & 4) != 0) {
if (samus_prev_movement_type2 == kMovementType_03_SpinJumping)
samus_x_accel_mode = 2;
bomb_spread_charge_timeout_counter = 0;
return 0;
} else {
samus_pose = samus_prev_pose;
return 1;
}
}
uint8 MaybeUnused_sub_91F7F4(void) { // 0x91F7F4
if (samus_prev_movement_type2 == kMovementType_08_MorphBallFalling
|| samus_prev_movement_type2 == kMovementType_13_SpringBallFalling) {
if ((equipped_items & 2) != 0)
samus_pose = kPose_7D_FaceR_Springball_Fall;
else
samus_pose = kPose_31_FaceR_Morphball_Air;
} else if ((equipped_items & 2) != 0) {
samus_pose = kPose_79_FaceR_Springball_Ground;
} else {
samus_pose = kPose_1D_FaceR_Morphball_Ground;
}
return 1;
}
uint8 MaybeUnused_sub_91F840(void) { // 0x91F840
if (samus_prev_movement_type2 == kMovementType_08_MorphBallFalling
|| samus_prev_movement_type2 == kMovementType_13_SpringBallFalling) {
if ((equipped_items & 2) != 0)
samus_pose = kPose_7E_FaceL_Springball_Fall;
else
samus_pose = kPose_32_FaceL_Morphball_Air;
} else if ((equipped_items & 2) != 0) {
samus_pose = kPose_7A_FaceL_Springball_Ground;
} else {
samus_pose = kPose_41_FaceL_Morphball_Ground;
}
return 1;
}
uint8 SamusFunc_F468_Moonwalking(void) { // 0x91F88C
if (moonwalk_flag)
return 0;
if (samus_pose_x_dir == 4)
samus_pose = kPose_25_FaceR_Turn_Stand;
else
samus_pose = kPose_26_FaceL_Turn_Stand;
return 1;
}
uint8 SamusFunc_F468_DamageBoost(void) { // 0x91F8AE
return SamusFunc_F468_DamageBoost_();
}
uint8 MaybeUnused_sub_91F8B0(void) { // 0x91F8B0
if (samus_pose_x_dir == 4)
samus_pose = kPose_54_FaceL_Knockback;
else
samus_pose = kPose_53_FaceR_Knockback;
return 1;
}
uint8 SamusFunc_F468_DamageBoost_(void) { // 0x91F8CB
samus_movement_handler = FUNC16(Samus_MovementHandler_Normal);
return 0;
}
#define kSamusTurnPose_Standing ((uint8*)RomPtr(0x91f9c2))
#define kSamusTurnPose_Crouching ((uint8*)RomPtr(0x91f9cc))
#define kSamusTurnPose_Jumping ((uint8*)RomPtr(0x91f9d6))
#define kSamusTurnPose_Falling ((uint8*)RomPtr(0x91f9e0))
#define kSamusTurnPose_Moonwalk ((uint8*)RomPtr(0x91f9ea))
uint8 SamusFunc_F468_TurningAroundOnGround(void) { // 0x91F8D3
if (samus_prev_pose && samus_prev_pose != kPose_9B_FaceF_VariaGravitySuit) {
uint16 v0 = *(&kPoseParams[0].direction_shots_fired + (uint16)(8 * samus_prev_pose));
if (samus_prev_movement_type2 == kMovementType_10_Moonwalking) {
new_projectile_direction_changed_pose = *(&kPoseParams[0].direction_shots_fired
+ (uint16)(8 * samus_prev_pose)) | 0x100;
if ((button_config_jump_a & joypad1_lastkeys) != 0) {
samus_pose = kSamusTurnPose_Moonwalk[v0];
goto LABEL_9;
}
} else if (samus_prev_movement_type2 == 5) {
samus_pose = kSamusTurnPose_Crouching[*(&kPoseParams[0].direction_shots_fired
+ (uint16)(8 * samus_prev_pose))];
goto LABEL_9;
}
samus_pose = kSamusTurnPose_Standing[v0];
}
LABEL_9:;
uint16 v1 = (__PAIR32__(samus_x_extra_run_speed, samus_x_base_subspeed)
+ __PAIR32__(samus_x_base_speed, samus_x_extra_run_subspeed)) >> 16;
samus_x_base_subspeed += samus_x_extra_run_subspeed;
samus_x_base_speed = v1;
samus_x_extra_run_subspeed = 0;
samus_x_extra_run_speed = 0;
samus_x_accel_mode = 1;
return 1;
}
uint8 SamusFunc_F468_TurnAroundJumping(void) { // 0x91F952
samus_pose = kSamusTurnPose_Jumping[*(&kPoseParams[0].direction_shots_fired + (uint16)(8 * samus_prev_pose))];
uint16 v0 = (__PAIR32__(samus_x_extra_run_speed, samus_x_base_subspeed)
+ __PAIR32__(samus_x_base_speed, samus_x_extra_run_subspeed)) >> 16;
samus_x_base_subspeed += samus_x_extra_run_subspeed;
samus_x_base_speed = v0;
samus_x_extra_run_subspeed = 0;
samus_x_extra_run_speed = 0;
samus_x_accel_mode = 1;
return 1;
}
uint8 SamusFunc_F468_TurnAroundFalling(void) { // 0x91F98A
samus_pose = kSamusTurnPose_Falling[*(&kPoseParams[0].direction_shots_fired + (uint16)(8 * samus_prev_pose))];
uint16 v0 = (__PAIR32__(samus_x_extra_run_speed, samus_x_base_subspeed)
+ __PAIR32__(samus_x_base_speed, samus_x_extra_run_subspeed)) >> 16;
samus_x_base_subspeed += samus_x_extra_run_subspeed;
samus_x_base_speed = v0;
samus_x_extra_run_subspeed = 0;
samus_x_extra_run_speed = 0;
samus_x_accel_mode = 1;
return 1;
}
uint8 SamusFunc_F468_MorphBall(void) { // 0x91F9F4
if (samus_prev_movement_type2 == kMovementType_04_MorphBallOnGround
|| samus_prev_movement_type2 == kMovementType_08_MorphBallFalling) {
samus_anim_frame_skip = FUNC16(Samus_InputHandler);
}
SamusFunc_FA0A();
return 0;
}
void SamusFunc_FA0A(void) { // 0x91FA0F
if (samus_prev_pose_x_dir == 8) {
if (samus_pose_x_dir != 4)
return;
goto LABEL_5;
}
if (samus_pose_x_dir == 8) {
LABEL_5:;
uint16 v0 = (__PAIR32__(samus_x_extra_run_speed, samus_x_base_subspeed)
+ __PAIR32__(samus_x_base_speed, samus_x_extra_run_subspeed)) >> 16;
samus_x_base_subspeed += samus_x_extra_run_subspeed;
samus_x_base_speed = v0;
Samus_CancelSpeedBoost();
samus_x_extra_run_subspeed = 0;
samus_x_extra_run_speed = 0;
samus_x_accel_mode = 1;
}
}
uint8 SamusFunc_F468_Springball(void) { // 0x91FA56
if (samus_prev_movement_type2 == kMovementType_11_SpringBallOnGround
|| samus_prev_movement_type2 == kMovementType_12_SpringBallInAir
|| samus_prev_movement_type2 == kMovementType_13_SpringBallFalling) {
samus_anim_frame_skip = FUNC16(Samus_InputHandler);
}
SamusFunc_FA0A();
return 0;
}
uint8 SamusFunc_F468_WallJumping(void) { // 0x91FA76
Samus_GetBottomBoundary();
if ((fx_y_pos & 0x8000u) != 0) {
if ((lava_acid_y_pos & 0x8000u) == 0 && sign16(lava_acid_y_pos - R18_))
return 0;
} else if (sign16(fx_y_pos - R18_) && (fx_liquid_options & 4) == 0) {
return 0;
}
atmospheric_gfx_frame_and_type[3] = 1536;
atmospheric_gfx_anim_timer[3] = 3;
atmospheric_gfx_y_pos[3] = R18_;
if (samus_pose_x_dir != 8) {
atmospheric_gfx_x_pos[3] = samus_x_pos + 6;
return 0;
}
atmospheric_gfx_x_pos[3] = samus_x_pos - 6;
return 0;
}
static uint16 kSamusFunc_F468_Shinespark[6] = { // 0x91FACA
(uint16)fnSamus_MoveHandler_Shinespark_Horiz,
(uint16)fnSamus_MoveHandler_Shinespark_Horiz,
(uint16)fnSamus_MoveHandlerVerticalShinespark,
(uint16)fnSamus_MoveHandlerVerticalShinespark,
(uint16)fnSamus_MoveHandler_Shinespark_Diag,
(uint16)fnSamus_MoveHandler_Shinespark_Diag,
};
uint8 SamusFunc_F468_Shinespark(void) {
if (sign16(samus_pose - kPose_CF_FaceR_Ranintowall_AimUR)) {
samus_movement_handler = kSamusFunc_F468_Shinespark[samus_pose - 201];
samus_input_handler = FUNC16(nullsub_152);
speed_echoes_index = 0;
speed_echo_xspeed[0] = 0;
speed_echo_xspeed[1] = 0;
speed_echo_xpos[0] = 0;
speed_echo_xpos[1] = 0;
QueueSfx3_Max9(0xFu);
}
return 0;
}
static const uint16 kSamusPhys_AnimDelayInWater = 3;
static const uint16 kSamusPhys_AnimDelayInAcid = 2;
void Samus_SetAnimationFrameIfPoseChanged(void) { // 0x91FB08
if ((equipped_items & 0x20) != 0)
goto LABEL_7;
R18_ = samus_y_pos + *(&kPoseParams[0].y_radius + (uint16)(8 * samus_pose)) - 1;
if ((fx_y_pos & 0x8000u) == 0) {
if (sign16(fx_y_pos - R18_) && (fx_liquid_options & 4) == 0) {
R18_ = kSamusPhys_AnimDelayInWater;
goto LABEL_11;
}
LABEL_7:
R18_ = samus_x_speed_divisor;
goto LABEL_11;
}
if ((lava_acid_y_pos & 0x8000u) != 0 || !sign16(lava_acid_y_pos - R18_))
goto LABEL_7;
R18_ = kSamusPhys_AnimDelayInAcid;
LABEL_11:
if ((samus_anim_frame_skip & 0x8000u) == 0 && samus_pose != samus_prev_pose) {
samus_anim_frame = samus_anim_frame_skip;
samus_anim_frame_timer = R18_
+ *RomPtr_91(
kSamusAnimationDelayData[samus_pose]
+ samus_anim_frame_skip);
}
}
void SamusFunc_EC80(void) { // 0x91FB8E
if (samus_prev_movement_type2 != kMovementType_06_Falling && samus_movement_type == kMovementType_06_Falling) {
samus_y_subspeed = 0;
samus_y_speed = 0;
samus_y_dir = 2;
}
}
void UNUSED_sub_91FC42(void);
void nullsub_24(void) {}
void nullsub_25(void) {}
static Func_V *const kHandleJumpTrans[28] = { // 0x91FBBB
nullsub_24,
nullsub_24,
HandleJumpTransition_NormalJump,
HandleJumpTransition_SpinJump,
nullsub_24,
nullsub_24,
nullsub_24,
nullsub_24,
nullsub_24,
nullsub_24,
nullsub_24,
nullsub_24,
nullsub_24,
UNUSED_sub_91FC42,
nullsub_24,
nullsub_24,
nullsub_24,
nullsub_24,
HandleJumpTransition_SpringBallInAir,
nullsub_24,
HandleJumpTransition_WallJump,
nullsub_24,
nullsub_24,
nullsub_24,
nullsub_24,
nullsub_25,
nullsub_24,
nullsub_24,
};
void HandleJumpTransition(void) {
kHandleJumpTrans[(samus_movement_type)]();
}
void HandleJumpTransition_WallJump(void) { // 0x91FC08
if (samus_prev_movement_type2 != kMovementType_14_WallJumping)
Samus_InitWallJump();
}
void HandleJumpTransition_SpringBallInAir(void) { // 0x91FC18
if (samus_pose == kPose_7F_FaceR_Springball_Air) {
if (samus_prev_movement_type2 != kMovementType_11_SpringBallOnGround)
return;
LABEL_6:
Samus_InitJump();
return;
}
if (samus_pose == kPose_80_FaceL_Springball_Air && samus_prev_movement_type2 == kMovementType_11_SpringBallOnGround)
goto LABEL_6;
}
void UNUSED_sub_91FC42(void) { // 0x91FC42
if (samus_pose == (kPose_44_FaceL_Turn_Crouch | kPose_01_FaceR_Normal | 0x20)) {
if (samus_prev_pose != 100)
return;
LABEL_6:
Samus_InitJump();
return;
}
if (samus_pose == (kPose_44_FaceL_Turn_Crouch | kPose_02_FaceL_Normal | 0x20) && samus_prev_pose == 99)
goto LABEL_6;
}
void HandleJumpTransition_NormalJump(void) { // 0x91FC66
if (samus_pose == kPose_4B_FaceR_Jumptrans
|| samus_pose == kPose_4C_FaceL_Jumptrans
|| !sign16(samus_pose - kPose_55_FaceR_Jumptrans_AimU) && sign16(samus_pose - kPose_5B)) {
if (samus_prev_pose == kPose_27_FaceR_Crouch || samus_prev_pose == kPose_28_FaceL_Crouch)
samus_y_pos -= 10;
Samus_InitJump();
}
}
void HandleJumpTransition_SpinJump(void) { // 0x91FC99
if (samus_prev_movement_type2 != kMovementType_03_SpinJumping
&& samus_prev_movement_type2 != kMovementType_14_WallJumping) {
Samus_InitJump();
}
}
void Samus_Func20(void) { // 0x91FCAF
if (samus_movement_type == 14) {
if (samus_anim_frame == 2 && samus_anim_frame_timer == 1) {
if (samus_pose_x_dir == 4) {
if (samus_pose == kPose_25_FaceR_Turn_Stand)
samus_pose = kPose_D6_FaceL_Xray_Stand;
else
samus_pose = kPose_DA_FaceL_Xray_Crouch;
} else if (samus_pose == kPose_26_FaceL_Turn_Stand) {
samus_pose = kPose_D5_FaceR_Xray_Stand;
} else {
samus_pose = kPose_D9_FaceR_Xray_Crouch;
}
SamusFunc_F433();
Samus_SetAnimationFrameIfPoseChanged();
samus_last_different_pose = samus_prev_pose;
*(uint16 *)&samus_last_different_pose_x_dir = *(uint16 *)&samus_prev_pose_x_dir;
samus_prev_pose = samus_pose;
*(uint16 *)&samus_prev_pose_x_dir = *(uint16 *)&samus_pose_x_dir;
}
} else {
if (samus_pose_x_dir == 4) {
if ((button_config_right & joypad1_lastkeys) == 0)
return;
xray_angle = 256 - xray_angle;
if (samus_movement_type == 5)
samus_pose = kPose_44_FaceL_Turn_Crouch;
else
samus_pose = kPose_26_FaceL_Turn_Stand;
} else {
if ((button_config_left & joypad1_lastkeys) == 0)
return;
xray_angle = 256 - xray_angle;
if (samus_movement_type == kMovementType_05_Crouching)
samus_pose = kPose_43_FaceR_Turn_Crouch;
else
samus_pose = kPose_25_FaceR_Turn_Stand;
}
SamusFunc_F433();
Samus_SetAnimationFrameIfPoseChanged();
samus_last_different_pose = samus_prev_pose;
*(uint16 *)&samus_last_different_pose_x_dir = *(uint16 *)&samus_prev_pose_x_dir;
samus_prev_pose = samus_pose;
*(uint16 *)&samus_prev_pose_x_dir = *(uint16 *)&samus_pose_x_dir;
}
}
static Func_U8 *const off_91FE8A[4] = { // 0x91FDAE
HandleCollDueToChangedPose_Solid_NoColl,
HandleCollDueToChangedPose_Solid_CollAbove,
HandleCollDueToChangedPose_Solid_CollBelow,
HandleCollDueToChangedPose_Solid_CollBoth,
};
static Func_U8 *const off_91FE92[4] = {
HandleCollDueToChangedPose_Block_NoColl,
HandleCollDueToChangedPose_Block_CollAbove,
HandleCollDueToChangedPose_Block_CollBelow,
HandleCollDueToChangedPose_Block_CollBoth,
};
void HandleCollDueToChangedPose(void) {
int16 v0;
if (samus_pose) {
if (samus_pose != kPose_9B_FaceF_VariaGravitySuit) {
solid_enemy_collision_flags = 0;
block_collision_flags = 0;
R18_ = *(&kPoseParams[0].y_radius + (uint16)(8 * samus_pose));
v0 = *(&kPoseParams[0].y_radius + (uint16)(8 * samus_prev_pose));
if (sign16(v0 - R18_)) {
samus_y_radius = *(&kPoseParams[0].y_radius + (uint16)(8 * samus_prev_pose));
samus_y_radius_diff = R18_ - v0;
R18_ -= v0;
R20_ = 0;
samus_collision_direction = 2;
samus_collision_flag = Samus_CheckSolidEnemyColl();
if (samus_collision_flag)
solid_enemy_collision_flags = 1;
samus_space_to_move_up_enemy = R18_;
R18_ = samus_y_radius_diff;
R20_ = 0;
samus_collision_direction = 3;
samus_collision_flag = Samus_CheckSolidEnemyColl();
if (samus_collision_flag)
solid_enemy_collision_flags |= 2u;
samus_space_to_move_down_enemy = R18_;
if (off_91FE8A[solid_enemy_collision_flags]() & 1)
goto LABEL_15;
R18_ = -samus_y_radius_diff;
R20_ = 0;
if (Samus_CollDetectChangedPose() & 1)
block_collision_flags = 1;
samus_space_to_move_up_blocks = R18_;
R18_ = samus_y_radius_diff;
R20_ = 0;
if (Samus_CollDetectChangedPose() & 1)
block_collision_flags |= 2u;
samus_space_to_move_down_blocks = R18_;
if (off_91FE92[block_collision_flags]() & 1)
LABEL_15:
samus_pose = samus_prev_pose;
}
}
}
}
uint8 HandleCollDueToChangedPose_Solid_NoColl(void) { // 0x91FE9A
return 0;
}
uint8 HandleCollDueToChangedPose_Solid_CollBoth(void) { // 0x91FE9C
return 0;
}
uint8 HandleCollDueToChangedPose_Solid_CollAbove(void) { // 0x91FE9E
R18_ = samus_y_radius_diff - samus_space_to_move_up_enemy;
R20_ = 0;
uint16 v1 = samus_y_radius;
samus_y_radius = *(&kPoseParams[0].y_radius + (uint16)(8 * samus_pose));
samus_collision_direction = 3;
samus_collision_flag = Samus_CheckSolidEnemyColl();
if (samus_collision_flag) {
samus_y_radius = v1;
return 1;
} else {
samus_space_to_move_up_enemy = R18_;
samus_y_radius = v1;
return 0;
}
}
uint8 HandleCollDueToChangedPose_Solid_CollBelow(void) { // 0x91FEDF
R18_ = samus_y_radius_diff - samus_space_to_move_down_enemy;
R20_ = 0;
uint16 v1 = samus_y_radius;
samus_y_radius = *(&kPoseParams[0].y_radius + (uint16)(8 * samus_pose));
samus_collision_direction = 2;
samus_collision_flag = Samus_CheckSolidEnemyColl();
if (samus_collision_flag) {
samus_y_radius = v1;
return 1;
} else {
samus_space_to_move_down_enemy = R18_;
samus_y_radius = v1;
return 0;
}
}
uint8 HandleCollDueToChangedPose_Block_CollAbove(void) { // 0x91FF20
R18_ = samus_y_radius_diff - samus_space_to_move_up_blocks;
R20_ = 0;
if (Samus_CollDetectChangedPose() & 1)
return 1;
if ((solid_enemy_collision_flags & 2) != 0)
return HandleCollDueToChangedPose_Block_CollBoth();
samus_y_pos += R18_;
samus_prev_y_pos = samus_y_pos;
return 0;
}
uint8 HandleCollDueToChangedPose_Block_CollBelow(void) { // 0x91FF49
R18_ = samus_space_to_move_down_blocks - samus_y_radius_diff;
R20_ = 0;
if (Samus_CollDetectChangedPose() & 1)
return 1;
if ((solid_enemy_collision_flags & 1) != 0)
return HandleCollDueToChangedPose_Block_CollBoth();
samus_y_pos -= R18_;
samus_prev_y_pos = samus_y_pos;
return 0;
}
uint8 HandleCollDueToChangedPose_Block_NoColl(void) { // 0x91FF76
int16 v0;
v0 = 2 * solid_enemy_collision_flags;
if (!(2 * solid_enemy_collision_flags))
return 0;
switch (v0) {
case 2:
samus_y_pos += samus_space_to_move_up_enemy;
samus_prev_y_pos = samus_y_pos;
return 0;
case 4:
samus_y_pos -= samus_space_to_move_down_enemy;
samus_prev_y_pos = samus_y_pos;
return 0;
case 6:
return HandleCollDueToChangedPose_Block_CollBoth();
default:
Unreachable();
while (1)
;
}
}
uint8 HandleCollDueToChangedPose_Block_CollBoth(void) { // 0x91FFA7
SamusPose v1;
if (sign16(samus_y_radius - 8))
return 1;
if (samus_pose_x_dir == 4)
v1 = kPose_28_FaceL_Crouch;
else
v1 = kPose_27_FaceR_Crouch;
samus_pose = v1;
R18_ = *(&kPoseParams[0].y_radius + (uint16)(8 * v1));
if (sign16(samus_y_radius - R18_)) {
R18_ = samus_y_radius - R18_;
samus_y_pos += R18_;
samus_prev_y_pos = samus_y_pos;
}
return 0;
}