Editor/Decompiler/Formats/Descriptors/AlienSwarmBspFormatDescriptor.cs
using BspImport.Decompiler.Formats.Readers;

namespace BspImport.Decompiler.Formats.Descriptors;

public sealed class AlienSwarmBspFormatDescriptor : IBspFormatDescriptor
{
	private static readonly IBspStructReaders _readers = new StandardBspStructReaders();

	private static readonly HashSet<string> Signatures = new( StringComparer.OrdinalIgnoreCase )
	{
		"asw_alien_goo",
		"asw_ambient_generic",
		"asw_ammo_autogun",
		"asw_ammo_drop",
		"asw_ammo_flamer",
		"asw_ammo_mining_laser",
		"asw_ammo_pdw",
		"asw_ammo_pistol",
		"asw_ammo_rifle",
		"asw_ammo_shotgun",
		"asw_ammo_vindicator",
		"asw_barrel_explosive",
		"asw_barrel_radioactive",
		"asw_bloodhound",
		"asw_boomer",
		"asw_broadcast_camera",
		"asw_buzzer",
		"asw_camera_control",
		"asw_client_corpse",
		"asw_colonist",
		"asw_debrief_info",
		"asw_director_control",
		"asw_door",
		"asw_drone",
		"asw_drone_jumper",
		"asw_drone_uber",
		"asw_egg",
		"asw_emitter",
		"asw_env_explosion",
		"asw_env_shake",
		"asw_env_spark",
		"asw_equip_req",
		"asw_gamerules",
		"asw_grub",
		"asw_grub_sac",
		"asw_harvester",
		"asw_holdout_mode",
		"asw_holdout_spawner",
		"asw_holo_sentry",
		"asw_holoscan",
		"asw_hurt_nearest_marine",
		"asw_info_heal",
		"asw_info_message",
		"asw_intro_control",
		"asw_jukebox",
		"asw_marines_past_area",
		"asw_marker",
		"asw_menu_flashlight",
		"asw_mortarbug",
		"asw_objective_countdown",
		"asw_objective_destroy_goo",
		"asw_objective_dummy",
		"asw_objective_escape",
		"asw_objective_kill_aliens",
		"asw_objective_kill_eggs",
		"asw_objective_survive",
		"asw_objective_triggered",
		"asw_order_nearby_aliens",
		"asw_parasite",
		"asw_pickup_ammo_bag",
		"asw_pickup_autogun",
		"asw_pickup_chainsaw",
		"asw_pickup_fire_extinguisher",
		"asw_pickup_flamer",
		"asw_pickup_flares",
		"asw_pickup_flashlight",
		"asw_pickup_grenades",
		"asw_pickup_medkit",
		"asw_pickup_mines",
		"asw_pickup_mining_laser",
		"asw_pickup_pdw",
		"asw_pickup_pistol",
		"asw_pickup_prifle",
		"asw_pickup_rifle",
		"asw_pickup_sentry",
		"asw_pickup_shotgun",
		"asw_pickup_stim",
		"asw_pickup_vindicator",
		"asw_pickup_welder",
		"asw_polytest",
		"asw_prop_laserable",
		"asw_queen",
		"asw_queen_retreat_spot",
		"asw_ranger",
		"asw_remote_turret",
		"asw_scanner_noise",
		"asw_sentry_top_machinegun",
		"asw_shieldbug",
		"asw_simple_drone",
		"asw_snow_volume",
		"asw_spawn_group",
		"asw_spawner",
		"asw_stylincam",
		"asw_tech_marine_req",
		"asw_trigger_fall",
		"asw_vehicle_jeep",
		"asw_weapon_blink",
		"asw_weapon_jump_jet",
		"info_node_marine_hint",
		"trigger_asw_button_area",
		"trigger_asw_chance",
		"trigger_asw_computer_area",
		"trigger_asw_door_area",
		"trigger_asw_jump",
		"trigger_asw_marine_knockback",
		"trigger_asw_supplies_chatter",
		"trigger_asw_synup_chatter"
	};

	public BspGameFormat GameFormat => BspGameFormat.AlienSwarm;
	public IReadOnlySet<int> SupportedVersions { get; } = new HashSet<int> { 21 };
	public string DisplayName => "Alien Swarm";
	public int SpecificityScore => 100;

	public LumpHeaderLayout LumpHeaderLayout => LumpHeaderLayout.Standard;
	public BrushSideLayout BrushSideLayout => BrushSideLayout.ThinFlag;
	public StaticPropLayout StaticPropLayout => StaticPropLayout.V9;

	public IBspStructReaders GetStructReaders( int bspVersion ) => _readers;

	public bool MatchesMapName( string mapName )
	{
		return !string.IsNullOrEmpty( mapName ) && mapName.StartsWith( "asi_", StringComparison.OrdinalIgnoreCase );
	}

	public bool MatchesEntities( IReadOnlyList<string> entityClassNames )
	{
		return Signatures.Overlaps( entityClassNames );
	}
}