63 #define MAX_SPARK_PAIRS ((MAX_SHIP_HITS * MAX_SHIP_HITS - MAX_SHIP_HITS) / 2)
65 #define BIG_SHIP_MIN_RADIUS 80.0f // ship radius above which death rolls can't be shortened by excessive damage
70 static bool global_damage =
false;
114 int type,
i, log_index;
127 if (objp->
radius > 100.0f) {
136 vec3d temp_vec, center_to_subsys, rand_vec;
138 for (i=0; i<num_fireballs; i++) {
144 temp_vec = g_subobj_pos;
149 float dot =
vm_vec_dot(¢er_to_subsys, &rand_vec);
155 float fireball_rad = psub->
radius * 0.2f;
156 if (fireball_rad < 10) {
157 fireball_rad = 10.0f;
165 if(fireball_type < 0) {
222 Assert( i < sip->n_subsystems );
224 log_index = ((ship_p->
ship_info_index << 16) & 0xffff0000) | (i & 0xffff);
243 for (i = 0; r_name[
i] > 0; i++) {
244 if (r_name[i] ==
'|')
247 HUD_printf(
XSTR(
"Your %s subsystem has been destroyed", 499), r_name );
279 if (notify && !no_explosion) {
287 if ( sound_index >= 0 ) {
322 int weapon_info_index = -1;
324 if ( damaging_objp ) {
325 switch(damaging_objp->
type) {
338 weapon_info_index = -1;
343 return weapon_info_index;
365 #define MAX_DEBRIS_SHARDS 16 // cap the amount of debris shards that fly off per hit
371 float show_debris =
frand();
373 if ( show_debris <= 0.75
f ) {
382 for (
int i=0;
i<ndebris;
i++ ) {
391 float show_debris =
frand();
400 for (
int i=0;
i<ndebris;
i++ ) {
405 #define MAX_SUBSYS_LIST 200 //DTP MAX SUBSYS LIST BUMPED FROM 32 to 200, ahmm 32???
450 float damage_left, damage_if_hull;
451 int weapon_info_index;
455 int subsys_hit_first = -1;
457 float ss_dif_scale = 1.0f;
460 if(hull_should_apply_armor != NULL) {
461 *hull_should_apply_armor =
true;
485 damage_if_hull = damage_left;
487 hitpos2 = other_obj->
pos;
489 damage_left = damage;
490 damage_if_hull = damage;
496 if ((weapon_info_index >= 0) && ((other_obj->
type ==
OBJ_WEAPON) ||
508 if ( hitpos_dist > ship_objp->
radius * 2.0f ) {
509 mprintf((
"BOGUS HITPOS PASSED TO DO_SUBOBJ_HIT_STUFF (%.1f > %.1f)!\nInvestigate ship %s (%s), a hit was registered on this ship outside this ship's radius.\n", hitpos_dist, ship_objp->
radius * 2.0f, ship_p->
ship_name,
Ship_info[ship_p->
ship_info_index].name ));
514 if (!global_damage) {
572 subsys_hit_first =
count;
595 int dmg_type_idx = -1;
596 int parent_armor_flags = 0;
622 for (j=0; j<
count; j++)
630 min_index = subsys_hit_first;
632 subsys_hit_first = -1;
634 float min_dist = 9999999.9f;
636 for (i=0; i<
count; i++) {
637 if (subsys_list[i].dist < min_dist) {
638 min_dist = subsys_list[
i].
dist;
646 float damage_to_apply = 0.0f;
647 subsystem = subsys_list[min_index].
ptr;
648 range = subsys_list[min_index].
range;
649 dist = subsys_list[min_index].
dist;
650 subsys_list[min_index].
dist = 9999999.9f;
659 if(hull_should_apply_armor) {
660 *hull_should_apply_armor =
false;
670 if ((weapon_info_index >= 0) && (dist < 10.0
f) && ((other_obj) && (other_obj->
type ==
OBJ_SHOCKWAVE))) {
675 if ( dist < range/2.0
f ) {
677 damage_to_apply = damage_if_hull;
679 damage_to_apply = damage_left;
680 }
else if ( dist < range ) {
682 damage_to_apply = damage_if_hull * (1.0f - dist/
range);
684 damage_to_apply = damage_left * (1.0f - dist/
range);
699 if ( (subsystem->
current_hits - (damage_to_apply * ss_dif_scale)) < min_subsys_strength ) {
701 damage_to_apply = subsystem->
current_hits - min_subsys_strength;
704 damage_to_apply =
MAX(0, damage_to_apply);
710 damage_left -= (damage_to_apply * ss_dif_scale);
715 float subsystem_factor = 0.0f;
723 if (subsystem_factor > 0.0
f) {
724 damage -= ((
MIN(subsystem->
current_hits, (damage_to_apply * ss_dif_scale))) / subsystem_factor);
726 damage -=
MIN(subsystem->
current_hits, (damage_to_apply * ss_dif_scale));
736 damage_to_apply *= ss_dif_scale;
761 if (damage_left <= 0) {
782 switch (killer_objp->
type) {
806 nprintf((
"Network",
"Couldn't find player object of weapon for killer of %s\n", p->
callsign));
830 nprintf((
"Network",
"Couldn't find player object of shockwave for killer of %s\n", p->
callsign));
852 if ( (
Game_mode & GM_MULTIPLAYER) && (killer_objp->
flags & OF_PLAYER_SHIP) ) {
859 nprintf((
"Network",
"Couldn't find player object for killer of %s\n", p->
callsign));
885 if((Objects[beam_obj].
type ==
OBJ_SHIP) && (Objects[beam_obj].instance >= 0)){
921 if(other_obj == NULL){
991 int attackee_team, attacker_team;
996 attacker_team = attackee_team;
998 switch ( other_obj->
type )
1013 attacker_team = Ships[parent->
instance].team;
1070 if (hull_percent > 0.8
f) {
1072 }
else if (hull_percent > 0.3
f) {
1078 int num_sparks = (
int) (ship_objp->
radius * 0.08f);
1079 if (num_sparks < 3) {
1102 int i, j,
count, num_sparks, num_spark_pairs, spark_num;
1115 num_spark_pairs = (num_sparks * num_sparks - num_sparks) / 2;
1118 for (spark_num=0; spark_num<num_sparks; spark_num++) {
1129 for (i=0; i<num_sparks; i++) {
1138 return (rand() % num_sparks);
1142 for (i=0; i<num_spark_pairs; i++) {
1145 spark_pairs[
i].
dist = FLT_MAX;
1150 for (i=1; i<num_sparks; i++) {
1151 for (j=0; j<
i; j++) {
1157 Assert(count == num_spark_pairs);
1164 int index1 = spark_pairs[0].
index1;
1165 int index2 = spark_pairs[0].
index2;
1169 for (i=1; i<6; i++) {
1170 if (spark_pairs[i].index1 == index1) {
1173 if (spark_pairs[i].index2 == index1) {
1176 if (spark_pairs[i].index1 == index2) {
1179 if (spark_pairs[i].index2 == index2) {
1185 if (count1 > count2) {
1205 if (n >= max_sparks) {
1211 n = rand() % max_sparks;
1217 bool instancing =
false;
1219 if (submodel_num != -1) {
1221 if (pm->
detail[0] != submodel_num) {
1230 vec3d temp_zero, temp_x, temp_y, temp_z;
1270 nprintf((
"Network",
"starting my player death\n"));
1279 object *other_objp = NULL;
1284 if ( killer_objp ) {
1285 switch (killer_objp->
type) {
1294 other_objp = killer_objp;
1298 int beam_obj_parent;
1300 if(beam_obj_parent == -1){
1301 other_objp = killer_objp;
1303 other_objp = &
Objects[beam_obj_parent];
1309 other_objp = killer_objp;
1320 vec3d vec_from_killer;
1324 Assert(other_objp != NULL);
1353 #define MIN_PLAYER_DEATHROLL_TIME 1000 // at least one second deathroll for a player
1354 #define DEATHROLL_ROTVEL_CAP 6.3f // maximum added deathroll rotvel in rad/sec (about 1 rev / sec)
1355 #define DEATHROLL_ROTVEL_MIN 0.8f // minimum added deathroll rotvel in rad/sec (about 1 rev / 12 sec)
1356 #define DEATHROLL_MASS_STANDARD 50 // approximate mass of lightest ship
1357 #define DEATHROLL_VELOCITY_STANDARD 70 // deathroll rotvel is scaled according to ship velocity
1358 #define DEATHROLL_ROTVEL_SCALE 4 // constant determines how quickly deathroll rotvel is ramped up (smaller is faster)
1395 delta_time -= (
int) (1.01
f - 4*percent_killed);
1419 if (damage >= 250.0
f)
1420 delta_time += 3000 + (
int)(damage*4.0
f + 4.0
f*objp->
radius);
1427 delta_time = 7000 + (
int)(
frand() * 3000.0f);
1483 rotvel_mag += (
float) (p1 * velval/logval) * 0.75f;
1486 if (rotvel_mag*objp->
radius > 150) {
1487 rotvel_mag = 150.0f / objp->
radius;
1542 void ship_hit_kill(
object *ship_objp,
object *other_obj,
float percent_killed,
int self_destruct)
1547 if(other_obj != NULL)
1561 char *killer_ship_name;
1562 int killer_damage_percent = 0;
1563 int killer_index = -1;
1564 object *killer_objp = NULL;
1589 killer_ship_name = NULL;
1590 killer_damage_percent = -1;
1591 if ( killer_index >= 0 ) {
1621 char name1[256] =
"";
1622 char name2[256] =
"";
1634 if((killer_objp != NULL) || (killer_ship_name != NULL)){
1637 if(killer_objp == NULL){
1659 if ( (killer_damage_percent > 10) && (other_obj != NULL) ) {
1743 nprintf((
"Sandeep",
"Playing stupid joystick effect\n"));
1763 vec3d world_hit_pos, world_center_pos;
1773 vm_vec_sub(hit_pos, &world_hit_pos, &world_center_pos);
1789 float percent_killed;
1790 int delta_time, time_remaining;
1812 if (percent_killed > 1.0
f)
1813 percent_killed = 1.0f;
1825 delta_time = time_remaining - delta_time;
1844 float dist, nearest_dist = FLT_MAX;
1847 float inner_radius, outer_radius;
1866 shipp = &
Ships[ship_objp->instance];
1873 if (dist < nearest_dist) {
1874 nearest_dist = dist;
1889 if (nearest_dist > outer_radius) {
1890 *damage = max_damage / 4.0f;
1891 }
else if (nearest_dist < inner_radius) {
1892 *damage = max_damage;
1894 *damage = max_damage * (1.0f - 0.75f * (nearest_dist - inner_radius) / (outer_radius - inner_radius));
1918 static void ship_do_damage(
object *ship_objp,
object *other_obj,
vec3d *hitpos,
float damage,
int quadrant,
int submodel_num,
int wash_damage=0)
1923 float subsystem_damage = damage;
1924 int other_obj_is_weapon;
1925 int other_obj_is_beam;
1926 int other_obj_is_shockwave;
1927 int other_obj_is_asteroid;
1928 int other_obj_is_debris;
1929 int other_obj_is_ship;
1930 float difficulty_scale_factor = 1.0f;
1954 other_obj_is_weapon = 0;
1955 other_obj_is_beam = 0;
1956 other_obj_is_shockwave = 0;
1957 other_obj_is_asteroid = 0;
1958 other_obj_is_debris = 0;
1959 other_obj_is_ship = 0;
1963 if (other_obj_is_weapon || other_obj_is_shockwave) {
1968 if (other_obj_is_weapon)
1980 if ( other_obj_is_weapon ) {
2012 if (other_obj_is_weapon)
2038 float shield_factor = -1.0f;
2039 int weapon_info_index;
2042 if ( weapon_info_index >= 0 ) {
2046 if ( shield_factor >= 0.0
f ) {
2047 damage *= shield_factor;
2048 subsystem_damage *= shield_factor;
2051 if ( damage > 0.0
f ) {
2053 float piercing_pct = 0.0f;
2054 int dmg_type_idx = -1;
2057 if(other_obj_is_weapon) {
2059 }
else if(other_obj_is_beam) {
2061 }
else if(other_obj_is_shockwave) {
2063 }
else if(other_obj_is_asteroid) {
2065 }
else if(other_obj_is_debris) {
2067 }
else if(other_obj_is_ship) {
2076 float pre_shield = damage;
2077 float pre_shield_ss = subsystem_damage;
2079 if (piercing_pct > 0.0
f) {
2080 damage = pre_shield * (1.0f - piercing_pct);
2084 pre_shield *= difficulty_scale_factor;
2091 damage *= difficulty_scale_factor;
2096 if (damage > 0.0
f) {
2097 subsystem_damage *= (damage / pre_shield);
2099 subsystem_damage = 0.0f;
2102 if (piercing_pct > 0.0
f) {
2103 damage += (piercing_pct * pre_shield);
2104 subsystem_damage += (piercing_pct * pre_shield_ss);
2109 if ( shield_factor > 1.0
f ) {
2110 damage /= shield_factor;
2112 subsystem_damage /= shield_factor;
2117 if ( (damage > 0.0
f) || (subsystem_damage > 0.0f) ) {
2118 int weapon_info_index;
2119 float pre_subsys = subsystem_damage;
2120 bool apply_hull_armor =
true;
2121 bool apply_diff_scale =
true;
2123 subsystem_damage =
do_subobj_hit_stuff(ship_objp, other_obj, hitpos, submodel_num, subsystem_damage, &apply_hull_armor);
2125 if (subsystem_damage > 0.0
f) {
2126 damage *= (subsystem_damage / pre_subsys);
2132 if (apply_hull_armor)
2134 int dmg_type_idx = -1;
2135 if(other_obj_is_weapon) {
2137 }
else if(other_obj_is_beam) {
2139 }
else if(other_obj_is_shockwave) {
2141 }
else if(other_obj_is_asteroid) {
2143 }
else if(other_obj_is_debris) {
2145 }
else if(other_obj_is_ship) {
2152 apply_diff_scale =
false;
2156 if (apply_diff_scale) {
2157 damage *= difficulty_scale_factor;
2161 if (damage > 0.0
f) {
2163 if ( weapon_info_index >= 0 ) {
2174 if ( (ship_objp->
hull_strength - damage) < min_hull_strength ) {
2179 damage =
MAX(0, damage);
2188 if ( weapon_info_index >= 0 ) {
2212 switch (other_obj->
type)
2269 if ( (beam_weapon_info_index > -1) && (
Weapon_info[beam_weapon_info_index].wi_flags & (
WIF_HUGE)) ) {
2285 if (percent_killed > 1.0
f){
2286 percent_killed = 1.0f;
2297 if(other_obj_is_weapon)
2327 if (
Ships[ship_num].time_first_tagged == 0)
2337 else if (tag_level == 2)
2343 else if (tag_level == 3)
2351 ssm_create(target, start, ssm_index, NULL, ssm_team);
2366 bool create_sparks =
true;
2384 ai_ship_hit(ship_objp, other_obj, hitpos, quadrant, hit_normal);
2436 global_damage =
false;
2437 ship_do_damage(ship_objp, other_obj, hitpos, damage, quadrant, submodel_num );
2456 create_sparks =
false;
2460 if (create_sparks) {
2480 vec3d tmp, world_hitpos;
2481 global_damage =
true;
2483 if ( force_center ) {
2503 world_hitpos = *force_center;
2507 ship_do_damage(ship_objp, other_obj, &world_hitpos, damage, shield_quad, -1 );
2515 ship_do_damage(ship_objp, other_obj, &world_hitpos, damage/ship_objp->
n_quadrants,
i, -1);
2534 vec3d world_hitpos, direction_vec, rand_vec;
2545 global_damage =
true;
2546 ship_do_damage(ship_objp, other_obj, &world_hitpos, damage, -1, -1, 1);
void player_died_start(object *killer_objp)
float submodel_get_radius(int modelnum, int submodelnum)
void game_flash(float r, float g, float b)
int timestamp(int delta_ms)
#define MULTIPLAYER_CLIENT
ubyte pre_death_explosion_happened
model_subsystem * system_info
weapon Weapons[MAX_WEAPONS]
SCP_vector< ArmorType > Armor_types
void hud_gauge_popup_start(int gauge_index, int time)
Start a gauge to pop-up.
#define SIF2_NO_PAIN_FLASH
char * ship_subsys_get_name(ship_subsys *ss)
float vm_vec_mag_quick(const vec3d *v)
void mission_log_add_entry(int type, char *pname, char *sname, int info_index)
vec3d Original_vec_to_deader
int shockwave_get_weapon_index(int index)
void vm_vec_scale_add(vec3d *dest, const vec3d *src1, const vec3d *src2, float k)
void saturate_fabs(float *f, float max)
polymodel * model_get(int model_num)
#define PLAYER_FLAGS_KILLED_SELF_MISSILES
weapon_info Weapon_info[MAX_WEAPON_TYPES]
SCP_vector< game_snd > Snds
#define BIG_SHIP_MIN_RADIUS
submodel_instance_info submodel_info_1
#define LOG_SHIP_SUBSYS_DESTROYED
asteroid Asteroids[MAX_ASTEROIDS]
bool Beams_use_damage_factors
int get_quadrant(vec3d *hit_pnt, object *shipobjp)
int turret_gun_rotation_snd
#define MSS_FLAG2_COLLIDE_SUBMODEL
void ship_hit_pain(float damage, int quadrant)
float ship_max_shield_strength
float vm_vec_normalize_quick(vec3d *src)
void shiphit_record_player_killer(object *killer_objp, player *p)
captial ship subsystem destroyed
int detail[MAX_MODEL_DETAIL_LEVELS]
submodel_instance_info submodel_info_2
int choose_next_spark(object *ship_objp, vec3d *hitpos)
int beam_get_parent(object *bm)
float side_slip_time_const
int ship_stop_fire_primary(object *obj)
bool Damage_impacted_subsystem_first
#define SAF_IGNORE_SS_ARMOR
void obj_snd_delete_type(int objnum, int sndnum, ship_subsys *ss)
void ai_announce_ship_dying(object *dying_objp)
#define PLAYER_FLAGS_KILLED_BY_ENGINE_WASH
int subsys_guardian_threshold
int shockwave_get_damage_type_idx(int index)
struct vec3d::@225::@227 xyz
ai_info Ai_info[MAX_AI_INFO]
vec3d * vm_vec_rotate(vec3d *dest, const vec3d *src, const matrix *m)
int spark_compare(const spark_pair &pair1, const spark_pair &pair2)
#define END_OF_LIST(head)
model_subsystem * subsystems
#define PLAYER_FLAGS_KILLED_SELF_UNKNOWN
void ship_hit_create_sparks(object *ship_objp, vec3d *hitpos, int submodel_num)
ship_subsys * targeted_subsys
void vm_vec_scale_add2(vec3d *dest, const vec3d *src, float k)
float weapon_get_damage_scale(weapon_info *wip, object *wep, object *target)
#define MAX_DEBRIS_PIECES
int turret_base_rotation_snd
ship_subsys_info subsys_info[SUBSYSTEM_MAX]
void ship_apply_whack(vec3d *force, vec3d *hit_pos, object *objp)
int get_max_sparks(object *ship_objp)
float vm_vec_mag_squared(const vec3d *v)
char callsign[CALLSIGN_LEN+1]
script_state Script_system("FS2_Open Scripting")
int obj_snd_assign(int objnum, int sndnum, vec3d *pos, int main, int flags, ship_subsys *associated_sub)
#define DEATHROLL_ROTVEL_MIN
void ship_maybe_praise_player(ship *deader_sp)
float subsys_damage_scale[NUM_SKILL_LEVELS]
int object_is_docked(object *objp)
char alt_dmg_sub_name[NAME_LENGTH]
float Shield_pain_flash_factor
typedef int(SCP_EXT_CALLCONV *SCPDLL_PFVERSION)(SCPDLL_Version *)
void model_instance_find_world_point(vec3d *outpnt, vec3d *mpnt, int model_instance_num, int submodel_num, const matrix *objorient, const vec3d *objpos)
void ship_vaporize(ship *shipp)
#define FIREBALL_MEDIUM_EXPLOSION
void dock_calc_docked_center(vec3d *dest, object *objp)
void vm_vec_add2(vec3d *dest, const vec3d *src)
ship_spark sparks[MAX_SHIP_HITS]
#define AIPF_INCLUDE_BEAMS_IN_STAT_CALCS
struct matrix::@228::@230 vec
#define LOG_SHIP_DISABLED
float ship_max_hull_strength
void vm_vec_scale(vec3d *dest, float s)
int timestamp_until(int stamp)
int scoring_eval_kill(object *ship_objp)
#define MIN_PLAYER_DEATHROLL_TIME
#define PLAYER_FLAGS_KILLED_BY_EXPLOSION
#define DEATHROLL_ROTVEL_SCALE
void send_game_chat_packet(net_player *from, const char *msg, int msg_mode, net_player *to, const char *expr, int server_msg)
int fireball_ship_explosion_type(ship_info *sip)
ai_profile_t * ai_profile
float get_hull_pct(object *objp)
int ship_get_index_from_subsys(ship_subsys *ssp, int objnum, int error_bypass)
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)
void create_vaporize_debris(object *ship_objp, vec3d *hitpos)
#define SSF_DAMAGE_AS_HULL
void vm_vec_sub2(vec3d *dest, const vec3d *src)
sprintf(buf,"(%f,%f,%f)", v3->xyz.x, v3->xyz.y, v3->xyz.z)
float damage_ship[MAX_DAMAGE_SLOTS]
int object_is_dead_docked(object *objp)
void ai_update_lethality(object *ship_objp, object *weapon_obj, float damage)
#define SSSF_TURRET_ROTATION
int special_exp_deathroll_time
#define DEATHROLL_VELOCITY_STANDARD
void send_subsystem_destroyed_packet(ship *shipp, int index, vec3d world_hitpos)
int snd_play(game_snd *gs, float pan, float vol_scale, int priority, bool is_voice_msg)
float vm_vec_normalized_dir(vec3d *dest, const vec3d *end, const vec3d *start)
float vm_vec_dist(const vec3d *v0, const vec3d *v1)
float aggregate_current_hits
#define PCM_WARPOUT_STAGE2
void ship_maybe_scream(ship *sp)
int collision_damage_type_idx
#define MONITOR(function_name)
void do_subobj_destroyed_stuff(ship *ship_p, ship_subsys *subsys, vec3d *hitpos, bool no_explosion)
float shockwave_get_max_radius(int index)
void SetHookObject(char *name, object *objp)
void multi_respawn_check(object *objp)
float apply_damage_to_shield(object *objp, int quadrant, float damage)
void shipfx_blow_off_subsystem(object *ship_objp, ship *ship_p, ship_subsys *subsys, vec3d *exp_center, bool no_explosion)
float vm_vec_normalize_safe(vec3d *v)
debris Debris[MAX_DEBRIS_PIECES]
float player_damage_scale[NUM_SKILL_LEVELS]
#define MSS_FLAG_CARRY_NO_DAMAGE
vec3d * vm_vec_unrotate(vec3d *dest, const vec3d *src, const matrix *m)
float vm_vec_dist_squared(const vec3d *v0, const vec3d *v1)
void ship_apply_global_damage(object *ship_objp, object *other_obj, vec3d *force_center, float damage)
int iff_x_attacks_y(int team_x, int team_y)
int damage_ship_id[MAX_DAMAGE_SLOTS]
object Objects[MAX_OBJECTS]
#define MONITOR_INC(function_name, inc)
char killer_parent_name[NAME_LENGTH]
void ship_hit_sparks_no_rotate(object *ship_objp, vec3d *hitpos)
const char * XSTR(const char *str, int index)
int shield_armor_type_idx
void ship_maybe_praise_self(ship *deader_sp, ship *killer_sp)
#define LOG_SHIP_DESTROYED
int ship_guardian_threshold
bool end_string_at_first_hash_symbol(char *src)
#define GM_STANDALONE_SERVER
void ship_hit_music(object *ship_objp, object *other_obj)
void vm_vec_rand_vec_quick(vec3d *rvec)
void ship_apply_wash_damage(object *ship_objp, object *other_obj, float damage)
void scoring_add_damage(object *ship_objp, object *other_obj, float damage)
int beam_get_weapon_info_index(object *bm)
int RunCondition(int condition, char format='\0', void *data=NULL, class object *objp=NULL, int more_data=0)
void game_whack_apply(float x, float y)
void vm_vec_sub(vec3d *dest, const vec3d *src0, const vec3d *src1)
void create_subsys_debris(object *ship_objp, vec3d *hitpos)
float total_damage_received
#define MISSION_TYPE_TRAINING
int shockwave_get_flags(int index)
#define DEATHROLL_ROTVEL_CAP
typedef float(SCP_EXT_CALLCONV *SCPTRACKIR_PFFLOATVOID)()
float Generic_pain_flash_factor
int Event_Music_battle_started
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 shiphit_hit_after_death(object *ship_objp, float damage)
#define MULTI_CONNECTED(np)
bool Fixed_turret_collisions
void hud_start_text_flash(char *txt, int t, int interval)
void ship_generic_kill_stuff(object *objp, float percent_killed)
void ai_ship_hit(object *objp_ship, object *hit_objp, vec3d *hitpos, int shield_quadrant, vec3d *hit_normal)
float shockwave_get_min_radius(int index)
void ai_deathroll_start(object *ship_obj)
subsystem gets destroyed on player ship
void send_ship_kill_packet(class object *, class object *, float, unsigned char)
char subobj_name[MAX_NAME_LEN]
void physics_apply_whack(vec3d *impulse, vec3d *pos, physics_info *pi, matrix *orient, float mass)
#define PLAYER_FLAGS_KILLED_SELF_SHOCKWAVE
void ship_hit_kill(object *ship_objp, object *other_obj, float percent_killed, int self_destruct)
void RemHookVars(unsigned int num,...)
#define MULTIPLAYER_MASTER
SCP_vector< ship_info > Ship_info
#define SIF_KNOSSOS_DEVICE
other ship subsystem destroyed
void ship_apply_local_damage(object *ship_objp, object *other_obj, vec3d *hitpos, float damage, int quadrant, bool create_spark, int submodel_num, vec3d *hit_normal)
SCP_vector< float > shield_quadrant
void game_tst_mark(class object *, class ship *)
void show_dead_message(object *ship_objp, object *other_obj)
SCP_vector< exited_ship > Ships_exited
vec3d * get_subsystem_world_pos(object *parent_obj, ship_subsys *subsys, vec3d *world_pos)
float vm_vec_dot(const vec3d *v0, const vec3d *v1)
bool is_subsys_destroyed(ship *shipp, int submodel)
void ssm_create(object *target, vec3d *start, size_t ssm_index, ssm_firing_info *override, int team)
void ship_self_destruct(object *objp)
#define SUBSYSTEM_ACTIVATION
float shockwave_get_damage(int index)
#define MAX_DEBRIS_SHARDS
void scoring_eval_hit(object *hit_obj, object *other_obj, int from_blast)
object * debris_create(object *source_obj, int model_num, int submodel_num, vec3d *pos, vec3d *exp_center, int hull_flag, float exp_force)
int shiphit_get_damage_weapon(object *damaging_objp)
void HUD_printf(const char *format,...)
#define FIREBALL_EXPLOSION_MEDIUM
vec3d * vm_vec_cross(vec3d *dest, const vec3d *src0, const vec3d *src1)
int ship_find_exited_ship_by_signature(int signature)
void ship_apply_tag(int ship_num, int tag_level, float tag_time, object *target, vec3d *start, int ssm_index, int ssm_team)
#define MSS_FLAG_CARRY_SHOCKWAVE
float subsys_get_range(object *other_obj, ship_subsys *subsys)
float dock_calc_total_docked_mass(object *objp)
void find_submodel_instance_world_point(vec3d *outpnt, int model_instance_num, int submodel_num, const matrix *objorient, const vec3d *objpos)
int multi_find_player_by_object(object *objp)
bool IsConditionOverride(int action, object *objp=NULL)
net_player Net_players[MAX_PLAYERS]
SCP_vector< asteroid_info > Asteroid_info
float do_subobj_hit_stuff(object *ship_objp, object *other_obj, vec3d *hitpos, int submodel_num, float damage, bool *hull_should_apply_armor)
void gameseq_post_event(int event)
void vm_vec_add(vec3d *dest, const vec3d *src0, const vec3d *src1)
float ship_get_exp_damage(object *objp)
#define DEATHROLL_MASS_STANDARD
#define timestamp_valid(stamp)
#define AIPF_SHOCKWAVES_DAMAGE_SMALL_SHIP_SUBSYSTEMS
#define LOG_SHIP_DISARMED
char ship_name[NAME_LENGTH]
SCP_vector< ship_type_info > Ship_types
int maybe_shockwave_damage_adjust(object *ship_objp, object *other_obj, float *damage)
#define LOG_SELF_DESTRUCTED
struct spark_pair spark_pair
int event_music_battle_start()
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)
void shipfx_emit_spark(int n, int sn)