Add version check

16 bits for version flags, should be more than enough.

should probably rework it from a packed ushort to a class...
This commit is contained in:
Kurt
2018-06-05 22:20:30 -07:00
parent 323db29374
commit e52ae06721
2 changed files with 22 additions and 18 deletions

View File

@@ -3,7 +3,7 @@
namespace PKHeX.Core
{
[Flags]
public enum MysteryGiftRestriction : ushort
public enum MysteryGiftRestriction
{
None = 0,
LangJapanese = 1 << LanguageID.Japanese,

View File

@@ -21,10 +21,10 @@ public static class MysteryGiftVerifier
var resource = RestrictionSetName(generation);
var data = Util.GetBinaryResource(resource);
var dict = new Dictionary<int, MysteryGiftRestriction>();
for (int i = 0; i < data.Length; i += 4 + 2)
for (int i = 0; i < data.Length; i += 8)
{
int hash = BitConverter.ToInt32(data, i + 0);
var restrict = BitConverter.ToUInt16(data, i + 4);
var restrict = BitConverter.ToInt32(data, i + 4);
dict.Add(hash, (MysteryGiftRestriction)restrict);
}
return dict;
@@ -36,23 +36,17 @@ public static CheckResult VerifyGift(PKM pk, MysteryGift g)
if (!restricted)
return new CheckResult(CheckIdentifier.GameOrigin);
var ver = (int)val >> 16;
if (ver != 0 && !CanVersionRecieveGift(g.Format, ver, pk.Version))
return new CheckResult(Severity.Invalid, V416, CheckIdentifier.GameOrigin);
var lang = val & MysteryGiftRestriction.LangRestrict;
if (lang != 0)
{
var current = 1 << pk.Language;
if (!lang.HasFlagFast((MysteryGiftRestriction) current))
{
int suggest = lang.GetSuggestedLanguage();
return new CheckResult(Severity.Invalid, string.Format(V5, suggest, pk.Language), CheckIdentifier.GameOrigin);
}
}
if (lang != 0 && !lang.HasFlagFast((MysteryGiftRestriction) (1 << pk.Language)))
return new CheckResult(Severity.Invalid, string.Format(V5, lang.GetSuggestedLanguage(), pk.Language), CheckIdentifier.GameOrigin);
var region = val & MysteryGiftRestriction.RegionRestrict;
if (region != 0)
{
var current = (int)MysteryGiftRestriction.RegionBase << pk.ConsoleRegion;
if (!region.HasFlagFast((MysteryGiftRestriction)current))
return new CheckResult(Severity.Invalid, V301, CheckIdentifier.GameOrigin);
}
if (region != 0 && !region.HasFlagFast((MysteryGiftRestriction)((int)MysteryGiftRestriction.RegionBase << pk.ConsoleRegion)))
return new CheckResult(Severity.Invalid, V301, CheckIdentifier.GameOrigin);
return new CheckResult(CheckIdentifier.GameOrigin);
}
@@ -76,6 +70,16 @@ public static bool IsValidChangedOTName(PKM pk, MysteryGift g)
return CurrentOTMatchesReplaced(g.Format, pk.OT_Name);
}
private static bool CanVersionRecieveGift(int format, int version4bit, int version)
{
switch (format)
{
// todo
default:
return false;
}
}
private static bool CurrentOTMatchesReplaced(int format, string pkOtName)
{
if (format <= 4 && IsMatchName(pkOtName, 4))