Beispiel #1
0
        public void SetOriginModel(FakeStruct fake)
        {
            if (fake == null)
            {
                OriInfos = null;
                indexs   = null;
                return;
            }
            int c = fake.Length;
            int u = c / 3;

            OriInfos = new FakeInfo[u];
            int s  = 1;
            int os = 0;

            for (int i = 0; i < u; i++)
            {
                OriInfos[i].Offset = os;
                OriInfos[i].Size   = fake[s];
                os += fake[s];
                s++;
                OriInfos[i].Type = fake.GetData <string>(s);
                s++;
                OriInfos[i].Name = fake.GetData <string>(s);
                s++;
            }
            Order();
        }
Beispiel #2
0
        object ReadArray(DataFieldInfo info, FakeStruct fake, int offset)
        {
            int a = info.DBType;

            a &= 0x1f;
            switch (a)
            {
            case DataType2.Class:
            case DataType2.Struct:
                return(ReadObjectArray(info, fake.buffer, fake.GetData(offset)));

            case DataType2.String:
                return(fake.GetData <FakeStringArray>(offset).Data);

            default: return(fake.GetData(offset));
            }
        }
Beispiel #3
0
        object ReadList(DataFieldInfo info, FakeStruct fake, int offset)
        {
            int a = info.DBType;

            a &= 0x1f;
            switch (a)
            {
            case DataType2.Byte:
                return(ReadArray <byte>(fake.GetData(offset)));

            case DataType2.Int16:
                return(ReadArray <Int16>(fake.GetData(offset)));

            case DataType2.Int32:
                return(ReadArray <Int32>(fake.GetData(offset)));

            case DataType2.Int64:
                return(ReadArray <Int64>(fake.GetData(offset)));

            case DataType2.Float:
                return(ReadArray <float>(fake.GetData(offset)));

            case DataType2.Double:
                return(ReadArray <Double>(fake.GetData(offset)));

            case DataType2.Class:
                return(ReadObjectList(info, fake.buffer, fake.GetData(offset)));

            case DataType2.Struct:
                return(ReadStructList(info, fake.buffer, fake.GetData(offset)));

            case DataType2.String:
            {
                var fsa = fake.GetData <FakeStringArray>(offset);
                if (fsa != null)
                {
                    List <string> list = new List <string>();
                    list.AddRange(fsa.Data);
                    return(list);
                }
            }
                return(null);

            default: return(fake.GetData(offset));
            }
        }
Beispiel #4
0
        object ReadArray2(DataFieldInfo info, FakeStruct fake, int offset)
        {
            Int16[] tmp = fake.GetData <Int16[]>(offset);
            if (tmp == null)
            {
                return(null);
            }
            var   buf  = fake.buffer;
            Array arry = info.ArrayConstruction2(tmp.Length) as Array;
            int   a    = info.DBType;

            a &= 0x1f;
            switch (a)
            {
            case DataType2.Class:
            case DataType2.Struct:
                for (int i = 0; i < tmp.Length; i++)
                {
                    var v = buf.GetData(tmp[i]);
                    if (v != null)
                    {
                        var obj = ReadObjectArray(info, buf, v);
                        if (obj != null)
                        {
                            arry.SetValue(obj, i);
                        }
                    }
                }
                break;

            case DataType2.String:
                for (int i = 0; i < tmp.Length; i++)
                {
                    var v = buf.GetData(tmp[i]) as FakeStringArray;
                    if (v != null)
                    {
                        arry.SetValue(v.Data, i);
                    }
                }
                break;

            default:
                for (int i = 0; i < tmp.Length; i++)
                {
                    var v = buf.GetData(tmp[i]);
                    if (v != null)
                    {
                        arry.SetValue(v, i);
                    }
                }
                break;
            }
            return(arry);
        }
Beispiel #5
0
        /// <summary>
        /// 载入精灵数据包
        /// </summary>
        /// <param name="data">数据</param>
        public void LoadSpriteData(byte[] data)
        {
            fakeStruct = new DataBuffer(data).fakeStruct;
            Name       = fakeStruct.GetData <string>(0);
            var fsa = fakeStruct.GetData <FakeStructArray>(1);

            if (fsa != null)
            {
                int c = fsa.Length;
                infos = new TextureInfo[c];
                for (int i = 0; i < infos.Length; i++)
                {
                    infos[i].Name = fsa.GetData <string>(i, 0);
                    var arr = fsa.GetData <FakeStructArray>(i, 1);
                    if (arr != null)
                    {
                        infos[i].sprites = LoadSpriteData(arr);
                    }
                    infos[i].width  = fsa[i, 2];
                    infos[i].height = fsa[i, 3];
                }
            }
        }
Beispiel #6
0
        object ReadList2(DataFieldInfo info, FakeStruct fake, int offset)
        {
            Int16[] tmp = fake.GetData <Int16[]>(offset);
            if (tmp == null)
            {
                return(null);
            }
            var   buf  = fake.buffer;
            IList arry = info.Construction2() as IList;
            int   a    = info.DBType;

            a &= 0x1f;
            switch (a)
            {
            case DataType2.Class:
            case DataType2.Struct:
                for (int i = 0; i < tmp.Length; i++)
                {
                    var v = buf.GetData(tmp[i]);
                    if (v != null)
                    {
                        object obj;
                        if (info.ChildTypeName == DataType2.List)
                        {
                            obj = ReadObjectList(info, buf, v);
                        }
                        else
                        {
                            obj = ReadObjectArray(info, buf, v);
                        }
                        arry.Add(obj);
                    }
                    else
                    {
                        arry.Add(null);
                    }
                }
                break;

            case DataType2.String:
                if (info.ChildTypeName == DataType2.List)
                {
                    for (int i = 0; i < tmp.Length; i++)
                    {
                        var v = buf.GetData(tmp[i]) as FakeStringArray;
                        if (v != null)
                        {
                            List <string> t = new List <string>();
                            t.AddRange(v.Data);
                            arry.Add(t);
                        }
                        else
                        {
                            arry.Add(null);
                        }
                    }
                }
                else
                {
                    for (int i = 0; i < tmp.Length; i++)
                    {
                        var v = buf.GetData(tmp[i]) as FakeStringArray;
                        if (v != null)
                        {
                            arry.Add(v.Data);
                        }
                        else
                        {
                            arry.Add(null);
                        }
                    }
                }
                break;

            default:
                if (info.ChildTypeName == DataType2.List)
                {
                    switch (a)
                    {
                    case DataType2.Byte:
                        for (int i = 0; i < tmp.Length; i++)
                        {
                            arry.Add(ReadArray <byte>(buf.GetData(tmp[i])));
                        }
                        break;

                    case DataType2.Int16:
                        for (int i = 0; i < tmp.Length; i++)
                        {
                            arry.Add(ReadArray <Int16>(buf.GetData(tmp[i])));
                        }
                        break;

                    case DataType2.Int32:
                        for (int i = 0; i < tmp.Length; i++)
                        {
                            arry.Add(ReadArray <Int32>(buf.GetData(tmp[i])));
                        }
                        break;

                    case DataType2.Int64:
                        for (int i = 0; i < tmp.Length; i++)
                        {
                            arry.Add(ReadArray <Int64>(buf.GetData(tmp[i])));
                        }
                        break;

                    case DataType2.Float:
                        for (int i = 0; i < tmp.Length; i++)
                        {
                            arry.Add(ReadArray <float>(buf.GetData(tmp[i])));
                        }
                        break;

                    case DataType2.Double:
                        for (int i = 0; i < tmp.Length; i++)
                        {
                            arry.Add(ReadArray <double>(buf.GetData(tmp[i])));
                        }
                        break;
                    }
                }
                else
                {
                    for (int i = 0; i < tmp.Length; i++)
                    {
                        arry.Add(buf.GetData(tmp[i]));
                    }
                }
                break;
            }
            return(arry);
        }
Beispiel #7
0
        void ReadField(FakeStruct fake, int start, DataFieldInfo info, object instance)
        {
            int offset = start + info.OldFieldInfo.DataOffset;

            if (info.DBType < 11)
            {
                CompatibleReadValue(info, fake, offset, instance);
            }
            else if (info.DBType < 32)
            {
                switch (info.DBType)
                {
                case DataType2.String:
                    string str = fake.GetData <string>(offset);
                    if (str != null)
                    {
                        info.field.SetValue(instance, str);
                    }
                    break;

                case DataType2.Class:
                    if (info.OldFieldInfo.DBType == DataType2.Struct)
                    {
                        info.field.SetValue(instance, ReadStruct(info.typeInfo, fake, offset));
                    }
                    else
                    {
                        FakeStruct fs = fake.GetData <FakeStruct>(offset);
                        if (fs != null)
                        {
                            if (HaveDerived)
                            {
                                int a      = fake[offset];
                                int dbtype = a >> 16;
                                int index  = a & 0xffff;
                                var dt     = oldTypes[dbtype].NewType;
                                if (dt != null)
                                {
                                    info.field.SetValue(instance, ReadObject(dt, fs, index));
                                }
                                //else info.field.SetValue(instance, ReadObject(info.typeInfo, fs, index));
                            }
                            else
                            {
                                info.field.SetValue(instance, ReadObject(info.typeInfo, fs, fake[offset] & 0xffff));
                            }
                        }
                    }
                    break;

                case DataType2.Struct:
                    if (info.OldFieldInfo.DBType == DataType2.Class)
                    {
                        var fs = fake.GetData <FakeStruct>(offset);
                        if (fs != null)
                        {
                            info.field.SetValue(instance, ReadObject(info.typeInfo, fs, fake[offset] & 0xffff));
                        }
                    }
                    else
                    {
                        info.field.SetValue(instance, ReadStruct(info.typeInfo, fake, offset));
                    }
                    break;

                case DataType2.Boolean:
                    info.field.SetValue(instance, fake[offset] == 1);
                    break;
                }
            }
            else if (info.DBType < 64)
            {
                if (info.TypeName == DataType2.List)
                {
                    var list = ReadList(info, fake, offset);
                    info.field.SetValue(instance, list);
                }
                else
                {
                    info.field.SetValue(instance, ReadArray(info, fake, offset));
                }
            }
            else
            {
                if (info.TypeName == DataType2.List)
                {
                    info.field.SetValue(instance, ReadList2(info, fake, offset));
                }
                else
                {
                    info.field.SetValue(instance, ReadArray2(info, fake, offset));
                }
            }
        }
Beispiel #8
0
        void ReadField(FakeStruct fake, int start, DataFieldInfo info, IntPtr ptr)
        {
            int offset = start + info.OldFieldInfo.DataOffset;

            if (info.DBType < 11)
            {
                CompatibleReadValue(info, fake, offset, ptr);
            }
            else if (info.DBType < 32)
            {
                switch (info.DBType)
                {
                case DataType2.String:
                    string str = fake.GetData <string>(offset);
                    if (str != null)
                    {
                        UnsafeOperation.SetObject(ptr + info.MemOffset, str);
                    }
                    break;

                case DataType2.Class:
                    if (info.OldFieldInfo.DBType == DataType2.Struct)
                    {
                        UnsafeOperation.SetObject(ptr + info.MemOffset, ReadStructToObject(info.typeInfo, fake, offset));
                    }
                    else
                    {
                        FakeStruct fs = fake.GetData <FakeStruct>(offset);
                        if (fs != null)
                        {
                            if (HaveDerived)
                            {
                                int a      = fake[offset];
                                int dbtype = a >> 16;
                                int index  = a & 0xffff;
                                var dt     = oldTypes[dbtype].NewType;
                                if (dt != null)
                                {
                                    UnsafeOperation.SetObject(ptr + info.MemOffset, ReadObject(dt, fs, index));
                                }
                            }
                            else
                            {
                                UnsafeOperation.SetObject(ptr + info.MemOffset, ReadObject(info.typeInfo, fs, fake[offset] & 0xffff));
                            }
                        }
                    }
                    break;

                case DataType2.Struct:
                    if (info.OldFieldInfo.DBType == DataType2.Class)
                    {
                        var fs = fake.GetData <FakeStruct>(offset);
                        if (fs != null)
                        {
                            ReadStruct(info.typeInfo, fs, 0, ptr + info.MemOffset);
                        }
                    }
                    else
                    {
                        ReadStruct(info.typeInfo, fake, offset, ptr + info.MemOffset);
                    }
                    break;

                case DataType2.Boolean:
                    unsafe { *(byte *)(ptr + info.MemOffset) = (byte)fake[offset]; }
                    break;
                }
            }
            else if (info.DBType < 64)
            {
                if (info.TypeName == "List`1")
                {
                    UnsafeOperation.SetObject(ptr + info.MemOffset, ReadList(info, fake, offset));
                }
                else
                {
                    UnsafeOperation.SetObject(ptr + info.MemOffset, ReadArray(info, fake, offset));
                }
            }
            else
            {
                if (info.TypeName == "List`1")
                {
                    UnsafeOperation.SetObject(ptr + info.MemOffset, ReadList2(info, fake, offset));
                }
                else
                {
                    UnsafeOperation.SetObject(ptr + info.MemOffset, ReadArray2(info, fake, offset));
                }
            }
        }