mirror of
https://github.com/xivdev/Penumbra.git
synced 2026-02-21 23:37:47 +01:00
Fix some bugs and start work on new collections tab.
This commit is contained in:
parent
e9fc57022e
commit
fba5bc6820
26 changed files with 1346 additions and 717 deletions
|
|
@ -13,24 +13,35 @@ using Penumbra.Util;
|
|||
|
||||
namespace Penumbra.Collections.Manager;
|
||||
|
||||
public class ActiveCollectionData
|
||||
{
|
||||
public ModCollection Current { get; internal set; } = ModCollection.Empty;
|
||||
public ModCollection Default { get; internal set; } = ModCollection.Empty;
|
||||
public ModCollection Interface { get; internal set; } = ModCollection.Empty;
|
||||
|
||||
public readonly ModCollection?[] SpecialCollections = new ModCollection?[Enum.GetValues<Api.Enums.ApiCollectionType>().Length - 3];
|
||||
}
|
||||
|
||||
public class ActiveCollections : ISavable, IDisposable
|
||||
{
|
||||
public const int Version = 1;
|
||||
|
||||
private readonly CollectionStorage _storage;
|
||||
private readonly CommunicatorService _communicator;
|
||||
private readonly SaveService _saveService;
|
||||
private readonly CollectionStorage _storage;
|
||||
private readonly CommunicatorService _communicator;
|
||||
private readonly SaveService _saveService;
|
||||
private readonly ActiveCollectionData _data;
|
||||
|
||||
public ActiveCollections(Configuration config, CollectionStorage storage, ActorService actors, CommunicatorService communicator, SaveService saveService)
|
||||
public ActiveCollections(Configuration config, CollectionStorage storage, ActorService actors, CommunicatorService communicator, SaveService saveService, ActiveCollectionData data)
|
||||
{
|
||||
_storage = storage;
|
||||
_communicator = communicator;
|
||||
_saveService = saveService;
|
||||
_data = data;
|
||||
Current = storage.DefaultNamed;
|
||||
Default = storage.DefaultNamed;
|
||||
Interface = storage.DefaultNamed;
|
||||
Individuals = new IndividualCollections(actors.AwaitedService, config);
|
||||
_communicator.CollectionChange.Subscribe(OnCollectionChange);
|
||||
_communicator.CollectionChange.Subscribe(OnCollectionChange, -100);
|
||||
LoadCollections();
|
||||
UpdateCurrentCollectionInUse();
|
||||
}
|
||||
|
|
@ -39,16 +50,28 @@ public class ActiveCollections : ISavable, IDisposable
|
|||
=> _communicator.CollectionChange.Unsubscribe(OnCollectionChange);
|
||||
|
||||
/// <summary> The collection currently selected for changing settings. </summary>
|
||||
public ModCollection Current { get; private set; }
|
||||
public ModCollection Current
|
||||
{
|
||||
get => _data.Current;
|
||||
private set => _data.Current = value;
|
||||
}
|
||||
|
||||
/// <summary> Whether the currently selected collection is used either directly via assignment or via inheritance. </summary>
|
||||
public bool CurrentCollectionInUse { get; private set; }
|
||||
|
||||
/// <summary> The collection used for general file redirections and all characters not specifically named. </summary>
|
||||
public ModCollection Default { get; private set; }
|
||||
public ModCollection Default
|
||||
{
|
||||
get => _data.Default;
|
||||
private set => _data.Default = value;
|
||||
}
|
||||
|
||||
/// <summary> The collection used for all files categorized as UI files. </summary>
|
||||
public ModCollection Interface { get; private set; }
|
||||
public ModCollection Interface
|
||||
{
|
||||
get => _data.Interface;
|
||||
private set => _data.Interface = value;
|
||||
}
|
||||
|
||||
/// <summary> The list of individual assignments. </summary>
|
||||
public readonly IndividualCollections Individuals;
|
||||
|
|
@ -58,16 +81,17 @@ public class ActiveCollections : ISavable, IDisposable
|
|||
=> Individuals.TryGetCollection(identifier, out var c) ? c : Default;
|
||||
|
||||
/// <summary> The list of group assignments. </summary>
|
||||
private readonly ModCollection?[] _specialCollections = new ModCollection?[Enum.GetValues<Api.Enums.ApiCollectionType>().Length - 3];
|
||||
private ModCollection?[] SpecialCollections
|
||||
=> _data.SpecialCollections;
|
||||
|
||||
/// <summary> Return all actually assigned group assignments. </summary>
|
||||
public IEnumerable<KeyValuePair<CollectionType, ModCollection>> SpecialAssignments
|
||||
{
|
||||
get
|
||||
{
|
||||
for (var i = 0; i < _specialCollections.Length; ++i)
|
||||
for (var i = 0; i < SpecialCollections.Length; ++i)
|
||||
{
|
||||
var collection = _specialCollections[i];
|
||||
var collection = SpecialCollections[i];
|
||||
if (collection != null)
|
||||
yield return new KeyValuePair<CollectionType, ModCollection>((CollectionType)i, collection);
|
||||
}
|
||||
|
|
@ -82,7 +106,7 @@ public class ActiveCollections : ISavable, IDisposable
|
|||
public ModCollection? ByType(CollectionType type, ActorIdentifier identifier)
|
||||
{
|
||||
if (type.IsSpecial())
|
||||
return _specialCollections[(int)type];
|
||||
return SpecialCollections[(int)type];
|
||||
|
||||
return type switch
|
||||
{
|
||||
|
|
@ -94,13 +118,13 @@ public class ActiveCollections : ISavable, IDisposable
|
|||
};
|
||||
}
|
||||
|
||||
/// <summary> Create a special collection if it does not exist and set it to Empty. </summary>
|
||||
/// <summary> Create a special collection if it does not exist and set it to the current default. </summary>
|
||||
public bool CreateSpecialCollection(CollectionType collectionType)
|
||||
{
|
||||
if (!collectionType.IsSpecial() || _specialCollections[(int)collectionType] != null)
|
||||
if (!collectionType.IsSpecial() || SpecialCollections[(int)collectionType] != null)
|
||||
return false;
|
||||
|
||||
_specialCollections[(int)collectionType] = Default;
|
||||
SpecialCollections[(int)collectionType] = Default;
|
||||
_communicator.CollectionChange.Invoke(collectionType, null, Default, string.Empty);
|
||||
return true;
|
||||
}
|
||||
|
|
@ -111,11 +135,11 @@ public class ActiveCollections : ISavable, IDisposable
|
|||
if (!collectionType.IsSpecial())
|
||||
return;
|
||||
|
||||
var old = _specialCollections[(int)collectionType];
|
||||
var old = SpecialCollections[(int)collectionType];
|
||||
if (old == null)
|
||||
return;
|
||||
|
||||
_specialCollections[(int)collectionType] = null;
|
||||
SpecialCollections[(int)collectionType] = null;
|
||||
_communicator.CollectionChange.Invoke(collectionType, old, null, string.Empty);
|
||||
}
|
||||
|
||||
|
|
@ -144,7 +168,38 @@ public class ActiveCollections : ISavable, IDisposable
|
|||
_saveService.QueueSave(this);
|
||||
}
|
||||
|
||||
/// <summary> Set a active collection, can be used to set Default, Current, Interface, Special, or Individual collections. </summary>
|
||||
/// <summary> Set and create an active collection, can be used to set Default, Current, Interface, Special, or Individual collections. </summary>
|
||||
public void SetCollection(ModCollection? collection, CollectionType collectionType, ActorIdentifier[] identifiers)
|
||||
{
|
||||
if (collectionType is CollectionType.Individual && identifiers.Length > 0 && identifiers[0].IsValid)
|
||||
{
|
||||
var idx = Individuals.Index(identifiers[0]);
|
||||
if (idx >= 0)
|
||||
{
|
||||
if (collection == null)
|
||||
RemoveIndividualCollection(idx);
|
||||
else
|
||||
SetCollection(collection, collectionType, idx);
|
||||
}
|
||||
else if (collection != null)
|
||||
{
|
||||
CreateIndividualCollection(identifiers);
|
||||
SetCollection(collection, CollectionType.Individual, Individuals.Count - 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (collection == null)
|
||||
RemoveSpecialCollection(collectionType);
|
||||
else
|
||||
{
|
||||
CreateSpecialCollection(collectionType);
|
||||
SetCollection(collection, collectionType);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary> Set an active collection, can be used to set Default, Current, Interface, Special, or Individual collections. </summary>
|
||||
public void SetCollection(ModCollection collection, CollectionType collectionType, int individualIndex = -1)
|
||||
{
|
||||
var oldCollection = collectionType switch
|
||||
|
|
@ -154,7 +209,7 @@ public class ActiveCollections : ISavable, IDisposable
|
|||
CollectionType.Current => Current,
|
||||
CollectionType.Individual when individualIndex >= 0 && individualIndex < Individuals.Count => Individuals[individualIndex].Collection,
|
||||
CollectionType.Individual => null,
|
||||
_ when collectionType.IsSpecial() => _specialCollections[(int)collectionType] ?? Default,
|
||||
_ when collectionType.IsSpecial() => SpecialCollections[(int)collectionType] ?? Default,
|
||||
_ => null,
|
||||
};
|
||||
|
||||
|
|
@ -178,7 +233,7 @@ public class ActiveCollections : ISavable, IDisposable
|
|||
|
||||
break;
|
||||
default:
|
||||
_specialCollections[(int)collectionType] = collection;
|
||||
SpecialCollections[(int)collectionType] = collection;
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -205,7 +260,7 @@ public class ActiveCollections : ISavable, IDisposable
|
|||
{ nameof(Interface), Interface.Name },
|
||||
{ nameof(Current), Current.Name },
|
||||
};
|
||||
foreach (var (type, collection) in _specialCollections.WithIndex().Where(p => p.Value != null)
|
||||
foreach (var (type, collection) in SpecialCollections.WithIndex().Where(p => p.Value != null)
|
||||
.Select(p => ((CollectionType)p.Index, p.Value!)))
|
||||
jObj.Add(type.ToString(), collection.Name);
|
||||
|
||||
|
|
@ -215,7 +270,7 @@ public class ActiveCollections : ISavable, IDisposable
|
|||
}
|
||||
|
||||
private void UpdateCurrentCollectionInUse()
|
||||
=> CurrentCollectionInUse = _specialCollections
|
||||
=> CurrentCollectionInUse = SpecialCollections
|
||||
.OfType<ModCollection>()
|
||||
.Prepend(Interface)
|
||||
.Prepend(Default)
|
||||
|
|
@ -240,9 +295,9 @@ public class ActiveCollections : ISavable, IDisposable
|
|||
if (oldCollection == Current)
|
||||
SetCollection(Default.Index > ModCollection.Empty.Index ? Default : _storage.DefaultNamed, CollectionType.Current);
|
||||
|
||||
for (var i = 0; i < _specialCollections.Length; ++i)
|
||||
for (var i = 0; i < SpecialCollections.Length; ++i)
|
||||
{
|
||||
if (oldCollection == _specialCollections[i])
|
||||
if (oldCollection == SpecialCollections[i])
|
||||
SetCollection(ModCollection.Empty, (CollectionType)i);
|
||||
}
|
||||
|
||||
|
|
@ -329,7 +384,7 @@ public class ActiveCollections : ISavable, IDisposable
|
|||
}
|
||||
else
|
||||
{
|
||||
_specialCollections[(int)type] = typeCollection;
|
||||
SpecialCollections[(int)type] = typeCollection;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -398,24 +453,6 @@ public class ActiveCollections : ISavable, IDisposable
|
|||
: string.Empty;
|
||||
}
|
||||
|
||||
break;
|
||||
// The group of all Characters is redundant if they are all equal to Default or unassigned.
|
||||
case CollectionType.MalePlayerCharacter:
|
||||
case CollectionType.MaleNonPlayerCharacter:
|
||||
case CollectionType.FemalePlayerCharacter:
|
||||
case CollectionType.FemaleNonPlayerCharacter:
|
||||
var first = ByType(CollectionType.MalePlayerCharacter) ?? Default;
|
||||
var second = ByType(CollectionType.MaleNonPlayerCharacter) ?? Default;
|
||||
var third = ByType(CollectionType.FemalePlayerCharacter) ?? Default;
|
||||
var fourth = ByType(CollectionType.FemaleNonPlayerCharacter) ?? Default;
|
||||
if (first.Index == second.Index
|
||||
&& first.Index == third.Index
|
||||
&& first.Index == fourth.Index
|
||||
&& first.Index == Default.Index)
|
||||
return
|
||||
"Assignment is currently redundant due to the group [Male, Female, Player, NPC] Characters being unassigned or identical to each other and Default.\n"
|
||||
+ "You can keep just the Default Assignment.";
|
||||
|
||||
break;
|
||||
// Children and Elderly are redundant if they are identical to both Male NPCs and Female NPCs, or if they are unassigned to Default.
|
||||
case CollectionType.NonPlayerChild:
|
||||
|
|
|
|||
|
|
@ -113,7 +113,7 @@ public class CollectionStorage : IReadOnlyList<ModCollection>, IDisposable
|
|||
return false;
|
||||
}
|
||||
|
||||
var newCollection = duplicate?.Duplicate(name, _collections.Count) ?? ModCollection.CreateEmpty(name, _collections.Count);
|
||||
var newCollection = duplicate?.Duplicate(name, _collections.Count) ?? ModCollection.CreateEmpty(name, _collections.Count, _modStorage.Count);
|
||||
_collections.Add(newCollection);
|
||||
|
||||
_saveService.ImmediateSave(new ModCollectionSave(_modStorage, newCollection));
|
||||
|
|
@ -200,7 +200,7 @@ public class CollectionStorage : IReadOnlyList<ModCollection>, IDisposable
|
|||
/// Does not check for uniqueness.
|
||||
/// </summary>
|
||||
private static bool IsValidName(string name)
|
||||
=> name.Length > 0 && name.All(c => !c.IsInvalidAscii() && c is not '|' && !c.IsInvalidInPath());
|
||||
=> name.Length is > 0 and < 32 && name.All(c => !c.IsInvalidAscii() && c is not '|' && !c.IsInvalidInPath());
|
||||
|
||||
/// <summary>
|
||||
/// Read all collection files in the Collection Directory.
|
||||
|
|
|
|||
|
|
@ -10,96 +10,96 @@ public enum CollectionType : byte
|
|||
// Special Collections
|
||||
Yourself = Api.Enums.ApiCollectionType.Yourself,
|
||||
|
||||
MalePlayerCharacter = Api.Enums.ApiCollectionType.MalePlayerCharacter,
|
||||
FemalePlayerCharacter = Api.Enums.ApiCollectionType.FemalePlayerCharacter,
|
||||
MaleNonPlayerCharacter = Api.Enums.ApiCollectionType.MaleNonPlayerCharacter,
|
||||
MalePlayerCharacter = Api.Enums.ApiCollectionType.MalePlayerCharacter,
|
||||
FemalePlayerCharacter = Api.Enums.ApiCollectionType.FemalePlayerCharacter,
|
||||
MaleNonPlayerCharacter = Api.Enums.ApiCollectionType.MaleNonPlayerCharacter,
|
||||
FemaleNonPlayerCharacter = Api.Enums.ApiCollectionType.FemaleNonPlayerCharacter,
|
||||
NonPlayerChild = Api.Enums.ApiCollectionType.NonPlayerChild,
|
||||
NonPlayerElderly = Api.Enums.ApiCollectionType.NonPlayerElderly,
|
||||
NonPlayerChild = Api.Enums.ApiCollectionType.NonPlayerChild,
|
||||
NonPlayerElderly = Api.Enums.ApiCollectionType.NonPlayerElderly,
|
||||
|
||||
MaleMidlander = Api.Enums.ApiCollectionType.MaleMidlander,
|
||||
FemaleMidlander = Api.Enums.ApiCollectionType.FemaleMidlander,
|
||||
MaleHighlander = Api.Enums.ApiCollectionType.MaleHighlander,
|
||||
MaleMidlander = Api.Enums.ApiCollectionType.MaleMidlander,
|
||||
FemaleMidlander = Api.Enums.ApiCollectionType.FemaleMidlander,
|
||||
MaleHighlander = Api.Enums.ApiCollectionType.MaleHighlander,
|
||||
FemaleHighlander = Api.Enums.ApiCollectionType.FemaleHighlander,
|
||||
|
||||
MaleWildwood = Api.Enums.ApiCollectionType.MaleWildwood,
|
||||
FemaleWildwood = Api.Enums.ApiCollectionType.FemaleWildwood,
|
||||
MaleDuskwight = Api.Enums.ApiCollectionType.MaleDuskwight,
|
||||
MaleWildwood = Api.Enums.ApiCollectionType.MaleWildwood,
|
||||
FemaleWildwood = Api.Enums.ApiCollectionType.FemaleWildwood,
|
||||
MaleDuskwight = Api.Enums.ApiCollectionType.MaleDuskwight,
|
||||
FemaleDuskwight = Api.Enums.ApiCollectionType.FemaleDuskwight,
|
||||
|
||||
MalePlainsfolk = Api.Enums.ApiCollectionType.MalePlainsfolk,
|
||||
MalePlainsfolk = Api.Enums.ApiCollectionType.MalePlainsfolk,
|
||||
FemalePlainsfolk = Api.Enums.ApiCollectionType.FemalePlainsfolk,
|
||||
MaleDunesfolk = Api.Enums.ApiCollectionType.MaleDunesfolk,
|
||||
FemaleDunesfolk = Api.Enums.ApiCollectionType.FemaleDunesfolk,
|
||||
MaleDunesfolk = Api.Enums.ApiCollectionType.MaleDunesfolk,
|
||||
FemaleDunesfolk = Api.Enums.ApiCollectionType.FemaleDunesfolk,
|
||||
|
||||
MaleSeekerOfTheSun = Api.Enums.ApiCollectionType.MaleSeekerOfTheSun,
|
||||
FemaleSeekerOfTheSun = Api.Enums.ApiCollectionType.FemaleSeekerOfTheSun,
|
||||
MaleKeeperOfTheMoon = Api.Enums.ApiCollectionType.MaleKeeperOfTheMoon,
|
||||
MaleSeekerOfTheSun = Api.Enums.ApiCollectionType.MaleSeekerOfTheSun,
|
||||
FemaleSeekerOfTheSun = Api.Enums.ApiCollectionType.FemaleSeekerOfTheSun,
|
||||
MaleKeeperOfTheMoon = Api.Enums.ApiCollectionType.MaleKeeperOfTheMoon,
|
||||
FemaleKeeperOfTheMoon = Api.Enums.ApiCollectionType.FemaleKeeperOfTheMoon,
|
||||
|
||||
MaleSeawolf = Api.Enums.ApiCollectionType.MaleSeawolf,
|
||||
FemaleSeawolf = Api.Enums.ApiCollectionType.FemaleSeawolf,
|
||||
MaleHellsguard = Api.Enums.ApiCollectionType.MaleHellsguard,
|
||||
MaleSeawolf = Api.Enums.ApiCollectionType.MaleSeawolf,
|
||||
FemaleSeawolf = Api.Enums.ApiCollectionType.FemaleSeawolf,
|
||||
MaleHellsguard = Api.Enums.ApiCollectionType.MaleHellsguard,
|
||||
FemaleHellsguard = Api.Enums.ApiCollectionType.FemaleHellsguard,
|
||||
|
||||
MaleRaen = Api.Enums.ApiCollectionType.MaleRaen,
|
||||
FemaleRaen = Api.Enums.ApiCollectionType.FemaleRaen,
|
||||
MaleXaela = Api.Enums.ApiCollectionType.MaleXaela,
|
||||
MaleRaen = Api.Enums.ApiCollectionType.MaleRaen,
|
||||
FemaleRaen = Api.Enums.ApiCollectionType.FemaleRaen,
|
||||
MaleXaela = Api.Enums.ApiCollectionType.MaleXaela,
|
||||
FemaleXaela = Api.Enums.ApiCollectionType.FemaleXaela,
|
||||
|
||||
MaleHelion = Api.Enums.ApiCollectionType.MaleHelion,
|
||||
MaleHelion = Api.Enums.ApiCollectionType.MaleHelion,
|
||||
FemaleHelion = Api.Enums.ApiCollectionType.FemaleHelion,
|
||||
MaleLost = Api.Enums.ApiCollectionType.MaleLost,
|
||||
FemaleLost = Api.Enums.ApiCollectionType.FemaleLost,
|
||||
MaleLost = Api.Enums.ApiCollectionType.MaleLost,
|
||||
FemaleLost = Api.Enums.ApiCollectionType.FemaleLost,
|
||||
|
||||
MaleRava = Api.Enums.ApiCollectionType.MaleRava,
|
||||
FemaleRava = Api.Enums.ApiCollectionType.FemaleRava,
|
||||
MaleVeena = Api.Enums.ApiCollectionType.MaleVeena,
|
||||
MaleRava = Api.Enums.ApiCollectionType.MaleRava,
|
||||
FemaleRava = Api.Enums.ApiCollectionType.FemaleRava,
|
||||
MaleVeena = Api.Enums.ApiCollectionType.MaleVeena,
|
||||
FemaleVeena = Api.Enums.ApiCollectionType.FemaleVeena,
|
||||
|
||||
MaleMidlanderNpc = Api.Enums.ApiCollectionType.MaleMidlanderNpc,
|
||||
FemaleMidlanderNpc = Api.Enums.ApiCollectionType.FemaleMidlanderNpc,
|
||||
MaleHighlanderNpc = Api.Enums.ApiCollectionType.MaleHighlanderNpc,
|
||||
MaleMidlanderNpc = Api.Enums.ApiCollectionType.MaleMidlanderNpc,
|
||||
FemaleMidlanderNpc = Api.Enums.ApiCollectionType.FemaleMidlanderNpc,
|
||||
MaleHighlanderNpc = Api.Enums.ApiCollectionType.MaleHighlanderNpc,
|
||||
FemaleHighlanderNpc = Api.Enums.ApiCollectionType.FemaleHighlanderNpc,
|
||||
|
||||
MaleWildwoodNpc = Api.Enums.ApiCollectionType.MaleWildwoodNpc,
|
||||
FemaleWildwoodNpc = Api.Enums.ApiCollectionType.FemaleWildwoodNpc,
|
||||
MaleDuskwightNpc = Api.Enums.ApiCollectionType.MaleDuskwightNpc,
|
||||
MaleWildwoodNpc = Api.Enums.ApiCollectionType.MaleWildwoodNpc,
|
||||
FemaleWildwoodNpc = Api.Enums.ApiCollectionType.FemaleWildwoodNpc,
|
||||
MaleDuskwightNpc = Api.Enums.ApiCollectionType.MaleDuskwightNpc,
|
||||
FemaleDuskwightNpc = Api.Enums.ApiCollectionType.FemaleDuskwightNpc,
|
||||
|
||||
MalePlainsfolkNpc = Api.Enums.ApiCollectionType.MalePlainsfolkNpc,
|
||||
MalePlainsfolkNpc = Api.Enums.ApiCollectionType.MalePlainsfolkNpc,
|
||||
FemalePlainsfolkNpc = Api.Enums.ApiCollectionType.FemalePlainsfolkNpc,
|
||||
MaleDunesfolkNpc = Api.Enums.ApiCollectionType.MaleDunesfolkNpc,
|
||||
FemaleDunesfolkNpc = Api.Enums.ApiCollectionType.FemaleDunesfolkNpc,
|
||||
MaleDunesfolkNpc = Api.Enums.ApiCollectionType.MaleDunesfolkNpc,
|
||||
FemaleDunesfolkNpc = Api.Enums.ApiCollectionType.FemaleDunesfolkNpc,
|
||||
|
||||
MaleSeekerOfTheSunNpc = Api.Enums.ApiCollectionType.MaleSeekerOfTheSunNpc,
|
||||
FemaleSeekerOfTheSunNpc = Api.Enums.ApiCollectionType.FemaleSeekerOfTheSunNpc,
|
||||
MaleKeeperOfTheMoonNpc = Api.Enums.ApiCollectionType.MaleKeeperOfTheMoonNpc,
|
||||
MaleSeekerOfTheSunNpc = Api.Enums.ApiCollectionType.MaleSeekerOfTheSunNpc,
|
||||
FemaleSeekerOfTheSunNpc = Api.Enums.ApiCollectionType.FemaleSeekerOfTheSunNpc,
|
||||
MaleKeeperOfTheMoonNpc = Api.Enums.ApiCollectionType.MaleKeeperOfTheMoonNpc,
|
||||
FemaleKeeperOfTheMoonNpc = Api.Enums.ApiCollectionType.FemaleKeeperOfTheMoonNpc,
|
||||
|
||||
MaleSeawolfNpc = Api.Enums.ApiCollectionType.MaleSeawolfNpc,
|
||||
FemaleSeawolfNpc = Api.Enums.ApiCollectionType.FemaleSeawolfNpc,
|
||||
MaleHellsguardNpc = Api.Enums.ApiCollectionType.MaleHellsguardNpc,
|
||||
MaleSeawolfNpc = Api.Enums.ApiCollectionType.MaleSeawolfNpc,
|
||||
FemaleSeawolfNpc = Api.Enums.ApiCollectionType.FemaleSeawolfNpc,
|
||||
MaleHellsguardNpc = Api.Enums.ApiCollectionType.MaleHellsguardNpc,
|
||||
FemaleHellsguardNpc = Api.Enums.ApiCollectionType.FemaleHellsguardNpc,
|
||||
|
||||
MaleRaenNpc = Api.Enums.ApiCollectionType.MaleRaenNpc,
|
||||
FemaleRaenNpc = Api.Enums.ApiCollectionType.FemaleRaenNpc,
|
||||
MaleXaelaNpc = Api.Enums.ApiCollectionType.MaleXaelaNpc,
|
||||
MaleRaenNpc = Api.Enums.ApiCollectionType.MaleRaenNpc,
|
||||
FemaleRaenNpc = Api.Enums.ApiCollectionType.FemaleRaenNpc,
|
||||
MaleXaelaNpc = Api.Enums.ApiCollectionType.MaleXaelaNpc,
|
||||
FemaleXaelaNpc = Api.Enums.ApiCollectionType.FemaleXaelaNpc,
|
||||
|
||||
MaleHelionNpc = Api.Enums.ApiCollectionType.MaleHelionNpc,
|
||||
MaleHelionNpc = Api.Enums.ApiCollectionType.MaleHelionNpc,
|
||||
FemaleHelionNpc = Api.Enums.ApiCollectionType.FemaleHelionNpc,
|
||||
MaleLostNpc = Api.Enums.ApiCollectionType.MaleLostNpc,
|
||||
FemaleLostNpc = Api.Enums.ApiCollectionType.FemaleLostNpc,
|
||||
MaleLostNpc = Api.Enums.ApiCollectionType.MaleLostNpc,
|
||||
FemaleLostNpc = Api.Enums.ApiCollectionType.FemaleLostNpc,
|
||||
|
||||
MaleRavaNpc = Api.Enums.ApiCollectionType.MaleRavaNpc,
|
||||
FemaleRavaNpc = Api.Enums.ApiCollectionType.FemaleRavaNpc,
|
||||
MaleVeenaNpc = Api.Enums.ApiCollectionType.MaleVeenaNpc,
|
||||
MaleRavaNpc = Api.Enums.ApiCollectionType.MaleRavaNpc,
|
||||
FemaleRavaNpc = Api.Enums.ApiCollectionType.FemaleRavaNpc,
|
||||
MaleVeenaNpc = Api.Enums.ApiCollectionType.MaleVeenaNpc,
|
||||
FemaleVeenaNpc = Api.Enums.ApiCollectionType.FemaleVeenaNpc,
|
||||
|
||||
Default = Api.Enums.ApiCollectionType.Default, // The default collection was changed
|
||||
Default = Api.Enums.ApiCollectionType.Default, // The default collection was changed
|
||||
Interface = Api.Enums.ApiCollectionType.Interface, // The ui collection was changed
|
||||
Current = Api.Enums.ApiCollectionType.Current, // The current collection was changed
|
||||
Current = Api.Enums.ApiCollectionType.Current, // The current collection was changed
|
||||
Individual, // An individual collection was changed
|
||||
Inactive, // A collection was added or removed
|
||||
Temporary, // A temporary collections was set or deleted via IPC
|
||||
|
|
@ -111,202 +111,200 @@ public static class CollectionTypeExtensions
|
|||
=> collectionType < CollectionType.Default;
|
||||
|
||||
public static readonly (CollectionType, string, string)[] Special = Enum.GetValues<CollectionType>()
|
||||
.Where(IsSpecial)
|
||||
.Select(s => (s, s.ToName(), s.ToDescription()))
|
||||
.ToArray();
|
||||
.Where(IsSpecial)
|
||||
.Select(s => (s, s.ToName(), s.ToDescription()))
|
||||
.ToArray();
|
||||
|
||||
public static CollectionType FromParts(Gender gender, bool npc)
|
||||
{
|
||||
gender = gender switch
|
||||
{
|
||||
Gender.MaleNpc => Gender.Male,
|
||||
Gender.MaleNpc => Gender.Male,
|
||||
Gender.FemaleNpc => Gender.Female,
|
||||
_ => gender,
|
||||
_ => gender,
|
||||
};
|
||||
|
||||
return (gender, npc) switch
|
||||
{
|
||||
(Gender.Male, false) => CollectionType.MalePlayerCharacter,
|
||||
(Gender.Male, false) => CollectionType.MalePlayerCharacter,
|
||||
(Gender.Female, false) => CollectionType.FemalePlayerCharacter,
|
||||
(Gender.Male, true) => CollectionType.MaleNonPlayerCharacter,
|
||||
(Gender.Female, true) => CollectionType.FemaleNonPlayerCharacter,
|
||||
_ => CollectionType.Inactive,
|
||||
(Gender.Male, true) => CollectionType.MaleNonPlayerCharacter,
|
||||
(Gender.Female, true) => CollectionType.FemaleNonPlayerCharacter,
|
||||
_ => CollectionType.Inactive,
|
||||
};
|
||||
}
|
||||
|
||||
// @formatter:off
|
||||
private static readonly IReadOnlyList<CollectionType> DefaultList = new[] { CollectionType.Default };
|
||||
private static readonly IReadOnlyList<CollectionType> MalePlayerList = new[] { CollectionType.MalePlayerCharacter, CollectionType.Default };
|
||||
private static readonly IReadOnlyList<CollectionType> FemalePlayerList = new[] { CollectionType.FemalePlayerCharacter, CollectionType.Default };
|
||||
private static readonly IReadOnlyList<CollectionType> MaleNpcList = new[] { CollectionType.MaleNonPlayerCharacter, CollectionType.Default };
|
||||
private static readonly IReadOnlyList<CollectionType> FemaleNpcList = new[] { CollectionType.FemaleNonPlayerCharacter, CollectionType.Default };
|
||||
|
||||
// @formatter:off
|
||||
private static readonly IReadOnlyList<CollectionType> DefaultList = new[] { CollectionType.Default };
|
||||
private static readonly IReadOnlyList<CollectionType> MalePlayerList = new[] { CollectionType.MalePlayerCharacter, CollectionType.Default };
|
||||
private static readonly IReadOnlyList<CollectionType> FemalePlayerList = new[] { CollectionType.FemalePlayerCharacter, CollectionType.Default };
|
||||
private static readonly IReadOnlyList<CollectionType> MaleNpcList = new[] { CollectionType.MaleNonPlayerCharacter, CollectionType.Default };
|
||||
private static readonly IReadOnlyList<CollectionType> FemaleNpcList = new[] { CollectionType.FemaleNonPlayerCharacter, CollectionType.Default };
|
||||
// @formatter:on
|
||||
|
||||
/// <summary> A list of definite redundancy possibilities. </summary>
|
||||
|
||||
/// <summary> A list of definite redundancy possibilities. </summary>
|
||||
public static IReadOnlyList<CollectionType> InheritanceOrder(this CollectionType collectionType)
|
||||
=> collectionType switch
|
||||
{
|
||||
CollectionType.Yourself => DefaultList,
|
||||
CollectionType.MalePlayerCharacter => DefaultList,
|
||||
CollectionType.FemalePlayerCharacter => DefaultList,
|
||||
CollectionType.MaleNonPlayerCharacter => DefaultList,
|
||||
CollectionType.Yourself => DefaultList,
|
||||
CollectionType.MalePlayerCharacter => DefaultList,
|
||||
CollectionType.FemalePlayerCharacter => DefaultList,
|
||||
CollectionType.MaleNonPlayerCharacter => DefaultList,
|
||||
CollectionType.FemaleNonPlayerCharacter => DefaultList,
|
||||
CollectionType.MaleMidlander => MalePlayerList,
|
||||
CollectionType.FemaleMidlander => FemalePlayerList,
|
||||
CollectionType.MaleHighlander => MalePlayerList,
|
||||
CollectionType.FemaleHighlander => FemalePlayerList,
|
||||
CollectionType.MaleWildwood => MalePlayerList,
|
||||
CollectionType.FemaleWildwood => FemalePlayerList,
|
||||
CollectionType.MaleDuskwight => MalePlayerList,
|
||||
CollectionType.FemaleDuskwight => FemalePlayerList,
|
||||
CollectionType.MalePlainsfolk => MalePlayerList,
|
||||
CollectionType.FemalePlainsfolk => FemalePlayerList,
|
||||
CollectionType.MaleDunesfolk => MalePlayerList,
|
||||
CollectionType.FemaleDunesfolk => FemalePlayerList,
|
||||
CollectionType.MaleSeekerOfTheSun => MalePlayerList,
|
||||
CollectionType.FemaleSeekerOfTheSun => FemalePlayerList,
|
||||
CollectionType.MaleKeeperOfTheMoon => MalePlayerList,
|
||||
CollectionType.FemaleKeeperOfTheMoon => FemalePlayerList,
|
||||
CollectionType.MaleSeawolf => MalePlayerList,
|
||||
CollectionType.FemaleSeawolf => FemalePlayerList,
|
||||
CollectionType.MaleHellsguard => MalePlayerList,
|
||||
CollectionType.FemaleHellsguard => FemalePlayerList,
|
||||
CollectionType.MaleRaen => MalePlayerList,
|
||||
CollectionType.FemaleRaen => FemalePlayerList,
|
||||
CollectionType.MaleXaela => MalePlayerList,
|
||||
CollectionType.FemaleXaela => FemalePlayerList,
|
||||
CollectionType.MaleHelion => MalePlayerList,
|
||||
CollectionType.FemaleHelion => FemalePlayerList,
|
||||
CollectionType.MaleLost => MalePlayerList,
|
||||
CollectionType.FemaleLost => FemalePlayerList,
|
||||
CollectionType.MaleRava => MalePlayerList,
|
||||
CollectionType.FemaleRava => FemalePlayerList,
|
||||
CollectionType.MaleVeena => MalePlayerList,
|
||||
CollectionType.FemaleVeena => FemalePlayerList,
|
||||
CollectionType.MaleMidlanderNpc => MaleNpcList,
|
||||
CollectionType.FemaleMidlanderNpc => FemaleNpcList,
|
||||
CollectionType.MaleHighlanderNpc => MaleNpcList,
|
||||
CollectionType.FemaleHighlanderNpc => FemaleNpcList,
|
||||
CollectionType.MaleWildwoodNpc => MaleNpcList,
|
||||
CollectionType.FemaleWildwoodNpc => FemaleNpcList,
|
||||
CollectionType.MaleDuskwightNpc => MaleNpcList,
|
||||
CollectionType.FemaleDuskwightNpc => FemaleNpcList,
|
||||
CollectionType.MalePlainsfolkNpc => MaleNpcList,
|
||||
CollectionType.FemalePlainsfolkNpc => FemaleNpcList,
|
||||
CollectionType.MaleDunesfolkNpc => MaleNpcList,
|
||||
CollectionType.FemaleDunesfolkNpc => FemaleNpcList,
|
||||
CollectionType.MaleSeekerOfTheSunNpc => MaleNpcList,
|
||||
CollectionType.FemaleSeekerOfTheSunNpc => FemaleNpcList,
|
||||
CollectionType.MaleKeeperOfTheMoonNpc => MaleNpcList,
|
||||
CollectionType.MaleMidlander => MalePlayerList,
|
||||
CollectionType.FemaleMidlander => FemalePlayerList,
|
||||
CollectionType.MaleHighlander => MalePlayerList,
|
||||
CollectionType.FemaleHighlander => FemalePlayerList,
|
||||
CollectionType.MaleWildwood => MalePlayerList,
|
||||
CollectionType.FemaleWildwood => FemalePlayerList,
|
||||
CollectionType.MaleDuskwight => MalePlayerList,
|
||||
CollectionType.FemaleDuskwight => FemalePlayerList,
|
||||
CollectionType.MalePlainsfolk => MalePlayerList,
|
||||
CollectionType.FemalePlainsfolk => FemalePlayerList,
|
||||
CollectionType.MaleDunesfolk => MalePlayerList,
|
||||
CollectionType.FemaleDunesfolk => FemalePlayerList,
|
||||
CollectionType.MaleSeekerOfTheSun => MalePlayerList,
|
||||
CollectionType.FemaleSeekerOfTheSun => FemalePlayerList,
|
||||
CollectionType.MaleKeeperOfTheMoon => MalePlayerList,
|
||||
CollectionType.FemaleKeeperOfTheMoon => FemalePlayerList,
|
||||
CollectionType.MaleSeawolf => MalePlayerList,
|
||||
CollectionType.FemaleSeawolf => FemalePlayerList,
|
||||
CollectionType.MaleHellsguard => MalePlayerList,
|
||||
CollectionType.FemaleHellsguard => FemalePlayerList,
|
||||
CollectionType.MaleRaen => MalePlayerList,
|
||||
CollectionType.FemaleRaen => FemalePlayerList,
|
||||
CollectionType.MaleXaela => MalePlayerList,
|
||||
CollectionType.FemaleXaela => FemalePlayerList,
|
||||
CollectionType.MaleHelion => MalePlayerList,
|
||||
CollectionType.FemaleHelion => FemalePlayerList,
|
||||
CollectionType.MaleLost => MalePlayerList,
|
||||
CollectionType.FemaleLost => FemalePlayerList,
|
||||
CollectionType.MaleRava => MalePlayerList,
|
||||
CollectionType.FemaleRava => FemalePlayerList,
|
||||
CollectionType.MaleVeena => MalePlayerList,
|
||||
CollectionType.FemaleVeena => FemalePlayerList,
|
||||
CollectionType.MaleMidlanderNpc => MaleNpcList,
|
||||
CollectionType.FemaleMidlanderNpc => FemaleNpcList,
|
||||
CollectionType.MaleHighlanderNpc => MaleNpcList,
|
||||
CollectionType.FemaleHighlanderNpc => FemaleNpcList,
|
||||
CollectionType.MaleWildwoodNpc => MaleNpcList,
|
||||
CollectionType.FemaleWildwoodNpc => FemaleNpcList,
|
||||
CollectionType.MaleDuskwightNpc => MaleNpcList,
|
||||
CollectionType.FemaleDuskwightNpc => FemaleNpcList,
|
||||
CollectionType.MalePlainsfolkNpc => MaleNpcList,
|
||||
CollectionType.FemalePlainsfolkNpc => FemaleNpcList,
|
||||
CollectionType.MaleDunesfolkNpc => MaleNpcList,
|
||||
CollectionType.FemaleDunesfolkNpc => FemaleNpcList,
|
||||
CollectionType.MaleSeekerOfTheSunNpc => MaleNpcList,
|
||||
CollectionType.FemaleSeekerOfTheSunNpc => FemaleNpcList,
|
||||
CollectionType.MaleKeeperOfTheMoonNpc => MaleNpcList,
|
||||
CollectionType.FemaleKeeperOfTheMoonNpc => FemaleNpcList,
|
||||
CollectionType.MaleSeawolfNpc => MaleNpcList,
|
||||
CollectionType.FemaleSeawolfNpc => FemaleNpcList,
|
||||
CollectionType.MaleHellsguardNpc => MaleNpcList,
|
||||
CollectionType.FemaleHellsguardNpc => FemaleNpcList,
|
||||
CollectionType.MaleRaenNpc => MaleNpcList,
|
||||
CollectionType.FemaleRaenNpc => FemaleNpcList,
|
||||
CollectionType.MaleXaelaNpc => MaleNpcList,
|
||||
CollectionType.FemaleXaelaNpc => FemaleNpcList,
|
||||
CollectionType.MaleHelionNpc => MaleNpcList,
|
||||
CollectionType.FemaleHelionNpc => FemaleNpcList,
|
||||
CollectionType.MaleLostNpc => MaleNpcList,
|
||||
CollectionType.FemaleLostNpc => FemaleNpcList,
|
||||
CollectionType.MaleRavaNpc => MaleNpcList,
|
||||
CollectionType.FemaleRavaNpc => FemaleNpcList,
|
||||
CollectionType.MaleVeenaNpc => MaleNpcList,
|
||||
CollectionType.FemaleVeenaNpc => FemaleNpcList,
|
||||
CollectionType.Individual => DefaultList,
|
||||
_ => Array.Empty<CollectionType>(),
|
||||
CollectionType.MaleSeawolfNpc => MaleNpcList,
|
||||
CollectionType.FemaleSeawolfNpc => FemaleNpcList,
|
||||
CollectionType.MaleHellsguardNpc => MaleNpcList,
|
||||
CollectionType.FemaleHellsguardNpc => FemaleNpcList,
|
||||
CollectionType.MaleRaenNpc => MaleNpcList,
|
||||
CollectionType.FemaleRaenNpc => FemaleNpcList,
|
||||
CollectionType.MaleXaelaNpc => MaleNpcList,
|
||||
CollectionType.FemaleXaelaNpc => FemaleNpcList,
|
||||
CollectionType.MaleHelionNpc => MaleNpcList,
|
||||
CollectionType.FemaleHelionNpc => FemaleNpcList,
|
||||
CollectionType.MaleLostNpc => MaleNpcList,
|
||||
CollectionType.FemaleLostNpc => FemaleNpcList,
|
||||
CollectionType.MaleRavaNpc => MaleNpcList,
|
||||
CollectionType.FemaleRavaNpc => FemaleNpcList,
|
||||
CollectionType.MaleVeenaNpc => MaleNpcList,
|
||||
CollectionType.FemaleVeenaNpc => FemaleNpcList,
|
||||
CollectionType.Individual => DefaultList,
|
||||
_ => Array.Empty<CollectionType>(),
|
||||
};
|
||||
|
||||
public static CollectionType FromParts(SubRace race, Gender gender, bool npc)
|
||||
{
|
||||
gender = gender switch
|
||||
{
|
||||
Gender.MaleNpc => Gender.Male,
|
||||
Gender.MaleNpc => Gender.Male,
|
||||
Gender.FemaleNpc => Gender.Female,
|
||||
_ => gender,
|
||||
_ => gender,
|
||||
};
|
||||
|
||||
return (race, gender, npc) switch
|
||||
{
|
||||
(SubRace.Midlander, Gender.Male, false) => CollectionType.MaleMidlander,
|
||||
(SubRace.Highlander, Gender.Male, false) => CollectionType.MaleHighlander,
|
||||
(SubRace.Wildwood, Gender.Male, false) => CollectionType.MaleWildwood,
|
||||
(SubRace.Duskwight, Gender.Male, false) => CollectionType.MaleDuskwight,
|
||||
(SubRace.Plainsfolk, Gender.Male, false) => CollectionType.MalePlainsfolk,
|
||||
(SubRace.Dunesfolk, Gender.Male, false) => CollectionType.MaleDunesfolk,
|
||||
(SubRace.SeekerOfTheSun, Gender.Male, false) => CollectionType.MaleSeekerOfTheSun,
|
||||
(SubRace.Midlander, Gender.Male, false) => CollectionType.MaleMidlander,
|
||||
(SubRace.Highlander, Gender.Male, false) => CollectionType.MaleHighlander,
|
||||
(SubRace.Wildwood, Gender.Male, false) => CollectionType.MaleWildwood,
|
||||
(SubRace.Duskwight, Gender.Male, false) => CollectionType.MaleDuskwight,
|
||||
(SubRace.Plainsfolk, Gender.Male, false) => CollectionType.MalePlainsfolk,
|
||||
(SubRace.Dunesfolk, Gender.Male, false) => CollectionType.MaleDunesfolk,
|
||||
(SubRace.SeekerOfTheSun, Gender.Male, false) => CollectionType.MaleSeekerOfTheSun,
|
||||
(SubRace.KeeperOfTheMoon, Gender.Male, false) => CollectionType.MaleKeeperOfTheMoon,
|
||||
(SubRace.Seawolf, Gender.Male, false) => CollectionType.MaleSeawolf,
|
||||
(SubRace.Hellsguard, Gender.Male, false) => CollectionType.MaleHellsguard,
|
||||
(SubRace.Raen, Gender.Male, false) => CollectionType.MaleRaen,
|
||||
(SubRace.Xaela, Gender.Male, false) => CollectionType.MaleXaela,
|
||||
(SubRace.Helion, Gender.Male, false) => CollectionType.MaleHelion,
|
||||
(SubRace.Lost, Gender.Male, false) => CollectionType.MaleLost,
|
||||
(SubRace.Rava, Gender.Male, false) => CollectionType.MaleRava,
|
||||
(SubRace.Veena, Gender.Male, false) => CollectionType.MaleVeena,
|
||||
(SubRace.Seawolf, Gender.Male, false) => CollectionType.MaleSeawolf,
|
||||
(SubRace.Hellsguard, Gender.Male, false) => CollectionType.MaleHellsguard,
|
||||
(SubRace.Raen, Gender.Male, false) => CollectionType.MaleRaen,
|
||||
(SubRace.Xaela, Gender.Male, false) => CollectionType.MaleXaela,
|
||||
(SubRace.Helion, Gender.Male, false) => CollectionType.MaleHelion,
|
||||
(SubRace.Lost, Gender.Male, false) => CollectionType.MaleLost,
|
||||
(SubRace.Rava, Gender.Male, false) => CollectionType.MaleRava,
|
||||
(SubRace.Veena, Gender.Male, false) => CollectionType.MaleVeena,
|
||||
|
||||
(SubRace.Midlander, Gender.Female, false) => CollectionType.FemaleMidlander,
|
||||
(SubRace.Highlander, Gender.Female, false) => CollectionType.FemaleHighlander,
|
||||
(SubRace.Wildwood, Gender.Female, false) => CollectionType.FemaleWildwood,
|
||||
(SubRace.Duskwight, Gender.Female, false) => CollectionType.FemaleDuskwight,
|
||||
(SubRace.Plainsfolk, Gender.Female, false) => CollectionType.FemalePlainsfolk,
|
||||
(SubRace.Dunesfolk, Gender.Female, false) => CollectionType.FemaleDunesfolk,
|
||||
(SubRace.SeekerOfTheSun, Gender.Female, false) => CollectionType.FemaleSeekerOfTheSun,
|
||||
(SubRace.Midlander, Gender.Female, false) => CollectionType.FemaleMidlander,
|
||||
(SubRace.Highlander, Gender.Female, false) => CollectionType.FemaleHighlander,
|
||||
(SubRace.Wildwood, Gender.Female, false) => CollectionType.FemaleWildwood,
|
||||
(SubRace.Duskwight, Gender.Female, false) => CollectionType.FemaleDuskwight,
|
||||
(SubRace.Plainsfolk, Gender.Female, false) => CollectionType.FemalePlainsfolk,
|
||||
(SubRace.Dunesfolk, Gender.Female, false) => CollectionType.FemaleDunesfolk,
|
||||
(SubRace.SeekerOfTheSun, Gender.Female, false) => CollectionType.FemaleSeekerOfTheSun,
|
||||
(SubRace.KeeperOfTheMoon, Gender.Female, false) => CollectionType.FemaleKeeperOfTheMoon,
|
||||
(SubRace.Seawolf, Gender.Female, false) => CollectionType.FemaleSeawolf,
|
||||
(SubRace.Hellsguard, Gender.Female, false) => CollectionType.FemaleHellsguard,
|
||||
(SubRace.Raen, Gender.Female, false) => CollectionType.FemaleRaen,
|
||||
(SubRace.Xaela, Gender.Female, false) => CollectionType.FemaleXaela,
|
||||
(SubRace.Helion, Gender.Female, false) => CollectionType.FemaleHelion,
|
||||
(SubRace.Lost, Gender.Female, false) => CollectionType.FemaleLost,
|
||||
(SubRace.Rava, Gender.Female, false) => CollectionType.FemaleRava,
|
||||
(SubRace.Veena, Gender.Female, false) => CollectionType.FemaleVeena,
|
||||
(SubRace.Seawolf, Gender.Female, false) => CollectionType.FemaleSeawolf,
|
||||
(SubRace.Hellsguard, Gender.Female, false) => CollectionType.FemaleHellsguard,
|
||||
(SubRace.Raen, Gender.Female, false) => CollectionType.FemaleRaen,
|
||||
(SubRace.Xaela, Gender.Female, false) => CollectionType.FemaleXaela,
|
||||
(SubRace.Helion, Gender.Female, false) => CollectionType.FemaleHelion,
|
||||
(SubRace.Lost, Gender.Female, false) => CollectionType.FemaleLost,
|
||||
(SubRace.Rava, Gender.Female, false) => CollectionType.FemaleRava,
|
||||
(SubRace.Veena, Gender.Female, false) => CollectionType.FemaleVeena,
|
||||
|
||||
(SubRace.Midlander, Gender.Male, true) => CollectionType.MaleMidlanderNpc,
|
||||
(SubRace.Highlander, Gender.Male, true) => CollectionType.MaleHighlanderNpc,
|
||||
(SubRace.Wildwood, Gender.Male, true) => CollectionType.MaleWildwoodNpc,
|
||||
(SubRace.Duskwight, Gender.Male, true) => CollectionType.MaleDuskwightNpc,
|
||||
(SubRace.Plainsfolk, Gender.Male, true) => CollectionType.MalePlainsfolkNpc,
|
||||
(SubRace.Dunesfolk, Gender.Male, true) => CollectionType.MaleDunesfolkNpc,
|
||||
(SubRace.SeekerOfTheSun, Gender.Male, true) => CollectionType.MaleSeekerOfTheSunNpc,
|
||||
(SubRace.Midlander, Gender.Male, true) => CollectionType.MaleMidlanderNpc,
|
||||
(SubRace.Highlander, Gender.Male, true) => CollectionType.MaleHighlanderNpc,
|
||||
(SubRace.Wildwood, Gender.Male, true) => CollectionType.MaleWildwoodNpc,
|
||||
(SubRace.Duskwight, Gender.Male, true) => CollectionType.MaleDuskwightNpc,
|
||||
(SubRace.Plainsfolk, Gender.Male, true) => CollectionType.MalePlainsfolkNpc,
|
||||
(SubRace.Dunesfolk, Gender.Male, true) => CollectionType.MaleDunesfolkNpc,
|
||||
(SubRace.SeekerOfTheSun, Gender.Male, true) => CollectionType.MaleSeekerOfTheSunNpc,
|
||||
(SubRace.KeeperOfTheMoon, Gender.Male, true) => CollectionType.MaleKeeperOfTheMoonNpc,
|
||||
(SubRace.Seawolf, Gender.Male, true) => CollectionType.MaleSeawolfNpc,
|
||||
(SubRace.Hellsguard, Gender.Male, true) => CollectionType.MaleHellsguardNpc,
|
||||
(SubRace.Raen, Gender.Male, true) => CollectionType.MaleRaenNpc,
|
||||
(SubRace.Xaela, Gender.Male, true) => CollectionType.MaleXaelaNpc,
|
||||
(SubRace.Helion, Gender.Male, true) => CollectionType.MaleHelionNpc,
|
||||
(SubRace.Lost, Gender.Male, true) => CollectionType.MaleLostNpc,
|
||||
(SubRace.Rava, Gender.Male, true) => CollectionType.MaleRavaNpc,
|
||||
(SubRace.Veena, Gender.Male, true) => CollectionType.MaleVeenaNpc,
|
||||
(SubRace.Seawolf, Gender.Male, true) => CollectionType.MaleSeawolfNpc,
|
||||
(SubRace.Hellsguard, Gender.Male, true) => CollectionType.MaleHellsguardNpc,
|
||||
(SubRace.Raen, Gender.Male, true) => CollectionType.MaleRaenNpc,
|
||||
(SubRace.Xaela, Gender.Male, true) => CollectionType.MaleXaelaNpc,
|
||||
(SubRace.Helion, Gender.Male, true) => CollectionType.MaleHelionNpc,
|
||||
(SubRace.Lost, Gender.Male, true) => CollectionType.MaleLostNpc,
|
||||
(SubRace.Rava, Gender.Male, true) => CollectionType.MaleRavaNpc,
|
||||
(SubRace.Veena, Gender.Male, true) => CollectionType.MaleVeenaNpc,
|
||||
|
||||
(SubRace.Midlander, Gender.Female, true) => CollectionType.FemaleMidlanderNpc,
|
||||
(SubRace.Highlander, Gender.Female, true) => CollectionType.FemaleHighlanderNpc,
|
||||
(SubRace.Wildwood, Gender.Female, true) => CollectionType.FemaleWildwoodNpc,
|
||||
(SubRace.Duskwight, Gender.Female, true) => CollectionType.FemaleDuskwightNpc,
|
||||
(SubRace.Plainsfolk, Gender.Female, true) => CollectionType.FemalePlainsfolkNpc,
|
||||
(SubRace.Dunesfolk, Gender.Female, true) => CollectionType.FemaleDunesfolkNpc,
|
||||
(SubRace.SeekerOfTheSun, Gender.Female, true) => CollectionType.FemaleSeekerOfTheSunNpc,
|
||||
(SubRace.Midlander, Gender.Female, true) => CollectionType.FemaleMidlanderNpc,
|
||||
(SubRace.Highlander, Gender.Female, true) => CollectionType.FemaleHighlanderNpc,
|
||||
(SubRace.Wildwood, Gender.Female, true) => CollectionType.FemaleWildwoodNpc,
|
||||
(SubRace.Duskwight, Gender.Female, true) => CollectionType.FemaleDuskwightNpc,
|
||||
(SubRace.Plainsfolk, Gender.Female, true) => CollectionType.FemalePlainsfolkNpc,
|
||||
(SubRace.Dunesfolk, Gender.Female, true) => CollectionType.FemaleDunesfolkNpc,
|
||||
(SubRace.SeekerOfTheSun, Gender.Female, true) => CollectionType.FemaleSeekerOfTheSunNpc,
|
||||
(SubRace.KeeperOfTheMoon, Gender.Female, true) => CollectionType.FemaleKeeperOfTheMoonNpc,
|
||||
(SubRace.Seawolf, Gender.Female, true) => CollectionType.FemaleSeawolfNpc,
|
||||
(SubRace.Hellsguard, Gender.Female, true) => CollectionType.FemaleHellsguardNpc,
|
||||
(SubRace.Raen, Gender.Female, true) => CollectionType.FemaleRaenNpc,
|
||||
(SubRace.Xaela, Gender.Female, true) => CollectionType.FemaleXaelaNpc,
|
||||
(SubRace.Helion, Gender.Female, true) => CollectionType.FemaleHelionNpc,
|
||||
(SubRace.Lost, Gender.Female, true) => CollectionType.FemaleLostNpc,
|
||||
(SubRace.Rava, Gender.Female, true) => CollectionType.FemaleRavaNpc,
|
||||
(SubRace.Veena, Gender.Female, true) => CollectionType.FemaleVeenaNpc,
|
||||
_ => CollectionType.Inactive,
|
||||
(SubRace.Seawolf, Gender.Female, true) => CollectionType.FemaleSeawolfNpc,
|
||||
(SubRace.Hellsguard, Gender.Female, true) => CollectionType.FemaleHellsguardNpc,
|
||||
(SubRace.Raen, Gender.Female, true) => CollectionType.FemaleRaenNpc,
|
||||
(SubRace.Xaela, Gender.Female, true) => CollectionType.FemaleXaelaNpc,
|
||||
(SubRace.Helion, Gender.Female, true) => CollectionType.FemaleHelionNpc,
|
||||
(SubRace.Lost, Gender.Female, true) => CollectionType.FemaleLostNpc,
|
||||
(SubRace.Rava, Gender.Female, true) => CollectionType.FemaleRavaNpc,
|
||||
(SubRace.Veena, Gender.Female, true) => CollectionType.FemaleVeenaNpc,
|
||||
_ => CollectionType.Inactive,
|
||||
};
|
||||
}
|
||||
|
||||
public static bool TryParse(string text, out CollectionType type)
|
||||
{
|
||||
if (Enum.TryParse(text, true, out type))
|
||||
{
|
||||
return type is not CollectionType.Inactive and not CollectionType.Temporary;
|
||||
}
|
||||
|
||||
if (string.Equals(text, "character", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
|
|
@ -335,9 +333,7 @@ public static class CollectionTypeExtensions
|
|||
foreach (var t in Enum.GetValues<CollectionType>())
|
||||
{
|
||||
if (t is CollectionType.Inactive or CollectionType.Temporary)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (string.Equals(text, t.ToName(), StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
|
|
@ -352,83 +348,83 @@ public static class CollectionTypeExtensions
|
|||
public static string ToName(this CollectionType collectionType)
|
||||
=> collectionType switch
|
||||
{
|
||||
CollectionType.Yourself => "Your Character",
|
||||
CollectionType.NonPlayerChild => "Non-Player Children",
|
||||
CollectionType.NonPlayerElderly => "Non-Player Elderly",
|
||||
CollectionType.MalePlayerCharacter => "Male Player Characters",
|
||||
CollectionType.MaleNonPlayerCharacter => "Male Non-Player Characters",
|
||||
CollectionType.MaleMidlander => $"Male {SubRace.Midlander.ToName()}",
|
||||
CollectionType.MaleHighlander => $"Male {SubRace.Highlander.ToName()}",
|
||||
CollectionType.MaleWildwood => $"Male {SubRace.Wildwood.ToName()}",
|
||||
CollectionType.MaleDuskwight => $"Male {SubRace.Duskwight.ToName()}",
|
||||
CollectionType.MalePlainsfolk => $"Male {SubRace.Plainsfolk.ToName()}",
|
||||
CollectionType.MaleDunesfolk => $"Male {SubRace.Dunesfolk.ToName()}",
|
||||
CollectionType.MaleSeekerOfTheSun => $"Male {SubRace.SeekerOfTheSun.ToName()}",
|
||||
CollectionType.MaleKeeperOfTheMoon => $"Male {SubRace.KeeperOfTheMoon.ToName()}",
|
||||
CollectionType.MaleSeawolf => $"Male {SubRace.Seawolf.ToName()}",
|
||||
CollectionType.MaleHellsguard => $"Male {SubRace.Hellsguard.ToName()}",
|
||||
CollectionType.MaleRaen => $"Male {SubRace.Raen.ToName()}",
|
||||
CollectionType.MaleXaela => $"Male {SubRace.Xaela.ToName()}",
|
||||
CollectionType.MaleHelion => $"Male {SubRace.Helion.ToName()}",
|
||||
CollectionType.MaleLost => $"Male {SubRace.Lost.ToName()}",
|
||||
CollectionType.MaleRava => $"Male {SubRace.Rava.ToName()}",
|
||||
CollectionType.MaleVeena => $"Male {SubRace.Veena.ToName()}",
|
||||
CollectionType.MaleMidlanderNpc => $"Male {SubRace.Midlander.ToName()} (NPC)",
|
||||
CollectionType.MaleHighlanderNpc => $"Male {SubRace.Highlander.ToName()} (NPC)",
|
||||
CollectionType.MaleWildwoodNpc => $"Male {SubRace.Wildwood.ToName()} (NPC)",
|
||||
CollectionType.MaleDuskwightNpc => $"Male {SubRace.Duskwight.ToName()} (NPC)",
|
||||
CollectionType.MalePlainsfolkNpc => $"Male {SubRace.Plainsfolk.ToName()} (NPC)",
|
||||
CollectionType.MaleDunesfolkNpc => $"Male {SubRace.Dunesfolk.ToName()} (NPC)",
|
||||
CollectionType.MaleSeekerOfTheSunNpc => $"Male {SubRace.SeekerOfTheSun.ToName()} (NPC)",
|
||||
CollectionType.MaleKeeperOfTheMoonNpc => $"Male {SubRace.KeeperOfTheMoon.ToName()} (NPC)",
|
||||
CollectionType.MaleSeawolfNpc => $"Male {SubRace.Seawolf.ToName()} (NPC)",
|
||||
CollectionType.MaleHellsguardNpc => $"Male {SubRace.Hellsguard.ToName()} (NPC)",
|
||||
CollectionType.MaleRaenNpc => $"Male {SubRace.Raen.ToName()} (NPC)",
|
||||
CollectionType.MaleXaelaNpc => $"Male {SubRace.Xaela.ToName()} (NPC)",
|
||||
CollectionType.MaleHelionNpc => $"Male {SubRace.Helion.ToName()} (NPC)",
|
||||
CollectionType.MaleLostNpc => $"Male {SubRace.Lost.ToName()} (NPC)",
|
||||
CollectionType.MaleRavaNpc => $"Male {SubRace.Rava.ToName()} (NPC)",
|
||||
CollectionType.MaleVeenaNpc => $"Male {SubRace.Veena.ToName()} (NPC)",
|
||||
CollectionType.FemalePlayerCharacter => "Female Player Characters",
|
||||
CollectionType.Yourself => "Your Character",
|
||||
CollectionType.NonPlayerChild => "Non-Player Children",
|
||||
CollectionType.NonPlayerElderly => "Non-Player Elderly",
|
||||
CollectionType.MalePlayerCharacter => "Male Player Characters",
|
||||
CollectionType.MaleNonPlayerCharacter => "Male Non-Player Characters",
|
||||
CollectionType.MaleMidlander => $"Male {SubRace.Midlander.ToName()}",
|
||||
CollectionType.MaleHighlander => $"Male {SubRace.Highlander.ToName()}",
|
||||
CollectionType.MaleWildwood => $"Male {SubRace.Wildwood.ToName()}",
|
||||
CollectionType.MaleDuskwight => $"Male {SubRace.Duskwight.ToName()}",
|
||||
CollectionType.MalePlainsfolk => $"Male {SubRace.Plainsfolk.ToName()}",
|
||||
CollectionType.MaleDunesfolk => $"Male {SubRace.Dunesfolk.ToName()}",
|
||||
CollectionType.MaleSeekerOfTheSun => $"Male {SubRace.SeekerOfTheSun.ToName()}",
|
||||
CollectionType.MaleKeeperOfTheMoon => $"Male {SubRace.KeeperOfTheMoon.ToName()}",
|
||||
CollectionType.MaleSeawolf => $"Male {SubRace.Seawolf.ToName()}",
|
||||
CollectionType.MaleHellsguard => $"Male {SubRace.Hellsguard.ToName()}",
|
||||
CollectionType.MaleRaen => $"Male {SubRace.Raen.ToName()}",
|
||||
CollectionType.MaleXaela => $"Male {SubRace.Xaela.ToName()}",
|
||||
CollectionType.MaleHelion => $"Male {SubRace.Helion.ToName()}",
|
||||
CollectionType.MaleLost => $"Male {SubRace.Lost.ToName()}",
|
||||
CollectionType.MaleRava => $"Male {SubRace.Rava.ToName()}",
|
||||
CollectionType.MaleVeena => $"Male {SubRace.Veena.ToName()}",
|
||||
CollectionType.MaleMidlanderNpc => $"Male {SubRace.Midlander.ToName()} (NPC)",
|
||||
CollectionType.MaleHighlanderNpc => $"Male {SubRace.Highlander.ToName()} (NPC)",
|
||||
CollectionType.MaleWildwoodNpc => $"Male {SubRace.Wildwood.ToName()} (NPC)",
|
||||
CollectionType.MaleDuskwightNpc => $"Male {SubRace.Duskwight.ToName()} (NPC)",
|
||||
CollectionType.MalePlainsfolkNpc => $"Male {SubRace.Plainsfolk.ToName()} (NPC)",
|
||||
CollectionType.MaleDunesfolkNpc => $"Male {SubRace.Dunesfolk.ToName()} (NPC)",
|
||||
CollectionType.MaleSeekerOfTheSunNpc => $"Male {SubRace.SeekerOfTheSun.ToName()} (NPC)",
|
||||
CollectionType.MaleKeeperOfTheMoonNpc => $"Male {SubRace.KeeperOfTheMoon.ToName()} (NPC)",
|
||||
CollectionType.MaleSeawolfNpc => $"Male {SubRace.Seawolf.ToName()} (NPC)",
|
||||
CollectionType.MaleHellsguardNpc => $"Male {SubRace.Hellsguard.ToName()} (NPC)",
|
||||
CollectionType.MaleRaenNpc => $"Male {SubRace.Raen.ToName()} (NPC)",
|
||||
CollectionType.MaleXaelaNpc => $"Male {SubRace.Xaela.ToName()} (NPC)",
|
||||
CollectionType.MaleHelionNpc => $"Male {SubRace.Helion.ToName()} (NPC)",
|
||||
CollectionType.MaleLostNpc => $"Male {SubRace.Lost.ToName()} (NPC)",
|
||||
CollectionType.MaleRavaNpc => $"Male {SubRace.Rava.ToName()} (NPC)",
|
||||
CollectionType.MaleVeenaNpc => $"Male {SubRace.Veena.ToName()} (NPC)",
|
||||
CollectionType.FemalePlayerCharacter => "Female Player Characters",
|
||||
CollectionType.FemaleNonPlayerCharacter => "Female Non-Player Characters",
|
||||
CollectionType.FemaleMidlander => $"Female {SubRace.Midlander.ToName()}",
|
||||
CollectionType.FemaleHighlander => $"Female {SubRace.Highlander.ToName()}",
|
||||
CollectionType.FemaleWildwood => $"Female {SubRace.Wildwood.ToName()}",
|
||||
CollectionType.FemaleDuskwight => $"Female {SubRace.Duskwight.ToName()}",
|
||||
CollectionType.FemalePlainsfolk => $"Female {SubRace.Plainsfolk.ToName()}",
|
||||
CollectionType.FemaleDunesfolk => $"Female {SubRace.Dunesfolk.ToName()}",
|
||||
CollectionType.FemaleSeekerOfTheSun => $"Female {SubRace.SeekerOfTheSun.ToName()}",
|
||||
CollectionType.FemaleKeeperOfTheMoon => $"Female {SubRace.KeeperOfTheMoon.ToName()}",
|
||||
CollectionType.FemaleSeawolf => $"Female {SubRace.Seawolf.ToName()}",
|
||||
CollectionType.FemaleHellsguard => $"Female {SubRace.Hellsguard.ToName()}",
|
||||
CollectionType.FemaleRaen => $"Female {SubRace.Raen.ToName()}",
|
||||
CollectionType.FemaleXaela => $"Female {SubRace.Xaela.ToName()}",
|
||||
CollectionType.FemaleHelion => $"Female {SubRace.Helion.ToName()}",
|
||||
CollectionType.FemaleLost => $"Female {SubRace.Lost.ToName()}",
|
||||
CollectionType.FemaleRava => $"Female {SubRace.Rava.ToName()}",
|
||||
CollectionType.FemaleVeena => $"Female {SubRace.Veena.ToName()}",
|
||||
CollectionType.FemaleMidlanderNpc => $"Female {SubRace.Midlander.ToName()} (NPC)",
|
||||
CollectionType.FemaleHighlanderNpc => $"Female {SubRace.Highlander.ToName()} (NPC)",
|
||||
CollectionType.FemaleWildwoodNpc => $"Female {SubRace.Wildwood.ToName()} (NPC)",
|
||||
CollectionType.FemaleDuskwightNpc => $"Female {SubRace.Duskwight.ToName()} (NPC)",
|
||||
CollectionType.FemalePlainsfolkNpc => $"Female {SubRace.Plainsfolk.ToName()} (NPC)",
|
||||
CollectionType.FemaleDunesfolkNpc => $"Female {SubRace.Dunesfolk.ToName()} (NPC)",
|
||||
CollectionType.FemaleSeekerOfTheSunNpc => $"Female {SubRace.SeekerOfTheSun.ToName()} (NPC)",
|
||||
CollectionType.FemaleMidlander => $"Female {SubRace.Midlander.ToName()}",
|
||||
CollectionType.FemaleHighlander => $"Female {SubRace.Highlander.ToName()}",
|
||||
CollectionType.FemaleWildwood => $"Female {SubRace.Wildwood.ToName()}",
|
||||
CollectionType.FemaleDuskwight => $"Female {SubRace.Duskwight.ToName()}",
|
||||
CollectionType.FemalePlainsfolk => $"Female {SubRace.Plainsfolk.ToName()}",
|
||||
CollectionType.FemaleDunesfolk => $"Female {SubRace.Dunesfolk.ToName()}",
|
||||
CollectionType.FemaleSeekerOfTheSun => $"Female {SubRace.SeekerOfTheSun.ToName()}",
|
||||
CollectionType.FemaleKeeperOfTheMoon => $"Female {SubRace.KeeperOfTheMoon.ToName()}",
|
||||
CollectionType.FemaleSeawolf => $"Female {SubRace.Seawolf.ToName()}",
|
||||
CollectionType.FemaleHellsguard => $"Female {SubRace.Hellsguard.ToName()}",
|
||||
CollectionType.FemaleRaen => $"Female {SubRace.Raen.ToName()}",
|
||||
CollectionType.FemaleXaela => $"Female {SubRace.Xaela.ToName()}",
|
||||
CollectionType.FemaleHelion => $"Female {SubRace.Helion.ToName()}",
|
||||
CollectionType.FemaleLost => $"Female {SubRace.Lost.ToName()}",
|
||||
CollectionType.FemaleRava => $"Female {SubRace.Rava.ToName()}",
|
||||
CollectionType.FemaleVeena => $"Female {SubRace.Veena.ToName()}",
|
||||
CollectionType.FemaleMidlanderNpc => $"Female {SubRace.Midlander.ToName()} (NPC)",
|
||||
CollectionType.FemaleHighlanderNpc => $"Female {SubRace.Highlander.ToName()} (NPC)",
|
||||
CollectionType.FemaleWildwoodNpc => $"Female {SubRace.Wildwood.ToName()} (NPC)",
|
||||
CollectionType.FemaleDuskwightNpc => $"Female {SubRace.Duskwight.ToName()} (NPC)",
|
||||
CollectionType.FemalePlainsfolkNpc => $"Female {SubRace.Plainsfolk.ToName()} (NPC)",
|
||||
CollectionType.FemaleDunesfolkNpc => $"Female {SubRace.Dunesfolk.ToName()} (NPC)",
|
||||
CollectionType.FemaleSeekerOfTheSunNpc => $"Female {SubRace.SeekerOfTheSun.ToName()} (NPC)",
|
||||
CollectionType.FemaleKeeperOfTheMoonNpc => $"Female {SubRace.KeeperOfTheMoon.ToName()} (NPC)",
|
||||
CollectionType.FemaleSeawolfNpc => $"Female {SubRace.Seawolf.ToName()} (NPC)",
|
||||
CollectionType.FemaleHellsguardNpc => $"Female {SubRace.Hellsguard.ToName()} (NPC)",
|
||||
CollectionType.FemaleRaenNpc => $"Female {SubRace.Raen.ToName()} (NPC)",
|
||||
CollectionType.FemaleXaelaNpc => $"Female {SubRace.Xaela.ToName()} (NPC)",
|
||||
CollectionType.FemaleHelionNpc => $"Female {SubRace.Helion.ToName()} (NPC)",
|
||||
CollectionType.FemaleLostNpc => $"Female {SubRace.Lost.ToName()} (NPC)",
|
||||
CollectionType.FemaleRavaNpc => $"Female {SubRace.Rava.ToName()} (NPC)",
|
||||
CollectionType.FemaleVeenaNpc => $"Female {SubRace.Veena.ToName()} (NPC)",
|
||||
CollectionType.Inactive => "Collection",
|
||||
CollectionType.Default => "Default",
|
||||
CollectionType.Interface => "Interface",
|
||||
CollectionType.Individual => "Individual",
|
||||
CollectionType.Current => "Current",
|
||||
_ => string.Empty,
|
||||
CollectionType.FemaleSeawolfNpc => $"Female {SubRace.Seawolf.ToName()} (NPC)",
|
||||
CollectionType.FemaleHellsguardNpc => $"Female {SubRace.Hellsguard.ToName()} (NPC)",
|
||||
CollectionType.FemaleRaenNpc => $"Female {SubRace.Raen.ToName()} (NPC)",
|
||||
CollectionType.FemaleXaelaNpc => $"Female {SubRace.Xaela.ToName()} (NPC)",
|
||||
CollectionType.FemaleHelionNpc => $"Female {SubRace.Helion.ToName()} (NPC)",
|
||||
CollectionType.FemaleLostNpc => $"Female {SubRace.Lost.ToName()} (NPC)",
|
||||
CollectionType.FemaleRavaNpc => $"Female {SubRace.Rava.ToName()} (NPC)",
|
||||
CollectionType.FemaleVeenaNpc => $"Female {SubRace.Veena.ToName()} (NPC)",
|
||||
CollectionType.Inactive => "Collection",
|
||||
CollectionType.Default => "Base",
|
||||
CollectionType.Interface => "Interface",
|
||||
CollectionType.Individual => "Individual",
|
||||
CollectionType.Current => "Current",
|
||||
_ => string.Empty,
|
||||
};
|
||||
|
||||
public static string ToDescription(this CollectionType collectionType)
|
||||
|
|
@ -580,4 +576,4 @@ public static class CollectionTypeExtensions
|
|||
"This collection applies to all female non-player character Veena Viera that do not have a more specific character collection associated.",
|
||||
_ => string.Empty,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue