Ejemplo n.º 1
0
        public override IRedHandle <T> ReadCHandle <T>()
        {
            var handle = new CHandle <T>();

            int pointer;

            if (header.version == 2)
            {
                pointer = _reader.ReadInt16();
            }
            else if (header.version == 3 || header.version == 04)
            {
                pointer = _reader.ReadInt32();
            }
            else
            {
                throw new NotImplementedException(nameof(ReadCHandle));
            }

            if (!HandleQueue.ContainsKey(pointer))
            {
                HandleQueue.Add(pointer, new List <IRedBaseHandle>());
            }

            HandleQueue[pointer].Add(handle);

            return(handle);
        }
Ejemplo n.º 2
0
        public override IRedWeakHandle <T> ReadCWeakHandle <T>()
        {
            var handle = new CWeakHandle <T>();

            var pointer = _reader.ReadInt32();

            if (!HandleQueue.ContainsKey(pointer))
            {
                HandleQueue.Add(pointer, new List <IRedBaseHandle>());
            }

            HandleQueue[pointer].Add(handle);

            return(handle);
        }
Ejemplo n.º 3
0
        public EFileReadErrorCodes ReadBuffer(RedBuffer buffer, Type fileRootType)
        {
            _hashService = Locator.Current.GetService <IHashService>();

            var _chunks = new List <RedBaseClass>();

            var result = new Package04();

            _outputFile = result;

            header.version = BaseReader.ReadUInt16();
            if (header.version < 2 || header.version > 4)
            {
                return(EFileReadErrorCodes.UnsupportedVersion);
            }

            header.numSections = _reader.ReadUInt16();
            if (header.numSections < 6 || header.numSections > 7)
            {
                return(EFileReadErrorCodes.UnsupportedVersion);
            }

            result.Version  = header.version;
            result.Sections = header.numSections;

            header.numComponents = _reader.ReadUInt32();

            if (header.numSections == 7)
            {
                header.refPoolDescOffset = _reader.ReadUInt32();
                header.refPoolDataOffset = _reader.ReadUInt32();
            }

            header.namePoolDescOffset = _reader.ReadUInt32();
            header.namePoolDataOffset = _reader.ReadUInt32();

            header.chunkDescOffset = _reader.ReadUInt32();
            header.chunkDataOffset = _reader.ReadUInt32();

            if (header.numSections == 7 && header.refPoolDescOffset != 0)
            {
                return(EFileReadErrorCodes.NoCr2w);
            }

            if (header.refPoolDescOffset != 0)
            {
                return(EFileReadErrorCodes.NoCr2w);
            }

            if (fileRootType == typeof(gamePersistentStateDataResource))
            {
                var numCruids = _reader.ReadUInt32();
                for (var i = 0; i < numCruids; i++)
                {
                    result.RootCruids.Add(_reader.ReadUInt64());
                }
            }
            else if (fileRootType != typeof(inkWidgetLibraryResource))
            {
                result.CruidIndex = _reader.ReadInt16();
                var numCruids = _reader.ReadUInt16();

                for (var i = 0; i < numCruids; i++)
                {
                    result.RootCruids.Add(_reader.ReadUInt64());
                }
            }

            var baseOff = BaseStream.Position;

            // read refs
            var refCount = (header.refPoolDataOffset - header.refPoolDescOffset) / 4;

            BaseStream.Position = baseOff + header.refPoolDescOffset;
            var refDesc = BaseStream.ReadStructs <Package04ImportHeader>(refCount);

            var readAsHash = fileRootType == typeof(appearanceAppearanceResource);

            foreach (var r in refDesc)
            {
                BaseStream.Position = baseOff + r.offset;
                importsList.Add(ReadImport(r, readAsHash));
            }

            // read strings
            var nameCount = (header.namePoolDataOffset - header.namePoolDescOffset) / 4;

            BaseStream.Position = baseOff + header.namePoolDescOffset;
            var nameDesc = BaseStream.ReadStructs <Package04NameHeader>(nameCount);

            foreach (var s in nameDesc)
            {
                BaseStream.Position = baseOff + s.offset;
                _namesList.Add(ReadName(s));
            }

            // read chunks
            var chunkCount = (header.chunkDataOffset - header.chunkDescOffset) / 8;

            BaseStream.Position = baseOff + header.chunkDescOffset;
            var chunkDesc = BaseStream.ReadStructs <Package04ChunkHeader>(chunkCount);

            for (var i = 0; i < chunkDesc.Length; i++)
            {
                _chunks.Add(ReadChunk(chunkDesc[i]));
            }

            var newChunks = new List <RedBaseClass>();

            for (var i = 0; i < _chunks.Count; i++)
            {
                if (!HandleQueue.ContainsKey(i))
                {
                    newChunks.Add(_chunks[i]);
                    continue;
                }

                foreach (var handle in HandleQueue[i])
                {
                    handle.SetValue(_chunks[i]);
                }
            }

            result.Chunks = newChunks;

            buffer.Data = result;

            return(EFileReadErrorCodes.NoError);
        }