Add ability to load blank japanese/korean save files

Detects the language of the currently loaded save file, and passes that info to the blank sav creator

Use a trainer name of "1337" instead of PKHeX for any Japanese save file, because Gen1/2(/3?) character tables don't have regular ascii chars.
This commit is contained in:
Kurt
2020-10-03 11:22:06 -07:00
parent 97f5f8d362
commit b242aed429
2 changed files with 30 additions and 15 deletions

View File

@@ -564,15 +564,26 @@ private static GameVersion GetIsG8SAV(byte[] data)
return sav;
}
/// <summary>
/// Returns a <see cref="LanguageID"/> that feels best for the save file's language.
/// </summary>
public static LanguageID GetSafeLanguage(SaveFile? sav) => sav switch
{
null => LanguageID.English,
ILangDeviantSave s => s.Japanese ? LanguageID.Japanese : s.Korean ? LanguageID.Korean : LanguageID.English,
_ => sav.Language <= Legal.GetMaxLanguageID(sav.Generation) ? (LanguageID)sav.Language : LanguageID.English,
};
/// <summary>
/// Creates an instance of a SaveFile with a blank base.
/// </summary>
/// <param name="game">Version to create the save file for.</param>
/// <param name="trainerName">Trainer Name</param>
/// <param name="language">Language to initialize with</param>
/// <returns>Blank save file from the requested game, null if no game exists for that <see cref="GameVersion"/>.</returns>
public static SaveFile GetBlankSAV(GameVersion game, string trainerName)
public static SaveFile GetBlankSAV(GameVersion game, string trainerName, LanguageID language = LanguageID.English)
{
var SAV = GetBlankSAV(game);
var SAV = GetBlankSAV(game, language);
SAV.Game = (int)game;
SAV.OT = trainerName;
@@ -587,7 +598,7 @@ public static SaveFile GetBlankSAV(GameVersion game, string trainerName)
SAV.TID = 12345;
SAV.SID = 54321;
}
SAV.Language = (int)LanguageID.English; // English
SAV.Language = (int)language;
// Only set geolocation data for 3DS titles
if (SAV is IRegionOrigin o)
@@ -600,8 +611,9 @@ public static SaveFile GetBlankSAV(GameVersion game, string trainerName)
/// Creates an instance of a SaveFile with a blank base.
/// </summary>
/// <param name="game">Version to create the save file for.</param>
/// <param name="language">Save file language to initialize for</param>
/// <returns>Blank save file from the requested game, null if no game exists for that <see cref="GameVersion"/>.</returns>
private static SaveFile GetBlankSAV(GameVersion game)
private static SaveFile GetBlankSAV(GameVersion game, LanguageID language)
{
switch (game)
{
@@ -611,23 +623,23 @@ private static SaveFile GetBlankSAV(GameVersion game)
case StadiumJ:
return new SAV1StadiumJ();
case Stadium:
return new SAV1Stadium();
return new SAV1Stadium(language == LanguageID.Japanese);
case GS: case GD: case SV:
return new SAV2(version: GS);
return new SAV2(version: GS, lang: language);
case GSC: case C:
return new SAV2(version: C);
return new SAV2(version: C, lang: language);
case Stadium2:
return new SAV2Stadium();
case R: case S: case E: case FR: case LG:
return new SAV3(version: game);
return new SAV3(version: game, language == LanguageID.Japanese);
case FRLG:
return new SAV3(version: FR);
return new SAV3(version: FR, language == LanguageID.Japanese);
case RS:
return new SAV3(version: R);
return new SAV3(version: R, language == LanguageID.Japanese);
case RSE:
return new SAV3(version: E);
return new SAV3(version: E, language == LanguageID.Japanese);
case CXD:
case COLO:
@@ -678,11 +690,12 @@ private static SaveFile GetBlankSAV(GameVersion game)
/// </summary>
/// <param name="generation">Generation of the Save File.</param>
/// <param name="trainerName">Trainer Name</param>
/// <param name="language">Save file language to initialize for</param>
/// <returns>Save File for that generation.</returns>
public static SaveFile GetBlankSAV(int generation, string trainerName)
public static SaveFile GetBlankSAV(int generation, string trainerName, LanguageID language = LanguageID.English)
{
var ver = GameUtil.GetVersion(generation);
return GetBlankSAV(ver, trainerName);
return GetBlankSAV(ver, trainerName, language);
}
/// <summary>

View File

@@ -219,9 +219,11 @@ private void FormLoadInitialFiles(string[] args)
private void LoadBlankSaveFile(GameVersion ver)
{
var sav = SaveUtil.GetBlankSAV(ver, "PKHeX");
var lang = SaveUtil.GetSafeLanguage(C_SAV?.SAV);
var tr = lang != LanguageID.Japanese ? "PKHeX" : "1337";
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), "PKHeX");
sav = SaveUtil.GetBlankSAV((GameVersion)GameInfo.VersionDataSource.Max(z => z.Value), tr, lang);
OpenSAV(sav, null);
C_SAV.SAV.Edited = false; // Prevents form close warning from showing until changes are made
}