mirror of
https://github.com/kwsch/PKHeX
synced 2024-12-20 09:23:17 +00:00
9dae7dad67
move encountertype datasource providing to core fix rerolling EC not updating characteristic remove some repeat logic calls relocate geolocation name fetch to separate class, add tests to ensure functionality, add languageID->country/region fetch method
132 lines
5.2 KiB
C#
132 lines
5.2 KiB
C#
using System;
|
|
|
|
namespace PKHeX.Core
|
|
{
|
|
public static class GeoLocation
|
|
{
|
|
private static readonly string[][] CountryList = GetCountryList();
|
|
private static readonly string[] lang_geo = { "ja", "en", "fr", "de", "it", "es", "zh", "ko" };
|
|
private static readonly string[][][] RegionList = new string[CountryList.Length][][];
|
|
|
|
private const string INVALID = nameof(INVALID);
|
|
|
|
private static string[][] GetCountryList()
|
|
{
|
|
var input = Util.GetStringList("countries");
|
|
return UnpackList(input);
|
|
}
|
|
|
|
private static string[][] GetRegionList(int country)
|
|
{
|
|
var input = Util.GetStringList($"sr_{country:000}");
|
|
return UnpackList(input);
|
|
}
|
|
|
|
private static string[][] UnpackList(string[] input)
|
|
{
|
|
var last = GetEntry(input[input.Length - 1], out var lastIndex);
|
|
var list = new string[lastIndex+1][];
|
|
list[lastIndex] = last;
|
|
for (int i = 1; i < input.Length - 1; i++)
|
|
{
|
|
var line = input[i];
|
|
var entry = GetEntry(line, out var index);
|
|
list[index] = entry;
|
|
}
|
|
return list;
|
|
}
|
|
|
|
private static string[] GetEntry(string line, out int index)
|
|
{
|
|
var entries = line.Split(',');
|
|
index = int.Parse(entries[0]);
|
|
return entries;
|
|
}
|
|
|
|
private static string GetCountryName(int countryID, int l)
|
|
{
|
|
if (l < 0)
|
|
return INVALID;
|
|
if (countryID >= CountryList.Length)
|
|
return INVALID;
|
|
var countryNames = CountryList[countryID];
|
|
if (l < countryNames?.Length)
|
|
return countryNames[l + 1];
|
|
return INVALID;
|
|
}
|
|
|
|
private static string GetRegionName(int countryID, int regionID, int l)
|
|
{
|
|
if (l < 0)
|
|
return INVALID;
|
|
if (countryID >= RegionList.Length)
|
|
return INVALID;
|
|
var regionstrs = RegionList[countryID];
|
|
if (regionstrs == null)
|
|
{
|
|
regionstrs = RegionList[countryID] = GetRegionList(countryID);
|
|
if (regionstrs == null)
|
|
return INVALID;
|
|
}
|
|
if (regionID >= regionstrs.Length)
|
|
return INVALID;
|
|
var localized = regionstrs[regionID];
|
|
if (l < localized?.Length)
|
|
return localized[l + 1];
|
|
return INVALID;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the Country string for a given Country ID
|
|
/// </summary>
|
|
/// <param name="country">Country ID</param>
|
|
/// <param name="language">Language ID</param>
|
|
/// <returns>Country ID string</returns>
|
|
public static string GetCountryName(string language, int country) => GetCountryName(country, GetLanguageIndex(language));
|
|
|
|
/// <summary>
|
|
/// Gets the Region string for a specified country ID.
|
|
/// </summary>
|
|
/// <param name="country">Country ID</param>
|
|
/// <param name="region">Region ID</param>
|
|
/// <param name="language">Language ID</param>
|
|
/// <returns>Region ID string</returns>
|
|
public static string GetRegionName(string language, int country, int region) => GetRegionName(country, region, GetLanguageIndex(language));
|
|
|
|
/// <summary>
|
|
/// Gets the Country string for a given Country ID
|
|
/// </summary>
|
|
/// <param name="country">Country ID</param>
|
|
/// <param name="language">Language ID</param>
|
|
/// <returns>Country ID string</returns>
|
|
public static string GetCountryName(LanguageID language, int country) => GetCountryName(country, GetLanguageIndex(language));
|
|
|
|
/// <summary>
|
|
/// Gets the Region string for a specified country ID.
|
|
/// </summary>
|
|
/// <param name="country">Country ID</param>
|
|
/// <param name="region">Region ID</param>
|
|
/// <param name="language">Language ID</param>
|
|
/// <returns>Region ID string</returns>
|
|
public static string GetRegionName(LanguageID language, int country, int region) => GetRegionName(country, region, GetLanguageIndex(language));
|
|
|
|
/// <summary>
|
|
/// Gets Country and Region strings for corresponding IDs and language.
|
|
/// </summary>
|
|
/// <param name="country">Country ID</param>
|
|
/// <param name="region">Region ID</param>
|
|
/// <param name="language">Language ID</param>
|
|
/// <returns></returns>
|
|
public static Tuple<string, string> GetCountryRegionText(int country, int region, string language)
|
|
{
|
|
// Get Language we're fetching for
|
|
int lang = Array.IndexOf(lang_geo, language);
|
|
string c = GetCountryName(country, lang);
|
|
string r = GetRegionName(country, region, lang);
|
|
return new Tuple<string, string>(c, r); // country, region
|
|
}
|
|
|
|
private static int GetLanguageIndex(string language) => Array.IndexOf(lang_geo, language);
|
|
private static int GetLanguageIndex(LanguageID language) => GetLanguageIndex(language.GetLanguage2CharName());
|
|
}
|
|
}
|