using System;
using System.Collections.Generic;
using System.IO;

[Serializable]
public class MaidProp
{
	public bool Serialize(BinaryWriter f_bwWrite)
	{
		f_bwWrite.Write("CM3D2_MPROP");
		f_bwWrite.Write(1170);
		f_bwWrite.Write(this.idx);
		f_bwWrite.Write(this.name);
		f_bwWrite.Write(this.type);
		f_bwWrite.Write(this.value_Default);
		f_bwWrite.Write(this.value);
		f_bwWrite.Write(this.temp_value);
		f_bwWrite.Write(this.value_LinkMAX);
		f_bwWrite.Write(this.strFileName);
		f_bwWrite.Write(this.nFileNameRID);
		f_bwWrite.Write(this.boDut);
		f_bwWrite.Write(this.max);
		f_bwWrite.Write(this.min);
		f_bwWrite.Write((this.listSubProp != null) ? this.listSubProp.Count : 0);
		if (this.listSubProp != null)
		{
			for (int i = 0; i < this.listSubProp.Count; i++)
			{
				SubProp subProp = this.listSubProp[i];
				f_bwWrite.Write(subProp != null);
				if (subProp != null)
				{
					f_bwWrite.Write(subProp.bDut);
					f_bwWrite.Write(subProp.strFileName);
					f_bwWrite.Write(subProp.nFileNameRID);
					f_bwWrite.Write(subProp.fTexMulAlpha);
				}
			}
		}
		f_bwWrite.Write(this.m_dicTBodySkinPos.Count);
		foreach (KeyValuePair<TBody.SlotID, KeyValuePair<int, BoneAttachPos>> keyValuePair in this.m_dicTBodySkinPos)
		{
			f_bwWrite.Write((int)keyValuePair.Key);
			f_bwWrite.Write(keyValuePair.Value.Key);
			f_bwWrite.Write(keyValuePair.Value.Value.bEnable);
			f_bwWrite.Write(keyValuePair.Value.Value.pss.position.x);
			f_bwWrite.Write(keyValuePair.Value.Value.pss.position.y);
			f_bwWrite.Write(keyValuePair.Value.Value.pss.position.z);
			f_bwWrite.Write(keyValuePair.Value.Value.pss.rotation.x);
			f_bwWrite.Write(keyValuePair.Value.Value.pss.rotation.y);
			f_bwWrite.Write(keyValuePair.Value.Value.pss.rotation.z);
			f_bwWrite.Write(keyValuePair.Value.Value.pss.rotation.w);
			f_bwWrite.Write(keyValuePair.Value.Value.pss.scale.x);
			f_bwWrite.Write(keyValuePair.Value.Value.pss.scale.y);
			f_bwWrite.Write(keyValuePair.Value.Value.pss.scale.z);
		}
		f_bwWrite.Write(this.m_dicTBodyAttachPos.Count);
		foreach (KeyValuePair<TBody.SlotID, Dictionary<string, KeyValuePair<int, VtxAttachPos>>> keyValuePair2 in this.m_dicTBodyAttachPos)
		{
			f_bwWrite.Write((int)keyValuePair2.Key);
			f_bwWrite.Write(keyValuePair2.Value.Count);
			foreach (KeyValuePair<string, KeyValuePair<int, VtxAttachPos>> keyValuePair3 in keyValuePair2.Value)
			{
				f_bwWrite.Write(keyValuePair3.Key);
				f_bwWrite.Write(keyValuePair3.Value.Key);
				VtxAttachPos vtxAttachPos = keyValuePair3.Value.Value;
				f_bwWrite.Write(vtxAttachPos.bEnable);
				f_bwWrite.Write(vtxAttachPos.vtxcount);
				f_bwWrite.Write(vtxAttachPos.vidx);
				f_bwWrite.Write(vtxAttachPos.prs.position.x);
				f_bwWrite.Write(vtxAttachPos.prs.position.y);
				f_bwWrite.Write(vtxAttachPos.prs.position.z);
				f_bwWrite.Write(vtxAttachPos.prs.rotation.x);
				f_bwWrite.Write(vtxAttachPos.prs.rotation.y);
				f_bwWrite.Write(vtxAttachPos.prs.rotation.z);
				f_bwWrite.Write(vtxAttachPos.prs.rotation.w);
				f_bwWrite.Write(vtxAttachPos.prs.scale.x);
				f_bwWrite.Write(vtxAttachPos.prs.scale.y);
				f_bwWrite.Write(vtxAttachPos.prs.scale.z);
			}
		}
		f_bwWrite.Write(this.m_dicMaterialProp.Count);
		foreach (KeyValuePair<TBody.SlotID, KeyValuePair<int, MatPropSave>> keyValuePair4 in this.m_dicMaterialProp)
		{
			f_bwWrite.Write((int)keyValuePair4.Key);
			f_bwWrite.Write(keyValuePair4.Value.Key);
			f_bwWrite.Write(keyValuePair4.Value.Value.nMatNo);
			f_bwWrite.Write(keyValuePair4.Value.Value.strPropName);
			f_bwWrite.Write(keyValuePair4.Value.Value.strTypeName);
			f_bwWrite.Write(keyValuePair4.Value.Value.strValue);
		}
		f_bwWrite.Write(this.m_dicBoneLength.Count);
		foreach (KeyValuePair<TBody.SlotID, KeyValuePair<int, Dictionary<string, float>>> keyValuePair5 in this.m_dicBoneLength)
		{
			f_bwWrite.Write((int)keyValuePair5.Key);
			f_bwWrite.Write(keyValuePair5.Value.Key);
			f_bwWrite.Write(keyValuePair5.Value.Value.Count);
			foreach (KeyValuePair<string, float> keyValuePair6 in keyValuePair5.Value.Value)
			{
				f_bwWrite.Write(keyValuePair6.Key);
				f_bwWrite.Write(keyValuePair6.Value);
			}
		}
		return true;
	}

	public bool SerializeLowCapacity(BinaryWriter writer)
	{
		writer.Write(this.value);
		writer.Write(this.nFileNameRID);
		return true;
	}

	public bool Deserialize(BinaryReader f_brRead)
	{
		NDebug.Assert(f_brRead.ReadString() == "CM3D2_MPROP", "メイドプロパティのヘッダーが不正です。");
		int num = f_brRead.ReadInt32();
		this.idx = f_brRead.ReadInt32();
		if (num <= 110 && 10 <= this.idx)
		{
			this.idx += 2;
		}
		this.name = f_brRead.ReadString();
		this.idx = (int)Enum.Parse(typeof(MPN), this.name, true);
		this.type = f_brRead.ReadInt32();
		this.value_Default = f_brRead.ReadInt32();
		this.value = f_brRead.ReadInt32();
		if (101 <= num)
		{
			this.temp_value = f_brRead.ReadInt32();
		}
		this.value_LinkMAX = f_brRead.ReadInt32();
		this.strFileName = f_brRead.ReadString();
		this.nFileNameRID = f_brRead.ReadInt32();
		this.boDut = f_brRead.ReadBoolean();
		this.max = f_brRead.ReadInt32();
		this.min = f_brRead.ReadInt32();
		if (this.listSubProp != null && this.listSubProp.Count != 0)
		{
			this.listSubProp = null;
		}
		if (200 <= num)
		{
			int num2 = f_brRead.ReadInt32();
			if (num2 != 0)
			{
				this.listSubProp = new List<SubProp>();
			}
			for (int i = 0; i < num2; i++)
			{
				bool flag = f_brRead.ReadBoolean();
				if (flag)
				{
					SubProp subProp = new SubProp();
					subProp.bDut = f_brRead.ReadBoolean();
					subProp.strFileName = f_brRead.ReadString();
					subProp.nFileNameRID = f_brRead.ReadInt32();
					if (211 <= num)
					{
						subProp.fTexMulAlpha = f_brRead.ReadSingle();
					}
					subProp.bDut = true;
					this.listSubProp.Add(subProp);
				}
				else
				{
					this.listSubProp.Add(null);
				}
			}
		}
		else if (this.type == 3 && (this.name == "acctatoo" || this.name == "hokuro") && !string.IsNullOrEmpty(this.strFileName) && !this.strFileName.Contains("_del"))
		{
			this.listSubProp = new List<SubProp>();
			SubProp subProp2 = new SubProp();
			subProp2.bDut = true;
			subProp2.strFileName = this.strFileName;
			subProp2.nFileNameRID = this.nFileNameRID;
			this.listSubProp.Add(subProp2);
			this.strFileName = CM3.dicDelItem[(MPN)Enum.Parse(typeof(MPN), this.name, true)];
			this.nFileNameRID = this.strFileName.ToLower().GetHashCode();
		}
		if (this.name == "eye_hi" && string.IsNullOrEmpty(this.strFileName))
		{
			this.strFileName = "_I_SkinHi.menu";
			this.nFileNameRID = this.strFileName.ToLower().GetHashCode();
		}
		else if (this.name == "mayu" && string.IsNullOrEmpty(this.strFileName))
		{
			this.strFileName = "_I_mayu_001_mugen.menu";
			this.nFileNameRID = this.strFileName.ToLower().GetHashCode();
		}
		if (num <= 208 && this.idx == 44 && this.strFileName.ToLower() == "_I_acctatoo_del.menu".ToLower())
		{
			this.strFileName = CM3.dicDelItem[MPN.accnail];
			this.nFileNameRID = this.strFileName.ToLower().GetHashCode();
		}
		this.m_dicTBodySkinPos.Clear();
		this.m_dicTBodyAttachPos.Clear();
		this.m_dicMaterialProp.Clear();
		this.m_dicBoneLength.Clear();
		if (200 <= num)
		{
			int num3 = f_brRead.ReadInt32();
			for (int j = 0; j < num3; j++)
			{
				TBody.SlotID key = (TBody.SlotID)f_brRead.ReadInt32();
				int key2 = f_brRead.ReadInt32();
				BoneAttachPos boneAttachPos = new BoneAttachPos();
				boneAttachPos.bEnable = f_brRead.ReadBoolean();
				boneAttachPos.pss.position.x = f_brRead.ReadSingle();
				boneAttachPos.pss.position.y = f_brRead.ReadSingle();
				boneAttachPos.pss.position.z = f_brRead.ReadSingle();
				boneAttachPos.pss.rotation.x = f_brRead.ReadSingle();
				boneAttachPos.pss.rotation.y = f_brRead.ReadSingle();
				boneAttachPos.pss.rotation.z = f_brRead.ReadSingle();
				boneAttachPos.pss.rotation.w = f_brRead.ReadSingle();
				boneAttachPos.pss.scale.x = f_brRead.ReadSingle();
				boneAttachPos.pss.scale.y = f_brRead.ReadSingle();
				boneAttachPos.pss.scale.z = f_brRead.ReadSingle();
				KeyValuePair<int, BoneAttachPos> keyValuePair = new KeyValuePair<int, BoneAttachPos>(key2, boneAttachPos);
				this.m_dicTBodySkinPos[key] = keyValuePair;
			}
			int num4 = f_brRead.ReadInt32();
			for (int k = 0; k < num4; k++)
			{
				TBody.SlotID key3 = (TBody.SlotID)f_brRead.ReadInt32();
				int num5 = f_brRead.ReadInt32();
				Dictionary<string, KeyValuePair<int, VtxAttachPos>> dictionary = new Dictionary<string, KeyValuePair<int, VtxAttachPos>>();
				for (int l = 0; l < num5; l++)
				{
					string key4 = f_brRead.ReadString();
					int key5 = f_brRead.ReadInt32();
					VtxAttachPos vtxAttachPos = new VtxAttachPos();
					vtxAttachPos.bEnable = f_brRead.ReadBoolean();
					vtxAttachPos.vtxcount = f_brRead.ReadInt32();
					vtxAttachPos.vidx = f_brRead.ReadInt32();
					vtxAttachPos.prs.position.x = f_brRead.ReadSingle();
					vtxAttachPos.prs.position.y = f_brRead.ReadSingle();
					vtxAttachPos.prs.position.z = f_brRead.ReadSingle();
					vtxAttachPos.prs.rotation.x = f_brRead.ReadSingle();
					vtxAttachPos.prs.rotation.y = f_brRead.ReadSingle();
					vtxAttachPos.prs.rotation.z = f_brRead.ReadSingle();
					vtxAttachPos.prs.rotation.w = f_brRead.ReadSingle();
					vtxAttachPos.prs.scale.x = f_brRead.ReadSingle();
					vtxAttachPos.prs.scale.y = f_brRead.ReadSingle();
					vtxAttachPos.prs.scale.z = f_brRead.ReadSingle();
					dictionary.Add(key4, new KeyValuePair<int, VtxAttachPos>(key5, vtxAttachPos));
				}
				this.m_dicTBodyAttachPos.Add(key3, dictionary);
			}
			int num6 = f_brRead.ReadInt32();
			for (int m = 0; m < num6; m++)
			{
				TBody.SlotID slotID = (TBody.SlotID)f_brRead.ReadInt32();
				int key6 = f_brRead.ReadInt32();
				MatPropSave matPropSave = new MatPropSave();
				matPropSave.nMatNo = f_brRead.ReadInt32();
				matPropSave.strPropName = f_brRead.ReadString();
				matPropSave.strTypeName = f_brRead.ReadString();
				matPropSave.strValue = f_brRead.ReadString();
				if (num < 204 && slotID == TBody.SlotID.head && matPropSave.nMatNo == 3 && (matPropSave.strPropName == "_ZTest" || matPropSave.strPropName == "ZTest"))
				{
					matPropSave.strPropName = "_ZTest2";
					matPropSave.strValue = ((!(matPropSave.strValue == "8")) ? "1" : "7");
				}
				this.m_dicMaterialProp.Add(slotID, new KeyValuePair<int, MatPropSave>(key6, matPropSave));
			}
			if (213 <= num)
			{
				int num7 = f_brRead.ReadInt32();
				for (int n = 0; n < num7; n++)
				{
					TBody.SlotID key7 = (TBody.SlotID)f_brRead.ReadInt32();
					int key8 = f_brRead.ReadInt32();
					int num8 = f_brRead.ReadInt32();
					Dictionary<string, float> dictionary2 = new Dictionary<string, float>();
					for (int num9 = 0; num9 < num8; num9++)
					{
						string key9 = f_brRead.ReadString();
						float num10 = f_brRead.ReadSingle();
						dictionary2.Add(key9, num10);
					}
					this.m_dicBoneLength[key7] = new KeyValuePair<int, Dictionary<string, float>>(key8, dictionary2);
				}
			}
		}
		if (num < 200 && this.idx == 37 && Path.GetFileNameWithoutExtension(this.strFileName.ToLower()) == "hair_r095_i_")
		{
			this.strFileName = "hair_r110_i_.menu";
			this.nFileNameRID = this.strFileName.ToLower().GetHashCode();
		}
		this.boDut = true;
		this.boTempDut = false;
		this.strTempFileName = string.Empty;
		this.nTempFileNameRID = 0;
		return true;
	}

	public bool DeserializeLowCapacity(BinaryReader reader)
	{
		this.value = reader.ReadInt32();
		this.nFileNameRID = reader.ReadInt32();
		if (this.nFileNameRID != 0)
		{
			this.strFileName = ((!GameUty.RidMenuDic.ContainsKey(this.nFileNameRID)) ? string.Empty : GameUty.RidMenuDic[this.nFileNameRID]);
			if (string.IsNullOrEmpty(this.strFileName))
			{
				this.nFileNameRID = 0;
			}
		}
		else
		{
			this.strFileName = string.Empty;
		}
		this.boDut = true;
		this.boTempDut = false;
		this.strTempFileName = string.Empty;
		this.nTempFileNameRID = 0;
		return true;
	}

	public int idx;

	public string name;

	public int type;

	public int value_Default;

	public int value;

	public int temp_value;

	public int value_LinkMAX;

	public string strFileName = string.Empty;

	public int nFileNameRID;

	public string strTempFileName = string.Empty;

	public int nTempFileNameRID;

	public bool boDut;

	public bool boTempDut;

	public int max;

	public int min;

	public bool bSubDut;

	public List<SubProp> listSubProp;

	public bool bNoScale;

	public bool boAdjustDut;

	public Dictionary<TBody.SlotID, KeyValuePair<int, BoneAttachPos>> m_dicTBodySkinPos = new Dictionary<TBody.SlotID, KeyValuePair<int, BoneAttachPos>>();

	public Dictionary<TBody.SlotID, Dictionary<string, KeyValuePair<int, VtxAttachPos>>> m_dicTBodyAttachPos = new Dictionary<TBody.SlotID, Dictionary<string, KeyValuePair<int, VtxAttachPos>>>();

	public Dictionary<TBody.SlotID, KeyValuePair<int, MatPropSave>> m_dicMaterialProp = new Dictionary<TBody.SlotID, KeyValuePair<int, MatPropSave>>();

	public Dictionary<TBody.SlotID, KeyValuePair<int, Dictionary<string, float>>> m_dicBoneLength = new Dictionary<TBody.SlotID, KeyValuePair<int, Dictionary<string, float>>>();
}
