Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
 /// <summary>
 /// Set variable as ScriptVarType.Undefined.
 /// </summary>
 public void SetUndefined()
 {
     Type = ScriptVarType.Undefined;
 }