示例#1
0
        internal static void ParseAssets(BinaryReader reader, MapParseContext context, AssetsParseCallback parseCallback)
        {
            while (reader.BaseStream.Position < context.CurrentEndPosition)
            {
                var assetIndex = reader.ReadUInt32();

                var assetName = context.GetAssetName(assetIndex);

                parseCallback(assetName);
            }
        }
示例#2
0
        internal static AssetPropertyKey Parse(BinaryReader reader, MapParseContext context)
        {
            var propertyType = reader.ReadByteAsEnum <AssetPropertyType>();

            var propertyNameIndex = reader.ReadUInt24();
            var propertyName      = context.GetAssetName(propertyNameIndex);

            return(new AssetPropertyKey
            {
                PropertyType = propertyType,
                Name = propertyName
            });
        }
示例#3
0
        internal static AssetProperty Parse(BinaryReader reader, MapParseContext context)
        {
            var propertyType = reader.ReadByteAsEnum <AssetPropertyType>();

            var propertyNameIndex = reader.ReadUInt24();
            var propertyName      = context.GetAssetName(propertyNameIndex);

            object value = null;

            switch (propertyType)
            {
            case AssetPropertyType.Boolean:
                value = reader.ReadBooleanChecked();
                break;

            case AssetPropertyType.Integer:
                value = reader.ReadUInt32();
                break;

            case AssetPropertyType.RealNumber:
                value = reader.ReadSingle();
                break;

            case AssetPropertyType.AsciiString:
                value = reader.ReadUInt16PrefixedAsciiString();
                break;

            case AssetPropertyType.UnicodeString:
                value = reader.ReadUInt16PrefixedUnicodeString();
                break;

            default:
                throw new InvalidDataException($"Unexpected property type: {propertyType}.");
            }

            return(new AssetProperty
            {
                PropertyType = propertyType,
                Name = propertyName,
                Value = value
            });
        }
示例#4
0
        internal static TDerived Parse(BinaryReader reader, MapParseContext context, ushort minimumVersionThatHasInternalName)
        {
            return(ParseAsset(reader, context, version =>
            {
                var contentType = reader.ReadUInt32AsEnum <TContentType>();

                byte magicValue = 0;
                string internalName = null;
                if (version >= minimumVersionThatHasInternalName)
                {
                    magicValue = reader.ReadByte();
                    if (magicValue != 3)
                    {
                        throw new InvalidDataException();
                    }

                    var internalNameIndex = reader.ReadUInt24();
                    internalName = context.GetAssetName(internalNameIndex);
                }

                var numArguments = reader.ReadUInt32();
                var arguments = new ScriptArgument[numArguments];

                for (var i = 0; i < numArguments; i++)
                {
                    arguments[i] = ScriptArgument.Parse(reader);
                }

                return new TDerived
                {
                    ContentType = contentType,
                    MagicValue = magicValue,
                    InternalName = internalName,
                    Arguments = arguments
                };
            }));
        }