public static EnumFile Decode(byte[] data) { var file = new EnumFile(); using var dataStream = new MemoryStream(data); using var dataReader = new BinaryReader(dataStream); var ended = false; while (dataStream.Position < dataStream.Length && !ended) { var opcode = (Opcode)dataReader.ReadByte(); switch (opcode) { case Opcode.CharKeyType: file.KeyType = ScriptVarType.FromValue(dataReader.ReadAwkwardChar()); break; case Opcode.CharValueType: file.ValueType = ScriptVarType.FromValue(dataReader.ReadAwkwardChar()); break; case Opcode.DefaultString: file.DefaultString = dataReader.ReadNullTerminatedString(); break; case Opcode.DefaultInteger: file.DefaultInteger = dataReader.ReadInt32BigEndian(); break; case Opcode.StringDataDictionary: case Opcode.IntegerDataDictionary: var count = dataReader.ReadUInt16BigEndian(); file.Values = new Dictionary <int, object>(count); for (var i = 0; i < count; i++) { var key = dataReader.ReadInt32BigEndian(); object value; if (opcode == Opcode.StringDataDictionary) { value = dataReader.ReadNullTerminatedString(); } else { value = dataReader.ReadInt32BigEndian(); } file.Values[key] = value; } break; case Opcode.StringDataArray: case Opcode.IntegerDataArray: var max = dataReader.ReadUInt16BigEndian(); count = dataReader.ReadUInt16BigEndian(); file.Values = new Dictionary <int, object>(count); for (var i = 0; i < count; i++) { var key = dataReader.ReadUInt16BigEndian(); if (opcode == Opcode.StringDataArray) { file.Values[key] = dataReader.ReadNullTerminatedString(); } else { file.Values[key] = dataReader.ReadInt32BigEndian(); } } break; case Opcode.ByteKeyType: file.KeyType = ScriptVarType.FromValue(dataReader.ReadAwkwardShort()); break; case Opcode.ByteValueType: file.ValueType = ScriptVarType.FromValue(dataReader.ReadAwkwardShort()); break; case Opcode.End: ended = true; break; default: throw new DecodeException($"Invalid enum opcode \"{opcode}\"."); } } if (file.KeyType == null) { throw new DecodeException("Enum data does not contain a key type."); } if (file.ValueType == null) { throw new DecodeException("Enum data does not contain a value type."); } if (file.Values == null) { throw new DecodeException("Enum does not contain any values."); } if (dataStream.Position < dataStream.Length) { throw new DecodeException($"Input data not fully consumed while decoding enum file. {dataStream.Length - dataStream.Position} bytes remain."); } return(file); }
/// <summary> /// Set variable as ScriptVarType.Undefined. /// </summary> public void SetUndefined() { Type = ScriptVarType.Undefined; }