51 {
"Arrive Enemy", 100, -1, 0},
52 {
"Attack Target", 100, -1, 0},
53 {
"Beta Arrived", 100, -1, 0},
54 {
"Check 6", 100, 2, 6000},
55 {
"Engage", 100, -1, 0},
56 {
"Gamma Arrived", 100, -1, 0},
57 {
"Help", 100, 10, 60000},
58 {
"Praise", 100, 10, 60000},
59 {
"Backup", 100, -1, 0},
60 {
"Ignore Target", 100, -1, 0},
62 {
"Oops 1", 100, -1, 0},
63 {
"Permission", 100, -1, 0},
64 {
"Stray", 100, -1, 0},
65 {
"Depart", 100, -1, 0},
67 {
"Rearm on Way", 100, -1, 0},
68 {
"On way", 100, -1, 0},
69 {
"Rearm warping in", 100, -1, 0},
70 {
"No Target", 100, -1, 0},
71 {
"Docking Start", 100, -1, 0},
72 {
"Repair Done", 100, -1, 0},
73 {
"Repair Aborted", 100, -1, 0},
74 {
"Traitor", 100, -1, 0},
75 {
"Rearm", 100, -1, 0},
76 {
"Disable Target", 100, -1, 0},
77 {
"Disarm Target", 100, -1, 0},
78 {
"Player Dead", 100, -1, 0},
79 {
"Death", 50, 10, 60000},
80 {
"Support Killed", 100, -1, 0},
81 {
"All Clear", 100, -1, 0},
82 {
"All Alone", 100, -1, 0},
83 {
"Repair", 100, -1, 0},
84 {
"Delta Arrived", 100, -1, 0},
85 {
"Epsilon Arrived", 100, -1, 0},
86 {
"Instructor Hit", 100, -1, 0},
87 {
"Instructor Attack", 100, -1, 0},
88 {
"Stray Warning", 100, -1, 0},
89 {
"Stray Warning Final", 100, -1, 0},
90 {
"AWACS at 75", 100, -1, 0},
91 {
"AWACS at 25", 100, -1, 0},
92 {
"Praise Self", 10, 4, 60000},
93 {
"High Praise", 100, -1, 0},
94 {
"Rearm Primaries", 100, -1, 0},
95 {
"Primaries Low", 100, -1, 0},
109 #define MAX_PLAYING_MESSAGES 2
111 #define MAX_WINGMAN_HEADS 2
112 #define MAX_COMMAND_HEADS 3
115 #define HEAD_PREFIX_STRING "head-"
116 #define COMMAND_HEAD_PREFIX "head-cm1"
117 #define COMMAND_WAVE_PREFIX "TC_"
118 #define SUPPORT_NAME "Support"
144 #define MQF_CONVERT_TO_COMMAND (1<<0) // convert this queued message to terran command
145 #define MQF_CHECK_ALIVE (1<<1) // check for the existence of who_from before sending
161 #define MAX_MESSAGE_Q 30
162 #define MAX_MESSAGE_LIFE F1_0*30 // After being queued for 30 seconds, don't play it
163 #define DEFAULT_MESSAGE_LENGTH 3000 // default number of milliseconds to display message indicator on hud
167 #define MESSAGE_IMMEDIATE_TIMESTAMP 1000 // immediate messages must play within 1 second
168 #define MESSAGE_SOON_TIMESTAMP 5000 // "soon" messages must play within 5 seconds
169 #define MESSAGE_ANYTIME_TIMESTAMP -1 // anytime timestamps are invalid
194 static int Message_wave_muted;
195 static int Message_wave_duration;
196 static int Next_mute_time;
198 #define MAX_DISTORT_PATTERNS 2
199 #define MAX_DISTORT_LEVELS 6
202 {0.20f, 0.20f, 0.20f, 0.20f, 0.20f, 0.20f},
203 {0.10f, 0.20f, 0.25f, 0.25f, 0.05f, 0.15f}
206 static int Distort_num;
207 static int Distort_next;
224 static void persona_parse_close()
226 if (Personas != NULL) {
239 static bool done_at_exit =
false;
240 if ( !done_at_exit ) {
241 atexit( persona_parse_close );
248 if (Personas == NULL)
275 if ( i == MAX_PERSONA_TYPES )
298 stuff_boolean(&Personas[Num_personas].substitute_missing_messages);
317 for ( i = 0; i < (
int)Message_avis.size(); i++ ) {
328 Message_avis.push_back(extra);
330 return ((
int)Message_avis.size() - 1);
341 for ( i = 0; i < (
int)Message_waves.size(); i++ ) {
349 Message_waves.push_back(extra);
351 return ((
int)Message_waves.size() - 1);
394 WarningEx(
LOCATION,
"Unknown persona in message %s in messages.tbl -- %s\n", msg.
name, persona_name );
409 if (importing_from_fsm && !
strnicmp(avi_name,
"Head-TP1", 8))
441 if (iter->compare(buf) == 0) {
442 msg.
mood = iter - Builtin_moods.begin();
450 Warning(
LOCATION,
"Message.tbl has an entry for mood type %s, but this mood is not in the #Moods section of the table.", buf.c_str());
464 if (!
stricmp(iter->c_str(), parsed_moods->c_str())) {
473 Warning(
LOCATION,
"Message.tbl has an entry for exclude mood type %s, but this mood is not in the #Moods section of the table.", parsed_moods->c_str());
479 Messages.push_back(msg);
485 int i, max_count, min_delay, occurrence_chance;
486 int builtin_type = -1;
492 if (!strcmp(name, Builtin_messages[i].name)) {
498 if (builtin_type == -1) {
499 Warning(
LOCATION,
"Unknown Builtin Message Type Detected. Type : %s not supported", name);
505 if ((occurrence_chance >= 0) && (occurrence_chance <= 100)) {
512 if (max_count > -2) {
513 Builtin_messages[builtin_type].
max_count = max_count;
519 if (min_delay > -1) {
520 Builtin_messages[builtin_type].
min_delay = min_delay;
534 Builtin_moods.push_back(buf);
545 Messages.reserve(500);
546 Message_waves.reserve(300);
547 Message_avis.reserve(30);
555 char *pVawacs25 = strstr(
Mp,
"Vawacs25.wav");
558 char *pAwacs75 = strstr(pVawacs25,
"Awacs75.wav");
563 for (i = 1; i < (pAwacs75 - pVawacs25) - 1; i++)
564 pVawacs25[i] = pVawacs25[i+1];
577 Builtin_moods.push_back(
"Default");
605 if (!(
stricmp(Messages[i].
name, Builtin_messages[j].name))) {
614 generic_message_filenames.clear();
615 generic_message_filenames.push_back(
"none");
616 generic_message_filenames.push_back(
"cuevoice");
617 generic_message_filenames.push_back(
"emptymsg");
618 generic_message_filenames.push_back(
"generic");
619 generic_message_filenames.push_back(
"msgstart");
631 char *ptr = strchr(filename,
'.');
634 Warning(
LOCATION,
"Simulated speech override file '%s' was provided with no extension!", filename);
641 Warning(
LOCATION,
"Simulated speech override file '%s' was provided with an extension other than .wav or .ogg!", filename);
649 generic_message_filenames.push_back(filename);
660 static int table_read = 0;
672 mprintf((
"TABLES: Unable to parse '%s'! Error message = %s.\n",
"messages.tbl", e.what()));
706 Message_waves[
i].num = -1;
716 Playing_messages[
i].
wave = -1;
717 Playing_messages[
i].
id = -1;
728 Message_wave_muted = 0;
733 Message_avis.erase((Message_avis.begin()+
Num_builtin_avis), Message_avis.end());
734 Message_waves.erase((Message_waves.begin()+
Num_builtin_waves), Message_waves.end());
757 mprintf((
"Unloading in mission messages\n"));
768 if ( Message_waves[i].
num != -1 ){
783 if (MessageQ[i].special_message != NULL)
785 vm_free(MessageQ[i].special_message);
795 if (Personas != NULL) {
840 if ( Playing_messages[i].play_anim) {
845 if ( (Playing_messages[i].wave != -1 ) &&
snd_is_playing(Playing_messages[i].wave) ){
846 snd_stop( Playing_messages[i].wave );
854 Num_messages_playing = 0;
869 if ( Playing_messages[message_num].play_anim) {
870 Playing_messages[message_num].
play_anim =
false;
873 if ( (Playing_messages[message_num].wave != -1 ) &&
snd_is_playing(Playing_messages[message_num].wave) )
874 snd_stop( Playing_messages[message_num].wave );
876 Playing_messages[message_num].
shipnum = -1;
894 if ( i == Num_messages_playing ){
907 if ( (Playing_messages[i].
id <
Num_builtin_messages) && (Playing_messages[i].builtin_type == builtin_type) ){
927 if ( i == Num_messages_playing ){
936 #define MESSAGE_GET_HIGHEST 1
937 #define MESSAGE_GET_LOWEST 2
952 }
else if ( (which ==
MESSAGE_GET_LOWEST) && (Playing_messages[i].priority < priority) ){
995 Assertion(index >= 0,
"Invalid index passed!");
997 if ( Message_waves[index].
num >= 0) {
1002 Message_waves[
index].num = -1;
1010 if (Message_waves[index].
num == -1)
1011 nprintf((
"messaging",
"Cannot load message wave: %s. Will not play\n", Message_waves[index].
name));
1020 strcpy_s(truncated_filename, filename);
1021 char *ptr = strchr(truncated_filename,
'.');
1024 if ((ptr == NULL) || (
stricmp(ptr,
".ogg") &&
stricmp(ptr,
".wav")))
1031 for (
unsigned int i = 0;
i < generic_message_filenames.size();
i++)
1033 if (!
stricmp(generic_message_filenames[
i].c_str(), truncated_filename))
1064 Message_waves[
index].num = -1;
1068 p = strchr(filename,
'_' );
1070 mprintf((
"Cannot convert %s to terran command wave -- find Sandeep or Allender\n", Message_waves[index].name));
1078 strcpy_s( filename, new_filename );
1083 if ( Message_waves[index].
num == -1 ) {
1105 float wave_time, anim_time;
1116 wave_time = time/1000.0f;
1120 if ( wave_time >= (anim_time) ) {
1128 int num_frames_extra;
1129 num_frames_extra =
fl2i(fps * (anim_time - wave_time) + 0.5
f);
1130 if ( num_frames_extra > 0 ) {
1131 start_frame=rand()%num_frames_extra;
1135 if ( start_frame < 0 ) {
1152 int is_death_scream=0, persona_index=-1, rand_index=0;
1172 p = strchr(ani_name,
'.');
1185 int subhead_selected =
FALSE;
1197 if (persona_index >= 0)
1203 is_death_scream = 1;
1208 sprintf(ani_name,
"%s%c", temp,
'a'+rand_index);
1209 subhead_selected =
TRUE;
1214 if ( !
strnicmp(ani_name,
"Head-TP", 7) || !
strnicmp(ani_name,
"Head-VP", 7) ) {
1215 mprintf((
"message '%s' incorrectly assigns a command/largeship persona to a wingman animation!\n", m->
name));
1222 sprintf(ani_name,
"%s%c", temp,
'a'+rand_index);
1223 subhead_selected =
TRUE;
1225 mprintf((
"message '%s' uses an unrecognized persona type\n", m->
name));
1229 if (!subhead_selected) {
1233 sprintf(ani_name,
"%s%c", temp,
'a'+rand_index);
1234 mprintf((
"message '%s' with invalid head. Fix by assigning persona to the message.\n", m->
name));
1236 nprintf((
"Messaging",
"playing head %s for %s\n", ani_name, q->
who_from));
1244 nprintf((
"Messaging",
"clearing headani data due to name mismatch: (%s) (%s)\n",
1254 nprintf ((
"messaging",
"Cannot load message avi %s. Will not play.\n", ani_name));
1263 nprintf((
"messaging",
"killing off any currently playing head animations\n"));
1288 bool builtinMessage =
false;
1289 object* sender = NULL;
1303 int ani_done, wave_done, j;
1306 if ( Playing_messages[i].play_anim )
1312 if ( (Playing_messages[i].wave != -1) && (
snd_time_remaining(Playing_messages[i].wave) > 250) )
1320 if ( (Playing_messages[i].wave != -1) && wave_done ) {
1338 if ( Playing_messages[i].shipnum != -1 ) {
1342 shipnum = Playing_messages[
i].
shipnum;
1360 nprintf((
"messaging",
"Message %d is done playing\n", i));
1367 nprintf((
"messaging",
"Collapsing playing message stack\n"));
1369 Playing_messages[j-1] = Playing_messages[j];
1384 nprintf((
"messaging",
"Message %s didn't play because it didn't fit into time window.\n", Messages[q->
message_num].name));
1405 if((MessageQ[idx].min_delay_stamp == -1) ||
timestamp_elapsed(MessageQ[idx].min_delay_stamp)){
1423 memcpy(&temp, &MessageQ[found],
sizeof(
message_q));
1426 for(idx=found; idx>0; idx--){
1427 memcpy(&MessageQ[idx], &MessageQ[idx-1],
sizeof(
message_q));
1431 memcpy(&MessageQ[0], &temp,
sizeof(
message_q));
1457 nprintf((
"messaging",
"Killing all currently playing messages to play unique message\n"));
1468 nprintf((
"messaging",
"Killing all currently playing messages to play high priority builtin\n"));
1475 nprintf((
"messaging",
"playing builtin message (overlap) because priorities match\n"));
1483 nprintf((
"messaging",
"Killing low priority unique messages to play code message\n"));
1512 if ( (Playing_messages[i].shipnum != -1) && (Playing_messages[i].shipnum ==
Message_shipnum) ){
1527 Message_wave_duration = 0;
1588 if ( !
stricmp(who_from,
"<none>") ) {
1623 if ( message_num < 0 )
return;
1634 if ( (MessageQ[i].message_num == message_num) && (MessageQ[i].builtin_type == builtin_type) )
1642 mprintf((
"Message queue already full. Message will not be added!\n"));
1655 m_persona = Messages[message_num].persona_index;
1666 strcpy_s(MessageQ[i].who_from, who_from);
1669 if (MessageQ[i].special_message != NULL)
1672 vm_free(MessageQ[i].special_message);
1690 if ( (m_persona != -1) && (Personas[m_persona].
flags & PERSONA_FLAG_WINGMAN) ) {
1691 if ( !strstr(who_from,
".wav") ) {
1717 int i = 0, ship_type,
count;
1721 if ( shipp != NULL ) {
1755 if ( Personas[i].
flags & persona_needed)
1776 i = (rand() %
count);
1807 mprintf((
"Filtering bogus mission message!\n"));
1817 if(Messages[
id].multi_team < 0){
1828 mprintf((
"Filtering team-based mission message!\n"));
1856 who_from = (
char *)data;
1859 int m_persona, ship_index;
1863 m_persona = Messages[
i].persona_index;
1864 if ( m_persona == -1 ) {
1865 mprintf((
"Warning: Message %s has no persona assigned.\n", Messages[i].name));
1873 if ( ship_index == -1 ) {
1884 shipp = (
ship *)data;
1888 who_from =
"<none>";
1907 nprintf ((
"messaging",
"Couldn't find message id %s to send to player!\n",
id ));
1910 #define BUILTIN_MATCHES_TYPE 0
1911 #define BUILTIN_MATCHES_SPECIES 1
1912 #define BUILTIN_MATCHES_PERSONA_CHECK_MOOD 2
1913 #define BUILTIN_MATCHES_PERSONA_EXCLUDED 3
1914 #define BUILTIN_MATCHES_PERSONA 4
1915 #define BUILTIN_MATCHES_PERSONA_MOOD 5
1927 int i, persona_index = -1, persona_species = -1, message_index = -1, random_selection = -1;
1929 int num_matching_builtins = 0;
1931 int best_match = -1;
1974 if ( persona_index == -1 )
1975 nprintf((
"messaging",
"Couldn't find persona for %s\n", shipp->
ship_name ));
1985 if (persona_index >= 0) {
1986 persona_species = Personas[persona_index].
species;
1993 if ( !
stricmp(Messages[i].name, name) ) {
1999 if ( (persona_species >= 0) && (Personas[Messages[i].persona_index].species == persona_species) ) {
2006 if ( (persona_index >= 0) && (Messages[i].persona_index == persona_index) ) {
2013 for (
SCP_vector<int>::iterator iter = Messages[i].excluded_moods.begin(); iter != Messages[
i].excluded_moods.end(); ++iter) {
2031 num_matching_builtins++;
2036 num_matching_builtins = 1;
2040 matching_builtins.push_back(current_builtin);
2044 switch (best_match) {
2046 nprintf((
"MESSAGING",
"Couldn't find builtin message %s for persona %d with a none excluded mood\n", Builtin_messages[type].name, persona_index));
2047 if (!Personas[persona_index].substitute_missing_messages) {
2048 nprintf((
"MESSAGING",
"Persona does not allow substitution, skipping message."));
2052 nprintf((
"MESSAGING",
"using an excluded message for this persona\n"));
2055 nprintf((
"MESSAGING",
"Couldn't find builtin message %s for persona %d\n", Builtin_messages[type].name, persona_index));
2056 if (!Personas[persona_index].substitute_missing_messages) {
2057 nprintf((
"MESSAGING",
"Persona does not allow substitution, skipping message."));
2061 nprintf((
"MESSAGING",
"using a message for any persona of that species\n"));
2064 nprintf((
"MESSAGING",
"Couldn't find builtin message %s for persona %d\n", Builtin_messages[type].name, persona_index));
2065 if (!Personas[persona_index].substitute_missing_messages) {
2066 nprintf((
"MESSAGING",
"Persona does not allow substitution, skipping message."));
2070 nprintf((
"MESSAGING",
"looking for message for any persona of any species\n"));
2073 Error(
LOCATION,
"Couldn't find any builtin message of type %d\n", type);
2079 random_selection = (
int)(
rand32() % num_matching_builtins) + 1;
2082 for (i = 0; i < (
int)matching_builtins.size(); i++) {
2083 if (matching_builtins[i].type_of_match == best_match) {
2085 if (random_selection == 0) {
2086 message_index = matching_builtins[
i].message_index;
2092 Assertion (random_selection == 0,
"unable to randomly select built in message correctly, still have %d selections left", random_selection);
2130 if(multi_target == -1){
2158 if ( !
stricmp(Personas[i].name, name) )
2182 Assert(Playing_messages[i].wave >= 0 );
2187 was_muted = Message_wave_muted;
2189 Next_mute_time =
fl2i(Distort_patterns[Distort_num][Distort_next++] * Message_wave_duration);
2193 Message_wave_muted ^= 1;
2196 if ( Message_wave_muted ) {
2219 int i, j,
len, run, curr_offset, voice_duration, next_distort;
2226 if ( Message_wave_duration == 0 ) {
2227 next_distort = 5+
myrand()%5;
2228 for ( i = 0; i <
len; i++ ) {
2229 if ( i == next_distort ) {
2233 for ( j = 0; j < run; j++) {
2238 next_distort = i + (5+
myrand()%5);
2244 voice_duration = Message_wave_duration;
2250 while (voice_duration > 0) {
2251 run =
fl2i(Distort_patterns[Distort_num][Distort_next] * len);
2252 if (Distort_next & 1) {
2253 for ( i = curr_offset; i <
MIN(len, curr_offset+run); i++ ) {
2254 if ( text[i] !=
' ' )
2264 voice_duration -=
fl2i(Distort_patterns[Distort_num][Distort_next]*Message_wave_duration);
2280 if(Playing_messages[i].play_anim)
2292 mprintf((
"Paging in mission messages\n"));
2298 char *sound_filename;
2301 if (Messages[i].wave_info.index != -1) {
2302 sound_filename = Message_waves[Messages[
i].wave_info.index].name;
2320 Messages.push_back(msg);
2330 if (!strcmp(Messages[
i].name, name))
2333 Messages[
i].persona_index = persona_index;
2334 Messages[
i].multi_team = multi_team;
2336 Messages[
i].avi_info.index = -1;
2337 Messages[
i].wave_info.index = -1;
2343 return add_message(name, message, persona_index, multi_team);
2356 if (other_shipnum < 0)
2357 return player_comm_state;
2374 return player_comm_state;
void message_queue_message(int message_num, int priority, int timing, char *who_from, int source, int group, int delay, int builtin_type)
#define MESSAGE_TIME_IMMEDIATE
int timestamp(int delta_ms)
#define MY_NET_PLAYER_NUM
#define MESSAGE_REARM_ON_WAY
SCP_vector< message_extra > Message_avis
void message_mission_close()
#define MISSION_FLAG_NO_BUILTIN_MSGS
int stuff_string_list(SCP_vector< SCP_string > &slp)
#define MESSAGE_SOURCE_NONE
#define BUILTIN_MATCHES_PERSONA_MOOD
int message_anim_is_playing()
message_q MessageQ[MAX_MESSAGE_Q]
int message_playing_builtin()
SCP_vector< game_snd > Snds
void message_maybe_distort()
int snd_load(game_snd *gs, int allow_hardware_load)
#define SHIP_GET_NO_PLAYERS
bool Full_color_head_anis
int required_string_one_of(int arg_count,...)
Checks for one of any of the given required strings.
void training_mission_shutdown()
void message_parse(bool importing_from_fsm)
#define MESSAGE_SOURCE_WINGMAN
int gameseq_get_state(void)
void _cdecl void void _cdecl void _cdecl Warning(char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
int generic_anim_load(generic_anim *ga)
char message[MESSAGE_LENGTH]
void _cdecl void void _cdecl void _cdecl void _cdecl WarningEx(char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
#define GR_NUM_RESOLUTIONS
#define PERSONA_FLAG_LARGE
#define MESSAGE_ANYTIME_TIMESTAMP
int hud_gauge_active(int gauge_index)
Determine if the specified HUD gauge should be displayed.
int message_filter_multi(int id)
#define PERSONA_FLAG_COMMAND
#define BUILTIN_MATCHES_PERSONA_EXCLUDED
int snd_is_playing(int sig)
#define Assertion(expr, msg,...)
int message_persona_name_lookup(char *name)
char who_from[NAME_LENGTH]
#define PERSONA_FLAG_WINGMAN
int comm_between_player_and_ship(int other_shipnum)
#define MESSAGE_HIGH_PRAISE
void message_calc_anim_start_frame(int time, generic_anim *ani, int reverse)
struct message_q message_q
GLenum GLuint GLenum GLsizei const GLchar * message
std::basic_string< char, std::char_traits< char >, std::allocator< char > > SCP_string
#define MAX_COMMAND_HEADS
#define MESSAGE_HAMMER_SWINE
void message_frequency_parse()
void HUD_sourced_printf(int source, const char *format,...)
int required_string_either(char *str1, char *str2)
Checks for one of two required strings.
void send_mission_message_packet(int id, char *who_from, int priority, int timing, int source, int builtin_type, int multi_target, int multi_team_filter, int delay)
GLenum GLuint GLenum GLsizei const GLchar * buf
SCP_vector< message_extra > Message_waves
script_state Script_system("FS2_Open Scripting")
void generic_anim_unload(generic_anim *ga)
char filename[MAX_FILENAME_LEN]
iff_info Iff_info[MAX_IFFS]
#define COMMAND_WAVE_PREFIX
#define MAX_DISTORT_LEVELS
SCP_vector< MMessage > Messages
typedef int(SCP_EXT_CALLCONV *SCPDLL_PFVERSION)(SCPDLL_Version *)
SCP_vector< SCP_string > generic_message_filenames
#define MAX_BUILTIN_MESSAGE_TYPES
#define MESSAGE_GET_LOWEST
#define MAX_PERSONA_TYPES
float Master_sound_volume
GLboolean GLboolean GLboolean GLboolean a
#define SF2_NO_DEATH_SCREAM
void message_kill_all(int kill_all)
#define BUILTIN_MATCHES_PERSONA_CHECK_MOOD
#define PERSONA_FLAG_SUPPORT
#define MAX_WINGMAN_HEADS
#define strnicmp(s1, s2, n)
#define SF2_HIDE_SHIP_NAME
int message_get_priority(int which)
void stuff_string(char *outstr, int type, int len, char *terminators)
#define MESSAGE_REARM_REQUEST
int ship_get_random_player_wing_ship(int flags, float max_dist, int persona_index, int get_first, int multi_team)
void message_translate_tokens(char *buf, char *text)
#define MESSAGE_SOURCE_SHIP
sprintf(buf,"(%f,%f,%f)", v3->xyz.x, v3->xyz.y, v3->xyz.z)
#define HEAD_PREFIX_STRING
union MissionMessage::@254 avi_info
int required_string(const char *pstr)
int snd_play(game_snd *gs, float pan, float vol_scale, int priority, bool is_voice_msg)
void message_mission_shutdown()
int optional_string(const char *pstr)
#define MESSAGE_GET_HIGHEST
bool message_play_wave(message_q *q)
#define PERSONA_FLAG_USED
void insertion_sort(void *array_base, size_t array_size, size_t element_size, int(*fncompare)(const void *, const void *))
void read_file_text(const char *filename, int mode, char *processed_text, char *raw_text)
void SetHookObject(char *name, object *objp)
void fsspeech_play(int type, const char *text)
int Valid_builtin_message_types[MAX_BUILTIN_MESSAGE_TYPES]
#define MESSAGE_PRIORITY_LOW
builtin_message Builtin_messages[]
void message_maybe_distort_text(char *text, int shipnum)
#define COMMAND_HEAD_PREFIX
int snd_get_duration(int snd_id)
object Objects[MAX_OBJECTS]
int message_playing_unique()
int hud_disabled()
Checks if HUD disabled.
bool change_message(char *name, char *message, int persona_index, int multi_team)
void stuff_boolean(int *i, bool a_to_eol)
#define MAX_DISTORT_PATTERNS
void message_remove_from_queue(message_q *q)
bool end_string_at_first_hash_symbol(char *src)
#define MAX_PLAYING_MESSAGES
#define BUILTIN_MATCHES_SPECIES
int hud_communications_state(ship *sp)
void _cdecl void void _cdecl Error(const char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
#define SF2_NO_BUILTIN_MESSAGES
void reset_parse(char *text)
GLuint const GLchar * name
void hud_target_last_transmit_add(int ship_num)
union MissionMessage::@255 wave_info
int RunCondition(int condition, char format='\0', void *data=NULL, class object *objp=NULL, int more_data=0)
#define _strnicmp(s1, s2, n)
pmessage Playing_messages[MAX_PLAYING_MESSAGES]
#define vm_realloc(ptr, size)
char command_sender[NAME_LENGTH]
int multi_message_should_broadcast(int type)
bool sexp_replace_variable_names_with_values(char *text, int max_len)
GLboolean GLboolean GLboolean b
void message_kill_playing(int message_num)
#define MESSAGE_PRIORITY_HIGH
#define GENERIC_ANIM_DIRECTION_NOLOOP
bool add_message(char *name, char *message, int persona_index, int multi_team)
bool fsspeech_play_from(int type)
int HUD_team_get_source(int team)
GLdouble GLdouble GLdouble GLdouble q
int add_avi(char *avi_name)
#define MESSAGE_SOON_TIMESTAMP
#define MQF_CONVERT_TO_COMMAND
int message_queue_priority_compare(const void *a, const void *b)
struct matching_builtin matching_builtin
int snd_time_remaining(int handle)
void ship_scream(ship *sp)
#define HUD_SOURCE_TERRAN_CMD
#define MESSAGE_REARM_PRIMARIES
#define MESSAGE_TIME_ANYTIME
void message_send_builtin_to_player(int type, ship *shipp, int priority, int timing, int group, int delay, int multi_target, int multi_team_filter)
bool message_filename_is_generic(char *filename)
void generic_anim_init(generic_anim *ga)
bool substitute_missing_messages
int message_get_persona(ship *shipp)
void RemHookVars(unsigned int num,...)
#define MULTIPLAYER_MASTER
void message_send_unique_to_player(char *id, void *data, int m_source, int priority, int group, int delay)
void snd_set_volume(int sig, float volume)
SCP_vector< ship_info > Ship_info
GLenum GLsizei GLenum GLenum const GLvoid * data
#define MESSAGE_WINGMAN_SCREAM
#define timestamp_elapsed(stamp)
SCP_vector< species_info > Species_info
void SetHookVar(char *name, char format, void *data=NULL)
#define MISSION_FLAG_NO_BUILTIN_COMMAND
#define SF2_ALWAYS_DEATH_SCREAM
#define BUILTIN_MATCHES_TYPE
void hud_stuff_ship_class(char *ship_class_text, ship *shipp)
GLsizei GLsizei GLchar * source
void message_queue_process()
int Default_command_persona
#define IFFF_WING_NAME_HIDDEN
SCP_vector< SCP_string > Builtin_moods
char filename[MAX_FILENAME_LEN]
void message_play_anim(message_q *q)
int ship_name_lookup(const char *name, int inc_players)
SCP_vector< int > excluded_moods
#define SF_SHIP_HAS_SCREAMED
void hud_stuff_ship_callsign(char *ship_callsign_text, ship *shipp)
#define MESSAGE_SOURCE_SPECIAL
#define BUILTIN_MATCHES_PERSONA
#define MESSAGE_SOURCE_COMMAND
char * Persona_type_names[MAX_PERSONA_TYPES]
int message_playing_specific_builtin(int builtin_type)
int generic_anim_stream(generic_anim *ga)
int Head_coords[GR_NUM_RESOLUTIONS][2]
sound to indicate voice is about to start
#define timestamp_valid(stamp)
void message_load_wave(int index, const char *filename)
char ship_name[NAME_LENGTH]
void message_mission_free_avi(int m_index)
int add_wave(const char *wave_name)
#define MESSAGE_TIME_SOON
void message_pagein_mission_messages()
void message_moods_parse()
int snd_play_raw(int soundnum, float pan, float vol_scale, int priority)
#define MESSAGE_IMMEDIATE_TIMESTAMP