/** * @brief Checks whether the speed should be reset due to damage or missile locks. * * @return 1 if the speed should be reset. */ int player_autonavShouldResetSpeed (void) { double failpc, shield, armour; int i, n; Pilot **pstk; int hostiles, will_reset; if (!player_isFlag(PLAYER_AUTONAV)) return 0; hostiles = 0; will_reset = 0; failpc = conf.autonav_reset_speed; shield = player.p->shield / player.p->shield_max; armour = player.p->armour / player.p->armour_max; pstk = pilot_getAll( &n ); for (i=0; i<n; i++) { if ((pstk[i]->id != PLAYER_ID) && pilot_isHostile( pstk[i] ) && pilot_inRangePilot( player.p, pstk[i] ) && !pilot_isDisabled( pstk[i] ) && !pilot_isFlag( pstk[i], PILOT_BRIBED )) { hostiles = 1; break; } } if (hostiles) { if (failpc > .995) { will_reset = 1; player.autonav_timer = MAX( player.autonav_timer, 0. ); } else if ((shield < lasts && shield < failpc) || armour < lasta) { will_reset = 1; player.autonav_timer = MAX( player.autonav_timer, 2. ); } } lasts = shield; lasta = armour; if (will_reset || (player.autonav_timer > 0)) { player_autonavResetSpeed(); return 1; } return 0; }
/** * @brief Ends the autonav. */ void player_autonavEnd (void) { player_rmFlag(PLAYER_AUTONAV); player_autonavResetSpeed(); }
/** * @brief Makes the player take off if landed. * * @param delay Whether or not to have time pass as if the player landed normally. */ void takeoff( int delay ) { int h; char *nt; double a, r; if (!landed) return; /* Player's ship is not able to fly. */ if (!player_canTakeoff()) { char message[512]; pilot_reportSpaceworthy( player.p, message, sizeof(message) ); dialogue_msg( _("Ship not fit for flight"), message ); /* Check whether the player needs rescuing. */ land_stranded(); return; } /* Clear queued takeoff. */ land_takeoff = 0; /* Refuel if needed. */ land_refuel(); /* In case we had paused messy sounds. */ sound_stopAll(); /* ze music */ music_choose("takeoff"); /* to randomize the takeoff a bit */ a = RNGF() * 2. * M_PI; r = RNGF() * land_planet->radius; /* no longer authorized to land */ player_rmFlag(PLAYER_LANDACK); pilot_rmFlag(player.p,PILOT_LANDING); /* No longer landing. */ /* set player to another position with random facing direction and no vel */ player_warp( land_planet->pos.x + r * cos(a), land_planet->pos.y + r * sin(a) ); vect_pset( &player.p->solid->vel, 0., 0. ); player.p->solid->dir = RNGF() * 2. * M_PI; cam_setTargetPilot( player.p->id, 0 ); /* heal the player */ pilot_healLanded( player.p ); /* Clear planet target. Allows for easier autonav out of the system. */ player_targetPlanetSet( -1 ); /* initialize the new space */ h = player.p->nav_hyperspace; space_init(NULL); player.p->nav_hyperspace = h; /* cleanup */ if (save_all() < 0) /* must be before cleaning up planet */ dialogue_alert( _("Failed to save game! You should exit and check the log to see what happened and then file a bug report!") ); /* time goes by, triggers hook before takeoff */ if (delay) ntime_inc( ntime_create( 0, 1, 0 ) ); /* 1 STP */ nt = ntime_pretty( 0, 2 ); player_message( _("\apTaking off from %s on %s."), land_planet->name, nt); free(nt); /* Hooks and stuff. */ land_cleanup(); /* Cleanup stuff */ hooks_run("takeoff"); /* Must be run after cleanup since we don't want the missions to think we are landed. */ if (menu_isOpen(MENU_MAIN)) return; player_addEscorts(); hooks_run("enter"); if (menu_isOpen(MENU_MAIN)) return; events_trigger( EVENT_TRIGGER_ENTER ); missions_run( MIS_AVAIL_SPACE, -1, NULL, NULL ); if (menu_isOpen(MENU_MAIN)) return; player.p->ptimer = PILOT_TAKEOFF_DELAY; pilot_setFlag( player.p, PILOT_TAKEOFF ); pilot_setThrust( player.p, 0. ); pilot_setTurn( player.p, 0. ); /* Reset speed */ player_autonavResetSpeed(); }