diff --git a/Penumbra.GameData/Data/GamePathParser.cs b/Penumbra.GameData/Data/GamePathParser.cs index d784463a..2f267d0a 100644 --- a/Penumbra.GameData/Data/GamePathParser.cs +++ b/Penumbra.GameData/Data/GamePathParser.cs @@ -51,11 +51,11 @@ internal class GamePathParser : IGamePathParser public string VfxToKey(string path) { - var match = _vfxRegexTmb.Match(path); + var match = GamePaths.Vfx.Tmb().Match(path); if (match.Success) return match.Groups["key"].Value.ToLowerInvariant(); - match = _vfxRegexPap.Match(path); + match = GamePaths.Vfx.Pap().Match(path); return match.Success ? match.Groups["key"].Value.ToLowerInvariant() : string.Empty; } @@ -136,11 +136,11 @@ internal class GamePathParser : IGamePathParser { var regexes = new Regex[] { - GamePathManager.Character.Tex.Regex(), - GamePathManager.Character.Tex.FolderRegex(), - GamePathManager.Character.Tex.SkinRegex(), - GamePathManager.Character.Tex.CatchlightRegex(), - GamePathManager.Character.Tex.DecalRegex(), + GamePaths.Character.Tex.Regex(), + GamePaths.Character.Tex.FolderRegex(), + GamePaths.Character.Tex.SkinRegex(), + GamePaths.Character.Tex.CatchlightRegex(), + GamePaths.Character.Tex.DecalRegex(), }; foreach (var regex in regexes) { @@ -154,32 +154,32 @@ internal class GamePathParser : IGamePathParser var match = (fileType, objectType) switch { - (FileType.Font, ObjectType.Font) => GamePathManager.Font.Regex().Match(path), - (FileType.Imc, ObjectType.Weapon) => GamePathManager.Weapon.Imc.Regex().Match(path), - (FileType.Imc, ObjectType.Monster) => GamePathManager.Monster.Imc.Regex().Match(path), - (FileType.Imc, ObjectType.DemiHuman) => GamePathManager.DemiHuman.Imc.Regex().Match(path), - (FileType.Imc, ObjectType.Equipment) => GamePathManager.Equipment.Imc.Regex().Match(path), - (FileType.Imc, ObjectType.Accessory) => GamePathManager.Accessory.Imc.Regex().Match(path), - (FileType.Model, ObjectType.Weapon) => GamePathManager.Weapon.Mdl.Regex().Match(path), - (FileType.Model, ObjectType.Monster) => GamePathManager.Monster.Mdl.Regex().Match(path), - (FileType.Model, ObjectType.DemiHuman) => GamePathManager.DemiHuman.Mdl.Regex().Match(path), - (FileType.Model, ObjectType.Equipment) => GamePathManager.Equipment.Mdl.Regex().Match(path), - (FileType.Model, ObjectType.Accessory) => GamePathManager.Accessory.Mdl.Regex().Match(path), - (FileType.Model, ObjectType.Character) => GamePathManager.Character.Mdl.Regex().Match(path), - (FileType.Material, ObjectType.Weapon) => GamePathManager.Weapon.Mtrl.Regex().Match(path), - (FileType.Material, ObjectType.Monster) => GamePathManager.Monster.Mtrl.Regex().Match(path), - (FileType.Material, ObjectType.DemiHuman) => GamePathManager.DemiHuman.Mtrl.Regex().Match(path), - (FileType.Material, ObjectType.Equipment) => GamePathManager.Equipment.Mtrl.Regex().Match(path), - (FileType.Material, ObjectType.Accessory) => GamePathManager.Accessory.Mtrl.Regex().Match(path), - (FileType.Material, ObjectType.Character) => GamePathManager.Character.Mtrl.Regex().Match(path), - (FileType.Texture, ObjectType.Weapon) => GamePathManager.Weapon.Tex.Regex().Match(path), - (FileType.Texture, ObjectType.Monster) => GamePathManager.Monster.Tex.Regex().Match(path), - (FileType.Texture, ObjectType.DemiHuman) => GamePathManager.DemiHuman.Tex.Regex().Match(path), - (FileType.Texture, ObjectType.Equipment) => GamePathManager.Equipment.Tex.Regex().Match(path), - (FileType.Texture, ObjectType.Accessory) => GamePathManager.Accessory.Tex.Regex().Match(path), + (FileType.Font, ObjectType.Font) => GamePaths.Font.Regex().Match(path), + (FileType.Imc, ObjectType.Weapon) => GamePaths.Weapon.Imc.Regex().Match(path), + (FileType.Imc, ObjectType.Monster) => GamePaths.Monster.Imc.Regex().Match(path), + (FileType.Imc, ObjectType.DemiHuman) => GamePaths.DemiHuman.Imc.Regex().Match(path), + (FileType.Imc, ObjectType.Equipment) => GamePaths.Equipment.Imc.Regex().Match(path), + (FileType.Imc, ObjectType.Accessory) => GamePaths.Accessory.Imc.Regex().Match(path), + (FileType.Model, ObjectType.Weapon) => GamePaths.Weapon.Mdl.Regex().Match(path), + (FileType.Model, ObjectType.Monster) => GamePaths.Monster.Mdl.Regex().Match(path), + (FileType.Model, ObjectType.DemiHuman) => GamePaths.DemiHuman.Mdl.Regex().Match(path), + (FileType.Model, ObjectType.Equipment) => GamePaths.Equipment.Mdl.Regex().Match(path), + (FileType.Model, ObjectType.Accessory) => GamePaths.Accessory.Mdl.Regex().Match(path), + (FileType.Model, ObjectType.Character) => GamePaths.Character.Mdl.Regex().Match(path), + (FileType.Material, ObjectType.Weapon) => GamePaths.Weapon.Mtrl.Regex().Match(path), + (FileType.Material, ObjectType.Monster) => GamePaths.Monster.Mtrl.Regex().Match(path), + (FileType.Material, ObjectType.DemiHuman) => GamePaths.DemiHuman.Mtrl.Regex().Match(path), + (FileType.Material, ObjectType.Equipment) => GamePaths.Equipment.Mtrl.Regex().Match(path), + (FileType.Material, ObjectType.Accessory) => GamePaths.Accessory.Mtrl.Regex().Match(path), + (FileType.Material, ObjectType.Character) => GamePaths.Character.Mtrl.Regex().Match(path), + (FileType.Texture, ObjectType.Weapon) => GamePaths.Weapon.Tex.Regex().Match(path), + (FileType.Texture, ObjectType.Monster) => GamePaths.Monster.Tex.Regex().Match(path), + (FileType.Texture, ObjectType.DemiHuman) => GamePaths.DemiHuman.Tex.Regex().Match(path), + (FileType.Texture, ObjectType.Equipment) => GamePaths.Equipment.Tex.Regex().Match(path), + (FileType.Texture, ObjectType.Accessory) => GamePaths.Accessory.Tex.Regex().Match(path), (FileType.Texture, ObjectType.Character) => TestCharacterTextures(path), - (FileType.Texture, ObjectType.Icon) => GamePathManager.Icon.Regex().Match(path), - (FileType.Texture, ObjectType.Map) => GamePathManager.Map.Regex().Match(path), + (FileType.Texture, ObjectType.Icon) => GamePaths.Icon.Regex().Match(path), + (FileType.Texture, ObjectType.Map) => GamePaths.Map.Regex().Match(path), _ => Match.Empty, }; @@ -299,10 +299,4 @@ internal class GamePathParser : IGamePathParser return GameObjectInfo.Map(fileType, map[0], map[1], map[2], map[3], variant); } - - - private readonly Regex _vfxRegexTmb = new(@"chara[\/]action[\/](?'key'[^\s]+?)\.tmb", RegexOptions.Compiled | RegexOptions.IgnoreCase); - - private readonly Regex _vfxRegexPap = new(@"chara[\/]human[\/]c0101[\/]animation[\/]a0001[\/][^\s]+?[\/](?'key'[^\s]+?)\.pap", - RegexOptions.Compiled | RegexOptions.IgnoreCase); } diff --git a/Penumbra.GameData/Data/GamePaths.cs b/Penumbra.GameData/Data/GamePaths.cs index 3d70c13d..22d5ac69 100644 --- a/Penumbra.GameData/Data/GamePaths.cs +++ b/Penumbra.GameData/Data/GamePaths.cs @@ -7,14 +7,9 @@ namespace Penumbra.GameData.Data; public static partial class GamePaths { - private static readonly Regex RaceCodeRegex = new(@"c(?'racecode'\d{4})", RegexOptions.Compiled); - - //[GeneratedRegex(@"c(?'racecode'\d{4})")] + [GeneratedRegex(@"c(?'racecode'\d{4})")] public static partial Regex RaceCodeParser(); - public static partial Regex RaceCodeParser() - => RaceCodeRegex; - public static GenderRace ParseRaceCode(string path) { var match = RaceCodeParser().Match(path); @@ -28,8 +23,8 @@ public static partial class GamePaths { public static partial class Imc { - // [GeneratedRegex(@"chara/monster/m(?'monster'\d{4})/obj/body/b(?'id'\d{4})/b\k'id'\.imc")] - // public static partial Regex Regex(); + [GeneratedRegex(@"chara/monster/m(?'monster'\d{4})/obj/body/b(?'id'\d{4})/b\k'id'\.imc")] + public static partial Regex Regex(); public static string Path(SetId monsterId, SetId bodyId) => $"chara/monster/m{monsterId.Value:D4}/obj/body/b{bodyId.Value:D4}/b{bodyId.Value:D4}.imc"; @@ -37,8 +32,8 @@ public static partial class GamePaths public static partial class Mdl { - // [GeneratedRegex(@"chara/monster/m(?'monster'\d{4})/obj/body/b(?'id'\d{4})/model/m\k'monster'b\k'id'\.mdl")] - // public static partial Regex Regex(); + [GeneratedRegex(@"chara/monster/m(?'monster'\d{4})/obj/body/b(?'id'\d{4})/model/m\k'monster'b\k'id'\.mdl")] + public static partial Regex Regex(); public static string Path(SetId monsterId, SetId bodyId) => $"chara/monster/m{monsterId.Value:D4}/obj/body/b{bodyId.Value:D4}/model/m{monsterId.Value:D4}b{bodyId.Value:D4}.mdl"; @@ -46,8 +41,9 @@ public static partial class GamePaths public static partial class Mtrl { - // [GeneratedRegex(@"chara/monster/m(?'monster'\d{4})/obj/body/b(?'id'\d{4})/material/v(?'variant'\d{4})/mt_m\k'monster'b\k'id'_[a-z]+\.mtrl")] - // public static partial Regex Regex(); + [GeneratedRegex( + @"chara/monster/m(?'monster'\d{4})/obj/body/b(?'id'\d{4})/material/v(?'variant'\d{4})/mt_m\k'monster'b\k'id'_[a-z]+\.mtrl")] + public static partial Regex Regex(); public static string Path(SetId monsterId, SetId bodyId, byte variant, string suffix) => $"chara/monster/m{monsterId.Value:D4}/obj/body/b{bodyId.Value:D4}/material/v{variant:D4}/mt_m{monsterId.Value:D4}b{bodyId.Value:D4}_{suffix}.mtrl"; @@ -55,8 +51,9 @@ public static partial class GamePaths public static partial class Tex { - // [GeneratedRegex(@"chara/monster/m(?'monster'\d{4})/obj/body/b(?'id'\d{4})/texture/v(?'variant'\d{2})_m\k'monster'b\k'id'(_[a-z])?_[a-z]\.tex")] - // public static partial Regex Regex(); + [GeneratedRegex( + @"chara/monster/m(?'monster'\d{4})/obj/body/b(?'id'\d{4})/texture/v(?'variant'\d{2})_m\k'monster'b\k'id'(_[a-z])?_[a-z]\.tex")] + public static partial Regex Regex(); public static string Path(SetId monsterId, SetId bodyId, byte variant, char suffix1, char suffix2 = '\0') => $"chara/monster/m{monsterId.Value:D4}/obj/body/b{bodyId.Value:D4}/texture/v{variant:D2}_m{monsterId.Value:D4}b{bodyId.Value:D4}{(suffix2 != '\0' ? $"_{suffix2}" : string.Empty)}_{suffix1}.tex"; @@ -85,8 +82,8 @@ public static partial class GamePaths { public static partial class Imc { - // [GeneratedRegex(@"chara/weapon/w(?'id'\d{4})/obj/body/b(?'weapon'\d{4})/b\k'weapon'\.imc")] - // public static partial Regex Regex(); + [GeneratedRegex(@"chara/weapon/w(?'id'\d{4})/obj/body/b(?'weapon'\d{4})/b\k'weapon'\.imc")] + public static partial Regex Regex(); public static string Path(SetId weaponId, SetId bodyId) => $"chara/weapon/w{weaponId.Value:D4}/obj/body/b{bodyId.Value:D4}/b{bodyId.Value:D4}.imc"; @@ -94,8 +91,8 @@ public static partial class GamePaths public static partial class Mdl { - // [GeneratedRegex(@"chara/weapon/w(?'id'\d{4})/obj/body/b(?'weapon'\d{4})/model/w\k'id'b\k'weapon'\.mdl")] - // public static partial Regex Regex(); + [GeneratedRegex(@"chara/weapon/w(?'id'\d{4})/obj/body/b(?'weapon'\d{4})/model/w\k'id'b\k'weapon'\.mdl")] + public static partial Regex Regex(); public static string Path(SetId weaponId, SetId bodyId) => $"chara/weapon/w{weaponId.Value:D4}/obj/body/b{bodyId.Value:D4}/model/w{weaponId.Value:D4}b{bodyId.Value:D4}.mdl"; @@ -103,8 +100,9 @@ public static partial class GamePaths public static partial class Mtrl { - // [GeneratedRegex(@"chara/weapon/w(?'id'\d{4})/obj/body/b(?'weapon'\d{4})/material/v(?'variant'\d{4})/mt_w\k'id'b\k'weapon'_[a-z]+\.mtrl")] - // public static partial Regex Regex(); + [GeneratedRegex( + @"chara/weapon/w(?'id'\d{4})/obj/body/b(?'weapon'\d{4})/material/v(?'variant'\d{4})/mt_w\k'id'b\k'weapon'_[a-z]+\.mtrl")] + public static partial Regex Regex(); public static string Path(SetId weaponId, SetId bodyId, byte variant, string suffix) => $"chara/weapon/w{weaponId.Value:D4}/obj/body/b{bodyId.Value:D4}/material/v{variant:D4}/mt_w{weaponId.Value:D4}b{bodyId.Value:D4}_{suffix}.mtrl"; @@ -112,8 +110,9 @@ public static partial class GamePaths public static partial class Tex { - // [GeneratedRegex(@"chara/weapon/w(?'id'\d{4})/obj/body/b(?'weapon'\d{4})/texture/v(?'variant'\d{2})_w\k'id'b\k'weapon'(_[a-z])?_[a-z]\.tex")] - // public static partial Regex Regex(); + [GeneratedRegex( + @"chara/weapon/w(?'id'\d{4})/obj/body/b(?'weapon'\d{4})/texture/v(?'variant'\d{2})_w\k'id'b\k'weapon'(_[a-z])?_[a-z]\.tex")] + public static partial Regex Regex(); public static string Path(SetId weaponId, SetId bodyId, byte variant, char suffix1, char suffix2 = '\0') => $"chara/weapon/w{weaponId.Value:D4}/obj/body/b{bodyId.Value:D4}/texture/v{variant:D2}_w{weaponId.Value:D4}b{bodyId.Value:D4}{(suffix2 != '\0' ? $"_{suffix2}" : string.Empty)}_{suffix1}.tex"; @@ -124,8 +123,8 @@ public static partial class GamePaths { public static partial class Imc { - // [GeneratedRegex(@"chara/demihuman/d(?'id'\d{4})/obj/equipment/e(?'equip'\d{4})/e\k'equip'\.imc")] - // public static partial Regex Regex(); + [GeneratedRegex(@"chara/demihuman/d(?'id'\d{4})/obj/equipment/e(?'equip'\d{4})/e\k'equip'\.imc")] + public static partial Regex Regex(); public static string Path(SetId demiId, SetId equipId) => $"chara/demihuman/d{demiId.Value:D4}/obj/equipment/e{equipId.Value:D4}/e{equipId.Value:D4}.imc"; @@ -133,8 +132,8 @@ public static partial class GamePaths public static partial class Mdl { - // [GeneratedRegex(@"chara/demihuman/d(?'id'\d{4})/obj/equipment/e(?'equip'\d{4})/model/d\k'id'e\k'equip'_(?'slot'[a-z]{3})\.mdl")] - // public static partial Regex Regex(); + [GeneratedRegex(@"chara/demihuman/d(?'id'\d{4})/obj/equipment/e(?'equip'\d{4})/model/d\k'id'e\k'equip'_(?'slot'[a-z]{3})\.mdl")] + public static partial Regex Regex(); public static string Path(SetId demiId, SetId equipId, EquipSlot slot) => $"chara/demihuman/d{demiId.Value:D4}/obj/equipment/e{equipId.Value:D4}/model/d{demiId.Value:D4}e{equipId.Value:D4}_{slot.ToSuffix()}.mdl"; @@ -142,8 +141,9 @@ public static partial class GamePaths public static partial class Mtrl { - // [GeneratedRegex(@"chara/demihuman/d(?'id'\d{4})/obj/equipment/e(?'equip'\d{4})/material/v(?'variant'\d{4})/mt_d\k'id'e\k'equip'_(?'slot'[a-z]{3})_[a-z]+\.mtrl")] - // public static partial Regex Regex(); + [GeneratedRegex( + @"chara/demihuman/d(?'id'\d{4})/obj/equipment/e(?'equip'\d{4})/material/v(?'variant'\d{4})/mt_d\k'id'e\k'equip'_(?'slot'[a-z]{3})_[a-z]+\.mtrl")] + public static partial Regex Regex(); public static string Path(SetId demiId, SetId equipId, EquipSlot slot, byte variant, string suffix) => $"chara/demihuman/d{demiId.Value:D4}/obj/equipment/e{equipId.Value:D4}/material/v{variant:D4}/mt_d{demiId.Value:D4}e{equipId.Value:D4}_{slot.ToSuffix()}_{suffix}.mtrl"; @@ -151,8 +151,9 @@ public static partial class GamePaths public static partial class Tex { - // [GeneratedRegex(@"chara/demihuman/d(?'id'\d{4})/obj/equipment/e(?'equip'\d{4})/texture/v(?'variant'\d{2})_d\k'id'e\k'equip'_(?'slot'[a-z]{3})(_[a-z])?_[a-z]\.tex")] - // public static partial Regex Regex(); + [GeneratedRegex( + @"chara/demihuman/d(?'id'\d{4})/obj/equipment/e(?'equip'\d{4})/texture/v(?'variant'\d{2})_d\k'id'e\k'equip'_(?'slot'[a-z]{3})(_[a-z])?_[a-z]\.tex")] + public static partial Regex Regex(); public static string Path(SetId demiId, SetId equipId, EquipSlot slot, byte variant, char suffix1, char suffix2 = '\0') => $"chara/demihuman/d{demiId.Value:D4}/obj/equipment/e{equipId.Value:D4}/texture/v{variant:D2}_d{demiId.Value:D4}e{equipId.Value:D4}_{slot.ToSuffix()}{(suffix2 != '\0' ? $"_{suffix2}" : string.Empty)}_{suffix1}.tex"; @@ -163,8 +164,8 @@ public static partial class GamePaths { public static partial class Imc { - // [GeneratedRegex(@"chara/equipment/e(?'id'\d{4})/e\k'id'\.imc")] - // public static partial Regex Regex(); + [GeneratedRegex(@"chara/equipment/e(?'id'\d{4})/e\k'id'\.imc")] + public static partial Regex Regex(); public static string Path(SetId equipId) => $"chara/equipment/e{equipId.Value:D4}/e{equipId.Value:D4}.imc"; @@ -172,8 +173,8 @@ public static partial class GamePaths public static partial class Mdl { - // [GeneratedRegex(@"chara/equipment/e(?'id'\d{4})/model/c(?'race'\d{4})e\k'id'_(?'slot'[a-z]{3})\.mdl")] - // public static partial Regex Regex(); + [GeneratedRegex(@"chara/equipment/e(?'id'\d{4})/model/c(?'race'\d{4})e\k'id'_(?'slot'[a-z]{3})\.mdl")] + public static partial Regex Regex(); public static string Path(SetId equipId, GenderRace raceCode, EquipSlot slot) => $"chara/equipment/e{equipId.Value:D4}/model/c{raceCode.ToRaceCode()}e{equipId.Value:D4}_{slot.ToSuffix()}.mdl"; @@ -181,8 +182,9 @@ public static partial class GamePaths public static partial class Mtrl { - // [GeneratedRegex(@"chara/equipment/e(?'id'\d{4})/material/v(?'variant'\d{4})/mt_c(?'race'\d{4})e\k'id'_(?'slot'[a-z]{3})_[a-z]+\.mtrl")] - // public static partial Regex Regex(); + [GeneratedRegex( + @"chara/equipment/e(?'id'\d{4})/material/v(?'variant'\d{4})/mt_c(?'race'\d{4})e\k'id'_(?'slot'[a-z]{3})_[a-z]+\.mtrl")] + public static partial Regex Regex(); public static string Path(SetId equipId, GenderRace raceCode, EquipSlot slot, byte variant, string suffix) => $"{FolderPath(equipId, variant)}/mt_c{raceCode.ToRaceCode()}e{equipId.Value:D4}_{slot.ToSuffix()}_{suffix}.mtrl"; @@ -193,8 +195,9 @@ public static partial class GamePaths public static partial class Tex { - // [GeneratedRegex(@"chara/equipment/e(?'id'\d{4})/texture/v(?'variant'\d{2})_c(?'race'\d{4})e\k'id'_(?'slot'[a-z]{3})(_[a-z])?_[a-z]\.tex")] - // public static partial Regex Regex(); + [GeneratedRegex( + @"chara/equipment/e(?'id'\d{4})/texture/v(?'variant'\d{2})_c(?'race'\d{4})e\k'id'_(?'slot'[a-z]{3})(_[a-z])?_[a-z]\.tex")] + public static partial Regex Regex(); public static string Path(SetId equipId, GenderRace raceCode, EquipSlot slot, byte variant, char suffix1, char suffix2 = '\0') => $"chara/equipment/e{equipId.Value:D4}/texture/v{variant:D2}_c{raceCode.ToRaceCode()}e{equipId.Value:D4}_{slot.ToSuffix()}{(suffix2 != '\0' ? $"_{suffix2}" : string.Empty)}_{suffix1}.tex"; @@ -202,8 +205,8 @@ public static partial class GamePaths public static partial class Avfx { - //[GeneratedRegex(@"chara/equipment/e(?'id'\d{4})/vfx/eff/ve(?'variant'\d{4})\.avfx")] - //public static partial Regex Regex(); + [GeneratedRegex(@"chara/equipment/e(?'id'\d{4})/vfx/eff/ve(?'variant'\d{4})\.avfx")] + public static partial Regex Regex(); public static string Path(SetId equipId, byte effectId) => $"chara/equipment/e{equipId.Value:D4}/vfx/eff/ve{effectId:D4}.avfx"; @@ -211,8 +214,8 @@ public static partial class GamePaths public static partial class Decal { - //[GeneratedRegex(@"chara/common/texture/decal_equip/-decal_(?'decalId'\d{3})\.tex")] - //public static partial Regex Regex(); + [GeneratedRegex(@"chara/common/texture/decal_equip/-decal_(?'decalId'\d{3})\.tex")] + public static partial Regex Regex(); public static string Path(byte decalId) => $"chara/common/texture/decal_equip/-decal_{decalId:D3}.tex"; @@ -223,8 +226,8 @@ public static partial class GamePaths { public static partial class Imc { - // [GeneratedRegex(@"chara/accessory/a(?'id'\d{4})/a\k'id'\.imc")] - // public static partial Regex Regex(); + [GeneratedRegex(@"chara/accessory/a(?'id'\d{4})/a\k'id'\.imc")] + public static partial Regex Regex(); public static string Path(SetId accessoryId) => $"chara/accessory/a{accessoryId.Value:D4}/a{accessoryId.Value:D4}.imc"; @@ -232,8 +235,8 @@ public static partial class GamePaths public static partial class Mdl { - // [GeneratedRegex(@"chara/accessory/a(?'id'\d{4})/model/c(?'race'\d{4})a\k'id'_(?'slot'[a-z]{3})\.mdl")] - // public static partial Regex Regex(); + [GeneratedRegex(@"chara/accessory/a(?'id'\d{4})/model/c(?'race'\d{4})a\k'id'_(?'slot'[a-z]{3})\.mdl")] + public static partial Regex Regex(); public static string Path(SetId accessoryId, GenderRace raceCode, EquipSlot slot) => $"chara/accessory/a{accessoryId.Value:D4}/model/c{raceCode.ToRaceCode()}a{accessoryId.Value:D4}_{slot.ToSuffix()}.mdl"; @@ -241,8 +244,9 @@ public static partial class GamePaths public static partial class Mtrl { - // [GeneratedRegex(@"chara/accessory/a(?'id'\d{4})/material/v(?'variant'\d{4})/mt_c(?'race'\d{4})a\k'id'_(?'slot'[a-z]{3})_[a-z]+\.mtrl")] - // public static partial Regex Regex(); + [GeneratedRegex( + @"chara/accessory/a(?'id'\d{4})/material/v(?'variant'\d{4})/mt_c(?'race'\d{4})a\k'id'_(?'slot'[a-z]{3})_[a-z]+\.mtrl")] + public static partial Regex Regex(); public static string Path(SetId accessoryId, GenderRace raceCode, EquipSlot slot, byte variant, string suffix) => $"{FolderPath(accessoryId, variant)}/c{raceCode.ToRaceCode()}a{accessoryId.Value:D4}_{slot.ToSuffix()}_{suffix}.mtrl"; @@ -253,8 +257,9 @@ public static partial class GamePaths public static partial class Tex { - // [GeneratedRegex(@"chara/accessory/a(?'id'\d{4})/texture/v(?'variant'\d{2})_c(?'race'\d{4})a\k'id'_(?'slot'[a-z]{3})(_[a-z])?_[a-z]\.tex")] - // public static partial Regex Regex(); + [GeneratedRegex( + @"chara/accessory/a(?'id'\d{4})/texture/v(?'variant'\d{2})_c(?'race'\d{4})a\k'id'_(?'slot'[a-z]{3})(_[a-z])?_[a-z]\.tex")] + public static partial Regex Regex(); public static string Path(SetId accessoryId, GenderRace raceCode, EquipSlot slot, byte variant, char suffix1, char suffix2 = '\0') => $"chara/accessory/a{accessoryId.Value:D4}/texture/v{variant:D2}_c{raceCode.ToRaceCode()}a{accessoryId.Value:D4}_{slot.ToSuffix()}{(suffix2 != '\0' ? $"_{suffix2}" : string.Empty)}_{suffix1}.tex"; @@ -280,8 +285,9 @@ public static partial class GamePaths { public static partial class Mdl { - // [GeneratedRegex(@"chara/human/c(?'race'\d{4})/obj/(?'type'[a-z]+)/(?'typeabr'[a-z])(?'id'\d{4})/model/c\k'race'\k'typeabr'\k'id'_(?'slot'[a-z]{3})\.mdl")] - // public static partial Regex Regex(); + [GeneratedRegex( + @"chara/human/c(?'race'\d{4})/obj/(?'type'[a-z]+)/(?'typeabr'[a-z])(?'id'\d{4})/model/c\k'race'\k'typeabr'\k'id'_(?'slot'[a-z]{3})\.mdl")] + public static partial Regex Regex(); public static string Path(GenderRace raceCode, BodySlot slot, SetId slotId, CustomizationType type) => $"chara/human/c{raceCode.ToRaceCode()}/obj/{slot.ToSuffix()}/{slot.ToAbbreviation()}{slotId.Value:D4}/model/c{raceCode.ToRaceCode()}{slot.ToAbbreviation()}{slotId.Value:D4}_{type.ToSuffix()}.mdl"; @@ -289,8 +295,9 @@ public static partial class GamePaths public static partial class Mtrl { - // [GeneratedRegex(@"chara/human/c(?'race'\d{4})/obj/(?'type'[a-z]+)/(?'typeabr'[a-z])(?'id'\d{4})/material(/v(?'variant'\d{4}))?/mt_c\k'race'\k'typeabr'\k'id'(_(?'slot'[a-z]{3}))?_[a-z]+\.mtrl")] - // public static partial Regex Regex(); + [GeneratedRegex( + @"chara/human/c(?'race'\d{4})/obj/(?'type'[a-z]+)/(?'typeabr'[a-z])(?'id'\d{4})/material(/v(?'variant'\d{4}))?/mt_c\k'race'\k'typeabr'\k'id'(_(?'slot'[a-z]{3}))?_[a-z]+\.mtrl")] + public static partial Regex Regex(); public static string FolderPath(GenderRace raceCode, BodySlot slot, SetId slotId, byte variant = byte.MaxValue) => $"chara/human/c{raceCode.ToRaceCode()}/obj/{slot.ToSuffix()}/{slot.ToAbbreviation()}{slotId.Value:D4}/material{(variant != byte.MaxValue ? $"/v{variant:D4}" : string.Empty)}"; @@ -342,8 +349,9 @@ public static partial class GamePaths public static partial class Tex { - // [GeneratedRegex(@"chara/human/c(?'race'\d{4})/obj/(?'type'[a-z]+)/(?'typeabr'[a-z])(?'id'\d{4})/texture/(?'minus'(--)?)(v(?'variant'\d{2})_)?c\k'race'\k'typeabr'\k'id'(_(?'slot'[a-z]{3}))?(_[a-z])?_[a-z]\.tex")] - // public static partial Regex Regex(); + [GeneratedRegex( + @"chara/human/c(?'race'\d{4})/obj/(?'type'[a-z]+)/(?'typeabr'[a-z])(?'id'\d{4})/texture/(?'minus'(--)?)(v(?'variant'\d{2})_)?c\k'race'\k'typeabr'\k'id'(_(?'slot'[a-z]{3}))?(_[a-z])?_[a-z]\.tex")] + public static partial Regex Regex(); public static string Path(GenderRace raceCode, BodySlot slot, SetId slotId, char suffix1, bool minus = false, CustomizationType type = CustomizationType.Unknown, byte variant = byte.MaxValue, char suffix2 = '\0') @@ -353,35 +361,44 @@ public static partial class GamePaths + $"c{raceCode.ToRaceCode()}{slot.ToAbbreviation()}{slotId.Value:D4}{(type != CustomizationType.Unknown ? $"_{type.ToSuffix()}" : string.Empty)}{(suffix2 != '\0' ? $"_{suffix2}" : string.Empty)}_{suffix1}.tex"; - // [GeneratedRegex(@"chara/common/texture/(?'catchlight'catchlight)(.*)\.tex")] - // public static partial Regex CatchlightRegex(); + [GeneratedRegex(@"chara/common/texture/(?'catchlight'catchlight)(.*)\.tex")] + public static partial Regex CatchlightRegex(); - // [GeneratedRegex(@"chara/common/texture/skin(?'skin'.*)\.tex")] - // public static partial Regex SkinRegex(); + [GeneratedRegex(@"chara/common/texture/skin(?'skin'.*)\.tex")] + public static partial Regex SkinRegex(); - // [GeneratedRegex(@"chara/common/texture/decal_(?'location'[a-z]+)/[-_]?decal_(?'id'\d+).tex")] - // public static partial Regex DecalRegex(); + [GeneratedRegex(@"chara/common/texture/decal_(?'location'[a-z]+)/[-_]?decal_(?'id'\d+).tex")] + public static partial Regex DecalRegex(); - // [GeneratedRegex(@"chara/human/c(?'race'\d{4})/obj/(?'type'[a-z]+)/(?'typeabr'[a-z])(?'id'\d{4})/texture")] - // public static partial Regex FolderRegex(); + [GeneratedRegex(@"chara/human/c(?'race'\d{4})/obj/(?'type'[a-z]+)/(?'typeabr'[a-z])(?'id'\d{4})/texture")] + public static partial Regex FolderRegex(); } } public static partial class Icon { - // [GeneratedRegex(@"ui/icon/(?'group'\d*)(/(?'lang'[a-z]{2}))?(/(?'hq'hq))?/(?'id'\d*)(?'hr'_hr1)?\.tex")] - // public static partial Regex Regex(); + [GeneratedRegex(@"ui/icon/(?'group'\d*)(/(?'lang'[a-z]{2}))?(/(?'hq'hq))?/(?'id'\d*)(?'hr'_hr1)?\.tex")] + public static partial Regex Regex(); } public static partial class Map { - // [GeneratedRegex(@"ui/map/(?'id'[a-z0-9]{4})/(?'variant'\d{2})/\k'id'\k'variant'(?'suffix'[a-z])?(_[a-z])?\.tex")] - // public static partial Regex Regex(); + [GeneratedRegex(@"ui/map/(?'id'[a-z0-9]{4})/(?'variant'\d{2})/\k'id'\k'variant'(?'suffix'[a-z])?(_[a-z])?\.tex")] + public static partial Regex Regex(); } public static partial class Font { - // [GeneratedRegex(@"common/font/(?'fontname'.*)_(?'id'\d\d)(_lobby)?\.fdt")] - // public static partial Regex Regex(); + [GeneratedRegex(@"common/font/(?'fontname'.*)_(?'id'\d\d)(_lobby)?\.fdt")] + public static partial Regex Regex(); + } + + public static partial class Vfx + { + [GeneratedRegex(@"chara[\/]action[\/](?'key'[^\s]+?)\.tmb", RegexOptions.IgnoreCase)] + public static partial Regex Tmb(); + + [GeneratedRegex(@"chara[\/]human[\/]c0101[\/]animation[\/]a0001[\/][^\s]+?[\/](?'key'[^\s]+?)\.pap", RegexOptions.IgnoreCase)] + public static partial Regex Pap(); } }