public static OBL_File Parse(byte[] bytes) { OBL_File oblFile = new OBL_File(); int lobbyCount = BitConverter.ToInt32(bytes, 8); int battleCount = BitConverter.ToInt32(bytes, 12); int questCount = BitConverter.ToInt32(bytes, 16); int hcCount = BitConverter.ToInt32(bytes, 20); //Validate the file size if (32 + (20 * lobbyCount) + (20 * battleCount) + (20 * questCount) + (20 * hcCount) != bytes.Length) { throw new InvalidDataException("OBL parse failed. File size validation failed!"); } //Calculate offsets int lobbyOffset = 32; int battleOffset = lobbyOffset + (20 * lobbyCount); int questOffset = battleOffset + (20 * battleCount); int hcOffset = questOffset + (20 * questCount); //Read data oblFile.LobbyCues = OBL_Cue.ReadAll(bytes, lobbyOffset, lobbyCount); oblFile.BattleCues = OBL_Cue.ReadAll(bytes, battleOffset, battleCount); oblFile.QuestCues = OBL_Cue.ReadAll(bytes, questOffset, questCount); oblFile.HeroColosseumCues = OBL_Cue.ReadAll(bytes, hcOffset, hcCount); return(oblFile); }
public byte[] Write() { List <byte> bytes = new List <byte>(); //Header bytes.AddRange(BitConverter.GetBytes((uint)1279414051)); //signature bytes.AddRange(BitConverter.GetBytes((ushort)65534)); //endianness bytes.AddRange(BitConverter.GetBytes((ushort)32)); //header size bytes.AddRange(BitConverter.GetBytes((uint)LobbyCues.Count)); bytes.AddRange(BitConverter.GetBytes((uint)BattleCues.Count)); bytes.AddRange(BitConverter.GetBytes((uint)QuestCues.Count)); bytes.AddRange(BitConverter.GetBytes((uint)HeroColosseumCues.Count)); bytes.AddRange(new byte[8]); //Padding? //Entries bytes.AddRange(OBL_Cue.WriteAll(LobbyCues)); bytes.AddRange(OBL_Cue.WriteAll(BattleCues)); bytes.AddRange(OBL_Cue.WriteAll(QuestCues)); bytes.AddRange(OBL_Cue.WriteAll(HeroColosseumCues)); //Validate the file size if (32 + (20 * LobbyCues.Count) + (20 * BattleCues.Count) + (20 * QuestCues.Count) + (20 * HeroColosseumCues.Count) != bytes.Count) { throw new InvalidDataException("OBL rebuild failed. File size validation failed!"); } return(bytes.ToArray()); }