Misc tweaks

This commit is contained in:
Kurt 2024-05-18 00:40:29 -05:00
parent 899ee63434
commit 3811f8d114
13 changed files with 39 additions and 21 deletions

View file

@ -38,7 +38,8 @@ public static class QRMessageUtil
{ {
if (pk is PK7 pk7) if (pk is PK7 pk7)
{ {
byte[] payload = QR7.GenerateQRData(pk7); Span<byte> payload = stackalloc byte[QR7.SIZE];
QR7.SetQRData(pk7, payload);
return GetMessage(payload); return GetMessage(payload);
} }

View file

@ -75,7 +75,7 @@ public sealed record EncounterStatic8U : EncounterStatic8Nest<EncounterStatic8U>
return StringConverter8.GetTrashState(pk.OriginalTrainerTrash, name); return StringConverter8.GetTrashState(pk.OriginalTrainerTrash, name);
} }
private static ReadOnlySpan<char> GetScientistName(int language) => language switch public static ReadOnlySpan<char> GetScientistName(int language) => language switch
{ {
(int)LanguageID.Japanese => "けんきゅういん", (int)LanguageID.Japanese => "けんきゅういん",
(int)LanguageID.English => "Scientist", (int)LanguageID.English => "Scientist",

View file

@ -53,7 +53,8 @@ public ref struct XorShift128
public readonly (uint x, uint y, uint z, uint w) GetState32() => (x, y, z, w); public readonly (uint x, uint y, uint z, uint w) GetState32() => (x, y, z, w);
public readonly (ulong s0, ulong s1) GetState64() => (s0, s1); public readonly (ulong s0, ulong s1) GetState64() => (s0, s1);
public readonly string FullState => $"{State:X32}"; public readonly UInt128 FullState() => State;
public readonly bool Equals(ulong state0, ulong state1) => s0 == state0 && s1 == state1;
/// <summary> /// <summary>
/// Gets the next random <see cref="ulong"/>. /// Gets the next random <see cref="ulong"/>.

View file

@ -1,6 +1,7 @@
using System; using System;
using System.Numerics; using System.Numerics;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
namespace PKHeX.Core; namespace PKHeX.Core;
@ -8,17 +9,21 @@ namespace PKHeX.Core;
/// Self-modifying RNG structure that implements xoroshiro128+ /// Self-modifying RNG structure that implements xoroshiro128+
/// </summary> /// </summary>
/// <remarks>https://en.wikipedia.org/wiki/Xoroshiro128%2B</remarks> /// <remarks>https://en.wikipedia.org/wiki/Xoroshiro128%2B</remarks>
[StructLayout(LayoutKind.Explicit)]
public ref struct Xoroshiro128Plus public ref struct Xoroshiro128Plus
{ {
public const ulong XOROSHIRO_CONST0= 0x0F4B17A579F18960; public const ulong XOROSHIRO_CONST0= 0x0F4B17A579F18960;
public const ulong XOROSHIRO_CONST = 0x82A2B175229D6A5B; public const ulong XOROSHIRO_CONST = 0x82A2B175229D6A5B;
private ulong s0; [FieldOffset(0x0)] private ulong s0;
private ulong s1; [FieldOffset(0x8)] private ulong s1;
[FieldOffset(0x0)] public readonly UInt128 State;
public Xoroshiro128Plus(ulong s0 = XOROSHIRO_CONST0, ulong s1 = XOROSHIRO_CONST) => (this.s0, this.s1) = (s0, s1); public Xoroshiro128Plus(ulong s0 = XOROSHIRO_CONST0, ulong s1 = XOROSHIRO_CONST) => (this.s0, this.s1) = (s0, s1);
public Xoroshiro128Plus(UInt128 state) => State = state;
public readonly (ulong s0, ulong s1) GetState() => (s0, s1); public readonly (ulong s0, ulong s1) GetState() => (s0, s1);
public readonly UInt128 FullState() => new(s1, s0); public readonly UInt128 FullState() => new(s1, s0);
public readonly bool Equals(ulong state0, ulong state1) => s0 == state0 && s1 == state1;
/// <summary> /// <summary>
/// Gets the next random <see cref="ulong"/>. /// Gets the next random <see cref="ulong"/>.

View file

@ -1,6 +1,7 @@
using System; using System;
using System.Numerics; using System.Numerics;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
namespace PKHeX.Core; namespace PKHeX.Core;
@ -10,14 +11,17 @@ namespace PKHeX.Core;
/// <remarks>https://en.wikipedia.org/wiki/Xoroshiro128%2B</remarks> /// <remarks>https://en.wikipedia.org/wiki/Xoroshiro128%2B</remarks>
/// <seealso cref="Xoroshiro128Plus"/> /// <seealso cref="Xoroshiro128Plus"/>
/// <remarks>Used by the Brilliant Diamond &amp; Shining Pearl games; differs in how values are yielded by Next calls.</remarks> /// <remarks>Used by the Brilliant Diamond &amp; Shining Pearl games; differs in how values are yielded by Next calls.</remarks>
[StructLayout(LayoutKind.Explicit)]
public ref struct Xoroshiro128Plus8b public ref struct Xoroshiro128Plus8b
{ {
private ulong s0; [FieldOffset(0x0)] private ulong s0;
private ulong s1; [FieldOffset(0x8)] private ulong s1;
[FieldOffset(0x0)] public readonly UInt128 State;
public Xoroshiro128Plus8b(ulong s0, ulong s1) => (this.s0, this.s1) = (s0, s1); public Xoroshiro128Plus8b(ulong s0, ulong s1) => (this.s0, this.s1) = (s0, s1);
public Xoroshiro128Plus8b(UInt128 state) => State = state;
public readonly (ulong s0, ulong s1) GetState() => (s0, s1); public readonly (ulong s0, ulong s1) GetState() => (s0, s1);
public readonly UInt128 FullState() => new(s1, s0); public readonly bool Equals(ulong state0, ulong state1) => s0 == state0 && s1 == state1;
public Xoroshiro128Plus8b(ulong seed) public Xoroshiro128Plus8b(ulong seed)
{ {

View file

@ -158,4 +158,9 @@ public enum CheckIdentifier : byte
/// The <see cref="CheckResult"/> pertains to the <see cref="PKM"/> <see cref="IAwakened"/> values. /// The <see cref="CheckResult"/> pertains to the <see cref="PKM"/> <see cref="IAwakened"/> values.
/// </summary> /// </summary>
AVs, AVs,
/// <summary>
/// The <see cref="CheckResult"/> pertains to string <see cref="TrashBytes"/>.
/// </summary>
TrashBytes,
} }

View file

@ -140,10 +140,12 @@ public sealed class SAV3E : SAV3, IGen3Hoenn, IGen3Joyful, IGen3Wonder, IDaycare
]; ];
} }
private Span<byte> PokeBlockData => Large.AsSpan(0x848, PokeBlock3Case.SIZE);
public PokeBlock3Case PokeBlocks public PokeBlock3Case PokeBlocks
{ {
get => new(Large, 0x848); get => new(PokeBlockData);
set => SetData(Large.AsSpan(0x848), value.Write()); set => value.Write(PokeBlockData);
} }
protected override int SeenOffset2 => 0x988; protected override int SeenOffset2 => 0x988;

View file

@ -99,10 +99,12 @@ public sealed class SAV3RS : SAV3, IGen3Hoenn, IDaycareRandomState<ushort>
]; ];
} }
private Span<byte> PokeBlockData => Large.AsSpan(0x7F8, PokeBlock3Case.SIZE);
public PokeBlock3Case PokeBlocks public PokeBlock3Case PokeBlocks
{ {
get => new(Large, 0x7F8); get => new(PokeBlockData);
set => SetData(Large.AsSpan(0x7F8), value.Write()); set => value.Write(PokeBlockData);
} }
protected override int SeenOffset2 => 0x938; protected override int SeenOffset2 => 0x938;

View file

@ -3,7 +3,6 @@ using System.Runtime.InteropServices;
namespace PKHeX.Core; namespace PKHeX.Core;
[StructLayout(LayoutKind.Sequential)]
public readonly ref struct DecorationInventory3 public readonly ref struct DecorationInventory3
{ {
public const int SIZE = 150; public const int SIZE = 150;

View file

@ -5,18 +5,19 @@ namespace PKHeX.Core;
public sealed class PokeBlock3Case public sealed class PokeBlock3Case
{ {
private const int Count = 40; private const int Count = 40;
public const int SIZE = Count * PokeBlock3.SIZE;
public readonly PokeBlock3[] Blocks; public readonly PokeBlock3[] Blocks;
public PokeBlock3Case(ReadOnlySpan<byte> data, int offset) public PokeBlock3Case(ReadOnlySpan<byte> data)
{ {
Blocks = new PokeBlock3[Count]; Blocks = new PokeBlock3[Count];
for (int i = 0; i < Blocks.Length; i++) for (int i = 0; i < Blocks.Length; i++)
Blocks[i] = PokeBlock3.GetBlock(data, offset + (i * PokeBlock3.SIZE)); Blocks[i] = PokeBlock3.GetBlock(data, (i * PokeBlock3.SIZE));
} }
public byte[] Write() public byte[] Write()
{ {
byte[] result = new byte[Count*PokeBlock3.SIZE]; byte[] result = new byte[SIZE];
Write(result); Write(result);
return result; return result;
} }

View file

@ -1,12 +1,10 @@
using System; using System;
using System.Runtime.InteropServices;
using static PKHeX.Core.Move; using static PKHeX.Core.Move;
using static PKHeX.Core.Species; using static PKHeX.Core.Species;
using static System.Buffers.Binary.BinaryPrimitives; using static System.Buffers.Binary.BinaryPrimitives;
namespace PKHeX.Core; namespace PKHeX.Core;
[StructLayout(LayoutKind.Sequential, Pack = 4, Size = SIZE)]
public sealed class Swarm3(byte[] Data) public sealed class Swarm3(byte[] Data)
{ {
public const int SIZE = 0x14; public const int SIZE = 0x14;

View file

@ -28,7 +28,7 @@ public static class Xoroshiro128Tests
for (int i = 0; i < loop; i++) for (int i = 0; i < loop; i++)
{ {
_ = rand.Prev(); _ = rand.Prev();
if (rand.GetState() == (s0, s1)) if (rand.Equals(s0, s1))
return i; return i;
} }
return -1; return -1;

View file

@ -27,7 +27,7 @@ public static class Xoroshiro128bTests
for (int i = 0; i < loop; i++) for (int i = 0; i < loop; i++)
{ {
_ = rand.Prev(); _ = rand.Prev();
if (rand.GetState() == (s0, s1)) if (rand.Equals(s0, s1))
return i; return i;
} }
return -1; return -1;
@ -39,7 +39,7 @@ public static class Xoroshiro128bTests
for (int i = 0; i < loop; i++) for (int i = 0; i < loop; i++)
{ {
_ = rand.Next(); _ = rand.Next();
if (rand.GetState() == (n0, n1)) if (rand.Equals(n0, n1))
return i; return i;
} }
return -1; return -1;