diff --git a/Penumbra.GameData/Structs/CharacterArmor.cs b/Penumbra.GameData/Structs/CharacterArmor.cs index f8239c0e..eda75810 100644 --- a/Penumbra.GameData/Structs/CharacterArmor.cs +++ b/Penumbra.GameData/Structs/CharacterArmor.cs @@ -3,22 +3,24 @@ using System.Runtime.InteropServices; namespace Penumbra.GameData.Structs; -[StructLayout( LayoutKind.Explicit, Pack = 1 )] -public struct CharacterArmor : IEquatable< CharacterArmor > +[StructLayout(LayoutKind.Explicit, Pack = 1)] +public struct CharacterArmor : IEquatable { - [FieldOffset( 0 )] + public const int Size = 4; + + [FieldOffset(0)] public uint Value; - [FieldOffset( 0 )] + [FieldOffset(0)] public SetId Set; - [FieldOffset( 2 )] + [FieldOffset(2)] public byte Variant; - [FieldOffset( 3 )] + [FieldOffset(3)] public StainId Stain; - public CharacterArmor( SetId set, byte variant, StainId stain ) + public CharacterArmor(SetId set, byte variant, StainId stain) { Value = 0; Set = set; @@ -26,23 +28,32 @@ public struct CharacterArmor : IEquatable< CharacterArmor > Stain = stain; } + public CharacterArmor With(StainId stain) + => new(Set, Variant, stain); + + public CharacterWeapon ToWeapon() + => new(Set, 0, Variant, Stain); + + public CharacterWeapon ToWeapon(StainId stain) + => new(Set, 0, Variant, stain); + public override string ToString() => $"{Set},{Variant},{Stain}"; public static readonly CharacterArmor Empty; - public bool Equals( CharacterArmor other ) + public bool Equals(CharacterArmor other) => Value == other.Value; - public override bool Equals( object? obj ) - => obj is CharacterArmor other && Equals( other ); + public override bool Equals(object? obj) + => obj is CharacterArmor other && Equals(other); public override int GetHashCode() - => ( int )Value; + => (int)Value; - public static bool operator ==( CharacterArmor left, CharacterArmor right ) + public static bool operator ==(CharacterArmor left, CharacterArmor right) => left.Value == right.Value; - public static bool operator !=( CharacterArmor left, CharacterArmor right ) + public static bool operator !=(CharacterArmor left, CharacterArmor right) => left.Value != right.Value; -} \ No newline at end of file +} diff --git a/Penumbra.GameData/Structs/CharacterEquip.cs b/Penumbra.GameData/Structs/CharacterEquip.cs index dc8801d8..d045bd58 100644 --- a/Penumbra.GameData/Structs/CharacterEquip.cs +++ b/Penumbra.GameData/Structs/CharacterEquip.cs @@ -6,6 +6,9 @@ namespace Penumbra.GameData.Structs; public readonly unsafe struct CharacterEquip { + public const int Slots = 10; + public const int Size = CharacterArmor.Size * Slots; + public static readonly CharacterEquip Null = new(null); private readonly CharacterArmor* _armor; diff --git a/Penumbra.GameData/Structs/CharacterWeapon.cs b/Penumbra.GameData/Structs/CharacterWeapon.cs index b94e0b05..188a163d 100644 --- a/Penumbra.GameData/Structs/CharacterWeapon.cs +++ b/Penumbra.GameData/Structs/CharacterWeapon.cs @@ -40,6 +40,12 @@ public struct CharacterWeapon : IEquatable Stain = (StainId)(value >> 48); } + public CharacterArmor ToArmor() + => new(Set, (byte)Variant, Stain); + + public CharacterArmor ToArmor(StainId stain) + => new(Set, (byte)Variant, stain); + public static readonly CharacterWeapon Empty = new(0, 0, 0, 0); public bool Equals(CharacterWeapon other) diff --git a/Penumbra.GameData/Structs/StainId.cs b/Penumbra.GameData/Structs/StainId.cs index d97b5a94..6767a052 100644 --- a/Penumbra.GameData/Structs/StainId.cs +++ b/Penumbra.GameData/Structs/StainId.cs @@ -1,8 +1,9 @@ using System; +using System.Numerics; namespace Penumbra.GameData.Structs; -public readonly struct StainId : IEquatable< StainId > +public readonly struct StainId : IEquatable< StainId >, IEqualityOperators { public readonly byte Value; @@ -26,4 +27,10 @@ public readonly struct StainId : IEquatable< StainId > public override int GetHashCode() => Value.GetHashCode(); + + public static bool operator ==(StainId left, StainId right) + => left.Value == right.Value; + + public static bool operator !=(StainId left, StainId right) + => left.Value != right.Value; } \ No newline at end of file