sm64

A Super Mario 64 decompilation
Log | Files | Refs | README | LICENSE

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 }