mirror of
https://github.com/kwsch/PKHeX
synced 2024-12-01 16:29:22 +00:00
Minor clean
This commit is contained in:
parent
b5262d69b0
commit
ecef31f167
19 changed files with 78 additions and 71 deletions
|
@ -1,5 +1,4 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace PKHeX.Core;
|
namespace PKHeX.Core;
|
||||||
|
|
||||||
|
|
|
@ -47,23 +47,30 @@ public readonly record struct Moveset(ushort Move1, ushort Move2 = 0, ushort Mov
|
||||||
public string GetMovesetLine(IReadOnlyList<string> names, string split = " / ")
|
public string GetMovesetLine(IReadOnlyList<string> names, string split = " / ")
|
||||||
{
|
{
|
||||||
var sb = new StringBuilder(128);
|
var sb = new StringBuilder(128);
|
||||||
|
AddMovesetLine(sb, names, split);
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddMovesetLine(StringBuilder sb, IReadOnlyList<string> names, string split = " / ")
|
||||||
|
{
|
||||||
|
// Always has at least 1 move if calling this.
|
||||||
sb.Append(names[Move1]);
|
sb.Append(names[Move1]);
|
||||||
if (Move2 != 0)
|
if (Move2 == 0)
|
||||||
{
|
return;
|
||||||
sb.Append(split).Append(names[Move2]);
|
sb.Append(split).Append(names[Move2]);
|
||||||
if (Move3 != 0)
|
if (Move3 == 0)
|
||||||
{
|
return;
|
||||||
sb.Append(split).Append(names[Move3]);
|
sb.Append(split).Append(names[Move3]);
|
||||||
if (Move4 != 0)
|
if (Move4 != 0)
|
||||||
sb.Append(split).Append(names[Move4]);
|
sb.Append(split).Append(names[Move4]);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return sb.ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Flag each present index; having all moves will have all bitflags.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="span">Moves to check and index flags for</param>
|
||||||
public int BitOverlap(ReadOnlySpan<ushort> span)
|
public int BitOverlap(ReadOnlySpan<ushort> span)
|
||||||
{
|
{
|
||||||
// Flag each present index; having all moves will have all bitflags.
|
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
for (var i = 0; i < span.Length; i++)
|
for (var i = 0; i < span.Length; i++)
|
||||||
{
|
{
|
||||||
|
@ -74,9 +81,13 @@ public readonly record struct Moveset(ushort Move1, ushort Move2 = 0, ushort Mov
|
||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Flag each present index; having all moves will have all bitflags.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="moves">Base Move source</param>
|
||||||
|
/// <param name="span">Moves to check and index flags for</param>
|
||||||
public static int BitOverlap(ReadOnlySpan<ushort> moves, ReadOnlySpan<ushort> span)
|
public static int BitOverlap(ReadOnlySpan<ushort> moves, ReadOnlySpan<ushort> span)
|
||||||
{
|
{
|
||||||
// Flag each present index; having all moves will have all bitflags.
|
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
for (var i = 0; i < span.Length; i++)
|
for (var i = 0; i < span.Length; i++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
using static System.Buffers.Binary.BinaryPrimitives;
|
using static System.Buffers.Binary.BinaryPrimitives;
|
||||||
|
|
||||||
|
|
|
@ -94,7 +94,7 @@ public sealed class SK2 : GBPKM, ICaughtData2
|
||||||
public override string Nickname
|
public override string Nickname
|
||||||
{
|
{
|
||||||
get => StringConverter12.GetString(Nickname_Trash, Japanese);
|
get => StringConverter12.GetString(Nickname_Trash, Japanese);
|
||||||
set => StringConverter12.SetString(Nickname_Trash, value, 12, Japanese, StringConverterOption.None);
|
set => StringConverter12.SetString(Nickname_Trash, value, StringLength, Japanese, StringConverterOption.None);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string OT_Name
|
public override string OT_Name
|
||||||
|
@ -111,8 +111,8 @@ public sealed class SK2 : GBPKM, ICaughtData2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Span<byte> Nickname_Trash => Data.AsSpan(0x24, 12);
|
public override Span<byte> Nickname_Trash => Data.AsSpan(0x24, StringLength);
|
||||||
public override Span<byte> OT_Trash => Data.AsSpan(0x30, 12);
|
public override Span<byte> OT_Trash => Data.AsSpan(0x30, StringLength);
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
@ -183,18 +183,21 @@ public sealed class SK2 : GBPKM, ICaughtData2
|
||||||
|
|
||||||
private static bool IsJapanese(ReadOnlySpan<byte> data)
|
private static bool IsJapanese(ReadOnlySpan<byte> data)
|
||||||
{
|
{
|
||||||
if (!StringConverter12.GetIsG1Japanese(data.Slice(0x30, StringLength)))
|
const byte empty = 0;
|
||||||
|
const byte terminator = StringConverter12.G1TerminatorCode;
|
||||||
|
|
||||||
|
var ot = data.Slice(0x30, StringLength);
|
||||||
|
if (ot[6..].IndexOfAnyExcept(empty, terminator) != -1)
|
||||||
return false;
|
return false;
|
||||||
if (!StringConverter12.GetIsG1Japanese(data.Slice(0x24, StringLength)))
|
if (!StringConverter12.GetIsG1Japanese(ot))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
for (int i = 6; i < 0xC; i++)
|
var nick = data.Slice(0x24, StringLength);
|
||||||
{
|
if (nick[6..].IndexOfAnyExcept(empty, terminator) != -1)
|
||||||
if (data[0x30 + i] is not (0 or StringConverter12.G1TerminatorCode))
|
|
||||||
return false;
|
return false;
|
||||||
if (data[0x24 + i] is not (0 or StringConverter12.G1TerminatorCode))
|
if (!StringConverter12.GetIsG1Japanese(nick))
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -70,8 +70,7 @@ public static class EntityBlank
|
||||||
public static PKM GetBlank(int gen)
|
public static PKM GetBlank(int gen)
|
||||||
{
|
{
|
||||||
var type = Type.GetType($"PKHeX.Core.PK{gen}");
|
var type = Type.GetType($"PKHeX.Core.PK{gen}");
|
||||||
if (type is null)
|
ArgumentNullException.ThrowIfNull(type);
|
||||||
throw new InvalidCastException($"Unable to get the type for PK{gen}.");
|
|
||||||
|
|
||||||
return GetBlank(type);
|
return GetBlank(type);
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,7 +100,7 @@ public static class PokeCrypto
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Positions for unshuffling.
|
/// Positions for unshuffling.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private static ReadOnlySpan<byte> blockPositionInvert => new byte[]
|
private static ReadOnlySpan<byte> BlockPositionInvert => new byte[]
|
||||||
{
|
{
|
||||||
0, 1, 2, 4, 3, 5, 6, 7, 12, 18, 13, 19, 8, 10, 14, 20, 16, 22, 9, 11, 15, 21, 17, 23,
|
0, 1, 2, 4, 3, 5, 6, 7, 12, 18, 13, 19, 8, 10, 14, 20, 16, 22, 9, 11, 15, 21, 17, 23,
|
||||||
0, 1, 2, 4, 3, 5, 6, 7, // duplicates of 0-7 to eliminate modulus
|
0, 1, 2, 4, 3, 5, 6, 7, // duplicates of 0-7 to eliminate modulus
|
||||||
|
@ -183,7 +183,7 @@ public static class PokeCrypto
|
||||||
uint pv = ReadUInt32LittleEndian(pk);
|
uint pv = ReadUInt32LittleEndian(pk);
|
||||||
uint sv = (pv >> 13) & 31;
|
uint sv = (pv >> 13) & 31;
|
||||||
|
|
||||||
byte[] ekm = ShuffleArray(pk, blockPositionInvert[(int)sv], SIZE_8BLOCK);
|
byte[] ekm = ShuffleArray(pk, BlockPositionInvert[(int)sv], SIZE_8BLOCK);
|
||||||
CryptPKM(ekm, pv, SIZE_8BLOCK);
|
CryptPKM(ekm, pv, SIZE_8BLOCK);
|
||||||
return ekm;
|
return ekm;
|
||||||
}
|
}
|
||||||
|
@ -197,7 +197,7 @@ public static class PokeCrypto
|
||||||
uint pv = ReadUInt32LittleEndian(pk);
|
uint pv = ReadUInt32LittleEndian(pk);
|
||||||
uint sv = (pv >> 13) & 31;
|
uint sv = (pv >> 13) & 31;
|
||||||
|
|
||||||
byte[] ekm = ShuffleArray(pk, blockPositionInvert[(int)sv], SIZE_8ABLOCK);
|
byte[] ekm = ShuffleArray(pk, BlockPositionInvert[(int)sv], SIZE_8ABLOCK);
|
||||||
CryptPKM(ekm, pv, SIZE_8ABLOCK);
|
CryptPKM(ekm, pv, SIZE_8ABLOCK);
|
||||||
return ekm;
|
return ekm;
|
||||||
}
|
}
|
||||||
|
@ -211,7 +211,7 @@ public static class PokeCrypto
|
||||||
uint pv = ReadUInt32LittleEndian(pk);
|
uint pv = ReadUInt32LittleEndian(pk);
|
||||||
uint sv = (pv >> 13) & 31;
|
uint sv = (pv >> 13) & 31;
|
||||||
|
|
||||||
byte[] ekm = ShuffleArray(pk, blockPositionInvert[(int)sv], SIZE_9BLOCK);
|
byte[] ekm = ShuffleArray(pk, BlockPositionInvert[(int)sv], SIZE_9BLOCK);
|
||||||
CryptPKM(ekm, pv, SIZE_9BLOCK);
|
CryptPKM(ekm, pv, SIZE_9BLOCK);
|
||||||
return ekm;
|
return ekm;
|
||||||
}
|
}
|
||||||
|
@ -240,7 +240,7 @@ public static class PokeCrypto
|
||||||
uint pv = ReadUInt32LittleEndian(pk);
|
uint pv = ReadUInt32LittleEndian(pk);
|
||||||
uint sv = (pv >> 13) & 31;
|
uint sv = (pv >> 13) & 31;
|
||||||
|
|
||||||
byte[] ekm = ShuffleArray(pk, blockPositionInvert[(int)sv], SIZE_6BLOCK);
|
byte[] ekm = ShuffleArray(pk, BlockPositionInvert[(int)sv], SIZE_6BLOCK);
|
||||||
CryptPKM(ekm, pv, SIZE_6BLOCK);
|
CryptPKM(ekm, pv, SIZE_6BLOCK);
|
||||||
return ekm;
|
return ekm;
|
||||||
}
|
}
|
||||||
|
@ -271,7 +271,7 @@ public static class PokeCrypto
|
||||||
uint chk = ReadUInt16LittleEndian(pk[6..]);
|
uint chk = ReadUInt16LittleEndian(pk[6..]);
|
||||||
uint sv = (pv >> 13) & 31;
|
uint sv = (pv >> 13) & 31;
|
||||||
|
|
||||||
byte[] ekm = ShuffleArray(pk, blockPositionInvert[(int)sv], SIZE_4BLOCK);
|
byte[] ekm = ShuffleArray(pk, BlockPositionInvert[(int)sv], SIZE_4BLOCK);
|
||||||
CryptPKM45(ekm, pv, chk, SIZE_4BLOCK);
|
CryptPKM45(ekm, pv, chk, SIZE_4BLOCK);
|
||||||
return ekm;
|
return ekm;
|
||||||
}
|
}
|
||||||
|
@ -297,7 +297,7 @@ public static class PokeCrypto
|
||||||
{
|
{
|
||||||
uint pv = ReadUInt32BigEndian(pk);
|
uint pv = ReadUInt32BigEndian(pk);
|
||||||
uint sv = (pv >> 13) & 31;
|
uint sv = (pv >> 13) & 31;
|
||||||
return ShuffleArray(pk, blockPositionInvert[(int)sv], SIZE_4BLOCK);
|
return ShuffleArray(pk, BlockPositionInvert[(int)sv], SIZE_4BLOCK);
|
||||||
}
|
}
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
|
@ -392,7 +392,7 @@ public static class PokeCrypto
|
||||||
uint OID = ReadUInt32LittleEndian(pk[4..]);
|
uint OID = ReadUInt32LittleEndian(pk[4..]);
|
||||||
uint seed = PID ^ OID;
|
uint seed = PID ^ OID;
|
||||||
|
|
||||||
byte[] ekm = ShuffleArray3(pk, blockPositionInvert[(int)(PID % 24)]);
|
byte[] ekm = ShuffleArray3(pk, BlockPositionInvert[(int)(PID % 24)]);
|
||||||
|
|
||||||
var toEncrypt = ekm.AsSpan()[SIZE_3HEADER..SIZE_3STORED];
|
var toEncrypt = ekm.AsSpan()[SIZE_3HEADER..SIZE_3STORED];
|
||||||
for (int i = 0; i < toEncrypt.Length; i += 4)
|
for (int i = 0; i < toEncrypt.Length; i += 4)
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using static System.Buffers.Binary.BinaryPrimitives;
|
using static System.Buffers.Binary.BinaryPrimitives;
|
||||||
|
|
||||||
namespace PKHeX.Core;
|
namespace PKHeX.Core;
|
||||||
|
|
|
@ -46,5 +46,5 @@ public enum RanchToyType : byte
|
||||||
Twirler = 36,
|
Twirler = 36,
|
||||||
Bound_Mat = 37,
|
Bound_Mat = 37,
|
||||||
Tree = 38,
|
Tree = 38,
|
||||||
Water = 39 // Normally unused; creates a massive plane of water in the sky
|
Water = 39, // Normally unused; creates a massive plane of water in the sky
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,8 +7,8 @@ namespace PKHeX.Core;
|
||||||
/// Stores the <see cref="Timestamp"/> to indicate the seconds since 1900 (rounded to days) that an event occurred.
|
/// Stores the <see cref="Timestamp"/> to indicate the seconds since 1900 (rounded to days) that an event occurred.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[TypeConverter(typeof(ExpandableObjectConverter))]
|
[TypeConverter(typeof(ExpandableObjectConverter))]
|
||||||
public sealed class Epoch1900Value {
|
public sealed class Epoch1900Value
|
||||||
|
{
|
||||||
// Data should be 4 bytes where we only care about the first 3 bytes i.e. 24 bits
|
// Data should be 4 bytes where we only care about the first 3 bytes i.e. 24 bits
|
||||||
// First 6 bits are day, next 6 bits are 0 indexed month, last 12 bits are year from 1900
|
// First 6 bits are day, next 6 bits are 0 indexed month, last 12 bits are year from 1900
|
||||||
private readonly Memory<byte> Data;
|
private readonly Memory<byte> Data;
|
||||||
|
@ -19,14 +19,13 @@ public sealed class Epoch1900Value {
|
||||||
|
|
||||||
private static DateTime Epoch => new(1900, 1, 1);
|
private static DateTime Epoch => new(1900, 1, 1);
|
||||||
|
|
||||||
public DateTime Timestamp {
|
public DateTime Timestamp
|
||||||
get {
|
{
|
||||||
return Epoch
|
get => Epoch
|
||||||
.AddDays(Span[2] >> 2)
|
.AddDays(Span[2] >> 2)
|
||||||
.AddDays(-1)
|
.AddDays(-1)
|
||||||
.AddMonths(((Span[2] & 0b0000_0011) << 2) | ((Span[1] & 0b1111_0000) >> 4))
|
.AddMonths(((Span[2] & 0b0000_0011) << 2) | ((Span[1] & 0b1111_0000) >> 4))
|
||||||
.AddYears(((Span[1] & 0b0000_1111) << 4) | Span[0]);
|
.AddYears(((Span[1] & 0b0000_1111) << 4) | Span[0]);
|
||||||
}
|
|
||||||
set {
|
set {
|
||||||
int day = value.Day;
|
int day = value.Day;
|
||||||
int month = value.Month - Epoch.Month;
|
int month = value.Month - Epoch.Month;
|
||||||
|
@ -42,7 +41,8 @@ public sealed class Epoch1900Value {
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// time_t (seconds since 1900 Epoch rounded to days)
|
/// time_t (seconds since 1900 Epoch rounded to days)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public ulong Seconds {
|
public ulong Seconds
|
||||||
|
{
|
||||||
get => (ulong)(Timestamp - Epoch).TotalSeconds;
|
get => (ulong)(Timestamp - Epoch).TotalSeconds;
|
||||||
set => Timestamp = Epoch.AddSeconds(value);
|
set => Timestamp = Epoch.AddSeconds(value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -357,9 +357,8 @@ public sealed class Zukan4 : ZukanBase<SAV4>
|
||||||
int dpl = 1 + DPLangSpecies.IndexOf(species);
|
int dpl = 1 + DPLangSpecies.IndexOf(species);
|
||||||
if (DP && dpl <= 0)
|
if (DP && dpl <= 0)
|
||||||
return false;
|
return false;
|
||||||
const int FormOffset1 = OFS_FORM1;
|
|
||||||
int PokeDexLanguageFlags = FormOffset1 + (HGSS ? 0x3C : 0x20);
|
|
||||||
|
|
||||||
|
int PokeDexLanguageFlags = OFS_FORM1 + (HGSS ? 0x3C : 0x20);
|
||||||
var ofs = PokeDexLanguageFlags + (DP ? dpl : species);
|
var ofs = PokeDexLanguageFlags + (DP ? dpl : species);
|
||||||
return FlagUtil.GetFlag(Data, ofs, lang & 7);
|
return FlagUtil.GetFlag(Data, ofs, lang & 7);
|
||||||
}
|
}
|
||||||
|
@ -369,9 +368,8 @@ public sealed class Zukan4 : ZukanBase<SAV4>
|
||||||
int dpl = 1 + DPLangSpecies.IndexOf(species);
|
int dpl = 1 + DPLangSpecies.IndexOf(species);
|
||||||
if (DP && dpl <= 0)
|
if (DP && dpl <= 0)
|
||||||
return;
|
return;
|
||||||
const int FormOffset1 = OFS_FORM1;
|
|
||||||
int PokeDexLanguageFlags = FormOffset1 + (HGSS ? 0x3C : 0x20);
|
|
||||||
|
|
||||||
|
int PokeDexLanguageFlags = OFS_FORM1 + (HGSS ? 0x3C : 0x20);
|
||||||
var ofs = PokeDexLanguageFlags + (DP ? dpl : species);
|
var ofs = PokeDexLanguageFlags + (DP ? dpl : species);
|
||||||
FlagUtil.SetFlag(Data, ofs, lang & 7, value);
|
FlagUtil.SetFlag(Data, ofs, lang & 7, value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,7 @@ public static partial class Util
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<ComboItem> GetCBList(IReadOnlyList<string> inStrings, ReadOnlySpan<ushort> allowed)
|
public static List<ComboItem> GetCBList(ReadOnlySpan<string> inStrings, ReadOnlySpan<ushort> allowed)
|
||||||
{
|
{
|
||||||
var list = new List<ComboItem>(allowed.Length + 1) { new(inStrings[0], 0) };
|
var list = new List<ComboItem>(allowed.Length + 1) { new(inStrings[0], 0) };
|
||||||
foreach (var index in allowed)
|
foreach (var index in allowed)
|
||||||
|
@ -48,14 +48,14 @@ public static partial class Util
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<ComboItem> GetCBList(IReadOnlyList<string> inStrings, int index, int offset = 0)
|
public static List<ComboItem> GetCBList(ReadOnlySpan<string> inStrings, int index, int offset = 0)
|
||||||
{
|
{
|
||||||
var list = new List<ComboItem>();
|
var list = new List<ComboItem>();
|
||||||
AddCBWithOffset(list, inStrings, offset, index);
|
AddCBWithOffset(list, inStrings, offset, index);
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ComboItem[] GetUnsortedCBList(IReadOnlyList<string> inStrings, ReadOnlySpan<byte> allowed)
|
public static ComboItem[] GetUnsortedCBList(ReadOnlySpan<string> inStrings, ReadOnlySpan<byte> allowed)
|
||||||
{
|
{
|
||||||
var count = allowed.Length;
|
var count = allowed.Length;
|
||||||
var list = new ComboItem[count];
|
var list = new ComboItem[count];
|
||||||
|
@ -69,13 +69,13 @@ public static partial class Util
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void AddCBWithOffset(List<ComboItem> list, IReadOnlyList<string> inStrings, int offset, int index)
|
public static void AddCBWithOffset(List<ComboItem> list, ReadOnlySpan<string> inStrings, int offset, int index)
|
||||||
{
|
{
|
||||||
var item = new ComboItem(inStrings[index - offset], index);
|
var item = new ComboItem(inStrings[index - offset], index);
|
||||||
list.Add(item);
|
list.Add(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void AddCBWithOffset(List<ComboItem> cbList, IReadOnlyList<string> inStrings, int offset, ReadOnlySpan<byte> allowed)
|
public static void AddCBWithOffset(List<ComboItem> cbList, ReadOnlySpan<string> inStrings, int offset, ReadOnlySpan<byte> allowed)
|
||||||
{
|
{
|
||||||
int beginCount = cbList.Count;
|
int beginCount = cbList.Count;
|
||||||
cbList.Capacity += allowed.Length;
|
cbList.Capacity += allowed.Length;
|
||||||
|
@ -87,7 +87,7 @@ public static partial class Util
|
||||||
cbList.Sort(beginCount, allowed.Length, Comparer);
|
cbList.Sort(beginCount, allowed.Length, Comparer);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void AddCBWithOffset(List<ComboItem> cbList, IReadOnlyList<string> inStrings, int offset, ReadOnlySpan<ushort> allowed)
|
public static void AddCBWithOffset(List<ComboItem> cbList, ReadOnlySpan<string> inStrings, int offset, ReadOnlySpan<ushort> allowed)
|
||||||
{
|
{
|
||||||
int beginCount = cbList.Count;
|
int beginCount = cbList.Count;
|
||||||
cbList.Capacity += allowed.Length;
|
cbList.Capacity += allowed.Length;
|
||||||
|
|
|
@ -235,8 +235,7 @@ public partial class RibbonEditor : Form
|
||||||
rib.HasRibbon = chk.Checked;
|
rib.HasRibbon = chk.Checked;
|
||||||
var controlName = PrefixPB + rib.Name;
|
var controlName = PrefixPB + rib.Name;
|
||||||
var control = FLP_Ribbons.Controls[controlName];
|
var control = FLP_Ribbons.Controls[controlName];
|
||||||
if (control is null)
|
ArgumentNullException.ThrowIfNull(control);
|
||||||
throw new ArgumentException($"{controlName} not found in {FLP_Ribbons.Name}.");
|
|
||||||
control.Visible = rib.HasRibbon;
|
control.Visible = rib.HasRibbon;
|
||||||
|
|
||||||
ToggleNewRibbon(rib, control);
|
ToggleNewRibbon(rib, control);
|
||||||
|
|
|
@ -296,17 +296,17 @@ public partial class SAV_SimpleTrainer : Form
|
||||||
if (sender is ComboBox c)
|
if (sender is ComboBox c)
|
||||||
{
|
{
|
||||||
int index = WinFormsUtil.GetIndex(c);
|
int index = WinFormsUtil.GetIndex(c);
|
||||||
if (SAV is SAV4 sav4)
|
if (SAV is SAV4)
|
||||||
{
|
{
|
||||||
Main.SetCountrySubRegion(CB_Region, $"gen4_sr_{index:000}");
|
Main.SetCountrySubRegion(CB_Region, $"gen4_sr_{index:000}");
|
||||||
if (CB_Region.Items.Count == 0)
|
if (CB_Region.Items.Count == 0)
|
||||||
Main.SetCountrySubRegion(CB_Region, $"gen4_sr_default");
|
Main.SetCountrySubRegion(CB_Region, "gen4_sr_default");
|
||||||
}
|
}
|
||||||
else if (SAV is SAV5 s)
|
else if (SAV is SAV5)
|
||||||
{
|
{
|
||||||
Main.SetCountrySubRegion(CB_Region, $"gen5_sr_{index:000}");
|
Main.SetCountrySubRegion(CB_Region, $"gen5_sr_{index:000}");
|
||||||
if (CB_Region.Items.Count == 0)
|
if (CB_Region.Items.Count == 0)
|
||||||
Main.SetCountrySubRegion(CB_Region, $"gen5_sr_default");
|
Main.SetCountrySubRegion(CB_Region, "gen5_sr_default");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,9 +59,9 @@ public class StatTest
|
||||||
|
|
||||||
ushort effort = 63001;
|
ushort effort = 63001;
|
||||||
effort = (ushort)(Math.Min((ushort)255, (ushort)Math.Ceiling(Math.Sqrt(effort))) >> 2);
|
effort = (ushort)(Math.Min((ushort)255, (ushort)Math.Ceiling(Math.Sqrt(effort))) >> 2);
|
||||||
var iv = 15;
|
const int iv = 15;
|
||||||
var level = 100;
|
const int level = 100;
|
||||||
var baseStat = 91;
|
const int baseStat = 91;
|
||||||
var expect = (ushort)((((2 * (baseStat + iv)) + effort) * level / 100) + 5);
|
var expect = (ushort)((((2 * (baseStat + iv)) + effort) * level / 100) + 5);
|
||||||
expect.Should().Be(279);
|
expect.Should().Be(279);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue