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; } } }
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); }
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); } }
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); } }