Reorganization for future changes

Moving legality stuff into separate class
This commit is contained in:
Kaphotics 2016-02-22 22:52:48 -08:00
parent 7a3b0699d0
commit 968eabd053
9 changed files with 430 additions and 318 deletions

96
Legality/Analysis.cs Normal file
View File

@ -0,0 +1,96 @@
using System.Linq;
namespace PKHeX
{
public enum Severity
{
Indeterminate = -2,
Invalid = -1,
Fishy = 0,
Valid = 1,
NotImplemented = 2,
}
public class LegalityCheck
{
public Severity Judgement = Severity.Invalid;
public string Comment;
public bool Valid => Judgement >= Severity.Fishy;
public LegalityCheck() { }
public LegalityCheck(Severity s, string c)
{
Judgement = s;
Comment = c;
}
}
public class LegalityAnalysis
{
public bool Valid = false;
public int[] ValidMoves => Legal.getValidMoves(pk6.Species, pk6.CurrentLevel);
public int[] ValidRelearnMoves => Legal.getValidRelearn(pk6.Species);
public string Report => getLegalityReport();
private readonly PK6 pk6;
public LegalityAnalysis(PK6 pk)
{
pk6 = pk;
}
public bool[] getMoveValidity(int[] Moves, int[] RelearnMoves)
{
if (Moves.Length != 4)
return null;
if (!pk6.Gen6)
return new[] {true, true, true, true};
bool[] res = new bool[4];
if (pk6.Species == 235)
{
for (int i = 0; i < 4; i++)
res[i] = !Legal.InvalidSketch.Contains(Moves[i]);
}
else
{
for (int i = 0; i < 4; i++)
res[i] = Moves[i] != Legal.Struggle && ValidMoves.Concat(RelearnMoves).Contains(Moves[i]);
}
if (Moves[0] == 0)
res[0] = false;
return res;
}
public bool[] getRelearnValidity(int[] Moves)
{
bool[] res = new bool[4];
if (Moves.Length != 4)
return res;
if (pk6.Egg_Location == 0) // Never Egg
{
if (pk6.Met_Location > 40000) // Event
{
// Not Implemented
}
else
{
// Check for DexNav
// Not Implemented
}
}
else
{
// Check Bred Moves
}
return new[] { true, true, true, true };
}
public LegalityCheck EC, Nickname, PID, IDs, IVs, EVs;
private string getLegalityReport()
{
return null;
}
}
}

87
Legality/Core.cs Normal file
View File

@ -0,0 +1,87 @@
using System.Collections.Generic;
using System.Linq;
namespace PKHeX
{
public static partial class Legal
{
// PKHeX master personal.dat
internal static readonly PersonalInfo[] PersonalAO = PersonalInfo.getPersonalArray(Properties.Resources.personal_ao, PersonalInfo.SizeAO);
private static readonly PersonalInfo[] PersonalXY = PersonalInfo.getPersonalArray(Properties.Resources.personal_xy, PersonalInfo.SizeXY);
private static readonly EggMoves[] EggMoveXY = EggMoves.getArray(Util.unpackMini(Properties.Resources.eggmove_xy, "xy"));
private static readonly Learnset[] LevelUpXY = Learnset.getArray(Util.unpackMini(Properties.Resources.lvlmove_xy, "xy"));
private static readonly EggMoves[] EggMoveAO = EggMoves.getArray(Util.unpackMini(Properties.Resources.eggmove_ao, "ao"));
private static readonly Learnset[] LevelUpAO = Learnset.getArray(Util.unpackMini(Properties.Resources.lvlmove_ao, "ao"));
private static readonly Evolutions[] Evolves = Evolutions.getArray(Util.unpackMini(Properties.Resources.evos_ao, "ao"));
internal static int[] getValidMoves(int species, int level)
{
int[] r = new int[1];
// r = r.Concat(getEggMoves(species)).ToArray();
r = r.Concat(getLVLMoves(species, level)).ToArray();
r = r.Concat(getTutorMoves(species)).ToArray();
r = r.Concat(getMachineMoves(species)).ToArray();
Evolutions e = Evolves[species];
int dec = 0;
for (int i = 0; i < e.Species.Length; i++)
{
if (e.Level[i] == 1) // In order to level up evolve, the list of available moves is for one level previous.
dec++;
r = r.Concat(getLVLMoves(e.Species[i], level - dec)).ToArray();
r = r.Concat(getTutorMoves(e.Species[i])).ToArray();
r = r.Concat(getMachineMoves(e.Species[i])).ToArray();
}
return r.Distinct().ToArray();
}
internal static int[] getValidRelearn(int species)
{
int[] moves = new int[0];
foreach (int spec in Evolves[species].Species)
{
moves = moves.Concat(getLVLMoves(spec, 1)).ToArray();
moves = moves.Concat(getEggMoves(spec)).ToArray();
moves = moves.Concat(getLVLMoves(spec, 100)).ToArray();
}
moves = moves.Concat(getLVLMoves(species, 1)).ToArray();
moves = moves.Concat(getEggMoves(species)).ToArray();
moves = moves.Concat(getLVLMoves(species, 100)).ToArray();
return moves.Concat(new int[1]).Distinct().ToArray();
// Not implemented: DexNav exclusive moves, Wonder Cards
}
private static int[] getEggMoves(int species)
{
return EggMoveAO[species].Moves.Concat(EggMoveXY[species].Moves).ToArray();
}
private static int[] getLVLMoves(int species, int lvl)
{
return LevelUpXY[species].getMoves(lvl).Concat(LevelUpAO[species].getMoves(lvl)).ToArray();
}
private static int[] getTutorMoves(int species)
{
PersonalInfo pkAO = PersonalAO[species];
// Type Tutor
List<int> moves = TypeTutor.Where((t, i) => pkAO.Tutors[i]).ToList();
// Varied Tutors
for (int i = 0; i < Tutors_AO.Length; i++)
for (int b = 0; b < Tutors_AO[i].Length; b++)
if (pkAO.ORASTutors[i][b])
moves.Add(Tutors_AO[i][b]);
return moves.ToArray();
}
private static int[] getMachineMoves(int species)
{
PersonalInfo pkXY = PersonalXY[species];
PersonalInfo pkAO = PersonalAO[species];
List<int> moves = new List<int>();
moves.AddRange(TMHM_XY.Where((t, i) => pkXY.TMHM[i]));
moves.AddRange(TMHM_AO.Where((t, i) => pkAO.TMHM[i]));
return moves.ToArray();
}
}
}

214
Legality/Data.cs Normal file
View File

@ -0,0 +1,214 @@
using System;
using System.IO;
using System.Linq;
namespace PKHeX
{
public class Learnset
{
public readonly int Count;
public readonly int[] Moves, Levels;
public Learnset(byte[] data)
{
if (data.Length < 4 || data.Length % 4 != 0)
{ Count = 0; Levels = new int[0]; Moves = new int[0]; return; }
Count = data.Length / 4 - 1;
Moves = new int[Count];
Levels = new int[Count];
using (BinaryReader br = new BinaryReader(new MemoryStream(data)))
for (int i = 0; i < Count; i++)
{
Moves[i] = br.ReadInt16();
Levels[i] = br.ReadInt16();
}
}
public static Learnset[] getArray(byte[][] entries)
{
Learnset[] data = new Learnset[entries.Length];
for (int i = 0; i < data.Length; i++)
data[i] = new Learnset(entries[i]);
return data;
}
public int[] getMoves(int level)
{
for (int i = 0; i > Levels.Length; i++)
if (Levels[i] > level)
return Moves.Take(i).ToArray();
return Moves;
}
}
public class EggMoves
{
public readonly int Count;
public readonly int[] Moves;
public EggMoves(byte[] data)
{
if (data.Length < 2 || data.Length % 2 != 0)
{ Count = 0; Moves = new int[0]; return; }
using (BinaryReader br = new BinaryReader(new MemoryStream(data)))
{
Moves = new int[Count = br.ReadUInt16()];
for (int i = 0; i < Count; i++)
Moves[i] = br.ReadUInt16();
}
}
public static EggMoves[] getArray(byte[][] entries)
{
EggMoves[] data = new EggMoves[entries.Length];
for (int i = 0; i < data.Length; i++)
data[i] = new EggMoves(entries[i]);
return data;
}
}
public class Evolutions
{
public readonly int[] Species, Level;
public Evolutions(byte[] data)
{
int Count = data.Length / 4;
Level = new int[Count];
Species = new int[Count];
if (data.Length < 4 || data.Length % 4 != 0) return;
for (int i = 0; i < data.Length; i += 4)
{
Species[i / 4] = BitConverter.ToUInt16(data, i);
Level[i / 4] = BitConverter.ToUInt16(data, i + 2);
}
}
public static Evolutions[] getArray(byte[][] entries)
{
Evolutions[] data = new Evolutions[entries.Length];
for (int i = 0; i < data.Length; i++)
data[i] = new Evolutions(entries[i]);
return data;
}
}
public class PersonalInfo
{
internal static int SizeAO = 0x50;
internal static int SizeXY = 0x40;
public byte HP, ATK, DEF, SPE, SPA, SPD;
public int BST;
public int EV_HP, EV_ATK, EV_DEF, EV_SPE, EV_SPA, EV_SPD;
public byte[] Types = new byte[2];
public byte CatchRate, EvoStage;
public ushort[] Items = new ushort[3];
public byte Gender, HatchCycles, BaseFriendship, EXPGrowth;
public byte[] EggGroups = new byte[2];
public byte[] Abilities = new byte[3];
public ushort FormStats, FormeSprite, BaseEXP;
public byte FormeCount, Color;
public float Height, Weight;
public bool[] TMHM;
public bool[] Tutors;
public bool[][] ORASTutors = new bool[4][];
public byte EscapeRate;
public PersonalInfo(byte[] data)
{
using (BinaryReader br = new BinaryReader(new MemoryStream(data)))
{
HP = br.ReadByte(); ATK = br.ReadByte(); DEF = br.ReadByte();
SPE = br.ReadByte(); SPA = br.ReadByte(); SPD = br.ReadByte();
BST = HP + ATK + DEF + SPE + SPA + SPD;
Types = new[] { br.ReadByte(), br.ReadByte() };
CatchRate = br.ReadByte();
EvoStage = br.ReadByte();
ushort EVs = br.ReadUInt16();
EV_HP = EVs >> 0 & 0x3;
EV_ATK = EVs >> 2 & 0x3;
EV_DEF = EVs >> 4 & 0x3;
EV_SPE = EVs >> 6 & 0x3;
EV_SPA = EVs >> 8 & 0x3;
EV_SPD = EVs >> 10 & 0x3;
Items = new[] { br.ReadUInt16(), br.ReadUInt16(), br.ReadUInt16() };
Gender = br.ReadByte();
HatchCycles = br.ReadByte();
BaseFriendship = br.ReadByte();
EXPGrowth = br.ReadByte();
EggGroups = new[] { br.ReadByte(), br.ReadByte() };
Abilities = new[] { br.ReadByte(), br.ReadByte(), br.ReadByte() };
EscapeRate = br.ReadByte();
FormStats = br.ReadUInt16();
FormeSprite = br.ReadUInt16();
FormeCount = br.ReadByte();
Color = br.ReadByte();
BaseEXP = br.ReadUInt16();
Height = br.ReadUInt16();
Weight = br.ReadUInt16();
byte[] TMHMData = br.ReadBytes(0x10);
TMHM = new bool[8 * TMHMData.Length];
for (int j = 0; j < TMHM.Length; j++)
TMHM[j] = (TMHMData[j / 8] >> (j % 8) & 0x1) == 1; //Bitflags for TMHM
byte[] TutorData = br.ReadBytes(8);
Tutors = new bool[8 * TutorData.Length];
for (int j = 0; j < Tutors.Length; j++)
Tutors[j] = (TutorData[j / 8] >> (j % 8) & 0x1) == 1; //Bitflags for Tutors
if (br.BaseStream.Length - br.BaseStream.Position == 0x10) // ORAS
{
byte[][] ORASTutorData =
{
br.ReadBytes(4), // 15
br.ReadBytes(4), // 17
br.ReadBytes(4), // 16
br.ReadBytes(4), // 15
};
for (int i = 0; i < 4; i++)
{
ORASTutors[i] = new bool[8 * ORASTutorData[i].Length];
for (int b = 0; b < 8 * ORASTutorData[i].Length; b++)
ORASTutors[i][b] = (ORASTutorData[i][b / 8] >> b % 8 & 0x1) == 1;
}
}
}
}
// Data Manipulation
public int FormeIndex(int species, int forme)
{
return forme == 0 || FormStats == 0 ? species : FormStats + forme - 1;
}
public int RandomGender
{
get
{
switch (Gender)
{
case 255: // Genderless
return 2;
case 254: // Female
return 1;
case 0: // Male
return 0;
default:
return (int)(Util.rnd32() % 2);
}
}
}
public bool HasFormes => FormeCount > 1;
internal static PersonalInfo[] getPersonalArray(byte[] data, int size)
{
PersonalInfo[] d = new PersonalInfo[data.Length / size];
for (int i = 0; i < d.Length; i++)
d[i] = new PersonalInfo(data.Skip(i * size).Take(size).ToArray());
return d;
}
}
}

View File

@ -1,6 +1,6 @@
namespace PKHeX
{
internal static class Legal
public static partial class Legal
{
// PKHeX Valid Array Storage
#region Items
@ -166,7 +166,7 @@ internal static class Legal
};
#endregion
#region TMHM
internal static readonly int[] AO_TMHM =
internal static readonly int[] TMHM_AO =
{
468, 337, 473, 347, 046, 092, 258, 339, 474, 237,
241, 269, 058, 059, 063, 113, 182, 240, 355, 219,
@ -181,7 +181,7 @@ internal static class Legal
15, 19, 57, 70, 127, 249, 291,
};
internal static readonly int[] XY_TMHM =
internal static readonly int[] TMHM_XY =
{
468, 337, 473, 347, 046, 092, 258, 339, 474, 237,
241, 269, 058, 059, 063, 113, 182, 240, 355, 219,
@ -196,8 +196,8 @@ internal static class Legal
15, 19, 57, 70, 127,
};
internal static readonly int[] AO_TypeTutor = { 338, 307, 308, 520, 519, 518, 434, 620 };
internal static readonly int[][] AO_Tutors =
internal static readonly int[] TypeTutor = { 338, 307, 308, 520, 519, 518, 434, 620 };
internal static readonly int[][] Tutors_AO =
{
new[] {450, 343, 162, 530, 324, 442, 402, 529, 340, 67, 441, 253, 9, 7, 8},
new[] {277, 335, 414, 492, 356, 393, 334, 387, 276, 527, 196, 401, 399, 428, 406, 304, 231},
@ -205,5 +205,9 @@ internal static class Legal
new[] {380, 388, 180, 495, 270, 271, 478, 472, 283, 200, 278, 289, 446, 214, 285},
};
#endregion
internal static readonly int Struggle = 165;
internal static readonly int Chatter = 448;
internal static readonly int[] InvalidSketch = {Struggle, Chatter};
}
}

View File

@ -1,178 +0,0 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace PKHeX
{
public class LegalityChecker
{
private readonly EggMoves[] EggMoveXY = EggMoves.getArray(Util.unpackMini(Properties.Resources.eggmove_xy, "xy"));
private readonly Learnset[] LevelUpXY = Learnset.getArray(Util.unpackMini(Properties.Resources.lvlmove_xy, "xy"));
private readonly EggMoves[] EggMoveAO = EggMoves.getArray(Util.unpackMini(Properties.Resources.eggmove_ao, "ao"));
private readonly Learnset[] LevelUpAO = Learnset.getArray(Util.unpackMini(Properties.Resources.lvlmove_ao, "ao"));
private readonly Evolutions[] Evolves = Evolutions.getArray(Util.unpackMini(Properties.Resources.evos_ao, "ao"));
private readonly PKX.PersonalInfo[] PersonalAO = PKX.getPersonalArray(Properties.Resources.personal_ao, PKX.PersonalInfo.SizeAO);
private readonly PKX.PersonalInfo[] PersonalXY = PKX.getPersonalArray(Properties.Resources.personal_xy, PKX.PersonalInfo.SizeXY);
public LegalityChecker()
{
Console.WriteLine("Initializing Legality Checker...");
}
public int[] getValidMoves(int species, int level)
{
int[] r = new int[1];
// r = r.Concat(getEggMoves(species)).ToArray();
r = r.Concat(getLVLMoves(species, level)).ToArray();
r = r.Concat(getTutorMoves(species)).ToArray();
r = r.Concat(getMachineMoves(species)).ToArray();
Evolutions e = Evolves[species];
int dec = 0;
for (int i = 0; i < e.Species.Length; i++)
{
if (e.Level[i] == 1) // In order to level up evolve, the list of available moves is for one level previous.
dec++;
r = r.Concat(getLVLMoves(e.Species[i], level - dec)).ToArray();
r = r.Concat(getTutorMoves(e.Species[i])).ToArray();
r = r.Concat(getMachineMoves(e.Species[i])).ToArray();
}
return r.Distinct().ToArray();
}
public int[] getValidRelearn(int species)
{
int[] moves = new int[0];
foreach (int spec in Evolves[species].Species)
{
moves = moves.Concat(getLVLMoves(spec, 1)).ToArray();
moves = moves.Concat(getEggMoves(spec)).ToArray();
moves = moves.Concat(getLVLMoves(spec, 100)).ToArray();
}
moves = moves.Concat(getLVLMoves(species, 1)).ToArray();
moves = moves.Concat(getEggMoves(species)).ToArray();
moves = moves.Concat(getLVLMoves(species, 100)).ToArray();
return moves.Concat(new int[1]).Distinct().ToArray();
// Not implemented: DexNav exclusive moves, Wonder Cards
}
private int[] getEggMoves(int species)
{
return EggMoveAO[species].Moves.Concat(EggMoveXY[species].Moves).ToArray();
}
private int[] getLVLMoves(int species, int lvl)
{
return LevelUpXY[species].getMoves(lvl).Concat(LevelUpAO[species].getMoves(lvl)).ToArray();
}
private int[] getTutorMoves(int species)
{
PKX.PersonalInfo pkAO = PersonalAO[species];
// Type Tutor
List<int> moves = Legal.AO_TypeTutor.Where((t, i) => pkAO.Tutors[i]).ToList();
// Varied Tutors
for (int i = 0; i < Legal.AO_Tutors.Length; i++)
for (int b = 0; b < Legal.AO_Tutors[i].Length; b++)
if (pkAO.ORASTutors[i][b])
moves.Add(Legal.AO_Tutors[i][b]);
return moves.ToArray();
}
private int[] getMachineMoves(int species)
{
PKX.PersonalInfo pkXY = PersonalXY[species];
PKX.PersonalInfo pkAO = PersonalAO[species];
List<int> moves = new List<int>();
moves.AddRange(Legal.XY_TMHM.Where((t, i) => pkXY.TMHM[i]));
moves.AddRange(Legal.AO_TMHM.Where((t, i) => pkAO.TMHM[i]));
return moves.ToArray();
}
}
public class Learnset
{
public readonly int Count;
public readonly int[] Moves, Levels;
public Learnset(byte[] data)
{
if (data.Length < 4 || data.Length % 4 != 0)
{ Count = 0; Levels = new int[0]; Moves = new int[0]; return; }
Count = data.Length / 4 - 1;
Moves = new int[Count];
Levels = new int[Count];
using (BinaryReader br = new BinaryReader(new MemoryStream(data)))
for (int i = 0; i < Count; i++)
{
Moves[i] = br.ReadInt16();
Levels[i] = br.ReadInt16();
}
}
public static Learnset[] getArray(byte[][] entries)
{
Learnset[] data = new Learnset[entries.Length];
for (int i = 0; i < data.Length; i++)
data[i] = new Learnset(entries[i]);
return data;
}
public int[] getMoves(int level)
{
for (int i = 0; i > Levels.Length; i++)
if (Levels[i] > level)
return Moves.Take(i).ToArray();
return Moves;
}
}
public class EggMoves
{
public readonly int Count;
public readonly int[] Moves;
public EggMoves(byte[] data)
{
if (data.Length < 2 || data.Length%2 != 0)
{ Count = 0; Moves = new int[0]; return; }
using (BinaryReader br = new BinaryReader(new MemoryStream(data)))
{
Moves = new int[Count = br.ReadUInt16()];
for (int i = 0; i < Count; i++)
Moves[i] = br.ReadUInt16();
}
}
public static EggMoves[] getArray(byte[][] entries)
{
EggMoves[] data = new EggMoves[entries.Length];
for (int i = 0; i < data.Length; i++)
data[i] = new EggMoves(entries[i]);
return data;
}
}
public class Evolutions
{
public readonly int[] Species, Level;
public Evolutions(byte[] data)
{
int Count = data.Length / 4;
Level = new int[Count];
Species = new int[Count];
if (data.Length < 4 || data.Length % 4 != 0) return;
for (int i = 0; i < data.Length; i+=4)
{
Species[i/4] = BitConverter.ToUInt16(data, i);
Level[i/4] = BitConverter.ToUInt16(data, i+2);
}
}
public static Evolutions[] getArray(byte[][] entries)
{
Evolutions[] data = new Evolutions[entries.Length];
for (int i = 0; i < data.Length; i++)
data[i] = new Evolutions(entries[i]);
return data;
}
}
}

View File

@ -441,6 +441,7 @@ public int[] Moves
if (value.Length > 3) Move4 = value[3];
}
}
public int CurrentLevel => getLevel(Species, EXP);
// Complex Generated Attributes
public Image Sprite => getSprite(this);

View File

@ -1,7 +1,6 @@
using System;
using System.Drawing;
using System.Drawing.Text;
using System.IO;
using System.Linq;
namespace PKHeX
@ -153,14 +152,7 @@ internal static string getSpeciesName(int species, int lang)
try { return SpeciesLang[lang][species]; }
catch { return ""; }
}
internal static readonly PersonalInfo[] Personal = getPersonalArray(Properties.Resources.personal_ao, PersonalInfo.SizeAO);
internal static PersonalInfo[] getPersonalArray(byte[] data, int size)
{
PersonalInfo[] d = new PersonalInfo[data.Length / size];
for (int i = 0; i < d.Length; i++)
d[i] = new PersonalInfo(data.Skip(i*size).Take(size).ToArray());
return d;
}
internal static readonly PersonalInfo[] Personal = Legal.PersonalAO;
// Stat Fetching
internal static int getMovePP(int move, int ppup)
@ -1521,119 +1513,5 @@ internal static string getShowdownText(PK6 pk6)
if (Set.Form == "F") Set.Gender = "";
return Set.getText();
}
public class PersonalInfo
{
internal static int SizeAO = 0x50;
internal static int SizeXY = 0x40;
public byte HP, ATK, DEF, SPE, SPA, SPD;
public int BST;
public int EV_HP, EV_ATK, EV_DEF, EV_SPE, EV_SPA, EV_SPD;
public byte[] Types = new byte[2];
public byte CatchRate, EvoStage;
public ushort[] Items = new ushort[3];
public byte Gender, HatchCycles, BaseFriendship, EXPGrowth;
public byte[] EggGroups = new byte[2];
public byte[] Abilities = new byte[3];
public ushort FormStats, FormeSprite, BaseEXP;
public byte FormeCount, Color;
public float Height, Weight;
public bool[] TMHM;
public bool[] Tutors;
public bool[][] ORASTutors = new bool[4][];
public byte EscapeRate;
public PersonalInfo(byte[] data)
{
using (BinaryReader br = new BinaryReader(new MemoryStream(data)))
{
HP = br.ReadByte(); ATK = br.ReadByte(); DEF = br.ReadByte();
SPE = br.ReadByte(); SPA = br.ReadByte(); SPD = br.ReadByte();
BST = HP + ATK + DEF + SPE + SPA + SPD;
Types = new[] { br.ReadByte(), br.ReadByte() };
CatchRate = br.ReadByte();
EvoStage = br.ReadByte();
ushort EVs = br.ReadUInt16();
EV_HP = EVs >> 0 & 0x3;
EV_ATK = EVs >> 2 & 0x3;
EV_DEF = EVs >> 4 & 0x3;
EV_SPE = EVs >> 6 & 0x3;
EV_SPA = EVs >> 8 & 0x3;
EV_SPD = EVs >> 10 & 0x3;
Items = new[] { br.ReadUInt16(), br.ReadUInt16(), br.ReadUInt16() };
Gender = br.ReadByte();
HatchCycles = br.ReadByte();
BaseFriendship = br.ReadByte();
EXPGrowth = br.ReadByte();
EggGroups = new[] { br.ReadByte(), br.ReadByte() };
Abilities = new[] { br.ReadByte(), br.ReadByte(), br.ReadByte() };
EscapeRate = br.ReadByte();
FormStats = br.ReadUInt16();
FormeSprite = br.ReadUInt16();
FormeCount = br.ReadByte();
Color = br.ReadByte();
BaseEXP = br.ReadUInt16();
Height = br.ReadUInt16();
Weight = br.ReadUInt16();
byte[] TMHMData = br.ReadBytes(0x10);
TMHM = new bool[8 * TMHMData.Length];
for (int j = 0; j < TMHM.Length; j++)
TMHM[j] = (TMHMData[j / 8] >> (j % 8) & 0x1) == 1; //Bitflags for TMHM
byte[] TutorData = br.ReadBytes(8);
Tutors = new bool[8 * TutorData.Length];
for (int j = 0; j < Tutors.Length; j++)
Tutors[j] = (TutorData[j / 8] >> (j % 8) & 0x1) == 1; //Bitflags for Tutors
if (br.BaseStream.Length - br.BaseStream.Position == 0x10) // ORAS
{
byte[][] ORASTutorData =
{
br.ReadBytes(4), // 15
br.ReadBytes(4), // 17
br.ReadBytes(4), // 16
br.ReadBytes(4), // 15
};
for (int i = 0; i < 4; i++)
{
ORASTutors[i] = new bool[8 * ORASTutorData[i].Length];
for (int b = 0; b < 8 * ORASTutorData[i].Length; b++)
ORASTutors[i][b] = (ORASTutorData[i][b / 8] >> b % 8 & 0x1) == 1;
}
}
}
}
// Data Manipulation
public int FormeIndex(int species, int forme)
{
return forme == 0 || FormStats == 0 ? species : FormStats + forme - 1;
}
public int RandomGender
{
get
{
switch (Gender)
{
case 255: // Genderless
return 2;
case 254: // Female
return 1;
case 0: // Male
return 0;
default:
return (int)(Util.rnd32()%2);
}
}
}
public bool HasFormes => FormeCount > 1;
}
}
}

View File

@ -68,11 +68,13 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Misc\Legality.cs" />
<Compile Include="Legality\Analysis.cs" />
<Compile Include="Legality\Core.cs" />
<Compile Include="Legality\Data.cs" />
<Compile Include="Misc\PGT.cs" />
<Compile Include="Misc\PK3.cs" />
<Compile Include="Misc\PK4.cs" />
<Compile Include="Misc\Legal.cs" />
<Compile Include="Legality\Tables.cs" />
<Compile Include="Misc\PGF.cs" />
<Compile Include="Misc\PK5.cs" />
<Compile Include="Misc\PK6.cs" />

View File

@ -153,8 +153,7 @@ public Main()
private static string pathSDF;
private static string path3DS;
private static bool HaX;
private int[] validMoves = new int[0];
private readonly LegalityChecker LC = new LegalityChecker();
private LegalityAnalysis Legality = new LegalityAnalysis(new PK6());
private static readonly Image mixedHighlight = Util.ChangeOpacity(Properties.Resources.slotSet, 0.5);
private static readonly string BackupPath = "bak";
private static readonly string[] lang_val = { "en", "ja", "fr", "it", "de", "es", "ko", "zh", "pt" };
@ -2062,14 +2061,23 @@ private void validateMove(object sender, EventArgs e)
bool gen6 = Version >= 24 && Version <= 29;
int species = Util.getIndex(CB_Species);
int index = Array.IndexOf(new[] { CB_Move1, CB_Move2, CB_Move3, CB_Move4 }, sender);
int[] moves =
{
Util.getIndex(CB_Move1), Util.getIndex(CB_Move2),
Util.getIndex(CB_Move3), Util.getIndex(CB_Move4)
};
int[] relearnMoves =
{
Util.getIndex(CB_RelearnMove1), Util.getIndex(CB_RelearnMove2),
Util.getIndex(CB_RelearnMove3), Util.getIndex(CB_RelearnMove4)
};
if (index > -1) // Move
{
updatePP(sender, e);
int[] moves = validMoves.Concat(new[] {
Util.getIndex(CB_RelearnMove1), Util.getIndex(CB_RelearnMove2), Util.getIndex(CB_RelearnMove3), Util.getIndex(CB_RelearnMove4)
}).ToArray();
new[] {PB_WarnMove1, PB_WarnMove2, PB_WarnMove3, PB_WarnMove4}[index].Visible = gen6 && !moves.Contains(Util.getIndex(sender as ComboBox)) && species != 235; // smeargle
PictureBox[] moveCB = {PB_WarnMove1, PB_WarnMove2, PB_WarnMove3, PB_WarnMove4};
bool[] x = Legality.getMoveValidity(moves, relearnMoves);
for (int i = 0; i < 4; i++)
moveCB[i].Visible = !x[i];
}
else
{
@ -2084,8 +2092,7 @@ private void validateMove(object sender, EventArgs e)
}
else if (egg && gen6)
{
int[] moves = LC.getValidRelearn(Util.getIndex(CB_Species));
pb.Visible = !moves.Contains(Util.getIndex(cb));
pb.Visible = !Legality.ValidRelearnMoves.Contains(relearnMoves[index]);
}
else
{
@ -2103,7 +2110,8 @@ private void updateValidMoves()
{
if (!fieldsLoaded)
return;
validMoves = LC.getValidMoves(Util.getIndex(CB_Species), Util.ToInt32(MT_Level.Enabled ? MT_Level.Text : TB_Level.Text));
Legality = new LegalityAnalysis(pk6);
// refresh
foreach (ComboBox cb in new[] {CB_RelearnMove1, CB_RelearnMove2, CB_RelearnMove3, CB_RelearnMove4})