@@ -184,6 +184,12 @@ path_restriction_t Path_restrictions[MAX_PATH_RESTRICTIONS];
184184
185185extern int debrief_find_persona_index ();
186186
187+ static bool mission_has_layer_name (const mission* pm, const SCP_string& layerName) {
188+ return std::any_of (pm->fred_layers .begin (), pm->fred_layers .end (), [&layerName](const SCP_string& existingLayer) {
189+ return stricmp (existingLayer.c_str (), layerName.c_str ()) == 0 ;
190+ });
191+ }
192+
187193// XSTR:OFF
188194
189195const char *Nebula_filenames[NUM_NEBULAS] = {
@@ -2252,6 +2258,7 @@ int parse_create_object_sub(p_object *p_objp, bool standalone_ship)
22522258 }
22532259
22542260 shipp->group = p_objp->group ;
2261+ shipp->fred_layer = p_objp->fred_layer ;
22552262 shipp->escort_priority = p_objp->escort_priority ;
22562263 shipp->ship_guardian_threshold = p_objp->ship_guardian_threshold ;
22572264 shipp->use_special_explosion = p_objp->use_special_explosion ;
@@ -3782,6 +3789,17 @@ int parse_object(mission *pm, int /*flag*/, p_object *p_objp)
37823789 if (optional_string (" +Group:" ))
37833790 stuff_int (&p_objp->group );
37843791
3792+ if (optional_string (" +Layer:" )) {
3793+ stuff_string (p_objp->fred_layer , F_NAME);
3794+ if (!mission_has_layer_name (&The_mission, p_objp->fred_layer )) {
3795+ if (p_objp->fred_layer .empty ()) {
3796+ p_objp->fred_layer = " Default" ;
3797+ } else {
3798+ The_mission.fred_layers .push_back (p_objp->fred_layer );
3799+ }
3800+ }
3801+ }
3802+
37853803 bool table_score = false ;
37863804 if (optional_string (" +Use Table Score:" )) {
37873805 table_score = true ;
@@ -5190,6 +5208,17 @@ void parse_prop(mission* /*pm*/)
51905208 }
51915209 }
51925210
5211+ if (optional_string (" +Layer:" )) {
5212+ stuff_string (p.fred_layer , F_NAME);
5213+ if (!mission_has_layer_name (&The_mission, p.fred_layer )) {
5214+ if (p.fred_layer .empty ()) {
5215+ p.fred_layer = " Default" ;
5216+ } else {
5217+ The_mission.fred_layers .push_back (p.fred_layer );
5218+ }
5219+ }
5220+ }
5221+
51935222 // if idx is still -1 then we have an empty props.tbl so we parse
51945223 // everything here and just discard it. A warning has already been generated above.
51955224 if (idx < 0 ) {
@@ -5371,6 +5400,11 @@ void post_process_mission_props()
53715400 if (propp.flags [Mission::Parse_Object_Flags::OF_No_collide]) {
53725401 obj.flags .remove (Object::Object_Flags::Collides);
53735402 }
5403+
5404+ auto createdProp = prop_id_lookup (obj.instance );
5405+ if (createdProp != nullptr ) {
5406+ createdProp->fred_layer = propp.fred_layer ;
5407+ }
53745408 }
53755409 }
53765410}
@@ -7130,6 +7164,8 @@ void mission::Reset()
71307164
71317165 custom_data.clear ();
71327166 custom_strings.clear ();
7167+ fred_layers.clear ();
7168+ fred_layers.emplace_back (" Default" );
71337169}
71347170
71357171void support_ship_info::reset ()
0 commit comments