public void PostProcess(VoidPtr userDataAddr, StringTable stringTable) { if (Count == 0 || userDataAddr == null) { return; } UserData *data = (UserData *)userDataAddr; ResourceGroup *pGroup = data->Group; ResourceEntry *pEntry = &pGroup->_first; int count = pGroup->_numEntries; (*pEntry++) = new ResourceEntry(0xFFFF, 0, 0, 0, 0); for (int i = 0; i < count; i++) { UserDataEntry *entry = (UserDataEntry *)((byte *)pGroup + (pEntry++)->_dataOffset); if (entry->Type == UserValueType.String && entry->_entryCount > 0) { entry->_dataOffset = (int)((VoidPtr)(stringTable[this[i]._entries[0]] + 4) - (VoidPtr)entry); } ResourceEntry.Build(pGroup, i + 1, entry, (BRESString *)stringTable[this[i]._name]); entry->ResourceStringAddress = stringTable[this[i]._name] + 4; } }
public void Write(VoidPtr userDataAddr) { if (Count == 0 || userDataAddr == null) { return; } UserData *data = (UserData *)userDataAddr; ResourceGroup *pGroup = data->Group; ResourceEntry *pEntry = &pGroup->_first + 1; *pGroup = new ResourceGroup(Count); byte *pData = (byte *)pGroup + pGroup->_totalSize; int id = 0; foreach (UserDataClass s in this) { (pEntry++)->_dataOffset = (int)pData - (int)pGroup; UserDataEntry *p = (UserDataEntry *)pData; *p = new UserDataEntry( s.DataType != UserValueType.String ? s._entries.Count : s._entries.Count > 0 ? 1 : 0, s._type, id++); pData += 0x18; if (s.DataType != UserValueType.String) { for (int i = 0; i < s._entries.Count; i++) { if (s.DataType == UserValueType.Float) { if (!float.TryParse(s._entries[i], out float x)) { x = 0; } *(bfloat *)pData = x; pData += 4; } else if (s.DataType == UserValueType.Int) { if (!int.TryParse(s._entries[i], out int x)) { x = 0; } *(bint *)pData = x; pData += 4; } } } p->_totalLen = (int)pData - (int)p; } data->_totalLen = (int)pData - (int)userDataAddr; }
public void Read(VoidPtr userDataAddr) { if (userDataAddr == null) { return; } UserData * data = (UserData *)userDataAddr; ResourceGroup *group = data->Group; ResourceEntry *pEntry = &group->_first + 1; int count = group->_numEntries; for (int i = 0; i < count; i++, pEntry++) { UserDataEntry *entry = (UserDataEntry *)((VoidPtr)group + pEntry->_dataOffset); UserDataClass d = new UserDataClass() { _name = new string((sbyte *)group + pEntry->_stringOffset) }; VoidPtr addr = (VoidPtr)entry + entry->_dataOffset; d._type = entry->Type; if (d._type != UserValueType.String) { for (int x = 0; x < entry->_entryCount; x++) { switch (entry->Type) { case UserValueType.Float: d._entries.Add(((float)*(bfloat *)addr).ToString()); addr += 4; break; case UserValueType.Int: d._entries.Add(((int)*(bint *)addr).ToString()); addr += 4; break; } } } else { d._entries.Add(new string((sbyte *)addr)); } Add(d); } }