2019-08-25 04:46:40 +00:00
|
|
|
// tree_particles.c.inc
|
|
|
|
|
|
|
|
void bhv_tree_snow_or_leaf_loop(void) {
|
2020-03-02 03:42:52 +00:00
|
|
|
cur_obj_update_floor_height();
|
2019-08-25 04:46:40 +00:00
|
|
|
if (o->oTimer == 0) {
|
2020-04-03 18:57:26 +00:00
|
|
|
o->oAngleVelPitch = (random_float() - 0.5) * 0x1000;
|
|
|
|
o->oAngleVelRoll = (random_float() - 0.5) * 0x1000;
|
2019-08-25 04:46:40 +00:00
|
|
|
o->oTreeSnowOrLeafUnkF8 = 4;
|
2020-04-03 18:57:26 +00:00
|
|
|
o->oTreeSnowOrLeafUnkFC = random_float() * 0x400 + 0x600;
|
2019-08-25 04:46:40 +00:00
|
|
|
}
|
|
|
|
if (o->oPosY < o->oFloorHeight)
|
2020-03-02 03:42:52 +00:00
|
|
|
obj_mark_for_deletion(o);
|
2019-08-25 04:46:40 +00:00
|
|
|
if (o->oFloorHeight < -11000.0f)
|
2020-03-02 03:42:52 +00:00
|
|
|
obj_mark_for_deletion(o);
|
2019-08-25 04:46:40 +00:00
|
|
|
if (o->oTimer > 100)
|
2020-03-02 03:42:52 +00:00
|
|
|
obj_mark_for_deletion(o);
|
2019-08-25 04:46:40 +00:00
|
|
|
if (gPrevFrameObjectCount > 212)
|
2020-03-02 03:42:52 +00:00
|
|
|
obj_mark_for_deletion(o);
|
2019-08-25 04:46:40 +00:00
|
|
|
o->oFaceAnglePitch += o->oAngleVelPitch;
|
|
|
|
o->oFaceAngleRoll += o->oAngleVelRoll;
|
|
|
|
o->oVelY += -3.0f;
|
|
|
|
if (o->oVelY < -8.0f)
|
|
|
|
o->oVelY = -8.0f;
|
|
|
|
if (o->oForwardVel > 0)
|
|
|
|
o->oForwardVel -= 0.3;
|
|
|
|
else
|
|
|
|
o->oForwardVel = 0;
|
|
|
|
o->oPosX += sins(o->oMoveAngleYaw) * sins(o->oTreeSnowOrLeafUnkF4) * o->oTreeSnowOrLeafUnkF8;
|
|
|
|
o->oPosZ += coss(o->oMoveAngleYaw) * sins(o->oTreeSnowOrLeafUnkF4) * o->oTreeSnowOrLeafUnkF8;
|
|
|
|
o->oTreeSnowOrLeafUnkF4 += o->oTreeSnowOrLeafUnkFC;
|
|
|
|
o->oPosY += o->oVelY;
|
|
|
|
}
|
|
|
|
|
|
|
|
void bhv_snow_leaf_particle_spawn_init(void) {
|
|
|
|
struct Object *obj; // Either snow or leaf
|
|
|
|
UNUSED s32 unused;
|
|
|
|
s32 isSnow;
|
|
|
|
f32 scale;
|
|
|
|
UNUSED s32 unused2;
|
|
|
|
gMarioObject->oActiveParticleFlags &= ~0x2000;
|
|
|
|
if (gCurrLevelNum == LEVEL_CCM || gCurrLevelNum == LEVEL_SL)
|
|
|
|
isSnow = 1;
|
|
|
|
else
|
|
|
|
isSnow = 0;
|
|
|
|
if (isSnow) {
|
2020-04-03 18:57:26 +00:00
|
|
|
if (random_float() < 0.5) {
|
2019-08-25 04:46:40 +00:00
|
|
|
obj = spawn_object(o, MODEL_WHITE_PARTICLE_DL, bhvTreeSnow);
|
2020-04-03 18:57:26 +00:00
|
|
|
scale = random_float();
|
2020-03-02 03:42:52 +00:00
|
|
|
obj_scale_xyz(obj, scale, scale, scale);
|
2020-04-03 18:57:26 +00:00
|
|
|
obj->oMoveAngleYaw = random_u16();
|
|
|
|
obj->oForwardVel = random_float() * 5.0f;
|
|
|
|
obj->oVelY = random_float() * 15.0f;
|
2019-08-25 04:46:40 +00:00
|
|
|
}
|
|
|
|
} else {
|
2020-04-03 18:57:26 +00:00
|
|
|
if (random_float() < 0.3) {
|
2019-08-25 04:46:40 +00:00
|
|
|
obj = spawn_object(o, MODEL_LEAVES, bhvTreeLeaf);
|
2020-04-03 18:57:26 +00:00
|
|
|
scale = random_float() * 3.0f;
|
2020-03-02 03:42:52 +00:00
|
|
|
obj_scale_xyz(obj, scale, scale, scale);
|
2020-04-03 18:57:26 +00:00
|
|
|
obj->oMoveAngleYaw = random_u16();
|
|
|
|
obj->oForwardVel = random_float() * 5.0f + 5.0f;
|
|
|
|
obj->oVelY = random_float() * 15.0f;
|
|
|
|
obj->oFaceAnglePitch = random_u16();
|
|
|
|
obj->oFaceAngleRoll = random_u16();
|
|
|
|
obj->oFaceAngleYaw = random_u16();
|
2019-08-25 04:46:40 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|