Fix two crashes. (#15)

This commit is contained in:
Prince Frizzy 2022-03-06 22:14:22 -05:00 committed by MysterD
parent 7c06f5d00e
commit 23e9f02019
2 changed files with 47 additions and 56 deletions

View File

@ -145,10 +145,11 @@ void print_intro_text(void) {
} }
u32 get_mario_spawn_type(struct Object *o) { u32 get_mario_spawn_type(struct Object *o) {
s32 i; if (o == NULL) { return 0; }
const BehaviorScript *behavior = virtual_to_segmented(0x13, o->behavior); const BehaviorScript *behavior = virtual_to_segmented(0x13, o->behavior);
for (i = 0; i < 20; i++) { for (s32 i = 0; i < 20; i++) {
if (sWarpBhvSpawnTable[i] == behavior) { if (sWarpBhvSpawnTable[i] == behavior) {
return sSpawnTypeFromWarpBhv[i]; return sSpawnTypeFromWarpBhv[i];
} }

View File

@ -62,30 +62,38 @@ static f32 sWigglerSpeeds[] = { 2.0f, 40.0f, 30.0f, 16.0f };
* attack. * attack.
*/ */
void bhv_wiggler_body_part_update(void) { void bhv_wiggler_body_part_update(void) {
f32 dx; if (o == NULL) { return; }
f32 dy;
f32 dz; struct Object *parent = o->parentObj;
f32 dxz;
struct ChainSegment *segment = &o->parentObj->oWigglerSegments[o->oBehParams2ndByte]; if (parent == NULL) { return; }
f32 posOffset;
// Sanity check the array size of our segments,
// This should never be higher then 3
// in normal circumstances.
if (o->oBehParams2ndByte > 3) { return; }
struct ChainSegment *segment = &parent->oWigglerSegments[o->oBehParams2ndByte];
if (segment == NULL) { return; }
cur_obj_scale(o->parentObj->header.gfx.scale[0]); cur_obj_scale(parent->header.gfx.scale[0]);
o->oFaceAnglePitch = segment->pitch; o->oFaceAnglePitch = segment->pitch;
o->oFaceAngleYaw = segment->yaw; o->oFaceAngleYaw = segment->yaw;
// TODO: What is this for? // TODO: What is this for?
posOffset = -37.5f * o->header.gfx.scale[0]; f32 posOffset = -37.5f * o->header.gfx.scale[0];
dy = posOffset * coss(o->oFaceAnglePitch) - posOffset; f32 dy = posOffset * coss(o->oFaceAnglePitch) - posOffset;
dxz = posOffset * sins(o->oFaceAnglePitch); f32 dxz = posOffset * sins(o->oFaceAnglePitch);
dx = dxz * sins(o->oFaceAngleYaw); f32 dx = dxz * sins(o->oFaceAngleYaw);
dz = dxz * coss(o->oFaceAngleYaw); f32 dz = dxz * coss(o->oFaceAngleYaw);
o->oPosX = segment->posX + dx; o->oPosX = segment->posX + dx;
o->oPosY = segment->posY + dy; o->oPosY = segment->posY + dy;
o->oPosZ = segment->posZ + dz; o->oPosZ = segment->posZ + dz;
if (o->oPosY < o->parentObj->oWigglerFallThroughFloorsHeight) { if (o->oPosY < parent->oWigglerFallThroughFloorsHeight) {
//! Since position is recomputed each frame, tilting the wiggler up //! Since position is recomputed each frame, tilting the wiggler up
// while on the ground could cause the tail segments to clip through // while on the ground could cause the tail segments to clip through
// the floor // the floor
@ -100,12 +108,12 @@ void bhv_wiggler_body_part_update(void) {
segment->posY = o->oPosY; segment->posY = o->oPosY;
// Inherit walking animation speed from wiggler // Inherit walking animation speed from wiggler
cur_obj_init_animation_with_accel_and_sound(0, o->parentObj->oWigglerWalkAnimSpeed); cur_obj_init_animation_with_accel_and_sound(0, parent->oWigglerWalkAnimSpeed);
if (o->parentObj->oWigglerWalkAnimSpeed == 0.0f) { if (parent->oWigglerWalkAnimSpeed == 0.0f) {
cur_obj_reverse_animation(); cur_obj_reverse_animation();
} }
if (o->parentObj->oAction == WIGGLER_ACT_SHRINK) { if (parent->oAction == WIGGLER_ACT_SHRINK) {
cur_obj_become_intangible(); cur_obj_become_intangible();
} else { } else {
cur_obj_become_tangible(); cur_obj_become_tangible();
@ -117,17 +125,13 @@ void bhv_wiggler_body_part_update(void) {
* Initialize the segment data and spawn the body part objects. * Initialize the segment data and spawn the body part objects.
*/ */
void wiggler_init_segments(void) { void wiggler_init_segments(void) {
s32 i; struct ChainSegment *segments = mem_pool_alloc(gObjectMemoryPool, 4 * sizeof(struct ChainSegment));
struct ChainSegment *segments;
struct Object *bodyPart;
segments = mem_pool_alloc(gObjectMemoryPool, 4 * sizeof(struct ChainSegment));
if (segments != NULL) { if (segments != NULL) {
// Each segment represents the global position and orientation of each // Each segment represents the global position and orientation of each
// object. Segment 0 represents the wiggler's head, and segment i>0 // object. Segment 0 represents the wiggler's head, and segment i>0
// represents body part i. // represents body part i.
o->oWigglerSegments = segments; o->oWigglerSegments = segments;
for (i = 0; i <= 3; i++) { for (s32 i = 0; i <= 3; i++) {
chain_segment_init(segments + i); chain_segment_init(segments + i);
(segments + i)->posX = o->oPosX; (segments + i)->posX = o->oPosX;
@ -141,9 +145,8 @@ void wiggler_init_segments(void) {
o->header.gfx.animInfo.animFrame = -1; o->header.gfx.animInfo.animFrame = -1;
// Spawn each body part // Spawn each body part
for (i = 1; i <= 3; i++) { for (s32 i = 1; i <= 3; i++) {
bodyPart = struct Object *bodyPart = spawn_object_relative(i, 0, 0, 0, o, MODEL_WIGGLER_BODY, bhvWigglerBody);
spawn_object_relative(i, 0, 0, 0, o, MODEL_WIGGLER_BODY, bhvWigglerBody);
if (bodyPart != NULL) { if (bodyPart != NULL) {
obj_init_animation_with_sound(bodyPart, wiggler_seg5_anims_0500C874, 0); obj_init_animation_with_sound(bodyPart, wiggler_seg5_anims_0500C874, 0);
bodyPart->header.gfx.animInfo.animFrame = (23 * i) % 26 - 1; bodyPart->header.gfx.animInfo.animFrame = (23 * i) % 26 - 1;
@ -166,37 +169,26 @@ void wiggler_init_segments(void) {
* for a body part to get stuck on geometry and separate from the rest of the * for a body part to get stuck on geometry and separate from the rest of the
* body. * body.
*/ */
void wiggler_update_segments(void) { void wiggler_update_segments(void) {
struct ChainSegment *prevBodyPart; f32 segmentLength = 35.0f * o->header.gfx.scale[0];
struct ChainSegment *bodyPart;
f32 dx;
f32 dy;
f32 dz;
s16 dpitch;
s16 dyaw;
f32 dxz;
s32 i;
f32 segmentLength;
segmentLength = 35.0f * o->header.gfx.scale[0]; for (s32 i = 1; i <= 3; i++) {
struct ChainSegment *prevBodyPart = &o->oWigglerSegments[i - 1];
struct ChainSegment *bodyPart = &o->oWigglerSegments[i];
for (i = 1; i <= 3; i++) { f32 dx = bodyPart->posX - prevBodyPart->posX;
prevBodyPart = &o->oWigglerSegments[i - 1]; f32 dy = bodyPart->posY - prevBodyPart->posY;
bodyPart = &o->oWigglerSegments[i]; f32 dz = bodyPart->posZ - prevBodyPart->posZ;
dx = bodyPart->posX - prevBodyPart->posX;
dy = bodyPart->posY - prevBodyPart->posY;
dz = bodyPart->posZ - prevBodyPart->posZ;
// As the head turns, propagate this rotation backward if the difference // As the head turns, propagate this rotation backward if the difference
// is more than 45 degrees // is more than 45 degrees
dyaw = atan2s(-dz, -dx) - prevBodyPart->yaw; s16 dyaw = atan2s(-dz, -dx) - prevBodyPart->yaw;
clamp_s16(&dyaw, -0x2000, 0x2000); clamp_s16(&dyaw, -0x2000, 0x2000);
bodyPart->yaw = prevBodyPart->yaw + dyaw; bodyPart->yaw = prevBodyPart->yaw + dyaw;
// As the head tilts, propagate the tilt backward // As the head tilts, propagate the tilt backward
dxz = sqrtf(dx * dx + dz * dz); f32 dxz = sqrtf(dx * dx + dz * dz);
dpitch = atan2s(dxz, dy) - prevBodyPart->pitch; s16 dpitch = atan2s(dxz, dy) - prevBodyPart->pitch;
clamp_s16(&dpitch, -0x2000, 0x2000); clamp_s16(&dpitch, -0x2000, 0x2000);
bodyPart->pitch = prevBodyPart->pitch + dpitch; bodyPart->pitch = prevBodyPart->pitch + dpitch;
@ -218,12 +210,10 @@ void wiggler_init_segments(void) {
* If attacked by mario, enter either the jumped on or knockback action. * If attacked by mario, enter either the jumped on or knockback action.
*/ */
static void wiggler_act_walk(void) { static void wiggler_act_walk(void) {
struct MarioState* marioState = nearest_mario_state_to_object(o); struct MarioState *marioState = nearest_mario_state_to_object(o);
struct Object* player = marioState->marioObj; struct Object *player = marioState->marioObj;
int distanceToPlayer = o->oDistanceToMario; s32 distanceToPlayer = o->oDistanceToMario;
int angleToPlayer = o->oAngleToMario; s32 angleToPlayer = o->oAngleToMario;
s16 yawTurnSpeed;
o->oWigglerWalkAnimSpeed = 0.06f * o->oForwardVel; o->oWigglerWalkAnimSpeed = 0.06f * o->oForwardVel;
@ -274,7 +264,7 @@ static void wiggler_act_walk(void) {
// If moving at high speeds, could overflow. But can't reach such speeds // If moving at high speeds, could overflow. But can't reach such speeds
// in practice // in practice
yawTurnSpeed = (s16)(30.0f * o->oForwardVel); s16 yawTurnSpeed = (s16)(30.0f * o->oForwardVel);
cur_obj_rotate_yaw_toward(o->oWigglerTargetYaw, yawTurnSpeed); cur_obj_rotate_yaw_toward(o->oWigglerTargetYaw, yawTurnSpeed);
obj_face_yaw_approach(o->oMoveAngleYaw, 2 * yawTurnSpeed); obj_face_yaw_approach(o->oMoveAngleYaw, 2 * yawTurnSpeed);