33 #define MAX_LIFE 10.0f
34 #define MIN_RADIUS_FOR_PERSISTANT_DEBRIS 50 // ship radius at which debris from it becomes persistant
35 #define DEBRIS_SOUND_DELAY 2000 // time to start debris sound after created
36 #define MAX_HULL_PIECES MAX_DEBRIS_PIECES // limit the number of hull debris chunks that can exist.
50 #define MAX_DEBRIS_DIST 10000.0f // Debris goes away if it's this far away.
51 #define DEBRIS_DISTANCE_CHECK_TIME (10*1000) // Check every 10 seconds.
52 #define DEBRIS_INDEX(dp) (dp-Debris)
54 #define MAX_SPEED_SMALL_DEBRIS 200 // maximum velocity of small debris piece
55 #define MAX_SPEED_BIG_DEBRIS 150 // maximum velocity of big debris piece
56 #define MAX_SPEED_CAPITAL_DEBRIS 100 // maximum velocity of capital debris piece
61 static void debris_start_death_roll(
object *debris_obj,
debris *debris_p)
69 if(fireball_type < 0) {
200 if (tbase != NULL && (swapped!=-1) && pm) {
290 Assert( Debris[num].objnum == objnum );
308 debris_start_death_roll(obj, db);
326 int n, n_arcs = ((rand()>>5) % 3)+1;
340 int a = 100,
b = 1000;
341 int lifetime = (
myrand()%((
b)-(a)+1))+(
a);
382 if ( lifetime > 750 ) {
385 }
else if ( lifetime > 500 ) {
388 }
else if ( lifetime > 250 ) {
391 }
else if ( lifetime > 100 ) {
409 if ( mr < RAND_MAX/5 ) {
436 oldest_time = 0x7fffffff;
448 #define DEBRIS_ROTVEL_SCALE 5.0f
464 int i,
n, objnum, parent_objnum;
487 if ( dist > 200.0
f ) {
496 debris_start_death_roll(&
Objects[Debris[n].objnum], &Debris[n] );
505 if (n == MAX_DEBRIS_PIECES) {
509 debris_start_death_roll(&
Objects[Debris[n].objnum], &Debris[n]);
511 nprintf((
"Warning",
"Frame %i: Could not create debris, no more slots left\n",
Framecount));
528 if (rand() < RAND_MAX/6)
591 if ( model_num < 0 ) {
607 pos = &source_obj->
pos;
613 if ( objnum == -1 ) {
614 mprintf((
"Couldn't create debris object -- out of object slots\n"));
656 vec3d rotvel, radial_vel, to_center;
705 vec3d world_rotvel, vel_from_rotvel;
707 vm_vec_cross ( &vel_from_rotvel, &world_rotvel, &to_center );
787 if ( damage < 0.0
f ) {
794 debris_start_death_roll(debris_obj, debris_p );
822 if ( debris_hit_info == NULL ) {
832 mc.
p1 = &other_obj->
pos;
847 object *pship_obj = other_obj;
850 object *heavy = debris_hit_info->
heavy;
851 object *lighter = debris_hit_info->
light;
852 object *heavy_obj = heavy;
853 object *light_obj = lighter;
865 vec3d p0_temp, p0_rotated;
884 if ( debris_hit_info->
heavy == pship_obj ) {
892 int copy_flags = mc.
flags;
893 vec3d copy_p0, copy_p1;
906 debris_hit_info->
hit_time = FLT_MAX;
919 for (smv = submodel_vector.begin(); smv != submodel_vector.end(); ++smv) {
931 for (smv = submodel_vector.begin(); smv != submodel_vector.end(); ++smv) {
960 if (debris_hit_info->
edge_hit == 0) {
965 vec3d int_light_pos, diff;
977 mc.
flags = copy_flags;
991 if (debris_hit_info->
edge_hit == 0) {
1022 if ( !debris_hit_info->
edge_hit ) {
1077 float dx, dy, dz, mass;
1078 dx = maxs->
xyz.x - mins->
xyz.x;
1079 dy = maxs->
xyz.y - mins->
xyz.y;
1080 dz = maxs->
xyz.z - mins->
xyz.z;
1083 mass = 0.12f * dx * dy * dz;
1084 pi->
mass = (
float) pow(mass, 0.6666667
f) * 4.65f;
1101 int i,
num, swapped;
1150 if (tbase != NULL && (swapped!=-1) && pm) {
void calc_debris_physics_properties(physics_info *pi, vec3d *min, vec3d *max)
void mc_info_init(mc_info *mc)
float submodel_get_radius(int modelnum, int submodelnum)
int model_collide(mc_info *mc_info_obj)
void radar_plot_object(object *objp)
int timestamp(int delta_ms)
#define MULTIPLAYER_CLIENT
weapon Weapons[MAX_WEAPONS]
0.75 second spark sound effect
int Cmdline_old_collision_sys
int debris_get_team(object *objp)
void vm_vec_scale_add(vec3d *dest, const vec3d *src1, const vec3d *src2, float k)
float debris_min_lifetime
polymodel * model_get(int model_num)
0.50 second spark sound effect
SCP_vector< game_snd > Snds
#define FIREBALL_LARGE_EXPLOSION
#define DEBRIS_ROTVEL_SCALE
ushort multi_get_next_network_signature(int what_kind)
void debris_render_DEPRECATED(object *obj)
void model_get_rotating_submodel_list(SCP_vector< int > *submodel_vector, object *objp)
void _cdecl void void _cdecl void _cdecl Warning(char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
#define SUBMODEL_NO_ROT_HIT
float side_slip_time_const
#define list_append(head, elem)
vec3d arc_pts[MAX_DEBRIS_ARCS][2]
void set_flags(uint flags)
struct vec3d::@225::@227 xyz
float model_get_core_radius(int modelnum)
vec3d * vm_vec_rotate(vec3d *dest, const vec3d *src, const matrix *m)
#define END_OF_LIST(head)
void model_add_arc(int model_num, int sub_model_num, vec3d *v1, vec3d *v2, int arc_type)
#define FIREBALL_EXPLOSION_LARGE1
float debris_max_hitpoints
GLenum GLenum GLenum GLenum GLenum scale
GLfloat GLfloat GLfloat v2
#define MAX_DEBRIS_PIECES
float vm_vec_mag_squared(const vec3d *v)
void particle_emit(particle_emitter *pe, int type, int optional_data, float range)
void debris_process_post(object *obj, float frame_time)
int obj_snd_assign(int objnum, int sndnum, vec3d *pos, int main, int flags, ship_subsys *associated_sub)
void submodel_render_DEPRECATED(int model_num, int submodel_num, matrix *orient, vec3d *pos, uint flags=MR_DEPRECATED_NORMAL, int objnum=-1, int *replacement_textures=NULL, int render=MODEL_RENDER_ALL)
0.10 second spark sound effect
void debris_hit(object *debris_obj, object *other_obj, vec3d *hitpos, float damage)
void shipfx_debris_limit_speed(debris *db, ship *shipp)
vec3d heavy_collision_cm_pos
void model_instance_find_world_point(vec3d *outpnt, vec3d *mpnt, int model_instance_num, int submodel_num, const matrix *objorient, const vec3d *objpos)
void vm_vec_add2(vec3d *dest, const vec3d *src)
struct matrix::@228::@230 vec
float ship_max_hull_strength
void vm_vec_scale(vec3d *dest, float s)
#define DEBRIS_DISTANCE_CHECK_TIME
GLboolean GLboolean GLboolean GLboolean a
int fireball_ship_explosion_type(ship_info *sip)
int obj_create(ubyte type, int parent_obj, int instance, matrix *orient, vec3d *pos, float radius, uint flags)
void model_clear_instance(int model_num)
int snd_play_3d(game_snd *gs, vec3d *source_pos, vec3d *listen_pos, float radius, vec3d *source_vel, int looping, float vol_scale, int priority, vec3d *sound_fvec, float range_factor, int force, bool is_ambient)
texture_map maps[MAX_MODEL_TEXTURES]
void world_find_model_instance_point(vec3d *out, vec3d *world_pt, const polymodel_instance *pmi, int submodel_num, const matrix *orient, const vec3d *pos)
void submodel_render_queue(model_render_params *render_info, draw_list *scene, int model_num, int submodel_num, matrix *orient, vec3d *pos)
void debris_clear_expired_flag(debris *db)
submodel_instance * submodel
#define MIN_RADIUS_FOR_PERSISTANT_DEBRIS
float debris_max_lifetime
generic_bitmap debris_texture
#define MONITOR(function_name)
int model_load(char *filename, int n_subsystems, model_subsystem *subsystems, int ferror=1, int duplicate=0)
float vm_vec_normalize_safe(vec3d *v)
debris Debris[MAX_DEBRIS_PIECES]
#define MC_CHECK_SPHERELINE
void model_instance_find_obj_dir(vec3d *w_vec, vec3d *m_vec, int model_instance_num, int submodel_num, matrix *objorient)
vec3d * vm_vec_unrotate(vec3d *dest, const vec3d *src, const matrix *m)
#define DEBRIS_SOUND_DELAY
void maybe_delete_debris(debris *db)
#define MC_SUBMODEL_INSTANCE
object Objects[MAX_OBJECTS]
void submodel_get_two_random_points(int model_num, int submodel_num, vec3d *v1, vec3d *v2, vec3d *n1=NULL, vec3d *n2=NULL)
#define MONITOR_INC(function_name, inc)
#define DEBRIS_UPDATE_NUKE
void send_debris_update_packet(object *objp, int code)
#define FIREBALL_NUM_LARGE_EXPLOSIONS
void vm_vec_copy_scale(vec3d *dest, const vec3d *src, float s)
void set_hit_struct_info(collision_info_struct *hit, mc_info *mc, int submodel_rot_hit)
void vm_vec_rand_vec_quick(vec3d *rvec)
int SetTexture(int n_tex)
void vm_vec_sub(vec3d *dest, const vec3d *src0, const vec3d *src1)
int check_rotvel_limit(physics_info *pi)
int bm_load(const char *real_filename)
Loads a bitmap so we can draw with it later.
GLboolean GLboolean GLboolean b
typedef float(SCP_EXT_CALLCONV *SCPTRACKIR_PFFLOATVOID)()
polymodel_instance * model_get_instance(int model_instance_num)
float vm_vec_dist_quick(const vec3d *v0, const vec3d *v1)
float frand()
Return random value in range 0.0..1.0- (1.0- means the closest number less than 1.0)
void submodel_get_two_random_points_better(int model_num, int submodel_num, vec3d *v1, vec3d *v2)
0.25 second spark sound effect
void bm_page_in_texture(int bitmapnum, int nframes)
Marks a texture as being used for this level.
void debris_render(object *obj, draw_list *scene)
int debris_check_collision(object *pdebris, object *other_obj, vec3d *hitpos, collision_info_struct *debris_hit_info)
float vm_vec_copy_normalize(vec3d *dest, const vec3d *src)
#define MULTIPLAYER_MASTER
int arc_timestamp[MAX_DEBRIS_ARCS]
texture_info textures[TM_NUM_TYPES]
SCP_vector< ship_info > Ship_info
char species_name[NAME_LENGTH]
#define timestamp_elapsed(stamp)
float debris_min_hitpoints
SCP_vector< species_info > Species_info
1.00 second spark sound effect
#define OF_SHOULD_BE_DEAD
#define DEBRIS_UPDATE_UPDATE
#define list_remove(head, elem)
debris sound (persistant, looping)
GLsizei GLsizei GLuint * obj
void debris_delete(object *obj)
#define timestamp_rand(a, b)
object * debris_create(object *source_obj, int model_num, int submodel_num, vec3d *pos, vec3d *exp_center, int hull_flag, float exp_force)
char filename[MAX_FILENAME_LEN]
vec3d * vm_vec_cross(vec3d *dest, const vec3d *src0, const vec3d *src1)
void vm_vec_add(vec3d *dest, const vec3d *src0, const vec3d *src1)
matrix vmd_identity_matrix
#define timestamp_valid(stamp)
int Debris_vaporize_model
vec3d light_collision_cm_pos
int debris_damage_type_idx
GLfloat GLfloat GLfloat GLfloat v3
float vm_vec_normalize(vec3d *v)
int fireball_create(vec3d *pos, int fireball_type, int render_type, int parent_obj, float size, int reverse, vec3d *velocity, float warp_lifetime, int ship_class, matrix *orient_override, int low_res, int extra_flags, int warp_open_sound, int warp_close_sound)