Esempio n. 1
0
        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;
            }
        }
Esempio n. 2
0
        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;
        }
Esempio n. 3
0
        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);
            }
        }