// ---------------------------------------------------------------------------- // afterburners_stop() will be called when a ship disengages the afterburners. // // parameters: *objp => pointer to the object starting afterburners // key_released => OPTIONAL parameter (default value 0) // This is only used for the player object, to // manage starting/stopping // void afterburners_stop(object* objp, int key_released) { Assert(objp != NULL); Assert(objp->instance >= 0 && objp->instance < MAX_SHIPS); ship_info* sip; ship* shipp; shipp = &Ships[objp->instance]; Assert(shipp->ship_info_index >= 0 && shipp->ship_info_index < Num_ship_classes); sip = &Ship_info[shipp->ship_info_index]; if ((objp->flags & OF_PLAYER_SHIP) && key_released) { objp->phys_info.flags &= ~PF_AFTERBURNER_WAIT; } if (!(sip->flags & SIF_AFTERBURNER)) { nprintf(("Warning", "Ship type %s does not have afterburner capability\n", sip->name)); return; } if (!(objp->phys_info.flags & PF_AFTERBURNER_ON)) { return; } objp->phys_info.flags &= ~PF_AFTERBURNER_ON; float percent_left; percent_left = shipp->afterburner_fuel / sip->afterburner_fuel_capacity; //Do anim model_anim_start_type(shipp, TRIGGER_TYPE_AFTERBURNER, ANIMATION_SUBTYPE_ALL, -1); if (objp == Player_obj) { if (!key_released) { snd_play(&Snds[SND_ABURN_FAIL]); } if (Player_afterburner_loop_id > -1) { Player_disengage_timer = timestamp(DISENGAGE_TIME); } joy_ff_afterburn_off(); } }
/** * Called when a ship disengages the afterburners. * * @param *objp pointer to the object starting afterburners * @param key_released OPTIONAL parameter (default value 0) This is only used for the player object, to manage starting/stopping */ void afterburners_stop(object *objp, int key_released) { Assert( objp != NULL ); Assert( objp->instance >= 0 && objp->instance < MAX_SHIPS ); ship_info *sip; ship *shipp; shipp = &Ships[objp->instance]; Assert( shipp->ship_info_index >= 0 && shipp->ship_info_index < static_cast<int>(Ship_info.size()) ); sip = &Ship_info[shipp->ship_info_index]; if ( (objp->flags[Object::Object_Flags::Player_ship]) && key_released ) { objp->phys_info.flags &= ~PF_AFTERBURNER_WAIT; } if ( !(sip->flags[Ship::Info_Flags::Afterburner]) ) { nprintf(("Warning","Ship type %s does not have afterburner capability\n", sip->name)); return; } if ( !(objp->phys_info.flags & PF_AFTERBURNER_ON) ) { return; } Script_system.SetHookObjects(1, "Ship", objp); Script_system.RunCondition(CHA_AFTERBURNEND, 0, NULL, objp); Script_system.RemHookVars(1, "Ship"); objp->phys_info.flags &= ~PF_AFTERBURNER_ON; //Do anim model_anim_start_type(shipp, TRIGGER_TYPE_AFTERBURNER, ANIMATION_SUBTYPE_ALL, -1); if ( objp == Player_obj ) { if ( !key_released ) { snd_play( gamesnd_get_game_sound(ship_get_sound(objp, GameSounds::ABURN_FAIL)) ); } if ( Player_afterburner_loop_id > -1 ) { Player_disengage_timer = timestamp(DISENGAGE_TIME); } joy_ff_afterburn_off(); } }
// ---------------------------------------------------------------------------- // afterburners_start() will be called when a ship engages the afterburners. // This function should only be called once when afterburners first start. This is // to start an appropriate sound effect and do any one-time initializations. // // parameters: *objp ==> pointer to the object starting afterburners // void afterburners_start(object* objp) { ship_info* sip; ship* shipp; float percent_left; Assert(objp != NULL); if (objp->type == OBJ_OBSERVER) return; Assert(objp->type == OBJ_SHIP); Assert(objp->instance >= 0 && objp->instance < MAX_SHIPS); shipp = &Ships[objp->instance]; Assert(shipp->ship_info_index >= 0 && shipp->ship_info_index < Num_ship_classes); sip = &Ship_info[shipp->ship_info_index]; // When the ship has no afterburner, leave without doing anything. // Caller should have tested ship equipment before deciding to start afterburners. if (!(sip->flags & SIF_AFTERBURNER)) { nprintf(("Warning", "Ship type %s does not have afterburner capability\n", sip->name)); return; } // bail if afterburners are locked if (shipp->flags2 & SF2_AFTERBURNER_LOCKED) { return; } if (objp->phys_info.flags & PF_GLIDING) { return; } if ((objp->flags & OF_PLAYER_SHIP) && (objp == Player_obj)) { unsigned int now; now = timer_get_milliseconds(); if ((now - Player_afterburner_start_time) < 1300) { if (Viewer_mode & VM_NOT_COCKPIT) { snd_play_3d(&Snds[SND_ABURN_FAIL], &objp->pos, &View_position, objp->radius); } else { snd_play(&Snds[SND_ABURN_FAIL]); } return; } if (objp->phys_info.flags & PF_AFTERBURNER_WAIT) { return; } } if (objp->phys_info.flags & PF_AFTERBURNER_ON) { return; // afterburners are already engaged, nothing to do here } //boosters take precedence if (objp->phys_info.flags & PF_BOOSTER_ON) return; // Check if there is enough afterburner fuel if ((shipp->afterburner_fuel < MIN_AFTERBURNER_FUEL_TO_ENGAGE) && !MULTIPLAYER_CLIENT) { if (objp == Player_obj) { if (Viewer_mode & VM_NOT_COCKPIT) { snd_play_3d(&Snds[SND_ABURN_FAIL], &objp->pos, &View_position, objp->radius); } else { snd_play(&Snds[SND_ABURN_FAIL]); } } return; } objp->phys_info.flags |= PF_AFTERBURNER_ON; objp->phys_info.afterburner_decay = timestamp(ABURN_DECAY_TIME); percent_left = shipp->afterburner_fuel / sip->afterburner_fuel_capacity; //Do anim model_anim_start_type(shipp, TRIGGER_TYPE_AFTERBURNER, ANIMATION_SUBTYPE_ALL, 1); if (objp == Player_obj) { Player_afterburner_start_time = timer_get_milliseconds(); Player_disengage_timer = 1; Player_afterburner_vol = Snds[SND_ABURN_LOOP].default_volume; snd_set_volume(Player_afterburner_loop_id, Player_afterburner_vol); if (percent_left > AFTERBURNER_PERCENT_FOR_LOOP_SND) { Player_afterburner_loop_delay = timestamp(AFTERBURNER_LOOP_DELAY); } else { Player_afterburner_loop_delay = 0; } if (Viewer_mode & VM_NOT_COCKPIT) { snd_play_3d(&Snds[SND_ABURN_ENGAGE], &objp->pos, &View_position, objp->radius); } else { snd_play(&Snds[SND_ABURN_ENGAGE], 0.0f, 1.0f, SND_PRIORITY_MUST_PLAY); } joy_ff_afterburn_on(); } else { snd_play_3d(&Snds[SND_ABURN_ENGAGE], &objp->pos, &View_position, objp->radius); } objp->phys_info.flags |= PF_AFTERBURNER_WAIT; }
/** * Called when a ship engages the afterburners. * This function should only be called once when afterburners first start. This is * to start an appropriate sound effect and do any one-time initializations. * * @param *objp pointer to the object starting afterburners */ void afterburners_start(object *objp) { ship_info *sip; ship *shipp; float percent_left; Assert( objp != NULL ); if(objp->type == OBJ_OBSERVER) return; Assert( objp->type == OBJ_SHIP); Assert( objp->instance >= 0 && objp->instance < MAX_SHIPS ); shipp = &Ships[objp->instance]; Assert( shipp->ship_info_index >= 0 && shipp->ship_info_index < static_cast<int>(Ship_info.size()) ); sip = &Ship_info[shipp->ship_info_index]; // bail if afterburners are locked if (shipp->flags[Ship::Ship_Flags::Afterburner_locked]) { return; } if ( (objp->flags[Object::Object_Flags::Player_ship]) && (objp == Player_obj) ) { unsigned int now; now = timer_get_milliseconds(); if ( (now - Player_afterburner_start_time) < 1300 ) { snd_play( gamesnd_get_game_sound(ship_get_sound(objp, GameSounds::ABURN_FAIL)) ); return; } if ( objp->phys_info.flags & PF_AFTERBURNER_WAIT ){ return; } } if ( objp->phys_info.flags & PF_AFTERBURNER_ON ) { return; // afterburners are already engaged, nothing to do here } //boosters take precedence if (objp->phys_info.flags & PF_BOOSTER_ON) return; if ( !(sip->flags[Ship::Info_Flags::Afterburner]) ) { return; } // Check if there is enough afterburner fuel if ( (shipp->afterburner_fuel < MIN_AFTERBURNER_FUEL_TO_ENGAGE) && !MULTIPLAYER_CLIENT ) { if ( objp == Player_obj ) { snd_play( gamesnd_get_game_sound(ship_get_sound(objp, GameSounds::ABURN_FAIL)) ); } return; } objp->phys_info.flags |= PF_AFTERBURNER_ON; objp->phys_info.afterburner_decay = timestamp(ABURN_DECAY_TIME); percent_left = shipp->afterburner_fuel / sip->afterburner_fuel_capacity; //Do anim model_anim_start_type(shipp, TRIGGER_TYPE_AFTERBURNER, ANIMATION_SUBTYPE_ALL, 1); if ( objp == Player_obj ) { Player_afterburner_start_time = timer_get_milliseconds(); Player_disengage_timer = 1; Player_afterburner_vol = AFTERBURNER_DEFAULT_VOL; if ( percent_left > AFTERBURNER_PERCENT_FOR_LOOP_SND ) { Player_afterburner_loop_delay = timestamp(AFTERBURNER_LOOP_DELAY); } else { Player_afterburner_loop_delay = 0; } snd_play( gamesnd_get_game_sound(ship_get_sound(objp, GameSounds::ABURN_ENGAGE)), 0.0f, 1.0f, SND_PRIORITY_MUST_PLAY ); joy_ff_afterburn_on(); } else { snd_play_3d( gamesnd_get_game_sound(ship_get_sound(objp, GameSounds::ABURN_ENGAGE)), &objp->pos, &View_position, objp->radius ); } Script_system.SetHookObjects(1, "Ship", objp); Script_system.RunCondition(CHA_AFTERBURNSTART, 0, NULL, objp); Script_system.RemHookVars(1, "Ship"); objp->phys_info.flags |= PF_AFTERBURNER_WAIT; }