sm64

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

flamethrower.inc.c (2395B)


      1 // flamethrower.inc.c
      2 
      3 void bhv_flamethrower_flame_loop(void) {
      4     f32 scale;
      5     s32 sp18;
      6 
      7     if (o->oTimer == 0) {
      8         o->oAnimState = (s32)(random_float() * 10.0f);
      9         obj_translate_xyz_random(o, 10.0f);
     10     }
     11 
     12     if (o->oBhvParams2ndByte == 2) {
     13         scale = o->oTimer * (o->oForwardVel - 6.0f) / 100.0 + 2.0;
     14     } else {
     15         scale = o->oTimer * (o->oForwardVel - 20.0) / 100.0 + 1.0;
     16     }
     17 
     18     if (o->oBhvParams2ndByte == 3) {
     19         o->hitboxHeight = 200.0f;
     20         o->hitboxDownOffset = 150.0f;
     21         o->oVelY = -28.0f;
     22 
     23         cur_obj_update_floor_height();
     24 
     25         if (o->oPosY - 25.0f * scale < o->oFloorHeight) {
     26             o->oVelY = 0;
     27             o->oPosY = o->oFloorHeight + 25.0f * scale;
     28         }
     29 
     30         sp18 = o->parentObj->oFlameThowerFlameUnk110 / 1.2;
     31     } else {
     32         sp18 = o->parentObj->oFlameThowerFlameUnk110;
     33     }
     34 
     35     cur_obj_scale(scale);
     36 
     37     if (o->oBhvParams2ndByte == 4) {
     38         o->oPosY += o->oForwardVel; // weird?
     39     } else {
     40         cur_obj_move_using_fvel_and_gravity();
     41     }
     42 
     43     if (o->oTimer > sp18) {
     44         obj_mark_for_deletion(o);
     45     }
     46 
     47     o->oInteractStatus = 0;
     48 }
     49 
     50 void bhv_flamethrower_loop(void) {
     51     struct Object *flame;
     52     f32 flameVel;
     53     s32 sp34;
     54     s32 model;
     55     UNUSED u8 filler[8];
     56 
     57     if (o->oAction == 0) {
     58         if ((gCurrLevelNum != LEVEL_BBH || gMarioOnMerryGoRound == TRUE)
     59             && o->oDistanceToMario < 2000.0f) {
     60             o->oAction++;
     61         }
     62     } else if (o->oAction == 1) {
     63         model = MODEL_RED_FLAME;
     64         flameVel = 95.0f;
     65 
     66         if (o->oBhvParams2ndByte == 1) {
     67             model = MODEL_BLUE_FLAME;
     68         }
     69 
     70         if (o->oBhvParams2ndByte == 2) {
     71             flameVel = 50.0f;
     72         }
     73 
     74         sp34 = 1;
     75 
     76         if (o->oTimer < 60) {
     77             sp34 = 15;
     78         } else if (o->oTimer < 74) {
     79             sp34 = 75 - o->oTimer; // Range: [15..2]
     80         } else {
     81             o->oAction++;
     82         }
     83 
     84         o->oFlameThowerUnk110 = sp34;
     85 
     86         flame = spawn_object_relative(o->oBhvParams2ndByte, 0, 0, 0, o, model, bhvFlamethrowerFlame);
     87         flame->oForwardVel = flameVel;
     88 
     89         cur_obj_play_sound_1(SOUND_AIR_BLOW_FIRE);
     90     } else if (o->oTimer > 60) {
     91         o->oAction = 0;
     92     }
     93 }
     94 
     95 void bhv_rr_rotating_bridge_platform_loop(void) {
     96     o->oMoveAngleYaw -= 0x80;
     97     o->oAngleVelYaw = -0x80;
     98 
     99     bhv_flamethrower_loop();
    100 }