tree_particles.inc.c (2537B)
1 // tree_particles.inc.c 2 3 void bhv_tree_snow_or_leaf_loop(void) { 4 cur_obj_update_floor_height(); 5 6 if (o->oTimer == 0) { 7 o->oAngleVelPitch = (random_float() - 0.5) * 0x1000; 8 o->oAngleVelRoll = (random_float() - 0.5) * 0x1000; 9 o->oTreeSnowOrLeafUnkF8 = 4; 10 o->oTreeSnowOrLeafUnkFC = random_float() * 0x400 + 0x600; 11 } 12 13 if (o->oPosY < o->oFloorHeight) { 14 obj_mark_for_deletion(o); 15 } 16 if (o->oFloorHeight < FLOOR_LOWER_LIMIT) { 17 obj_mark_for_deletion(o); 18 } 19 if (o->oTimer > 100) { 20 obj_mark_for_deletion(o); 21 } 22 if (gPrevFrameObjectCount > (OBJECT_POOL_CAPACITY - 28)) { 23 obj_mark_for_deletion(o); 24 } 25 26 o->oFaceAnglePitch += o->oAngleVelPitch; 27 o->oFaceAngleRoll += o->oAngleVelRoll; 28 o->oVelY += -3.0f; 29 30 if (o->oVelY < -8.0f) { 31 o->oVelY = -8.0f; 32 } 33 34 if (o->oForwardVel > 0) { 35 o->oForwardVel -= 0.3; 36 } else { 37 o->oForwardVel = 0; 38 } 39 40 o->oPosX += sins(o->oMoveAngleYaw) * sins(o->oTreeSnowOrLeafUnkF4) * o->oTreeSnowOrLeafUnkF8; 41 o->oPosZ += coss(o->oMoveAngleYaw) * sins(o->oTreeSnowOrLeafUnkF4) * o->oTreeSnowOrLeafUnkF8; 42 o->oTreeSnowOrLeafUnkF4 += o->oTreeSnowOrLeafUnkFC; 43 o->oPosY += o->oVelY; 44 } 45 46 void bhv_snow_leaf_particle_spawn_init(void) { 47 struct Object *obj; // Either snow or leaf 48 UNUSED u8 filler1[4]; 49 s32 isSnow; 50 f32 scale; 51 UNUSED u8 filler2[4]; 52 53 gMarioObject->oActiveParticleFlags &= ~ACTIVE_PARTICLE_LEAF; 54 55 if (gCurrLevelNum == LEVEL_CCM || gCurrLevelNum == LEVEL_SL) { 56 isSnow = TRUE; 57 } else { 58 isSnow = FALSE; 59 } 60 61 if (isSnow) { 62 if (random_float() < 0.5) { 63 obj = spawn_object(o, MODEL_WHITE_PARTICLE_DL, bhvTreeSnow); 64 scale = random_float(); 65 obj_scale_xyz(obj, scale, scale, scale); 66 obj->oMoveAngleYaw = random_u16(); 67 obj->oForwardVel = random_float() * 5.0f; 68 obj->oVelY = random_float() * 15.0f; 69 } 70 } else { 71 if (random_float() < 0.3) { 72 obj = spawn_object(o, MODEL_LEAVES, bhvTreeLeaf); 73 scale = random_float() * 3.0f; 74 obj_scale_xyz(obj, scale, scale, scale); 75 obj->oMoveAngleYaw = random_u16(); 76 obj->oForwardVel = random_float() * 5.0f + 5.0f; 77 obj->oVelY = random_float() * 15.0f; 78 obj->oFaceAnglePitch = random_u16(); 79 obj->oFaceAngleRoll = random_u16(); 80 obj->oFaceAngleYaw = random_u16(); 81 } 82 } 83 }