void HudGaugeThrottle::renderThrottleSpeed(float current_speed, int y_end) { char buf[32]; int sx, sy, x_pos, y_pos, w, h; //setGaugeColor(); sprintf(buf, "%d", fl2i(current_speed+0.5f)); hud_num_make_mono(buf, font_num); gr_get_string_size(&w, &h, buf); if ( orbit ) { // y_end is the y-coordinate of the current throttle setting, calc x-coordinate for edge of // circle (x^2 + y^2 = r^2) y_pos = position[1] + Orbit_center_offsets[1] - y_end; x_pos = (int)sqrt(double(orbit_radius * orbit_radius - y_pos * y_pos) ); x_pos = position[0] + Orbit_center_offsets[0] - x_pos; // draw current speed at (x_pos, y_end); sx = x_pos - w - 2; sy = fl2i(y_end - h/2.0f + 1.5); } else { sx = position[0] + Orbit_center_offsets[0] - w; sy = position[1] + Orbit_center_offsets[1]; } renderPrintf(sx, sy, buf); if ( object_get_gliding(Player_obj) ) { if ( Use_custom_glide ) { renderString(position[0] + Glide_offsets[0], position[1] + Glide_offsets[1], "GLIDE"); } else { int offset; if ( current_speed <= 9.5 ) { offset = -31; } else if ( current_speed <= 99.5 ) { offset = -22; } else { offset = -13; } renderString(sx+offset, sy + h, "GLIDE"); } } else if ( Players[Player_num].flags & PLAYER_FLAGS_MATCH_TARGET ) { if ( Use_custom_match_speed ) { renderMatchSpeedIcon(position[0] + Match_speed_offsets[0], position[1] + Match_speed_offsets[1]); } else { int offset; if ( current_speed <= 9.5 ) { offset = 0; } else { offset = 3; } renderMatchSpeedIcon(sx+offset, sy + h); } } }
// ******************************************************************************************** bool CanAutopilot(vec3d targetPos, bool send_msg) { if (CurrentNav == -1) { if (send_msg) send_autopilot_msgID(NP_MSG_FAIL_NOSEL); return false; } if (object_get_gliding(Player_obj)) { if (send_msg) send_autopilot_msgID(NP_MSG_FAIL_GLIDING); return false; } // You cannot autopilot if you're within 1000 meters of your destination nav point if (vm_vec_dist_quick(&targetPos, Navs[CurrentNav].GetPosition()) < 1000) { if (send_msg) send_autopilot_msgID(NP_MSG_FAIL_TOCLOSE); return false; } if ( AutopilotMinEnemyDistance > 0 ) { // see if any hostiles are nearby for (ship_obj *so = GET_FIRST(&Ship_obj_list); so != END_OF_LIST(&Ship_obj_list); so = GET_NEXT(so)) { object *other_objp = &Objects[so->objnum]; // attacks player? if (iff_x_attacks_y(obj_team(other_objp), obj_team(Player_obj)) && !(Ship_info[Ships[other_objp->instance].ship_info_index].flags & SIF_CARGO)) // ignore cargo { // Cannot autopilot if enemy within AutopilotMinEnemyDistance meters if (vm_vec_dist_quick(&targetPos, &other_objp->pos) < AutopilotMinEnemyDistance) { if (send_msg) send_autopilot_msgID(NP_MSG_FAIL_HOSTILES); return false; } } } } if ( AutopilotMinAsteroidDistance > 0 ) { //check for asteroids for (int n=0; n<MAX_ASTEROIDS; n++) { // asteroid if (Asteroids[n].flags & AF_USED) { // Cannot autopilot if asteroid within AutopilotMinAsteroidDistance meters if (vm_vec_dist_quick(&targetPos, &Objects[Asteroids[n].objnum].pos) < AutopilotMinAsteroidDistance) { if (send_msg) send_autopilot_msgID(NP_MSG_FAIL_HAZARD); return false; } } } } // check for support ships // cannot autopilot if support ship present if ( ship_find_repair_ship(Player_obj) != 0 ) { if (send_msg) send_autopilot_msgID(NP_MSG_FAIL_SUPPORT_PRESENT); return false; } return true; }