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(); }
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)); } }
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)); } }
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); }
/// <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]; } } }
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); }
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)); } } }
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)); } } }