// ------------------------------------------------------------------ // hud_augment_shield_quadrant() // // Transfer shield energy to a shield quadrant from the three other // quadrants. Works by trying to transfer a fixed amount of shield // energy from the other three quadrants, taking the same percentage // from each quadrant. // // input: objp => object to perform shield transfer on // direction => which quadrant to augment: // 0 - right // 1 - top // 2 - bottom // 3 - left // void hud_augment_shield_quadrant(object *objp, int direction) { Assert(objp->type == OBJ_SHIP); ship *shipp = &Ships[objp->instance]; ship_info *sip = &Ship_info[shipp->ship_info_index]; float xfer_amount, energy_avail, percent_to_take, delta; float max_quadrant_val; int i; if (sip->flags[Ship::Info_Flags::Model_point_shields]) { direction = sip->shield_point_augment_ctrls[direction]; // The re-mapped direction can be -1 if this direction cannot be augmented if (direction < 0) return; } Assert(direction >= 0 && direction < objp->n_quadrants); xfer_amount = shipp->ship_max_shield_strength * SHIELD_TRANSFER_PERCENT; max_quadrant_val = get_max_shield_quad(objp); if ( (objp->shield_quadrant[direction] + xfer_amount) > max_quadrant_val ) xfer_amount = max_quadrant_val - objp->shield_quadrant[direction]; Assert(xfer_amount >= 0); if ( xfer_amount == 0 ) { // TODO: provide a feedback sound return; } else { snd_play( &Snds[SND_SHIELD_XFER_OK] ); } energy_avail = 0.0f; for ( i = 0; i < objp->n_quadrants; i++ ) { if ( i == direction ) continue; energy_avail += objp->shield_quadrant[i]; } percent_to_take = xfer_amount/energy_avail; if ( percent_to_take > 1.0f ) percent_to_take = 1.0f; for ( i = 0; i < objp->n_quadrants; i++ ) { if ( i == direction ) continue; delta = percent_to_take * objp->shield_quadrant[i]; objp->shield_quadrant[i] -= delta; Assert(objp->shield_quadrant[i] >= 0 ); objp->shield_quadrant[direction] += delta; if ( objp->shield_quadrant[direction] > max_quadrant_val ) objp->shield_quadrant[direction] = max_quadrant_val; } }
// ------------------------------------------------------------------ // hud_augment_shield_quadrant() // // Transfer shield energy to a shield quadrant from the three other // quadrants. Works by trying to transfer a fixed amount of shield // energy from the other three quadrants, taking the same percentage // from each quadrant. // // input: objp => object to perform shield transfer on // direction => which quadrant to augment: // 0 - right // 1 - top // 2 - bottom // 3 - left // void hud_augment_shield_quadrant(object* objp, int direction) { float xfer_amount, energy_avail, percent_to_take, delta; float max_quadrant_val; int i; Assert(direction >= 0 && direction < MAX_SHIELD_SECTIONS); Assert(objp->type == OBJ_SHIP); xfer_amount = Ships[objp->instance].ship_max_shield_strength * SHIELD_TRANSFER_PERCENT; max_quadrant_val = get_max_shield_quad(objp); if ((objp->shield_quadrant[direction] + xfer_amount) > max_quadrant_val) xfer_amount = max_quadrant_val - objp->shield_quadrant[direction]; Assert(xfer_amount >= 0); if (xfer_amount == 0) { // TODO: provide a feedback sound return; } else { snd_play(&Snds[SND_SHIELD_XFER_OK]); } energy_avail = 0.0f; for (i = 0; i < MAX_SHIELD_SECTIONS; i++) { if (i == direction) continue; energy_avail += objp->shield_quadrant[i]; } percent_to_take = xfer_amount / energy_avail; if (percent_to_take > 1.0f) percent_to_take = 1.0f; for (i = 0; i < MAX_SHIELD_SECTIONS; i++) { if (i == direction) continue; delta = percent_to_take * objp->shield_quadrant[i]; objp->shield_quadrant[i] -= delta; Assert(objp->shield_quadrant[i] >= 0); objp->shield_quadrant[direction] += delta; if (objp->shield_quadrant[direction] > max_quadrant_val) objp->shield_quadrant[direction] = max_quadrant_val; } }
/** * Returns true if the shield presents any opposition to something trying to force through it. * * @return If quadrant is -1, looks at entire shield, otherwise just one quadrant */ int ship_is_shield_up( object *obj, int quadrant ) { if ( (quadrant >= 0) && (quadrant < MAX_SHIELD_SECTIONS)) { // Just check one quadrant if (obj->shield_quadrant[quadrant] > MAX(2.0f, 0.1f * get_max_shield_quad(obj))) { return 1; } } else { // Check all quadrants float strength = shield_get_strength(obj); if ( strength > MAX(2.0f*4.0f, 0.1f * Ships[obj->instance].ship_max_shield_strength )) { return 1; } } return 0; // no shield strength }
// Draw the miniature shield icon that is drawn near the reticle void HudGaugeShieldMini::showMiniShields(object *objp) { float max_shield; int hud_color_index, range, frame_offset; int sx, sy, i; if ( objp->type != OBJ_SHIP ) { return; } setGaugeColor(); sx = position[0]+fl2i(HUD_offset_x); sy = position[1]+fl2i(HUD_offset_y); // draw the ship first maybeFlashShield(SHIELD_HIT_TARGET, Shield_hit_data[SHIELD_HIT_TARGET].hull_hit_index); showIntegrity(get_hull_pct(objp)); // draw the four quadrants // Draw shield quadrants at one of NUM_SHIELD_LEVELS max_shield = get_max_shield_quad(objp); for ( i = 0; i < objp->n_quadrants; i++ ) { if ( objp->flags[Object::Object_Flags::No_shields] ) { break; } if ( objp->shield_quadrant[Quadrant_xlate[i]] < 0.1f ) { continue; } if ( maybeFlashShield(SHIELD_HIT_TARGET, i) ) { frame_offset = i+objp->n_quadrants; } else { frame_offset = i; } range = HUD_color_alpha; hud_color_index = fl2i( (objp->shield_quadrant[Quadrant_xlate[i]] / max_shield) * range + 0.5); Assert(hud_color_index >= 0 && hud_color_index <= range); if ( hud_color_index < 0 ) { hud_color_index = 0; } if ( hud_color_index >= HUD_NUM_COLOR_LEVELS ) { hud_color_index = HUD_NUM_COLOR_LEVELS - 1; } if ( maybeFlashSexp() == 1) { // hud_set_bright_color(); setGaugeColor(HUD_C_BRIGHT); } else { // gr_set_color_fast(&HUD_color_defaults[hud_color_index]); setGaugeColor(hud_color_index); } if (frame_offset < Shield_mini_gauge.num_frames) renderBitmap(Shield_mini_gauge.first_frame + frame_offset, sx, sy); } // hud_set_default_color(); }
void HudGaugeShield::showShields(object *objp, int mode) { // static int fod_model = -1; float max_shield; int hud_color_index, range; int sx, sy, i; ship *sp; ship_info *sip; hud_frames *sgp=NULL; if ( objp->type != OBJ_SHIP ) return; // Goober5000 - don't show if primitive sensors if ( Ships[Player_obj->instance].flags[Ship::Ship_Flags::Primitive_sensors] ) return; sp = &Ships[objp->instance]; sip = &Ship_info[sp->ship_info_index]; // bool digitus_improbus = (fod_model != -2 && strstr(sp->ship_name, "Sathanas") != NULL); if ( sip->shield_icon_index == 255 && !(sip->flags[Ship::Info_Flags::Generate_hud_icon]) /*&& !digitus_improbus*/) { return; } setGaugeColor(); // load in shield frames if not already loaded if (sip->shield_icon_index != 255) { sgp = &Shield_gauges.at(sip->shield_icon_index); if ( (sgp->first_frame == -1) && (sip->shield_icon_index < Hud_shield_filenames.size()) ) { sgp->first_frame = bm_load_animation(Hud_shield_filenames.at(sip->shield_icon_index).c_str(), &sgp->num_frames); if (sgp->first_frame == -1) { if (!shield_ani_warning_displayed_already) { shield_ani_warning_displayed_already = true; Warning(LOCATION, "Could not load in the HUD shield ani: %s\n", Hud_shield_filenames.at(sip->shield_icon_index).c_str()); } return; } } } sx = position[0]; sy = position[1]; sx += fl2i(HUD_offset_x); sy += fl2i(HUD_offset_y); // draw the ship first maybeFlashShield(SHIELD_HIT_PLAYER, Shield_hit_data[SHIELD_HIT_PLAYER].hull_hit_index); if(sip->shield_icon_index != 255) { renderBitmap(sgp->first_frame, sx, sy); } else { bool g3_yourself = !g3_in_frame(); angles rot_angles = {-1.570796327f,0.0f,0.0f}; matrix object_orient; vm_angles_2_matrix(&object_orient, &rot_angles); gr_screen.clip_width = 112; gr_screen.clip_height = 93; //Fire it up if(g3_yourself) g3_start_frame(1); hud_save_restore_camera_data(1); setClip(sx, sy, 112, 93); //if(!digitus_improbus) g3_set_view_matrix( &sip->closeup_pos, &vmd_identity_matrix, sip->closeup_zoom * 2.5f); /*else { vec3d finger_vec = {0.0f, 0.0f, 176.0f}; g3_set_view_matrix( &finger_vec, &vmd_identity_matrix, 1.0f); }*/ gr_set_proj_matrix(0.5f*Proj_fov, gr_screen.clip_aspect, Min_draw_distance, Max_draw_distance); gr_set_view_matrix(&Eye_position, &Eye_matrix); //We're ready to show stuff //if(!digitus_improbus) { model_render_params render_info; render_info.set_flags(MR_NO_LIGHTING | MR_AUTOCENTER | MR_NO_FOGGING); render_info.set_replacement_textures(sp->ship_replacement_textures); render_info.set_detail_level_lock(1); render_info.set_object_number(OBJ_INDEX(objp)); model_render_immediate( &render_info, sip->model_num, &object_orient, &vmd_zero_vector ); } /*else { if(fod_model == -1) { fod_model = model_load(NOX("FoD.pof"), 0, NULL); if(fod_model == -1) { fod_model = -2; return; } } model_render(fod_model, &object_orient, &vmd_zero_vector, MR_NO_LIGHTING | MR_LOCK_DETAIL | MR_AUTOCENTER | MR_NO_FOGGING, -1, -1); }*/ //We're done gr_end_view_matrix(); gr_end_proj_matrix(); if(g3_yourself) g3_end_frame(); hud_save_restore_camera_data(0); resetClip(); } if(!sip->max_shield_strength) return; // draw the quadrants // // Draw shield quadrants at one of NUM_SHIELD_LEVELS max_shield = get_max_shield_quad(objp); coord2d shield_icon_coords[6]; for ( i = 0; i < objp->n_quadrants; i++ ) { if ( objp->flags[Object::Object_Flags::No_shields] ) { break; } if ( !(sip->flags[Ship::Info_Flags::Model_point_shields]) ) { if ( objp->shield_quadrant[Quadrant_xlate[i]] < 0.1f ) continue; } else { if ( objp->shield_quadrant[i] < 0.1f ) continue; } range = MAX(HUD_COLOR_ALPHA_MAX, HUD_color_alpha + objp->n_quadrants); if ( !(sip->flags[Ship::Info_Flags::Model_point_shields]) ) hud_color_index = fl2i( (objp->shield_quadrant[Quadrant_xlate[i]] / max_shield) * range); else hud_color_index = fl2i( (objp->shield_quadrant[i] / max_shield) * range); Assert(hud_color_index >= 0 && hud_color_index <= range); if ( hud_color_index < 0 ) { hud_color_index = 0; } if ( hud_color_index >= HUD_NUM_COLOR_LEVELS ) { hud_color_index = HUD_NUM_COLOR_LEVELS - 1; } int flash=0; flash = maybeFlashShield(mode, i); if ( !flash ) { // gr_set_color_fast(&HUD_color_defaults[hud_color_index]); setGaugeColor(hud_color_index); if(sip->shield_icon_index != 255) { int framenum = sgp->first_frame+i+1; if (framenum < sgp->first_frame+sgp->num_frames) renderBitmap(framenum, sx, sy); } else { //Ugh, draw four shield quadrants static const int TRI_EDGE = 6; static const int BAR_LENGTH = 112; static const int BAR_HEIGHT = 54; static const int BAR_WIDTH = 6; static const int SHIELD_OFFSET = BAR_WIDTH + TRI_EDGE + 3; switch(i) { //Top case 0: shield_icon_coords[0].x = sx; shield_icon_coords[0].y = sy+BAR_WIDTH+TRI_EDGE; shield_icon_coords[1].x = sx; shield_icon_coords[1].y = sy; shield_icon_coords[2].x = sx+TRI_EDGE; shield_icon_coords[2].y = sy+BAR_WIDTH; shield_icon_coords[3].x = sx+BAR_LENGTH; shield_icon_coords[3].y = sy; shield_icon_coords[4].x = sx+BAR_LENGTH-TRI_EDGE; shield_icon_coords[4].y = sy+BAR_WIDTH; shield_icon_coords[5].x = sx+BAR_LENGTH; shield_icon_coords[5].y = sy+BAR_WIDTH+TRI_EDGE; renderShieldIcon(shield_icon_coords); break; //Left case 3: sy += SHIELD_OFFSET; shield_icon_coords[0].x = sx+BAR_WIDTH+TRI_EDGE; shield_icon_coords[0].y = sy+BAR_HEIGHT; shield_icon_coords[1].x = sx; shield_icon_coords[1].y = sy+BAR_HEIGHT; shield_icon_coords[2].x = sx+BAR_WIDTH; shield_icon_coords[2].y = sy+BAR_HEIGHT-TRI_EDGE; shield_icon_coords[3].x = sx; shield_icon_coords[3].y = sy; shield_icon_coords[4].x = sx+BAR_WIDTH; shield_icon_coords[4].y = sy+TRI_EDGE; shield_icon_coords[5].x = sx+BAR_WIDTH+TRI_EDGE; shield_icon_coords[5].y = sy; renderShieldIcon(shield_icon_coords); sy -= SHIELD_OFFSET + BAR_WIDTH + TRI_EDGE; break; //Right case 1: sx += BAR_LENGTH; sy += SHIELD_OFFSET; shield_icon_coords[0].x = sx-BAR_WIDTH-TRI_EDGE; shield_icon_coords[0].y = sy; shield_icon_coords[1].x = sx; shield_icon_coords[1].y = sy; shield_icon_coords[2].x = sx-BAR_WIDTH; shield_icon_coords[2].y = sy+TRI_EDGE; shield_icon_coords[3].x = sx; shield_icon_coords[3].y = sy+BAR_HEIGHT; shield_icon_coords[4].x = sx-BAR_WIDTH; shield_icon_coords[4].y = sy+BAR_HEIGHT-TRI_EDGE; shield_icon_coords[5].x = sx-BAR_WIDTH-TRI_EDGE; shield_icon_coords[5].y = sy+BAR_HEIGHT; renderShieldIcon(shield_icon_coords); sx -= BAR_LENGTH; sy -= SHIELD_OFFSET; break; //Bottom case 2: sy += BAR_HEIGHT + SHIELD_OFFSET*2 - BAR_WIDTH - TRI_EDGE; shield_icon_coords[0].x = sx+BAR_LENGTH; shield_icon_coords[0].y = sy; shield_icon_coords[1].x = sx+BAR_LENGTH; shield_icon_coords[1].y = sy+BAR_WIDTH+TRI_EDGE; shield_icon_coords[2].x = sx+BAR_LENGTH-TRI_EDGE; shield_icon_coords[2].y = sy+TRI_EDGE; shield_icon_coords[3].x = sx; shield_icon_coords[3].y = sy+BAR_WIDTH+TRI_EDGE; shield_icon_coords[4].x = sx+TRI_EDGE; shield_icon_coords[4].y = sy+TRI_EDGE; shield_icon_coords[5].x = sx; shield_icon_coords[5].y = sy; renderShieldIcon(shield_icon_coords); sy -= BAR_HEIGHT + SHIELD_OFFSET*2 - BAR_WIDTH - TRI_EDGE; break; //Whoops? default: nprintf(("HUD", "Invalid shield quadrant %d specified!\n", i)); break; } } } } // hud_set_default_color(); }
// Draw the miniature shield icon that is drawn near the reticle // this function is only used by multi_ingame_join_display_ship() in multi_ingame.cpp as of the new HudGauge implementation (Swifty) void hud_shield_show_mini(object *objp, int x_force, int y_force, int x_hull_offset, int y_hull_offset) { float max_shield; int hud_color_index, range, frame_offset; int sx, sy, i; if ( objp->type != OBJ_SHIP ) { return; } hud_set_gauge_color(HUD_TARGET_MINI_ICON); if (!Shield_mini_loaded) return; sx = (x_force == -1) ? Shield_mini_coords[gr_screen.res][0]+fl2i(HUD_offset_x) : x_force; sy = (y_force == -1) ? Shield_mini_coords[gr_screen.res][1]+fl2i(HUD_offset_y) : y_force; // draw the ship first hud_shield_maybe_flash(HUD_TARGET_MINI_ICON, SHIELD_HIT_TARGET, Shield_hit_data[SHIELD_HIT_TARGET].hull_hit_index); hud_show_mini_ship_integrity(objp, x_force + x_hull_offset,y_force + y_hull_offset); // draw the four quadrants // Draw shield quadrants at one of NUM_SHIELD_LEVELS max_shield = get_max_shield_quad(objp); for ( i = 0; i < objp->n_quadrants; i++ ) { if ( objp->flags[Object::Object_Flags::No_shields] || i >= DEFAULT_SHIELD_SECTIONS) { break; } if (objp->shield_quadrant[Quadrant_xlate[i]] < 0.1f ) { continue; } if ( hud_shield_maybe_flash(HUD_TARGET_MINI_ICON, SHIELD_HIT_TARGET, i) ) { frame_offset = i+objp->n_quadrants; } else { frame_offset = i; } range = HUD_color_alpha; hud_color_index = fl2i( (objp->shield_quadrant[Quadrant_xlate[i]] / max_shield) * range + 0.5); Assert(hud_color_index >= 0 && hud_color_index <= range); if ( hud_color_index < 0 ) { hud_color_index = 0; } if ( hud_color_index >= HUD_NUM_COLOR_LEVELS ) { hud_color_index = HUD_NUM_COLOR_LEVELS - 1; } if ( hud_gauge_maybe_flash(HUD_TARGET_MINI_ICON) == 1) { // hud_set_bright_color(); hud_set_gauge_color(HUD_TARGET_MINI_ICON, HUD_C_BRIGHT); } else { // gr_set_color_fast(&HUD_color_defaults[hud_color_index]); hud_set_gauge_color(HUD_TARGET_MINI_ICON, hud_color_index); } GR_AABITMAP(Shield_mini_gauge.first_frame + frame_offset, sx + HUD_nose_x, sy + HUD_nose_y); } // hud_set_default_color(); }
// Draw the miniature shield icon that is drawn near the reticle void hud_shield_show_mini(object* objp, int x_force, int y_force, int x_hull_offset, int y_hull_offset) { float max_shield; int hud_color_index, range, frame_offset; int sx, sy, i; shield_hit_info* shi; shi = &Shield_hit_data[SHIELD_HIT_TARGET]; if (objp->type != OBJ_SHIP) { return; } hud_set_gauge_color(HUD_TARGET_MINI_ICON); if (!Shield_mini_loaded) { hud_shield_mini_load(); } sx = (x_force == -1) ? current_hud->Shield_mini_coords[0] + fl2i(HUD_offset_x) : x_force; sy = (y_force == -1) ? current_hud->Shield_mini_coords[1] + fl2i(HUD_offset_y) : y_force; // draw the ship first hud_shield_maybe_flash(HUD_TARGET_MINI_ICON, SHIELD_HIT_TARGET, HULL_HIT_OFFSET); hud_show_mini_ship_integrity(objp, x_force + x_hull_offset, y_force + y_hull_offset); // draw the four quadrants // Draw shield quadrants at one of NUM_SHIELD_LEVELS max_shield = get_max_shield_quad(objp); for (i = 0; i < MAX_SHIELD_SECTIONS; i++) { if (objp->flags & OF_NO_SHIELDS) { break; } if (objp->shield_quadrant[Quadrant_xlate[i]] < 0.1f) { continue; } if (hud_shield_maybe_flash(HUD_TARGET_MINI_ICON, SHIELD_HIT_TARGET, i)) { frame_offset = i + MAX_SHIELD_SECTIONS; } else { frame_offset = i; } range = HUD_color_alpha; hud_color_index = fl2i((objp->shield_quadrant[Quadrant_xlate[i]] / max_shield) * range + 0.5); Assert(hud_color_index >= 0 && hud_color_index <= range); if (hud_color_index < 0) { hud_color_index = 0; } if (hud_color_index >= HUD_NUM_COLOR_LEVELS) { hud_color_index = HUD_NUM_COLOR_LEVELS - 1; } if (hud_gauge_maybe_flash(HUD_TARGET_MINI_ICON) == 1) { // hud_set_bright_color(); hud_set_gauge_color(HUD_TARGET_MINI_ICON, HUD_C_BRIGHT); } else { // gr_set_color_fast(&HUD_color_defaults[hud_color_index]); hud_set_gauge_color(HUD_TARGET_MINI_ICON, hud_color_index); } hud_aabitmap(Shield_mini_gauge.first_frame + frame_offset, sx + HUD_nose_x, sy + HUD_nose_y); } // hud_set_default_color(); }
void hud_shield_show(object* objp) { KeepAspectRatio keep(true); // static int fod_model = -1; float max_shield; int hud_color_index, range; int sx, sy, i; ship* sp; ship_info* sip; hud_frames* sgp = NULL; if (objp->type != OBJ_SHIP) return; // Goober5000 - don't show if primitive sensors if (Ships[Player_obj->instance].flags2 & SF2_PRIMITIVE_SENSORS) return; sp = &Ships[objp->instance]; sip = &Ship_info[sp->ship_info_index]; // bool digitus_improbus = (fod_model != -2 && strstr(sp->ship_name, "Sathanas") != NULL); if (sip->shield_icon_index == 255 && !(sip->flags2 & SIF2_GENERATE_HUD_ICON)/*&& !digitus_improbus*/) { return; } if (objp == Player_obj) { hud_set_gauge_color(HUD_PLAYER_SHIELD_ICON); } else { hud_set_gauge_color(HUD_TARGET_SHIELD_ICON); } // load in shield frames if not already loaded if (sip->shield_icon_index != 255) { sgp = &Shield_gauges[sip->shield_icon_index]; if (sgp->first_frame == -1 && sip->shield_icon_index < Hud_shield_filename_count) { sgp->first_frame = bm_load_animation(Hud_shield_filenames[sip->shield_icon_index], &sgp->num_frames); if (sgp->first_frame == -1) { if (!shield_ani_warning_displayed_already) { shield_ani_warning_displayed_already = true; Warning(LOCATION, "Could not load in the HUD shield ani: %s\n", Hud_shield_filenames[sip->shield_icon_index]); } return; } } } if (objp == Player_obj) { sx = current_hud->Player_shield_coords[0]; sy = current_hud->Player_shield_coords[1]; } else { sx = current_hud->Target_shield_coords[0]; sy = current_hud->Target_shield_coords[1]; } sx += fl2i(HUD_offset_x); sy += fl2i(HUD_offset_y); // draw the ship first if (objp == Player_obj) { hud_shield_maybe_flash(HUD_PLAYER_SHIELD_ICON, SHIELD_HIT_PLAYER, HULL_HIT_OFFSET); } else { hud_shield_maybe_flash(HUD_TARGET_SHIELD_ICON, SHIELD_HIT_TARGET, HULL_HIT_OFFSET); } if (sip->shield_icon_index != 255) { hud_aabitmap(sgp->first_frame, sx, sy); } else { bool g3_yourself = !g3_in_frame(); angles rot_angles = { -1.570796327f, 0.0f, 0.0f }; matrix object_orient; vm_angles_2_matrix(&object_orient, &rot_angles); gr_screen.clip_width = 112; gr_screen.clip_height = 93; //Fire it up if (g3_yourself) g3_start_frame(1); hud_save_restore_camera_data(1); HUD_set_clip(sx, sy, 112, 93); model_set_detail_level(1); //if(!digitus_improbus) g3_set_view_matrix(&sip->closeup_pos, &vmd_identity_matrix, sip->closeup_zoom * 3.25f); /*else { vec3d finger_vec = {0.0f, 0.0f, 176.0f}; g3_set_view_matrix( &finger_vec, &vmd_identity_matrix, 1.0f); }*/ if (!Cmdline_nohtl) { gr_set_proj_matrix(0.5f * Proj_fov, gr_screen.clip_aspect, Min_draw_distance, Max_draw_distance); gr_set_view_matrix(&Eye_position, &Eye_matrix); } //We're ready to show stuff ship_model_start(objp); //if(!digitus_improbus) { model_render(sip->model_num, &object_orient, &vmd_zero_vector, MR_NO_LIGHTING | MR_LOCK_DETAIL | MR_AUTOCENTER | MR_NO_FOGGING, -1, -1, sp->ship_replacement_textures); } /*else { if(fod_model == -1) { fod_model = model_load(NOX("FoD.pof"), 0, NULL); if(fod_model == -1) { fod_model = -2; return; } } model_render(fod_model, &object_orient, &vmd_zero_vector, MR_NO_LIGHTING | MR_LOCK_DETAIL | MR_AUTOCENTER | MR_NO_FOGGING, -1, -1); }*/ ship_model_stop(objp); //We're done if (!Cmdline_nohtl) { gr_end_view_matrix(); gr_end_proj_matrix(); } if (g3_yourself) g3_end_frame(); hud_save_restore_camera_data(0); HUD_reset_clip(); } if (!sip->max_shield_strength) return; // draw the four quadrants // // Draw shield quadrants at one of NUM_SHIELD_LEVELS max_shield = get_max_shield_quad(objp); int j, x_val, y_val, mid_val; for (i = 0; i < MAX_SHIELD_SECTIONS; i++) { if (objp->flags & OF_NO_SHIELDS) { break; } if (objp->shield_quadrant[Quadrant_xlate[i]] < 0.1f) { continue; } range = MAX(HUD_COLOR_ALPHA_MAX, HUD_color_alpha + 4); hud_color_index = fl2i((objp->shield_quadrant[Quadrant_xlate[i]] / max_shield) * range); Assert(hud_color_index >= 0 && hud_color_index <= range); if (hud_color_index < 0) { hud_color_index = 0; } if (hud_color_index >= HUD_NUM_COLOR_LEVELS) { hud_color_index = HUD_NUM_COLOR_LEVELS - 1; } int flash = 0; if (objp == Player_obj) { flash = hud_shield_maybe_flash(HUD_PLAYER_SHIELD_ICON, SHIELD_HIT_PLAYER, i); } else { flash = hud_shield_maybe_flash(HUD_TARGET_SHIELD_ICON, SHIELD_HIT_TARGET, i); } if (!flash) { // gr_set_color_fast(&HUD_color_defaults[hud_color_index]); if (objp == Player_obj) { hud_set_gauge_color(HUD_PLAYER_SHIELD_ICON, hud_color_index); } else { hud_set_gauge_color(HUD_TARGET_SHIELD_ICON, hud_color_index); } if (sip->shield_icon_index != 255) { hud_aabitmap(sgp->first_frame + i + 1, sx, sy); } else { //Ugh, draw four shield quadrants switch (i) { //Top case 0: sy += 3; for (j = 0; j < 6; j++) { y_val = sy + 10; gr_gradient(sx + j, sy, sx + j, y_val - j); } mid_val = sy + 5; for (; j < 106; j++) { gr_gradient(sx + j, sy, sx + j, mid_val); } for (; j < 112; j++) { gr_gradient(sx + j, sy, sx + j, sy + (j - 101)); } y_val = sy - 1; sy -= 3; for (j = 0; j < 112; j++) gr_gradient(sx + j, y_val, sx + j, sy); break; //Left case 1: sx += 1; x_val = sx + 10; y_val = sy + 15; for (j = 0; j < 6; j++) { gr_gradient(sx, y_val + j, x_val - j, y_val + j); } mid_val = sx + 5; for (; j < 48; j++) { gr_gradient(sx, y_val + j, mid_val, y_val + j); } for (; j < 54; j++) { gr_gradient(sx, y_val + j, sx + (j - 43), y_val + j); } x_val = sx; sx -= 3; for (j = 0; j < 54; j++) gr_gradient(x_val, y_val + j, sx, y_val + j); sx += 2; break; //Right case 2: x_val = sx + 109; //-3 for border y_val = sy + 15; for (j = 0; j < 6; j++) { gr_gradient(x_val, y_val + j, x_val - (10 - j), y_val + j); } mid_val = x_val - 5; for (; j < 48; j++) { gr_gradient(x_val, y_val + j, mid_val, y_val + j); } for (; j < 54; j++) { gr_gradient(x_val, y_val + j, x_val - (j - 43), y_val + j); } mid_val = x_val; x_val += 3; for (j = 0; j < 54; j++) gr_gradient(mid_val, y_val + j, x_val, y_val + j); break; //Bottom case 3: y_val = sy + 80; //-3 for border for (j = 0; j < 6; j++) gr_gradient(sx + j, y_val, sx + j, y_val - (10 - j)); mid_val = y_val - 5; for (; j < 106; j++) gr_gradient(sx + j, y_val, sx + j, mid_val); for (; j < 112; j++) gr_gradient(sx + j, y_val, sx + j, y_val - (j - 101)); mid_val = y_val + 1; y_val += 3; for (j = 0; j < 112; j++) gr_gradient(sx + j, mid_val, sx + j, y_val); } } } } // hud_set_default_color(); }