sm64

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

wdw_water_level.inc.c (2875B)


      1 // wdw_water_level.inc.c
      2 
      3 // called when WDW is loaded.
      4 void bhv_init_changing_water_level_loop(void) {
      5     if (o->oAction == 0) {
      6         if (gEnvironmentRegions != NULL) {
      7             o->oAction++;
      8         }
      9     } else if (o->oTimer < 10) {
     10         gEnvironmentLevels[0] = gEnvironmentRegions[6];
     11     } else {
     12         gEnvironmentRegions[6] = gEnvironmentLevels[0] + sins(o->oWaterLevelTriggerUnkF4) * 20.0f;
     13         o->oWaterLevelTriggerUnkF4 += 0x200;
     14     }
     15 }
     16 
     17 void bhv_water_level_diamond_loop(void) {
     18     if (gEnvironmentRegions != NULL) {
     19         switch (o->oAction) {
     20             case WATER_LEVEL_DIAMOND_ACT_INIT:
     21                 o->oFaceAngleYaw = 0;
     22                 o->oWaterLevelTriggerTargetWaterLevel = (s32) o->oPosY;
     23                 if (o->oTimer > 10) {
     24                     o->oAction++; // Sets to WATER_LEVEL_DIAMOND_ACT_IDLE
     25                 }
     26                 break;
     27 
     28             case WATER_LEVEL_DIAMOND_ACT_IDLE:
     29                 if (obj_check_if_collided_with_object(o, gMarioObject) && !gWDWWaterLevelChanging) {
     30                     o->oAction++; // Sets to WATER_LEVEL_DIAMOND_ACT_CHANGE_WATER_LEVEL
     31                     gWDWWaterLevelChanging = TRUE;
     32                 }
     33                 break;
     34 
     35             case WATER_LEVEL_DIAMOND_ACT_CHANGE_WATER_LEVEL:
     36                 o->oAngleVelYaw = 0;
     37                 gEnvironmentLevels[0] = (s32) approach_f32_symmetric(
     38                     (f32) gEnvironmentLevels[0], (f32) o->oWaterLevelTriggerTargetWaterLevel, 10.0f);
     39                 if (gEnvironmentLevels[0] == o->oWaterLevelTriggerTargetWaterLevel) {
     40                     if ((s16) o->oFaceAngleYaw == 0) {
     41                         o->oAction++; // Sets to WATER_LEVEL_DIAMOND_ACT_IDLE_SPINNING
     42                     } else {
     43                         o->oAngleVelYaw = 0x800;
     44                     }
     45                 } else {
     46                     if (o->oTimer == 0) {
     47                         cur_obj_play_sound_2(SOUND_GENERAL_WATER_LEVEL_TRIG);
     48                     } else {
     49                         if (gEnvironmentLevels[0] > o->oWaterLevelTriggerTargetWaterLevel) {
     50                             cur_obj_play_sound_1(SOUND_ENV_WATER_DRAIN);
     51                         } else {
     52                             cur_obj_play_sound_1(SOUND_ENV_WATER_DRAIN); // same as above
     53                         }
     54                     }
     55                     o->oAngleVelYaw = 0x800;
     56 #if ENABLE_RUMBLE
     57                     reset_rumble_timers_2(2);
     58 #endif
     59                 }
     60                 break;
     61 
     62             case WATER_LEVEL_DIAMOND_ACT_IDLE_SPINNING:
     63                 if (!obj_check_if_collided_with_object(o, gMarioObject)) {
     64                     gWDWWaterLevelChanging = FALSE;
     65                     o->oAction = WATER_LEVEL_DIAMOND_ACT_IDLE;
     66                     o->oAngleVelYaw = 0;
     67                 }
     68                 break;
     69         }
     70 
     71         o->oFaceAngleYaw += o->oAngleVelYaw;
     72     }
     73 }