protected internal override void OnRebuild(VoidPtr address, int length, bool force) { bint *addr = (bint *)address; foreach (MoveDefIndexNode b in Children) { b._entryOffset = addr; *addr++ = b.ItemIndex; } FDefListOffset *header = (FDefListOffset *)addr; _entryOffset = header; if (Children.Count > 0) { header->_startOffset = (int)address - (int)_rebuildBase; _lookupOffsets.Add((int)header->_startOffset.Address - (int)_rebuildBase); } header->_listCount = Children.Count; }
public override void OnRebuild(VoidPtr address, int length, bool force) { VoidPtr addr = address; foreach (MoveDefHitDataListNode p in Children) { if (!p.External) { p.Rebuild(addr, p._calcSize, true); addr += p._calcSize; } } _entryOffset = addr; FDefListOffset *header = (FDefListOffset *)addr; foreach (MoveDefHitDataListNode d in Children) { (&header[d.offsetID])->_listCount = d.Children.Count; (&header[d.offsetID])->_startOffset = (int)d._entryOffset - (int)_rebuildBase; _lookupOffsets.Add((&header[d.offsetID])->_startOffset.Address - (int)_rebuildBase); } }
public override void OnRebuild(VoidPtr address, int length, bool force) { _lookupOffsets = new List <int>(); int mainOff = 0, defOff = 0, offOff = 0, swtchOff = 0, grpOff = 0; foreach (MoveDefModelVisRefNode r in Children) { defOff += 4; foreach (MoveDefBoneSwitchNode b in r.Children) { offOff += 8; if (b.defaultGroup >= 0) { mainOff += 8; } foreach (MoveDefModelVisGroupNode o in b.Children) { swtchOff += 8; grpOff += o.Children.Count * 4; } } } //bones //groups //switches //offsets //defaults //header bint * boneAddr = (bint *)address; FDefListOffset * groupLists = (FDefListOffset *)((VoidPtr)boneAddr + grpOff); FDefListOffset * switchLists = (FDefListOffset *)((VoidPtr)groupLists + swtchOff); bint * offsets = (bint *)((VoidPtr)switchLists + offOff); FDefModelDisplayDefaults *defaults = (FDefModelDisplayDefaults *)((VoidPtr)offsets + defOff); FDefModelDisplay * header = (FDefModelDisplay *)((VoidPtr)defaults + mainOff); _entryOffset = header; header->_entryOffset = (int)offsets - (int)_rebuildBase; _lookupOffsets.Add((int)header->_entryOffset.Address - (int)_rebuildBase); header->_entryCount = Children[0].Children.Count; //Children 1 child count will be the same int defCount = 0; foreach (MoveDefModelVisRefNode r in Children) { r._entryOffset = offsets; if (r.Children.Count > 0) { *offsets = (int)switchLists - (int)_rebuildBase; _lookupOffsets.Add((int)offsets - (int)_rebuildBase); } offsets++; foreach (MoveDefBoneSwitchNode b in r.Children) { b._entryOffset = switchLists; if (b.defaultGroup >= 0) { defCount++; defaults->_switchIndex = b.Index; (defaults++)->_defaultGroup = b.defaultGroup; } switchLists->_listCount = b.Children.Count; if (b.Children.Count > 0) { switchLists->_startOffset = (int)groupLists - (int)_rebuildBase; _lookupOffsets.Add((int)switchLists->_startOffset.Address - (int)_rebuildBase); } else { switchLists->_startOffset = 0; } switchLists++; foreach (MoveDefModelVisGroupNode o in b.Children) { o._entryOffset = groupLists; groupLists->_listCount = o.Children.Count; if (o.Children.Count > 0) { groupLists->_startOffset = (int)boneAddr - (int)_rebuildBase; _lookupOffsets.Add((int)groupLists->_startOffset.Address - (int)_rebuildBase); } else { groupLists->_startOffset = 0; } groupLists++; foreach (MoveDefBoneIndexNode bone in o.Children) { bone._entryOffset = boneAddr; *boneAddr++ = bone.boneIndex; } } } } if (defCount > 0) { header->_defaultsOffset = (int)offsets - (int)_rebuildBase; _lookupOffsets.Add((int)header->_defaultsOffset.Address - (int)_rebuildBase); } else { header->_defaultsOffset = 0; } header->_defaultsCount = defCount; }
protected internal override void OnRebuild(VoidPtr address, int length, bool force) { VoidPtr addr = address; foreach (MoveDefArticleNode b in Children) { b._buildHeader = false; b.Rebuild(addr, b._childLength, true); addr += b._childLength; } VoidPtr start = addr; foreach (MoveDefArticleNode b in Children) { b._entryOffset = addr; Article *article = (Article *)addr; article->_id = b.id; article->_boneID = b.bone; article->_arcGroup = b.group; article->_actionsStart = b.aStart; article->_actionFlagsStart = b.aFlags; article->_subactionFlagsStart = b.sFlags; article->_subactionMainStart = b.sMStart; article->_subactionGFXStart = b.sGStart; article->_subactionSFXStart = b.sSStart; article->_modelVisibility = b.visStart; article->_collisionData = b.off1; article->_unknownD2 = b.off2; article->_unknownD3 = b.off3; bint *ext = (bint *)((VoidPtr)article + 52); ext[0] = (b.subActions == null ? 0 : b.subActions.Children.Count); //Add all header offsets bint *off = (bint *)(addr + 12); for (int i = 0; i < 10 + b._extraOffsets.Count; i++) { if (off[i] > 1480 && off[i] < Root.dataSize) { b._lookupOffsets.Add((int)&off[i] - (int)_rebuildBase); } } _lookupOffsets.AddRange(b._lookupOffsets); addr += b._entryLength; } FDefListOffset *header = (FDefListOffset *)addr; _entryOffset = header; if (Children.Count > 0) { header->_startOffset = (int)start - (int)_rebuildBase; _lookupOffsets.Add((int)header->_startOffset.Address - (int)_rebuildBase); } header->_listCount = Children.Count; }