mirror of https://github.com/n64decomp/sm64.git
parent
9921382a68
commit
bdcfa33b6c
|
|
@ -44,12 +44,13 @@ void bhv_mr_i_particle_loop(void) {
|
|||
|
||||
void spawn_mr_i_particle(void) {
|
||||
struct Object *particle;
|
||||
f32 sp18 = o->header.gfx.scale[1];
|
||||
f32 mr_i_size = o->header.gfx.scale[1];
|
||||
|
||||
// sets particle spawn point to 50u above Mr I and 90u forwards
|
||||
particle = spawn_object(o, MODEL_PURPLE_MARBLE, bhvMrIParticle);
|
||||
particle->oPosY += 50.0f * sp18;
|
||||
particle->oPosX += sins(o->oMoveAngleYaw) * 90.0f * sp18;
|
||||
particle->oPosZ += coss(o->oMoveAngleYaw) * 90.0f * sp18;
|
||||
particle->oPosY += 50.0f * mr_i_size;
|
||||
particle->oPosX += sins(o->oMoveAngleYaw) * 90.0f * mr_i_size;
|
||||
particle->oPosZ += coss(o->oMoveAngleYaw) * 90.0f * mr_i_size;
|
||||
|
||||
cur_obj_play_sound_2(SOUND_OBJ_MRI_SHOOT);
|
||||
}
|
||||
|
|
@ -71,7 +72,7 @@ void bhv_mr_i_body_loop(void) {
|
|||
} else {
|
||||
o->oAnimState++;
|
||||
if (o->oAnimState == 15) {
|
||||
o->parentObj->oMrIUnk110 = 0;
|
||||
o->parentObj->oMrITurnDirection = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -80,58 +81,59 @@ void bhv_mr_i_body_loop(void) {
|
|||
}
|
||||
}
|
||||
|
||||
// death action
|
||||
void mr_i_act_3(void) {
|
||||
s16 sp36;
|
||||
s16 sp34;
|
||||
f32 sp30;
|
||||
f32 sp2C;
|
||||
s16 move_angle_yaw;
|
||||
s16 turn_direction_factor;
|
||||
f32 scale_factor;
|
||||
f32 turning_speed;
|
||||
UNUSED u8 filler[8];
|
||||
f32 sp20;
|
||||
f32 sp1C;
|
||||
f32 scale;
|
||||
f32 big_mr_i_factor;
|
||||
|
||||
if (o->oBhvParams2ndByte != 0) {
|
||||
sp1C = 2.0f;
|
||||
big_mr_i_factor = 2.0f;
|
||||
} else {
|
||||
sp1C = 1.0f;
|
||||
big_mr_i_factor = 1.0f;
|
||||
}
|
||||
|
||||
if (o->oMrIUnk100 < 0) {
|
||||
sp34 = 0x1000;
|
||||
if (o->oMrITurnDirection < 0) {
|
||||
turn_direction_factor = 0x1000;
|
||||
} else {
|
||||
sp34 = -0x1000;
|
||||
turn_direction_factor = -0x1000;
|
||||
}
|
||||
|
||||
sp2C = (o->oTimer + 1) / 96.0f;
|
||||
turning_speed = (o->oTimer + 1) / 96.0f;
|
||||
|
||||
if (o->oTimer < 64) {
|
||||
sp36 = o->oMoveAngleYaw;
|
||||
o->oMoveAngleYaw += sp34 * coss(0x4000 * sp2C);
|
||||
move_angle_yaw = o->oMoveAngleYaw;
|
||||
o->oMoveAngleYaw += turn_direction_factor * coss(0x4000 * turning_speed);
|
||||
|
||||
if (sp36 < 0 && o->oMoveAngleYaw >= 0) {
|
||||
if (move_angle_yaw < 0 && o->oMoveAngleYaw >= 0) {
|
||||
cur_obj_play_sound_2(SOUND_OBJ2_MRI_SPINNING);
|
||||
}
|
||||
|
||||
o->oMoveAnglePitch = (1.0 - coss(0x4000 * sp2C)) * -0x4000;
|
||||
o->oMoveAnglePitch = (1.0 - coss(0x4000 * turning_speed)) * -0x4000;
|
||||
cur_obj_shake_y(4.0f);
|
||||
} else if (o->oTimer < 96) {
|
||||
if (o->oTimer == 64) {
|
||||
cur_obj_play_sound_2(SOUND_OBJ_MRI_DEATH);
|
||||
}
|
||||
|
||||
sp30 = (f32)(o->oTimer - 63) / 32;
|
||||
o->oMoveAngleYaw += sp34 * coss(0x4000 * sp2C);
|
||||
o->oMoveAnglePitch = (1.0 - coss(0x4000 * sp2C)) * -0x4000;
|
||||
scale_factor = (f32)(o->oTimer - 63) / 32;
|
||||
o->oMoveAngleYaw += turn_direction_factor * coss(0x4000 * turning_speed);
|
||||
o->oMoveAnglePitch = (1.0 - coss(0x4000 * turning_speed)) * -0x4000;
|
||||
|
||||
cur_obj_shake_y((s32)((1.0f - sp30) * 4)); // trucating the f32?
|
||||
sp20 = coss(0x4000 * sp30) * 0.4 + 0.6;
|
||||
cur_obj_scale(sp20 * sp1C);
|
||||
cur_obj_shake_y((s32)((1.0f - scale_factor) * 4)); // trucating the f32?
|
||||
scale = coss(0x4000 * scale_factor) * 0.4 + 0.6;
|
||||
cur_obj_scale(scale * big_mr_i_factor);
|
||||
} else if (o->oTimer < 104) {
|
||||
// do nothing
|
||||
} else if (o->oTimer < 168) {
|
||||
if (o->oTimer == 104) {
|
||||
cur_obj_become_intangible();
|
||||
spawn_mist_particles();
|
||||
o->oMrIScale = sp1C * 0.6;
|
||||
o->oMrIScale = big_mr_i_factor * 0.6;
|
||||
if (o->oBhvParams2ndByte != 0) {
|
||||
o->oPosY += 100.0f;
|
||||
spawn_default_star(1370, 2000.0f, -320.0f);
|
||||
|
|
@ -141,7 +143,7 @@ void mr_i_act_3(void) {
|
|||
}
|
||||
}
|
||||
|
||||
o->oMrIScale -= 0.2 * sp1C;
|
||||
o->oMrIScale -= 0.2 * big_mr_i_factor;
|
||||
|
||||
if (o->oMrIScale < 0) {
|
||||
o->oMrIScale = 0;
|
||||
|
|
@ -153,73 +155,74 @@ void mr_i_act_3(void) {
|
|||
}
|
||||
}
|
||||
|
||||
// locked onto Mario action
|
||||
void mr_i_act_2(void) {
|
||||
s16 sp1E = o->oMoveAngleYaw;
|
||||
s16 sp1C;
|
||||
s16 move_angle_yaw = o->oMoveAngleYaw;
|
||||
s16 move_angle_delta;
|
||||
|
||||
if (o->oTimer == 0) {
|
||||
if (o->oBhvParams2ndByte != 0) {
|
||||
o->oMrIUnkF4 = 200;
|
||||
o->oMrITurnCountdown = 200;
|
||||
} else {
|
||||
o->oMrIUnkF4 = 120;
|
||||
o->oMrITurnCountdown = 120;
|
||||
}
|
||||
o->oMrIUnkFC = 0;
|
||||
o->oMrIUnk100 = 0;
|
||||
o->oMrIUnk104 = 0;
|
||||
o->oMrITurnDistance = 0;
|
||||
o->oMrITurnDirection = 0;
|
||||
o->oMrIShotTimer = 0;
|
||||
}
|
||||
|
||||
obj_turn_toward_object(o, gMarioObject, 0x10, 0x800);
|
||||
obj_turn_toward_object(o, gMarioObject, 0x0F, 0x400);
|
||||
obj_turn_toward_object(o, gMarioObject, O_MOVE_ANGLE_YAW_INDEX, 0x800);
|
||||
obj_turn_toward_object(o, gMarioObject, O_MOVE_ANGLE_PITCH_INDEX, 0x400);
|
||||
|
||||
sp1C = sp1E - (s16)(o->oMoveAngleYaw);
|
||||
move_angle_delta = move_angle_yaw - (s16)(o->oMoveAngleYaw);
|
||||
|
||||
if (sp1C == 0) {
|
||||
o->oMrIUnkFC = 0;
|
||||
o->oMrIUnk100 = 0;
|
||||
} else if (sp1C > 0) {
|
||||
if (o->oMrIUnk100 > 0) {
|
||||
o->oMrIUnkFC += sp1C;
|
||||
if (move_angle_delta == 0) {
|
||||
o->oMrITurnDistance = 0;
|
||||
o->oMrITurnDirection = 0;
|
||||
} else if (move_angle_delta > 0) {
|
||||
if (o->oMrITurnDirection > 0) {
|
||||
o->oMrITurnDistance += move_angle_delta;
|
||||
} else {
|
||||
o->oMrIUnkFC = 0;
|
||||
o->oMrITurnDistance = 0;
|
||||
}
|
||||
o->oMrIUnk100 = 1;
|
||||
o->oMrITurnDirection = 1;
|
||||
} else {
|
||||
if (o->oMrIUnk100 < 0) {
|
||||
o->oMrIUnkFC -= sp1C;
|
||||
if (o->oMrITurnDirection < 0) {
|
||||
o->oMrITurnDistance -= move_angle_delta;
|
||||
} else {
|
||||
o->oMrIUnkFC = 0;
|
||||
o->oMrITurnDistance = 0;
|
||||
}
|
||||
o->oMrIUnk100 = -1;
|
||||
o->oMrITurnDirection = -1;
|
||||
}
|
||||
|
||||
if (o->oMrIUnkFC == 0) {
|
||||
o->oMrIUnkF4 = 120;
|
||||
if (o->oMrITurnDistance == 0) {
|
||||
o->oMrITurnCountdown = 120;
|
||||
}
|
||||
if (o->oMrIUnkFC > 65536) {
|
||||
if (o->oMrITurnDistance > 65536) {
|
||||
o->oAction = 3;
|
||||
}
|
||||
|
||||
o->oMrIUnkF4--;
|
||||
o->oMrITurnCountdown--;
|
||||
|
||||
if (o->oMrIUnkF4 == 0) {
|
||||
o->oMrIUnkF4 = 120;
|
||||
o->oMrIUnkFC = 0;
|
||||
if (o->oMrITurnCountdown == 0) {
|
||||
o->oMrITurnCountdown = 120;
|
||||
o->oMrITurnDistance = 0;
|
||||
}
|
||||
|
||||
if (o->oMrIUnkFC < 5000) {
|
||||
if (o->oMrIUnk104 == o->oMrIUnk108) {
|
||||
o->oMrIUnk110 = 1;
|
||||
if (o->oMrITurnDistance < 5000) {
|
||||
if (o->oMrIShotTimer == o->oMrIShotTimerMax) {
|
||||
o->oMrIBlinking = 1;
|
||||
}
|
||||
|
||||
if (o->oMrIUnk104 == o->oMrIUnk108 + 20) {
|
||||
if (o->oMrIShotTimer == o->oMrIShotTimerMax + 20) {
|
||||
spawn_mr_i_particle();
|
||||
o->oMrIUnk104 = 0;
|
||||
o->oMrIUnk108 = (s32)(random_float() * 50.0f + 50.0f);
|
||||
o->oMrIShotTimer = 0;
|
||||
o->oMrIShotTimerMax = (s32)(random_float() * 50.0f + 50.0f);
|
||||
}
|
||||
o->oMrIUnk104++;
|
||||
o->oMrIShotTimer++;
|
||||
} else {
|
||||
o->oMrIUnk104 = 0;
|
||||
o->oMrIUnk108 = (s32)(random_float() * 50.0f + 50.0f);
|
||||
o->oMrIShotTimer = 0;
|
||||
o->oMrIShotTimerMax = (s32)(random_float() * 50.0f + 50.0f);
|
||||
}
|
||||
|
||||
if (o->oDistanceToMario > 800.0f) {
|
||||
|
|
@ -227,45 +230,47 @@ void mr_i_act_2(void) {
|
|||
}
|
||||
}
|
||||
|
||||
// casually turning around action
|
||||
void mr_i_act_1(void) {
|
||||
s16 sp1E = obj_angle_to_object(o, gMarioObject);
|
||||
s16 sp1C = abs_angle_diff(o->oMoveAngleYaw, sp1E);
|
||||
s16 sp1A = abs_angle_diff(o->oMoveAngleYaw, gMarioObject->oFaceAngleYaw);
|
||||
s16 angle_to_mario = obj_angle_to_object(o, gMarioObject);
|
||||
s16 angle_to_mario_diff = abs_angle_diff(o->oMoveAngleYaw, angle_to_mario);
|
||||
s16 eye_contact_diff = abs_angle_diff(o->oMoveAngleYaw, gMarioObject->oFaceAngleYaw);
|
||||
|
||||
if (o->oTimer == 0) {
|
||||
cur_obj_become_tangible();
|
||||
o->oMoveAnglePitch = 0;
|
||||
o->oMrIUnk104 = 30;
|
||||
o->oMrIUnk108 = random_float() * 20.0f;
|
||||
if (o->oMrIUnk108 & 1) {
|
||||
o->oMrIShotTimer = 30;
|
||||
o->oMrIShotTimerMax = random_float() * 20.0f;
|
||||
if (o->oMrIShotTimerMax & 1) {
|
||||
o->oAngleVelYaw = -256;
|
||||
} else {
|
||||
o->oAngleVelYaw = 256;
|
||||
}
|
||||
}
|
||||
|
||||
if (sp1C < 1024 && sp1A > 0x4000) {
|
||||
if (angle_to_mario_diff < 1024 && eye_contact_diff > 0x4000) {
|
||||
if (o->oDistanceToMario < 700.0f) {
|
||||
o->oAction = 2;
|
||||
} else {
|
||||
o->oMrIUnk104++;
|
||||
o->oMrIShotTimer++;
|
||||
}
|
||||
} else {
|
||||
o->oMoveAngleYaw += o->oAngleVelYaw;
|
||||
o->oMrIUnk104 = 30;
|
||||
o->oMrIShotTimer = 30;
|
||||
}
|
||||
|
||||
if (o->oMrIUnk104 == o->oMrIUnk108 + 60) {
|
||||
if (o->oMrIShotTimer == o->oMrIShotTimerMax + 60) {
|
||||
o->oMrIUnk110 = 1;
|
||||
}
|
||||
|
||||
if (o->oMrIUnk104 > o->oMrIUnk108 + 80) {
|
||||
o->oMrIUnk104 = 0;
|
||||
o->oMrIUnk108 = random_float() * 80.0f;
|
||||
if (o->oMrIShotTimer > o->oMrIShotTimerMax + 80) {
|
||||
o->oMrIShotTimer = 0;
|
||||
o->oMrIShotTimerMax = random_float() * 80.0f;
|
||||
spawn_mr_i_particle();
|
||||
}
|
||||
}
|
||||
|
||||
// Mr I init action
|
||||
void mr_i_act_0(void) {
|
||||
#ifndef VERSION_JP
|
||||
obj_set_angle(o, 0, 0, 0);
|
||||
|
|
|
|||
Loading…
Reference in New Issue