FS2_Open
Open source remastering of the Freespace 2 engine
shockwave.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) Volition, Inc. 1999. All rights reserved.
3  *
4  * All source code herein is the property of Volition, Inc. You may not sell
5  * or otherwise commercially exploit the source or things you created based on the
6  * source.
7  *
8 */
9 
10 
11 
12 #include "asteroid/asteroid.h"
13 #include "gamesnd/gamesnd.h"
14 #include "globalincs/linklist.h"
15 #include "io/timer.h"
16 #include "model/modelrender.h"
17 #include "object/object.h"
18 #include "render/3d.h"
19 #include "ship/ship.h"
20 #include "ship/shiphit.h"
21 #include "weapon/shockwave.h"
22 #include "weapon/weapon.h"
23 
24 // -----------------------------------------------------------
25 // Module-wide globals
26 // -----------------------------------------------------------
27 
28 static char *Default_shockwave_2D_filename = "shockwave01";
29 static char *Default_shockwave_3D_filename = "shockwave.pof";
30 static int Default_shockwave_loaded = 0;
31 
33 
37 
38 // -----------------------------------------------------------
39 // Function macros
40 // -----------------------------------------------------------
41 #define SW_INDEX(sw) (sw-Shockwaves)
42 
43 // -----------------------------------------------------------
44 // Externals
45 // -----------------------------------------------------------
46 extern int Show_area_effect;
47 extern int Cmdline_nohtl;
49 extern bool Cmdline_fb_explosions;
50 
51 
64 int shockwave_create(int parent_objnum, vec3d *pos, shockwave_create_info *sci, int flag, int delay)
65 {
66  int i, objnum, real_parent;
67  int info_index = -1, model_id = -1;
68  shockwave *sw;
69  matrix orient;
70 
71  for (i = 0; i < MAX_SHOCKWAVES; i++) {
72  if ( !(Shockwaves[i].flags & SW_USED) )
73  break;
74  }
75 
76  if (i == MAX_SHOCKWAVES)
77  return -1;
78 
79  // try 2D shockwave first, then fall back to 3D, then fall back to default of either
80  // this should be pretty fool-proof and allow quick change between 2D and 3D effects
81  if ( strlen(sci->name) )
82  info_index = shockwave_load(sci->name, false);
83 
84  if ( (info_index < 0) && strlen(sci->pof_name) )
85  info_index = shockwave_load(sci->pof_name, true);
86 
87  if (info_index < 0) {
88  if ( (Shockwave_info[0].bitmap_id >= 0) || (Shockwave_info[0].model_id >= 0) ) {
89  info_index = 0;
90  model_id = Shockwave_info[0].model_id;
91  } else {
92  // crap, just bail
93  return -1;
94  }
95  } else {
96  model_id = Shockwave_info[info_index].model_id;
97  }
98 
99  // real_parent is the guy who caused this shockwave to happen
100  if (parent_objnum == -1) { // Goober5000
101  real_parent = -1;
102  } else if ( Objects[parent_objnum].type == OBJ_WEAPON ){
103  real_parent = Objects[parent_objnum].parent;
104  } else {
105  real_parent = parent_objnum;
106  }
107 
108  sw = &Shockwaves[i];
109 
110  sw->model_id = model_id;
111  sw->flags = (SW_USED | flag);
112  sw->speed = sci->speed;
113  sw->inner_radius = sci->inner_rad;
114  sw->outer_radius = sci->outer_rad;
115  sw->damage = sci->damage;
116  sw->blast = sci->blast;
117  sw->radius = 1.0f;
118  sw->pos = *pos;
119  sw->num_objs_hit = 0;
120  sw->shockwave_info_index = info_index; // only one type for now... type could be passed is as a parameter
121  sw->current_bitmap = -1;
122 
123  sw->time_elapsed=0.0f;
124  sw->delay_stamp = delay;
125 
126  sw->rot_angles = sci->rot_angles;
127  sw->damage_type_idx = sci->damage_type_idx;
128 
129  sw->total_time = sw->outer_radius / sw->speed;
130 
131  if ( (parent_objnum != -1) && Objects[parent_objnum].type == OBJ_WEAPON ) { // Goober5000: allow -1
133  }
134  else {
135  sw->weapon_info_index = -1;
136  }
137 
138  orient = vmd_identity_matrix;
139  vm_angles_2_matrix(&orient, &sw->rot_angles);
140 
141  objnum = obj_create( OBJ_SHOCKWAVE, real_parent, i, &orient, &sw->pos, sw->outer_radius, OF_RENDERS );
142 
143  if ( objnum == -1 ){
144  Int3();
145  }
146 
147  sw->objnum = objnum;
148 
149  list_append(&Shockwave_list, sw);
150 
151  return objnum;
152 }
153 
159 void shockwave_delete(object *objp)
160 {
161  Assert(objp->type == OBJ_SHOCKWAVE);
162  Assert(objp->instance >= 0 && objp->instance < MAX_SHOCKWAVES);
163 
164  Shockwaves[objp->instance].flags = 0;
165  Shockwaves[objp->instance].objnum = -1;
166  list_remove(&Shockwave_list, &Shockwaves[objp->instance]);
167 }
168 
173 {
174  shockwave *sw, *next;
175 
176  sw = GET_FIRST(&Shockwave_list);
177  while ( sw != &Shockwave_list ) {
178  next = sw->next;
179  Assert(sw->objnum != -1);
181  sw = next;
182  }
183 }
184 
189 {
190  int framenum;
191  shockwave *sw;
192  shockwave_info *si;
193 
194  Assert( (index >= 0) && (index < MAX_SHOCKWAVES) );
195 
196  sw = &Shockwaves[index];
197  si = &Shockwave_info[sw->shockwave_info_index];
198 
199  // skip this if it's a 3d shockwave since it won't have the maps managed here
200  if (si->bitmap_id < 0)
201  return;
202 
203  framenum = fl2i(sw->time_elapsed / sw->total_time * si->num_frames + 0.5);
204 
205  // ensure we don't go past the number of frames of animation
206  if ( framenum > (si->num_frames-1) ) {
207  framenum = (si->num_frames-1);
209  }
210 
211  if ( framenum < 0 ) {
212  framenum = 0;
213  }
214 
215  sw->current_bitmap = si->bitmap_id + framenum;
216 }
217 
222 int shockwave_get_framenum(int index, int num_frames)
223 {
224  int framenum;
225  shockwave *sw;
226 
227  if ( (index < 0) || (index >= MAX_SHOCKWAVES) ) {
228  Int3();
229  return 0;
230  }
231 
232  sw = &Shockwaves[index];
233 
234  framenum = fl2i(sw->time_elapsed / sw->total_time * num_frames + 0.5);
235 
236  // ensure we don't go past the number of frames of animation
237  if ( framenum > (num_frames-1) ) {
238  framenum = (num_frames-1);
240  }
241 
242  if ( framenum < 0 ) {
243  framenum = 0;
244  }
245 
246  return framenum;
247 }
248 
256 void shockwave_move(object *shockwave_objp, float frametime)
257 {
258  shockwave *sw;
259  object *objp;
260  float blast,damage;
261  int i;
262 
263  Assert(shockwave_objp->type == OBJ_SHOCKWAVE);
264  Assert(shockwave_objp->instance >= 0 && shockwave_objp->instance < MAX_SHOCKWAVES);
265  sw = &Shockwaves[shockwave_objp->instance];
266 
267  // if the shockwave has a delay on it
268  if(sw->delay_stamp != -1){
270  sw->delay_stamp = -1;
271  } else {
272  return;
273  }
274  }
275 
276  sw->time_elapsed += frametime;
277 
278  shockwave_set_framenum(shockwave_objp->instance);
279 
280  sw->radius += (frametime * sw->speed);
281  if ( sw->radius > sw->outer_radius ) {
282  sw->radius = sw->outer_radius;
283  shockwave_objp->flags |= OF_SHOULD_BE_DEAD;
284  return;
285  }
286 
287  // blast ships and asteroids
288  // And (some) weapons
289  for ( objp = GET_FIRST(&obj_used_list); objp !=END_OF_LIST(&obj_used_list); objp = GET_NEXT(objp) ) {
290  if ( (objp->type != OBJ_SHIP) && (objp->type != OBJ_ASTEROID) && (objp->type != OBJ_WEAPON)) {
291  continue;
292  }
293 
294  if(objp->type == OBJ_WEAPON) {
295  // only apply to missiles with hitpoints
297  if (wip->weapon_hitpoints <= 0)
298  continue;
299 
301  continue;
302  }
303 
304 
305  if ( objp->type == OBJ_SHIP ) {
306  // don't blast navbuoys
307  if ( ship_get_SIF(objp->instance) & SIF_NAVBUOY ) {
308  continue;
309  }
310  }
311 
312  // only apply damage to a ship once from a shockwave
313  for ( i = 0; i < sw->num_objs_hit; i++ ) {
314  if ( objp->signature == sw->obj_sig_hitlist[i] ){
315  break;
316  }
317  }
318 
319  if ( i < sw->num_objs_hit ){
320  continue;
321  }
322 
323  if ( weapon_area_calc_damage(objp, &sw->pos, sw->inner_radius, sw->outer_radius, sw->blast, sw->damage, &blast, &damage, sw->radius) == -1 ){
324  continue;
325  }
326 
327  // okay, we have damage applied, record the object signature so we don't repeatedly apply damage
329  if ( sw->num_objs_hit >= SW_MAX_OBJS_HIT) {
330  sw->num_objs_hit--;
331  }
332 
333  weapon_info* wip = NULL;
334 
335  switch(objp->type) {
336  case OBJ_SHIP:
337  sw->obj_sig_hitlist[sw->num_objs_hit++] = objp->signature;
338  // If we're doing an AoE Electronics shockwave, do the electronics stuff. -MageKing17
341  }
342  ship_apply_global_damage(objp, shockwave_objp, &sw->pos, damage );
343  weapon_area_apply_blast(NULL, objp, &sw->pos, blast, 1);
344  break;
345  case OBJ_ASTEROID:
346  asteroid_hit(objp, NULL, NULL, damage);
347  break;
348  case OBJ_WEAPON:
350  if (wip->armor_type_idx >= 0)
351  damage = Armor_types[wip->armor_type_idx].GetDamage(damage, shockwave_get_damage_type_idx(shockwave_objp->instance),1.0f);
352 
353  objp->hull_strength -= damage;
354  if (objp->hull_strength < 0.0f) {
355  Weapons[objp->instance].lifeleft = 0.01f;
356  Weapons[objp->instance].weapon_flags |= WF_DESTROYED_BY_WEAPON;
357  }
358  break;
359  default:
360  Int3();
361  break;
362  }
363 
364  // If this shockwave hit the player, play shockwave impact sound
365  if ( objp == Player_obj ) {
366  float full_damage, vol_scale;
367  if (sw->weapon_info_index >= 0) {
368  full_damage = Weapon_info[sw->weapon_info_index].damage;
369  } else {
370  full_damage = sw->damage;
371  }
372  if (full_damage != 0.0f) {
373  vol_scale = MAX(0.4f, damage/full_damage);
374  } else {
375  vol_scale = 1.0f;
376  }
377  snd_play( &Snds[SND_SHOCKWAVE_IMPACT], 0.0f, vol_scale );
378  }
379 
380  } // end for
381 }
382 
389 {
390  shockwave *sw;
391  vertex p;
392 
393  Assert(objp->type == OBJ_SHOCKWAVE);
394  Assert(objp->instance >= 0 && objp->instance < MAX_SHOCKWAVES);
395 
396  memset(&p, 0, sizeof(p));
397  sw = &Shockwaves[objp->instance];
398 
399  if( (sw->delay_stamp != -1) && !timestamp_elapsed(sw->delay_stamp)){
400  return;
401  }
402 
403  if ( (sw->current_bitmap < 0) && (sw->model_id < 0) )
404  return;
405 
406  // turn off fogging
408  gr_fog_set(GR_FOGMODE_NONE, 0, 0, 0);
409  }
410 
411  if (sw->model_id > -1) {
412  float model_Interp_scale_xyz = sw->radius / 50.0f;
413 
414  model_set_warp_globals( model_Interp_scale_xyz, model_Interp_scale_xyz, model_Interp_scale_xyz, -1, 1.0f - (sw->radius/sw->outer_radius) );
415 
416  float dist = vm_vec_dist_quick( &sw->pos, &Eye_position );
417 
418  model_set_detail_level((int)(dist / (sw->radius * 10.0f)));
420 
423  {
424  g3_transfer_vertex(&p, &sw->pos);
425 
427  Shockwave_info[1].bitmap_id+shockwave_get_framenum(objp->instance, 94),
429  &p,
430  fl_radians(sw->rot_angles.p),
431  sw->radius,
432  ((sw->time_elapsed/sw->total_time)>0.9f)?(1.0f-(sw->time_elapsed/sw->total_time))*10.0f:1.0f
433  );
434  }
435  }else{
436  if (!Cmdline_nohtl) {
437  g3_transfer_vertex(&p, &sw->pos);
438  } else {
439  g3_rotate_vertex(&p, &sw->pos);
440  }
442  {
444  sw->current_bitmap,
446  &p,
447  fl_radians(sw->rot_angles.p),
448  sw->radius,
449  ((sw->time_elapsed/sw->total_time)>0.9f)?(1.0f-(sw->time_elapsed/sw->total_time))*10.0f:1.0f
450  );
451  }
453  sw->current_bitmap,
455  &p,
456  fl_radians(sw->rot_angles.p),
457  sw->radius
458  );
459  }
460 }
461 
462 void shockwave_render(object *objp, draw_list *scene)
463 {
464  shockwave *sw;
465  vertex p;
466 
467  Assert(objp->type == OBJ_SHOCKWAVE);
468  Assert(objp->instance >= 0 && objp->instance < MAX_SHOCKWAVES);
469 
470  sw = &Shockwaves[objp->instance];
471 
472  if( (sw->delay_stamp != -1) && !timestamp_elapsed(sw->delay_stamp)){
473  return;
474  }
475 
476  if ( (sw->current_bitmap < 0) && (sw->model_id < 0) )
477  return;
478 
479  if (sw->model_id > -1) {
480  vec3d scale;
481  scale.xyz.x = scale.xyz.y = scale.xyz.z = sw->radius / 50.0f;
482 
483  model_render_params render_info;
484 
485  render_info.set_warp_params(-1, 1.0f - (sw->radius/sw->outer_radius), scale);
486 
487  float dist = vm_vec_dist_quick( &sw->pos, &Eye_position );
488 
489  render_info.set_detail_level_lock((int)(dist / (sw->radius * 10.0f)));
491  render_info.set_object_number(sw->objnum);
492 
493  model_render_queue( &render_info, scene, sw->model_id, &Objects[sw->objnum].orient, &sw->pos);
494 
495  if ( Cmdline_fb_explosions ) {
496  g3_transfer_vertex(&p, &sw->pos);
497 
499  Shockwave_info[1].bitmap_id+shockwave_get_framenum(objp->instance, 94),
501  &p,
502  fl_radians(sw->rot_angles.p),
503  sw->radius,
504  ((sw->time_elapsed/sw->total_time)>0.9f)?(1.0f-(sw->time_elapsed/sw->total_time))*10.0f:1.0f
505  );
506  }
507  } else {
508  if (!Cmdline_nohtl) {
509  g3_transfer_vertex(&p, &sw->pos);
510  } else {
511  g3_rotate_vertex(&p, &sw->pos);
512  }
513 
514  if ( Cmdline_fb_explosions ) {
516  sw->current_bitmap,
518  &p,
519  fl_radians(sw->rot_angles.p),
520  sw->radius,
521  ((sw->time_elapsed/sw->total_time)>0.9f)?(1.0f-(sw->time_elapsed/sw->total_time))*10.0f:1.0f
522  );
523  }
524 
526  sw->current_bitmap,
528  &p,
529  fl_radians(sw->rot_angles.p),
530  sw->radius
531  );
532  }
533 }
534 
538 int shockwave_load(char *s_name, bool shock_3D)
539 {
540  size_t i;
541  int s_index = -1;
542  shockwave_info *si = NULL;
543 
544  Assert( s_name );
545 
546  // make sure that this is, or should be, valid
547  if ( !VALID_FNAME(s_name) )
548  return -1;
549 
550  for (i = 0; i < Shockwave_info.size(); i++) {
551  if ( !stricmp(Shockwave_info[i].filename, s_name) ) {
552  s_index = i;
553  break;
554  }
555  }
556 
557  if (s_index < 0) {
558  shockwave_info si_tmp;
559 
560  strcpy_s(si_tmp.filename, s_name);
561 
562  Shockwave_info.push_back( si_tmp );
563  s_index = (int)(Shockwave_info.size() - 1);
564  }
565 
566  Assert( s_index >= 0 );
567  si = &Shockwave_info[s_index];
568 
569  // make sure to only try loading the shockwave once
570  if ( (si->bitmap_id >= 0) || (si->model_id >= 0) )
571  return s_index;
572 
573  if (shock_3D) {
574  si->model_id = model_load( si->filename, 0, NULL );
575 
576  if ( si->model_id < 0 ) {
577  Shockwave_info.pop_back();
578  return -1;
579  }
580  } else {
581  si->bitmap_id = bm_load_animation( si->filename, &si->num_frames, &si->fps, NULL, 1 );
582 
583  if ( si->bitmap_id < 0 ) {
584  Shockwave_info.pop_back();
585  return -1;
586  }
587  }
588 
589  return s_index;
590 }
591 
596 {
597  int i;
598 
599  if ( !Default_shockwave_loaded ) {
600  i = -1;
601 
602  // try and load in a 3d shockwave first if enabled
603  // Goober5000 - check for existence of file before trying to load it
604  // chief1983 - Spicious added this check for the command line option. I've modified the hardcoded "shockwave.pof" that existed in the check
605  // to use the static name instead, and added a check to override the command line if a 2d default filename is not found
606  // Note - The 3d shockwave flag is forced on by TBP's flag as of rev 4983
607  if ( Cmdline_enable_3d_shockwave && cf_exists_full(Default_shockwave_3D_filename, CF_TYPE_MODELS) ) {
608  mprintf(("SHOCKWAVE => Loading default shockwave model... \n"));
609 
610  i = shockwave_load( Default_shockwave_3D_filename, true );
611 
612  if (i >= 0)
613  mprintf(("SHOCKWAVE => Default model load: SUCCEEDED!!\n"));
614  else
615  mprintf(("SHOCKWAVE => Default model load: FAILED!! Falling back to 2D effect...\n"));
616  }
617 
618  // next, try the 2d shockwave effect, unless the 3d effect was loaded
619  // chief1983 - added some messages similar to those for the 3d shockwave
620  if (i < 0 || Cmdline_fb_explosions) {
621  mprintf(("SHOCKWAVE => Loading default shockwave animation... \n"));
622 
623  i = shockwave_load( Default_shockwave_2D_filename );
624 
625  if (i >= 0)
626  mprintf(("SHOCKWAVE => Default animation load: SUCCEEDED!!\n"));
627  else
628  mprintf(("SHOCKWAVE => Default animation load: FAILED!! Checking if 3d effect was already tried...\n"));
629  }
630 
631  // chief1983 - The first patch broke mods that don't provide a 2d shockwave or define a specific shockwave for each model/weapon (shame on them)
632  // The next patch involved a direct copy of the attempt above, with an i < 0 check in place of the command line check. I've taken that and modified it to
633  // spit out a more meaningful message. Might as well not bother trying again if the command line option was checked as it should have tried the first time through
634  if ( i < 0 && !Cmdline_enable_3d_shockwave && cf_exists_full(Default_shockwave_3D_filename, CF_TYPE_MODELS) ) {
635  mprintf(("SHOCKWAVE => Loading default shockwave model as last resort... \n"));
636 
637  i = shockwave_load( Default_shockwave_3D_filename, true );
638 
639  if (i >= 0)
640  mprintf(("SHOCKWAVE => Default model load: SUCCEEDED!!\n"));
641  else
642  mprintf(("SHOCKWAVE => Default model load: FAILED!! No effect loaded...\n"));
643  }
644 
645  if (i < 0)
646  Error(LOCATION, "ERROR: Unable to open neither 3D nor 2D default shockwaves!!");
647 
648  Default_shockwave_loaded = 1;
649  } else {
650  // have to make sure that the default 3D model is still valid and usable
651  // the 2D shockwave shouldn't need anything like this
652  if (Shockwave_info[0].model_id >= 0)
653  Shockwave_info[0].model_id = model_load( Default_shockwave_3D_filename, 0, NULL );
654  }
655 
656  Assert( ((Shockwave_info[0].bitmap_id >= 0) || (Shockwave_info[0].model_id >= 0)) );
657 
658  list_init(&Shockwave_list);
659 
660  for ( i = 0; i < MAX_SHOCKWAVES; i++ ) {
661  Shockwaves[i].flags = 0;
662  Shockwaves[i].objnum = -1;
663  Shockwaves[i].model_id = -1;
664  }
665 
666  Shockwave_inited = 1;
667 }
668 
673 {
674  if ( !Shockwave_inited )
675  return;
676 
678 
679  size_t i;
680 
681  // unload default shockwave, and erase all others
682  for (i = 0; i < Shockwave_info.size(); i++) {
683  if ( !i ) {
684  if (Shockwave_info[i].bitmap_id >= 0)
685  bm_unload( Shockwave_info[i].bitmap_id );
686  else if (Shockwave_info[i].model_id >= 0)
687  model_page_out_textures( Shockwave_info[i].model_id );
688 
689  continue;
690  }
691 
692  if (Shockwave_info[i].bitmap_id >= 0)
693  bm_release( Shockwave_info[i].bitmap_id );
694 
695  if (Shockwave_info[i].model_id >= 0)
696  model_unload( Shockwave_info[i].model_id );
697 
698  Shockwave_info.erase( Shockwave_info.begin() + i );
699  }
700 
701  Shockwave_inited = 0;
702 }
703 
709 void shockwave_move_all(float frametime)
710 {
711  shockwave *sw, *next;
712 
713  sw = GET_FIRST(&Shockwave_list);
714  while ( sw != &Shockwave_list ) {
715  next = sw->next;
716  Assert(sw->objnum != -1);
717  shockwave_move(&Objects[sw->objnum], frametime);
718  sw = next;
719  }
720 }
721 
726 {
727  shockwave *sw, *next;
728 
729  sw = GET_FIRST(&Shockwave_list);
730  while ( sw != &Shockwave_list ) {
731  next = sw->next;
732  Assert(sw->objnum != -1);
734  sw = next;
735  }
736 }
737 
742 {
743  Assert( (index >= 0) && (index < MAX_SHOCKWAVES) );
744  return Shockwaves[index].weapon_info_index;
745 }
746 
751 {
752  Assert( (index >= 0) && (index < MAX_SHOCKWAVES) );
753  return Shockwaves[index].outer_radius;
754 }
755 
760 {
761  Assert( (index >= 0) && (index < MAX_SHOCKWAVES) );
762  return Shockwaves[index].inner_radius;
763 }
764 
769 {
770  Assert( (index >= 0) && (index < MAX_SHOCKWAVES) );
771  return Shockwaves[index].damage;
772 }
773 
778 {
779  Assert( (index >= 0) && (index < MAX_SHOCKWAVES) );
780  return Shockwaves[index].damage_type_idx;
781 }
782 
787 {
788  Assert( (index >= 0) && (index < MAX_SHOCKWAVES) );
789  return Shockwaves[index].flags;
790 }
791 
793 {
794  size_t i;
795 
796  // load in shockwaves
797  for (i = 0; i < Shockwave_info.size(); i++) {
798  if (Shockwave_info[i].bitmap_id >= 0) {
799  bm_page_in_texture( Shockwave_info[i].bitmap_id, Shockwave_info[i].num_frames );
800  } else if (Shockwave_info[i].model_id >= 0) {
801  // for a model we have to run model_load() on it again to make sure
802  // that it's ref_count is sane for this mission
803  int idx __UNUSED = model_load( Shockwave_info[i].filename, 0, NULL );
804  Assert( idx == Shockwave_info[i].model_id );
805 
806  model_page_in_textures( Shockwave_info[i].model_id );
807  }
808  }
809 }
810 
812 {
813  sci->name[ 0 ] = '\0';
814  sci->pof_name[ 0 ] = '\0';
815 
816  sci->inner_rad = sci->outer_rad = sci->damage = sci->blast = sci->speed = 0.0f;
817 
818  sci->rot_angles.p = sci->rot_angles.b = sci->rot_angles.h = 0.0f;
819  sci->damage_type_idx = sci->damage_type_idx_sav = -1;
820 }
821 
826 {
827  int i = -1;
828 
829  // shockwave_load() will return -1 if the filename is "none" or "<none>"
830  // checking for that case lets us handle a situation where a 2D shockwave
831  // of "none" was specified and a valid 3D shockwave was specified
832 
833  if ( strlen(sci->name) )
834  i = shockwave_load(sci->name, false);
835 
836  if ( (i < 0) && strlen(sci->pof_name) )
837  shockwave_load(sci->pof_name, true);
838 }
#define __UNUSED
Definition: clang.h:23
void shockwave_level_close()
Definition: shockwave.cpp:672
#define OF_INVULNERABLE
Definition: object.h:107
int i
Definition: multi_pxo.cpp:466
int model_id
Definition: shockwave.h:69
float p
Definition: pstypes.h:111
shockwave Shockwaves[MAX_SHOCKWAVES]
Definition: shockwave.cpp:34
weapon Weapons[MAX_WEAPONS]
Definition: weapons.cpp:78
SCP_vector< ArmorType > Armor_types
Definition: ship.cpp:170
#define TMAP_FLAG_SOFT_QUAD
Definition: tmapper.h:79
#define MR_NO_CULL
Definition: model.h:879
int damage_type_idx
Definition: shockwave.h:59
#define MR_NORMAL
Definition: model.h:858
int shockwave_get_weapon_index(int index)
Definition: shockwave.cpp:741
#define MISSION_FLAG_FULLNEB
Definition: missionparse.h:70
int shockwave_info_index
Definition: shockwave.h:63
int weapon_area_calc_damage(object *objp, vec3d *pos, float inner_rad, float outer_rad, float max_blast, float max_damage, float *blast, float *damage, float limit)
Definition: weapons.cpp:6025
int Show_area_effect
Definition: fredstubs.cpp:111
weapon_info Weapon_info[MAX_WEAPON_TYPES]
Definition: weapons.cpp:79
SCP_vector< game_snd > Snds
Definition: gamesnd.cpp:19
GLuint index
Definition: Glext.h:5608
matrix * vm_angles_2_matrix(matrix *m, const angles *a)
Definition: vecmat.cpp:752
void shockwave_render_all()
Definition: shockwave.cpp:725
ubyte g3_transfer_vertex(vertex *dest, const vec3d *src)
Definition: 3dmath.cpp:84
Assert(pm!=NULL)
int num_objs_hit
Definition: shockwave.h:54
#define WIF2_TAKES_SHOCKWAVE_DAMAGE
Definition: weapon.h:111
Definition: pstypes.h:88
#define mprintf(args)
Definition: pstypes.h:238
void shockwave_delete(object *objp)
Definition: shockwave.cpp:159
float total_time
Definition: shockwave.h:66
float damage
Definition: shockwave.h:57
#define OBJ_ASTEROID
Definition: object.h:44
#define OF_RENDERS
Definition: object.h:103
int shockwave_create(int parent_objnum, vec3d *pos, shockwave_create_info *sci, int flag, int delay)
Definition: shockwave.cpp:64
void shockwave_create_info_load(shockwave_create_info *sci)
Definition: shockwave.cpp:825
#define MR_DEPRECATED_CENTER_ALPHA
Definition: model.h:917
char name[MAX_FILENAME_LEN]
Definition: shockwave.h:74
int shockwave_load(char *s_name, bool shock_3D)
Definition: shockwave.cpp:538
void set_flags(uint flags)
#define MR_NO_LIGHTING
Definition: model.h:867
int shockwave_get_damage_type_idx(int index)
Definition: shockwave.cpp:777
struct vec3d::@225::@227 xyz
#define TMAP_HTL_3D_UNLIT
Definition: tmapper.h:63
GLclampf f
Definition: Glext.h:7097
void shockwave_level_init()
Definition: shockwave.cpp:595
object obj_used_list
Definition: object.cpp:53
void set_detail_level_lock(int detail_level_lock)
float inner_radius
Definition: shockwave.h:57
hull_check orient
Definition: lua.cpp:5049
int batch_add_bitmap_rotated(int texture, int tmap_flags, vertex *pnt, float angle, float rad, float alpha, float depth)
Definition: grbatch.cpp:793
object * objp
Definition: lua.cpp:3105
GLenum GLenum GLenum GLenum GLenum scale
Definition: Glext.h:8503
#define Int3()
Definition: pstypes.h:292
void shockwave_move(object *shockwave_objp, float frametime)
Definition: shockwave.cpp:256
#define TMAP_FLAG_DISTORTION
Definition: tmapper.h:85
char pof_name[MAX_FILENAME_LEN]
Definition: shockwave.h:75
int bm_release(int handle, int clear_render_targets)
Frees both a bitmap's data and it's associated slot.
Definition: bmpman.cpp:2603
int signature
Definition: object.h:145
GLenum type
Definition: Gl.h:1492
int objnum
Definition: shockwave.h:53
int bm_load_animation(const char *real_filename, int *nframes, int *fps, int *keyframe, int can_drop_frames, int dir_type)
Loads a bitmap sequance so we can draw with it.
Definition: bmpman.cpp:1420
int weapon_info_index
Definition: weapon.h:164
int distortion_add_bitmap_rotated(int texture, int tmap_flags, vertex *pnt, float angle, float rad, float alpha, float depth)
Definition: grbatch.cpp:1175
shockwave * next
Definition: shockwave.h:51
void shockwave_render_DEPRECATED(object *objp)
Definition: shockwave.cpp:388
void model_render_queue(model_render_params *interp, draw_list *scene, int model_num, matrix *orient, vec3d *pos)
typedef int(SCP_EXT_CALLCONV *SCPDLL_PFVERSION)(SCPDLL_Version *)
int instance
Definition: object.h:150
#define MR_DEPRECATED_NO_CULL
Definition: model.h:913
int weapon_hitpoints
Definition: weapon.h:530
void shockwave_move_all(float frametime)
Definition: shockwave.cpp:709
#define SIF_NAVBUOY
Definition: ship.h:891
int armor_type_idx
Definition: weapon.h:522
#define WIF2_CIWS
Definition: weapon.h:114
float radius
Definition: shockwave.h:56
float speed
Definition: shockwave.h:56
float time_elapsed
Definition: shockwave.h:65
int Cmdline_nohtl
Definition: cmdline.cpp:438
int cf_exists_full(const char *filename, int dir_type)
Definition: cfile.cpp:527
int obj_create(ubyte type, int parent_obj, int instance, matrix *orient, vec3d *pos, float radius, uint flags)
Definition: object.cpp:467
char * filename
#define OBJ_WEAPON
Definition: object.h:33
void shockwave_set_framenum(int index)
Definition: shockwave.cpp:188
int ship_get_SIF(ship *shipp)
Definition: ship.cpp:16096
float hull_strength
Definition: object.h:160
int Shockwave_inited
Definition: shockwave.cpp:36
int parent
Definition: object.h:147
bool Cmdline_fb_explosions
Definition: cmdline.cpp:340
shockwave impact
Definition: gamesnd.h:178
ubyte g3_rotate_vertex(vertex *dest, const vec3d *src)
Definition: 3dmath.cpp:97
float outer_radius
Definition: shockwave.h:57
int snd_play(game_snd *gs, float pan, float vol_scale, int priority, bool is_voice_msg)
Definition: sound.cpp:517
angles rot_angles
Definition: shockwave.h:68
int flags
Definition: shockwave.h:52
#define SW_USED
Definition: shockwave.h:21
int obj_sig_hitlist[SW_MAX_OBJS_HIT]
Definition: shockwave.h:55
int wi_flags3
Definition: weapon.h:386
int model_load(char *filename, int n_subsystems, model_subsystem *subsystems, int ferror=1, int duplicate=0)
Definition: modelread.cpp:2573
float shockwave_get_max_radius(int index)
Definition: shockwave.cpp:750
void model_page_in_textures(int modelnum, int ship_info_index=-1)
int idx
Definition: multiui.cpp:761
void ship_apply_global_damage(object *ship_objp, object *other_obj, vec3d *force_center, float damage)
Definition: shiphit.cpp:2476
void shockwave_render(object *objp, draw_list *scene)
Definition: shockwave.cpp:462
object Objects[MAX_OBJECTS]
Definition: object.cpp:62
float blast
Definition: shockwave.h:61
int current_bitmap
Definition: shockwave.h:64
void shockwave_page_in()
Definition: shockwave.cpp:792
matrix orient
Definition: object.h:153
int wi_flags2
Definition: weapon.h:385
#define OBJ_SHIP
Definition: object.h:32
void model_page_out_textures(int model_num, bool release=false)
void _cdecl void void _cdecl Error(const char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
GLbitfield flags
Definition: Glext.h:6722
vec3d Eye_position
Definition: 3dsetup.cpp:27
int shockwave_get_flags(int index)
Definition: shockwave.cpp:786
__inline void gr_fog_set(int fog_mode, int r, int g, int b, float fog_near=-1.0f, float fog_far=-1.0f)
Definition: 2d.h:833
int shockwave_get_framenum(int index, int num_frames)
Definition: shockwave.cpp:222
void weapon_do_electronics_effect(object *ship_objp, vec3d *blast_pos, int wi_index)
Definition: weapons.cpp:5934
void shockwave_create_info_init(shockwave_create_info *sci)
Definition: shockwave.cpp:811
#define MR_DEPRECATED_NORMAL
Definition: model.h:892
shockwave Shockwave_list
Definition: shockwave.cpp:35
#define MR_CENTER_ALPHA
Definition: model.h:883
float vm_vec_dist_quick(const vec3d *v0, const vec3d *v1)
Definition: vecmat.cpp:417
void model_render_DEPRECATED(int model_num, matrix *orient, vec3d *pos, uint flags=MR_DEPRECATED_NORMAL, int objnum=-1, int lighting_skip=-1, int *replacement_textures=NULL, int render=MODEL_RENDER_ALL, const bool is_skybox=false)
#define fl2i(fl)
Definition: floating.h:33
void bm_page_in_texture(int bitmapnum, int nframes)
Marks a texture as being used for this level.
Definition: bmpman.cpp:2462
int weapon_info_index
Definition: shockwave.h:58
vec3d pos
Definition: shockwave.h:60
#define OBJ_SHOCKWAVE
Definition: object.h:41
float shockwave_get_min_radius(int index)
Definition: shockwave.cpp:759
void set_warp_params(int bitmap, float alpha, vec3d &scale)
#define MAX_SHOCKWAVES
Definition: shockwave.h:26
SCP_vector< shockwave_info > Shockwave_info
Definition: shockwave.cpp:32
GLfloat GLfloat p
Definition: Glext.h:8373
#define LOCATION
Definition: pstypes.h:245
int delay_stamp
Definition: shockwave.h:67
#define TMAP_FLAG_TEXTURED
Definition: tmapper.h:36
#define timestamp_elapsed(stamp)
Definition: timer.h:102
void shockwave_delete_all()
Definition: shockwave.cpp:172
#define OF_SHOULD_BE_DEAD
Definition: object.h:106
hull_check pos
Definition: lua.cpp:5050
#define VALID_FNAME(x)
Definition: pstypes.h:418
void asteroid_hit(object *pasteroid_obj, object *other_obj, vec3d *hitpos, float damage)
Definition: asteroid.cpp:1368
void weapon_area_apply_blast(vec3d *force_apply_pos, object *ship_objp, vec3d *blast_pos, float blast, int make_shockwave)
Definition: weapons.cpp:6080
object * Player_obj
Definition: object.cpp:56
float shockwave_get_damage(int index)
Definition: shockwave.cpp:768
#define MAX(a, b)
Definition: pstypes.h:299
#define MR_DEPRECATED_NO_LIGHTING
Definition: model.h:901
int bm_unload(int handle, int clear_render_targets, bool nodebug)
Unloads a bitmap's data, but not the bitmap info.
Definition: bmpman.cpp:2890
void model_set_warp_globals(float scale_x=1.0f, float scale_y=1.0f, float scale_z=1.0f, int bitmap_id=-1, float alpha=-1.0f)
uint flags
Definition: object.h:151
mission The_mission
#define MR_NO_BATCH
Definition: model.h:881
#define WF_DESTROYED_BY_WEAPON
Definition: weapon.h:143
float h
Definition: pstypes.h:111
void set_object_number(int num)
char type
Definition: object.h:146
float damage
Definition: weapon.h:363
int Cmdline_enable_3d_shockwave
Definition: cmdline.cpp:333
#define SW_MAX_OBJS_HIT
Definition: shockwave.h:27
char filename[MAX_FILENAME_LEN]
Definition: shockwave.h:35
#define MR_NO_FOGGING
Definition: model.h:884
#define stricmp(s1, s2)
Definition: config.h:271
matrix vmd_identity_matrix
Definition: vecmat.cpp:28
#define CF_TYPE_MODELS
Definition: cfile.h:49
#define WIF3_AOE_ELECTRONICS
Definition: weapon.h:124
#define MR_DEPRECATED_NO_FOGGING
Definition: model.h:918
void model_set_detail_level(int n)
float b
Definition: pstypes.h:111
void model_unload(int modelnum, int force=0)
Definition: modelread.cpp:162
#define fl_radians(fl)
Definition: floating.h:42
#define GR_FOGMODE_NONE
Definition: 2d.h:355
#define strcpy_s(...)
Definition: safe_strings.h:67