Skip to content

Commit

Permalink
Update ESFRecord with full ESF Spec
Browse files Browse the repository at this point in the history
  • Loading branch information
Septharoth committed Mar 13, 2022
1 parent 161609e commit b1cab3d
Showing 1 changed file with 83 additions and 7 deletions.
90 changes: 83 additions & 7 deletions EOLib.IO/Pub/ESFRecord.cs
@@ -1,4 +1,4 @@
using System;
using System;
using System.IO;
using System.Linq;
using System.Reflection;
Expand Down Expand Up @@ -26,15 +26,40 @@ public class ESFRecord : IPubRecord

public byte CastTime { get; set; }

public byte UnkA { get; set; }
public byte UnkB { get; set; }

public SpellType Type { get; set; }

public byte UnkC { get; set; }
public short UnkD { get; set; }

public SpellTargetRestrict TargetRestrict { get; set; }
public SpellTarget Target { get; set; }

public byte UnkE { get; set; }
public byte UnkF { get; set; }
public short UnkG { get; set; }

public short MinDam { get; set; }
public short MaxDam { get; set; }
public short Accuracy { get; set; }

public short UnkH { get; set; }
public short UnkI { get; set; }
public byte UnkJ { get; set; }

public short HP { get; set; }

public short UnkK { get; set; }
public byte UnkL { get; set; }
public short UnkM { get; set; }
public short UnkN { get; set; }
public short UnkO { get; set; }
public short UnkP { get; set; }
public short UnkQ { get; set; }
public short UnkR { get; set; }

public TValue Get<TValue>(PubRecordProperty type)
{
var name = Enum.GetName(type.GetType(), type) ?? "";
Expand Down Expand Up @@ -71,20 +96,39 @@ public byte[] SerializeToByteArray(INumberEncoderService numberEncoderService)
mem.Write(numberEncoderService.EncodeNumber(SP, 2), 0, 2);
mem.WriteByte(numberEncoderService.EncodeNumber(CastTime, 1)[0]);

mem.Seek(13 + Name.Length + Shout.Length, SeekOrigin.Begin);
mem.WriteByte(numberEncoderService.EncodeNumber((byte)Type, 1)[0]);
mem.WriteByte(numberEncoderService.EncodeNumber(UnkA, 1)[0]);
mem.WriteByte(numberEncoderService.EncodeNumber(UnkB, 1)[0]);

mem.Write(numberEncoderService.EncodeNumber((byte)Type, 3), 0, 3); //This is documented as a 3 byte int.

mem.WriteByte(numberEncoderService.EncodeNumber(UnkC, 1)[0]);
mem.Write(numberEncoderService.EncodeNumber(UnkD, 2), 0, 2);

mem.Seek(19 + Name.Length + Shout.Length, SeekOrigin.Begin);
mem.WriteByte(numberEncoderService.EncodeNumber((byte)TargetRestrict, 1)[0]);
mem.WriteByte(numberEncoderService.EncodeNumber((byte)Target, 1)[0]);

mem.Seek(25 + Name.Length + Shout.Length, SeekOrigin.Begin);
mem.WriteByte(numberEncoderService.EncodeNumber(UnkE, 1)[0]);
mem.WriteByte(numberEncoderService.EncodeNumber(UnkF, 1)[0]);
mem.Write(numberEncoderService.EncodeNumber(UnkG, 2), 0, 2);

mem.Write(numberEncoderService.EncodeNumber(MinDam, 2), 0, 2);
mem.Write(numberEncoderService.EncodeNumber(MaxDam, 2), 0, 2);
mem.Write(numberEncoderService.EncodeNumber(Accuracy, 2), 0, 2);

mem.Seek(36 + Name.Length + Shout.Length, SeekOrigin.Begin);
mem.Write(numberEncoderService.EncodeNumber(UnkH, 2), 0, 2);
mem.Write(numberEncoderService.EncodeNumber(UnkI, 2), 0, 2);
mem.WriteByte(numberEncoderService.EncodeNumber(UnkJ, 1)[0]);

mem.Write(numberEncoderService.EncodeNumber(HP, 2), 0, 2);

mem.Write(numberEncoderService.EncodeNumber(UnkK, 2), 0, 2);
mem.WriteByte(numberEncoderService.EncodeNumber(UnkL, 1)[0]);
mem.Write(numberEncoderService.EncodeNumber(UnkM, 2), 0, 2);
mem.Write(numberEncoderService.EncodeNumber(UnkN, 2), 0, 2);
mem.Write(numberEncoderService.EncodeNumber(UnkO, 2), 0, 2);
mem.Write(numberEncoderService.EncodeNumber(UnkP, 2), 0, 2);
mem.Write(numberEncoderService.EncodeNumber(UnkQ, 2), 0, 2);
mem.Write(numberEncoderService.EncodeNumber(UnkR, 2), 0, 2);
}

return ret;
Expand All @@ -95,20 +139,52 @@ public void DeserializeFromByteArray(byte[] recordBytes, INumberEncoderService n
if (recordBytes.Length != DATA_SIZE)
throw new ArgumentOutOfRangeException(nameof(recordBytes), "Data is not properly sized for correct deserialization");

Console.Write(this.Name + " [");
for (int i = 0; i < recordBytes.Length; i++)
{
Console.Write(recordBytes[i] + "[pos:" + i + "], ");
}
Console.Write("]\n");

Icon = (short)numberEncoderService.DecodeNumber(recordBytes[0], recordBytes[1]);
Graphic = (short)numberEncoderService.DecodeNumber(recordBytes[2], recordBytes[3]);
TP = (short)numberEncoderService.DecodeNumber(recordBytes[4], recordBytes[5]);
SP = (short)numberEncoderService.DecodeNumber(recordBytes[6], recordBytes[7]);
CastTime = (byte)numberEncoderService.DecodeNumber(recordBytes[8]);

Type = (SpellType)numberEncoderService.DecodeNumber(recordBytes[11]);
UnkA = (byte)numberEncoderService.DecodeNumber(recordBytes[9]);
UnkB = (byte)numberEncoderService.DecodeNumber(recordBytes[10]);

Type = (SpellType)numberEncoderService.DecodeNumber(recordBytes[11], recordBytes[12], recordBytes[13]);

UnkC = (byte)numberEncoderService.DecodeNumber(recordBytes[14]);
UnkD = (short)numberEncoderService.DecodeNumber(recordBytes[15], recordBytes[16]);

TargetRestrict = (SpellTargetRestrict)numberEncoderService.DecodeNumber(recordBytes[17]);
Target = (SpellTarget)numberEncoderService.DecodeNumber(recordBytes[18]);

UnkE = (byte)numberEncoderService.DecodeNumber(recordBytes[19]);
UnkF = (byte)numberEncoderService.DecodeNumber(recordBytes[20]);
UnkG = (short)numberEncoderService.DecodeNumber(recordBytes[21], recordBytes[22]);

MinDam = (short)numberEncoderService.DecodeNumber(recordBytes[23], recordBytes[24]);
MaxDam = (short)numberEncoderService.DecodeNumber(recordBytes[25], recordBytes[26]);
Accuracy = (short)numberEncoderService.DecodeNumber(recordBytes[27], recordBytes[28]);

UnkH = (short)numberEncoderService.DecodeNumber(recordBytes[29], recordBytes[30]);
UnkI = (short)numberEncoderService.DecodeNumber(recordBytes[31], recordBytes[32]);
UnkJ = (byte)numberEncoderService.DecodeNumber(recordBytes[33]);

HP = (short)numberEncoderService.DecodeNumber(recordBytes[34], recordBytes[35]);

UnkK = (short)numberEncoderService.DecodeNumber(recordBytes[36], recordBytes[37]);
UnkL = (byte)numberEncoderService.DecodeNumber(recordBytes[38]);
UnkM = (short)numberEncoderService.DecodeNumber(recordBytes[39], recordBytes[40]);
UnkN = (short)numberEncoderService.DecodeNumber(recordBytes[41], recordBytes[42]);
UnkO = (short)numberEncoderService.DecodeNumber(recordBytes[43], recordBytes[44]);
UnkP = (short)numberEncoderService.DecodeNumber(recordBytes[45], recordBytes[46]);
UnkQ = (short)numberEncoderService.DecodeNumber(recordBytes[47], recordBytes[48]);
UnkR = (short)numberEncoderService.DecodeNumber(recordBytes[49], recordBytes[50]);
}
}
}

0 comments on commit b1cab3d

Please sign in to comment.