FS2_Open
Open source remastering of the Freespace 2 engine
asteroid.h
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 #ifndef __ASTEROID_H__
13 #define __ASTEROID_H__
14 
15 #include "globalincs/globals.h" // for NAME_LENGTH
16 #include "globalincs/pstypes.h"
17 
18 
19 class object;
20 class polymodel;
22 class draw_list;
23 
24 #define MAX_ASTEROIDS 512
25 
26 #define NUM_DEBRIS_SIZES 3
27 #define NUM_DEBRIS_POFS 3 // Number of POFs per debris size
28 
29 #define ASTEROID_TYPE_SMALL 0
30 #define ASTEROID_TYPE_MEDIUM 1
31 #define ASTEROID_TYPE_LARGE 2
32 
33 // these should always be equal for the benefit of generic asteroids (c.f. asteroid_page_in)
34 #define MAX_ACTIVE_DEBRIS_TYPES NUM_DEBRIS_SIZES
35 
36 // Goober5000 - currently same as MAX_SHIP_DETAIL_LEVELS (put here to avoid an #include)
37 #define MAX_ASTEROID_DETAIL_LEVELS 5
38 
39 
40 // Data structure to track the active asteroids
41 typedef struct asteroid_obj {
43  int flags, objnum;
44 } asteroid_obj;
46 
47 
48 // Data structure for determining a type and amount of other asteroids an
49 // asteroid will split to when destroyed.
50 typedef struct asteroid_split_info {
52  int min;
53  int max;
55 
57 {
58 public:
59  char name[NAME_LENGTH]; // name for the asteroid
60  char pof_files[NUM_DEBRIS_POFS][MAX_FILENAME_LEN]; // POF files to load/associate with ship
61  int num_detail_levels; // number of detail levels for this ship
62  int detail_distance[MAX_ASTEROID_DETAIL_LEVELS]; // distance to change detail levels at
63  float max_speed; // cap on speed for asteroid
64  int damage_type_idx; //Damage type of the asteroid
65  int damage_type_idx_sav; // stored value from table used to reset damage_type_idx
66  float inner_rad; // radius within which maximum area effect damage is applied
67  float outer_rad; // radius at which no area effect damage is applied
68  float damage; // maximum damage applied from area effect explosion
69  float blast; // maximum blast impulse from area effect explosion
70  float initial_asteroid_strength; // starting strength of asteroid
75  float fireball_radius_multiplier; // the model radius is multiplied by this to determine the fireball size
76 
78  : num_detail_levels( 0 ), max_speed( 0 ), damage_type_idx( 0 ),
79  damage_type_idx_sav( -1 ), inner_rad( 0 ), outer_rad( 0 ),
80  damage( 0 ), blast( 0 ), initial_asteroid_strength( 0 ),
81  fireball_radius_multiplier( -1 )
82  {
83  name[ 0 ] = 0;
84  memset( detail_distance, 0, sizeof( detail_distance ) );
85 
86  for (int i = 0; i < NUM_DEBRIS_POFS; i++)
87  {
88  modelp[i] = NULL;
89  model_num[i] = -1;
90  pof_files[i][0] = 0;
91  }
92  }
93 };
94 
95 
96 #define AF_USED (1<<0) // Set means used.
97 
98 typedef struct asteroid {
99  int flags;
100  int objnum;
102  int asteroid_type; // 0..MAX_DEBRIS_TYPES
103  int asteroid_subtype; // Index in asteroid_info for modelnum and modelp
104  int check_for_wrap; // timestamp to check for asteroid wrapping around field
105  int check_for_collide; // timestamp to check for asteroid colliding with escort ships
106  int final_death_time; // timestamp to swap in new models after explosion starts
107  int collide_objnum; // set to objnum that asteroid will be impacting soon
108  int collide_objsig; // object signature corresponding to collide_objnum
109  vec3d death_hit_pos; // hit pos that caused death
110  int target_objnum; // Yes, hah! Asteroids can have targets. See asteroid_aim_at_target().
111 } asteroid;
112 
113 
114 // TYPEDEF FOR DEBRIS TYPE
115 typedef enum {
119 
120 // TYPEDEF FOR FIELD TYPE
121 typedef enum {
124 } field_type_t;
125 
126 typedef struct asteroid_field {
127  vec3d min_bound; // Minimum range of field.
128  vec3d max_bound; // Maximum range of field.
129  float bound_rad;
133  vec3d vel; // Average asteroid moves at this velocity.
134  float speed; // Average speed of field
135  int num_initial_asteroids; // Number of asteroids at creation.
136  field_type_t field_type; // active throws and wraps, passive does not
137  debris_genre_t debris_genre; // type of debris (ship or asteroid) [generic type]
138  int field_debris_type[MAX_ACTIVE_DEBRIS_TYPES]; // one of the debris type defines above
140 
144 
145 extern int Num_asteroids;
146 extern int Asteroids_enabled;
147 extern char Asteroid_icon_closeup_model[NAME_LENGTH]; // model for asteroid field briefing icon rendering
148 extern vec3d Asteroid_icon_closeup_position; // closeup position for asteroid field briefing icon rendering
149 extern float Asteroid_icon_closeup_zoom; // zoom position for asteroid field briefing icon rendering
150 
151 void asteroid_init();
152 void asteroid_level_init();
153 void asteroid_level_close();
154 void asteroid_create_all();
155 void asteroid_render_DEPRECATED( object *asteroid_objp );
156 void asteroid_render(object * obj, draw_list *scene);
157 void asteroid_delete( object *asteroid_objp );
158 void asteroid_process_pre( object *asteroid_objp );
159 void asteroid_process_post( object *asteroid_objp);
160 int asteroid_check_collision( object *asteroid_objp, object * other_obj, vec3d * hitpos, collision_info_struct *asteroid_hit_info=NULL );
161 void asteroid_hit( object *pasteroid_objp, object *other_objp, vec3d *hitpos, float damage );
162 int asteroid_count();
163 int asteroid_collide_objnum(object *asteroid_objp);
164 float asteroid_time_to_impact(object *asteroid_objp);
167 int asteroid_get_random_in_cone(vec3d *pos, vec3d *dir, float ang, int danger = 0);
168 
169 // need to extern for multiplayer
170 void asteroid_sub_create(object *parent_objp, int asteroid_type, vec3d *relvec);
171 
172 void asteroid_frame();
173 
174 #endif // __ASTEROID_H__
field_type_t field_type
Definition: asteroid.h:136
void asteroid_frame()
Definition: asteroid.cpp:2122
polymodel * modelp[NUM_DEBRIS_POFS]
Definition: asteroid.h:72
#define MAX_FILENAME_LEN
Definition: pstypes.h:324
int i
Definition: multi_pxo.cpp:466
asteroid_obj * next
Definition: asteroid.h:42
int num_detail_levels
Definition: asteroid.h:61
int damage_type_idx_sav
Definition: asteroid.h:65
struct asteroid_field asteroid_field
struct asteroid asteroid
void asteroid_show_brackets()
Definition: asteroid.cpp:2150
int collide_objsig
Definition: asteroid.h:108
Definition: pstypes.h:88
float inner_rad
Definition: asteroid.h:66
int target_objnum
Definition: asteroid.h:110
float max_speed
Definition: asteroid.h:63
char pof_files[NUM_DEBRIS_POFS][MAX_FILENAME_LEN]
Definition: asteroid.h:60
void asteroid_create_all()
Definition: asteroid.cpp:529
asteroid_obj * prev
Definition: asteroid.h:42
float fireball_radius_multiplier
Definition: asteroid.h:75
struct asteroid_obj asteroid_obj
vec3d inner_min_bound
Definition: asteroid.h:131
int collide_objnum
Definition: asteroid.h:107
vec3d min_bound
Definition: asteroid.h:127
int final_death_time
Definition: asteroid.h:106
vec3d max_bound
Definition: asteroid.h:128
struct asteroid_split_info asteroid_split_info
SCP_vector< asteroid_info > Asteroid_info
Definition: asteroid.cpp:62
int asteroid_subtype
Definition: asteroid.h:103
int asteroid_type
Definition: asteroid.h:102
int flags
Definition: asteroid.h:99
int num_initial_asteroids
Definition: asteroid.h:135
#define MAX_ASTEROID_DETAIL_LEVELS
Definition: asteroid.h:37
debris_genre_t
Definition: asteroid.h:115
float initial_asteroid_strength
Definition: asteroid.h:70
void asteroid_target_closest_danger()
Definition: asteroid.cpp:2192
void asteroid_delete(object *asteroid_objp)
Definition: asteroid.cpp:826
float blast
Definition: asteroid.h:69
#define NUM_DEBRIS_POFS
Definition: asteroid.h:27
int check_for_collide
Definition: asteroid.h:105
asteroid_field Asteroid_field
Definition: asteroid.cpp:64
Definition: object.h:141
int objnum
Definition: asteroid.h:100
char Asteroid_icon_closeup_model[NAME_LENGTH]
Definition: asteroid.cpp:69
void asteroid_level_close()
Definition: asteroid.cpp:1423
GLuint const GLchar * name
Definition: Glext.h:5608
int model_num[NUM_DEBRIS_POFS]
Definition: asteroid.h:73
void asteroid_process_pre(object *asteroid_objp)
Definition: asteroid.cpp:908
int detail_distance[MAX_ASTEROID_DETAIL_LEVELS]
Definition: asteroid.h:62
vec3d death_hit_pos
Definition: asteroid.h:109
float asteroid_time_to_impact(object *asteroid_objp)
Definition: asteroid.cpp:1790
float bound_rad
Definition: asteroid.h:129
int field_debris_type[MAX_ACTIVE_DEBRIS_TYPES]
Definition: asteroid.h:138
#define NAME_LENGTH
Definition: globals.h:15
SCP_vector< int > explosion_bitmap_anims
Definition: asteroid.h:74
void asteroid_sub_create(object *parent_objp, int asteroid_type, vec3d *relvec)
Definition: asteroid.cpp:405
asteroid Asteroids[MAX_ASTEROIDS]
Definition: asteroid.cpp:63
int model_instance_num
Definition: asteroid.h:101
vec3d Asteroid_icon_closeup_position
Definition: asteroid.cpp:70
void asteroid_level_init()
Definition: asteroid.cpp:628
void asteroid_hit(object *pasteroid_objp, object *other_objp, vec3d *hitpos, float damage)
Definition: asteroid.cpp:1368
int check_for_wrap
Definition: asteroid.h:104
asteroid_obj Asteroid_obj_list
Definition: asteroid.cpp:50
int has_inner_bound
Definition: asteroid.h:130
hull_check pos
Definition: lua.cpp:5050
GLsizei GLsizei GLuint * obj
Definition: Glext.h:5619
int objnum
Definition: asteroid.h:43
vec3d inner_max_bound
Definition: asteroid.h:132
debris_genre_t debris_genre
Definition: asteroid.h:137
void asteroid_process_post(object *asteroid_objp)
Definition: asteroid.cpp:1750
int asteroid_count()
Definition: asteroid.cpp:1473
int asteroid_check_collision(object *asteroid_objp, object *other_obj, vec3d *hitpos, collision_info_struct *asteroid_hit_info=NULL)
Definition: asteroid.cpp:918
#define MAX_ASTEROIDS
Definition: asteroid.h:24
int damage_type_idx
Definition: asteroid.h:64
void asteroid_render_DEPRECATED(object *asteroid_objp)
Definition: asteroid.cpp:1170
int Num_asteroids
Definition: asteroid.cpp:58
void asteroid_init()
Definition: asteroid.cpp:2140
int asteroid_collide_objnum(object *asteroid_objp)
Definition: asteroid.cpp:1781
#define MAX_ACTIVE_DEBRIS_TYPES
Definition: asteroid.h:34
float outer_rad
Definition: asteroid.h:67
int asteroid_get_random_in_cone(vec3d *pos, vec3d *dir, float ang, int danger=0)
Definition: asteroid.cpp:1600
void asteroid_render(object *obj, draw_list *scene)
Definition: asteroid.cpp:1189
SCP_vector< asteroid_split_info > split_info
Definition: asteroid.h:71
int Asteroids_enabled
Definition: asteroid.cpp:57
float Asteroid_icon_closeup_zoom
Definition: asteroid.cpp:71
field_type_t
Definition: asteroid.h:121
float damage
Definition: asteroid.h:68