pk3DS/pk3DS.Core/Structures/Gen6/Move6.cs
2017-09-09 21:34:43 -07:00

120 lines
3.8 KiB
C#

using System;
using System.IO;
namespace pk3DS.Core.Structures
{
public class Move
{
public byte Type, Quality, Category, Power, Accuracy, PP, Priority, InflictPercent,
HitMin, HitMax, TurnMin, TurnMax, CritStage, Flinch, Recoil, Targeting,
Stat1, Stat2, Stat3,
Stat1Stage, Stat2Stage, Stat3Stage,
Stat1Percent, Stat2Percent, Stat3Percent;
public Heal Healing;
public ushort Inflict, Effect;
public byte _0xB, _0x1E, _0x1F, _0x20, _0x21;
public Move(byte[] data)
{
Type = data[0];
Quality = data[1];
Category = data[2];
Power = data[3];
Accuracy = data[4];
PP = data[5];
Priority = data[6];
HitMin = (byte)(data[7] & 0xF);
HitMax = (byte)(data[7] >> 4);
Inflict = BitConverter.ToUInt16(data, 0x8);
InflictPercent = data[0xA];
_0xB = data[0xB];
TurnMin = data[0xC];
TurnMax = data[0xD];
CritStage = data[0xE];
Flinch = data[0xF];
Effect = BitConverter.ToUInt16(data, 0x10);
Recoil = data[0x12];
Healing = new Heal(data[0x13]);
Targeting = data[0x14];
Stat1 = data[0x15];
Stat2 = data[0x16];
Stat3 = data[0x17];
Stat1Stage = data[0x18];
Stat2Stage = data[0x19];
Stat3Stage = data[0x1A];
Stat1Percent = data[0x1B];
Stat2Percent = data[0x1C];
Stat3Percent = data[0x1D];
_0x1E = data[0x1E];
_0x1F = data[0x1F];
_0x20 = data[0x20];
_0x21 = data[0x21];
}
public byte[] Write()
{
using (MemoryStream ms = new MemoryStream())
using (BinaryWriter bw = new BinaryWriter(ms))
{
bw.Write(Type);
bw.Write(Quality);
bw.Write(Category);
bw.Write(Power);
bw.Write(Accuracy);
bw.Write(PP);
bw.Write(Priority);
bw.Write((byte)(HitMin | (HitMax << 4)));
bw.Write(Inflict);
bw.Write(InflictPercent);
bw.Write(_0xB);
bw.Write(TurnMin);
bw.Write(TurnMax);
bw.Write(CritStage);
bw.Write(Flinch);
bw.Write(Effect);
bw.Write(Recoil);
bw.Write(Healing.Write());
bw.Write(Targeting);
bw.Write(Stat1);
bw.Write(Stat2);
bw.Write(Stat3);
bw.Write(Stat1Stage);
bw.Write(Stat2Stage);
bw.Write(Stat3Stage);
bw.Write(Stat1Percent);
bw.Write(Stat2Percent);
bw.Write(Stat3Percent);
bw.Write(_0x1E);
bw.Write(_0x1F);
bw.Write(_0x20);
bw.Write(_0x21);
return ms.ToArray();
}
}
public class Heal
{
public byte Val;
public bool Full, Half, Quarter, Value;
public Heal(byte val)
{
Val = val;
Full = Val == 0xFF;
Half = Val == 0xFE;
Quarter = Val == 0xFD;
Value = Val < 0xFD;
}
public byte Write()
{
if (Value)
return Val;
if (Full)
return 0xFF;
if (Half)
return 0xFE;
if (Quarter)
return 0xFD;
return Val;
}
}
}
}