11 #define REDALERT_INTERNAL 
   44 static int Red_alert_new_mission_timestamp;             
 
   46 static int Red_alert_voice_started;
 
   89 #define RA_REPLAY_MISSION                               0 
  103 #define RED_ALERT_NUM_TEXT              3 
  124 static int Text_delay;
 
  137 static int Background_bitmap;
 
  138 static int Red_alert_inited = 0;
 
  140 static int Red_alert_voice;
 
  154         if ( Red_alert_voice != -1 ) {
 
  156                 Red_alert_voice = -1;
 
  167         if ( Red_alert_voice < 0 ) {
 
  175                         Red_alert_voice_started = 1;
 
  183                 Red_alert_voice_started = 1;
 
  190         if ( !Red_alert_voice_started )
 
  193         if (Red_alert_voice < 0) {
 
  203         if ( !Red_alert_voice_started )
 
  206         if (Red_alert_voice < 0) {
 
  215         if ( !Red_alert_voice_started )
 
  218         if (Red_alert_voice < 0) {
 
  260 #define RA_FLASH_CYCLE                  0.25f 
  265         const char *str = 
XSTR(
"Incoming Transmission", 1406);
 
  302         if ( Red_alert_inited ) {
 
  330         Red_alert_voice = -1;
 
  351         Red_alert_voice_started = 0;
 
  352         Red_alert_inited = 1;
 
  358         if (Red_alert_inited) {
 
  365                 if (Background_bitmap >= 0) {
 
  375         Red_alert_inited = 0;
 
  386         if (!Red_alert_inited) {
 
  415         if (Background_bitmap >= 0) {
 
  426                 int finished_wipe = 0;
 
  445         Red_alert_new_mission_timestamp = 
timestamp(-1);                
 
  456         ras->primary_weapons.clear();
 
  457         ras->secondary_weapons.clear();
 
  467                 if (weapons.
index < 0) {
 
  482                 ras->primary_weapons.push_back( weapons );
 
  488                 if (weapons.
index < 0) {
 
  494                 ras->secondary_weapons.push_back( weapons );
 
  501         int i, list_size = 0;
 
  504         if ( (ras->ship_class == RED_ALERT_DESTROYED_SHIP_CLASS) || (ras->ship_class == RED_ALERT_PLAYER_DEL_SHIP_CLASS) ) {
 
  509         list_size = (
int)ras->primary_weapons.size();
 
  511         for (i = 0; i < list_size; i++) {
 
  512                 Assert( ras->primary_weapons[i].index >= 0 );
 
  525         list_size = (
int)ras->secondary_weapons.size();
 
  527         for (i = 0; i < list_size; i++) {
 
  528                 Assert( ras->secondary_weapons[i].index >= 0 );
 
  538         int i, list_size = 0;
 
  543         if ( (ras->ship_class == RED_ALERT_DESTROYED_SHIP_CLASS) || (ras->ship_class == RED_ALERT_PLAYER_DEL_SHIP_CLASS) )
 
  559                 Warning(
LOCATION, 
"Parse object data for ship '%s' doesn't contain the 'Pilot' subsystem!", pobjp->
name);
 
  564         list_size = (
int)ras->primary_weapons.size();
 
  566         for (i = 0; i < list_size; i++)
 
  568                 Assert( ras->primary_weapons[i].index >= 0 );
 
  574                         sssp->
primary_ammo[
i] = 
fl2i(100.0
f * (ras->primary_weapons[i].count - 2) / max_count + 0.5f);
 
  581         list_size = (
int)ras->secondary_weapons.size();
 
  583         for (i = 0; i < list_size; i++)
 
  585                 Assert( ras->secondary_weapons[i].index >= 0 );
 
  600         if ( (ras->ship_class == RED_ALERT_DESTROYED_SHIP_CLASS) || (ras->ship_class == RED_ALERT_PLAYER_DEL_SHIP_CLASS) ) {
 
  610                 } 
catch (std::out_of_range 
range) {
 
  622         list_size = (
int)ras->subsys_aggregate_current_hits.size();
 
  624         for (i = 0; i < list_size; i++) {
 
  639         if ( (ras->ship_class == RED_ALERT_DESTROYED_SHIP_CLASS) || (ras->ship_class == RED_ALERT_PLAYER_DEL_SHIP_CLASS) )
 
  646         for (i = 0; i < (
int) ras->subsys_current_hits.size(); i++)
 
  654                 if (j < pobjp->subsys_count)
 
  671                 float current_hits = ras->subsys_current_hits[
i];
 
  673                 sssp->
percent = 100.0f * (max_hits - current_hits) / max_hits;
 
  683         ras->subsys_current_hits.clear();
 
  684         ras->subsys_aggregate_current_hits.clear();
 
  711         red_alert_ship_status   ras;
 
  720         Red_alert_wingman_status.clear();
 
  742                 Red_alert_wingman_status.push_back( ras );
 
  755                                 ras.ship_class = RED_ALERT_DESTROYED_SHIP_CLASS;
 
  758                                 ras.ship_class = RED_ALERT_PLAYER_DEL_SHIP_CLASS;
 
  769                         Red_alert_wingman_status.push_back( ras );
 
  775         Assert( !Red_alert_wingman_status.empty() );
 
  782                 if (ship_state == RED_ALERT_DESTROYED_SHIP_CLASS) {
 
  784                 } 
else if (ship_state == RED_ALERT_PLAYER_DEL_SHIP_CLASS) {
 
  787                         Error(
LOCATION, 
"Red Alert: asked to delete ship (%s) with invalid ship state (%d)", shipp->
ship_name, ship_state);
 
  801         if (ship_state == RED_ALERT_DESTROYED_SHIP_CLASS || ship_state == RED_ALERT_PLAYER_DEL_SHIP_CLASS)
 
  809                 Error(
LOCATION, 
"Red Alert: asked to delete ship (%s) with invalid ship state (%d)", pobjp->
name, ship_state);
 
  832         if ( Red_alert_wingman_status.empty() ) {
 
  850                 bool ship_data_restored = 
false;
 
  851                 int ship_state = RED_ALERT_DESTROYED_SHIP_CLASS;
 
  853                 for ( rasii = Red_alert_wingman_status.begin(); rasii != Red_alert_wingman_status.end(); ++rasii )
 
  855                         red_alert_ship_status *ras = &(*rasii);
 
  861                                 if ( (ras->ship_class != RED_ALERT_DESTROYED_SHIP_CLASS) && (ras->ship_class != RED_ALERT_PLAYER_DEL_SHIP_CLASS) )
 
  866                                                 if (ras->ship_class >= 0 && ras->ship_class < static_cast<int>(
Ship_info.size()))
 
  869                                                         mprintf((
"Invalid ship class specified in red alert data for ship %s. Using mission defaults.\n", shipp->
ship_name));
 
  873                                         if (ras->hull >= 0.0f && ras->hull <= ship_objp->
hull_strength)
 
  876                                                 mprintf((
"Invalid health in red alert data for ship %s. Using mission defaults.\n", shipp->
ship_name));
 
  882                                         ship_data_restored = 
true;
 
  887                                         ship_state = ras->ship_class;
 
  896                 if ( !ship_data_restored ) {
 
  921                 bool from_player_wing = 
false;
 
  928                                         from_player_wing = 
true;
 
  939                 bool ship_data_restored = 
false;
 
  940                 int ship_state = RED_ALERT_DESTROYED_SHIP_CLASS;
 
  942                 for ( rasii = Red_alert_wingman_status.begin(); rasii != Red_alert_wingman_status.end(); ++rasii )
 
  944                         red_alert_ship_status *ras = &(*rasii);
 
  950                                 if ( (ras->ship_class != RED_ALERT_DESTROYED_SHIP_CLASS) && (ras->ship_class != RED_ALERT_PLAYER_DEL_SHIP_CLASS) )
 
  955                                                 if (ras->ship_class >= 0 && ras->ship_class < static_cast<int>(
Ship_info.size()))
 
  959                                                         mprintf((
"Invalid ship class specified in red alert data for ship %s. Using mission defaults.\n", pobjp->
name));
 
  970                                                 mprintf((
"Invalid health in red alert data for ship %s. Using mission defaults.\n", pobjp->
name));
 
  976                                         ship_data_restored = 
true;
 
  981                                         ship_state = ras->ship_class;
 
  990                 if ( !ship_data_restored )
 
  995                                 Wing_pobjects_deleted[pobjp->
wingnum]++;
 
 1000         for (ii = Wing_pobjects_deleted.begin(); ii != Wing_pobjects_deleted.end(); ++ii)
 
 1016                                 if (pobjp->wingnum == ii->first)
 
 1053                         Red_alert_new_mission_timestamp = 
timestamp(RED_ALERT_WARN_TIME);
 
 1105         Red_alert_wingman_status.clear();
 
void ship_wing_cleanup(int shipnum, wing *wingp)
 
void red_alert_voice_pause()
 
void set_highlight_action(void(*_user_function)(void))
 
void hud_set_wingman_status_none(int wing_index, int wing_pos)
 
char Starting_wing_names[MAX_STARTING_WINGS][NAME_LENGTH]
 
void red_alert_do_frame(float frametime)
 
int timestamp(int delta_ms)
 
void fsspeech_pause(bool playing)
 
int secondary_ammo[MAX_SHIP_SECONDARY_BANKS]
 
char wing_status_wing_pos
 
int Briefing_voice_enabled
 
void mouse_set_pos(int xpos, int ypos)
 
void add_XSTR(char *string, int _xstr_id, int _x, int _y, UI_GADGET *_assoc, int _color_type, int _font_id=-1)
 
int primary_bank_weapons[MAX_SHIP_PRIMARY_BANKS]
 
#define MAX_SHIP_PRIMARY_BANKS
 
GLfloat GLfloat GLfloat GLfloat h
 
#define RA_REPLAY_MISSION
 
char Game_current_mission_filename[MAX_FILENAME_LEN]
 
weapon_info Weapon_info[MAX_WEAPON_TYPES]
 
int insert_subsys_status(p_object *pobjp)
 
SCP_vector< game_snd > Snds
 
submodel_instance_info submodel_info_1
 
void red_alert_voice_load()
 
char wing_status_wing_index
 
void red_alert_button_pressed(int n)
 
SCP_vector< p_object > Parse_objects
 
int brief_color_text_init(const char *src, int w, const char default_color, int instance, int max_lines, const bool append)
 
void swap_parse_object(p_object *p_obj, int new_ship_class)
 
brief_stage stages[MAX_BRIEF_STAGES]
 
void ship_add_exited_ship(ship *sp, int reason)
 
void _cdecl void void _cdecl void _cdecl Warning(char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
 
void red_alert_store_subsys_status(red_alert_ship_status *ras, ship *shipp)
 
#define GR_NUM_RESOLUTIONS
 
SCP_string Red_alert_precursor_mission
 
void gr_init_alphacolor(color *clr, int r, int g, int b, int alpha, int type)
 
__inline void gr_string(int x, int y, const char *string, int resize_mode=GR_RESIZE_FULL)
 
int Ra_flash_font[GR_NUM_RESOLUTIONS]
 
int secondary_banks[MAX_SHIP_SECONDARY_BANKS]
 
general failure sound for any event 
 
#define SHIP_INDEX(shipp)
 
int red_alert_in_progress()
 
#define SEF_PLAYER_DELETED
 
char background[GR_NUM_RESOLUTIONS][MAX_FILENAME_LEN]
 
#define END_OF_LIST(head)
 
int primary_ammo[MAX_SHIP_PRIMARY_BANKS]
 
#define GR_MAYBE_CLEAR_RES(bmap)
 
model_subsystem * subsystems
 
#define P2_RED_ALERT_DELETED
 
SCP_vector< red_alert_ship_status > Red_alert_wingman_status
 
void red_alert_store_wingman_status()
 
void gr_set_color_fast(color *dst)
 
void mission_campaign_mission_over(bool do_next_mission)
 
void weapon_select_close_team()
 
UI_XSTR Red_alert_text[GR_NUM_RESOLUTIONS][RED_ALERT_NUM_TEXT]
 
std::basic_string< char, std::char_traits< char >, std::allocator< char > > SCP_string
 
void gr_set_bitmap(int bitmap_num, int alphablend_mode, int bitblt_mode, float alpha)
 
briefing Briefings[MAX_TVT_TEAMS]
 
ship_subsys_info subsys_info[SUBSYSTEM_MAX]
 
int bm_release(int handle, int clear_render_targets)
Frees both a bitmap's data and it's associated slot. 
 
void red_alert_voice_stop()
 
#define SHIP_GUARDIAN_THRESHOLD_DEFAULT
 
#define CLAMP(x, min, max)
 
int audiostream_is_playing(int i)
 
void red_alert_delete_ship(ship *shipp, int ship_state)
 
void red_alert_voice_unpause()
 
int mission_campaign_previous_mission()
 
typedef int(SCP_EXT_CALLCONV *SCPDLL_PFVERSION)(SCPDLL_Version *)
 
#define MAX_SHIP_SECONDARY_BANKS
 
void set_mask_bmap(char *fname)
 
#define MISSION_FLAG_NO_BRIEFING
 
int set_bmaps(char *ani_filename, int nframes=3, int start_frame=1)
 
void red_alert_start_mission()
 
char voice[MAX_FILENAME_LEN]
 
void common_free_interface_palette()
 
void mission_parse_fixup_players()
 
#define P_SF_RED_ALERT_STORE_STATUS
 
void audiostream_stop(int i, int rewind, int paused)
 
void scoring_level_close(int accepted)
 
int primary_bank_ammo[MAX_SHIP_PRIMARY_BANKS]
 
#define MISSION_FLAG_RED_ALERT
 
#define strnicmp(s1, s2, n)
 
void red_alert_store_weapons(red_alert_ship_status *ras, ship_weapon *swp)
 
void weapon_select_common_init()
 
#define MAX_STARTING_WINGS
 
float ship_max_hull_strength
 
int primary_banks[MAX_SHIP_PRIMARY_BANKS]
 
#define SEF_RED_ALERT_CARRY
 
int snd_play(game_snd *gs, float pan, float vol_scale, int priority, bool is_voice_msg)
 
#define P_SF_CANNOT_ARRIVE
 
int secondary_bank_weapons[MAX_SHIP_SECONDARY_BANKS]
 
void ai_post_process_mission()
 
char * Red_alert_mask[GR_NUM_RESOLUTIONS]
 
float aggregate_current_hits
 
int secondary_bank_ammo_capacity[MAX_SHIP_SECONDARY_BANKS]
 
float max_subsys_strength
 
void red_alert_maybe_move_to_next_mission()
 
void fsspeech_play(int type, const char *text)
 
int secondary_bank_ammo[MAX_SHIP_SECONDARY_BANKS]
 
void audiostream_unpause(int i, bool via_sexp_or_script)
 
int primary_bank_ammo_capacity[MAX_SHIP_PRIMARY_BANKS]
 
void ship_select_common_init()
 
object Objects[MAX_OBJECTS]
 
void red_alert_voice_unload()
 
const char * XSTR(const char *str, int index)
 
void red_alert_bash_weapons(red_alert_ship_status *ras, ship_weapon *swp)
 
int red_alert_skipped_ships
 
int ship_guardian_threshold
 
void _cdecl void void _cdecl Error(const char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
 
void set_hotkey(int keycode)
 
void red_alert_blit_title()
 
void mission_goal_fail_incomplete()
 
#define SF_RED_ALERT_STORE_STATUS
 
GLboolean GLboolean GLboolean b
 
void audiostream_close_file(int i, int fade)
 
bool fsspeech_play_from(int type)
 
typedef float(SCP_EXT_CALLCONV *SCPTRACKIR_PFFLOATVOID)()
 
void mission_campaign_eval_next_mission()
 
void obj_delete(int objnum)
 
void mission_campaign_store_goals_and_events_and_variables()
 
void red_alert_bash_subsys_status(red_alert_ship_status *ras, ship *shipp)
 
void link_hotspot(int num)
 
#define RED_ALERT_NUM_TEXT
 
void create(UI_WINDOW *wnd, char *_text, int _x, int _y, int _w, int _h, int do_repeat=0, int ignore_focus=0)
 
#define UI_XSTR_COLOR_PINK
 
void create(int _x, int _y, int _w, int _h, int _flags, int _f_id=-1)
 
void gr_get_string_size(int *w, int *h, const char *text, int len=9999)
 
void hud_set_wingman_status_dead(int wing_index, int wing_pos)
 
char subobj_name[MAX_NAME_LEN]
 
char default_redalert_briefing_color
 
void red_alert_voice_play()
 
SCP_vector< ship_info > Ship_info
 
void common_play_highlight_sound()
 
#define timestamp_elapsed(stamp)
 
char * Red_alert_fname[GR_NUM_RESOLUTIONS]
 
SCP_vector< exited_ship > Ships_exited
 
void audiostream_play(int i, float volume, int looping)
 
void change_ship_type(int n, int ship_type, int by_sexp)
 
void red_alert_invalidate_timestamp()
 
int brief_render_text(int line_offset, int x, int y, int h, float frametime, int instance, int line_spacing)
 
void gr_bitmap(int _x, int _y, int resize_mode)
 
p_object Ship_arrival_list
 
int mission_ui_background_load(const char *custom_background, const char *single_background, const char *multi_background)
 
int audiostream_open(const char *filename, int type)
 
subsys_status * Subsys_status
 
void audiostream_pause(int i, bool via_sexp_or_script)
 
void gamesnd_play_iface(int n)
 
struct ui_button_info ui_button_info
 
void gr_set_font(int fontnum)
 
bool Red_alert_applies_to_delayed_ships
 
int Ra_brief_text_wnd_coords[GR_NUM_RESOLUTIONS][4]
 
void red_alert_bash_wingman_status()
 
#define SF_FROM_PLAYER_WING
 
int process(int key_in=-1, int process_mouse=1)
 
void gameseq_post_event(int event)
 
#define timestamp_valid(stamp)
 
char ship_name[NAME_LENGTH]
 
float Master_voice_volume
 
int Ra_flash_y[GR_NUM_RESOLUTIONS]