Files
wookieejedi 1c45a18d9b Add Option to allow weapons that hit player to place per-weapon sound (#4921)
* Add Option to allow weapons that hit player to place per-weapon sound

Weapons that lasers or missiles that hit the player also play a hard coded sound, which is not ideal when trying to give valuable audio feedback to player.

This PR allows modders to stop the behavior and have the weapon class impact sound specified in the weapons table play instead of the hard coded sounds.

Tested and works as expected.

* add per class shockwave and weapon sounds

* naming update
2022-11-24 17:03:05 +00:00

114 lines
3.2 KiB
C++

/*
* Copyright (C) Volition, Inc. 1999. All rights reserved.
*
* All source code herein is the property of Volition, Inc. You may not sell
* or otherwise commercially exploit the source or things you created based on the
* source.
*
*/
#ifndef __SHOCKWAVE_H__
#define __SHOCKWAVE_H__
#include "globalincs/globals.h"
#include "globalincs/pstypes.h"
#include "gamesnd/gamesnd.h"
class object;
class model_draw_list;
#define SW_USED (1<<0)
#define SW_WEAPON (1<<1)
#define SW_SHIP_DEATH (1<<2)
#define SW_WEAPON_KILL (1<<3) // Shockwave created when weapon destroyed by another
#define MAX_SHOCKWAVES 16
// -----------------------------------------------------------
// Data structures
// -----------------------------------------------------------
typedef struct shockwave_info
{
char filename[MAX_FILENAME_LEN];
int bitmap_id;
int model_id;
int num_frames;
int fps;
shockwave_info()
: num_frames( 0 ), fps( 0 )
{
filename[ 0 ] = '\0';
bitmap_id = -1;
model_id = -1;
}
} shockwave_info;
typedef struct shockwave {
shockwave *next, *prev;
int flags;
int objnum; // index into Objects[] for shockwave
SCP_vector<std::pair<int, int>> obj_sig_hitlist;
float speed, radius;
float inner_radius, outer_radius, damage;
int weapon_info_index; // -1 if shockwave not caused by weapon
int damage_type_idx; //What type of damage this shockwave does to armor
vec3d pos;
float blast; // amount of blast to apply
int next_blast; // timestamp for when to apply next blast damage
int shockwave_info_index;
int current_bitmap;
float time_elapsed; // in seconds
float total_time; // total lifetime of animation in seconds
int delay_stamp; // for delayed shockwaves
angles rot_angles;
int model_id;
gamesnd_id blast_sound_id;
} shockwave;
typedef struct shockwave_create_info {
char name[MAX_FILENAME_LEN];
char pof_name[MAX_FILENAME_LEN];
float inner_rad;
float outer_rad;
float damage;
float blast;
float speed;
angles rot_angles;
bool rot_defined; // if the modder specified rot_angles
bool damage_overidden; // did this have shockwave damage specifically set or not
int damage_type_idx;
int damage_type_idx_sav; // stored value from table used to reset damage_type_idx
gamesnd_id blast_sound_id; // allow setting unique sounds for a ship or weapon shockwave --wookieejedi
} shockwave_create_info;
extern void shockwave_create_info_init(shockwave_create_info *sci);
extern void shockwave_create_info_load(shockwave_create_info *sci);
void shockwave_level_init();
void shockwave_level_close();
void shockwave_delete(object *objp);
void shockwave_move_all(float frametime);
int shockwave_create(int parent_objnum, vec3d *pos, shockwave_create_info *sci, int flag, int delay = -1);
void shockwave_render(object *objp, model_draw_list *scene);
int shockwave_load(const char *s_name, bool shock_3D = false);
int shockwave_get_weapon_index(int index);
float shockwave_get_min_radius(int index);
float shockwave_get_max_radius(int index);
float shockwave_get_damage(int index);
int shockwave_get_damage_type_idx(int index);
int shockwave_get_framenum(const int index, const int ani_id);
int shockwave_get_flags(int index);
#endif /* __SHOCKWAVE_H__ */