47 #define ASTEROID_OBJ_USED (1<<0) // flag used in asteroid_obj struct
48 #define MAX_ASTEROID_OBJS MAX_ASTEROIDS // max number of asteroids tracked in asteroid list
53 #define SMALL_DEBRIS_WEIGHT 8
54 #define MEDIUM_DEBRIS_WEIGHT 4
55 #define LARGE_DEBRIS_WEIGHT 1
67 static int Asteroid_impact_explosion_ani;
68 static float Asteroid_impact_explosion_radius;
73 #define ASTEROID_CHECK_WRAP_TIMESTAMP 2000 // how often an asteroid gets checked for wrapping
74 #define ASTEROID_UPDATE_COLLIDE_TIMESTAMP 2000 // how often asteroid is checked for impending collisions with escort ships
75 #define ASTEROID_MIN_COLLIDE_TIME 24 // time in seconds to check for asteroid colliding
97 Asteroid_objs[
i].
flags = 0;
117 list_append(&Asteroid_obj_list, &Asteroid_objs[index]);
134 list_remove(&Asteroid_obj_list, &Asteroid_objs[index]);
144 float max, double_max;
146 Assert( asteroid_info_index < (
int)Asteroid_info.size() );
148 max = Asteroid_info[asteroid_info_index].max_speed;
149 double_max = max * 2;
151 while (speed > double_max){
215 for (axis=0; axis<3; axis++) {
218 Assert(dist1 >= 0 && dist2 >= 0);
245 if(asfieldp == NULL) {
255 if (n >= MAX_ASTEROIDS) {
256 nprintf((
"Warning",
"Could not create asteroid, no more slots left\n"));
270 asteroid_subtype = 0;
273 asip = &Asteroid_info[asteroid_type];
276 if(asip->
modelp[asteroid_subtype] == NULL) {
310 rand_base = signature;
327 mprintf((
"Couldn't create asteroid -- out of object slots\n"));
414 if (new_objp == NULL)
425 if ( parent_speed < 0.1
f ) {
451 Assert( asteroid_info_index < (
int)Asteroid_info.size() );
454 if ( (asteroid_info_index >= (
int)Asteroid_info.size()) || (asteroid_subtype >=
NUM_DEBRIS_POFS) ) {
458 asip = &Asteroid_info[asteroid_info_index];
465 if (asip->
model_num[asteroid_subtype] >= 0)
491 int group_base, group_offset;
494 group_offset = index - group_base;
538 int random_threshold;
542 int max_weighted_range = 0;
553 int num_debris_types = 0;
564 for (idx=0; idx<num_debris_types; idx++) {
566 ship_debris_odds_table[
idx].random_threshold = max_weighted_range + debris_weight;
568 max_weighted_range += debris_weight;
574 for (idx=0; idx<num_debris_types; idx++) {
598 for (i=0; i<max_asteroids; i++) {
610 Assert(num_debris_types > 0);
612 int rand_choice = rand() % max_weighted_range;
616 if (rand_choice < ship_debris_odds_table[idx].random_threshold) {
617 asteroid_create(&Asteroid_field, ship_debris_odds_table[idx].debris_type, 0);
635 for (ast = Asteroid_info.begin(); ast != Asteroid_info.end(); ++ast)
636 ast->damage_type_idx = ast->damage_type_idx_sav;
731 int asteroid_obj_index;
750 vec3d predicted_center_pos;
763 speed = Asteroid_info[0].max_speed * (
frand()/2.0f + 0.5f);
786 nprintf((
"AI",
"Incoming asteroids: %i\n", count));
834 asp = &Asteroids[
num];
858 vec3d vec_to_asteroid, old_asteroid_pos, old_vel;
861 old_asteroid_pos = objp->
pos;
871 if ( (dot < 0.7
f) || (dist > asfieldp->
bound_rad) ) {
882 if ( (dot > 0.7
f) && (dist < (asfieldp->
bound_rad * 1.3f)) ) {
884 objp->
pos = old_asteroid_pos;
905 *goal = (f2 - f1) * scale + f1;
926 int num, asteroid_subtype;
937 if ( asteroid_hit_info == NULL ) {
946 mc.
p1 = &other_obj->
pos;
956 object *pship_obj = other_obj;
959 object* heavy = asteroid_hit_info->
heavy;
960 object* lighter = asteroid_hit_info->
light;
961 object *heavy_obj = heavy;
962 object *light_obj = lighter;
974 vec3d p0_temp, p0_rotated;
998 if ( asteroid_hit_info->
heavy == pship_obj ) {
1006 int copy_flags = mc.
flags;
1007 vec3d copy_p0, copy_p1;
1020 asteroid_hit_info->
hit_time = FLT_MAX;
1031 for (
size_t j=0; j<submodel_vector.size(); j++) {
1040 for (
size_t i=0;
i<submodel_vector.size();
i++) {
1068 if (asteroid_hit_info->
edge_hit == 0) {
1073 vec3d int_light_pos, diff;
1086 mc.
flags = copy_flags;
1100 if (asteroid_hit_info->
edge_hit == 0) {
1130 if ( !asteroid_hit_info->
edge_hit ) {
1155 if ( asteroid_hit_info->
edge_hit ) {
1179 asp = &Asteroids[
num];
1198 asp = &Asteroids[
num];
1218 vec3d tvec, rand_vec;
1224 while (count++ < 3) {
1228 if ((mag > 0.2
f) && (mag < 1.7
f))
1246 switch(Asteroids[num].asteroid_type) {
1269 int fireball_objnum;
1270 float explosion_life, fireball_scale_multiplier;
1274 if (fireball_type < 0) {
1287 if ( fireball_objnum > -1 ) {
1290 explosion_life = 0.0f;
1293 return explosion_life;
1301 int sound_index = -1;
1302 float range_factor = 1.0f;
1312 range_factor = 10.0f;
1315 Assert(sound_index != -1);
1318 range_factor = 1.0f;
1332 float damage, blast;
1337 asp = &Asteroids[asteroid_objp->
instance];
1340 if ( asip->
damage <= 0 ) {
1370 float explosion_life;
1373 asp = &Asteroids[pasteroid_obj->
instance];
1387 int play_loud_collision = 0;
1405 }
else if ( other_obj ) {
1429 Asteroids[
i].
flags &= ~AF_USED;
1438 DCF_BOOL2(asteroids,
Asteroids_enabled,
"enables or disables asteroids",
"Usage: asteroids [bool]\nTurns asteroid system on/off. If nothing passed, then toggles it.\n");
1449 end_index = start_index-1;
1456 while (i != end_index) {
1487 asp = &Asteroids[pasteroid_obj->
instance];
1491 vec3d relvec, vfh, tvec;
1540 int num_roids = split->min;
1541 int num_roids_var = split->max - split->min;
1543 if (num_roids_var > 0)
1544 num_roids += rand() % num_roids_var;
1547 for (
int i=0;
i<num_roids;
i++)
1548 roids_to_create.push_back(split->asteroid_type);
1553 int total_roids = roids_to_create.size();
1554 for (
int i = 0;
i < total_roids;
i++) {
1555 vec3d dir_vec,final_vec;
1556 vec3d parent_vel,hit_rel_vec;
1562 float inc =
PI * (3.0f - sqrt(5.0
f));
1563 float offset = 2.0f / total_roids;
1565 float y =
i * offset - 1 + (offset / 2);
1566 float r = sqrt(1.0
f - y*y);
1567 float phi =
i * inc;
1569 dir_vec.
xyz.x = cosf(phi)*
r;
1570 dir_vec.
xyz.y = sinf(phi)*
r;
1574 vec3d tempv = dir_vec;
1586 vm_vec_avg3(&final_vec, &parent_vel, &hit_rel_vec, &dir_vec);
1621 float asteroid_ray_dist;
1622 vec3d asteroid_fvec, terminus;
1629 terminus = pasteroid_obj->
pos;
1640 mc->
pos = &pship_obj->
pos;
1641 mc->
p0 = &pasteroid_obj->
pos;
1703 int i, num_escorts, escort_objnum, will_collide=0;
1707 asp = &Asteroids[asteroid_objp->
instance];
1718 if ( num_escorts <= 0 ) {
1722 for ( i = 0; i < num_escorts; i++ ) {
1724 if ( escort_objnum >= 0 ) {
1728 if ( will_collide ) {
1792 float time=-1.0f, total_dist, speed;
1797 asp = &Asteroids[asteroid_objp->
instance];
1807 if ( total_dist < 0 ) {
1811 time = total_dist/speed;
1831 if ( (
stristr(asip->
name,
"Asteroid") != NULL) ) {
1896 Warning(
LOCATION,
"Invalid asteroid reference %i used for $Split in asteroids table, ignoring.", split_type);
1926 "Cannot parse asteroids/debris if there "
1927 "are no species for them to belong to."
1953 if (tally >= max_asteroids)
1960 SCP_string msg(
"Ignoring extra asteroid/debris '");
1961 msg.append(new_asteroid.
name);
1964 parsed_asteroids.push_back(msg);
1971 msg.append(
"Parsing asteroid: '");
1972 msg.append(new_asteroid.
name);
1973 msg.append(
"' as a '");
1974 msg.append((species == 0) ?
"generic" :
Species_info[species - 1].species_name);
1978 msg.append(
" small\n");
1981 msg.append(
" medium\n");
1984 msg.append(
" large\n");
1988 "Important numbers:\n"
1990 "\tNUM_DEBRIS_SIZES: %d\n",
1991 tally, NUM_DEBRIS_SIZES
1993 msg.append(
" unknown\n");
1995 parsed_asteroids.push_back(msg);
1997 Asteroid_info.push_back(new_asteroid);
2003 if (tally != max_asteroids)
2007 iter != parsed_asteroids.end(); ++iter)
2009 mprintf((
"Asteroid.tbl as parsed:\n"));
2010 mprintf((
"%s", iter->c_str()));
2014 "Found %d asteroids/debris when %d expected\n\n"
2015 "<Number expected> = <Number of species> * %d + %d generic asteroids\n"
2018 "Run a debug build to see a list of all parsed asteroids\n",
2020 "See the debug.log for a listing of all parsed asteroids\n",
2022 tally, max_asteroids,
2028 Asteroid_impact_explosion_ani = -1;
2034 Asteroid_impact_explosion_ani =
bm_load_animation(impact_ani_file, &num_frames, NULL, NULL, 1);
2051 vm_vec_make(&Asteroid_icon_closeup_position, 0.0
f, 0.0
f, -334.0
f);
2063 mprintf((
"TABLES: Unable to parse '%s'! Error message = %s.\n",
"asteroid.tbl", e.what()));
2073 object *asteroid_objp;
2105 float radius = ship_objp->
radius*2.0f;
2153 object *asteroid_objp, *player_target;
2160 player_target = NULL;
2168 asp = &Asteroids[asteroid_objp->
instance];
2174 if ( asteroid_objp == player_target ) {
2194 object *asteroid_objp, *closest_asteroid_objp = NULL;
2196 float dist, closest_dist = 999999.0f;
2203 asp = &Asteroids[asteroid_objp->
instance];
2211 if ( dist < closest_dist ) {
2212 closest_dist = dist;
2213 closest_asteroid_objp = asteroid_objp;
2217 if ( closest_asteroid_objp ) {
2227 nprintf((
"Paging",
"Paging in asteroids\n" ));
2237 asip = &Asteroid_info[
i];
void asteroid_sub_create(object *parent_objp, int asteroid_type, vec3d *relvec)
void mc_info_init(mc_info *mc)
asteroid_obj Asteroid_obj_list
void asteroid_wrap_pos(object *objp, asteroid_field *asfieldp)
polymodel * modelp[NUM_DEBRIS_POFS]
int model_collide(mc_info *mc_info_obj)
float asteroid_create_explosion(object *objp)
void asteroid_aim_at_target(object *objp, object *asteroid_objp, float delta_time)
int timestamp(int delta_ms)
#define MULTIPLAYER_CLIENT
int asteroid_in_inner_bound(asteroid_field *asfieldp, vec3d *pos, float delta)
#define ASTEROID_OBJ_USED
#define MEDIUM_DEBRIS_WEIGHT
weapon Weapons[MAX_WEAPONS]
float vm_vec_mag_quick(const vec3d *v)
#define TARGET_DISPLAY_DIST
void vm_vec_scale_add(vec3d *dest, const vec3d *src1, const vec3d *src2, float k)
int fireball_asteroid_explosion_type(asteroid_info *aip)
float frand_range(float min, float max)
Return a floating point number in the range min..max.
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)
polymodel * model_get(int model_num)
weapon_info Weapon_info[MAX_WEAPON_TYPES]
void RemHookVar(char *name)
SCP_vector< game_snd > Snds
int get_debris_weight(int ship_debris_index)
float vm_vec_mag(const vec3d *v)
#define FIREBALL_LARGE_EXPLOSION
asteroid Asteroids[MAX_ASTEROIDS]
matrix * vm_angles_2_matrix(matrix *m, const angles *a)
void model_get_rotating_submodel_list(SCP_vector< int > *submodel_vector, object *objp)
int hud_escort_num_ships_on_list()
int asteroid_check_collision(object *pasteroid, object *other_obj, vec3d *hitpos, collision_info_struct *asteroid_hit_info)
float vm_vec_normalize_quick(vec3d *src)
void _cdecl void void _cdecl void _cdecl Warning(char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
void lerp(float *goal, float f1, float f2, float scale)
#define SUBMODEL_NO_ROT_HIT
float detail_depth[MAX_MODEL_DETAIL_LEVELS]
#define ASTEROID_TYPE_SMALL
float side_slip_time_const
#define list_append(head, elem)
void asteroid_parse_tbl()
char pof_files[NUM_DEBRIS_POFS][MAX_FILENAME_LEN]
void set_flags(uint flags)
struct vec3d::@225::@227 xyz
void static_randvec(int num, vec3d *vp)
[To be described]
void asteroid_parse_section(asteroid_info *asip)
int get_debris_from_same_group(int index)
void send_asteroid_throw(object *objp)
void random_shuffle(int *first, int *last)
float model_get_core_radius(int modelnum)
ai_info Ai_info[MAX_AI_INFO]
vec3d * vm_vec_rotate(vec3d *dest, const vec3d *src, const matrix *m)
#define Assertion(expr, msg,...)
#define END_OF_LIST(head)
float fireball_radius_multiplier
int set_asteroid_throw_objnum()
void vm_vec_random_cone(vec3d *out, const vec3d *in, float max_angle, const matrix *orient)
void vm_vec_scale_add2(vec3d *dest, const vec3d *src, float k)
std::basic_string< char, std::char_traits< char >, std::allocator< char > > SCP_string
GLenum GLenum GLenum GLenum GLenum scale
int required_string_either(char *str1, char *str2)
Checks for one of two required strings.
#define MAX_FIREBALL_TYPES
GLenum GLuint GLenum GLsizei const GLchar * buf
void hud_target_add_display_list(object *objp, vertex *target_point, vec3d *target_pos, int correction, color *bracket_clr, char *name, int flags)
void asc_get_relvec(vec3d *relvec, object *other_obj, vec3d *hitpos)
char Asteroid_icon_closeup_model[NAME_LENGTH]
void asteroid_test_collide(object *pasteroid_obj, object *pship_obj, mc_info *mc, bool lazy=false)
float vm_vec_mag_squared(const vec3d *v)
void asteroid_target_closest_danger()
script_state Script_system("FS2_Open Scripting")
Container & split(Container &result, const typename Container::value_type &s, const typename Container::value_type &delimiters, split_struct::empties_t empties=split_struct::empties_ok)
void stuff_float(float *f)
int hud_escort_return_objnum(int index)
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.
#define IS_VEC_NULL_SQ_SAFE(v)
void asteroid_level_init()
void asteroid_maybe_break_up(object *pasteroid_obj)
int num_initial_asteroids
#define ASTEROID_MIN_COLLIDE_TIME
vec3d heavy_collision_cm_pos
#define PM_FLAG_HAS_INTRINSIC_ROTATE
void model_render_queue(model_render_params *interp, draw_list *scene, int model_num, matrix *orient, vec3d *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 asteroid_level_close()
void send_asteroid_hit(object *objp, object *other_objp, vec3d *hitpos, float damage)
void vm_vec_add2(vec3d *dest, const vec3d *src)
void model_delete_instance(int model_instance_num)
GLdouble GLdouble GLdouble r
#define MAX_ASTEROID_DETAIL_LEVELS
struct matrix::@228::@230 vec
void vm_vec_scale(vec3d *dest, float s)
float initial_asteroid_strength
#define SMALL_DEBRIS_WEIGHT
void asteroid_maybe_reposition(object *objp, asteroid_field *asfieldp)
int obj_create(ubyte type, int parent_obj, int instance, matrix *orient, vec3d *pos, float radius, uint flags)
ai_profile_t * ai_profile
void hud_target_asteroid()
void model_clear_instance(int model_num)
int asteroid_should_wrap(object *objp, asteroid_field *asfieldp)
int asteroid_valid_ship_to_warn_collide(ship *shipp)
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 stuff_string(char *outstr, int type, int len, char *terminators)
char * stristr(char *str, const char *substr)
int ship_get_SIF(ship *shipp)
int asteroid_will_collide(object *pasteroid_obj, object *escort_objp)
void vm_vec_sub2(vec3d *dest, const vec3d *src)
void world_find_model_instance_point(vec3d *out, vec3d *world_pt, const polymodel_instance *pmi, int submodel_num, const matrix *orient, const vec3d *pos)
#define MAX_ASTEROID_OBJS
submodel_instance * submodel
void asteroid_render_DEPRECATED(object *obj)
ubyte g3_rotate_vertex(vertex *dest, const vec3d *src)
int required_string(const char *pstr)
float vm_vec_normalized_dir(vec3d *dest, const vec3d *end, const vec3d *start)
float vm_vec_dist(const vec3d *v0, const vec3d *v1)
int optional_string(const char *pstr)
void maybe_throw_asteroid(int count)
float fireball_lifeleft(object *obj)
int model_load(char *filename, int n_subsystems, model_subsystem *subsystems, int ferror=1, int duplicate=0)
void read_file_text(const char *filename, int mode, char *processed_text, char *raw_text)
void SetHookObject(char *name, object *objp)
float asteroid_get_fireball_scale_multiplier(int num)
int g3_project_vertex(vertex *point)
#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)
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)
#define MC_SUBMODEL_INSTANCE
object Objects[MAX_OBJECTS]
void asteroid_show_brackets()
void stuff_vec3d(vec3d *vp)
void asteroid_process_post(object *obj)
void inner_bound_pos_fixup(asteroid_field *asfieldp, vec3d *pos)
#define vm_vec_make(v, _x, _y, _z)
int asteroid_get_random_in_cone(vec3d *pos, vec3d *dir, float ang, int danger)
vec3d * vm_vec_avg3(vec3d *dest, const vec3d *src0, const vec3d *src1, const vec3d *src2)
asteroid_obj Asteroid_objs[MAX_ASTEROID_OBJS]
#define SND_PRIORITY_MUST_PLAY
#define ASTEROID_TYPE_MEDIUM
void vm_vec_copy_scale(vec3d *dest, const vec3d *src, float s)
float asteroid_time_to_impact(object *asteroid_objp)
void set_hit_struct_info(collision_info_struct *hit, mc_info *mc, int submodel_rot_hit)
void _cdecl void void _cdecl Error(const char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
void vm_vec_rand_vec_quick(vec3d *rvec)
int max_incoming_asteroids[NUM_SKILL_LEVELS]
void reset_parse(char *text)
int model_num[NUM_DEBRIS_POFS]
int RunCondition(int condition, char format='\0', void *data=NULL, class object *objp=NULL, int more_data=0)
int detail_distance[MAX_ASTEROID_DETAIL_LEVELS]
void vm_vec_sub(vec3d *dest, const vec3d *src0, const vec3d *src1)
#define LARGE_DEBRIS_WEIGHT
#define ASTEROID_UPDATE_COLLIDE_TIMESTAMP
#define MULTI_SIG_ASTEROID
int stuff_int_list(int *ilp, int max_ints, int lookup_type)
#define ASTEROID_CHECK_WRAP_TIMESTAMP
typedef float(SCP_EXT_CALLCONV *SCPTRACKIR_PFFLOATVOID)()
void asteroid_create_all()
void asteroid_load(int asteroid_info_index, int asteroid_subtype)
void asteroid_render(object *obj, draw_list *scene)
#define MR_DEPRECATED_NORMAL
polymodel_instance * model_get_instance(int model_instance_num)
float vm_vec_dist_quick(const vec3d *v0, const vec3d *v1)
object * asteroid_create(asteroid_field *asfieldp, int asteroid_type, int asteroid_subtype)
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)
int field_debris_type[MAX_ACTIVE_DEBRIS_TYPES]
float frand()
Return random value in range 0.0..1.0- (1.0- means the closest number less than 1.0)
SCP_vector< int > explosion_bitmap_anims
int set_target_objnum(ai_info *aip, int objnum)
float asteroid_cap_speed(int asteroid_info_index, float speed)
#define ASTEROID_TYPE_LARGE
int Asteroid_throw_objnum
void asteriod_explode_sound(object *objp, int type, int play_loud)
int asteroid_collide_objnum(object *asteroid_objp)
float Asteroid_icon_closeup_zoom
int asteroid_is_targeted(object *objp)
float vm_vec_copy_normalize(vec3d *dest, const vec3d *src)
float model_get_radius(int modelnum)
#define MULTIPLAYER_MASTER
An overhauled/updated debug console to allow monitoring, testing, and general debugging of new featur...
#define MC_ONLY_BOUND_BOX
void asteroid_process_pre(object *objp)
SCP_vector< ship_info > Ship_info
void asteroid_update_collide_flag(object *asteroid_objp)
int asteroid_obj_list_add(int objnum)
#define timestamp_elapsed(stamp)
SCP_vector< species_info > Species_info
#define OF_SHOULD_BE_DEAD
void asteroid_obj_list_remove(object *obj)
#define list_remove(head, elem)
GLsizei GLsizei GLuint * obj
float vm_vec_dot(const vec3d *v0, const vec3d *v1)
void send_asteroid_create(object *new_objp, object *parent_objp, int asteroid_type, vec3d *relvec)
void asteroid_hit(object *pasteroid_obj, object *other_obj, vec3d *hitpos, float damage)
debris_genre_t debris_genre
#define timestamp_rand(a, b)
void weapon_area_apply_blast(vec3d *force_apply_pos, object *ship_objp, vec3d *blast_pos, float blast, int make_shockwave)
DCF_BOOL2(asteroids, Asteroids_enabled,"enables or disables asteroids","Usage: asteroids [bool]\nTurns asteroid system on/off. If nothing passed, then toggles it.\n")
void scoring_eval_hit(object *hit_obj, object *other_obj, int from_blast)
int count_incident_asteroids()
#define FIREBALL_ASTEROID
void asteroid_verify_collide_objnum(asteroid *asp)
asteroid_field Asteroid_field
ushort multi_assign_network_signature(int what_kind)
int asteroid_in_inner_bound_with_axes(asteroid_field *asfieldp, vec3d *pos, float delta)
#define TARGET_DISPLAY_LEAD
particle * particle_create(particle_info *pinfo)
void asteroid_do_area_effect(object *asteroid_objp)
int model_create_instance(bool is_ship, int model_num)
void asteroid_update_collide(object *objp)
void set_object_number(int num)
#define MAX_ACTIVE_DEBRIS_TYPES
bool IsConditionOverride(int action, object *objp=NULL)
SCP_vector< asteroid_info > Asteroid_info
void vm_vec_add(vec3d *dest, const vec3d *src0, const vec3d *src1)
SCP_vector< asteroid_split_info > split_info
int impact_weapon_expl_index
matrix vmd_identity_matrix
#define MR_DEPRECATED_IS_ASTEROID
void asteroid_obj_list_init()
float static_randf(int num)
Return a random float in 0.0f .. 1.0f- (ie, it will never return 1.0f).
int damage_type_add(char *name)
vec3d Asteroid_icon_closeup_position
float static_randf_range(int num, float min, float max)
Return a random float within a range. Note: min and max are inclusive.
vec3d light_collision_cm_pos
void asteroid_delete(object *obj)
#define OBJ_RECALC_PAIRS(obj_to_reset)
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)