pk3DS/pk3DS.Core/Structures/Gen6/trdata6.cs
Kurt fa5bdee781 Refactoring
use new randomization objects in other forms
re-standardize namespaces a little
2017-09-09 22:16:55 -07:00

143 lines
4.9 KiB
C#

using System;
using System.IO;
using System.Linq;
namespace pk3DS.Core.Structures
{
public class trdata6
{
public bool isORAS;
public int Format, Class;
public bool Item, Moves;
public byte BattleType, NumPokemon, AI;
public ushort[] Items = new ushort[4];
public byte u1, u2, u3;
public ushort uORAS;
public bool Healer;
public byte Money;
public ushort Prize;
public Pokemon[] Team;
public trdata6(byte[] trData, byte[] trPoke, bool ORAS)
{
using (BinaryReader br = new BinaryReader(new MemoryStream(trData)))
{
isORAS = ORAS;
Format = ORAS ? br.ReadUInt16() : br.ReadByte();
Class = ORAS ? br.ReadUInt16() : br.ReadByte();
if (ORAS) uORAS = br.ReadUInt16();
Item = ((Format >> 1) & 1) == 1;
Moves = (Format & 1) == 1;
BattleType = br.ReadByte();
NumPokemon = br.ReadByte();
for (int i = 0; i < 4; i++)
Items[i] = br.ReadUInt16();
AI = br.ReadByte();
u1 = br.ReadByte();
u2 = br.ReadByte();
u3 = br.ReadByte();
Healer = br.ReadByte() != 0;
Money = br.ReadByte();
Prize = br.ReadUInt16();
// Fetch Team
Team = new Pokemon[NumPokemon];
byte[][] TeamData = new byte[NumPokemon][];
int dataLen = trPoke.Length / NumPokemon;
for (int i = 0; i < TeamData.Length; i++)
TeamData[i] = trPoke.Skip(i * dataLen).Take(dataLen).ToArray();
for (int i = 0; i < NumPokemon; i++)
Team[i] = new Pokemon(TeamData[i], Item, Moves);
}
}
public byte[] Write()
{
using (MemoryStream ms = new MemoryStream())
using (BinaryWriter bw = new BinaryWriter(ms))
{
Format = Convert.ToByte(Moves) + (Convert.ToByte(Item) << 1);
if (isORAS)
{ bw.Write((ushort)Format); bw.Write((ushort)Class); bw.Write((ushort)0); }
else
{ bw.Write((byte)Format); bw.Write((byte)Class); }
bw.Write(BattleType);
bw.Write(NumPokemon);
bw.Write(Items[0]);
bw.Write(Items[1]);
bw.Write(Items[2]);
bw.Write(Items[3]);
bw.Write(AI);
bw.Write(u1);
bw.Write(u2);
bw.Write(u3);
bw.Write(Convert.ToByte(Healer));
bw.Write(Money);
bw.Write(Prize);
return ms.ToArray();
}
}
public byte[] WriteTeam()
{
return Team.Aggregate(new byte[0], (i, pkm) => i.Concat(pkm.Write(Item, Moves)).ToArray());
}
public class Pokemon
{
public byte IVs;
public byte PID;
public ushort Level;
public ushort Species;
public ushort Form;
public int Ability;
public int Gender;
public int uBit;
public ushort Item;
public ushort[] Moves = new ushort[4];
public Pokemon(byte[] data, bool HasItem, bool HasMoves)
{
using (BinaryReader br = new BinaryReader(new MemoryStream(data)))
{
IVs = br.ReadByte();
PID = br.ReadByte();
Level = br.ReadUInt16();
Species = br.ReadUInt16();
Form = br.ReadUInt16();
Ability = PID >> 4;
Gender = PID & 3;
uBit = (PID >> 3) & 1;
if (HasItem)
Item = br.ReadUInt16();
if (HasMoves)
for (int i = 0; i < 4; i++)
Moves[i] = br.ReadUInt16();
}
}
public byte[] Write(bool HasItem, bool HasMoves)
{
using (MemoryStream ms = new MemoryStream())
using (BinaryWriter bw = new BinaryWriter(ms))
{
bw.Write(IVs);
PID = (byte)(((Ability & 0xF) << 4) | ((uBit & 1) << 3) | (Gender & 0x7));
bw.Write(PID);
bw.Write(Level);
bw.Write(Species);
bw.Write(Form);
if (HasItem)
bw.Write(Item);
if (HasMoves)
foreach (ushort Move in Moves)
bw.Write(Move);
return ms.ToArray();
}
}
}
}
}