diff --git a/code/hud/hudgauges.h b/code/hud/hudgauges.h index f430112b0f..ebbce7b6d0 100644 --- a/code/hud/hudgauges.h +++ b/code/hud/hudgauges.h @@ -55,7 +55,13 @@ #define HUD_SUPPORT_GAUGE 37 #define HUD_LAG_GAUGE 38 -extern const char *HUD_gauge_text[NUM_HUD_GAUGES]; // defined in sexp.cpp!!!! +struct Legacy_HUD_gauge_pair +{ + const char *hud_gauge_text; + int hud_gauge_type; +}; + +extern Legacy_HUD_gauge_pair Legacy_HUD_gauges[NUM_HUD_GAUGES]; // defined in hudparse.cpp!!!! #endif /* __HUD_COMMON_H__ */ diff --git a/code/hud/hudparse.cpp b/code/hud/hudparse.cpp index dc071c34c9..74053a4657 100644 --- a/code/hud/hudparse.cpp +++ b/code/hud/hudparse.cpp @@ -53,9 +53,9 @@ int Hud_font = -1; bool Chase_view_only_ex = false; -//WARNING: If you add gauges to this array, make sure to bump num_default_gauges! -int num_default_gauges = 42; -static int retail_gauges[] = { +//WARNING: If you add gauges to this array, make sure to bump Num_default_gauges! +const int Num_retail_gauges = 42; +static int Retail_gauges[Num_retail_gauges] = { HUD_OBJECT_MESSAGES, HUD_OBJECT_TRAINING_MESSAGES, HUD_OBJECT_SUPPORT, @@ -100,9 +100,52 @@ static int retail_gauges[] = { HUD_OBJECT_ETS_RETAIL }; +Legacy_HUD_gauge_pair Legacy_HUD_gauges[NUM_HUD_GAUGES] = +{ + { "LEAD_INDICATOR", HUD_OBJECT_LEAD }, + { "ORIENTATION_TEE", HUD_OBJECT_ORIENTATION_TEE }, + { "HOSTILE_TRIANGLE", HUD_OBJECT_HOSTILE_TRI }, + { "TARGET_TRIANGLE", HUD_OBJECT_TARGET_TRI }, + { "MISSION_TIME", HUD_OBJECT_MISSION_TIME }, + { "RETICLE_CIRCLE", -1 }, + { "THROTTLE_GAUGE", HUD_OBJECT_THROTTLE }, + { "RADAR", HUD_OBJECT_RADAR_STD }, + { "TARGET_MONITOR", HUD_OBJECT_TARGET_MONITOR }, + { "CENTER_RETICLE", HUD_OBJECT_CENTER_RETICLE }, + { "TARGET_MONITOR_EXTRA_DATA", HUD_OBJECT_EXTRA_TARGET_DATA }, + { "TARGET_SHIELD_ICON", HUD_OBJECT_TARGET_SHIELD }, + { "PLAYER_SHIELD_ICON", HUD_OBJECT_PLAYER_SHIELD }, + { "ETS_GAUGE", HUD_OBJECT_ETS_RETAIL }, + { "AUTO_TARGET", HUD_OBJECT_AUTO_TARGET }, + { "AUTO_SPEED", HUD_OBJECT_AUTO_SPEED }, + { "WEAPONS_GAUGE", HUD_OBJECT_WEAPONS }, + { "ESCORT_VIEW", HUD_OBJECT_ESCORT }, + { "DIRECTIVES_VIEW", HUD_OBJECT_DIRECTIVES }, + { "THREAT_GAUGE", HUD_OBJECT_THREAT }, + { "AFTERBURNER_ENERGY", HUD_OBJECT_AFTERBURNER }, + { "WEAPONS_ENERGY", HUD_OBJECT_WEAPON_ENERGY }, + { "WEAPON_LINKING_GAUGE", HUD_OBJECT_WEAPON_LINKING }, + { "TARGER_MINI_ICON", HUD_OBJECT_MINI_SHIELD }, + { "OFFSCREEN_INDICATOR", HUD_OBJECT_OFFSCREEN }, + { "TALKING_HEAD", HUD_OBJECT_TALKING_HEAD }, + { "DAMAGE_GAUGE", HUD_OBJECT_DAMAGE }, + { "MESSAGE_LINES", HUD_OBJECT_MESSAGES }, + { "MISSILE_WARNING_ARROW", HUD_OBJECT_MISSILE_TRI }, + { "CMEASURE_GAUGE", HUD_OBJECT_CMEASURES }, + { "OBJECTIVES_NOTIFY_GAUGE", HUD_OBJECT_OBJ_NOTIFY }, + { "WINGMEN_STATUS", HUD_OBJECT_WINGMAN_STATUS }, + { "OFFSCREEN RANGE", -1 }, + { "KILLS GAUGE", HUD_OBJECT_KILLS }, + { "ATTACKING TARGET COUNT", -1 }, + { "TEXT FLASH", HUD_OBJECT_TEXT_WARNINGS }, + { "MESSAGE BOX", HUD_OBJECT_SQUAD_MSG }, + { "SUPPORT GUAGE", HUD_OBJECT_SUPPORT }, + { "LAG GUAGE", HUD_OBJECT_LAG }, +}; + flag_def_list Hud_gauge_types[] = { { "Messages", HUD_OBJECT_MESSAGES, 0}, - { "Training messages", HUD_OBJECT_TRAINING_MESSAGES, 0}, + { "Training messages", HUD_OBJECT_TRAINING_MESSAGES, 0}, // Not in legacy list { "Support", HUD_OBJECT_SUPPORT, 0}, { "Damage", HUD_OBJECT_DAMAGE, 0}, { "Wingman status", HUD_OBJECT_WINGMAN_STATUS, 0}, @@ -120,14 +163,14 @@ flag_def_list Hud_gauge_types[] = { { "Target shield", HUD_OBJECT_TARGET_SHIELD, 0}, { "Escort list", HUD_OBJECT_ESCORT, 0}, { "Mission time", HUD_OBJECT_MISSION_TIME, 0}, - { "Ets weapons", HUD_OBJECT_ETS_WEAPONS, 0}, - { "Ets shields", HUD_OBJECT_ETS_SHIELDS, 0}, - { "Ets engines", HUD_OBJECT_ETS_ENGINES, 0}, + { "Ets weapons", HUD_OBJECT_ETS_WEAPONS, 0}, // Not in legacy list + { "Ets shields", HUD_OBJECT_ETS_SHIELDS, 0}, // Not in legacy list + { "Ets engines", HUD_OBJECT_ETS_ENGINES, 0}, // Not in legacy list { "Target monitor", HUD_OBJECT_TARGET_MONITOR, 0}, { "Extra target data", HUD_OBJECT_EXTRA_TARGET_DATA, 0}, { "Radar", HUD_OBJECT_RADAR_STD, 0}, - { "Radar orb", HUD_OBJECT_RADAR_ORB, 0}, - { "Radar BSG", HUD_OBJECT_RADAR_BSG, 0}, + { "Radar orb", HUD_OBJECT_RADAR_ORB, 0}, // Not in legacy list + { "Radar BSG", HUD_OBJECT_RADAR_BSG, 0}, // Not in legacy list { "Afterburner energy", HUD_OBJECT_AFTERBURNER, 0}, { "Weapon energy", HUD_OBJECT_WEAPON_ENERGY, 0}, { "Text warnings", HUD_OBJECT_TEXT_WARNINGS, 0}, @@ -136,12 +179,12 @@ flag_def_list Hud_gauge_types[] = { { "Threat indicator", HUD_OBJECT_THREAT, 0}, { "Lead indicator", HUD_OBJECT_LEAD, 0}, { "Lead sight", HUD_OBJECT_LEAD_SIGHT, 0}, - { "Lock indicator", HUD_OBJECT_LOCK, 0}, + { "Lock indicator", HUD_OBJECT_LOCK, 0}, // Not in legacy list { "Weapon linking", HUD_OBJECT_WEAPON_LINKING, 0}, - { "Multiplayer messages", HUD_OBJECT_MULTI_MSG, 0}, - { "Voice status", HUD_OBJECT_VOICE_STATUS, 0}, - { "Ping", HUD_OBJECT_PING, 0}, - { "Supernova", HUD_OBJECT_SUPERNOVA, 0}, + { "Multiplayer messages", HUD_OBJECT_MULTI_MSG, 0}, // Not in legacy list + { "Voice status", HUD_OBJECT_VOICE_STATUS, 0}, // Not in legacy list + { "Ping", HUD_OBJECT_PING, 0}, // Not in legacy list + { "Supernova", HUD_OBJECT_SUPERNOVA, 0}, // Not in legacy list { "Offscreen indicator", HUD_OBJECT_OFFSCREEN, 0}, { "Targeting brackets", HUD_OBJECT_BRACKETS, 0}, { "Orientation", HUD_OBJECT_ORIENTATION_TEE, 0}, @@ -149,10 +192,9 @@ flag_def_list Hud_gauge_types[] = { { "Target direction", HUD_OBJECT_TARGET_TRI, 0}, { "Missile indicator", HUD_OBJECT_MISSILE_TRI, 0}, { "Kills", HUD_OBJECT_KILLS, 0}, - { "Fixed messages", HUD_OBJECT_FIXED_MESSAGES, 0}, + { "Fixed messages", HUD_OBJECT_FIXED_MESSAGES, 0}, // Not in legacy list { "Ets retail", HUD_OBJECT_ETS_RETAIL, 0} }; - int Num_hud_gauge_types = sizeof(Hud_gauge_types)/sizeof(flag_def_list); int parse_ship_start() @@ -533,11 +575,11 @@ void load_missing_retail_gauges() if(Hud_retail) { int num_loaded_gauges = (int)default_hud_gauges.size(); - for(int i = 0; i < num_default_gauges; i++) { + for(int i = 0; i < Num_retail_gauges; i++) { retail_gauge_loaded = false; for(int j = 0; j < num_loaded_gauges; j++) { - if(retail_gauges[i] == default_hud_gauges[j]->getObjectType()) { + if(Retail_gauges[i] == default_hud_gauges[j]->getObjectType()) { retail_gauge_loaded = true; break; } @@ -545,7 +587,7 @@ void load_missing_retail_gauges() if(!retail_gauge_loaded) { gauge_settings settings; - load_gauge(retail_gauges[i], &settings); + load_gauge(Retail_gauges[i], &settings); } } @@ -589,9 +631,9 @@ void load_missing_retail_gauges() if(it->hud_enabled && it->hud_retail) { int num_loaded_gauges = (int)it->hud_gauges.size(); - for(int i = 0; i < num_default_gauges; i++) { + for(int i = 0; i < Num_retail_gauges; i++) { for(int j = 0; j < num_loaded_gauges; j++) { - if(retail_gauges[i] == it->hud_gauges[j]->getObjectType()) { + if(Retail_gauges[i] == it->hud_gauges[j]->getObjectType()) { retail_gauge_loaded = true; } } @@ -599,7 +641,7 @@ void load_missing_retail_gauges() if(!retail_gauge_loaded) { gauge_settings settings; settings.ship_idx = &sindex; - load_gauge(retail_gauges[i], &settings); + load_gauge(Retail_gauges[i], &settings); } } @@ -1452,7 +1494,7 @@ void load_gauge_custom(gauge_settings* settings) stuff_string(gauge_string, F_NAME, MAX_FILENAME_LEN); for(i = 0; i < NUM_HUD_GAUGES; i++) { - if(!strcmp(HUD_gauge_text[i], gauge_string)) { + if(!strcmp(Legacy_HUD_gauges[i].hud_gauge_text, gauge_string)) { gauge_type = i; break; } diff --git a/code/parse/sexp.cpp b/code/parse/sexp.cpp index 1797134975..f4308ed4d2 100644 --- a/code/parse/sexp.cpp +++ b/code/parse/sexp.cpp @@ -813,50 +813,6 @@ sexp_ai_goal_link Sexp_ai_goal_links[] = { { AI_GOAL_FORM_ON_WING, OP_AI_FORM_ON_WING } }; -const char *HUD_gauge_text[NUM_HUD_GAUGES] = -{ - "LEAD_INDICATOR", - "ORIENTATION_TEE", - "HOSTILE_TRIANGLE", - "TARGET_TRIANGLE", - "MISSION_TIME", - "RETICLE_CIRCLE", - "THROTTLE_GAUGE", - "RADAR", - "TARGET_MONITOR", - "CENTER_RETICLE", - "TARGET_MONITOR_EXTRA_DATA", - "TARGET_SHIELD_ICON", - "PLAYER_SHIELD_ICON", - "ETS_GAUGE", - "AUTO_TARGET", - "AUTO_SPEED", - "WEAPONS_GAUGE", - "ESCORT_VIEW", - "DIRECTIVES_VIEW", - "THREAT_GAUGE", - "AFTERBURNER_ENERGY", - "WEAPONS_ENERGY", - "WEAPON_LINKING_GAUGE", - "TARGER_MINI_ICON", - "OFFSCREEN_INDICATOR", - "TALKING_HEAD", - "DAMAGE_GAUGE", - "MESSAGE_LINES", - "MISSILE_WARNING_ARROW", - "CMEASURE_GAUGE", - "OBJECTIVES_NOTIFY_GAUGE", - "WINGMEN_STATUS", - "OFFSCREEN RANGE", - "KILLS GAUGE", - "ATTACKING TARGET COUNT", - "TEXT FLASH", - "MESSAGE BOX", - "SUPPORT GUAGE", - "LAG GUAGE" -}; - - void sexp_set_skybox_model_preload(const char *name); // taylor int Num_skybox_flags = 6; const char *Skybox_flags[] = { @@ -2982,14 +2938,32 @@ int check_sexp_syntax(int node, int return_type, int recursive, int *bad_node, i return SEXP_CHECK_INVALID_AUDIO_VOLUME_OPTION; break; - case OPF_HUD_GAUGE: + case OPF_RETAIL_HUD_GAUGE: + { if (type2 != SEXP_ATOM_STRING) { return SEXP_CHECK_TYPE_MISMATCH; } + auto gauge_name = CTEXT(node); + + // for compatibility, since this operator now uses a different set of parameters + if (get_operator_const(op_node) == OP_FLASH_HUD_GAUGE) { + bool found = false; + for (int legacy_idx = 0; legacy_idx < NUM_HUD_GAUGES; legacy_idx++) { + if (stricmp(gauge_name, Legacy_HUD_gauges[legacy_idx].hud_gauge_text) == 0) { + found = true; + break; + } + } + if (found) { + break; + } + } + + if (hud_gauge_type_lookup(gauge_name) == -1) + return SEXP_CHECK_INVALID_RETAIL_HUD_GAUGE; - if (hud_gauge_type_lookup(CTEXT(node)) == -1) - return SEXP_CHECK_INVALID_HUD_GAUGE; break; + } case OPF_SOUND_ENVIRONMENT_OPTION: if (type2 != SEXP_ATOM_STRING) { @@ -3162,21 +3136,6 @@ int check_sexp_syntax(int node, int return_type, int recursive, int *bad_node, i break; - case OPF_HUD_GAUGE_NAME: - if ( type2 != SEXP_ATOM_STRING ) - return SEXP_CHECK_TYPE_MISMATCH; - - for ( i = 0; i < NUM_HUD_GAUGES; i++ ) { - if ( !stricmp(CTEXT(node), HUD_gauge_text[i]) ) - break; - } - - // if we reached the end of the list, then the name is invalid - if ( i == NUM_HUD_GAUGES ) - return SEXP_CHECK_INVALID_GAUGE_NAME; - - break; - case OPF_SKYBOX_MODEL_NAME: if ( type2 != SEXP_ATOM_STRING ) return SEXP_CHECK_TYPE_MISMATCH; @@ -21366,12 +21325,26 @@ int sexp_special_training_check(int node) return rtn; } -// sexpression to flash a hud gauge. gauge name is text valud of node +// sexpression to flash a hud gauge. gauge name is text value of node void sexp_flash_hud_gauge( int node ) { auto name = CTEXT(node); + bool match = false; + + // see if this is specified the new way, according to the HUD type #define + int type = hud_gauge_type_lookup(name); + + // now go through and find out which gauge (index i in the legacy list) to flash for (int i = 0; i < NUM_HUD_GAUGES; ++i) { - if ( !stricmp(HUD_gauge_text[i], name) ) { + if (type < 0) { + if (stricmp(name, Legacy_HUD_gauges[i].hud_gauge_text) == 0) { + match = true; + } + } else if (type == Legacy_HUD_gauges[i].hud_gauge_type) { + match = true; + } + + if (match) { hud_gauge_start_flash(i); // call HUD function to flash gauge Current_sexp_network_packet.start_callback(); @@ -21381,6 +21354,10 @@ void sexp_flash_hud_gauge( int node ) break; } } + + if (!match && type >= 0) { + Warning(LOCATION, "HUD gauge '%s' is not a legacy gauge; flashing is not supported", name); + } } void multi_sexp_flash_hud_gauge() @@ -28216,7 +28193,7 @@ int query_operator_argument_type(int op, int argnum) return OPF_SHIP; case OP_FLASH_HUD_GAUGE: - return OPF_HUD_GAUGE_NAME; + return OPF_RETAIL_HUD_GAUGE; case OP_GOOD_SECONDARY_TIME: if ( argnum == 0 ) @@ -29199,7 +29176,7 @@ int query_operator_argument_type(int op, int argnum) case OP_HUD_ACTIVATE_GAUGE_TYPE: if (argnum == 0) - return OPF_HUD_GAUGE; + return OPF_RETAIL_HUD_GAUGE; else return OPF_BOOL; @@ -29213,7 +29190,7 @@ int query_operator_argument_type(int op, int argnum) if (argnum == 0) return OPF_BOOL; else - return OPF_HUD_GAUGE; + return OPF_RETAIL_HUD_GAUGE; case OP_GET_COLGROUP_ID: return OPF_SHIP; @@ -29647,9 +29624,6 @@ const char *sexp_error_message(int num) case SEXP_CHECK_INVALID_SHIP_CLASS_NAME: return "Invalid ship class name"; - case SEXP_CHECK_INVALID_GAUGE_NAME: - return "Invalid builtin HUD gauge"; - case SEXP_CHECK_INVALID_SKYBOX_NAME: return "Invalid skybox name"; @@ -29719,8 +29693,11 @@ const char *sexp_error_message(int num) case SEXP_CHECK_INVALID_DAMAGE_TYPE: return "Invalid damage type"; - case SEXP_CHECK_INVALID_HUD_GAUGE: - return "Invalid HUD gauge"; + case SEXP_CHECK_INVALID_RETAIL_HUD_GAUGE: + return "Invalid retail HUD gauge"; + + case SEXP_CHECK_INVALID_CUSTOM_HUD_GAUGE: + return "Invalid custom HUD gauge"; case SEXP_CHECK_INVALID_TARGET_PRIORITIES: return "Invalid target priorities"; diff --git a/code/parse/sexp.h b/code/parse/sexp.h index c99571c3bb..9acb6240c8 100644 --- a/code/parse/sexp.h +++ b/code/parse/sexp.h @@ -58,7 +58,7 @@ class waypoint_list; #define OPF_MEDAL_NAME 31 // name of medals #define OPF_WEAPON_NAME 32 // name of a weapon #define OPF_SHIP_CLASS_NAME 33 // name of a ship class -#define OPF_HUD_GAUGE_NAME 34 // name of HUD gauge +#define OPF_CUSTOM_HUD_GAUGE 34 // name of custom HUD gauge #define OPF_HUGE_WEAPON 35 // name of a secondary bomb type weapon #define OPF_SHIP_NOT_PLAYER 36 // a ship, but not a player ship #define OPF_JUMP_NODE_NAME 37 // name of a jump node @@ -103,7 +103,7 @@ class waypoint_list; #define OPF_AUDIO_VOLUME_OPTION 76 // The E #define OPF_WEAPON_BANK_NUMBER 77 // Karajorma - The number of a primary/secondary/tertiary weapon bank or all of them #define OPF_MESSAGE_OR_STRING 78 // Goober5000 - provides a list of messages like OPF_MESSAGE, but also allows entering arbitrary strings -#define OPF_HUD_GAUGE 79 // The E +#define OPF_RETAIL_HUD_GAUGE 79 // The E #define OPF_DAMAGE_TYPE 80 // FUBAR - Damage type or #define OPF_SHIP_EFFECT 81 // The E - per-ship effects, as defined in post-processing.tbl #define OPF_ANIMATION_TYPE 82 // Goober5000 - as defined in modelanim.h @@ -1024,7 +1024,7 @@ const char *CTEXT(int n); #define SEXP_CHECK_INVALID_MEDAL_NAME -123 #define SEXP_CHECK_INVALID_WEAPON_NAME -124 #define SEXP_CHECK_INVALID_SHIP_CLASS_NAME -125 -#define SEXP_CHECK_INVALID_GAUGE_NAME -126 +#define SEXP_CHECK_INVALID_CUSTOM_HUD_GAUGE -126 #define SEXP_CHECK_INVALID_JUMP_NODE -127 #define SEXP_CHECK_INVALID_VARIABLE -128 #define SEXP_CHECK_INVALID_AI_CLASS -129 @@ -1051,7 +1051,7 @@ const char *CTEXT(int n); #define SEXP_CHECK_INVALID_DAMAGE_TYPE -150 #define SEXP_CHECK_INVALID_TARGET_PRIORITIES -151 #define SEXP_CHECK_INVALID_AUDIO_VOLUME_OPTION -152 -#define SEXP_CHECK_INVALID_HUD_GAUGE -153 +#define SEXP_CHECK_INVALID_RETAIL_HUD_GAUGE -153 #define SEXP_CHECK_INVALID_ANIMATION_TYPE -154 #define SEXP_CHECK_INVALID_MISSION_MOOD -155 #define SEXP_CHECK_INVALID_SHIP_FLAG -156 diff --git a/fred2/sexp_tree.cpp b/fred2/sexp_tree.cpp index 5e86b8564b..c5716fe8c4 100755 --- a/fred2/sexp_tree.cpp +++ b/fred2/sexp_tree.cpp @@ -2730,7 +2730,7 @@ int sexp_tree::get_default_value(sexp_list_item *item, char *text_buf, int op, i str = ""; break; - case OPF_HUD_GAUGE: + case OPF_RETAIL_HUD_GAUGE: str = "Messages"; break; @@ -2786,7 +2786,6 @@ int sexp_tree::query_default_argument_available(int op, int i) case OPF_WEAPON_NAME: case OPF_INTEL_NAME: case OPF_SHIP_CLASS_NAME: - case OPF_HUD_GAUGE_NAME: case OPF_HUGE_WEAPON: case OPF_JUMP_NODE_NAME: case OPF_AMBIGUOUS: @@ -2823,7 +2822,7 @@ int sexp_tree::query_default_argument_available(int op, int i) case OPF_AUDIO_VOLUME_OPTION: case OPF_WEAPON_BANK_NUMBER: case OPF_MESSAGE_OR_STRING: - case OPF_HUD_GAUGE: + case OPF_RETAIL_HUD_GAUGE: case OPF_SHIP_EFFECT: case OPF_ANIMATION_TYPE: case OPF_SHIP_FLAG: @@ -4491,10 +4490,6 @@ sexp_list_item *sexp_tree::get_listing_opf(int opf, int parent_node, int arg_ind list = get_listing_opf_ship_class_name(); break; - case OPF_HUD_GAUGE_NAME: - list = get_listing_opf_hud_gauge_name(); - break; - case OPF_HUGE_WEAPON: list = get_listing_opf_huge_weapon(); break; @@ -4615,8 +4610,8 @@ sexp_list_item *sexp_tree::get_listing_opf(int opf, int parent_node, int arg_ind list = get_listing_opf_message(); break; - case OPF_HUD_GAUGE: - list = get_listing_opf_hud_gauge(); + case OPF_RETAIL_HUD_GAUGE: + list = get_listing_opf_retail_hud_gauge(); break; case OPF_SHIP_EFFECT: @@ -5589,7 +5584,7 @@ sexp_list_item *sexp_tree::get_listing_opf_adjust_audio_volume() return head.next; } -sexp_list_item *sexp_tree::get_listing_opf_hud_gauge() +sexp_list_item *sexp_tree::get_listing_opf_retail_hud_gauge() { sexp_list_item head; @@ -5914,17 +5909,6 @@ sexp_list_item *sexp_tree::get_listing_opf_ship_class_name() return head.next; } -sexp_list_item *sexp_tree::get_listing_opf_hud_gauge_name() -{ - int i; - sexp_list_item head; - - for (i=0; i