示例#1
0
        protected internal override void PostProcess(VoidPtr bresAddress, VoidPtr dataAddress, int dataLength, StringTable stringTable)
        {
            base.PostProcess(bresAddress, dataAddress, dataLength, stringTable);

            PAT0v3 *header = (PAT0v3 *)dataAddress;

            if (_version == 4)
            {
                ((PAT0v4 *)dataAddress)->ResourceStringAddress = stringTable[Name] + 4;
            }
            else
            {
                header->ResourceStringAddress = stringTable[Name] + 4;
            }

            ResourceGroup *group = header->Group;

            group->_first = new ResourceEntry(0xFFFF, 0, 0, 0, 0);
            ResourceEntry *rEntry = group->First;

            int index = 1;

            foreach (PAT0EntryNode n in Children)
            {
                dataAddress = (VoidPtr)group + (rEntry++)->_dataOffset;
                ResourceEntry.Build(group, index++, dataAddress, (BRESString *)stringTable[n.Name]);
                n.PostProcess(dataAddress, stringTable);
            }

            int   i       = 0;
            bint *strings = header->TexFile;

            for (i = 0; i < _textureFiles.Count; i++)
            {
                if (!String.IsNullOrEmpty(_textureFiles[i]))
                {
                    strings[i] = (int)stringTable[_textureFiles[i]] + 4 - (int)strings;
                }
            }

            strings = header->PltFile;

            for (i = 0; i < _paletteFiles.Count; i++)
            {
                if (!String.IsNullOrEmpty(_paletteFiles[i]))
                {
                    strings[i] = (int)stringTable[_paletteFiles[i]] + 4 - (int)strings;
                }
            }
        }
示例#2
0
        protected override bool OnInitialize()
        {
            base.OnInitialize();

            _textureFiles.Clear();
            _paletteFiles.Clear();

            _version = Header->_version;

            int texPtr, pltPtr;

            if (_version == 4)
            {
                PAT0v4 *header = Header4;
                _frameCount = header->_numFrames;
                _loop       = header->_loop;
                texPtr      = header->_numTexPtr;
                pltPtr      = header->_numPltPtr;
                if ((_name == null) && (header->_stringOffset != 0))
                {
                    _name = header->ResourceString;
                }
            }
            else
            {
                PAT0v3 *header = Header3;
                _frameCount = header->_numFrames;
                _loop       = header->_loop;
                texPtr      = header->_numTexPtr;
                pltPtr      = header->_numPltPtr;
                if ((_name == null) && (header->_stringOffset != 0))
                {
                    _name = header->ResourceString;
                }
            }

            //Get texture strings
            for (int i = 0; i < texPtr; i++)
            {
                _textureFiles.Add(Header3->GetTexStringEntry(i));
            }

            //Get palette strings
            for (int i = 0; i < pltPtr; i++)
            {
                _paletteFiles.Add(Header3->GetPltStringEntry(i));
            }

            return(Header3->Group->_numEntries > 0);
        }
示例#3
0
        public override void OnRebuild(VoidPtr address, int length, bool force)
        {
            //Set header values
            if (_version == 4)
            {
                PAT0v4 *header = (PAT0v4 *)address;
                header->_header._tag     = PAT0v4.Tag;
                header->_header._version = 4;
                header->_dataOffset      = PAT0v4.Size;
                header->_userDataOffset  = header->_origPathOffset = 0;
                header->_numFrames       = (ushort)_numFrames;
                header->_numEntries      = (ushort)Children.Count;
                header->_numTexPtr       = (ushort)_textureFiles.Count;
                header->_numPltPtr       = (ushort)_paletteFiles.Count;
                header->_loop            = _loop ? 1 : 0;
            }
            else
            {
                PAT0v3 *header = (PAT0v3 *)address;
                header->_header._tag     = PAT0v3.Tag;
                header->_header._version = 3;
                header->_dataOffset      = PAT0v3.Size;
                header->_origPathOffset  = 0;
                header->_numFrames       = (ushort)_numFrames;
                header->_numEntries      = (ushort)Children.Count;
                header->_numTexPtr       = (ushort)_textureFiles.Count;
                header->_numPltPtr       = (ushort)_paletteFiles.Count;
                header->_loop            = _loop ? 1 : 0;
            }

            PAT0v3 *commonHeader = (PAT0v3 *)address;

            //Now set header values that are in the same spot between versions

            //Set offsets
            commonHeader->_texTableOffset = length - (_textureFiles.Count + _paletteFiles.Count) * 8;
            commonHeader->_pltTableOffset = commonHeader->_texTableOffset + _textureFiles.Count * 4;

            //Set pointer offsets
            int offset = length - _textureFiles.Count * 4 - _paletteFiles.Count * 4;

            commonHeader->_texPtrTableOffset = offset;
            commonHeader->_pltPtrTableOffset = offset + _textureFiles.Count * 4;

            //Set pointers
            bint *ptr = (bint *)(commonHeader->Address + commonHeader->_texPtrTableOffset);

            for (int i = 0; i < _textureFiles.Count; i++)
            {
                *ptr++ = 0;
            }
            ptr = (bint *)(commonHeader->Address + commonHeader->_pltPtrTableOffset);
            for (int i = 0; i < _paletteFiles.Count; i++)
            {
                *ptr++ = 0;
            }

            ResourceGroup *group = commonHeader->Group;

            *group = new ResourceGroup(Children.Count);

            VoidPtr        entryAddress = group->EndAddress;
            VoidPtr        dataAddress  = entryAddress;
            ResourceEntry *rEntry       = group->First;

            foreach (PAT0EntryNode n in Children)
            {
                dataAddress += n._entryLen;
            }
            foreach (PAT0EntryNode n in Children)
            {
                foreach (PAT0TextureNode t in n.Children)
                {
                    n._dataAddrs[t.Index] = dataAddress;
                    if (n._dataLens[t.Index] != -1)
                    {
                        dataAddress += n._dataLens[t.Index];
                    }
                }
            }

            foreach (PAT0EntryNode n in Children)
            {
                (rEntry++)->_dataOffset = (int)entryAddress - (int)group;

                n.Rebuild(entryAddress, n._entryLen, true);
                entryAddress += n._entryLen;
            }

            if (_userEntries.Count > 0 && _version == 4)
            {
                _userEntries.Write(((PAT0v4 *)address)->UserData = dataAddress);
            }
        }
示例#4
0
        public override bool OnInitialize()
        {
            base.OnInitialize();

            _textureFiles.Clear();
            _paletteFiles.Clear();

            int texPtr, pltPtr;

            if (_version == 4)
            {
                PAT0v4 *header = Header4;
                _numFrames = header->_numFrames;
                _loop      = header->_loop != 0;
                texPtr     = header->_numTexPtr;
                pltPtr     = header->_numPltPtr;
                if ((_name == null) && (header->_stringOffset != 0))
                {
                    _name = header->ResourceString;
                }

                if (header->_origPathOffset > 0)
                {
                    _originalPath = header->OrigPath;
                }

                (_userEntries = new UserDataCollection()).Read(header->UserData);

                //Get texture strings
                for (int i = 0; i < texPtr; i++)
                {
                    _textureFiles.Add(header->GetTexStringEntry(i));
                }

                //Get palette strings
                for (int i = 0; i < pltPtr; i++)
                {
                    _paletteFiles.Add(header->GetPltStringEntry(i));
                }

                return(header->Group->_numEntries > 0);
            }
            else
            {
                PAT0v3 *header = Header3;
                _numFrames = header->_numFrames;
                _loop      = header->_loop != 0;
                texPtr     = header->_numTexPtr;
                pltPtr     = header->_numPltPtr;

                if ((_name == null) && (header->_stringOffset != 0))
                {
                    _name = header->ResourceString;
                }

                if (header->_origPathOffset > 0)
                {
                    _originalPath = header->OrigPath;
                }

                //Get texture strings
                for (int i = 0; i < texPtr; i++)
                {
                    _textureFiles.Add(header->GetTexStringEntry(i));
                }

                //Get palette strings
                for (int i = 0; i < pltPtr; i++)
                {
                    _paletteFiles.Add(header->GetPltStringEntry(i));
                }

                return(header->Group->_numEntries > 0);
            }
        }