@@ -203,6 +203,8 @@ SCP_unordered_set<int> Fred_migrated_immobile_ships;
203203int Num_path_restrictions;
204204path_restriction_t Path_restrictions[MAX_PATH_RESTRICTIONS ];
205205
206+ constexpr int DEFAULT_LARGE_SHIP_NO_COLLIDE_COLLISION_GROUP = 0 ;
207+
206208extern int debrief_find_persona_index ();
207209
208210static bool mission_has_layer_name (const mission* pm, const SCP_string& layerName) {
@@ -418,7 +420,8 @@ flag_def_list_new<Mission::Mission_Flags> Parse_mission_flags[] = {
418420 {" Toggle Starting in Chase View" , Mission::Mission_Flags::Toggle_start_chase_view, true , false },
419421 {" Nebula Fog Color Override" , Mission::Mission_Flags::Neb2_fog_color_override, true , true },
420422 {" Full Nebula Background Bitmaps" , Mission::Mission_Flags::Fullneb_background_bitmaps, true , true },
421- {" Preload Subspace Tunnel" , Mission::Mission_Flags::Preload_subspace, true , false }
423+ {" Preload Subspace Tunnel" , Mission::Mission_Flags::Preload_subspace, true , false },
424+ {" Large Ships Do Not Collide By Default" , Mission::Mission_Flags::Large_ships_no_collide_by_default, true , false }
422425};
423426
424427parse_object_flag_description<Mission::Mission_Flags> Parse_mission_flag_descriptions[] = {
@@ -452,6 +455,7 @@ parse_object_flag_description<Mission::Mission_Flags> Parse_mission_flag_descrip
452455 {Mission::Mission_Flags::Neb2_fog_color_override, " Whether to use explicit fog colors instead of checking the palette" },
453456 {Mission::Mission_Flags::Fullneb_background_bitmaps, " Show background bitmaps despite full nebula" },
454457 {Mission::Mission_Flags::Preload_subspace, " Preload the subspace tunnel for both the sexp and specs checkbox" },
458+ {Mission::Mission_Flags::Large_ships_no_collide_by_default, " Automatically places all large ships in the configured collision group, preventing large ships from colliding with each other" },
455459};
456460
457461const size_t Num_parse_mission_flags = sizeof (Parse_mission_flags) / sizeof (flag_def_list_new<Mission::Mission_Flags>);
@@ -865,6 +869,18 @@ void parse_mission_info(mission *pm, bool basic = false)
865869 stuff_int (&pm->contrail_threshold );
866870 }
867871
872+ if (optional_string (" +Large Ship Collision Group:" )) {
873+ stuff_int (&pm->large_ship_no_collide_collision_group );
874+
875+ if (pm->large_ship_no_collide_collision_group < 0 || pm->large_ship_no_collide_collision_group > 31 ) {
876+ WarningEx (LOCATION ,
877+ " Invalid large ship collision group id %d specified. Valid IDs range from 0 to 31. Using group %d instead.\n " ,
878+ pm->large_ship_no_collide_collision_group ,
879+ DEFAULT_LARGE_SHIP_NO_COLLIDE_COLLISION_GROUP );
880+ pm->large_ship_no_collide_collision_group = DEFAULT_LARGE_SHIP_NO_COLLIDE_COLLISION_GROUP ;
881+ }
882+ }
883+
868884 if (optional_string (" +Volumetric Nebula:" )) {
869885 pm->volumetrics .emplace ().parse_volumetric_nebula ();
870886 }
@@ -2259,6 +2275,11 @@ int parse_create_object_sub(p_object *p_objp, bool standalone_ship)
22592275 // Goober5000 - set the collision group if one was provided
22602276 Objects[objnum].collision_group_id = p_objp->collision_group_id ;
22612277
2278+ // Mission-level performance helper: large ships may be grouped so they skip mutual collision checks.
2279+ if (The_mission.flags [Mission::Mission_Flags::Large_ships_no_collide_by_default] && sip->is_big_or_huge ()) {
2280+ Objects[objnum].collision_group_id |= (1 << The_mission.large_ship_no_collide_collision_group );
2281+ }
2282+
22622283 // Goober5000 - set some fields that the mission log might need (if logged via parse_bring_in_docked_wing just below)
22632284 shipp->display_name = p_objp->display_name ;
22642285 shipp->alt_type_index = p_objp->alt_type_index ;
@@ -7210,6 +7231,7 @@ void mission::Reset()
72107231
72117232 envmap_name[ 0 ] = ' \0 ' ;
72127233 contrail_threshold = CONTRAIL_THRESHOLD_DEFAULT ;
7234+ large_ship_no_collide_collision_group = DEFAULT_LARGE_SHIP_NO_COLLIDE_COLLISION_GROUP ;
72137235 ambient_light_level = DEFAULT_AMBIENT_LIGHT_LEVEL ;
72147236 sound_environment.id = -1 ;
72157237
@@ -9591,6 +9613,9 @@ bool check_for_24_3_data()
95919613
95929614bool check_for_25_1_data ()
95939615{
9616+ if (The_mission.flags [Mission::Mission_Flags::Large_ships_no_collide_by_default])
9617+ return true ;
9618+
95949619 if (count_items_with_value (Props) > 0 )
95959620 return true ;
95969621
0 commit comments