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]