Distinguish between Race-for-Customization and Race-for-Models

This commit is contained in:
Ottermandias 2021-08-19 11:14:01 +02:00
parent 1a82922281
commit 190fae6623
3 changed files with 161 additions and 115 deletions

View file

@ -4,6 +4,19 @@ using System.ComponentModel;
namespace Penumbra.GameData.Enums namespace Penumbra.GameData.Enums
{ {
public enum Race : byte
{
Unknown,
Hyur,
Elezen,
Lalafell,
Miqote,
Roegadyn,
AuRa,
Hrothgar,
Viera,
}
public enum Gender : byte public enum Gender : byte
{ {
Unknown, Unknown,
@ -13,7 +26,7 @@ namespace Penumbra.GameData.Enums
FemaleNpc, FemaleNpc,
} }
public enum Race : byte public enum ModelRace : byte
{ {
Unknown, Unknown,
Midlander, Midlander,
@ -97,7 +110,7 @@ namespace Penumbra.GameData.Enums
SubRace.Midlander => 0, SubRace.Midlander => 0,
SubRace.Highlander => 1, SubRace.Highlander => 1,
SubRace.Wildwood => 10, SubRace.Wildwood => 10,
SubRace.Duskwight => 11, SubRace.Duskwight => 11,
SubRace.Plainsfolk => 20, SubRace.Plainsfolk => 20,
SubRace.Dunesfolk => 21, SubRace.Dunesfolk => 21,
SubRace.SeekerOfTheSun => 30, SubRace.SeekerOfTheSun => 30,
@ -106,11 +119,29 @@ namespace Penumbra.GameData.Enums
SubRace.Hellsguard => 41, SubRace.Hellsguard => 41,
SubRace.Raen => 50, SubRace.Raen => 50,
SubRace.Xaela => 51, SubRace.Xaela => 51,
SubRace.Helion => 60, SubRace.Helion => 60,
SubRace.Lost => 61, SubRace.Lost => 61,
SubRace.Rava => 70, SubRace.Rava => 70,
SubRace.Veena => 71, SubRace.Veena => 71,
_ => throw new InvalidEnumArgumentException(), _ => throw new ArgumentOutOfRangeException( nameof( subRace ), subRace, null ),
};
}
public static Race ToRace( this ModelRace race )
{
return race switch
{
ModelRace.Unknown => Race.Unknown,
ModelRace.Midlander => Race.Hyur,
ModelRace.Highlander => Race.Hyur,
ModelRace.Elezen => Race.Elezen,
ModelRace.Lalafell => Race.Lalafell,
ModelRace.Miqote => Race.Miqote,
ModelRace.Roegadyn => Race.Roegadyn,
ModelRace.AuRa => Race.AuRa,
ModelRace.Hrothgar => Race.Hrothgar,
ModelRace.Viera => Race.Viera,
_ => throw new ArgumentOutOfRangeException( nameof( race ), race, null ),
}; };
} }
@ -119,10 +150,10 @@ namespace Penumbra.GameData.Enums
return subRace switch return subRace switch
{ {
SubRace.Unknown => Race.Unknown, SubRace.Unknown => Race.Unknown,
SubRace.Midlander => Race.Midlander, SubRace.Midlander => Race.Hyur,
SubRace.Highlander => Race.Midlander, SubRace.Highlander => Race.Hyur,
SubRace.Wildwood => Race.Elezen, SubRace.Wildwood => Race.Elezen,
SubRace.Duskwight => Race.Elezen, SubRace.Duskwight => Race.Elezen,
SubRace.Plainsfolk => Race.Lalafell, SubRace.Plainsfolk => Race.Lalafell,
SubRace.Dunesfolk => Race.Lalafell, SubRace.Dunesfolk => Race.Lalafell,
SubRace.SeekerOfTheSun => Race.Miqote, SubRace.SeekerOfTheSun => Race.Miqote,
@ -131,11 +162,28 @@ namespace Penumbra.GameData.Enums
SubRace.Hellsguard => Race.Roegadyn, SubRace.Hellsguard => Race.Roegadyn,
SubRace.Raen => Race.AuRa, SubRace.Raen => Race.AuRa,
SubRace.Xaela => Race.AuRa, SubRace.Xaela => Race.AuRa,
SubRace.Helion => Race.Hrothgar, SubRace.Helion => Race.Hrothgar,
SubRace.Lost => Race.Hrothgar, SubRace.Lost => Race.Hrothgar,
SubRace.Rava => Race.Viera, SubRace.Rava => Race.Viera,
SubRace.Veena => Race.Viera, SubRace.Veena => Race.Viera,
_ => throw new InvalidEnumArgumentException(), _ => throw new ArgumentOutOfRangeException( nameof( subRace ), subRace, null ),
};
}
public static string ToName( this ModelRace modelRace )
{
return modelRace switch
{
ModelRace.Midlander => SubRace.Midlander.ToName(),
ModelRace.Highlander => SubRace.Highlander.ToName(),
ModelRace.Elezen => Race.Elezen.ToName(),
ModelRace.Lalafell => Race.Lalafell.ToName(),
ModelRace.Miqote => Race.Miqote.ToName(),
ModelRace.Roegadyn => Race.Roegadyn.ToName(),
ModelRace.AuRa => Race.AuRa.ToName(),
ModelRace.Hrothgar => Race.Hrothgar.ToName(),
ModelRace.Viera => Race.Viera.ToName(),
_ => throw new ArgumentOutOfRangeException( nameof( modelRace ), modelRace, null ),
}; };
} }
@ -143,16 +191,15 @@ namespace Penumbra.GameData.Enums
{ {
return race switch return race switch
{ {
Race.Midlander => "Midlander", Race.Hyur => "Hyur",
Race.Highlander => "Highlander", Race.Elezen => "Elezen",
Race.Elezen => "Elezen", Race.Lalafell => "Lalafell",
Race.Lalafell => "Lalafell", Race.Miqote => "Miqo'te",
Race.Miqote => "Miqo'te", Race.Roegadyn => "Roegadyn",
Race.Roegadyn => "Roegadyn", Race.AuRa => "Au Ra",
Race.AuRa => "Au Ra", Race.Hrothgar => "Hrothgar",
Race.Hrothgar => "Hrothgar", Race.Viera => "Viera",
Race.Viera => "Viera", _ => throw new ArgumentOutOfRangeException( nameof( race ), race, null ),
_ => throw new InvalidEnumArgumentException(),
}; };
} }
@ -175,7 +222,7 @@ namespace Penumbra.GameData.Enums
SubRace.Midlander => "Midlander", SubRace.Midlander => "Midlander",
SubRace.Highlander => "Highlander", SubRace.Highlander => "Highlander",
SubRace.Wildwood => "Wildwood", SubRace.Wildwood => "Wildwood",
SubRace.Duskwight => "Duskwright", SubRace.Duskwight => "Duskwright",
SubRace.Plainsfolk => "Plainsfolk", SubRace.Plainsfolk => "Plainsfolk",
SubRace.Dunesfolk => "Dunesfolk", SubRace.Dunesfolk => "Dunesfolk",
SubRace.SeekerOfTheSun => "Seeker Of The Sun", SubRace.SeekerOfTheSun => "Seeker Of The Sun",
@ -184,7 +231,7 @@ namespace Penumbra.GameData.Enums
SubRace.Hellsguard => "Hellsguard", SubRace.Hellsguard => "Hellsguard",
SubRace.Raen => "Raen", SubRace.Raen => "Raen",
SubRace.Xaela => "Xaela", SubRace.Xaela => "Xaela",
SubRace.Helion => "Hellion", SubRace.Helion => "Hellion",
SubRace.Lost => "Lost", SubRace.Lost => "Lost",
SubRace.Rava => "Rava", SubRace.Rava => "Rava",
SubRace.Veena => "Veena", SubRace.Veena => "Veena",
@ -195,11 +242,11 @@ namespace Penumbra.GameData.Enums
public static bool FitsRace( this SubRace subRace, Race race ) public static bool FitsRace( this SubRace subRace, Race race )
=> subRace.ToRace() == race; => subRace.ToRace() == race;
public static byte ToByte( this Gender gender, Race race ) public static byte ToByte( this Gender gender, ModelRace modelRace )
=> ( byte )( ( int )gender | ( ( int )race << 3 ) ); => ( byte )( ( int )gender | ( ( int )modelRace << 3 ) );
public static byte ToByte( this Race race, Gender gender ) public static byte ToByte( this ModelRace modelRace, Gender gender )
=> gender.ToByte( race ); => gender.ToByte( modelRace );
public static byte ToByte( this GenderRace value ) public static byte ToByte( this GenderRace value )
{ {
@ -207,45 +254,45 @@ namespace Penumbra.GameData.Enums
return gender.ToByte( race ); return gender.ToByte( race );
} }
public static (Gender, Race) Split( this GenderRace value ) public static (Gender, ModelRace) Split( this GenderRace value )
{ {
return value switch return value switch
{ {
GenderRace.Unknown => ( Gender.Unknown, Race.Unknown ), GenderRace.Unknown => ( Gender.Unknown, ModelRace.Unknown ),
GenderRace.MidlanderMale => ( Gender.Male, Race.Midlander ), GenderRace.MidlanderMale => ( Gender.Male, ModelRace.Midlander ),
GenderRace.MidlanderMaleNpc => ( Gender.MaleNpc, Race.Midlander ), GenderRace.MidlanderMaleNpc => ( Gender.MaleNpc, ModelRace.Midlander ),
GenderRace.MidlanderFemale => ( Gender.Female, Race.Midlander ), GenderRace.MidlanderFemale => ( Gender.Female, ModelRace.Midlander ),
GenderRace.MidlanderFemaleNpc => ( Gender.FemaleNpc, Race.Midlander ), GenderRace.MidlanderFemaleNpc => ( Gender.FemaleNpc, ModelRace.Midlander ),
GenderRace.HighlanderMale => ( Gender.Male, Race.Highlander ), GenderRace.HighlanderMale => ( Gender.Male, ModelRace.Highlander ),
GenderRace.HighlanderMaleNpc => ( Gender.MaleNpc, Race.Highlander ), GenderRace.HighlanderMaleNpc => ( Gender.MaleNpc, ModelRace.Highlander ),
GenderRace.HighlanderFemale => ( Gender.Female, Race.Highlander ), GenderRace.HighlanderFemale => ( Gender.Female, ModelRace.Highlander ),
GenderRace.HighlanderFemaleNpc => ( Gender.FemaleNpc, Race.Highlander ), GenderRace.HighlanderFemaleNpc => ( Gender.FemaleNpc, ModelRace.Highlander ),
GenderRace.ElezenMale => ( Gender.Male, Race.Elezen ), GenderRace.ElezenMale => ( Gender.Male, ModelRace.Elezen ),
GenderRace.ElezenMaleNpc => ( Gender.MaleNpc, Race.Elezen ), GenderRace.ElezenMaleNpc => ( Gender.MaleNpc, ModelRace.Elezen ),
GenderRace.ElezenFemale => ( Gender.Female, Race.Elezen ), GenderRace.ElezenFemale => ( Gender.Female, ModelRace.Elezen ),
GenderRace.ElezenFemaleNpc => ( Gender.FemaleNpc, Race.Elezen ), GenderRace.ElezenFemaleNpc => ( Gender.FemaleNpc, ModelRace.Elezen ),
GenderRace.LalafellMale => ( Gender.Male, Race.Lalafell ), GenderRace.LalafellMale => ( Gender.Male, ModelRace.Lalafell ),
GenderRace.LalafellMaleNpc => ( Gender.MaleNpc, Race.Lalafell ), GenderRace.LalafellMaleNpc => ( Gender.MaleNpc, ModelRace.Lalafell ),
GenderRace.LalafellFemale => ( Gender.Female, Race.Lalafell ), GenderRace.LalafellFemale => ( Gender.Female, ModelRace.Lalafell ),
GenderRace.LalafellFemaleNpc => ( Gender.FemaleNpc, Race.Lalafell ), GenderRace.LalafellFemaleNpc => ( Gender.FemaleNpc, ModelRace.Lalafell ),
GenderRace.MiqoteMale => ( Gender.Male, Race.Miqote ), GenderRace.MiqoteMale => ( Gender.Male, ModelRace.Miqote ),
GenderRace.MiqoteMaleNpc => ( Gender.MaleNpc, Race.Miqote ), GenderRace.MiqoteMaleNpc => ( Gender.MaleNpc, ModelRace.Miqote ),
GenderRace.MiqoteFemale => ( Gender.Female, Race.Miqote ), GenderRace.MiqoteFemale => ( Gender.Female, ModelRace.Miqote ),
GenderRace.MiqoteFemaleNpc => ( Gender.FemaleNpc, Race.Miqote ), GenderRace.MiqoteFemaleNpc => ( Gender.FemaleNpc, ModelRace.Miqote ),
GenderRace.RoegadynMale => ( Gender.Male, Race.Roegadyn ), GenderRace.RoegadynMale => ( Gender.Male, ModelRace.Roegadyn ),
GenderRace.RoegadynMaleNpc => ( Gender.MaleNpc, Race.Roegadyn ), GenderRace.RoegadynMaleNpc => ( Gender.MaleNpc, ModelRace.Roegadyn ),
GenderRace.RoegadynFemale => ( Gender.Female, Race.Roegadyn ), GenderRace.RoegadynFemale => ( Gender.Female, ModelRace.Roegadyn ),
GenderRace.RoegadynFemaleNpc => ( Gender.FemaleNpc, Race.Roegadyn ), GenderRace.RoegadynFemaleNpc => ( Gender.FemaleNpc, ModelRace.Roegadyn ),
GenderRace.AuRaMale => ( Gender.Male, Race.AuRa ), GenderRace.AuRaMale => ( Gender.Male, ModelRace.AuRa ),
GenderRace.AuRaMaleNpc => ( Gender.MaleNpc, Race.AuRa ), GenderRace.AuRaMaleNpc => ( Gender.MaleNpc, ModelRace.AuRa ),
GenderRace.AuRaFemale => ( Gender.Female, Race.AuRa ), GenderRace.AuRaFemale => ( Gender.Female, ModelRace.AuRa ),
GenderRace.AuRaFemaleNpc => ( Gender.FemaleNpc, Race.AuRa ), GenderRace.AuRaFemaleNpc => ( Gender.FemaleNpc, ModelRace.AuRa ),
GenderRace.HrothgarMale => ( Gender.Male, Race.Hrothgar ), GenderRace.HrothgarMale => ( Gender.Male, ModelRace.Hrothgar ),
GenderRace.HrothgarMaleNpc => ( Gender.MaleNpc, Race.Hrothgar ), GenderRace.HrothgarMaleNpc => ( Gender.MaleNpc, ModelRace.Hrothgar ),
GenderRace.VieraFemale => ( Gender.Female, Race.Viera ), GenderRace.VieraFemale => ( Gender.Female, ModelRace.Viera ),
GenderRace.VieraFemaleNpc => ( Gender.FemaleNpc, Race.Viera ), GenderRace.VieraFemaleNpc => ( Gender.FemaleNpc, ModelRace.Viera ),
GenderRace.UnknownMaleNpc => ( Gender.MaleNpc, Race.Unknown ), GenderRace.UnknownMaleNpc => ( Gender.MaleNpc, ModelRace.Unknown ),
GenderRace.UnknownFemaleNpc => ( Gender.FemaleNpc, Race.Unknown ), GenderRace.UnknownFemaleNpc => ( Gender.FemaleNpc, ModelRace.Unknown ),
_ => throw new InvalidEnumArgumentException(), _ => throw new InvalidEnumArgumentException(),
}; };
} }
@ -343,61 +390,61 @@ namespace Penumbra.GameData.Enums
public static GenderRace GenderRaceFromByte( byte value ) public static GenderRace GenderRaceFromByte( byte value )
{ {
var gender = ( Gender )( value & 0b111 ); var gender = ( Gender )( value & 0b111 );
var race = ( Race )( value >> 3 ); var race = ( ModelRace )( value >> 3 );
return CombinedRace( gender, race ); return CombinedRace( gender, race );
} }
public static GenderRace CombinedRace( Gender gender, Race race ) public static GenderRace CombinedRace( Gender gender, ModelRace modelRace )
{ {
return gender switch return gender switch
{ {
Gender.Male => race switch Gender.Male => modelRace switch
{ {
Race.Midlander => GenderRace.MidlanderMale, ModelRace.Midlander => GenderRace.MidlanderMale,
Race.Highlander => GenderRace.HighlanderMale, ModelRace.Highlander => GenderRace.HighlanderMale,
Race.Elezen => GenderRace.ElezenMale, ModelRace.Elezen => GenderRace.ElezenMale,
Race.Lalafell => GenderRace.LalafellMale, ModelRace.Lalafell => GenderRace.LalafellMale,
Race.Miqote => GenderRace.MiqoteMale, ModelRace.Miqote => GenderRace.MiqoteMale,
Race.Roegadyn => GenderRace.RoegadynMale, ModelRace.Roegadyn => GenderRace.RoegadynMale,
Race.AuRa => GenderRace.AuRaMale, ModelRace.AuRa => GenderRace.AuRaMale,
Race.Hrothgar => GenderRace.HrothgarMale, ModelRace.Hrothgar => GenderRace.HrothgarMale,
_ => GenderRace.Unknown, _ => GenderRace.Unknown,
}, },
Gender.MaleNpc => race switch Gender.MaleNpc => modelRace switch
{ {
Race.Midlander => GenderRace.MidlanderMaleNpc, ModelRace.Midlander => GenderRace.MidlanderMaleNpc,
Race.Highlander => GenderRace.HighlanderMaleNpc, ModelRace.Highlander => GenderRace.HighlanderMaleNpc,
Race.Elezen => GenderRace.ElezenMaleNpc, ModelRace.Elezen => GenderRace.ElezenMaleNpc,
Race.Lalafell => GenderRace.LalafellMaleNpc, ModelRace.Lalafell => GenderRace.LalafellMaleNpc,
Race.Miqote => GenderRace.MiqoteMaleNpc, ModelRace.Miqote => GenderRace.MiqoteMaleNpc,
Race.Roegadyn => GenderRace.RoegadynMaleNpc, ModelRace.Roegadyn => GenderRace.RoegadynMaleNpc,
Race.AuRa => GenderRace.AuRaMaleNpc, ModelRace.AuRa => GenderRace.AuRaMaleNpc,
Race.Hrothgar => GenderRace.HrothgarMaleNpc, ModelRace.Hrothgar => GenderRace.HrothgarMaleNpc,
_ => GenderRace.Unknown, _ => GenderRace.Unknown,
}, },
Gender.Female => race switch Gender.Female => modelRace switch
{ {
Race.Midlander => GenderRace.MidlanderFemale, ModelRace.Midlander => GenderRace.MidlanderFemale,
Race.Highlander => GenderRace.HighlanderFemale, ModelRace.Highlander => GenderRace.HighlanderFemale,
Race.Elezen => GenderRace.ElezenFemale, ModelRace.Elezen => GenderRace.ElezenFemale,
Race.Lalafell => GenderRace.LalafellFemale, ModelRace.Lalafell => GenderRace.LalafellFemale,
Race.Miqote => GenderRace.MiqoteFemale, ModelRace.Miqote => GenderRace.MiqoteFemale,
Race.Roegadyn => GenderRace.RoegadynFemale, ModelRace.Roegadyn => GenderRace.RoegadynFemale,
Race.AuRa => GenderRace.AuRaFemale, ModelRace.AuRa => GenderRace.AuRaFemale,
Race.Viera => GenderRace.VieraFemale, ModelRace.Viera => GenderRace.VieraFemale,
_ => GenderRace.Unknown, _ => GenderRace.Unknown,
}, },
Gender.FemaleNpc => race switch Gender.FemaleNpc => modelRace switch
{ {
Race.Midlander => GenderRace.MidlanderFemaleNpc, ModelRace.Midlander => GenderRace.MidlanderFemaleNpc,
Race.Highlander => GenderRace.HighlanderFemaleNpc, ModelRace.Highlander => GenderRace.HighlanderFemaleNpc,
Race.Elezen => GenderRace.ElezenFemaleNpc, ModelRace.Elezen => GenderRace.ElezenFemaleNpc,
Race.Lalafell => GenderRace.LalafellFemaleNpc, ModelRace.Lalafell => GenderRace.LalafellFemaleNpc,
Race.Miqote => GenderRace.MiqoteFemaleNpc, ModelRace.Miqote => GenderRace.MiqoteFemaleNpc,
Race.Roegadyn => GenderRace.RoegadynFemaleNpc, ModelRace.Roegadyn => GenderRace.RoegadynFemaleNpc,
Race.AuRa => GenderRace.AuRaFemaleNpc, ModelRace.AuRa => GenderRace.AuRaFemaleNpc,
Race.Viera => GenderRace.VieraFemaleNpc, ModelRace.Viera => GenderRace.VieraFemaleNpc,
_ => GenderRace.Unknown, _ => GenderRace.Unknown,
}, },
_ => GenderRace.Unknown, _ => GenderRace.Unknown,
}; };

View file

@ -7,7 +7,6 @@ using Penumbra.GameData.Enums;
using Penumbra.GameData.Structs; using Penumbra.GameData.Structs;
using Penumbra.GameData.Util; using Penumbra.GameData.Util;
using Action = Lumina.Excel.GeneratedSheets.Action; using Action = Lumina.Excel.GeneratedSheets.Action;
using Race = Penumbra.GameData.Enums.Race;
namespace Penumbra.GameData namespace Penumbra.GameData
{ {
@ -246,7 +245,7 @@ namespace Penumbra.GameData
break; break;
case ObjectType.Character: case ObjectType.Character:
var (gender, race) = info.GenderRace.Split(); var (gender, race) = info.GenderRace.Split();
var raceString = race != Race.Unknown ? race.ToName() + " " : ""; var raceString = race != ModelRace.Unknown ? race.ToName() + " " : "";
var genderString = gender != Gender.Unknown ? gender.ToName() + " " : "Player "; var genderString = gender != Gender.Unknown ? gender.ToName() + " " : "Player ";
if( info.CustomizationType == CustomizationType.Skin ) if( info.CustomizationType == CustomizationType.Skin )
{ {

View file

@ -55,17 +55,17 @@ namespace Penumbra.UI
( "Right Finger", EquipSlot.RFinger ), ( "Right Finger", EquipSlot.RFinger ),
}; };
private static readonly (string, Race)[] Races = private static readonly (string, ModelRace)[] Races =
{ {
( Race.Midlander.ToName(), Race.Midlander ), ( ModelRace.Midlander.ToName(), ModelRace.Midlander ),
( Race.Highlander.ToName(), Race.Highlander ), ( ModelRace.Highlander.ToName(), ModelRace.Highlander ),
( Race.Elezen.ToName(), Race.Elezen ), ( ModelRace.Elezen.ToName(), ModelRace.Elezen ),
( Race.Miqote.ToName(), Race.Miqote ), ( ModelRace.Miqote.ToName(), ModelRace.Miqote ),
( Race.Roegadyn.ToName(), Race.Roegadyn ), ( ModelRace.Roegadyn.ToName(), ModelRace.Roegadyn ),
( Race.Lalafell.ToName(), Race.Lalafell ), ( ModelRace.Lalafell.ToName(), ModelRace.Lalafell ),
( Race.AuRa.ToName(), Race.AuRa ), ( ModelRace.AuRa.ToName(), ModelRace.AuRa ),
( Race.Viera.ToName(), Race.Viera ), ( ModelRace.Viera.ToName(), ModelRace.Viera ),
( Race.Hrothgar.ToName(), Race.Hrothgar ), ( ModelRace.Hrothgar.ToName(), ModelRace.Hrothgar ),
}; };
private static readonly (string, Gender)[] Genders = private static readonly (string, Gender)[] Genders =