//To do //protected override int OnCalculateSize(bool force) //{ // int size = SCN0.Size + 0x18 + (Children.Count * 0x10); // foreach (SCN0GroupNode n in Children) // foreach(SCN0EntryNode e in n.Children) // size += e.CalculateSize(force); // return size; //} protected internal override void PostProcess(VoidPtr bresAddress, VoidPtr dataAddress, int dataLength, StringTable stringTable) { base.PostProcess(bresAddress, dataAddress, dataLength, stringTable); SCN0 *header = (SCN0 *)dataAddress; 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 (SCN0GroupNode n in Children) { dataAddress = (VoidPtr)group + (rEntry++)->_dataOffset; ResourceEntry.Build(group, index++, dataAddress, (BRESString *)stringTable[n.Name]); n.PostProcess(dataAddress, stringTable); } }
protected internal override void OnRebuild(VoidPtr address, int length, bool force) { int GroupLen = 0, LightSetLen = 0, AmbLightSetLen = 0, LightLen = 0, FogLen = 0, CameraLen = 0; SCN0 *header = (SCN0 *)address; header->_unk1 = _unk1; header->_frameCount = (short)_unk2; header->_unk3 = (short)_unk3; header->_unk4 = _unk4; header->_unk10 = (short)_unk10; header->_dataOffset = SCN0.Size; ResourceGroup *group = header->Group; *group = new ResourceGroup(Children.Count); GroupLen = group->_totalSize; ResourceEntry *entry = group->First; VoidPtr groupAddress = group->EndAddress; VoidPtr entryAddress = groupAddress; foreach (SCN0GroupNode g in Children) { entryAddress += g._groupLen; } VoidPtr keyframeAddress = entryAddress; foreach (SCN0GroupNode g in Children) { foreach (SCN0EntryNode e in g.Children) { e.scn0Addr = header; keyframeAddress += e._length; } } VoidPtr lightArrayAddress = keyframeAddress; foreach (SCN0GroupNode g in Children) { foreach (SCN0EntryNode e in g.Children) { lightArrayAddress += e.keyLen; } } header->_lightSetCount = 0; header->_ambientCount = 0; header->_lightCount = 0; header->_fogCount = 0; header->_cameraCount = 0; foreach (SCN0GroupNode g in Children) { if (g._name == "LightSet(NW4R)") { LightSetLen = g._entryLen; header->_lightSetCount = (short)g.Children.Count; } else if (g._name == "AmbLights(NW4R)") { AmbLightSetLen = g._entryLen; header->_ambientCount = (short)g.Children.Count; } else if (g._name == "Lights(NW4R)") { LightLen = g._entryLen; header->_lightCount = (short)g.Children.Count; } else if (g._name == "Fogs(NW4R)") { FogLen = g._entryLen; header->_fogCount = (short)g.Children.Count; } else if (g._name == "Cameras(NW4R)") { CameraLen = g._entryLen; header->_cameraCount = (short)g.Children.Count; } (entry++)->_dataOffset = (int)groupAddress - (int)group; g._dataAddr = entryAddress; g.keyframeAddress = keyframeAddress; g.lightArrayAddress = lightArrayAddress; g.Rebuild(groupAddress, g._groupLen, true); groupAddress += g._groupLen; GroupLen += g._groupLen; entryAddress += g._entryLen; keyframeAddress += g.keyLen; lightArrayAddress += g.lightLen; } header->Set(GroupLen, LightSetLen, AmbLightSetLen, LightLen, FogLen, CameraLen); }