52 for (
auto it = Ssm_info.cbegin(); it != Ssm_info.cend(); ++it)
54 return std::distance(Ssm_info.cbegin(), it);
78 mprintf((
"Found an SSM entry without a name. Assigning \"%s\".\n", s.
name));
86 if (string_index == 0) {
89 }
else if (string_index == 1) {
106 Warning(
LOCATION,
"Expected a '+WarpTime:' value equal or greater than 4.0, found '%f' in weapon '%s'.\n Setting to 4.0, please check and set to a number 4.0 or greater!\n", s.
warp_time, weapon_name);
115 if (string_index == 0) {
127 if (string_index == 0) {
130 }
else if (string_index == 1) {
155 Assertion(
false,
"Impossible return value from required_string_one_of(); get a coder!\n");
180 Ssm_info[existing] =
s;
182 Ssm_info.push_back(s);
189 mprintf((
"TABLES: Unable to parse '%s'! Error message = %s.\n", filename, e.what()));
198 mprintf((
"TABLES => Starting parse of 'ssm.tbl'...\n"));
237 Assertion(
false,
"Unknown shape '%d' in SSM type #%d ('%s'). This should not be possible; get a coder!\n", s->
shape, ssm_index, s->
name);
266 if (ssm_index >= Ssm_info.size()) {
272 count = Ssm_info[ssm_index].count;
273 if (Ssm_info[ssm_index].max_count != -1) {
276 count +=
rand32() % (Ssm_info[ssm_index].max_count - count + 1);
280 if(
override != NULL){
281 ssm.
sinfo = *
override;
304 for (idx = 0; idx <
count; idx++) {
309 ssm_info *si = &Ssm_info[ssm_index];
328 if(Ssm_info[ssm_index].send_message) {
329 if (!Ssm_info[ssm_index].use_custom_message)
334 if (Ssm_info[ssm_index].sound_index >= 0) {
338 Ssm_strikes.push_back(ssm);
344 Ssm_strikes.erase(ssm);
356 moveup = Ssm_strikes.begin();
357 while ( moveup != Ssm_strikes.end() ) {
359 if(moveup->sinfo.ssm_index < 0){
362 si = &Ssm_info[moveup->sinfo.ssm_index];
366 for(idx=0; idx<moveup->sinfo.count; idx++){
368 if(!moveup->done_flags[idx]){
372 if(moveup->fireballs[idx] >= 0){
383 fire_info.
target = moveup->sinfo.target;
388 fire_info.
team =
static_cast<char>(moveup->sinfo.ssm_team);
393 moveup->done_flags[
idx] =
true;
399 vm_vec_sub(&temp, &moveup->sinfo.target->pos, &moveup->sinfo.start_pos[idx]);
406 if (weapon_objnum >= 0) {
413 moveup->done_flags[
idx] =
true;
418 else if((moveup->sinfo.delay_stamp[idx] >= 0) &&
timestamp_elapsed(moveup->sinfo.delay_stamp[idx])){
423 vm_vec_sub(&temp, &moveup->sinfo.target->pos, &moveup->sinfo.start_pos[idx]);
int timestamp(int delta_ms)
weapon Weapons[MAX_WEAPONS]
SCP_list< ssm_strike > Ssm_strikes
void vm_vec_scale_add(vec3d *dest, const vec3d *src1, const vec3d *src2, float k)
SCP_vector< vec3d > start_pos
float frand_range(float min, float max)
Return a floating point number in the range min..max.
weapon_info Weapon_info[MAX_WEAPON_TYPES]
void hud_artillery_render()
SCP_vector< game_snd > Snds
int required_string_one_of(int arg_count,...)
Checks for one of any of the given required strings.
int weapon_create(vec3d *pos, matrix *orient, int weapon_type, int parent_obj, int group_id=-1, int is_locked=0, int is_spawned=0, float fof_cooldown=0.0f, ship_subsys *src_turret=NULL)
SCP_vector< ssm_info > Ssm_info
int weapon_info_lookup(const char *name=NULL)
void _cdecl void void _cdecl void _cdecl Warning(char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
float artillery_lock_time
SCP_vector< int > fireballs
ship_subsys * target_subsys
void vm_vec_random_in_sphere(vec3d *out, const vec3d *in, const matrix *orient, float radius, int on_edge)
#define Assertion(expr, msg,...)
void parse_ssm(const char *filename)
GLenum GLuint GLenum GLsizei const GLchar * message
void gr_set_color_fast(color *dst)
int required_string_either(char *str1, char *str2)
Checks for one of two required strings.
SCP_vector< int > delay_stamp
void stuff_float(float *f)
matrix * vm_vector_2_matrix(matrix *m, const vec3d *fvec, const vec3d *uvec, const vec3d *rvec)
void parse_sound(const char *tag, int *idx_dest, const char *object_name, parse_sound_flags flags)
struct matrix::@228::@230 vec
void ssm_get_random_start_pos(vec3d *out, vec3d *start, matrix *orient, int ssm_index)
int cf_exists_full(const char *filename, int dir_type)
void stuff_string(char *outstr, int type, int len, char *terminators)
sprintf(buf,"(%f,%f,%f)", v3->xyz.x, v3->xyz.y, v3->xyz.z)
#define BFIF_FLOATING_BEAM
int required_string(const char *pstr)
int snd_play(game_snd *gs, float pan, float vol_scale, int priority, bool is_voice_msg)
int optional_string(const char *pstr)
char message[NAME_LENGTH]
float fireball_lifeleft_percent(object *obj)
void read_file_text(const char *filename, int mode, char *processed_text, char *raw_text)
int beam_fire(beam_fire_info *fire_info)
SCP_vector< bool > done_flags
object Objects[MAX_OBJECTS]
int ssm_info_lookup(const char *name)
const char * XSTR(const char *str, int index)
void stuff_boolean(int *i, bool a_to_eol)
void ssm_create(object *target, vec3d *start, size_t ssm_index, ssm_firing_info *override, int team)
void vm_vec_random_in_circle(vec3d *out, const vec3d *in, const matrix *orient, float radius, int on_edge)
void reset_parse(char *text)
GLuint const GLchar * name
void vm_vec_sub(vec3d *dest, const vec3d *src0, const vec3d *src1)
int optional_string_either(char *str1, char *str2)
void validate_SSM_entries()
#define MULTIPLAYER_MASTER
#define timestamp_elapsed(stamp)
void hud_init_artillery()
int parse_modular_table(const char *name_check, void(*parse_callback)(const char *filename), int path_type, int sort_type)
void HUD_printf(const char *format,...)
void _cdecl gr_printf_no_resize(int x, int y, const char *format,...)
#define FIREBALL_WARP_EFFECT
void hud_artillery_update()
void ssm_delete(SCP_list< ssm_strike >::iterator ssm)
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)