sm64

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

drawbridge.inc.c (1867B)


      1 // drawbridge.inc.c
      2 
      3 void bhv_lll_drawbridge_spawner_loop(void) {
      4     struct Object *drawbridge1, *drawbridge2;
      5 
      6     drawbridge1 = spawn_object(o, MODEL_LLL_DRAWBRIDGE_PART, bhvLLLDrawbridge);
      7     drawbridge1->oMoveAngleYaw = o->oMoveAngleYaw;
      8     drawbridge1->oPosX += coss(o->oMoveAngleYaw) * 640.0f;
      9     drawbridge1->oPosZ += sins(o->oMoveAngleYaw) * 640.0f;
     10 
     11     drawbridge2 = spawn_object(o, MODEL_LLL_DRAWBRIDGE_PART, bhvLLLDrawbridge);
     12     drawbridge2->oMoveAngleYaw = o->oMoveAngleYaw + 0x8000;
     13     drawbridge2->oPosX += coss(o->oMoveAngleYaw) * -640.0f;
     14     drawbridge2->oPosZ += sins(o->oMoveAngleYaw) * -640.0f;
     15 
     16     o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
     17 }
     18 
     19 void bhv_lll_drawbridge_loop(void) {
     20     s32 globalTimer = gGlobalTimer;
     21 
     22     switch (o->oAction) {
     23         case LLL_DRAWBRIDGE_ACT_LOWER:
     24             o->oFaceAngleRoll += 0x100;
     25             break;
     26 
     27         case LLL_DRAWBRIDGE_ACT_RAISE:
     28             o->oFaceAngleRoll -= 0x100;
     29             break;
     30     }
     31 
     32     if ((s16) o->oFaceAngleRoll < -0x1FFD) {
     33         o->oFaceAngleRoll = 0xDFFF;
     34 
     35         //! Because the global timer increments when the game is paused, pausing and unpausing
     36         //  the game at regular intervals can leave the drawbridge raised indefinitely.
     37         if (o->oTimer > 50 && (globalTimer % 8) == 0) {
     38             o->oAction = LLL_DRAWBRIDGE_ACT_LOWER;
     39             cur_obj_play_sound_2(SOUND_GENERAL_BOAT_TILT1);
     40         }
     41     }
     42 
     43     if ((s16) o->oFaceAngleRoll >= 0) {
     44         o->oFaceAngleRoll = 0;
     45 
     46         //! Because the global timer increments when the game is paused, pausing and unpausing
     47         //  the game at regular intervals can leave the drawbridge lowered indefinitely.
     48         if (o->oTimer > 50 && (globalTimer % 8) == 0) {
     49             o->oAction = LLL_DRAWBRIDGE_ACT_RAISE;
     50             cur_obj_play_sound_2(SOUND_GENERAL_BOAT_TILT2);
     51         }
     52     }
     53 }