diff --git a/PKHeX.Core/Saves/Access/SaveBlockAccessor9ZA.cs b/PKHeX.Core/Saves/Access/SaveBlockAccessor9ZA.cs
index c3ba57638..b878a50e4 100644
--- a/PKHeX.Core/Saves/Access/SaveBlockAccessor9ZA.cs
+++ b/PKHeX.Core/Saves/Access/SaveBlockAccessor9ZA.cs
@@ -23,6 +23,7 @@ public sealed class SaveBlockAccessor9ZA(SAV9ZA sav) : SCBlockAccessor
public Epoch1900DateTimeValue EnrollmentDate { get; } = new(Block(sav, KEnrollmentDate)); // not actually used
public Coordinates9a Coordinates { get; } = new(sav, Block(sav, KCoordinates));
public InfiniteRoyale9a InfiniteRoyale { get; } = new(sav, Block(sav, KInfiniteRoyale));
+ public PlayerAppearance9a PlayerAppearance { get; } = new(sav, Block(sav, KCurrentAppearance));
public PlayerFashion9a PlayerFashion { get; } = new(sav, Block(sav, KCurrentClothing));
public ConfigSave9a Config { get; } = new(sav, Block(sav, KConfig));
diff --git a/PKHeX.Core/Saves/SAV9ZA.cs b/PKHeX.Core/Saves/SAV9ZA.cs
index 63cd36072..1b78750a6 100644
--- a/PKHeX.Core/Saves/SAV9ZA.cs
+++ b/PKHeX.Core/Saves/SAV9ZA.cs
@@ -72,6 +72,7 @@ public override void CopyChangesFrom(SaveFile sav)
public Epoch1900DateTimeValue StartTime => Blocks.EnrollmentDate;
public Coordinates9a Coordinates => Blocks.Coordinates;
public InfiniteRoyale9a InfiniteRoyale => Blocks.InfiniteRoyale;
+ public PlayerAppearance9a PlayerAppearance => Blocks.PlayerAppearance;
public PlayerFashion9a PlayerFashion => Blocks.PlayerFashion;
public ConfigSave9a Config => Blocks.Config;
#endregion
diff --git a/PKHeX.Core/Saves/Substructures/Gen9/SV/PlayerAppearance9.cs b/PKHeX.Core/Saves/Substructures/Gen9/SV/PlayerAppearance9.cs
index 72ec66a82..4084f234d 100644
--- a/PKHeX.Core/Saves/Substructures/Gen9/SV/PlayerAppearance9.cs
+++ b/PKHeX.Core/Saves/Substructures/Gen9/SV/PlayerAppearance9.cs
@@ -1,4 +1,3 @@
-using System.ComponentModel;
using static System.Buffers.Binary.BinaryPrimitives;
namespace PKHeX.Core;
@@ -6,7 +5,6 @@ namespace PKHeX.Core;
///
/// Stores the selected facial appearances of the player.
///
-[TypeConverter(typeof(ExpandableObjectConverter))]
public sealed class PlayerAppearance9(SAV9SV sav, SCBlock block) : SaveBlock(sav, block.Raw)
{
public ulong SkinColor { get => ReadUInt64LittleEndian(Data); set => WriteUInt64LittleEndian(Data, value); }
diff --git a/PKHeX.Core/Saves/Substructures/Gen9/SV/PlayerFashion9.cs b/PKHeX.Core/Saves/Substructures/Gen9/SV/PlayerFashion9.cs
index 090942999..4128afe26 100644
--- a/PKHeX.Core/Saves/Substructures/Gen9/SV/PlayerFashion9.cs
+++ b/PKHeX.Core/Saves/Substructures/Gen9/SV/PlayerFashion9.cs
@@ -6,18 +6,17 @@ namespace PKHeX.Core;
///
/// Stores the selected clothing choices of the player.
///
-[TypeConverter(typeof(ExpandableObjectConverter))]
public sealed class PlayerFashion9(SAV9SV sav, SCBlock block) : SaveBlock(sav, block.Raw)
{
- public ulong Base { get => ReadUInt64LittleEndian(Data); set => WriteUInt64LittleEndian(Data, value); }
- public ulong Accessory { get => ReadUInt64LittleEndian(Data[0x08..]); set => WriteUInt64LittleEndian(Data[0x08..], value); }
- public ulong Bag { get => ReadUInt64LittleEndian(Data[0x10..]); set => WriteUInt64LittleEndian(Data[0x10..], value); }
- public ulong Eyewear { get => ReadUInt64LittleEndian(Data[0x18..]); set => WriteUInt64LittleEndian(Data[0x18..], value); }
- public ulong Footwear { get => ReadUInt64LittleEndian(Data[0x20..]); set => WriteUInt64LittleEndian(Data[0x20..], value); }
- public ulong Gloves { get => ReadUInt64LittleEndian(Data[0x28..]); set => WriteUInt64LittleEndian(Data[0x28..], value); }
- public ulong Headwear { get => ReadUInt64LittleEndian(Data[0x30..]); set => WriteUInt64LittleEndian(Data[0x30..], value); }
- public ulong Hairstyle { get => ReadUInt64LittleEndian(Data[0x38..]); set => WriteUInt64LittleEndian(Data[0x38..], value); }
- public ulong Legwear { get => ReadUInt64LittleEndian(Data[0x40..]); set => WriteUInt64LittleEndian(Data[0x40..], value); }
- public ulong Clothing { get => ReadUInt64LittleEndian(Data[0x48..]); set => WriteUInt64LittleEndian(Data[0x48..], value); }
- public ulong Face { get => ReadUInt64LittleEndian(Data[0x50..]); set => WriteUInt64LittleEndian(Data[0x50..], value); }
+ [TypeConverter(typeof(TypeConverterU64))] public ulong Base { get => ReadUInt64LittleEndian(Data); set => WriteUInt64LittleEndian(Data, value); }
+ [TypeConverter(typeof(TypeConverterU64))] public ulong Accessory { get => ReadUInt64LittleEndian(Data[0x08..]); set => WriteUInt64LittleEndian(Data[0x08..], value); }
+ [TypeConverter(typeof(TypeConverterU64))] public ulong Bag { get => ReadUInt64LittleEndian(Data[0x10..]); set => WriteUInt64LittleEndian(Data[0x10..], value); }
+ [TypeConverter(typeof(TypeConverterU64))] public ulong Eyewear { get => ReadUInt64LittleEndian(Data[0x18..]); set => WriteUInt64LittleEndian(Data[0x18..], value); }
+ [TypeConverter(typeof(TypeConverterU64))] public ulong Footwear { get => ReadUInt64LittleEndian(Data[0x20..]); set => WriteUInt64LittleEndian(Data[0x20..], value); }
+ [TypeConverter(typeof(TypeConverterU64))] public ulong Gloves { get => ReadUInt64LittleEndian(Data[0x28..]); set => WriteUInt64LittleEndian(Data[0x28..], value); }
+ [TypeConverter(typeof(TypeConverterU64))] public ulong Headwear { get => ReadUInt64LittleEndian(Data[0x30..]); set => WriteUInt64LittleEndian(Data[0x30..], value); }
+ [TypeConverter(typeof(TypeConverterU64))] public ulong Hairstyle { get => ReadUInt64LittleEndian(Data[0x38..]); set => WriteUInt64LittleEndian(Data[0x38..], value); }
+ [TypeConverter(typeof(TypeConverterU64))] public ulong Legwear { get => ReadUInt64LittleEndian(Data[0x40..]); set => WriteUInt64LittleEndian(Data[0x40..], value); }
+ [TypeConverter(typeof(TypeConverterU64))] public ulong Clothing { get => ReadUInt64LittleEndian(Data[0x48..]); set => WriteUInt64LittleEndian(Data[0x48..], value); }
+ [TypeConverter(typeof(TypeConverterU64))] public ulong Face { get => ReadUInt64LittleEndian(Data[0x50..]); set => WriteUInt64LittleEndian(Data[0x50..], value); }
}
diff --git a/PKHeX.Core/Saves/Substructures/Gen9/ZA/PlayerAppearence9a.cs b/PKHeX.Core/Saves/Substructures/Gen9/ZA/PlayerAppearence9a.cs
new file mode 100644
index 000000000..8e6d295ca
--- /dev/null
+++ b/PKHeX.Core/Saves/Substructures/Gen9/ZA/PlayerAppearence9a.cs
@@ -0,0 +1,28 @@
+using static System.Buffers.Binary.BinaryPrimitives;
+
+namespace PKHeX.Core;
+
+///
+/// Stores the selected traits of appearance of the player, minus hairstyle and eye cut.
+///
+public sealed class PlayerAppearance9a(SAV9ZA sav, SCBlock block) : SaveBlock(sav, block.Raw)
+{
+ public uint SkinColor { get => ReadUInt32LittleEndian(Data); set => WriteUInt32LittleEndian(Data, value); }
+ public uint LipColor { get => ReadUInt32LittleEndian(Data[0x04..]); set => WriteUInt32LittleEndian(Data[0x04..], value); }
+ public uint DarkCircles { get => ReadUInt32LittleEndian(Data[0x08..]); set => WriteUInt32LittleEndian(Data[0x08..], value); }
+ public uint EyeColor { get => ReadUInt32LittleEndian(Data[0x0C..]); set => WriteUInt32LittleEndian(Data[0x0C..], value); }
+ public uint EyebrowColor { get => ReadUInt32LittleEndian(Data[0x10..]); set => WriteUInt32LittleEndian(Data[0x10..], value); }
+ public uint EyebrowShape { get => ReadUInt32LittleEndian(Data[0x14..]); set => WriteUInt32LittleEndian(Data[0x14..], value); }
+ public uint EyelashColor { get => ReadUInt32LittleEndian(Data[0x18..]); set => WriteUInt32LittleEndian(Data[0x18..], value); }
+ public uint EyelashShape { get => ReadUInt32LittleEndian(Data[0x1C..]); set => WriteUInt32LittleEndian(Data[0x1C..], value); }
+ public uint BeautySpotFirst { get => ReadUInt32LittleEndian(Data[0x20..]); set => WriteUInt32LittleEndian(Data[0x20..], value); }
+ public uint BeautySpotSecond { get => ReadUInt32LittleEndian(Data[0x24..]); set => WriteUInt32LittleEndian(Data[0x24..], value); }
+ public uint Freckles { get => ReadUInt32LittleEndian(Data[0x28..]); set => WriteUInt32LittleEndian(Data[0x28..], value); }
+ public uint HairColor { get => ReadUInt32LittleEndian(Data[0x2C..]); set => WriteUInt32LittleEndian(Data[0x2C..], value); }
+ public uint ColorBlocking { get => ReadUInt32LittleEndian(Data[0x30..]); set => WriteUInt32LittleEndian(Data[0x30..], value); }
+ public uint BalayageFadeFirst { get => ReadUInt32LittleEndian(Data[0x34..]); set => WriteUInt32LittleEndian(Data[0x34..], value); }
+ public uint BalayageFadeSecond { get => ReadUInt32LittleEndian(Data[0x38..]); set => WriteUInt32LittleEndian(Data[0x38..], value); }
+ public uint FaceShape { get => ReadUInt32LittleEndian(Data[0x3C..]); set => WriteUInt32LittleEndian(Data[0x3C..], value); }
+ public uint Bangs { get => ReadUInt32LittleEndian(Data[0x40..]); set => WriteUInt32LittleEndian(Data[0x44..], value); }
+ public uint HairColorMode { get => ReadUInt32LittleEndian(Data[0x44..]); set => WriteUInt32LittleEndian(Data[0x44..], value); }
+}
diff --git a/PKHeX.Core/Saves/Substructures/Gen9/ZA/PlayerFashion9a.cs b/PKHeX.Core/Saves/Substructures/Gen9/ZA/PlayerFashion9a.cs
index 98b0cc936..962f7b111 100644
--- a/PKHeX.Core/Saves/Substructures/Gen9/ZA/PlayerFashion9a.cs
+++ b/PKHeX.Core/Saves/Substructures/Gen9/ZA/PlayerFashion9a.cs
@@ -8,6 +8,34 @@ namespace PKHeX.Core;
///
public sealed class PlayerFashion9a(SAV9ZA sav, SCBlock block) : SaveBlock(sav, block.Raw)
{
+ /*
+ private static ReadOnlySpan HairStyles =>
+ [
+ 0x602243E9930CA16A, //hi-top fade
+ 0x687687B775074243, //undercut pixie
+ 0x24B41B3ED9600552, //flyaway short cut
+ 0xDB129181F4248AE2, //slicked back
+ 0x80DF9648F4352C39, //simple short hair
+ 0x1E3D50B87ACACDA4, //half-up chignon
+ 0xFDC0716E8FA64F1E, //simple bob
+ 0x1457BCB559D4A5A4, //low chignon
+ 0x51A05031BE8DABCC, //asymmetrical bob
+ 0x85D18D31D168FE64, //ponytail
+ 0x4CC69633553865E4, //braids
+ 0xE75A2816E2B0B2B5, //long and wavy
+ 0x6C59B2A77D1231F7, //side ponytail
+ 0x21767F6261C9F4DD, //pigtails
+ ];
+
+ private static ReadOnlySpan EyeCuts =>
+ [
+ 0xF99D26ADCE42E2BE, //droopy
+ 0x22EF6E329FB657D1, //half-open
+ 0xC8CA8B6B8EE7CC38, //rounded
+ 0x93071833CC739399, //angled
+ ];
+ */
+
[TypeConverter(typeof(TypeConverterU64))] public ulong Base { get => ReadUInt64LittleEndian(Data); set => WriteUInt64LittleEndian(Data, value); }
[TypeConverter(typeof(TypeConverterU64))] public ulong Accessory { get => ReadUInt64LittleEndian(Data[0x08..]); set => WriteUInt64LittleEndian(Data[0x08..], value); }
[TypeConverter(typeof(TypeConverterU64))] public ulong Bag { get => ReadUInt64LittleEndian(Data[0x10..]); set => WriteUInt64LittleEndian(Data[0x10..], value); }
@@ -18,7 +46,7 @@ public sealed class PlayerFashion9a(SAV9ZA sav, SCBlock block) : SaveBlock ReadUInt64LittleEndian(Data[0x38..]); set => WriteUInt64LittleEndian(Data[0x38..], value); }
[TypeConverter(typeof(TypeConverterU64))] public ulong Legwear { get => ReadUInt64LittleEndian(Data[0x40..]); set => WriteUInt64LittleEndian(Data[0x40..], value); }
[TypeConverter(typeof(TypeConverterU64))] public ulong Clothing { get => ReadUInt64LittleEndian(Data[0x48..]); set => WriteUInt64LittleEndian(Data[0x48..], value); }
- [TypeConverter(typeof(TypeConverterU64))] public ulong Face { get => ReadUInt64LittleEndian(Data[0x50..]); set => WriteUInt64LittleEndian(Data[0x50..], value); }
+ [TypeConverter(typeof(TypeConverterU64))] public ulong Eyes { get => ReadUInt64LittleEndian(Data[0x50..]); set => WriteUInt64LittleEndian(Data[0x50..], value); }
[TypeConverter(typeof(TypeConverterU64))] public ulong LowerBody { get => ReadUInt64LittleEndian(Data[0x58..]); set => WriteUInt64LittleEndian(Data[0x58..], value); }
[TypeConverter(typeof(TypeConverterU64))] public ulong UpperBody { get => ReadUInt64LittleEndian(Data[0x60..]); set => WriteUInt64LittleEndian(Data[0x60..], value); }
}