Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion code/mission/mission_flags.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,8 @@ namespace Mission {
SF_Fail_sound_locked_primary, // Kiloku - Plays fail sound when firing with locked weapons
SF_Fail_sound_locked_secondary, // Kiloku - Plays fail sound when firing with locked weapons
SF_Aspect_immune, // Kiloku - Ship cannot be locked onto by aspect seeking weapons
SF_Cannot_perform_scan, // Goober5000 - ship cannot scan other ships
SF_Cannot_perform_scan_hide_cargo, // Goober5000 - ship cannot scan other ships, and cargo will not be shown on the HUD
SF_Cannot_perform_scan_show_cargo, // Goober5000 - ship cannot scan other ships, but cargo will be shown on the HUD
SF_No_targeting_limits, // MjnMixael - Ship is always targetable regardless of AWACS or targeting range limits
SF_From_player_wing, // set for ships that are members of any player starting wing

Expand Down
49 changes: 31 additions & 18 deletions code/mission/missionparse.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -309,7 +309,8 @@ flag_def_list_new<Ship::Ship_Flags> Parse_ship_flags[] = {
{"fail-sound-locked-primary", Ship::Ship_Flags::Fail_sound_locked_primary, true, false},
{"fail-sound-locked-secondary", Ship::Ship_Flags::Fail_sound_locked_secondary, true, false},
{"aspect-immune", Ship::Ship_Flags::Aspect_immune, true, false},
{"cannot-perform-scan", Ship::Ship_Flags::Cannot_perform_scan, true, false},
{"cannot-perform-scan-hide-cargo", Ship::Ship_Flags::Cannot_perform_scan_hide_cargo, true, false},
{"cannot-perform-scan-show-cargo", Ship::Ship_Flags::Cannot_perform_scan_show_cargo, true, false},
{"no-targeting-limits", Ship::Ship_Flags::No_targeting_limits, true, false},
{"force-shields-on", Ship::Ship_Flags::Force_shields_on, true, false},
{"Destroy before Mission", Ship::Ship_Flags::Kill_before_mission,true, false}, //Not Printed to misson so can use descriptive name
Expand Down Expand Up @@ -479,7 +480,8 @@ flag_def_list_new<Mission::Parse_Object_Flags> Parse_object_flags[] = {
{ "fail-sound-locked-primary", Mission::Parse_Object_Flags::SF_Fail_sound_locked_primary, true, false },
{ "fail-sound-locked-secondary", Mission::Parse_Object_Flags::SF_Fail_sound_locked_secondary, true, false },
{ "aspect-immune", Mission::Parse_Object_Flags::SF_Aspect_immune, true, false },
{ "cannot-perform-scan", Mission::Parse_Object_Flags::SF_Cannot_perform_scan, true, false },
{ "cannot-perform-scan-hide-cargo", Mission::Parse_Object_Flags::SF_Cannot_perform_scan_hide_cargo, true, false },
{ "cannot-perform-scan-show-cargo", Mission::Parse_Object_Flags::SF_Cannot_perform_scan_show_cargo, true, false },
{ "no-targeting-limits", Mission::Parse_Object_Flags::SF_No_targeting_limits, true, false},
};

Expand Down Expand Up @@ -545,7 +547,8 @@ parse_object_flag_description<Mission::Parse_Object_Flags> Parse_object_flag_des
{ Mission::Parse_Object_Flags::SF_Fail_sound_locked_primary, "Play the firing fail sound when the weapon is locked."},
{ Mission::Parse_Object_Flags::SF_Fail_sound_locked_secondary, "Play the firing fail sound when the weapon is locked."},
{ Mission::Parse_Object_Flags::SF_Aspect_immune, "Ship cannot be targeted by Aspect Seekers."},
{ Mission::Parse_Object_Flags::SF_Cannot_perform_scan, "Ship cannot scan other ships."},
{ Mission::Parse_Object_Flags::SF_Cannot_perform_scan_hide_cargo, "Ship cannot scan other ships, and the cargo line will not be shown on the HUD."},
{ Mission::Parse_Object_Flags::SF_Cannot_perform_scan_show_cargo, "Ship cannot scan other ships, but the cargo line will be shown on the HUD."},
{ Mission::Parse_Object_Flags::SF_No_targeting_limits, "Ship is always targetable regardless of AWACS or targeting range limits."},
};

Expand Down Expand Up @@ -3111,8 +3114,10 @@ void resolve_parse_flags(object *objp, flagset<Mission::Parse_Object_Flags> &par
if (parse_flags[Mission::Parse_Object_Flags::SF_Aspect_immune])
shipp->flags.set(Ship::Ship_Flags::Aspect_immune);

if (parse_flags[Mission::Parse_Object_Flags::SF_Cannot_perform_scan])
shipp->flags.set(Ship::Ship_Flags::Cannot_perform_scan);
if (parse_flags[Mission::Parse_Object_Flags::SF_Cannot_perform_scan_hide_cargo])
shipp->flags.set(Ship::Ship_Flags::Cannot_perform_scan_hide_cargo);
if (parse_flags[Mission::Parse_Object_Flags::SF_Cannot_perform_scan_show_cargo])
shipp->flags.set(Ship::Ship_Flags::Cannot_perform_scan_show_cargo);

if (parse_flags[Mission::Parse_Object_Flags::SF_No_targeting_limits])
shipp->flags.set(Ship::Ship_Flags::No_targeting_limits);
Expand Down Expand Up @@ -3506,28 +3511,36 @@ int parse_object(mission *pm, int /*flag*/, p_object *p_objp)
// set flags
if (optional_string("+Flags:"))
{
SCP_vector<SCP_string> unparsed;
parse_string_flag_list(p_objp->flags, Parse_object_flags, Num_parse_object_flags, &unparsed);
if (!unparsed.empty()) {
for (size_t k = 0; k < unparsed.size(); ++k) {
WarningEx(LOCATION, "Unknown flag in parse object flags: %s", unparsed[k].c_str());
SCP_vector<SCP_string> unparsed_vec;
parse_string_flag_list(p_objp->flags, Parse_object_flags, Num_parse_object_flags, &unparsed_vec);
if (!unparsed_vec.empty()) {
for (const auto& unparsed: unparsed_vec) {
// catch typos or deprecations
if (!stricmp(unparsed.c_str(), "no-collide") || !stricmp(unparsed.c_str(), "no_collide")) {
p_objp->flags.set(Mission::Parse_Object_Flags::OF_No_collide);
} else if (!stricmp(unparsed.c_str(), "cannot-perform-scan")) {
p_objp->flags.set(Mission::Parse_Object_Flags::SF_Cannot_perform_scan_hide_cargo);
} else {
WarningEx(LOCATION, "Unknown flag in parse object flags: %s", unparsed.c_str());
}
}
}
}

// second set - Goober5000
if (optional_string("+Flags2:"))
{
SCP_vector<SCP_string> unparsed;
parse_string_flag_list(p_objp->flags, Parse_object_flags, Num_parse_object_flags, &unparsed);
if (!unparsed.empty()) {
for (size_t k = 0; k < unparsed.size(); ++k) {
SCP_vector<SCP_string> unparsed_vec;
parse_string_flag_list(p_objp->flags, Parse_object_flags, Num_parse_object_flags, &unparsed_vec);
if (!unparsed_vec.empty()) {
for (const auto& unparsed: unparsed_vec) {
// catch typos or deprecations
if (!stricmp(unparsed[k].c_str(), "no-collide") || !stricmp(unparsed[k].c_str(), "no_collide")) {
if (!stricmp(unparsed.c_str(), "no-collide") || !stricmp(unparsed.c_str(), "no_collide")) {
p_objp->flags.set(Mission::Parse_Object_Flags::OF_No_collide);
}
else {
WarningEx(LOCATION, "Unknown flag in parse object flags: %s", unparsed[k].c_str());
} else if (!stricmp(unparsed.c_str(), "cannot-perform-scan")) {
p_objp->flags.set(Mission::Parse_Object_Flags::SF_Cannot_perform_scan_hide_cargo);
} else {
WarningEx(LOCATION, "Unknown flag in parse object flags: %s", unparsed.c_str());
}
}
}
Expand Down
68 changes: 21 additions & 47 deletions code/parse/sexp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3492,65 +3492,32 @@ int check_sexp_syntax(int node, int return_type, int recursive, int *bad_node, s
break;

case OPF_SHIP_FLAG:
{
bool found = false;
for ( i = 0; i < Num_object_flag_names; i++) {
if (!stricmp(Object_flag_names[i].flag_name, CTEXT(node))) {
found = true;
break;
}
}

if (!found) {
for ( i = 0; i < (int)Num_ship_flag_names; i++) {
if (!stricmp(Ship_flag_names[i].flag_name, CTEXT(node))) {
found = true;
break;
}
}
}

if (!found) {
for ( i = 0; i < (int)Num_parse_object_flags; i++) {
if (!stricmp(Parse_object_flags[i].name, CTEXT(node))) {
found = true;
break;
}
}
}

if (!found) {
for ( i = 0; i < Num_ai_flag_names; i++) {
if (!stricmp(Ai_flag_names[i].flag_name, CTEXT(node))) {
found = true;
break;
}
}
}
{
Object::Object_Flags object_flag = Object::Object_Flags::NUM_VALUES;
Ship::Ship_Flags ship_flag = Ship::Ship_Flags::NUM_VALUES;
Mission::Parse_Object_Flags parse_obj_flag = Mission::Parse_Object_Flags::NUM_VALUES;
AI::AI_Flags ai_flag = AI::AI_Flags::NUM_VALUES;
sexp_check_flag_arrays(CTEXT(node), object_flag, ship_flag, parse_obj_flag, ai_flag);

if (!found) {
if (object_flag == Object::Object_Flags::NUM_VALUES && ship_flag == Ship::Ship_Flags::NUM_VALUES
&& parse_obj_flag == Mission::Parse_Object_Flags::NUM_VALUES && ai_flag == AI::AI_Flags::NUM_VALUES) {
return SEXP_CHECK_INVALID_SHIP_FLAG;
}

break;
}
}

case OPF_WING_FLAG:
{
bool found = false;
for ( i = 0; i < (int)Num_wing_flag_names; i++) {
if (!stricmp(Wing_flag_names[i].flag_name, CTEXT(node))) {
found = true;
break;
}
}
{
Ship::Wing_Flags wing_flag = Ship::Wing_Flags::NUM_VALUES;
sexp_check_flag_array(CTEXT(node), wing_flag);

if (!found) {
if (wing_flag == Ship::Wing_Flags::NUM_VALUES) {
return SEXP_CHECK_INVALID_WING_FLAG;
}

break;
}
}

case OPF_TEAM_COLOR:
if (type2 != SEXP_ATOM_STRING) {
Expand Down Expand Up @@ -17843,6 +17810,13 @@ bool sexp_check_flag_arrays(const char *flag_name, Object::Object_Flags &object_
}
}

// check for deprecated flags
if (!stricmp("cannot-perform-scan", flag_name)) {
ship_flag = Ship::Ship_Flags::Cannot_perform_scan_hide_cargo;
parse_obj_flag = Mission::Parse_Object_Flags::SF_Cannot_perform_scan_hide_cargo;
send_multi = true;
}

return send_multi;
}

Expand Down
Loading