Add showdownset localization for slot previews

Localization only for game strings (not Ability/Nature/Stat/etc labels)
feels kinda goofy but it works
This commit is contained in:
Kurt 2018-07-13 19:13:25 -07:00
parent 83e61923f7
commit 5d20c79568
4 changed files with 58 additions and 64 deletions

View file

@ -10,22 +10,16 @@ namespace PKHeX.Core
public class ShowdownSet
{
// String to Values
private static readonly string[] StatNames = { "HP", "Atk", "Def", "SpA", "SpD", "Spe" };
private static readonly string[] genders = {"M", "F", ""};
private static readonly string[] genderForms = {"", "F", ""};
private static readonly string[] StatNames = { "HP", "Atk", "Def", "SpA", "SpD", "Spe" };
private static int MAX_SPECIES => PKX.Personal.MaxSpeciesID;
private const string Language = "en";
private const int LanguageID = 2;
private static readonly string[] types = Util.GetTypesList(Language);
private static readonly string[] forms = Util.GetFormsList(Language);
private static readonly string[] species = Util.GetSpeciesList(Language);
private static readonly string[] items = Util.GetItemsList(Language);
private static readonly string[] g2items = Util.GetStringList("ItemsG2", Language);
private static readonly string[] g3items = Util.GetStringList("ItemsG3", Language);
private static readonly string[] natures = Util.GetNaturesList(Language);
private static readonly string[] moves = Util.GetMovesList(Language);
private static readonly string[] abilities = Util.GetAbilitiesList(Language);
private static readonly string[] hptypes = types.Skip(1).ToArray();
private static int MAX_SPECIES => species.Length-1;
private const int DefaultLanguageID = 2;
private static readonly GameStrings DefaultStrings = GameInfo.GetStrings(Language);
private GameStrings Strings { get; set; } = DefaultStrings;
private int LanguageID { get; set; } = DefaultLanguageID;
// Default Set Data
public string Nickname { get; set; }
@ -75,7 +69,7 @@ namespace PKHeX.Core
// Showdown Quirks
Form = ConvertFormFromShowdown(Form, Species, Ability);
// Set Form
string[] formStrings = PKX.GetFormList(Species, types, forms, genderForms);
string[] formStrings = PKX.GetFormList(Species, Strings.Types, Strings.forms, genderForms);
FormIndex = string.IsNullOrWhiteSpace(Form) ? 0 : Math.Max(0, Array.FindIndex(formStrings, z => z.Contains(Form)));
}
private void ParseLines(IEnumerable<string> lines)
@ -92,7 +86,7 @@ namespace PKHeX.Core
if (line.StartsWith("-"))
{
string moveString = ParseLineMove(line);
int move = Array.IndexOf(moves, moveString);
int move = Array.IndexOf(Strings.movelist, moveString);
if (move < 0)
InvalidLines.Add($"Unknown Move: {moveString}");
else
@ -116,9 +110,9 @@ namespace PKHeX.Core
{
switch (first)
{
case "Trait": case "Ability": return (Ability = Array.IndexOf(abilities, second)) >= 0;
case "Trait": case "Ability": return (Ability = Array.IndexOf(Strings.abilitylist, second)) >= 0;
case "Shiny": return Shiny = second.Trim() == "Yes";
case "Nature": return (Nature = Array.IndexOf(natures, second)) >= 0;
case "Nature": return (Nature = Array.IndexOf(Strings.natures, second)) >= 0;
case "EV": case "EVs": ParseLineEVs(second); return true;
case "IV": case "IVs": ParseLineIVs(second); return true;
case "Level":
@ -140,7 +134,7 @@ namespace PKHeX.Core
if (first.EndsWith("Nature")) // XXX Nature
{
string naturestr = first.Split(' ')[0].Trim();
return (Nature = Array.IndexOf(natures, naturestr)) >= 0;
return (Nature = Array.IndexOf(Strings.natures, naturestr)) >= 0;
}
return false;
}
@ -148,11 +142,16 @@ namespace PKHeX.Core
}
public string Text => GetText();
private string GetText()
public string LocalizedText(string lang) => LocalizedText(GameInfo.Language(lang));
public string LocalizedText(int lang) => GetText(GameInfo.GetStrings(LanguageID = lang));
private string GetText(GameStrings strings = null)
{
if (Species <= 0 || Species > MAX_SPECIES)
return string.Empty;
if (strings != null)
Strings = strings;
var result = new List<string>();
// First Line: Name, Nickname, Gender, Item
@ -168,15 +167,15 @@ namespace PKHeX.Core
result.Add($"EVs: {string.Join(" / ", evstr)}");
// Secondary Stats
if (Ability > -1 && Ability < abilities.Length)
result.Add($"Ability: {abilities[Ability]}");
if (Ability > -1 && Ability < Strings.Ability.Count)
result.Add($"Ability: {Strings.Ability[Ability]}");
if (Level != 100)
result.Add($"Level: {Level}");
if (Shiny)
result.Add("Shiny: Yes");
if (Nature > -1)
result.Add($"{natures[Nature]} Nature");
result.Add($"{Strings.Natures[Nature]} Nature");
// Moves
result.AddRange(GetStringMoves());
@ -185,7 +184,7 @@ namespace PKHeX.Core
}
private string GetStringFirstLine(string form)
{
string specForm = species[Species];
string specForm = Strings.Species[Species];
if (!string.IsNullOrWhiteSpace(form))
specForm += $"-{form.Replace("Mega ", "Mega-")}";
@ -194,18 +193,9 @@ namespace PKHeX.Core
result += $" ({Gender})";
if (HeldItem > 0)
{
switch (Format)
{
case 2: if (HeldItem < g2items.Length)
result += $" @ {g2items[HeldItem]}";
break;
case 3: if (HeldItem < g3items.Length)
result += $" @ {g3items[HeldItem]}";
break;
default: if (HeldItem < items.Length)
result += $" @ {items[HeldItem]}";
break;
}
var items = Strings.GetItemStrings(Format);
if (HeldItem < items.Count)
result += $" @ {items[HeldItem]}";
}
return result;
}
@ -222,11 +212,11 @@ namespace PKHeX.Core
}
private IEnumerable<string> GetStringMoves()
{
foreach (int move in Moves.Where(move => move != 0 && move < moves.Length))
foreach (int move in Moves.Where(move => move != 0 && move < Strings.Move.Count))
{
var str = $"- {moves[move]}";
var str = $"- {Strings.Move[move]}";
if (move == 237) // Hidden Power
str += $" [{hptypes[HiddenPower.GetType(IVs, Format)]}]";
str += $" [{Strings.Types[1+HiddenPower.GetType(IVs, Format)]}]";
yield return str;
}
}
@ -261,7 +251,7 @@ namespace PKHeX.Core
Shiny = pkm.IsShiny;
FormIndex = pkm.AltForm;
string[] Forms = PKX.GetFormList(Species, types, forms, genderForms, pkm.Format);
string[] Forms = PKX.GetFormList(Species, Strings.Types, Strings.forms, genderForms, pkm.Format);
Form = pkm.AltForm > 0 && pkm.AltForm < Forms.Length ? Forms[pkm.AltForm] : string.Empty;
Format = pkm.Format;
}
@ -281,24 +271,23 @@ namespace PKHeX.Core
}
private void ParseItemStr(string itemstr)
{
int item = Array.IndexOf(items, itemstr);
if (item >= 0)
{
HeldItem = item;
if (tryGetItem(Format))
return;
}
if ((item = Array.IndexOf(g3items, itemstr)) >= 0)
if (tryGetItem(3))
return;
if (tryGetItem(2))
return;
InvalidLines.Add($"Unknown Item: {itemstr}");
bool tryGetItem(int format)
{
var items = (string[])Strings.GetItemStrings(format); // ireadonlylist->string[] must be possible for the provided strings
int item = Array.IndexOf(items, itemstr);
if (item < 0)
return false;
HeldItem = item;
Format = 3;
return true;
}
if ((item = Array.IndexOf(g2items, itemstr)) >= 0)
{
HeldItem = item;
Format = 2;
}
else
InvalidLines.Add($"Unknown Item: {itemstr}");
}
private void ParseFirstLineNoItem(string line)
{
@ -309,7 +298,7 @@ namespace PKHeX.Core
Gender = last3.Substring(1, 1);
line = line.Substring(0, line.Length - 3);
}
else if (line.Contains(species[678])) // Meowstic Edge Case with no gender provided
else if (line.Contains(Strings.Species[678])) // Meowstic Edge Case with no gender provided
Gender = "M";
// Nickname Detection
@ -321,7 +310,7 @@ namespace PKHeX.Core
private bool ParseSpeciesForm(string spec)
{
spec = spec.Trim();
if ((Species = Array.IndexOf(species, spec)) >= 0) // success, nothing else!
if ((Species = Array.IndexOf(Strings.specieslist, spec)) >= 0) // success, nothing else!
return true;
// Forme string present.
@ -329,7 +318,7 @@ namespace PKHeX.Core
if (end < 0)
return false;
Species = Array.IndexOf(species, spec.Substring(0, end).Trim());
Species = Array.IndexOf(Strings.specieslist, spec.Substring(0, end).Trim());
Form = spec.Substring(end + 1);
if (Species >= 0)
@ -339,10 +328,10 @@ namespace PKHeX.Core
var edge = new[] {784, 250, 032, 029}; // all species with dashes in English Name (Kommo-o, Ho-Oh, Nidoran-M, Nidoran-F)
foreach (var e in edge)
{
if (!spec.StartsWith(species[e].Replace("♂", "-M").Replace("♀", "-F")))
if (!spec.StartsWith(Strings.Species[e].Replace("♂", "-M").Replace("♀", "-F")))
continue;
Species = e;
Form = spec.Substring(species[e].Length);
Form = spec.Substring(Strings.Species[e].Length);
return true;
}
@ -350,7 +339,7 @@ namespace PKHeX.Core
end = spec.LastIndexOf('-', Math.Max(0, end - 1));
if (end < 0)
return false;
Species = Array.IndexOf(species, spec.Substring(0, end).Trim());
Species = Array.IndexOf(Strings.specieslist, spec.Substring(0, end).Trim());
Form = spec.Substring(end + 1);
return Species >= 0;
@ -385,7 +374,7 @@ namespace PKHeX.Core
private string ParseLineMove(string line)
{
string moveString = line.Substring(line[1] == ' ' ? 2 : 1);
if (!moveString.Contains(moves[237])) // Hidden Power
if (!moveString.Contains(Strings.Move[237])) // Hidden Power
return moveString;
// Defined Hidden Power
@ -393,7 +382,8 @@ namespace PKHeX.Core
{
string type = moveString.Remove(0, 13);
type = ReplaceAll(type, string.Empty, "[", "]", "(", ")"); // Trim out excess data
int hpVal = Array.IndexOf(hptypes, type); // Get HP Type
int hpVal = Array.IndexOf(Strings.types, type) - 1; // Get HP Type
if (IVs.Any(z => z != 31))
{
@ -405,7 +395,7 @@ namespace PKHeX.Core
else
InvalidLines.Add($"Invalid Hidden Power Type: {type}");
}
return moves[237];
return Strings.Move[237];
}
private void ParseLineEVs(string line)
{

View file

@ -24,6 +24,10 @@ namespace PKHeX.Core
public static GameStrings GetStrings(string lang)
{
int index = GetLanguageIndex(lang);
return GetStrings(index);
}
public static GameStrings GetStrings(int index)
{
return Languages[index] ?? (Languages[index] = new GameStrings(lang_val[index]));
}
public static string GetTransporterName(string lang)

View file

@ -626,7 +626,7 @@ namespace PKHeX.Core
/// <param name="genders">List of genders names</param>
/// <param name="generation">Generation number for exclusive formes</param>
/// <returns>A list of strings corresponding to the formes that a Pokémon can have.</returns>
public static string[] GetFormList(int species, string[] types, string[] forms, string[] genders, int generation = Generation)
public static string[] GetFormList(int species, IReadOnlyList<string> types, IReadOnlyList<string> forms, IReadOnlyList<string> genders, int generation = Generation)
{
return FormConverter.GetFormList(species, types, forms, genders, generation);
}

View file

@ -174,7 +174,7 @@ namespace PKHeX.WinForms.Controls
var set = new ShowdownSet(pk);
if (pk.Format <= 2) // Nature preview from IVs
set.Nature = (int)(pk.EXP % 25);
ShowSet.SetToolTip(pb, set.Text);
ShowSet.SetToolTip(pb, set.LocalizedText(Settings.Default.Language));
}
}
private void PlayCry(PKM pk)