Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Index: ai/aicode.cpp
- ===================================================================
- --- ai/aicode.cpp (revision 10126)
- +++ ai/aicode.cpp (working copy)
- @@ -12200,10 +12200,10 @@
- transfer_amount = 0.0f;
- transfer_delta = (SHIELD_BALANCE_RATE/2) * max_quadrant_strength;
- - if (objp->shield_quadrant[quadrant_num] + (MAX_SHIELD_SECTIONS-1)*transfer_delta > max_quadrant_strength)
- - transfer_delta = (max_quadrant_strength - objp->shield_quadrant[quadrant_num])/(MAX_SHIELD_SECTIONS-1);
- + if (objp->shield_quadrant[quadrant_num] + (objp->n_quadrants-1)*transfer_delta > max_quadrant_strength)
- + transfer_delta = (max_quadrant_strength - objp->shield_quadrant[quadrant_num])/(objp->n_quadrants-1);
- - for (i=0; i<MAX_SHIELD_SECTIONS; i++)
- + for (i=0; i<objp->n_quadrants; i++)
- if (i != quadrant_num) {
- if (objp->shield_quadrant[i] >= transfer_delta) {
- objp->shield_quadrant[i] -= transfer_delta;
- @@ -12228,17 +12228,17 @@
- return;
- - shield_strength_avg = shield_get_strength(objp)/MAX_SHIELD_SECTIONS;
- + shield_strength_avg = shield_get_strength(objp)/objp->n_quadrants;
- delta = SHIELD_BALANCE_RATE * shield_strength_avg;
- - for (i=0; i<MAX_SHIELD_SECTIONS; i++) {
- + for (i=0; i<objp->n_quadrants; i++) {
- if (objp->shield_quadrant[i] < shield_strength_avg) {
- // only do it the retail way if using smart shields (since that's a bigger thing) - taylor
- if (Ai_info[Ships[objp->instance].ai_index].ai_profile_flags & AIPF_SMART_SHIELD_MANAGEMENT)
- shield_add_strength(objp, delta);
- else
- - objp->shield_quadrant[i] += delta/MAX_SHIELD_SECTIONS;
- + objp->shield_quadrant[i] += delta/objp->n_quadrants;
- if (objp->shield_quadrant[i] > shield_strength_avg)
- objp->shield_quadrant[i] = shield_strength_avg;
- @@ -12248,7 +12248,7 @@
- if (Ai_info[Ships[objp->instance].ai_index].ai_profile_flags & AIPF_SMART_SHIELD_MANAGEMENT)
- shield_add_strength(objp, -delta);
- else
- - objp->shield_quadrant[i] -= delta/MAX_SHIELD_SECTIONS;
- + objp->shield_quadrant[i] -= delta/objp->n_quadrants;
- if (objp->shield_quadrant[i] < shield_strength_avg)
- objp->shield_quadrant[i] = shield_strength_avg;
- Index: hud/hudescort.cpp
- ===================================================================
- --- hud/hudescort.cpp (revision 10126)
- +++ hud/hudescort.cpp (working copy)
- @@ -246,10 +246,10 @@
- }
- // set flashing color
- - if (!timestamp_elapsed(shi->shield_hit_timers[HULL_HIT_OFFSET]))
- + if (!timestamp_elapsed(shi->shield_hit_timers[shi->hull_hit_index]))
- {
- is_flashing = 1;
- - if (shi->shield_show_bright & (1 << HULL_HIT_OFFSET))
- + if (shi->shield_show_bright & (1 << shi->hull_hit_index))
- {
- is_bright = 1;
- }
- @@ -449,12 +449,12 @@
- {
- shi = &Escort_ships[i].hit_info;
- - if (!timestamp_elapsed(shi->shield_hit_timers[HULL_HIT_OFFSET]))
- + if (!timestamp_elapsed(shi->shield_hit_timers[shi->hull_hit_index]))
- {
- - if (timestamp_elapsed(shi->shield_hit_next_flash[HULL_HIT_OFFSET]))
- + if (timestamp_elapsed(shi->shield_hit_next_flash[shi->hull_hit_index]))
- {
- - shi->shield_hit_next_flash[HULL_HIT_OFFSET] = timestamp(SHIELD_FLASH_INTERVAL);
- - shi->shield_show_bright ^= (1 << HULL_HIT_OFFSET); // toggle between default and bright frames
- + shi->shield_hit_next_flash[shi->hull_hit_index] = timestamp(SHIELD_FLASH_INTERVAL);
- + shi->shield_show_bright ^= (1 << shi->hull_hit_index); // toggle between default and bright frames
- }
- }
- }
- @@ -485,7 +485,7 @@
- }
- Escort_ships[i].obj_signature = -99;
- Escort_ships[i].np_id = -1;
- - shield_info_reset(&Escort_ships[i].hit_info);
- + shield_info_reset(&Objects[Escort_ships[i].objnum], &Escort_ships[i].hit_info);
- }
- }
- @@ -720,7 +720,7 @@
- continue;
- }
- if ( !valid_hit_info[i] ) {
- - shield_info_reset(&Escort_ships[i].hit_info);
- + shield_info_reset(&Objects[Escort_ships[i].objnum], &Escort_ships[i].hit_info);
- }
- }
- }
- @@ -986,7 +986,7 @@
- num = Quadrant_xlate[quadrant];
- shi->shield_hit_timers[num] = timestamp(SHIELD_HIT_DURATION);
- } else {
- - shi->shield_hit_timers[HULL_HIT_OFFSET] = timestamp(SHIELD_HIT_DURATION);
- + shi->shield_hit_timers[shi->hull_hit_index] = timestamp(SHIELD_HIT_DURATION);
- }
- }
- }
- Index: hud/hudets.cpp
- ===================================================================
- --- hud/hudets.cpp (revision 10126)
- +++ hud/hudets.cpp (working copy)
- @@ -107,7 +107,7 @@
- shield_add_strength(objp, shield_delta);
- if ( (_ss = shield_get_strength(objp)) > ship_p->ship_max_shield_strength ){
- - for (int i=0; i<MAX_SHIELD_SECTIONS; i++){
- + for (int i=0; i<objp->n_quadrants; i++){
- objp->shield_quadrant[i] *= ship_p->ship_max_shield_strength / _ss;
- }
- }
- Index: hud/hudshield.cpp
- ===================================================================
- --- hud/hudshield.cpp (revision 10126)
- +++ hud/hudshield.cpp (working copy)
- @@ -117,7 +117,7 @@
- static shield_hit_info Shield_hit_data[2];
- // translate between clockwise-from-top shield quadrant ordering to way quadrants are numbered in the game
- -ubyte Quadrant_xlate[MAX_SHIELD_SECTIONS] = {1,0,2,3};
- +ubyte Quadrant_xlate[DEFAULT_SHIELD_SECTIONS] = {1,0,2,3};
- // called at the start of each level from HUD_init. Use Hud_shield_init so we only init Shield_gauges[] once.
- void hud_shield_level_init()
- @@ -125,7 +125,7 @@
- unsigned int i;
- hud_frames temp;
- - hud_shield_hit_reset(1); // reset for the player
- + hud_shield_hit_reset(Player_obj, 1); // reset for the player
- if ( !Hud_shield_inited ) {
- for ( i = 0; i < Hud_shield_filenames.size(); i++ ) {
- @@ -206,7 +206,7 @@
- // ------------------------------------------------------------------
- // hud_shield_equalize()
- //
- -// Equalize the four shield quadrants for an object
- +// Equalize all shield quadrants for an object
- //
- void hud_shield_equalize(object *objp, player *pl)
- {
- @@ -232,7 +232,7 @@
- // are all quadrants equal?
- all_equal = 1;
- - for (idx = 0; idx < MAX_SHIELD_SECTIONS - 1; idx++) {
- + for (idx = 0; idx < objp->n_quadrants - 1; idx++) {
- if (objp->shield_quadrant[idx] != objp->shield_quadrant[idx + 1]) {
- all_equal = 0;
- break;
- @@ -279,14 +279,25 @@
- //
- 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;
- - Assert(direction >= 0 && direction < MAX_SHIELD_SECTIONS);
- - Assert(objp->type == OBJ_SHIP);
- + if (sip->flags2 & SIF2_SHIELD_POINTS) {
- + 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 = Ships[objp->instance].ship_max_shield_strength * SHIELD_TRANSFER_PERCENT;
- + 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 )
- @@ -302,7 +313,7 @@
- }
- energy_avail = 0.0f;
- - for ( i = 0; i < MAX_SHIELD_SECTIONS; i++ ) {
- + for ( i = 0; i < objp->n_quadrants; i++ ) {
- if ( i == direction )
- continue;
- energy_avail += objp->shield_quadrant[i];
- @@ -312,7 +323,7 @@
- if ( percent_to_take > 1.0f )
- percent_to_take = 1.0f;
- - for ( i = 0; i < MAX_SHIELD_SECTIONS; i++ ) {
- + for ( i = 0; i < objp->n_quadrants; i++ ) {
- if ( i == direction )
- continue;
- delta = percent_to_take * objp->shield_quadrant[i];
- @@ -409,25 +420,25 @@
- 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, HULL_HIT_OFFSET);
- + 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 < MAX_SHIELD_SECTIONS; i++ ) {
- + for ( i = 0; i < objp->n_quadrants; i++ ) {
- - if ( objp->flags & OF_NO_SHIELDS ) {
- + if ( objp->flags & OF_NO_SHIELDS || i >= DEFAULT_SHIELD_SECTIONS) {
- break;
- }
- - if ( objp->shield_quadrant[Quadrant_xlate[i]] < 0.1f ) {
- + 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;
- + frame_offset = i+objp->n_quadrants;
- } else {
- frame_offset = i;
- }
- @@ -458,13 +469,20 @@
- }
- // reset the shield_hit_info data structure
- -void shield_info_reset(shield_hit_info *shi)
- +void shield_info_reset(object *objp, shield_hit_info *shi)
- {
- int i;
- shi->shield_hit_status = 0;
- shi->shield_show_bright = 0;
- - for ( i = 0; i < NUM_SHIELD_HIT_MEMBERS; i++ ) {
- +
- + shi->members = objp->n_quadrants + 1;
- + shi->hull_hit_index = shi->members - 1;
- +
- + shi->shield_hit_timers.resize(shi->members);
- + shi->shield_hit_next_flash.resize(shi->members);
- +
- + for ( i = 0; i < shi->members; i++ ) {
- shi->shield_hit_timers[i] = 1;
- shi->shield_hit_next_flash[i] = 1;
- }
- @@ -477,7 +495,7 @@
- // input: player => optional parameter (default value 0). This is to indicate that player shield hit
- // info should be reset. This is normally not the case.
- // is for the player's current target
- -void hud_shield_hit_reset(int player)
- +void hud_shield_hit_reset(object *objp, int player)
- {
- shield_hit_info *shi;
- @@ -487,7 +505,7 @@
- shi = &Shield_hit_data[SHIELD_HIT_TARGET];
- }
- - shield_info_reset(shi);
- + shield_info_reset(objp, shi);
- }
- // called once per frame to update the state of Shield_hit_status based on the Shield_hit_timers[]
- @@ -501,7 +519,7 @@
- }
- for ( i = 0; i < limit; i++ ) {
- - for ( j = 0; j < NUM_SHIELD_HIT_MEMBERS; j++ ) {
- + for ( j = 0; j < Shield_hit_data[i].members; j++ ) {
- if ( timestamp_elapsed(Shield_hit_data[i].shield_hit_timers[j]) ) {
- Shield_hit_data[i].shield_hit_status &= ~(1<<j);
- Shield_hit_data[i].shield_show_bright &= ~(1<<j);
- @@ -541,10 +559,14 @@
- }
- if ( quadrant >= 0 ) {
- - num = Quadrant_xlate[quadrant];
- + if ( !(Ship_info[Ships[objp->instance].ship_info_index].flags2 & SIF2_SHIELD_POINTS) )
- + num = Quadrant_xlate[quadrant];
- + else
- + num = quadrant;
- +
- shi->shield_hit_timers[num] = timestamp(SHIELD_HIT_DURATION_SHORT);
- } else {
- - shi->shield_hit_timers[HULL_HIT_OFFSET] = timestamp(SHIELD_HIT_DURATION_SHORT);
- + shi->shield_hit_timers[shi->hull_hit_index] = timestamp(SHIELD_HIT_DURATION_SHORT);
- hud_targetbox_start_flash(TBOX_FLASH_HULL);
- }
- }
- @@ -613,7 +635,7 @@
- sy += fl2i(HUD_offset_y);
- // draw the ship first
- - maybeFlashShield(SHIELD_HIT_PLAYER, HULL_HIT_OFFSET);
- + maybeFlashShield(SHIELD_HIT_PLAYER, Shield_hit_data[SHIELD_HIT_PLAYER].hull_hit_index);
- if(sip->shield_icon_index != 255)
- {
- @@ -687,25 +709,33 @@
- if(!sip->max_shield_strength)
- return;
- - // draw the four quadrants
- + // 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 < MAX_SHIELD_SECTIONS; i++ ) {
- + for ( i = 0; i < objp->n_quadrants; i++ ) {
- if ( objp->flags & OF_NO_SHIELDS ) {
- break;
- }
- - if ( objp->shield_quadrant[Quadrant_xlate[i]] < 0.1f ) {
- - continue;
- - }
- + if ( !(sip->flags2 & SIF2_SHIELD_POINTS) )
- + 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 + 4);
- - hud_color_index = fl2i( (objp->shield_quadrant[Quadrant_xlate[i]] / max_shield) * range);
- +
- + if ( !(sip->flags2 & SIF2_SHIELD_POINTS) )
- + 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 ) {
- @@ -726,7 +756,9 @@
- if(sip->shield_icon_index != 255)
- {
- - renderBitmap(sgp->first_frame+i+1, sx, sy);
- + int framenum = sgp->first_frame+i+1;
- + if (framenum < sgp->first_frame+sgp->num_frames)
- + renderBitmap(framenum, sx, sy);
- }
- else
- {
- @@ -962,14 +994,14 @@
- sy = position[1]+fl2i(HUD_offset_y);
- // draw the ship first
- - maybeFlashShield(SHIELD_HIT_TARGET, HULL_HIT_OFFSET);
- + 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 < MAX_SHIELD_SECTIONS; i++ ) {
- + for ( i = 0; i < objp->n_quadrants; i++ ) {
- if ( objp->flags & OF_NO_SHIELDS ) {
- break;
- @@ -980,7 +1012,7 @@
- }
- if ( maybeFlashShield(SHIELD_HIT_TARGET, i) ) {
- - frame_offset = i+MAX_SHIELD_SECTIONS;
- + frame_offset = i+objp->n_quadrants;
- } else {
- frame_offset = i;
- }
- @@ -1004,7 +1036,8 @@
- setGaugeColor(hud_color_index);
- }
- - renderBitmap(Shield_mini_gauge.first_frame + frame_offset, sx, sy);
- + if (frame_offset < Shield_mini_gauge.num_frames)
- + renderBitmap(Shield_mini_gauge.first_frame + frame_offset, sx, sy);
- }
- // hud_set_default_color();
- Index: hud/hudshield.h
- ===================================================================
- --- hud/hudshield.h (revision 10126)
- +++ hud/hudshield.h (working copy)
- @@ -18,12 +18,12 @@
- #define SHIELD_HIT_DURATION 1400 // time a shield quadrant flashes after being hit
- #define SHIELD_FLASH_INTERVAL 200 // time between shield quadrant flashes
- -#define NUM_SHIELD_HIT_MEMBERS 5
- -#define HULL_HIT_OFFSET 4 // used to access the members in shield_hit_info that pertain to the hull
- typedef struct shield_hit_info
- {
- - int shield_hit_timers[NUM_SHIELD_HIT_MEMBERS]; // timestamps that get set for SHIELD_FLASH_TIME when a quadrant is hit
- - int shield_hit_next_flash[NUM_SHIELD_HIT_MEMBERS];
- + int members;
- + int hull_hit_index; // used to access the members in shield_hit_info that pertain to the hull
- + SCP_vector<int> shield_hit_timers; // timestamps that get set for SHIELD_FLASH_TIME when a quadrant is hit
- + SCP_vector<int> shield_hit_next_flash;
- int shield_hit_status; // bitfield, if offset for shield quadrant is set, that means shield is being hit
- int shield_show_bright; // bitfield, if offset for shield quadrant is set, that means play bright frame
- } shield_hit_info;
- @@ -44,9 +44,9 @@
- void hud_shield_show_mini(object *objp, int x_force = -1, int y_force = -1, int x_hull_offset = 0, int y_hull_offset = 0);
- void hud_shield_hit_update();
- void hud_shield_quadrant_hit(object *objp, int quadrant);
- -void hud_shield_hit_reset(int player=0);
- +void hud_shield_hit_reset(object *objp, int player=0);
- -void shield_info_reset(shield_hit_info *shi);
- +void shield_info_reset(object *objp, shield_hit_info *shi);
- // random page in stuff - moved here by Goober5000
- extern void hud_ship_icon_page_in(ship_info *sip);
- Index: hud/hudtarget.cpp
- ===================================================================
- --- hud/hudtarget.cpp (revision 10126)
- +++ hud/hudtarget.cpp (working copy)
- @@ -946,6 +946,7 @@
- if ( Player_obj != target->objp ){
- set_target_objnum( Player_ai, OBJ_INDEX(target->objp) );
- + hud_shield_hit_reset(target->objp);
- }
- Players[Player_num].current_hotkey_set = k;
- @@ -1223,6 +1224,7 @@
- if ( Player_ai->target_objnum != A-Objects ) {
- target_found = TRUE;
- set_target_objnum( Player_ai, OBJ_INDEX(A) );
- + hud_shield_hit_reset(A);
- // if ship is BIG|HUGE and last subsys is NULL, get turret
- hud_maybe_set_sorted_turret_subsys(shipp);
- hud_restore_subsystem_target(shipp);
- @@ -1230,6 +1232,7 @@
- } else {
- target_found = TRUE;
- set_target_objnum( Player_ai, OBJ_INDEX(A) );
- + hud_shield_hit_reset(A);
- }
- break;
- @@ -1479,6 +1482,7 @@
- // if we've reached here, got a new target
- target_found = TRUE;
- set_target_objnum( aip, OBJ_INDEX(A) );
- + hud_shield_hit_reset(A);
- break;
- } // end for
- @@ -1526,6 +1530,7 @@
- // found a good one
- target_found = TRUE;
- set_target_objnum( aip, OBJ_INDEX(A) );
- + hud_shield_hit_reset(A);
- break;
- }
- }
- @@ -1600,6 +1605,7 @@
- if ( Player_ai->target_objnum != OBJ_INDEX(A) ) {
- target_found = TRUE;
- set_target_objnum( Player_ai, OBJ_INDEX(A) );
- + hud_shield_hit_reset(A);
- }
- }
- @@ -1661,6 +1667,7 @@
- if (newest_obj) {
- set_target_objnum( Player_ai, OBJ_INDEX(newest_obj) );
- + hud_shield_hit_reset(newest_obj);
- // if BIG|HUGE and no selected subsystem, get sorted turret
- hud_maybe_set_sorted_turret_subsys(&Ships[newest_obj->instance]);
- hud_restore_subsystem_target(&Ships[newest_obj->instance]);
- @@ -1950,6 +1957,7 @@
- if (nearest_dist < 10000.0f) {
- Assert(nearest_obj);
- set_target_objnum( Player_ai, OBJ_INDEX(nearest_obj) );
- + hud_shield_hit_reset(nearest_obj);
- target_found = TRUE;
- }
- @@ -2285,6 +2293,7 @@
- if (target_found) {
- set_target_objnum(Player_ai, OBJ_INDEX(nearest_obj));
- + hud_shield_hit_reset(nearest_obj);
- if ( check_nearest_turret ) {
- // if former subobject was not a turret do, not change subsystem
- @@ -2415,6 +2424,7 @@
- // if we've reached here, found player target's target
- set_target_objnum( Player_ai, tt_objnum );
- + hud_shield_hit_reset(&Objects[tt_objnum]);
- if (Objects[tt_objnum].type == OBJ_SHIP) {
- hud_maybe_set_sorted_turret_subsys(&Ships[Objects[tt_objnum].instance]);
- }
- @@ -2636,6 +2646,7 @@
- target_obj = hud_reticle_pick_target();
- if ( target_obj != NULL ) {
- set_target_objnum( Player_ai, OBJ_INDEX(target_obj) );
- + hud_shield_hit_reset(target_obj);
- if ( target_obj->type == OBJ_SHIP ) {
- // if BIG|HUGE, maybe set subsys to turret
- hud_maybe_set_sorted_turret_subsys(&Ships[target_obj->instance]);
- @@ -4429,7 +4440,7 @@
- }
- player_stop_cargo_scan_sound();
- - hud_shield_hit_reset();
- + hud_shield_hit_reset(&Objects[Player_ai->target_objnum]);
- hud_targetbox_init_flash();
- hud_targetbox_start_flash(TBOX_FLASH_NAME);
- hud_gauge_popup_start(HUD_TARGET_MINI_ICON);
- @@ -4662,6 +4673,7 @@
- if (nearest_object != NULL) {
- // set new target
- set_target_objnum( Player_ai, OBJ_INDEX(nearest_object) );
- + hud_shield_hit_reset(nearest_object);
- // maybe set new turret subsystem
- hud_maybe_set_sorted_turret_subsys(&Ships[nearest_object->instance]);
- @@ -4894,6 +4906,7 @@
- if (nearest_obj != &obj_used_list) {
- set_target_objnum( Player_ai, OBJ_INDEX(nearest_obj) );
- + hud_shield_hit_reset(nearest_obj);
- hud_restore_subsystem_target(&Ships[nearest_obj->instance]);
- rval=1;
- }
- @@ -4956,6 +4969,7 @@
- if (nearest_obj != NULL) {
- set_target_objnum( Player_ai, OBJ_INDEX(nearest_obj) );
- + hud_shield_hit_reset(nearest_obj);
- hud_restore_subsystem_target(&Ships[nearest_obj->instance]);
- }
- else {
- @@ -5058,6 +5072,7 @@
- if (nearest_obj != NULL) {
- set_target_objnum( Player_ai, OBJ_INDEX(nearest_obj) );
- + hud_shield_hit_reset(nearest_obj);
- hud_restore_subsystem_target(&Ships[nearest_obj->instance]);
- }
- else {
- @@ -5177,6 +5192,7 @@
- if ((targeted_objnum >= 0) && (targeted_objnum < MAX_OBJECTS)) {
- set_target_objnum( Player_ai, Transmit_target_list[transmit_index].objnum );
- + hud_shield_hit_reset(&Objects[Transmit_target_list[transmit_index].objnum]);
- hud_restore_subsystem_target(&Ships[Objects[Transmit_target_list[transmit_index].objnum].instance]);
- }
- }
- @@ -5223,6 +5239,7 @@
- set_target_objnum(Player_ai, -1);
- } else {
- set_target_objnum(Player_ai, objnum);
- + hud_shield_hit_reset(&Objects[objnum]);
- }
- }
- }
- Index: io/keycontrol.cpp
- ===================================================================
- --- io/keycontrol.cpp (revision 10126)
- +++ io/keycontrol.cpp (working copy)
- @@ -58,6 +58,7 @@
- #include "network/multi_endgame.h"
- #include "autopilot/autopilot.h"
- #include "cmdline/cmdline.h"
- +#include "object/objectshield.h"
- #define MAX_NUM_SLOTS 6
- @@ -1954,28 +1955,28 @@
- if(at_self){
- control_used(SHIELD_XFER_TOP);
- }
- - hud_augment_shield_quadrant(objp, 1);
- + hud_augment_shield_quadrant(objp, FRONT_QUAD);
- break;
- // transfer shield energy to rear
- case SHIELD_XFER_BOTTOM:
- if(at_self)
- control_used(SHIELD_XFER_BOTTOM);
- - hud_augment_shield_quadrant(objp, 2);
- + hud_augment_shield_quadrant(objp, REAR_QUAD);
- break;
- // transfer shield energy to left
- case SHIELD_XFER_LEFT:
- if(at_self)
- control_used(SHIELD_XFER_LEFT);
- - hud_augment_shield_quadrant(objp, 3);
- + hud_augment_shield_quadrant(objp, LEFT_QUAD);
- break;
- // transfer shield energy to right
- case SHIELD_XFER_RIGHT:
- if(at_self)
- control_used(SHIELD_XFER_RIGHT);
- - hud_augment_shield_quadrant(objp, 0);
- + hud_augment_shield_quadrant(objp, RIGHT_QUAD);
- break;
- // transfer energy to shield from weapons
- Index: mission/missionparse.cpp
- ===================================================================
- --- mission/missionparse.cpp (revision 10126)
- +++ mission/missionparse.cpp (working copy)
- @@ -2236,7 +2236,7 @@
- int max_allowed_sparks, num_sparks, iLoop;
- Objects[objnum].hull_strength = p_objp->initial_hull * shipp->ship_max_hull_strength / 100.0f;
- - for (iLoop = 0; iLoop<MAX_SHIELD_SECTIONS; iLoop++)
- + for (iLoop = 0; iLoop<Objects[objnum].n_quadrants; iLoop++)
- {
- Objects[objnum].shield_quadrant[iLoop] = (float) (p_objp->initial_shields * get_max_shield_quad(&Objects[objnum]) / 100.0f);
- }
- Index: model/model.h
- ===================================================================
- --- model/model.h (revision 10126)
- +++ model/model.h (working copy)
- @@ -381,10 +381,13 @@
- vec3d render_box_min;
- vec3d render_box_max;
- + vec3d render_box_offset;
- float render_sphere_radius;
- vec3d render_sphere_offset;
- int use_render_box; // 0==do nothing, 1==only render this object if you are inside the box, -1==only if you're outside
- + bool use_render_box_offset; // whether an offset has been defined; needed because one can't tell just by looking at render_box_offset
- int use_render_sphere; // 0==do nothing, 1==only render this object if you are inside the sphere, -1==only if you're outside
- + bool use_render_sphere_offset;// whether an offset has been defined; needed because one can't tell just by looking at render_sphere_offset
- bool gun_rotation; // for animated weapon models
- bool no_collisions; // for $no_collisions property - kazan
- bool nocollide_this_only; //SUSHI: Like no_collisions, but not recursive. For the "replacement" collision model scheme.
- @@ -733,6 +736,7 @@
- shield_info shield; // new shield information
- ubyte *shield_collision_tree;
- int sldc_size;
- + SCP_vector<vec3d> shield_points;
- int n_paths;
- model_path *paths;
- Index: model/modelread.cpp
- ===================================================================
- --- model/modelread.cpp (revision 10126)
- +++ model/modelread.cpp (working copy)
- @@ -2050,8 +2050,11 @@
- char type[64];
- get_user_prop_value(p+9, type);
- - if ( !stricmp(type, "subsystem") ) // if we have a subsystem, put it into the list!
- + if ( !stricmp(type, "subsystem") ) { // if we have a subsystem, put it into the list!
- do_new_subsystem( n_subsystems, subsystems, -1, radius, &pnt, props_spcl, &name[1], pm->id ); // skip the first '$' character of the name
- + } else if ( !stricmp(type, "shieldpoint") ) {
- + pm->shield_points.push_back(pnt);
- + }
- } else if ( strstr(name, "$enginelarge") || strstr(name, "$enginehuge") ){
- do_new_subsystem( n_subsystems, subsystems, -1, radius, &pnt, props_spcl, &name[1], pm->id ); // skip the first '$' character of the name
- } else {
- Index: network/multi_ingame.cpp
- ===================================================================
- --- network/multi_ingame.cpp (revision 10126)
- +++ network/multi_ingame.cpp (working copy)
- @@ -1818,10 +1818,11 @@
- objp = &Objects[sp->objnum];
- ADD_USHORT(objp->net_signature);
- ADD_UINT(objp->flags);
- + ADD_INT(objp->n_quadrants);
- ADD_FLOAT(objp->hull_strength);
- // shield percentages
- - for(idx=0; idx<MAX_SHIELD_SECTIONS; idx++){
- + for(idx=0; idx<objp->n_quadrants; idx++){
- f_tmp = objp->shield_quadrant[idx];
- ADD_FLOAT(f_tmp);
- }
- @@ -1835,6 +1836,7 @@
- float garbage;
- int flags;
- int idx;
- + int n_quadrants;
- ushort net_sig;
- object *lookup;
- float f_tmp;
- @@ -1843,14 +1845,15 @@
- // get the net sig for the ship and do a lookup
- GET_USHORT(net_sig);
- GET_INT(flags);
- -
- + GET_INT(n_quadrants);
- +
- // get the object
- lookup = multi_get_network_object(net_sig);
- if(lookup == NULL){
- // read in garbage values if we can't find the ship
- nprintf(("Network","Got ingame ship update for unknown object\n"));
- GET_FLOAT(garbage);
- - for(idx=0;idx<MAX_SHIELD_SECTIONS;idx++){
- + for(idx=0;idx<n_quadrants;idx++){
- GET_FLOAT(garbage);
- }
- @@ -1859,8 +1862,9 @@
- }
- // otherwise read in the ship values
- lookup->flags = flags;
- + lookup->n_quadrants = n_quadrants;
- GET_FLOAT(lookup->hull_strength);
- - for(idx=0;idx<MAX_SHIELD_SECTIONS;idx++){
- + for(idx=0;idx<n_quadrants;idx++){
- GET_FLOAT(f_tmp);
- lookup->shield_quadrant[idx] = f_tmp;
- }
- Index: network/multi_obj.cpp
- ===================================================================
- --- network/multi_obj.cpp (revision 10126)
- +++ network/multi_obj.cpp (working copy)
- @@ -455,25 +455,12 @@
- float quad = get_max_shield_quad(objp);
- - // pack 2 shield values into each byte
- -
- - // pack quadrant 1
- - temp = (objp->shield_quadrant[0] / quad);
- - PACK_PERCENT(temp);
- + for (int i = 0; i < objp->n_quadrants; i++) {
- + temp = (objp->shield_quadrant[i] / quad);
- + PACK_PERCENT(temp);
- + }
- - // pack quadrant 2
- - temp = (objp->shield_quadrant[1] / quad);
- - PACK_PERCENT(temp);
- -
- - // pack quadrant 3
- - temp = (objp->shield_quadrant[2] / quad);
- - PACK_PERCENT(temp);
- -
- - // pack quadrant 2
- - temp = (objp->shield_quadrant[3] / quad);
- - PACK_PERCENT(temp);
- -
- - multi_rate_add(NET_PLAYER_NUM(pl), "shl", 4);
- + multi_rate_add(NET_PLAYER_NUM(pl), "shl", objp->n_quadrants);
- }
- // subsystem info
- @@ -874,20 +861,12 @@
- UNPACK_PERCENT(fpct);
- pobjp->hull_strength = fpct * Ships[pobjp->instance].ship_max_hull_strength;
- - float shield_0, shield_1, shield_2, shield_3;
- -
- - // unpack the 4 quadrants
- - UNPACK_PERCENT(shield_0);
- - UNPACK_PERCENT(shield_1);
- - UNPACK_PERCENT(shield_2);
- - UNPACK_PERCENT(shield_3);
- -
- float quad = get_max_shield_quad(pobjp);
- - pobjp->shield_quadrant[0] = (shield_0 * quad);
- - pobjp->shield_quadrant[1] = (shield_1 * quad);
- - pobjp->shield_quadrant[2] = (shield_2 * quad);
- - pobjp->shield_quadrant[3] = (shield_3 * quad);
- + for (int i = 0; i < pobjp->n_quadrants; i++) {
- + UNPACK_PERCENT(fpct);
- + pobjp->shield_quadrant[i] = fpct * quad;
- + }
- }
- if ( oo_flags & OO_SUBSYSTEMS_AND_AI_NEW ) {
- Index: network/multimsgs.cpp
- ===================================================================
- --- network/multimsgs.cpp (revision 10126)
- +++ network/multimsgs.cpp (working copy)
- @@ -7000,7 +7000,7 @@
- // when not paused, send hull/shield/subsystem updates to all clients (except for ingame joiners)
- if ( val & UPDATE_HULL_INFO ) {
- object *objp;
- - ubyte percent, ns, threats;
- + ubyte percent, ns, threats, n_quadrants;
- ship_info *sip;
- ship *shipp;
- ship_subsys *subsysp;
- @@ -7023,8 +7023,11 @@
- }
- ADD_DATA( percent );
- - for (i = 0; i < MAX_SHIELD_SECTIONS; i++ ) {
- + n_quadrants = (ubyte)objp->n_quadrants;
- + ADD_DATA( n_quadrants );
- + for (i = 0; i < n_quadrants; i++ ) {
- percent = (ubyte)(objp->shield_quadrant[i] / get_max_shield_quad(objp) * 100.0f);
- +
- ADD_DATA( percent );
- }
- @@ -7098,7 +7101,8 @@
- float fl_val;
- ship_info *sip;
- ship *shipp;
- - ubyte hull_percent, shield_percent[MAX_SHIELD_SECTIONS], n_subsystems, subsystem_percent[MAX_MODEL_SUBSYSTEMS], threats;
- + ubyte hull_percent, n_quadrants, n_subsystems, subsystem_percent[MAX_MODEL_SUBSYSTEMS], threats;
- + SCP_vector<ubyte> shield_percent;
- ubyte ub_tmp;
- ship_subsys *subsysp;
- object *objp;
- @@ -7108,7 +7112,9 @@
- // percentage value since that should be close enough
- GET_DATA( hull_percent );
- - for (i = 0; i < MAX_SHIELD_SECTIONS; i++ ){
- + GET_DATA( n_quadrants );
- + shield_percent.resize(n_quadrants);
- + for (i = 0; i < n_quadrants; i++ ){
- GET_DATA(ub_tmp);
- shield_percent[i] = ub_tmp;
- }
- @@ -7142,9 +7148,11 @@
- fl_val = hull_percent * shipp->ship_max_hull_strength / 100.0f;
- objp->hull_strength = fl_val;
- - for ( i = 0; i < MAX_SHIELD_SECTIONS; i++ ) {
- - fl_val = (shield_percent[i] * get_max_shield_quad(objp) / 100.0f);
- - objp->shield_quadrant[i] = fl_val;
- + for ( i = 0; i < n_quadrants; i++ ) {
- + if (i < objp->n_quadrants) {
- + fl_val = (shield_percent[i] * get_max_shield_quad(objp) / 100.0f);
- + objp->shield_quadrant[i] = fl_val;
- + }
- }
- // for sanity, be sure that the number of susbystems that I read in matches the player. If not,
- Index: object/collideshipship.cpp
- ===================================================================
- --- object/collideshipship.cpp (revision 10126)
- +++ object/collideshipship.cpp (working copy)
- @@ -937,7 +937,7 @@
- vm_vec_sub(&tpos, global_pos, &objp->pos);
- vm_vec_rotate(&rotpos, &tpos, &objp->orient);
- - return get_quadrant(&rotpos);
- + return get_quadrant(&rotpos, objp);
- }
- #define MIN_REL_SPEED_FOR_LOUD_COLLISION 50 // relative speed of two colliding objects at which we play the "loud" collide sound
- Index: object/collideshipweapon.cpp
- ===================================================================
- --- object/collideshipweapon.cpp (revision 10126)
- +++ object/collideshipweapon.cpp (working copy)
- @@ -326,7 +326,7 @@
- if (shield_collision) {
- // pick out the shield quadrant
- - quadrant_num = get_quadrant(&mc_shield.hit_point);
- + quadrant_num = get_quadrant(&mc_shield.hit_point, ship_objp);
- // make sure that the shield is active in that quadrant
- if (shipp->flags & SF_DYING || !ship_is_shield_up(ship_objp, quadrant_num))
- Index: object/object.cpp
- ===================================================================
- --- object/object.cpp (revision 10126)
- +++ object/object.cpp (working copy)
- @@ -129,7 +129,7 @@
- orient = last_orient = vmd_identity_matrix;
- radius = hull_strength = sim_hull_strength = 0.0f;
- physics_init( &phys_info );
- - memset(shield_quadrant, 0, MAX_SHIELD_SECTIONS * sizeof(float));
- + shield_quadrant.clear();
- objsnd_num.clear();
- net_signature = 0;
- @@ -259,7 +259,7 @@
- return 0.0f;
- }
- - return Ships[objp->instance].ship_max_shield_strength / MAX_SHIELD_SECTIONS;
- + return Ships[objp->instance].ship_max_shield_strength / objp->n_quadrants;
- }
- // Goober5000
- @@ -503,6 +503,8 @@
- }
- obj->radius = radius;
- + obj->n_quadrants = DEFAULT_SHIELD_SECTIONS; // Might be changed by the ship creation code
- + obj->shield_quadrant.resize(obj->n_quadrants);
- return objnum;
- }
- Index: object/object.h
- ===================================================================
- --- object/object.h (revision 10126)
- +++ object/object.h (working copy)
- @@ -21,7 +21,7 @@
- * CONSTANTS
- */
- -#define MAX_SHIELD_SECTIONS 4 // Number of sections in shield.
- +#define DEFAULT_SHIELD_SECTIONS 4 // Number of sections in standard shields.
- #ifndef NDEBUG
- #define OBJECT_CHECK
- @@ -154,7 +154,8 @@
- vec3d last_pos; // where object was last frame
- matrix last_orient; // how the object was oriented last frame
- physics_info phys_info; // a physics object
- - float shield_quadrant[MAX_SHIELD_SECTIONS]; // Shield is broken into components. Quadrants on 4/24/97.
- + int n_quadrants; // how many shield quadrants the ship has
- + SCP_vector<float> shield_quadrant; // Shield is broken into components, quadrants by default.
- float hull_strength; // Remaining hull strength.
- float sim_hull_strength; // Simulated hull strength - used with training weapons.
- SCP_vector<int> objsnd_num; // Index of persistant sound struct.
- Index: object/objectshield.cpp
- ===================================================================
- --- object/objectshield.cpp (revision 10126)
- +++ object/objectshield.cpp (working copy)
- @@ -27,7 +27,7 @@
- int i;
- float strength = 0.0f;
- - for (i = 0; i < MAX_SHIELD_SECTIONS; i++)
- + for (i = 0; i < objp->n_quadrants; i++)
- strength += shield_get_quad(objp, i);
- return strength;
- @@ -37,12 +37,12 @@
- {
- int i;
- - for (i = 0; i < MAX_SHIELD_SECTIONS; i++)
- - shield_set_quad(objp, i, strength / MAX_SHIELD_SECTIONS);
- + for (i = 0; i < objp->n_quadrants; i++)
- + shield_set_quad(objp, i, strength / objp->n_quadrants);
- }
- // Recharge whole shield.
- -// Apply delta/MAX_SHIELD_SECTIONS to each shield section.
- +// Apply delta/n_quadrants to each shield section.
- void shield_add_strength(object *objp, float delta)
- {
- // if we aren't going to change anything anyway then just bail
- @@ -53,8 +53,8 @@
- if (!(Ai_info[Ships[objp->instance].ai_index].ai_profile_flags & AIPF_SMART_SHIELD_MANAGEMENT)
- || delta <= 0.0f) //SUSHI: We don't want smart shield management for negative delta
- {
- - for (int i = 0; i < MAX_SHIELD_SECTIONS; i++)
- - shield_add_quad(objp, i, delta / MAX_SHIELD_SECTIONS);
- + for (int i = 0; i < objp->n_quadrants; i++)
- + shield_add_quad(objp, i, delta / objp->n_quadrants);
- }
- else
- {
- @@ -68,7 +68,7 @@
- int weakest_idx = -1;
- // find weakest shield quadrant
- - for (int i = 0; i < MAX_SHIELD_SECTIONS; i++)
- + for (int i = 0; i < objp->n_quadrants; i++)
- {
- float quad = shield_get_quad(objp, i);
- if (weakest_idx < 0 || quad < weakest)
- @@ -126,8 +126,8 @@
- return 0.0f;
- // check array bounds
- - Assert(quadrant_num >= 0 && quadrant_num < MAX_SHIELD_SECTIONS);
- - if (quadrant_num < 0 || quadrant_num >= MAX_SHIELD_SECTIONS)
- + Assert(quadrant_num >= 0 && quadrant_num < objp->n_quadrants);
- + if (quadrant_num < 0 || quadrant_num >= objp->n_quadrants)
- return 0.0f;
- if (objp->type != OBJ_SHIP && objp->type != OBJ_START)
- @@ -180,8 +180,8 @@
- void shield_set_quad(object *objp, int quadrant_num, float strength)
- {
- // check array bounds
- - Assert(quadrant_num >= 0 && quadrant_num < MAX_SHIELD_SECTIONS);
- - if (quadrant_num < 0 || quadrant_num >= MAX_SHIELD_SECTIONS)
- + Assert(quadrant_num >= 0 && quadrant_num < objp->n_quadrants);
- + if (quadrant_num < 0 || quadrant_num >= objp->n_quadrants)
- return;
- // check range
- @@ -202,8 +202,8 @@
- return;
- // check array bounds
- - Assert(quadrant_num >= 0 && quadrant_num < MAX_SHIELD_SECTIONS);
- - if (quadrant_num < 0 || quadrant_num >= MAX_SHIELD_SECTIONS)
- + Assert(quadrant_num >= 0 && quadrant_num < objp->n_quadrants);
- + if (quadrant_num < 0 || quadrant_num >= objp->n_quadrants)
- return;
- // important: don't use shield_get_quad here
- @@ -239,7 +239,7 @@
- // Goober5000
- float shield_get_max_quad(object *objp)
- {
- - return shield_get_max_strength(objp) / MAX_SHIELD_SECTIONS;
- + return shield_get_max_strength(objp) / objp->n_quadrants;
- }
- // ***** This is the version that works on a quadrant basis.
- @@ -254,8 +254,8 @@
- return damage;
- // check array bounds
- - Assert(quadrant_num >= 0 && quadrant_num < MAX_SHIELD_SECTIONS);
- - if ((quadrant_num < 0) || (quadrant_num >= MAX_SHIELD_SECTIONS))
- + Assert(quadrant_num >= 0 && quadrant_num < objp->n_quadrants);
- + if ((quadrant_num < 0) || (quadrant_num >= objp->n_quadrants))
- return damage;
- if (objp->type != OBJ_SHIP && objp->type != OBJ_START)
- @@ -282,7 +282,7 @@
- // just one quadrant
- int shield_is_up(object *objp, int quadrant_num)
- {
- - if ((quadrant_num >= 0) && (quadrant_num < MAX_SHIELD_SECTIONS))
- + if ((quadrant_num >= 0) && (quadrant_num < objp->n_quadrants))
- {
- // Just check one quadrant
- float quad = shield_get_quad(objp, quadrant_num);
- @@ -295,40 +295,10 @@
- // Check all quadrants
- float strength = shield_get_strength(objp);
- - if (strength > MAX(2.0f * MAX_SHIELD_SECTIONS, 0.1f * shield_get_max_strength(objp)))
- + if (strength > MAX(2.0f * objp->n_quadrants, 0.1f * shield_get_max_strength(objp)))
- return 1;
- }
- return 0; // no shield strength
- }
- -// return quadrant containing hit_pnt.
- -// \ 1 /.
- -// 3 \ / 0
- -// / \.
- -// / 2 \.
- -// Note: This is in the object's local reference frame. Do _not_ pass a vector in the world frame.
- -int shield_get_quadrant(vec3d *hit_pnt)
- -{
- - int result = 0;
- -
- - if (hit_pnt->xyz.x < hit_pnt->xyz.z)
- - result |= 1;
- -
- - if (hit_pnt->xyz.x < -hit_pnt->xyz.z)
- - result |= 2;
- -
- - return result;
- -}
- -
- -// Given a global point and an object, get the quadrant number the point belongs to.
- -int shield_get_quadrant_global(object *objp, vec3d *global_pos)
- -{
- - vec3d tpos;
- - vec3d rotpos;
- -
- - vm_vec_sub(&tpos, global_pos, &objp->pos);
- - vm_vec_rotate(&rotpos, &tpos, &objp->orient);
- -
- - return shield_get_quadrant(&rotpos);
- -}
- Index: object/objectshield.h
- ===================================================================
- --- object/objectshield.h (revision 10126)
- +++ object/objectshield.h (working copy)
- @@ -31,7 +31,5 @@
- float shield_apply_damage(object *objp, int quadrant, float damage);
- int shield_is_up(object *objp, int quadrant_num);
- -int shield_get_quadrant(vec3d *hit_pnt);
- -int shield_get_quadrant_global(object *objp, vec3d *global_pos);
- #endif //_OBJECTSHIELD_H
- Index: parse/lua.cpp
- ===================================================================
- --- parse/lua.cpp (revision 10126)
- +++ parse/lua.cpp (working copy)
- @@ -4940,7 +4940,7 @@
- //WMC - copy shields
- if(ADE_SETTING_VAR && sobjh != NULL && sobjh->IsValid())
- {
- - for(int i = 0; i < MAX_SHIELD_SECTIONS; i++)
- + for(int i = 0; i < objh->objp->n_quadrants; i++)
- shield_set_quad(objh->objp, i, shield_get_quad(sobjh->objp, i));
- }
- @@ -8264,6 +8264,9 @@
- aip->target_objnum = OBJ_INDEX(newh->objp);
- aip->target_signature = newh->sig;
- aip->target_time = 0.0f;
- +
- + if (aip == Player_ai)
- + hud_shield_hit_reset(newh->objp);
- }
- else
- {
- @@ -8300,13 +8303,17 @@
- {
- if(newh->IsValid())
- {
- + if (aip == Player_ai) {
- + if (aip->target_signature != newh->sig)
- + hud_shield_hit_reset(newh->objp);
- +
- + Ships[newh->ss->parent_objnum].last_targeted_subobject[Player_num] = newh->ss;
- + }
- +
- aip->target_objnum = OBJ_INDEX(newh->objp);
- aip->target_signature = newh->sig;
- aip->target_time = 0.0f;
- set_targeted_subsys(aip, newh->ss, aip->target_objnum);
- -
- - if (aip == Player_ai)
- - Ships[newh->ss->parent_objnum].last_targeted_subobject[Player_num] = newh->ss;
- }
- else
- {
- Index: parse/sexp.cpp
- ===================================================================
- --- parse/sexp.cpp (revision 10126)
- +++ parse/sexp.cpp (working copy)
- @@ -15287,7 +15287,7 @@
- check = (float)eval_num(CDR(node));
- // check his quadrants
- - for(idx=0; idx<MAX_SHIELD_SECTIONS; idx++){
- + for(idx=0; idx<objp->n_quadrants; idx++){
- if( ((objp->shield_quadrant[idx] / max_quad) * 100.0f) <= check ){
- return SEXP_TRUE;
- }
- @@ -16077,7 +16077,7 @@
- // ...and shields
- target_shipp->ship_max_shield_strength = source_shipp->ship_max_shield_strength;
- - for (i = 0; i < MAX_SHIELD_SECTIONS; i++)
- + for (i = 0; i < MIN(target_objp->n_quadrants, source_objp->n_quadrants); i++)
- target_objp->shield_quadrant[i] = source_objp->shield_quadrant[i];
- @@ -19205,16 +19205,14 @@
- return SEXP_FALSE;
- }
- -#define RIGHT_QUAD 0
- -#define FRONT_QUAD 1
- -#define LEFT_QUAD 3
- -#define REAR_QUAD 2
- -
- // Return SEXP_TRUE if quadrant quadnum is near max.
- int shield_quad_near_max(int quadnum)
- {
- + if (quadnum >= Player_obj->n_quadrants)
- + return SEXP_FALSE;
- +
- float remaining = 0.0f;
- - for (int i=0; i<MAX_SHIELD_SECTIONS; i++) {
- + for (int i=0; i<Player_obj->n_quadrants; i++) {
- if (i == quadnum){
- continue;
- }
- @@ -19274,55 +19272,90 @@
- break;
- case 3: // Player ship suffering shield damage on front.
- - apply_damage_to_shield(Player_obj, FRONT_QUAD, 10.0f);
- - hud_shield_quadrant_hit(Player_obj, FRONT_QUAD);
- - return SEXP_TRUE;
- + if (!(Player_ship->flags2 & SIF2_SHIELD_POINTS)) {
- + apply_damage_to_shield(Player_obj, FRONT_QUAD, 10.0f);
- + hud_shield_quadrant_hit(Player_obj, FRONT_QUAD);
- + return SEXP_TRUE;
- + } else {
- + nprintf(("Warning", "Shield-related Special-check SEXPs do not work on ship %s because it uses model point shields.\n", Player_ship->ship_name));
- + return SEXP_FALSE;
- + }
- break;
- case 4: // Player ship suffering much damage.
- - nprintf(("AI", "Frame %i\n", Framecount));
- - apply_damage_to_shield(Player_obj, FRONT_QUAD, 10.0f);
- - hud_shield_quadrant_hit(Player_obj, FRONT_QUAD);
- - if (Player_obj->shield_quadrant[FRONT_QUAD] < 2.0f)
- - return SEXP_TRUE;
- - else
- + if (!(Player_ship->flags2 & SIF2_SHIELD_POINTS)) {
- + nprintf(("AI", "Frame %i\n", Framecount));
- + apply_damage_to_shield(Player_obj, FRONT_QUAD, 10.0f);
- + hud_shield_quadrant_hit(Player_obj, FRONT_QUAD);
- + if (Player_obj->shield_quadrant[FRONT_QUAD] < 2.0f)
- + return SEXP_TRUE;
- + else
- + return SEXP_FALSE;
- + } else {
- + nprintf(("Warning", "Shield-related Special-check SEXPs do not work on ship %s because it uses model point shields.\n", Player_ship->ship_name));
- return SEXP_FALSE;
- + }
- break;
- case 5: // Player's shield is quick repaired
- - nprintf(("AI", "Frame %i, recharged to %7.3f\n", Framecount, Player_obj->shield_quadrant[FRONT_QUAD]));
- + if (!(Player_ship->flags2 & SIF2_SHIELD_POINTS)) {
- + nprintf(("AI", "Frame %i, recharged to %7.3f\n", Framecount, Player_obj->shield_quadrant[FRONT_QUAD]));
- - apply_damage_to_shield(Player_obj, FRONT_QUAD, -flFrametime*200.0f);
- + apply_damage_to_shield(Player_obj, FRONT_QUAD, -flFrametime*200.0f);
- - if (Player_obj->shield_quadrant[FRONT_QUAD] > get_max_shield_quad(Player_obj))
- + if (Player_obj->shield_quadrant[FRONT_QUAD] > get_max_shield_quad(Player_obj))
- Player_obj->shield_quadrant[FRONT_QUAD] = get_max_shield_quad(Player_obj);
- - if (Player_obj->shield_quadrant[FRONT_QUAD] > Player_obj->shield_quadrant[(FRONT_QUAD+1)%MAX_SHIELD_SECTIONS] - 2.0f)
- - return SEXP_TRUE;
- - else
- + if (Player_obj->shield_quadrant[FRONT_QUAD] > Player_obj->shield_quadrant[(FRONT_QUAD+1)%DEFAULT_SHIELD_SECTIONS] - 2.0f)
- + return SEXP_TRUE;
- + else
- + return SEXP_FALSE;
- + } else {
- + nprintf(("Warning", "Shield-related Special-check SEXPs do not work on ship %s because it uses model point shields.\n", Player_ship->ship_name));
- return SEXP_FALSE;
- + }
- break;
- case 6: // 3 of player's shield quadrants are reduced to 0.
- - Player_obj->shield_quadrant[1] = 1.0f;
- - Player_obj->shield_quadrant[2] = 1.0f;
- - Player_obj->shield_quadrant[3] = 1.0f;
- - hud_shield_quadrant_hit(Player_obj, FRONT_QUAD);
- + if (!(Player_ship->flags2 & SIF2_SHIELD_POINTS)) {
- + Player_obj->shield_quadrant[1] = 1.0f;
- + Player_obj->shield_quadrant[2] = 1.0f;
- + Player_obj->shield_quadrant[3] = 1.0f;
- + hud_shield_quadrant_hit(Player_obj, FRONT_QUAD);
- + } else {
- + nprintf(("Warning", "Shield-related Special-check SEXPs do not work on ship %s because it uses model point shields.\n", Player_ship->ship_name));
- + return SEXP_FALSE;
- + }
- return SEXP_TRUE;
- case 7: // Make sure front quadrant has been maximized, or close to it.
- - if (shield_quad_near_max(FRONT_QUAD)) return SEXP_TRUE; else return SEXP_FALSE;
- + if (!(Player_ship->flags2 & SIF2_SHIELD_POINTS)) {
- + if (shield_quad_near_max(FRONT_QUAD)) return SEXP_TRUE; else return SEXP_FALSE;
- + } else {
- + nprintf(("Warning", "Shield-related Special-check SEXPs do not work on ship %s because it uses model point shields.\n", Player_ship->ship_name));
- + return SEXP_FALSE;
- + }
- break;
- case 8: // Make sure rear quadrant has been maximized, or close to it.
- - if (shield_quad_near_max(REAR_QUAD)) return SEXP_TRUE; else return SEXP_FALSE;
- + if (!(Player_ship->flags2 & SIF2_SHIELD_POINTS)) {
- + if (shield_quad_near_max(REAR_QUAD)) return SEXP_TRUE; else return SEXP_FALSE;
- + } else {
- + nprintf(("Warning", "Shield-related Special-check SEXPs do not work on ship %s because it uses model point shields.\n", Player_ship->ship_name));
- + return SEXP_FALSE;
- + }
- break;
- case 9: // Zero left and right quadrants in preparation for maximizing rear quadrant.
- - Player_obj->shield_quadrant[LEFT_QUAD] = 0.0f;
- - Player_obj->shield_quadrant[RIGHT_QUAD] = 0.0f;
- - hud_shield_quadrant_hit(Player_obj, LEFT_QUAD);
- - return SEXP_TRUE;
- + if (!(Player_ship->flags2 & SIF2_SHIELD_POINTS)) {
- + Player_obj->shield_quadrant[LEFT_QUAD] = 0.0f;
- + Player_obj->shield_quadrant[RIGHT_QUAD] = 0.0f;
- + hud_shield_quadrant_hit(Player_obj, LEFT_QUAD);
- + return SEXP_TRUE;
- + } else {
- + nprintf(("Warning", "Shield-related Special-check SEXPs do not work on ship %s because it uses model point shields.\n", Player_ship->ship_name));
- + return SEXP_FALSE;
- + }
- break;
- case 10: // Return true if player is low on Interceptors.
- @@ -19347,9 +19380,14 @@
- break;
- case 13: // Zero front shield quadrant. Added for Jim Boone on August 26, 1999 by MK.
- - Player_obj->shield_quadrant[FRONT_QUAD] = 0.0f;
- - hud_shield_quadrant_hit(Player_obj, FRONT_QUAD);
- - return SEXP_TRUE;
- + if (!(Player_ship->flags2 & SIF2_SHIELD_POINTS)) {
- + Player_obj->shield_quadrant[FRONT_QUAD] = 0.0f;
- + hud_shield_quadrant_hit(Player_obj, FRONT_QUAD);
- + return SEXP_TRUE;
- + } else {
- + nprintf(("Warning", "Shield-related Special-check SEXPs do not work on ship %s because it uses model point shields.\n", Player_ship->ship_name));
- + return SEXP_FALSE;
- + }
- break;
- case 100: // Return true if player is out of countermeasures.
- Index: ship/shield.cpp
- ===================================================================
- --- ship/shield.cpp (revision 10126)
- +++ ship/shield.cpp (working copy)
- @@ -646,7 +646,7 @@
- return damage;
- }
- - if ( (quadrant < 0) || (quadrant >= MAX_SHIELD_SECTIONS) ) return damage;
- + if ( (quadrant < 0) || (quadrant >= objp->n_quadrants) ) return damage;
- Assert(objp->type == OBJ_SHIP);
- aip = &Ai_info[Ships[objp->instance].ai_index];
- @@ -959,7 +959,7 @@
- */
- int ship_is_shield_up( object *obj, int quadrant )
- {
- - if ( (quadrant >= 0) && (quadrant < MAX_SHIELD_SECTIONS)) {
- + if ( (quadrant >= 0) && (quadrant < obj->n_quadrants)) {
- // Just check one quadrant
- if (obj->shield_quadrant[quadrant] > MAX(2.0f, 0.1f * get_max_shield_quad(obj))) {
- return 1;
- @@ -981,15 +981,31 @@
- // / \.
- // / 2 \.
- // Note: This is in the object's local reference frame. Do _not_ pass a vector in the world frame.
- -int get_quadrant(vec3d *hit_pnt)
- +int get_quadrant(vec3d *hit_pnt, object *shipobjp)
- {
- - int result = 0;
- + if (shipobjp != NULL && Ship_info[Ships[shipobjp->instance].ship_info_index].flags2 & SIF2_SHIELD_POINTS) {
- + int closest = -1;
- + float closest_dist = FLT_MAX;
- - if (hit_pnt->xyz.x < hit_pnt->xyz.z)
- - result |= 1;
- + for (unsigned int i=0; i<Ships[shipobjp->instance].shield_points.size(); i++) {
- + float dist = vm_vec_dist(hit_pnt, &Ships[shipobjp->instance].shield_points.at(i));
- - if (hit_pnt->xyz.x < -hit_pnt->xyz.z)
- - result |= 2;
- + if (dist < closest_dist) {
- + closest = i;
- + closest_dist = dist;
- + }
- + }
- - return result;
- + return closest;
- + } else {
- + int result = 0;
- +
- + if (hit_pnt->xyz.x < hit_pnt->xyz.z)
- + result |= 1;
- +
- + if (hit_pnt->xyz.x < -hit_pnt->xyz.z)
- + result |= 2;
- +
- + return result;
- + }
- }
- Index: ship/ship.cpp
- ===================================================================
- --- ship/ship.cpp (revision 10126)
- +++ ship/ship.cpp (working copy)
- @@ -306,6 +306,7 @@
- { "no ets", SIF2_NO_ETS, 1 },
- { "no lighting", SIF2_NO_LIGHTING, 1 },
- { "auto spread shields", SIF2_AUTO_SPREAD_SHIELDS, 1 },
- + { "model shield points", SIF2_SHIELD_POINTS, 1 },
- // to keep things clean, obsolete options go last
- { "ballistic primaries", -1, 255 }
- @@ -2509,6 +2510,34 @@
- }
- }
- + if(optional_string("$Model Shield Point Controls:")) {
- + SCP_vector<SCP_string> ctrl_strings;
- + int num_strings = stuff_string_list(ctrl_strings);
- +
- + // Init all to -1 in case some aren't supplied...
- + sip->shield_point_augment_ctrls[FRONT_QUAD] = -1;
- + sip->shield_point_augment_ctrls[REAR_QUAD] = -1;
- + sip->shield_point_augment_ctrls[LEFT_QUAD] = -1;
- + sip->shield_point_augment_ctrls[RIGHT_QUAD] = -1;
- +
- + for (int i = 0; i < num_strings; i++) {
- + const char *str = ctrl_strings[i].c_str();
- +
- + if (!stricmp(str, "front"))
- + sip->shield_point_augment_ctrls[FRONT_QUAD] = i;
- + else if (!stricmp(str, "rear"))
- + sip->shield_point_augment_ctrls[REAR_QUAD] = i;
- + else if (!stricmp(str, "left"))
- + sip->shield_point_augment_ctrls[LEFT_QUAD] = i;
- + else if (!stricmp(str, "right"))
- + sip->shield_point_augment_ctrls[RIGHT_QUAD] = i;
- + else if (!stricmp(str, "none"))
- + sip->shield_point_augment_ctrls[RIGHT_QUAD] = -1;
- + else
- + Warning(LOCATION, "Unrecognized value \"%s\" passed to $Shield Point Controls, ignoring...", str);
- + }
- + }
- +
- // optional shield color
- if(optional_string("$Shield Color:")){
- stuff_ubyte(&sip->shield_color[0]);
- @@ -4886,6 +4915,8 @@
- special_hitpoints = 0;
- special_shield = -1;
- + shield_points.clear();
- +
- ship_max_shield_strength = 0.0f;
- ship_max_hull_strength = 0.0f;
- @@ -5148,6 +5179,7 @@
- object *objp = &Objects[objnum];
- ship_info *sip = &(Ship_info[ship_type]);
- ship_weapon *swp = &shipp->weapons;
- + polymodel *pm = model_get(sip->model_num);
- extern int oo_arrive_time_count[MAX_SHIPS];
- extern int oo_interp_count[MAX_SHIPS];
- @@ -5181,6 +5213,12 @@
- shield_set_strength(objp, shipp->ship_max_shield_strength);
- }
- + if (sip->flags2 & SIF2_SHIELD_POINTS) {
- + objp->n_quadrants = pm->shield_points.size();
- + shipp->shield_points = pm->shield_points;
- + objp->shield_quadrant.resize(objp->n_quadrants);
- + }
- +
- shipp->orders_accepted = ship_get_default_orders_accepted( sip );
- if (!subsys_set(objnum))
- @@ -5258,8 +5296,6 @@
- shipp->collision_damage_type_idx = sip->collision_damage_type_idx;
- shipp->debris_damage_type_idx = sip->debris_damage_type_idx;
- - polymodel *pm = model_get(sip->model_num);
- -
- if(pm != NULL && pm->n_view_positions > 0)
- ship_set_eye(objp, 0);
- else
- @@ -9110,10 +9146,12 @@
- ship_info *sip;
- ship *sp;
- polymodel * pm;
- + object *objp;
- Assert( n >= 0 && n < MAX_SHIPS );
- sp = &Ships[n];
- sip = &(Ship_info[ship_type]);
- + objp = &Objects[sp->objnum];
- // get new model
- if (sip->model_num == -1) {
- @@ -9161,6 +9199,14 @@
- for ( i=0; i<pm->n_detail_levels; i++ )
- pm->detail_depth[i] = (i < sip->num_detail_levels) ? i2fl(sip->detail_distance[i]) : 0.0f;
- + if (sip->flags2 & SIF2_SHIELD_POINTS) {
- + objp->n_quadrants = pm->shield_points.size();
- + sp->shield_points = pm->shield_points;
- + } else {
- + objp->n_quadrants = DEFAULT_SHIELD_SECTIONS;
- + }
- + objp->shield_quadrant.resize(objp->n_quadrants);
- +
- if (sp->shield_integrity != NULL) {
- vm_free(sp->shield_integrity);
- sp->shield_integrity = NULL;
- @@ -14293,7 +14339,7 @@
- // convert hitpos to position in model coordinates
- vm_vec_sub(&tmpv1, hitpos, &hit_objp->pos);
- vm_vec_rotate(&tmpv2, &tmpv1, &hit_objp->orient);
- - quadrant_num = get_quadrant(&tmpv2);
- + quadrant_num = get_quadrant(&tmpv2, hit_objp);
- if ( quadrant_num < 0 )
- quadrant_num = 0;
- Index: ship/ship.h
- ===================================================================
- --- ship/ship.h (revision 10126)
- +++ ship/ship.h (working copy)
- @@ -649,6 +649,8 @@
- int shield_hits; // Number of hits on shield this frame.
- + SCP_vector<vec3d> shield_points;
- +
- float wash_intensity;
- vec3d wash_rot_axis;
- int wash_timestamp;
- @@ -919,8 +921,9 @@
- #define SIF2_NO_LIGHTING (1 << 14) // Valathil - No lighting for this ship
- #define SIF2_DYN_PRIMARY_LINKING (1 << 15) // RSAXVC - Dynamically generate weapon linking options
- #define SIF2_AUTO_SPREAD_SHIELDS (1 << 16) // zookeeper - auto spread shields
- +#define SIF2_SHIELD_POINTS (1 << 17) // zookeeper - uses model-defined shield points instead of quadrants
- // !!! IF YOU ADD A FLAG HERE BUMP MAX_SHIP_FLAGS !!!
- -#define MAX_SHIP_FLAGS 17 // Number of distinct flags for flags field in ship_info struct
- +#define MAX_SHIP_FLAGS 18 // Number of distinct flags for flags field in ship_info struct
- #define SIF_DEFAULT_VALUE 0
- #define SIF2_DEFAULT_VALUE 0
- @@ -1288,6 +1291,8 @@
- bool auto_shield_spread_bypass;
- int auto_shield_spread_from_lod;
- + int shield_point_augment_ctrls[4]; // Re-mapping of shield augmentation controls for model point shields
- +
- float hull_repair_rate; //How much of the hull is repaired every second
- float subsys_repair_rate; //How fast
- @@ -1710,7 +1715,7 @@
- extern int ship_class_query_general_type(int ship_class);
- extern int ship_query_general_type(ship *shipp);
- extern int ship_docking_valid(int docker, int dockee);
- -extern int get_quadrant(vec3d *hit_pnt); // Return quadrant num of last hit ponit.
- +extern int get_quadrant(vec3d *hit_pnt, object *shipobjp = NULL); // Return quadrant num of given hit point.
- extern void ship_obj_list_rebuild(); // only called by save/restore code
- extern int ship_query_state(char *name);
- Index: ship/shiphit.cpp
- ===================================================================
- --- ship/shiphit.cpp (revision 10126)
- +++ ship/shiphit.cpp (working copy)
- @@ -2498,7 +2498,7 @@
- vm_vec_rotate( &local_hitpos, &tmp, &ship_objp->orient );
- // shield_quad = quadrant facing the force_center
- - shield_quad = get_quadrant(&local_hitpos);
- + shield_quad = get_quadrant(&local_hitpos, ship_objp);
- // world_hitpos use force_center for shockwave
- // Goober5000 check for NULL
- @@ -2515,8 +2515,8 @@
- // radius of the object.
- vm_vec_scale_add( &world_hitpos, &ship_objp->pos, &ship_objp->orient.vec.fvec, ship_objp->radius );
- - for (int i=0; i<MAX_SHIELD_SECTIONS; i++){
- - ship_do_damage(ship_objp, other_obj, &world_hitpos, damage/MAX_SHIELD_SECTIONS, i, -1);
- + for (int i=0; i<ship_objp->n_quadrants; i++){
- + ship_do_damage(ship_objp, other_obj, &world_hitpos, damage/ship_objp->n_quadrants, i, -1);
- }
- }
- Index: weapon/beam.cpp
- ===================================================================
- --- weapon/beam.cpp (revision 10126)
- +++ weapon/beam.cpp (working copy)
- @@ -2392,9 +2392,9 @@
- {
- // pick out the shield quadrant
- if (shield_collision)
- - quadrant_num = get_quadrant(&mc_shield.hit_point);
- + quadrant_num = get_quadrant(&mc_shield.hit_point, ship_objp);
- else if (hull_enter_collision && (sip->flags2 & SIF2_SURFACE_SHIELDS))
- - quadrant_num = get_quadrant(&mc_hull_enter.hit_point);
- + quadrant_num = get_quadrant(&mc_hull_enter.hit_point, ship_objp);
- // make sure that the shield is active in that quadrant
- if ((quadrant_num >= 0) && ((shipp->flags & SF_DYING) || !ship_is_shield_up(ship_objp, quadrant_num)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement