39 #define DEFAULT_MSG_TIMEOUT (8 * 1000) // number of seconds * 1000 to get milliseconds
40 #define MSG_KEY_EAT_TIME (300)
111 #define MAX_MENU_ITEMS 50 // max number of items in the menu
112 #define MAX_MENU_DISPLAY 10 // max number that can be displayed
131 #define MAX_KEYS_NO_SCROLL 10
132 #define MAX_KEYS_USED 12 // maximum number of keys used for the messaging system
139 int keys_used[] = {
KEY_1,
KEY_2,
KEY_3,
KEY_4,
KEY_5,
KEY_6,
KEY_7,
KEY_8,
KEY_9,
KEY_0,
147 #define NUM_COMM_ORDER_TYPES 6
149 #define TYPE_SHIP_ITEM 0
150 #define TYPE_WING_ITEM 1
151 #define TYPE_ALL_FIGHTERS_ITEM 2
152 #define TYPE_REINFORCEMENT_ITEM 3
153 #define TYPE_REPAIR_REARM_ITEM 4
154 #define TYPE_REPAIR_REARM_ABORT_ITEM 5
198 const char *temp_comm_order_types[] =
202 XSTR(
"All Fighters", 295),
203 XSTR(
"Reinforcements", 296),
204 XSTR(
"Rearm/Repair Subsys", 297),
205 XSTR(
"Abort Rearm", 298)
215 strcpy_s(Comm_orders[i].
name,
XSTR(Sexp_comm_orders[i].name, Sexp_comm_orders[i].xstring));
216 Comm_orders[
i].
item = Sexp_comm_orders[
i].
item;
227 if (Comm_orders[i].item == item)
228 return Comm_orders[
i].
name;
336 Assertion(shipp !=
nullptr,
"hud_squadmsg_ship_valid() was passed a null shipp pointer; get a coder!\n");
397 Assertion(shipp->
objnum != -1,
"hud_squadmsg_count_ships() discovered that ship #%d ('%s') has an objnum of -1. Since the ship was retrieved from its object number (%d), this should be impossible; get a coder!\n", objp->
instance, shipp->
ship_name, so->
objnum);
453 if (
Ships[ship_num].orders_accepted == 0)
503 if ( j < MAX_STARTING_WINGS )
555 return num_keys_used;
562 int i, key_found, num_keys_used;
570 for (i = 0; i < num_keys_used; i++ ) {
580 for (i = 0; i < num_keys_used; i++ ) {
605 int k,
i, num_keys_used;
620 for ( i = 0; i < num_keys_used; i++ ) {
673 int multi_player_num;
674 int multi_player_team;
680 multi_player_num = -1;
681 multi_player_team = -1;
685 Assert(multi_player_num != -1);
686 if (multi_player_num != -1) {
690 multi_player_team = -1;
701 if ( robjnum != -1 ) {
706 if ( robjnum != -1) {
807 int target_objnum,
i;
817 if ( Comm_orders[i].item == order )
820 Assert( i < NUM_COMM_ORDER_ITEMS );
831 if ( target_objnum == -1 ) {
835 objp = &
Objects[target_objnum];
925 if ( player_num != -1 )
958 shipp = &
Ships[shipnum];
961 if ( shipp->
team != ordering_shipp->
team )
974 if (
Wings[i].current_count > 0 ) {
1046 #define OVERRIDE_PROTECT_SHIP_TYPE (SIF_FIGHTER|SIF_BOMBER|SIF_FREIGHTER|SIF_TRANSPORT)
1056 int ai_mode, ai_submode;
1057 char *target_shipname;
1059 int target_team, ship_team;
1060 ship *ordering_shipp;
1062 int special_index = -1;
1063 int message_team_filter = -1;
1080 ai_submode = -1234567;
1083 if ( player_num != -1 ){
1085 message_team_filter = Net_players[player_num].p_info.team;
1099 target_shipname = NULL;
1113 switch ( command ) {
1116 Assert( target_shipname );
1117 Assert( ship_team != target_team );
1135 Assert( target_shipname );
1136 Assert( ship_team != target_team );
1149 Assert( target_shipname );
1150 Assert( ship_team != target_team );
1163 Assert( target_shipname );
1164 Assert( ship_team != target_team );
1175 special_index = ai_submode;
1180 Assert( target_shipname );
1181 Assert( ship_team != target_team );
1200 Assert( target_shipname );
1201 Assert( ship_team == target_team );
1209 Assert( target_shipname );
1210 Assert( ship_team != target_team );
1219 target_shipname = ordering_shipp->
ship_name;
1227 target_shipname = ordering_shipp->
ship_name;
1239 target_shipname = NULL;
1283 target_shipname = ordering_shipp->
ship_name;
1300 Assert(ai_submode != -1234567);
1327 return send_message;
1339 int ai_mode, ai_submode;
1340 char *target_shipname;
1342 int target_team, wing_team;
1343 ship *ordering_shipp;
1345 int special_index = -1;
1346 int message_team_filter = -1;
1363 ai_submode = -1234567;
1366 if ( player_num != -1 ) {
1368 message_team_filter = Net_players[player_num].p_info.team;
1384 target_shipname = NULL;
1400 switch ( command ) {
1403 Assert( target_shipname );
1404 Assert( wing_team != target_team );
1423 Assert( target_shipname );
1424 Assert( wing_team != target_team );
1432 Assert( target_shipname );
1433 Assert( wing_team != target_team );
1441 Assert( target_shipname );
1442 Assert( wing_team != target_team );
1448 special_index = ai_submode;
1454 Assert( target_shipname );
1455 Assert( wing_team == target_team );
1463 Assert( target_shipname );
1464 Assert( wing_team != target_team );
1473 target_shipname = ordering_shipp->
ship_name;
1481 target_shipname = ordering_shipp->
ship_name;
1493 target_shipname = NULL;
1517 Assert(ai_submode != -1234567);
1541 if ( send_message ) {
1548 if(ship_num == -1 && (
Game_mode & GM_MULTIPLAYER)){
1556 if ( ship_num != -1 ) {
1562 return message_sent;
1598 if ( p_objp != NULL ) {
1635 MsgItems[i].active = 0;
1831 if ( i == Num_wings ) {
1904 if ( p_objp != NULL ) {
1961 int i, orders, default_orders;
1974 orders = default_orders;
1982 if ( default_orders & Comm_orders[i].item ) {
1988 if ( orders & Comm_orders[i].item )
2005 int partial_accept, all_accept;
2007 all_accept = Comm_orders[
i].
item;
2024 if ( !all_accept ) {
2026 if ( partial_accept ) {
2061 int default_orders,
i, orders, shipnum;
2072 default_orders |= orders;
2078 Assertion(shipnum >= 0,
"Special ship (%d) for wing '%s' has a negative ship_index (%d). This should not happen; get a coder!\n", wingp->
special_ship, wingp->
name, shipnum);
2083 if ( default_orders & Comm_orders[i].item ) {
2091 if ( orders & Comm_orders[i].item )
2166 Squadmsg_history.clear();
2395 if (!strcmp(name,
"All Fighters")) {
2405 Squadmsg_history.push_back(*latest_order);
2406 delete latest_order;
2418 else if (order_source == -1) {
2430 if (strcmp(to,
"<all fighters>")) {
2435 if (target_name != NULL) {
2446 order = Comm_orders[
i].
item;
2451 if (!
stricmp(order_name,
"Attack my target"))
2454 order = Comm_orders[
i].
item;
2459 for (i = 0; i < (
int)Squadmsg_history.size(); i++) {
2460 if (Squadmsg_history[i].order == order) {
2461 if (ship_or_wing == Squadmsg_history[i].order_to) {
2463 if ((!timestamp) || (Squadmsg_history[
i].order_time +
i2f(timestamp) >=
Missiontime) ) {
2466 if ((
source != -1) && (Squadmsg_history[
i].order_from !=
source)) {
2473 if (special_argument == NULL) {
2485 if (Squadmsg_history[i].special_index != subsys_index) {
2584 bool draw_bright =
false;
2632 int bx,
by, sx, sy,
i, nitems, none_valid, messaging_allowed;
2664 sy =
position[1] + Item_start_offsets[1];
2671 messaging_allowed = 1;
2674 messaging_allowed = 0;
2677 for ( i = 0; i < nitems; i++ ) {
2751 if ( messaging_allowed ) {
virtual void initialize()
char Parse_names[MAX_SHIPS+MAX_WINGS][NAME_LENGTH]
#define MESSAGE_PRIORITY_NORMAL
#define REARM_REPAIR_ME_ITEM
#define SHIP_GET_UNSILENCED
#define SQUAD_MSG_REINFORCEMENT
int timestamp(int delta_ms)
#define MULTIPLAYER_CLIENT
#define MESSAGE_REARM_ON_WAY
#define SM_MODE_ALL_FIGHTERS
model_subsystem * system_info
weapon Weapons[MAX_WEAPONS]
int hud_squadmsg_get_total_keys()
int ai_abort_rearm_request(object *requester_objp)
#define LOG_PLAYER_CALLED_FOR_REARM
void initBitmaps(char *fname_top, char *fname_middle, char *fname_bottom)
void initPgDnOffsets(int x, int y)
void mission_log_add_entry(int type, char *pname, char *sname, int info_index)
int is_instructor(object *objp)
#define PROTECT_TARGET_ITEM
GLfloat GLfloat GLfloat GLfloat h
void hud_squadmsg_rearm_shortcut()
weapon_info Weapon_info[MAX_WEAPON_TYPES]
SCP_vector< game_snd > Snds
mmode_item MsgItems[MAX_MENU_ITEMS]
int hud_query_order_issued(char *to, char *order_name, char *target_name, int timestamp, char *from, char *special_argument)
struct key_store key_store
GLsizei const GLfloat * value
void ai_add_ship_goal_player(int type, int mode, int submode, char *shipname, ai_info *aip)
#define SF2_NO_SUBSPACE_DRIVE
void ai_add_wing_goal_player(int type, int mode, int submode, char *shipname, int wingnum)
void setGaugeColor(int bright_index=-4)
void hud_squadmsg_call_reinforcement(int reinforcement_num, int player_num)
#define SQUADMSG_HISTORY_ADD_ENTRY
#define NUM_COMM_ORDER_ITEMS
void _cdecl void void _cdecl void _cdecl Warning(char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
void hud_init_squadmsg(void)
LOCAL int Msg_mode_timestamp
#define GR_NUM_RESOLUTIONS
int hud_squadmsg_send_wing_command(int wingnum, int command, int send_message, int update_history, int player_num)
general failure sound for any event
#define AI_GOAL_STAY_NEAR_SHIP
#define STAY_NEAR_TARGET_ITEM
#define AI_GOAL_CHASE_ANY
#define WF_RESET_REINFORCEMENT
void hud_squadmsg_do_mode(int mode)
#define NETPLAYER_IS_OBSERVER(player)
#define STAY_NEAR_ME_ITEM
LOCAL int Msg_eat_key_timestamp
#define MAX_KEYED_TARGETS
#define CAPTURE_TARGET_ITEM
#define SHIP_INDEX(shipp)
void hud_squadmsg_type_select()
ai_info Ai_info[MAX_AI_INFO]
#define Assertion(expr, msg,...)
#define END_OF_LIST(head)
#define AI_GOAL_DISARM_SHIP
ship_subsys * targeted_subsys
void initBottomBgOffset(int offset)
GLenum GLuint GLenum GLsizei const GLchar * message
int Menu_pgup_coords[GR_NUM_RESOLUTIONS][2]
#define MESSAGE_ALL_FIGHTERS
#define ENEMY_TARGET_MESSAGES
#define DEFAULT_MSG_TIMEOUT
#define HUD_OBJECT_SQUAD_MSG
void HUD_sourced_printf(int source, const char *format,...)
ship_subsys_info subsys_info[SUBSYSTEM_MAX]
#define TYPE_REPAIR_REARM_ABORT_ITEM
int multi_msg_eval_wing_squadmsg(int wingnum, int command, ai_info *aif, int player_num)
int bm_load_animation(const char *real_filename, int *nframes, int *fps, int *keyframe, int can_drop_frames, int dir_type)
Loads a bitmap sequance so we can draw with it.
int Mbox_item_h[GR_NUM_RESOLUTIONS]
#define AIG_TYPE_PLAYER_SHIP
int hud_support_find_closest(int objnum)
Locate the closest support ship which is trying to dock with player.
reinforcements Reinforcements[MAX_REINFORCEMENTS]
#define SM_MODE_WING_SELECT
#define DISARM_TARGET_ITEM
void hud_squadmsg_page_down()
int hud_squadmsg_wing_valid(wing *wingp)
#define IGNORE_TARGET_ITEM
int key_down_count(int scancode)
typedef int(SCP_EXT_CALLCONV *SCPDLL_PFVERSION)(SCPDLL_Version *)
#define DEPART_AT_DOCK_BAY
key_store key_save[MAX_KEYS_USED]
#define ATTACK_TARGET_ITEM
p_object * mission_parse_get_arrival_ship(const char *name)
Returns the parse object on the ship arrival list associated with the given name. ...
void initItemHeight(int h)
void hud_squadmsg_wing_select()
int ship_get_reinforcement_team(int r_index)
void render(float frametime)
#define ENGAGE_ENEMY_ITEM
#define TYPE_REINFORCEMENT_ITEM
bool hud_squadmsg_exist_fighters()
squadmate message menu disappears
SCP_vector< squadmsg_history > Squadmsg_history
void hud_squadmsg_ship_command()
#define WF_WING_DEPARTING
#define MAX_STARTING_WINGS
void hud_squadmsg_msg_all_fighters()
void send_player_order_packet(int type, int index, int cmd)
void hud_add_issued_order(char *name, int order)
void hud_squadmsg_send_to_all_fighters(int command, int player_num)
#define TYPE_REPAIR_REARM_ITEM
void hud_enemymsg_toggle()
#define HUD_SOURCE_HIDDEN
#define MESSAGE_DISABLE_TARGET
sexp_com_order Sexp_comm_orders[]
int snd_play(game_snd *gs, float pan, float vol_scale, int priority, bool is_voice_msg)
void initItemStartOffsets(int x, int y)
int Mbox_top_coords[GR_NUM_RESOLUTIONS][2]
#define FRIENDLY_TARGET_MESSAGES
#define AIG_TYPE_PLAYER_WING
#define DISABLE_TARGET_ITEM
LOCAL int Msg_target_objnum
float aggregate_current_hits
struct squadmsg_history squadmsg_history
int ship_get_random_ship_in_wing(int wingnum, int flags, float max_dist, int get_first)
void hud_squadmsg_repair_rearm_abort(int toggle_state, object *obj)
int multi_msg_eval_ship_squadmsg(int shipnum, int command, ai_info *aif, int player_num)
#define OVERRIDE_PROTECT_SHIP_TYPE
#define AIF_AWAITING_REPAIR
void renderString(int x, int y, const char *str)
#define SM_MODE_REPAIR_REARM
#define AI_GOAL_IGNORE_NEW
bool ship_useful_for_departure(int shipnum, int path_mask)
GLint GLint GLint GLint GLint x
object Objects[MAX_OBJECTS]
void initMiddleFrameStartOffsetY(int y)
#define SQUADMSG_HISTORY_NO_UPDATE
int hud_disabled()
Checks if HUD disabled.
comm_order Comm_orders[NUM_COMM_ORDER_ITEMS]
int get_parse_name_index(const char *name)
const char * XSTR(const char *str, int index)
#define WF_DEPARTURE_ORDERED
int mission_is_repair_scheduled(object *objp)
#define SM_MODE_TYPE_SELECT
void hud_init_comm_orders()
int is_support_allowed(object *objp, bool do_simple_check)
bool end_string_at_first_hash_symbol(char *src)
#define SM_MODE_WING_COMMAND
int hud_squadmsg_read_key(int k)
#define P_SF_REINFORCEMENT
int hud_communications_state(ship *sp)
void hud_squadmsg_start()
#define SM_MODE_SHIP_SELECT
void initPgUpOffsets(int x, int y)
void hud_squadmsg_shortcut(int command)
int wing_name_lookup(const char *name, int ignore_count)
#define SF2_NO_BUILTIN_MESSAGES
int Starting_wings[MAX_STARTING_WINGS]
#define SM_MODE_REPAIR_REARM_ABORT
#define AIF_BEING_REPAIRED
#define MAX_KEYS_NO_SCROLL
int hud_squadmsg_is_target_order_valid(int order, int find_order, ai_info *aip=NULL)
GLuint const GLchar * name
int hud_squadmsg_send_ship_command(int shipnum, int command, int send_message, int update_history, int player_num)
int Mbox_bmap_coords[GR_NUM_RESOLUTIONS][2]
#define SM_MODE_REINFORCEMENTS
void initHeaderOffsets(int x, int y)
char Squad_msg_title[256]
void startFlashPageScroll(int duration=1400)
int ai_issue_rearm_request(object *requester_objp)
#define LOG_PLAYER_CALLED_FOR_REINFORCEMENT
int hud_squadmsg_do_frame()
char Comm_order_types[NUM_COMM_ORDER_TYPES][NAME_LENGTH]
#define AI_GOAL_KEEP_SAFE_DISTANCE
float frand()
Return random value in range 0.0..1.0- (1.0- means the closest number less than 1.0)
int hud_squadmsg_can_rearm(ship *shipp)
#define AI_GOAL_DISABLE_SHIP
void bm_page_in_aabitmap(int bitmapnum, int nframes)
Marks a texture as being used for this level, and is anti-aliased.
#define KEEP_SAFE_DIST_ITEM
struct mmode_item mmode_item
#define MESSAGE_REARM_WARP
void hud_squadmsg_repair_rearm(int toggle_state, object *objp)
int Menu_pgdn_coords[GR_NUM_RESOLUTIONS][2]
#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)
int hud_squadmsg_hotkey_select(int k)
LOCAL ship_subsys * Msg_targeted_subsys
void hud_squadmsg_save_keys(int do_scroll)
char subobj_name[MAX_NAME_LEN]
void hud_squadmsg_wing_command()
#define SF_DEPARTURE_ORDERED
#define MULTIPLAYER_MASTER
void HUD_reset_clip()
Like gr_reset_clip() only it accounts for HUD jittering.
ubyte keyd_pressed[NUM_KEYS]
SCP_vector< ship_info > Ship_info
#define AI_GOAL_CHASE_WEAPON
#define MESSAGE_DISARM_TARGET
void gamesnd_play_error_beep()
#define timestamp_elapsed(stamp)
int ship_get_default_orders_accepted(ship_info *sip)
#define TYPE_ALL_FIGHTERS_ITEM
GLsizei GLsizei GLuint * obj
int hud_squadmsg_count_ships(int add_to_menu)
#define TBOX_FLASH_INTERVAL
void renderPrintf(int x, int y, const char *format,...)
int hud_squadmsg_enemies_present()
#define STI_AI_ACCEPT_PLAYER_ORDERS
int hud_squadmsg_count_wings(int add_to_menu)
int Item_start_offsets[2]
GLsizei GLsizei GLchar * source
int hud_squadmsg_get_key()
GLuint GLdouble GLdouble GLint GLint order
void hud_update_last_order(char *target, int order_source, int special_index)
#define MESSAGE_ATTACK_TARGET
int ship_index[MAX_SHIPS_PER_WING]
#define NUM_COMM_ORDER_TYPES
#define SQUADMSG_HISTORY_UPDATE
int ship_get_subsys_index(ship *sp, char *ss_name, int error_bypass)
squadmate message menu appears
htarget_list keyed_targets[MAX_KEYED_TARGETS]
void hud_squadmsg_ship_select()
#define DISABLE_SUBSYSTEM_ITEM
int ship_name_lookup(const char *name, int inc_players)
bool maybeFlashPageScroll(bool flash_fast=false)
int multi_can_message(net_player *p)
#define ABORT_REARM_REPAIR_ITEM
int Middle_frame_start_offset_y
void gamesnd_play_iface(int n)
#define AI_GOAL_DESTROY_SUBSYSTEM
int Mbox_item_xoffset[GR_NUM_RESOLUTIONS]
void hud_squadmsg_page_up()
#define WIF3_FIGHTER_INTERCEPTABLE
int hud_disabled_except_messages()
Like hud_disabled(), except messages are still drawn.
int multi_find_player_by_object(object *objp)
net_player Net_players[MAX_PLAYERS]
#define PLAYER_FLAGS_MSG_MODE
void hud_squadmsg_toggle()
#define AI_GOAL_FORM_ON_WING
char ship_name[NAME_LENGTH]
int hud_squadmsg_ship_order_valid(int shipnum, int order)
SCP_vector< ship_type_info > Ship_types
void player_set_next_all_alone_msg_timestamp()
#define SM_MODE_SHIP_COMMAND
#define MESSAGE_NO_TARGET
char * comm_order_get_text(int item)
bool hud_squadmsg_ship_valid(ship *shipp, object *objp)
int hud_squadmsg_reinforcements_available(int team)
void hud_squadmsg_reinforcement_select()
#define MESSAGE_TIME_SOON
hud_frames Mbox_gauge[NUM_MBOX_FRAMES]
void renderBitmap(int x, int y)
void initItemOffsetX(int x)