Split special collections.

This commit is contained in:
Ottermandias 2022-09-27 15:37:21 +02:00
parent ef418b6821
commit 1d6d696cb7
9 changed files with 478 additions and 224 deletions

View file

@ -202,7 +202,7 @@ public static class RaceEnumExtensions
SubRace.Midlander => "Midlander", SubRace.Midlander => "Midlander",
SubRace.Highlander => "Highlander", SubRace.Highlander => "Highlander",
SubRace.Wildwood => "Wildwood", SubRace.Wildwood => "Wildwood",
SubRace.Duskwight => "Duskwright", SubRace.Duskwight => "Duskwight",
SubRace.Plainsfolk => "Plainsfolk", SubRace.Plainsfolk => "Plainsfolk",
SubRace.Dunesfolk => "Dunesfolk", SubRace.Dunesfolk => "Dunesfolk",
SubRace.SeekerOfTheSun => "Seeker Of The Sun", SubRace.SeekerOfTheSun => "Seeker Of The Sun",

View file

@ -195,7 +195,7 @@ public partial class ModCollection
public static string ActiveCollectionFile public static string ActiveCollectionFile
=> Path.Combine( Dalamud.PluginInterface.ConfigDirectory.FullName, "active_collections.json" ); => Path.Combine( Dalamud.PluginInterface.ConfigDirectory.FullName, "active_collections.json" );
// Load default, current and character collections from config. // Load default, current, special, and character collections from config.
// Then create caches. If a collection does not exist anymore, reset it to an appropriate default. // Then create caches. If a collection does not exist anymore, reset it to an appropriate default.
private void LoadCollections() private void LoadCollections()
{ {
@ -246,7 +246,7 @@ public partial class ModCollection
} }
// Load special collections. // Load special collections.
foreach( var type in CollectionTypeExtensions.Special ) foreach( var (type, name, _) in CollectionTypeExtensions.Special )
{ {
var typeName = jObject[ type.ToString() ]?.ToObject< string >(); var typeName = jObject[ type.ToString() ]?.ToObject< string >();
if( typeName != null ) if( typeName != null )
@ -254,7 +254,7 @@ public partial class ModCollection
var idx = GetIndexForCollectionName( typeName ); var idx = GetIndexForCollectionName( typeName );
if( idx < 0 ) if( idx < 0 )
{ {
Penumbra.Log.Error( $"Last choice of {type.ToName()} Collection {typeName} is not available, removed." ); Penumbra.Log.Error( $"Last choice of {name} Collection {typeName} is not available, removed." );
configChanged = true; configChanged = true;
} }
else else
@ -288,6 +288,30 @@ public partial class ModCollection
} }
} }
// Migrate ungendered collections to Male and Female for 0.5.9.0.
public static void MigrateUngenderedCollections()
{
if( !ReadActiveCollections( out var jObject ) )
return;
foreach( var (type, _, _) in CollectionTypeExtensions.Special.Where( t => t.Item2.StartsWith( "Male " ) ) )
{
var oldName = type.ToString()[ 5.. ];
var value = jObject[oldName];
if( value == null )
continue;
jObject.Remove( oldName );
jObject.Add( "Male" + oldName, value );
jObject.Add( "Female" + oldName, value );
}
using var stream = File.Open( ActiveCollectionFile, FileMode.Truncate );
using var writer = new StreamWriter( stream );
using var j = new JsonTextWriter( writer );
jObject.WriteTo( j );
}
public void SaveActiveCollections() public void SaveActiveCollections()
{ {

View file

@ -8,40 +8,91 @@ public enum CollectionType : byte
{ {
// Special Collections // Special Collections
Yourself = 0, Yourself = 0,
PlayerCharacter,
NonPlayerCharacter, MalePlayerCharacter,
Midlander, FemalePlayerCharacter,
Highlander, MaleNonPlayerCharacter,
Wildwood, FemaleNonPlayerCharacter,
Duskwight,
Plainsfolk, MaleMidlander,
Dunesfolk, FemaleMidlander,
SeekerOfTheSun, MaleHighlander,
KeeperOfTheMoon, FemaleHighlander,
Seawolf,
Hellsguard, MaleWildwood,
Raen, FemaleWildwood,
Xaela, MaleDuskwight,
Helion, FemaleDuskwight,
Lost,
Rava, MalePlainsfolk,
Veena, FemalePlainsfolk,
MidlanderNpc, MaleDunesfolk,
HighlanderNpc, FemaleDunesfolk,
WildwoodNpc,
DuskwightNpc, MaleSeekerOfTheSun,
PlainsfolkNpc, FemaleSeekerOfTheSun,
DunesfolkNpc, MaleKeeperOfTheMoon,
SeekerOfTheSunNpc, FemaleKeeperOfTheMoon,
KeeperOfTheMoonNpc,
SeawolfNpc, MaleSeawolf,
HellsguardNpc, FemaleSeawolf,
RaenNpc, MaleHellsguard,
XaelaNpc, FemaleHellsguard,
HelionNpc,
LostNpc, MaleRaen,
RavaNpc, FemaleRaen,
VeenaNpc, MaleXaela,
FemaleXaela,
MaleHelion,
FemaleHelion,
MaleLost,
FemaleLost,
MaleRava,
FemaleRava,
MaleVeena,
FemaleVeena,
MaleMidlanderNpc,
FemaleMidlanderNpc,
MaleHighlanderNpc,
FemaleHighlanderNpc,
MaleWildwoodNpc,
FemaleWildwoodNpc,
MaleDuskwightNpc,
FemaleDuskwightNpc,
MalePlainsfolkNpc,
FemalePlainsfolkNpc,
MaleDunesfolkNpc,
FemaleDunesfolkNpc,
MaleSeekerOfTheSunNpc,
FemaleSeekerOfTheSunNpc,
MaleKeeperOfTheMoonNpc,
FemaleKeeperOfTheMoonNpc,
MaleSeawolfNpc,
FemaleSeawolfNpc,
MaleHellsguardNpc,
FemaleHellsguardNpc,
MaleRaenNpc,
FemaleRaenNpc,
MaleXaelaNpc,
FemaleXaelaNpc,
MaleHelionNpc,
FemaleHelionNpc,
MaleLostNpc,
FemaleLostNpc,
MaleRavaNpc,
FemaleRavaNpc,
MaleVeenaNpc,
FemaleVeenaNpc,
Inactive, // A collection was added or removed Inactive, // A collection was added or removed
Default, // The default collection was changed Default, // The default collection was changed
@ -55,52 +106,190 @@ public static class CollectionTypeExtensions
public static bool IsSpecial( this CollectionType collectionType ) public static bool IsSpecial( this CollectionType collectionType )
=> collectionType is >= CollectionType.Yourself and < CollectionType.Inactive; => collectionType is >= CollectionType.Yourself and < CollectionType.Inactive;
public static readonly CollectionType[] Special = Enum.GetValues< CollectionType >().Where( IsSpecial ).ToArray(); public static readonly (CollectionType, string, string)[] Special = Enum.GetValues< CollectionType >()
.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.FemaleNpc => Gender.Female,
_ => gender,
};
return ( gender, npc ) switch
{
(Gender.Male, false) => CollectionType.MalePlayerCharacter,
(Gender.Female, false) => CollectionType.FemalePlayerCharacter,
(Gender.Male, true) => CollectionType.MaleNonPlayerCharacter,
(Gender.Female, true) => CollectionType.FemaleNonPlayerCharacter,
_ => CollectionType.Inactive,
};
}
public static CollectionType FromParts( SubRace race, Gender gender, bool npc )
{
gender = gender switch
{
Gender.MaleNpc => Gender.Male,
Gender.FemaleNpc => Gender.Female,
_ => 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.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.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.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.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,
};
}
public static string ToName( this CollectionType collectionType ) public static string ToName( this CollectionType collectionType )
=> collectionType switch => collectionType switch
{ {
CollectionType.Yourself => "Your Character", CollectionType.Yourself => "Your Character",
CollectionType.PlayerCharacter => "Player Characters", CollectionType.MalePlayerCharacter => "Male Player Characters",
CollectionType.NonPlayerCharacter => "Non-Player Characters", CollectionType.MaleNonPlayerCharacter => "Male Non-Player Characters",
CollectionType.Midlander => SubRace.Midlander.ToName(), CollectionType.MaleMidlander => $"Male {SubRace.Midlander.ToName()}",
CollectionType.Highlander => SubRace.Highlander.ToName(), CollectionType.MaleHighlander => $"Male {SubRace.Highlander.ToName()}",
CollectionType.Wildwood => SubRace.Wildwood.ToName(), CollectionType.MaleWildwood => $"Male {SubRace.Wildwood.ToName()}",
CollectionType.Duskwight => SubRace.Duskwight.ToName(), CollectionType.MaleDuskwight => $"Male {SubRace.Duskwight.ToName()}",
CollectionType.Plainsfolk => SubRace.Plainsfolk.ToName(), CollectionType.MalePlainsfolk => $"Male {SubRace.Plainsfolk.ToName()}",
CollectionType.Dunesfolk => SubRace.Dunesfolk.ToName(), CollectionType.MaleDunesfolk => $"Male {SubRace.Dunesfolk.ToName()}",
CollectionType.SeekerOfTheSun => SubRace.SeekerOfTheSun.ToName(), CollectionType.MaleSeekerOfTheSun => $"Male {SubRace.SeekerOfTheSun.ToName()}",
CollectionType.KeeperOfTheMoon => SubRace.KeeperOfTheMoon.ToName(), CollectionType.MaleKeeperOfTheMoon => $"Male {SubRace.KeeperOfTheMoon.ToName()}",
CollectionType.Seawolf => SubRace.Seawolf.ToName(), CollectionType.MaleSeawolf => $"Male {SubRace.Seawolf.ToName()}",
CollectionType.Hellsguard => SubRace.Hellsguard.ToName(), CollectionType.MaleHellsguard => $"Male {SubRace.Hellsguard.ToName()}",
CollectionType.Raen => SubRace.Raen.ToName(), CollectionType.MaleRaen => $"Male {SubRace.Raen.ToName()}",
CollectionType.Xaela => SubRace.Xaela.ToName(), CollectionType.MaleXaela => $"Male {SubRace.Xaela.ToName()}",
CollectionType.Helion => SubRace.Helion.ToName(), CollectionType.MaleHelion => $"Male {SubRace.Helion.ToName()}",
CollectionType.Lost => SubRace.Lost.ToName(), CollectionType.MaleLost => $"Male {SubRace.Lost.ToName()}",
CollectionType.Rava => SubRace.Rava.ToName(), CollectionType.MaleRava => $"Male {SubRace.Rava.ToName()}",
CollectionType.Veena => SubRace.Veena.ToName(), CollectionType.MaleVeena => $"Male {SubRace.Veena.ToName()}",
CollectionType.MidlanderNpc => SubRace.Midlander.ToName() + " (NPC)", CollectionType.MaleMidlanderNpc => $"Male {SubRace.Midlander.ToName()} (NPC)",
CollectionType.HighlanderNpc => SubRace.Highlander.ToName() + " (NPC)", CollectionType.MaleHighlanderNpc => $"Male {SubRace.Highlander.ToName()} (NPC)",
CollectionType.WildwoodNpc => SubRace.Wildwood.ToName() + " (NPC)", CollectionType.MaleWildwoodNpc => $"Male {SubRace.Wildwood.ToName()} (NPC)",
CollectionType.DuskwightNpc => SubRace.Duskwight.ToName() + " (NPC)", CollectionType.MaleDuskwightNpc => $"Male {SubRace.Duskwight.ToName()} (NPC)",
CollectionType.PlainsfolkNpc => SubRace.Plainsfolk.ToName() + " (NPC)", CollectionType.MalePlainsfolkNpc => $"Male {SubRace.Plainsfolk.ToName()} (NPC)",
CollectionType.DunesfolkNpc => SubRace.Dunesfolk.ToName() + " (NPC)", CollectionType.MaleDunesfolkNpc => $"Male {SubRace.Dunesfolk.ToName()} (NPC)",
CollectionType.SeekerOfTheSunNpc => SubRace.SeekerOfTheSun.ToName() + " (NPC)", CollectionType.MaleSeekerOfTheSunNpc => $"Male {SubRace.SeekerOfTheSun.ToName()} (NPC)",
CollectionType.KeeperOfTheMoonNpc => SubRace.KeeperOfTheMoon.ToName() + " (NPC)", CollectionType.MaleKeeperOfTheMoonNpc => $"Male {SubRace.KeeperOfTheMoon.ToName()} (NPC)",
CollectionType.SeawolfNpc => SubRace.Seawolf.ToName() + " (NPC)", CollectionType.MaleSeawolfNpc => $"Male {SubRace.Seawolf.ToName()} (NPC)",
CollectionType.HellsguardNpc => SubRace.Hellsguard.ToName() + " (NPC)", CollectionType.MaleHellsguardNpc => $"Male {SubRace.Hellsguard.ToName()} (NPC)",
CollectionType.RaenNpc => SubRace.Raen.ToName() + " (NPC)", CollectionType.MaleRaenNpc => $"Male {SubRace.Raen.ToName()} (NPC)",
CollectionType.XaelaNpc => SubRace.Xaela.ToName() + " (NPC)", CollectionType.MaleXaelaNpc => $"Male {SubRace.Xaela.ToName()} (NPC)",
CollectionType.HelionNpc => SubRace.Helion.ToName() + " (NPC)", CollectionType.MaleHelionNpc => $"Male {SubRace.Helion.ToName()} (NPC)",
CollectionType.LostNpc => SubRace.Lost.ToName() + " (NPC)", CollectionType.MaleLostNpc => $"Male {SubRace.Lost.ToName()} (NPC)",
CollectionType.RavaNpc => SubRace.Rava.ToName() + " (NPC)", CollectionType.MaleRavaNpc => $"Male {SubRace.Rava.ToName()} (NPC)",
CollectionType.VeenaNpc => SubRace.Veena.ToName() + " (NPC)", CollectionType.MaleVeenaNpc => $"Male {SubRace.Veena.ToName()} (NPC)",
CollectionType.Inactive => "Collection", CollectionType.FemalePlayerCharacter => "Female Player Characters",
CollectionType.Default => "Default", CollectionType.FemaleNonPlayerCharacter => "Female Non-Player Characters",
CollectionType.Interface => "Interface", CollectionType.FemaleMidlander => $"Female {SubRace.Midlander.ToName()}",
CollectionType.Character => "Character", CollectionType.FemaleHighlander => $"Female {SubRace.Highlander.ToName()}",
CollectionType.Current => "Current", CollectionType.FemaleWildwood => $"Female {SubRace.Wildwood.ToName()}",
_ => string.Empty, 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.Character => "Character",
CollectionType.Current => "Current",
_ => string.Empty,
}; };
public static string ToDescription( this CollectionType collectionType ) public static string ToDescription( this CollectionType collectionType )
@ -108,74 +297,142 @@ public static class CollectionTypeExtensions
{ {
CollectionType.Yourself => "This collection applies to your own character, regardless of its name.\n" CollectionType.Yourself => "This collection applies to your own character, regardless of its name.\n"
+ "It takes precedence before all other collections except for explicitly named character collections.", + "It takes precedence before all other collections except for explicitly named character collections.",
CollectionType.PlayerCharacter => CollectionType.MalePlayerCharacter =>
"This collection applies to all player characters that do not have a more specific character or racial collections associated.", "This collection applies to all male player characters that do not have a more specific character or racial collections associated.",
CollectionType.NonPlayerCharacter => CollectionType.MaleNonPlayerCharacter =>
"This collection applies to all human non-player characters except those explicitly named. It takes precedence before the default and racial collections.", "This collection applies to all human male non-player characters except those explicitly named. It takes precedence before the default and racial collections.",
CollectionType.Midlander => CollectionType.MaleMidlander =>
"This collection applies to all player character Midlander Hyur that do not have a more specific character collection associated.", "This collection applies to all male player character Midlander Hyur that do not have a more specific character collection associated.",
CollectionType.Highlander => CollectionType.MaleHighlander =>
"This collection applies to all player character Highlander Hyur that do not have a more specific character collection associated.", "This collection applies to all male player character Highlander Hyur that do not have a more specific character collection associated.",
CollectionType.Wildwood => CollectionType.MaleWildwood =>
"This collection applies to all player character Wildwood Elezen that do not have a more specific character collection associated.", "This collection applies to all male player character Wildwood Elezen that do not have a more specific character collection associated.",
CollectionType.Duskwight => CollectionType.MaleDuskwight =>
"This collection applies to all player character Duskwight Elezen that do not have a more specific character collection associated.", "This collection applies to all male player character Duskwight Elezen that do not have a more specific character collection associated.",
CollectionType.Plainsfolk => CollectionType.MalePlainsfolk =>
"This collection applies to all player character Plainsfolk Lalafell that do not have a more specific character collection associated.", "This collection applies to all male player character Plainsfolk Lalafell that do not have a more specific character collection associated.",
CollectionType.Dunesfolk => CollectionType.MaleDunesfolk =>
"This collection applies to all player character Dunesfolk Lalafell that do not have a more specific character collection associated.", "This collection applies to all male player character Dunesfolk Lalafell that do not have a more specific character collection associated.",
CollectionType.SeekerOfTheSun => CollectionType.MaleSeekerOfTheSun =>
"This collection applies to all player character Seekers of the Sun that do not have a more specific character collection associated.", "This collection applies to all male player character Seekers of the Sun that do not have a more specific character collection associated.",
CollectionType.KeeperOfTheMoon => CollectionType.MaleKeeperOfTheMoon =>
"This collection applies to all player character Keepers of the Moon that do not have a more specific character collection associated.", "This collection applies to all male player character Keepers of the Moon that do not have a more specific character collection associated.",
CollectionType.Seawolf => CollectionType.MaleSeawolf =>
"This collection applies to all player character Sea Wolf Roegadyn that do not have a more specific character collection associated.", "This collection applies to all male player character Sea Wolf Roegadyn that do not have a more specific character collection associated.",
CollectionType.Hellsguard => CollectionType.MaleHellsguard =>
"This collection applies to all player character Hellsguard Roegadyn that do not have a more specific character collection associated.", "This collection applies to all male player character Hellsguard Roegadyn that do not have a more specific character collection associated.",
CollectionType.Raen => CollectionType.MaleRaen =>
"This collection applies to all player character Raen Au Ra that do not have a more specific character collection associated.", "This collection applies to all male player character Raen Au Ra that do not have a more specific character collection associated.",
CollectionType.Xaela => CollectionType.MaleXaela =>
"This collection applies to all player character Xaela Au Ra that do not have a more specific character collection associated.", "This collection applies to all male player character Xaela Au Ra that do not have a more specific character collection associated.",
CollectionType.Helion => CollectionType.MaleHelion =>
"This collection applies to all player character Helion Hrothgar that do not have a more specific character collection associated.", "This collection applies to all male player character Helion Hrothgar that do not have a more specific character collection associated.",
CollectionType.Lost => CollectionType.MaleLost =>
"This collection applies to all player character Lost Hrothgar that do not have a more specific character collection associated.", "This collection applies to all male player character Lost Hrothgar that do not have a more specific character collection associated.",
CollectionType.Rava => CollectionType.MaleRava =>
"This collection applies to all player character Rava Viera that do not have a more specific character collection associated.", "This collection applies to all male player character Rava Viera that do not have a more specific character collection associated.",
CollectionType.Veena => CollectionType.MaleVeena =>
"This collection applies to all player character Veena Viera that do not have a more specific character collection associated.", "This collection applies to all male player character Veena Viera that do not have a more specific character collection associated.",
CollectionType.MidlanderNpc => CollectionType.MaleMidlanderNpc =>
"This collection applies to all non-player character Midlander Hyur that do not have a more specific character collection associated.", "This collection applies to all male non-player character Midlander Hyur that do not have a more specific character collection associated.",
CollectionType.HighlanderNpc => CollectionType.MaleHighlanderNpc =>
"This collection applies to all non-player character Highlander Hyur that do not have a more specific character collection associated.", "This collection applies to all male non-player character Highlander Hyur that do not have a more specific character collection associated.",
CollectionType.WildwoodNpc => CollectionType.MaleWildwoodNpc =>
"This collection applies to all non-player character Wildwood Elezen that do not have a more specific character collection associated.", "This collection applies to all male non-player character Wildwood Elezen that do not have a more specific character collection associated.",
CollectionType.DuskwightNpc => CollectionType.MaleDuskwightNpc =>
"This collection applies to all non-player character Duskwight Elezen that do not have a more specific character collection associated.", "This collection applies to all male non-player character Duskwight Elezen that do not have a more specific character collection associated.",
CollectionType.PlainsfolkNpc => CollectionType.MalePlainsfolkNpc =>
"This collection applies to all non-player character Plainsfolk Lalafell that do not have a more specific character collection associated.", "This collection applies to all male non-player character Plainsfolk Lalafell that do not have a more specific character collection associated.",
CollectionType.DunesfolkNpc => CollectionType.MaleDunesfolkNpc =>
"This collection applies to all non-player character Dunesfolk Lalafell that do not have a more specific character collection associated.", "This collection applies to all male non-player character Dunesfolk Lalafell that do not have a more specific character collection associated.",
CollectionType.SeekerOfTheSunNpc => CollectionType.MaleSeekerOfTheSunNpc =>
"This collection applies to all non-player character Seekers of the Sun that do not have a more specific character collection associated.", "This collection applies to all male non-player character Seekers of the Sun that do not have a more specific character collection associated.",
CollectionType.KeeperOfTheMoonNpc => CollectionType.MaleKeeperOfTheMoonNpc =>
"This collection applies to all non-player character Keepers of the Moon that do not have a more specific character collection associated.", "This collection applies to all male non-player character Keepers of the Moon that do not have a more specific character collection associated.",
CollectionType.SeawolfNpc => CollectionType.MaleSeawolfNpc =>
"This collection applies to all non-player character Sea Wolf Roegadyn that do not have a more specific character collection associated.", "This collection applies to all male non-player character Sea Wolf Roegadyn that do not have a more specific character collection associated.",
CollectionType.HellsguardNpc => CollectionType.MaleHellsguardNpc =>
"This collection applies to all non-player character Hellsguard Roegadyn that do not have a more specific character collection associated.", "This collection applies to all male non-player character Hellsguard Roegadyn that do not have a more specific character collection associated.",
CollectionType.RaenNpc => CollectionType.MaleRaenNpc =>
"This collection applies to all non-player character Raen Au Ra that do not have a more specific character collection associated.", "This collection applies to all male non-player character Raen Au Ra that do not have a more specific character collection associated.",
CollectionType.XaelaNpc => CollectionType.MaleXaelaNpc =>
"This collection applies to all non-player character Xaela Au Ra that do not have a more specific character collection associated.", "This collection applies to all male non-player character Xaela Au Ra that do not have a more specific character collection associated.",
CollectionType.HelionNpc => CollectionType.MaleHelionNpc =>
"This collection applies to all non-player character Helion Hrothgar that do not have a more specific character collection associated.", "This collection applies to all male non-player character Helion Hrothgar that do not have a more specific character collection associated.",
CollectionType.LostNpc => CollectionType.MaleLostNpc =>
"This collection applies to all non-player character Lost Hrothgar that do not have a more specific character collection associated.", "This collection applies to all male non-player character Lost Hrothgar that do not have a more specific character collection associated.",
CollectionType.RavaNpc => CollectionType.MaleRavaNpc =>
"This collection applies to all non-player character Rava Viera that do not have a more specific character collection associated.", "This collection applies to all male non-player character Rava Viera that do not have a more specific character collection associated.",
CollectionType.VeenaNpc => CollectionType.MaleVeenaNpc =>
"This collection applies to all non-player character Veena Viera that do not have a more specific character collection associated.", "This collection applies to all male non-player character Veena Viera that do not have a more specific character collection associated.",
CollectionType.FemalePlayerCharacter =>
"This collection applies to all female player characters that do not have a more specific character or racial collections associated.",
CollectionType.FemaleNonPlayerCharacter =>
"This collection applies to all human female non-player characters except those explicitly named. It takes precedence before the default and racial collections.",
CollectionType.FemaleMidlander =>
"This collection applies to all female player character Midlander Hyur that do not have a more specific character collection associated.",
CollectionType.FemaleHighlander =>
"This collection applies to all female player character Highlander Hyur that do not have a more specific character collection associated.",
CollectionType.FemaleWildwood =>
"This collection applies to all female player character Wildwood Elezen that do not have a more specific character collection associated.",
CollectionType.FemaleDuskwight =>
"This collection applies to all female player character Duskwight Elezen that do not have a more specific character collection associated.",
CollectionType.FemalePlainsfolk =>
"This collection applies to all female player character Plainsfolk Lalafell that do not have a more specific character collection associated.",
CollectionType.FemaleDunesfolk =>
"This collection applies to all female player character Dunesfolk Lalafell that do not have a more specific character collection associated.",
CollectionType.FemaleSeekerOfTheSun =>
"This collection applies to all female player character Seekers of the Sun that do not have a more specific character collection associated.",
CollectionType.FemaleKeeperOfTheMoon =>
"This collection applies to all female player character Keepers of the Moon that do not have a more specific character collection associated.",
CollectionType.FemaleSeawolf =>
"This collection applies to all female player character Sea Wolf Roegadyn that do not have a more specific character collection associated.",
CollectionType.FemaleHellsguard =>
"This collection applies to all female player character Hellsguard Roegadyn that do not have a more specific character collection associated.",
CollectionType.FemaleRaen =>
"This collection applies to all female player character Raen Au Ra that do not have a more specific character collection associated.",
CollectionType.FemaleXaela =>
"This collection applies to all female player character Xaela Au Ra that do not have a more specific character collection associated.",
CollectionType.FemaleHelion =>
"This collection applies to all female player character Helion Hrothgar that do not have a more specific character collection associated.",
CollectionType.FemaleLost =>
"This collection applies to all female player character Lost Hrothgar that do not have a more specific character collection associated.",
CollectionType.FemaleRava =>
"This collection applies to all female player character Rava Viera that do not have a more specific character collection associated.",
CollectionType.FemaleVeena =>
"This collection applies to all female player character Veena Viera that do not have a more specific character collection associated.",
CollectionType.FemaleMidlanderNpc =>
"This collection applies to all female non-player character Midlander Hyur that do not have a more specific character collection associated.",
CollectionType.FemaleHighlanderNpc =>
"This collection applies to all female non-player character Highlander Hyur that do not have a more specific character collection associated.",
CollectionType.FemaleWildwoodNpc =>
"This collection applies to all female non-player character Wildwood Elezen that do not have a more specific character collection associated.",
CollectionType.FemaleDuskwightNpc =>
"This collection applies to all female non-player character Duskwight Elezen that do not have a more specific character collection associated.",
CollectionType.FemalePlainsfolkNpc =>
"This collection applies to all female non-player character Plainsfolk Lalafell that do not have a more specific character collection associated.",
CollectionType.FemaleDunesfolkNpc =>
"This collection applies to all female non-player character Dunesfolk Lalafell that do not have a more specific character collection associated.",
CollectionType.FemaleSeekerOfTheSunNpc =>
"This collection applies to all female non-player character Seekers of the Sun that do not have a more specific character collection associated.",
CollectionType.FemaleKeeperOfTheMoonNpc =>
"This collection applies to all female non-player character Keepers of the Moon that do not have a more specific character collection associated.",
CollectionType.FemaleSeawolfNpc =>
"This collection applies to all female non-player character Sea Wolf Roegadyn that do not have a more specific character collection associated.",
CollectionType.FemaleHellsguardNpc =>
"This collection applies to all female non-player character Hellsguard Roegadyn that do not have a more specific character collection associated.",
CollectionType.FemaleRaenNpc =>
"This collection applies to all female non-player character Raen Au Ra that do not have a more specific character collection associated.",
CollectionType.FemaleXaelaNpc =>
"This collection applies to all female non-player character Xaela Au Ra that do not have a more specific character collection associated.",
CollectionType.FemaleHelionNpc =>
"This collection applies to all female non-player character Helion Hrothgar that do not have a more specific character collection associated.",
CollectionType.FemaleLostNpc =>
"This collection applies to all female non-player character Lost Hrothgar that do not have a more specific character collection associated.",
CollectionType.FemaleRavaNpc =>
"This collection applies to all female non-player character Rava Viera that do not have a more specific character collection associated.",
CollectionType.FemaleVeenaNpc =>
"This collection applies to all female non-player character Veena Viera that do not have a more specific character collection associated.",
_ => string.Empty, _ => string.Empty,
}; };
} }

View file

@ -48,8 +48,20 @@ public partial class Configuration
m.Version3To4(); m.Version3To4();
m.Version4To5(); m.Version4To5();
m.Version5To6(); m.Version5To6();
m.Version6To7();
} }
// Gendered special collections were added.
private void Version6To7()
{
if( _config.Version != 6 )
return;
ModCollection.Manager.MigrateUngenderedCollections();
_config.Version = 7;
}
// A new tutorial step was inserted in the middle. // A new tutorial step was inserted in the middle.
// The UI collection and a new tutorial for it was added. // The UI collection and a new tutorial for it was added.
// The migration for the UI collection itself happens in the ActiveCollections file. // The migration for the UI collection itself happens in the ActiveCollections file.

View file

@ -144,7 +144,7 @@ public partial class Configuration : IPluginConfiguration
// Contains some default values or boundaries for config values. // Contains some default values or boundaries for config values.
public static class Constants public static class Constants
{ {
public const int CurrentVersion = 6; public const int CurrentVersion = 7;
public const float MaxAbsoluteSize = 600; public const float MaxAbsoluteSize = 600;
public const int DefaultAbsoluteSize = 250; public const int DefaultAbsoluteSize = 250;
public const float MinAbsoluteSize = 50; public const float MinAbsoluteSize = 50;

View file

@ -241,9 +241,9 @@ public unsafe partial class PathResolver
{ {
collection = null; collection = null;
// Check for the Yourself collection. // Check for the Yourself collection.
if( actor->ObjectIndex == 0 if( actor->ObjectIndex == 0
|| Cutscenes.GetParentIndex(actor->ObjectIndex) == 0 || Cutscenes.GetParentIndex( actor->ObjectIndex ) == 0
|| name == Dalamud.ClientState.LocalPlayer?.Name.ToString() ) || name == Dalamud.ClientState.LocalPlayer?.Name.ToString() )
{ {
collection = Penumbra.CollectionManager.ByType( CollectionType.Yourself ); collection = Penumbra.CollectionManager.ByType( CollectionType.Yourself );
if( collection != null ) if( collection != null )
@ -258,64 +258,16 @@ public unsafe partial class PathResolver
// Only handle human models. // Only handle human models.
if( character->ModelCharaId == 0 ) if( character->ModelCharaId == 0 )
{ {
// Check if the object is a non-player human NPC. var race = ( SubRace )character->CustomizeData[ 4 ];
if( actor->ObjectKind == ( byte )ObjectKind.Player ) var gender = ( Gender )( character->CustomizeData[ 1 ] + 1 );
var isNpc = actor->ObjectKind != ( byte )ObjectKind.Player;
var type = CollectionTypeExtensions.FromParts( race, gender, isNpc );
collection = Penumbra.CollectionManager.ByType( type );
collection ??= Penumbra.CollectionManager.ByType( CollectionTypeExtensions.FromParts( gender, isNpc ) );
if( collection != null )
{ {
// Check the subrace. If it does not fit any or no subrace collection is set, check the player character collection. return true;
collection = ( SubRace )( ( Character* )actor )->CustomizeData[ 4 ] switch
{
SubRace.Midlander => Penumbra.CollectionManager.ByType( CollectionType.Midlander ),
SubRace.Highlander => Penumbra.CollectionManager.ByType( CollectionType.Highlander ),
SubRace.Wildwood => Penumbra.CollectionManager.ByType( CollectionType.Wildwood ),
SubRace.Duskwight => Penumbra.CollectionManager.ByType( CollectionType.Duskwight ),
SubRace.Plainsfolk => Penumbra.CollectionManager.ByType( CollectionType.Plainsfolk ),
SubRace.Dunesfolk => Penumbra.CollectionManager.ByType( CollectionType.Dunesfolk ),
SubRace.SeekerOfTheSun => Penumbra.CollectionManager.ByType( CollectionType.SeekerOfTheSun ),
SubRace.KeeperOfTheMoon => Penumbra.CollectionManager.ByType( CollectionType.KeeperOfTheMoon ),
SubRace.Seawolf => Penumbra.CollectionManager.ByType( CollectionType.Seawolf ),
SubRace.Hellsguard => Penumbra.CollectionManager.ByType( CollectionType.Hellsguard ),
SubRace.Raen => Penumbra.CollectionManager.ByType( CollectionType.Raen ),
SubRace.Xaela => Penumbra.CollectionManager.ByType( CollectionType.Xaela ),
SubRace.Helion => Penumbra.CollectionManager.ByType( CollectionType.Helion ),
SubRace.Lost => Penumbra.CollectionManager.ByType( CollectionType.Lost ),
SubRace.Rava => Penumbra.CollectionManager.ByType( CollectionType.Rava ),
SubRace.Veena => Penumbra.CollectionManager.ByType( CollectionType.Veena ),
_ => null,
};
collection ??= Penumbra.CollectionManager.ByType( CollectionType.PlayerCharacter );
if( collection != null )
{
return true;
}
}
else
{
// Check the subrace. If it does not fit any or no subrace collection is set, check the npn-player character collection.
collection = ( SubRace )( ( Character* )actor )->CustomizeData[ 4 ] switch
{
SubRace.Midlander => Penumbra.CollectionManager.ByType( CollectionType.MidlanderNpc ),
SubRace.Highlander => Penumbra.CollectionManager.ByType( CollectionType.HighlanderNpc ),
SubRace.Wildwood => Penumbra.CollectionManager.ByType( CollectionType.WildwoodNpc ),
SubRace.Duskwight => Penumbra.CollectionManager.ByType( CollectionType.DuskwightNpc ),
SubRace.Plainsfolk => Penumbra.CollectionManager.ByType( CollectionType.PlainsfolkNpc ),
SubRace.Dunesfolk => Penumbra.CollectionManager.ByType( CollectionType.DunesfolkNpc ),
SubRace.SeekerOfTheSun => Penumbra.CollectionManager.ByType( CollectionType.SeekerOfTheSunNpc ),
SubRace.KeeperOfTheMoon => Penumbra.CollectionManager.ByType( CollectionType.KeeperOfTheMoonNpc ),
SubRace.Seawolf => Penumbra.CollectionManager.ByType( CollectionType.SeawolfNpc ),
SubRace.Hellsguard => Penumbra.CollectionManager.ByType( CollectionType.HellsguardNpc ),
SubRace.Raen => Penumbra.CollectionManager.ByType( CollectionType.RaenNpc ),
SubRace.Xaela => Penumbra.CollectionManager.ByType( CollectionType.XaelaNpc ),
SubRace.Helion => Penumbra.CollectionManager.ByType( CollectionType.HelionNpc ),
SubRace.Lost => Penumbra.CollectionManager.ByType( CollectionType.LostNpc ),
SubRace.Rava => Penumbra.CollectionManager.ByType( CollectionType.RavaNpc ),
SubRace.Veena => Penumbra.CollectionManager.ByType( CollectionType.VeenaNpc ),
_ => null,
};
collection ??= Penumbra.CollectionManager.ByType( CollectionType.NonPlayerCharacter );
if( collection != null )
{
return true;
}
} }
} }
} }

View file

@ -483,12 +483,12 @@ public class Penumbra : IDalamudPlugin
sb.AppendFormat( "> **`Base Collection: `** {0}\n", CollectionManager.Default.AnonymizedName ); sb.AppendFormat( "> **`Base Collection: `** {0}\n", CollectionManager.Default.AnonymizedName );
sb.AppendFormat( "> **`Interface Collection: `** {0}\n", CollectionManager.Interface.AnonymizedName ); sb.AppendFormat( "> **`Interface Collection: `** {0}\n", CollectionManager.Interface.AnonymizedName );
sb.AppendFormat( "> **`Selected Collection: `** {0}\n", CollectionManager.Current.AnonymizedName ); sb.AppendFormat( "> **`Selected Collection: `** {0}\n", CollectionManager.Current.AnonymizedName );
foreach( var type in CollectionTypeExtensions.Special ) foreach( var (type, name, _) in CollectionTypeExtensions.Special )
{ {
var collection = CollectionManager.ByType( type ); var collection = CollectionManager.ByType( type );
if( collection != null ) if( collection != null )
{ {
sb.AppendFormat( "> **`{0,-29}`** {1}\n", type.ToName(), collection.AnonymizedName ); sb.AppendFormat( "> **`{0,-29}`** {1}\n", name, collection.AnonymizedName );
} }
} }

View file

@ -20,10 +20,17 @@ public partial class ConfigWindow
Add5_7_1( ret ); Add5_7_1( ret );
Add5_8_0( ret ); Add5_8_0( ret );
Add5_8_7( ret ); Add5_8_7( ret );
Add5_9_0( ret );
return ret; return ret;
} }
private static void Add5_9_0( Changelog log )
=> log.NextVersion( "Version 0.5.9.0" )
.RegisterEntry( "Special Collections are now split between male and female." )
.RegisterEntry( "Fix a bug where the Base and Interface Collection were set to None instead of Default on a fresh install." )
.RegisterEntry( "TexTools .meta and .rgsp files are now incorporated based on file- and game path extensions." );
private static void Add5_8_7( Changelog log ) private static void Add5_8_7( Changelog log )
=> log.NextVersion( "Version 0.5.8.7" ) => log.NextVersion( "Version 0.5.8.7" )
.RegisterEntry( "Fixed some problems with metadata reloading and reverting and IMC files. (5.8.1 to 5.8.7)." ) .RegisterEntry( "Fixed some problems with metadata reloading and reverting and IMC files. (5.8.1 to 5.8.7)." )

View file

@ -38,10 +38,10 @@ public partial class ConfigWindow
// Input text fields. // Input text fields.
private string _newCollectionName = string.Empty; private string _newCollectionName = string.Empty;
private bool _canAddCollection = false; private bool _canAddCollection = false;
private string _newCharacterName = string.Empty; private string _newCharacterName = string.Empty;
private CollectionType? _currentType = CollectionType.Yourself; private (CollectionType, string, string)? _currentType = CollectionTypeExtensions.Special.First();
// Create a new collection that is either empty or a duplicate of the current collection. // Create a new collection that is either empty or a duplicate of the current collection.
// Resets the new collection name. // Resets the new collection name.
@ -150,9 +150,10 @@ public partial class ConfigWindow
+ $"but all {IndividualAssignments} take precedence before them."; + $"but all {IndividualAssignments} take precedence before them.";
ImGui.SetNextItemWidth( _window._inputTextWidth.X ); ImGui.SetNextItemWidth( _window._inputTextWidth.X );
if( _currentType == null || Penumbra.CollectionManager.ByType( _currentType.Value ) != null ) if( _currentType == null || Penumbra.CollectionManager.ByType( _currentType.Value.Item1 ) != null )
{ {
_currentType = CollectionTypeExtensions.Special.FindFirst( t => Penumbra.CollectionManager.ByType( t ) == null, out var t2 ) _currentType = CollectionTypeExtensions.Special.FindFirst( t => Penumbra.CollectionManager.ByType( t.Item1 ) == null,
out var t2 )
? t2 ? t2
: null; : null;
} }
@ -162,16 +163,17 @@ public partial class ConfigWindow
return; return;
} }
using( var combo = ImRaii.Combo( "##NewSpecial", _currentType.Value.ToName() ) ) using( var combo = ImRaii.Combo( "##NewSpecial", _currentType.Value.Item2 ) )
{ {
if( combo ) if( combo )
{ {
foreach( var type in CollectionTypeExtensions.Special.Where( t => Penumbra.CollectionManager.ByType( t ) == null ) ) foreach( var type in CollectionTypeExtensions.Special.Where( t => Penumbra.CollectionManager.ByType( t.Item1 ) == null ) )
{ {
if( ImGui.Selectable( type.ToName(), type == _currentType.Value ) ) if( ImGui.Selectable( type.Item2, type.Item1 == _currentType.Value.Item1 ) )
{ {
_currentType = type; _currentType = type;
} }
ImGuiUtil.HoverTooltip( type.Item3 );
} }
} }
} }
@ -183,7 +185,7 @@ public partial class ConfigWindow
: description; : description;
if( ImGuiUtil.DrawDisabledButton( $"Assign {ConditionalGroup}", new Vector2( 120 * ImGuiHelpers.GlobalScale, 0 ), tt, disabled ) ) if( ImGuiUtil.DrawDisabledButton( $"Assign {ConditionalGroup}", new Vector2( 120 * ImGuiHelpers.GlobalScale, 0 ), tt, disabled ) )
{ {
Penumbra.CollectionManager.CreateSpecialCollection( _currentType!.Value ); Penumbra.CollectionManager.CreateSpecialCollection( _currentType!.Value.Item1 );
_currentType = null; _currentType = null;
} }
} }
@ -212,7 +214,7 @@ public partial class ConfigWindow
private void DrawSpecialCollections() private void DrawSpecialCollections()
{ {
foreach( var type in CollectionTypeExtensions.Special ) foreach( var (type, name, desc) in CollectionTypeExtensions.Special )
{ {
var collection = Penumbra.CollectionManager.ByType( type ); var collection = Penumbra.CollectionManager.ByType( type );
if( collection != null ) if( collection != null )
@ -228,7 +230,7 @@ public partial class ConfigWindow
ImGui.SameLine(); ImGui.SameLine();
ImGui.AlignTextToFramePadding(); ImGui.AlignTextToFramePadding();
ImGuiUtil.LabeledHelpMarker( type.ToName(), type.ToDescription() ); ImGuiUtil.LabeledHelpMarker( name, desc );
} }
} }
} }
@ -246,7 +248,7 @@ public partial class ConfigWindow
private void DrawIndividualAssignments() private void DrawIndividualAssignments()
{ {
using var _ = ImRaii.Group(); using var _ = ImRaii.Group();
ImGui.TextUnformatted( $"Individual {ConditionalIndividual}s" ); ImGui.TextUnformatted( $"Individual {ConditionalIndividual}s" );
ImGui.Separator(); ImGui.Separator();
foreach( var name in Penumbra.CollectionManager.Characters.Keys.OrderBy( k => k ).ToArray() ) foreach( var name in Penumbra.CollectionManager.Characters.Keys.OrderBy( k => k ).ToArray() )
{ {