Use PKHeX as blanksav language

Closes #3009

Make QRPK7 implement IEncounterable and remove hardcoded PKHeX strings
Let force hatching for WC3 eggs try to hatch from the savefile's language, then revert to english if failed to set an OT.
This commit is contained in:
Kurt 2020-10-04 08:59:33 -07:00
parent 8a7ed99689
commit d13b893351
5 changed files with 48 additions and 20 deletions

View file

@ -13,6 +13,7 @@ namespace PKHeX.Core
private static readonly string[] SuspiciousOTNames =
{
"PKHeX",
"",
};
public override void Verify(LegalityAnalysis data)

View file

@ -125,11 +125,17 @@ namespace PKHeX.Core
return pk;
}
private static void SetForceHatchDetails(PK3 pk, ITrainerInfo sav)
private void SetForceHatchDetails(PK3 pk, ITrainerInfo sav)
{
pk.Language = (int)GetSafeLanguageNotEgg((LanguageID)sav.Language);
pk.OT_Name = sav.OT;
// ugly workaround for character table interactions
pk.Language = (int)LanguageID.English;
pk.OT_Name = "PKHeX";
if (string.IsNullOrWhiteSpace(pk.OT_Name))
{
pk.Language = (int)LanguageID.English;
pk.OT_Name = "PKHeX";
}
pk.OT_Gender = sav.Gender;
pk.TID = sav.TID;
pk.SID = sav.SID;
@ -182,8 +188,13 @@ namespace PKHeX.Core
{
if (IsEgg)
return LanguageID.Japanese;
return GetSafeLanguageNotEgg(hatchLang);
}
private LanguageID GetSafeLanguageNotEgg(LanguageID hatchLang)
{
if (Language != -1)
return (LanguageID)Language;
return (LanguageID) Language;
if (hatchLang < LanguageID.Korean && hatchLang != LanguageID.Hacked)
return hatchLang;
return LanguageID.English; // fallback

View file

@ -2,9 +2,20 @@
namespace PKHeX.Core
{
public sealed class QRPK7
public sealed class QRPK7 : IEncounterable
{
public GameVersion Version => (GameVersion)CassetteVersion;
public int Form => AltForm;
public string Name => nameof(QRPK7);
public string LongName => Name;
public bool EggEncounter => false;
public int LevelMin => Level;
public int LevelMax => Level;
public int Generation => Version.GetGeneration();
private readonly byte[] Data;
public const int SIZE = 0x30;
public QRPK7(byte[] d) => Data = (byte[])d.Clone();
public uint EncryptionConstant => BitConverter.ToUInt32(Data, 0);
public int HT_Flags => Data[4];
@ -23,7 +34,7 @@ namespace PKHeX.Core
public int IV_SPA { get => (int)(IV32 >> 20) & 0x1F; set => IV32 = (uint)((IV32 & ~(0x1F << 20)) | (uint)((value > 31 ? 31 : value) << 20)); }
public int IV_SPD { get => (int)(IV32 >> 25) & 0x1F; set => IV32 = (uint)((IV32 & ~(0x1F << 25)) | (uint)((value > 31 ? 31 : value) << 25)); }
public uint PID => BitConverter.ToUInt32(Data, 0x10);
public ushort Species => BitConverter.ToUInt16(Data, 0x14);
public int Species => BitConverter.ToUInt16(Data, 0x14);
public ushort HeldItem => BitConverter.ToUInt16(Data, 0x16);
public ushort Move1 => BitConverter.ToUInt16(Data, 0x18);
public ushort Move2 => BitConverter.ToUInt16(Data, 0x1A);
@ -48,20 +59,15 @@ namespace PKHeX.Core
public int CassetteVersion => Data[0x2E];
public int Language => Data[0x2F];
public QRPK7(byte[] d)
{
if (d.Length != 0x30)
{
throw new ArgumentException("Invalid QRPK7 Data!");
}
Data = (byte[]) d.Clone();
}
/// <summary>
/// Converts the <see cref="Data"/> to a rough PKM.
/// </summary>
public PKM ConvertToPKM(ITrainerInfo sav) => ConvertToPKM(sav, EncounterCriteria.Unrestricted);
/// <summary>
/// Converts the <see cref="Data"/> to a rough PKM.
/// </summary>
/// <returns></returns>
public PKM ConvertToPKM()
public PKM ConvertToPKM(ITrainerInfo sav, EncounterCriteria criteria)
{
var pk = new PK7
{
@ -100,8 +106,8 @@ namespace PKHeX.Core
Ball = Ball,
Version = CassetteVersion,
OT_Name = "PKHeX",
HT_Name = "PKHeX",
OT_Name = sav.OT,
HT_Name = sav.OT,
CurrentLevel = Level,
Met_Level = Level,
MetDate = DateTime.Now,

View file

@ -574,6 +574,15 @@ namespace PKHeX.Core
_ => sav.Language <= Legal.GetMaxLanguageID(sav.Generation) ? (LanguageID)sav.Language : LanguageID.English,
};
/// <summary>
/// Returns a Trainer Name that feels best for the save file's language.
/// </summary>
public static string GetSafeTrainerName(SaveFile? sav, LanguageID lang) => lang switch
{
LanguageID.Japanese => sav?.Generation >= 3 ? "" : "1337",
_ => "PKHeX",
};
/// <summary>
/// Creates an instance of a SaveFile with a blank base.
/// </summary>

View file

@ -219,8 +219,9 @@ namespace PKHeX.WinForms
private void LoadBlankSaveFile(GameVersion ver)
{
var lang = SaveUtil.GetSafeLanguage(C_SAV?.SAV);
var tr = lang != LanguageID.Japanese ? "PKHeX" : "1337";
var current = C_SAV?.SAV;
var lang = SaveUtil.GetSafeLanguage(current);
var tr = SaveUtil.GetSafeTrainerName(current, lang);
var sav = SaveUtil.GetBlankSAV(ver, tr, lang);
if (sav.Version == GameVersion.Invalid) // will fail to load
sav = SaveUtil.GetBlankSAV((GameVersion)GameInfo.VersionDataSource.Max(z => z.Value), tr, lang);