mirror of
https://github.com/kwsch/pk3DS.git
synced 2026-04-13 04:05:54 -05:00
143 lines
4.9 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|