Editor/Decompiler/Formats/Descriptors/VtmbBspFormatDescriptor.cs
using BspImport.Decompiler.Formats.Readers;
namespace BspImport.Decompiler.Formats.Descriptors;
/// <summary>
/// Format descriptor for Vampire: The Masquerade - Bloodlines (BSP version 17).
/// </summary>
public sealed class VtmbBspFormatDescriptor : IBspFormatDescriptor
{
private static readonly IBspStructReaders _readers = new VtmbBspStructReaders();
/// <summary>
/// Known VTMB map name prefixes. All retail VTMB maps follow this convention.
/// </summary>
private static readonly string[] MapPrefixes = ["la_", "sm_", "ch_", "hw_"];
private static readonly HashSet<string> Signatures = new( StringComparer.OrdinalIgnoreCase )
{
"events_world",
"events_player",
"inspection_node",
"intersting_place",
"item_container_animated",
"item_container_lock",
"item_g_watch_fancy",
"item_g_astrolite",
"item_g_lockpick",
"item_m_money_envelope",
"inspection_node",
"npc_VDialogPedestrian",
"npc_VHumanCombatant",
"npc_VPedestrian",
"npc_VProneDialog",
"npc_VVampire",
"params_particle",
"prop_doorknob",
"prop_doorknob_electronic",
"prop_hacking",
};
public BspGameFormat GameFormat => BspGameFormat.VampireBloodlines;
public IReadOnlySet<int> SupportedVersions { get; } = new HashSet<int> { 17 };
public string DisplayName => "Vampire: The Masquerade – Bloodlines (BSP v17)";
public int SpecificityScore => 100;
public LumpHeaderLayout LumpHeaderLayout => LumpHeaderLayout.Standard;
public BrushSideLayout BrushSideLayout => BrushSideLayout.Standard;
public StaticPropLayout StaticPropLayout => StaticPropLayout.V4;
public IBspStructReaders GetStructReaders( int bspVersion ) => _readers;
public bool MatchesMapName( string mapName )
{
if ( string.IsNullOrEmpty( mapName ) )
return true;
return MapPrefixes.Any( prefix =>
mapName.StartsWith( prefix, StringComparison.OrdinalIgnoreCase ) );
}
public bool MatchesEntities( IReadOnlyList<string> entityClassNames )
{
return Signatures.Overlaps( entityClassNames );
}
}