public override void OnRebuild(VoidPtr address, int size, bool force) { BRESHeader *header = (BRESHeader *)address; *header = new BRESHeader(size, _numEntries + 1); ROOTHeader *rootHeader = header->First; *rootHeader = new ROOTHeader(_rootSize, Children.Count); ResourceGroup *pMaster = &rootHeader->_master; ResourceGroup *rGroup = (ResourceGroup *)pMaster->EndAddress; //Write string table _stringTable.WriteTable(address + _strOffset); VoidPtr dataAddr = (VoidPtr)rootHeader + _rootSize; int gIndex = 1; foreach (BRESGroupNode g in Children) { ResourceEntry.Build(pMaster, gIndex++, rGroup, (BRESString *)_stringTable[g.Name]); *rGroup = new ResourceGroup(g.Children.Count); ResourceEntry *nEntry = rGroup->First; int rIndex = 1; foreach (BRESEntryNode n in g.Children) { //Align data dataAddr = ((int)dataAddr).Align(n.DataAlign); ResourceEntry.Build(rGroup, rIndex++, dataAddr, (BRESString *)_stringTable[n.Name]); //Rebuild entry int len = n._calcSize; n.Rebuild(dataAddr, len, force); n.PostProcess(address, dataAddr, len, _stringTable); dataAddr += len; } g._changed = false; //Advance to next group rGroup = (ResourceGroup *)rGroup->EndAddress; } _stringTable.Clear(); }
public ResourceEntry *GetRootEntry() { VoidPtr addr = Address; BRESHeader * header = BRESHeader; ResourceGroup *master = &header->First->_master; for (int i = 0; i < master->_numEntries; i++) { ResourceGroup *group = (ResourceGroup *)master->First[i].DataAddress; for (int y = 0; y < group->_numEntries; y++) { if (addr == group->First[y].DataAddress) { return(&group->First[y]); } } } return(null); }