/** * Do various updates to debris: check if time to die, start fireballs * Maybe delete debris if it's very far away from player. * * @param obj pointer to debris object * @param frame_time time elapsed since last debris_move() called */ void debris_process_post(object * obj, float frame_time) { int i, num; num = obj->instance; int objnum = OBJ_INDEX(obj); Assert( Debris[num].objnum == objnum ); debris *db = &Debris[num]; if ( db->is_hull ) { MONITOR_INC(NumHullDebris,1); radar_plot_object( obj ); if ( timestamp_elapsed(db->sound_delay) ) { obj_snd_assign(objnum, SND_DEBRIS, &vmd_zero_vector, 0); db->sound_delay = 0; } } else { MONITOR_INC(NumSmallDebris,1); } if ( db->lifeleft >= 0.0f) { db->lifeleft -= frame_time; if ( db->lifeleft < 0.0f ) { debris_start_death_roll(obj, db); } } maybe_delete_debris(db); // Make this debris go away if it's very far away. // ================== DO THE ELECTRIC ARCING STUFF ===================== if ( db->arc_frequency <= 0 ) { return; // If arc_frequency <= 0, this piece has no arcs on it } if ( !timestamp_elapsed(db->fire_timeout) && timestamp_elapsed(db->next_fireball)) { db->next_fireball = timestamp_rand(db->arc_frequency,db->arc_frequency*2 ); db->arc_frequency += 100; if (db->is_hull) { int n, n_arcs = ((rand()>>5) % 3)+1; // Create 1-3 sparks vec3d v1, v2, v3, v4; if ( Cmdline_old_collision_sys ) { submodel_get_two_random_points( db->model_num, db->submodel_num, &v1, &v2 ); submodel_get_two_random_points( db->model_num, db->submodel_num, &v3, &v4 ); } else { submodel_get_two_random_points_better( db->model_num, db->submodel_num, &v1, &v2 ); submodel_get_two_random_points_better( db->model_num, db->submodel_num, &v3, &v4 ); } n = 0; int a = 100, b = 1000; int lifetime = (myrand()%((b)-(a)+1))+(a); // Create the spark effects for (i=0; i<MAX_DEBRIS_ARCS; i++ ) { if ( !timestamp_valid( db->arc_timestamp[i] ) ) { db->arc_timestamp[i] = timestamp(lifetime); // live up to a second switch( n ) { case 0: db->arc_pts[i][0] = v1; db->arc_pts[i][1] = v2; break; case 1: db->arc_pts[i][0] = v2; db->arc_pts[i][1] = v3; break; case 2: db->arc_pts[i][0] = v2; db->arc_pts[i][1] = v4; break; default: Int3(); } n++; if ( n == n_arcs ) break; // Don't need to create anymore } } // rotate v2 out of local coordinates into world. // Use v2 since it is used in every bolt. See above switch(). vec3d snd_pos; vm_vec_unrotate(&snd_pos, &v2, &obj->orient); vm_vec_add2(&snd_pos, &obj->pos ); //Play a sound effect if ( lifetime > 750 ) { // 1.00 second effect snd_play_3d( gamesnd_get_game_sound(SND_DEBRIS_ARC_05), &snd_pos, &View_position, obj->radius ); } else if ( lifetime > 500 ) { // 0.75 second effect snd_play_3d( gamesnd_get_game_sound(SND_DEBRIS_ARC_04), &snd_pos, &View_position, obj->radius ); } else if ( lifetime > 250 ) { // 0.50 second effect snd_play_3d( gamesnd_get_game_sound(SND_DEBRIS_ARC_03), &snd_pos, &View_position, obj->radius ); } else if ( lifetime > 100 ) { // 0.25 second effect snd_play_3d( gamesnd_get_game_sound(SND_DEBRIS_ARC_02), &snd_pos, &View_position, obj->radius ); } else { // 0.10 second effect snd_play_3d( gamesnd_get_game_sound(SND_DEBRIS_ARC_01), &snd_pos, &View_position, obj->radius ); } }
void radar_render_frame() { int i,color; object * objp; // added 7/5/99 - Owen Evans - radar resizes with screen size switch (Cockpit_mode) { case CM_FULL_SCREEN: Hostage_monitor_size = Game_window_w / 6; Hostage_monitor_x = (grd_curscreen->sc_w - Game_window_w) / 2; Hostage_monitor_y = (grd_curscreen->sc_h - Game_window_h) / 2; break; case CM_FULL_COCKPIT: Hostage_monitor_size = 40; Hostage_monitor_x = 0; Hostage_monitor_y = 80; break; case CM_STATUS_BAR: Hostage_monitor_size = Game_window_w / 6; Hostage_monitor_x = (grd_curscreen->sc_w - Game_window_w) / 2; Hostage_monitor_y = (max_window_h - Game_window_h) / 2; break; case CM_REAR_VIEW: //no radar in rear view or letterbox! case CM_LETTERBOX: return; } //end added - OE if (hostage_is_vclip_playing()) return; gr_set_current_canvas(NULL); gr_setcolor( BM_XRGB( 0, 31, 0 ) ); gr_ucircle( i2f(Hostage_monitor_x+Hostage_monitor_size/2), i2f(Hostage_monitor_y+Hostage_monitor_size/2), i2f(Hostage_monitor_size)/2); //other stuff added 9/14/98 by Victor Rachels for fun. gr_circle( i2f(Hostage_monitor_x+Hostage_monitor_size/2), i2f(Hostage_monitor_y+Hostage_monitor_size/2), i2f(Hostage_monitor_size) / 8 ); gr_upixel((Hostage_monitor_x+Hostage_monitor_size/2), (Hostage_monitor_y+Hostage_monitor_size/2) ); gr_uline(i2f(Hostage_monitor_x+Hostage_monitor_size/10),i2f(Hostage_monitor_y+Hostage_monitor_size/2),i2f(Hostage_monitor_x+Hostage_monitor_size*2/10),i2f(Hostage_monitor_y+Hostage_monitor_size/2)); gr_uline(i2f(Hostage_monitor_x+Hostage_monitor_size-Hostage_monitor_size/10),i2f(Hostage_monitor_y+Hostage_monitor_size/2),i2f(Hostage_monitor_x+Hostage_monitor_size-Hostage_monitor_size*2/10),i2f(Hostage_monitor_y+Hostage_monitor_size/2)); //killed 7/5/99 - Owen Evans - make radar much more useable // // Erase old blips // for (i=0; i<N_blips; i++ ) { // gr_setcolor(gr_gpixel( &GameBitmaps[cockpit_bitmap[0].index], Blips[i].x, Blips[i].y )); // gr_upixel( Blips[i].x, Blips[i].y ); // } //end killed - OE N_blips = 0; // if ( !(Players[Player_num].flags & (PLAYER_FLAGS_RADAR_ENEMIES | PLAYER_FLAGS_RADAR_POWERUPS )) ) return; radx = i2f(Hostage_monitor_size*4)/2; rady = i2f(Hostage_monitor_size*4)/2; cenx = i2f(Hostage_monitor_x)+i2f(Hostage_monitor_size)/2; ceny = i2f(Hostage_monitor_y)+i2f(Hostage_monitor_size)/2; rox = fixdiv( cenx, radx ); roy = fixdiv( ceny, rady ); objp = Objects; for (i=0;i<=Highest_object_index;i++) { switch( objp->type ) { case OBJ_PLAYER: if ( i != Players[Player_num].objnum ) { #ifdef NETWORK if (Game_mode & GM_TEAM) color = get_team(i); else #endif color = i; radar_plot_object( objp, gr_getcolor(player_rgb[color].r,player_rgb[color].g,player_rgb[color].b) ); } break; case OBJ_HOSTAGE: radar_plot_object( objp, BM_XRGB(0,31,0) ); break; case OBJ_POWERUP: //if ( Players[Player_num].flags & PLAYER_FLAGS_RADAR_POWERUPS ) if(!(Game_mode & GM_MULTI)) radar_plot_object( objp, BM_XRGB(0,0,31) ); break; case OBJ_ROBOT: // //if ( Players[Player_num].flags & PLAYER_FLAGS_RADAR_ENEMIES ) radar_plot_object( objp, BM_XRGB(31,0,0) ); break; // added 7/5/99 - Owen Evans - reactor is now shown on radar case OBJ_CNTRLCEN: radar_plot_object( objp, BM_XRGB(31,31,31) ); break; // end added - OE default: break; } objp++; } // Draw new blips... for (i=0; i<N_blips; i++ ) { gr_setcolor( Blips[i].c ); gr_upixel( Blips[i].x, Blips[i].y ); } }