public static void Save(BinaryWriter writer, SavedAnimGoal goal)
 {
     // TODO: This should use a hard coded translation table to protect against changes in the enum ordinals
     writer.WriteInt32((int)goal.Type);
     writer.WriteFrozenObjRef(goal.Self);
     writer.WriteFrozenObjRef(goal.Target);
     writer.WriteFrozenObjRef(goal.Block);
     writer.WriteFrozenObjRef(goal.Scratch);
     writer.WriteFrozenObjRef(goal.Parent);
     writer.WriteTileLocation(goal.TargetTile);
     writer.WriteTileLocation(goal.Range);
     writer.WriteInt32(goal.AnimId);
     writer.WriteInt32(goal.AnimIdPrevious);
     writer.WriteInt32(goal.AnimData);
     writer.WriteInt32(goal.SpellData);
     writer.WriteInt32(goal.SkillData);
     writer.WriteInt32(goal.FlagsData);
     writer.WriteInt32(goal.ScratchVal1);
     writer.WriteInt32(goal.ScratchVal2);
     writer.WriteInt32(goal.ScratchVal3);
     writer.WriteInt32(goal.ScratchVal4);
     writer.WriteInt32(goal.ScratchVal5);
     writer.WriteInt32(goal.ScratchVal6);
     writer.WriteInt32(goal.SoundHandle);
     // I believe one will always be written as -1, while the other is transient data
     writer.WriteInt32(goal.SoundStreamId);
     writer.WriteInt32(goal.SoundStreamId2);
 }
    public static SavedAnimGoal Load(BinaryReader reader)
    {
        var result     = new SavedAnimGoal();
        var goalTypeId = reader.ReadInt32();

        // TODO: This should use a hard coded translation table to protect against changes in the enum ordinals
        result.Type = (AnimGoalType)goalTypeId;

        // Load goal parameters
        result.Self           = reader.ReadFrozenObjRef();
        result.Target         = reader.ReadFrozenObjRef();
        result.Block          = reader.ReadFrozenObjRef();
        result.Scratch        = reader.ReadFrozenObjRef();
        result.Parent         = reader.ReadFrozenObjRef();
        result.TargetTile     = reader.ReadTileLocation();
        result.Range          = reader.ReadTileLocation();
        result.AnimId         = reader.ReadInt32();
        result.AnimIdPrevious = reader.ReadInt32();
        result.AnimData       = reader.ReadInt32();
        result.SpellData      = reader.ReadInt32();
        result.SkillData      = reader.ReadInt32();
        result.FlagsData      = reader.ReadInt32();
        result.ScratchVal1    = reader.ReadInt32();
        result.ScratchVal2    = reader.ReadInt32();
        result.ScratchVal3    = reader.ReadInt32();
        result.ScratchVal4    = reader.ReadInt32();
        result.ScratchVal5    = reader.ReadInt32();
        result.ScratchVal6    = reader.ReadInt32();
        result.SoundHandle    = reader.ReadInt32();
        // I believe one will always be written as -1, while the other is transient data
        result.SoundStreamId  = reader.ReadInt32();
        result.SoundStreamId2 = reader.ReadInt32();

        return(result);
    }