sm64pc/src/game/behaviors/cap.inc.c
2019-08-25 00:46:40 -04:00

270 lines
5.8 KiB
C

// cap.c.inc
static struct ObjectHitbox sCapHitbox = {
/* interactType: */ INTERACT_CAP,
/* downOffset: */ 0,
/* damageOrCoinValue: */ 0,
/* health: */ 0,
/* numLootCoins: */ 0,
/* radius: */ 80,
/* height: */ 80,
/* hurtboxRadius: */ 90,
/* hurtboxHeight: */ 90,
};
s32 func_802F0904(void) {
set_object_hitbox(o, &sCapHitbox);
if (o->oInteractStatus & INT_STATUS_INTERACTED) {
o->activeFlags = 0;
o->oInteractStatus = 0;
return 1;
}
return 0;
}
void func_802F0978(void) {
if (o->oTimer > 300) {
ObjFlickerAndDisappear(o, 300);
}
}
void func_802F09C0(void) {
if (D_803600E0 == NULL)
return;
switch (D_803600E0->type) {
case SURFACE_DEATH_PLANE:
o->activeFlags = 0;
break;
case SURFACE_SHALLOW_QUICKSAND:
case SURFACE_DEEP_QUICKSAND:
case SURFACE_QUICKSAND:
o->oAction = 10;
o->oForwardVel = 0.0f;
break;
case SURFACE_DEEP_MOVING_QUICKSAND:
case SURFACE_SHALLOW_MOVING_QUICKSAND:
case SURFACE_MOVING_QUICKSAND:
o->oAction = 11;
o->oMoveAngleYaw = (D_803600E0->force & 0xFF) << 8;
o->oForwardVel = -((D_803600E0->force & 0xff00) >> 8) * 2 + 8;
break;
case SURFACE_INSTANT_QUICKSAND:
o->oAction = 12;
o->oForwardVel = 0;
break;
case SURFACE_INSTANT_MOVING_QUICKSAND:
o->oAction = 13;
o->oMoveAngleYaw = (D_803600E0->force & 0xFF) << 8;
o->oForwardVel = -((D_803600E0->force & 0xff00) >> 8) * 2 + 8;
break;
}
}
void func_802F0B68(void) {
switch (o->oAction) {
case 10:
if (o->oTimer < 10) {
o->oGraphYOffset += -1.0f;
o->oFaceAnglePitch = 0x2000;
}
break;
case 11:
if (o->oTimer < 10)
o->oGraphYOffset += -3.0f;
o->oFaceAnglePitch = 0x2000;
break;
case 12:
o->oGraphYOffset += -1.0f;
if (o->oTimer >= 21)
o->activeFlags = 0;
break;
case 13:
o->oGraphYOffset += -6.0f;
if (o->oTimer >= 21)
o->activeFlags = 0;
o->oFaceAnglePitch = 0x2000;
break;
}
func_802F09C0();
}
void bhv_wing_cap_init(void) {
o->oGravity = 1.2f;
o->oFriction = 0.999f;
o->oBuoyancy = 0.9f;
o->oOpacity = 255;
}
void func_802F0D70(void) {
o->oUnknownUnkF8_S32 += 0x2000;
o->header.gfx.scale[1] = coss(o->oUnknownUnkF8_S32) * 0.3 + 0.7;
if (o->oUnknownUnkF8_S32 == 0x10000) {
o->oUnknownUnkF8_S32 = 0;
o->oUnknownUnkF4_S32 = 2;
}
}
void func_802F0E0C(void) {
s16 sp1E;
o->oFaceAngleYaw += o->oForwardVel * 128.0f;
sp1E = ObjectStep();
if (sp1E & 0x01) {
func_802F09C0();
if (o->oVelY != 0.0f) {
o->oUnknownUnkF4_S32 = 1;
o->oVelY = 0.0f;
}
}
if (o->oUnknownUnkF4_S32 == 1)
func_802F0D70();
}
void bhv_wing_vanish_cap_loop(void) {
switch (o->oAction) {
case 0:
func_802F0E0C();
break;
default:
ObjectStep();
func_802F0B68();
break;
}
if (o->oTimer > 20)
obj_become_tangible();
func_802F0978();
func_802F0904();
}
void bhv_metal_cap_init(void) {
o->oGravity = 2.4f;
o->oFriction = 0.999f;
o->oBuoyancy = 1.5f;
o->oOpacity = 0xFF;
}
void func_802F0FE0(void) {
s16 sp1E;
o->oFaceAngleYaw += o->oForwardVel * 128.0f;
sp1E = ObjectStep();
if (sp1E & 0x01)
func_802F09C0();
}
void bhv_metal_cap_loop(void) {
switch (o->oAction) {
case 0:
func_802F0FE0();
break;
default:
ObjectStep();
func_802F0B68();
break;
}
if (o->oTimer > 20)
obj_become_tangible();
func_802F0904();
func_802F0978();
}
void bhv_normal_cap_init(void) {
o->oGravity = 0.7f;
o->oFriction = 0.89f;
o->oBuoyancy = 0.9f;
o->oOpacity = 0xFF;
save_file_set_cap_pos(o->oPosX, o->oPosY, o->oPosZ);
}
void func_802F1190(void) {
save_file_clear_flags(SAVE_FLAG_CAP_ON_GROUND);
switch (gCurrCourseNum) {
case COURSE_SSL:
save_file_set_flags(SAVE_FLAG_CAP_ON_KLEPTO);
break;
case COURSE_SL:
save_file_set_flags(SAVE_FLAG_CAP_ON_MR_BLIZZARD);
break;
case COURSE_TTM:
save_file_set_flags(SAVE_FLAG_CAP_ON_UKIKI);
break;
default:
save_file_set_flags(SAVE_FLAG_CAP_ON_KLEPTO);
break;
}
}
void func_802F1234(void) {
s16 sp1E;
o->oFaceAngleYaw += o->oForwardVel * 128.0f;
o->oFaceAnglePitch += o->oForwardVel * 80.0f;
sp1E = ObjectStep();
if (sp1E & 0x01) {
func_802F09C0();
if (o->oVelY != 0.0f) {
o->oUnknownUnkF4_S32 = 1;
o->oVelY = 0.0f;
o->oFaceAnglePitch = 0;
}
}
if (o->oUnknownUnkF4_S32 == 1)
func_802F0D70();
}
void bhv_normal_cap_loop(void) {
switch (o->oAction) {
case 0:
func_802F1234();
break;
default:
ObjectStep();
func_802F0B68();
break;
}
if ((s32) o->oForwardVel != 0)
save_file_set_cap_pos(o->oPosX, o->oPosY, o->oPosZ);
if (o->activeFlags == 0)
func_802F1190();
if (func_802F0904() == 1)
save_file_clear_flags(SAVE_FLAG_CAP_ON_GROUND);
}
void bhv_vanish_cap_init(void) {
o->oGravity = 1.2f;
o->oFriction = 0.999f;
o->oBuoyancy = 0.9f;
o->oOpacity = 150;
}