ghorsington 3 years ago
parent
commit
04bd438242
82 changed files with 4160 additions and 647 deletions
  1. 5 5
      Assembly-CSharp.sln
  2. 30 17
      Assembly-CSharp/Assembly-CSharp.csproj
  3. 2 2
      Assembly-CSharp/BaseKagManager.cs
  4. 1 1
      Assembly-CSharp/BasePhotoCustomObject.cs
  5. 1 1
      Assembly-CSharp/BasePhotoWindowManager.cs
  6. 38 0
      Assembly-CSharp/BigThumbnail.cs
  7. 56 2
      Assembly-CSharp/BoneMorph_.cs
  8. 11 0
      Assembly-CSharp/CM3.cs
  9. 4 4
      Assembly-CSharp/CMSystem.cs
  10. 9 7
      Assembly-CSharp/CharacterMgr.cs
  11. 2 2
      Assembly-CSharp/ControllerShortcutSettingData.cs
  12. 8 3
      Assembly-CSharp/DailyCtrl.cs
  13. 6 1
      Assembly-CSharp/DailyMgr.cs
  14. 1 1
      Assembly-CSharp/DeskManager.cs
  15. 3 3
      Assembly-CSharp/DynamicBone.cs
  16. 1 1
      Assembly-CSharp/DynamicSkirtBone.cs
  17. 1 1
      Assembly-CSharp/EditMod.cs
  18. 1 1
      Assembly-CSharp/EmpireLifeModeManager.cs
  19. 22 10
      Assembly-CSharp/FaceWindow.cs
  20. 1 1
      Assembly-CSharp/FacilityManager.cs
  21. 1 1
      Assembly-CSharp/GameInShopMain.cs
  22. 20 4
      Assembly-CSharp/GameMain.cs
  23. 1 1
      Assembly-CSharp/GameModeManager.cs
  24. 20 46
      Assembly-CSharp/GameUty.cs
  25. 2 2
      Assembly-CSharp/HandSignShortcut.cs
  26. 3 3
      Assembly-CSharp/Kasizuki/KasizukiManager.cs
  27. 17 0
      Assembly-CSharp/MPN.cs
  28. 8 8
      Assembly-CSharp/MPN_TYPE_RANGE.cs
  29. 133 32
      Assembly-CSharp/Maid.cs
  30. 30 6
      Assembly-CSharp/MaidParts.cs
  31. 4 3
      Assembly-CSharp/MaidProp.cs
  32. 17 5
      Assembly-CSharp/MaidStatus/PersonalEventBlocker.cs
  33. 26 5
      Assembly-CSharp/MaidStatus/Status.cs
  34. 14 10
      Assembly-CSharp/MaidStatus/YotogiClass.cs
  35. 53 0
      Assembly-CSharp/MayuAlphaWindow.cs
  36. 199 149
      Assembly-CSharp/Menu.cs
  37. 1 1
      Assembly-CSharp/Misc.cs
  38. 3 3
      Assembly-CSharp/ModCompile.cs
  39. 2 2
      Assembly-CSharp/OvrIK.cs
  40. 5 2
      Assembly-CSharp/PhotoManEditManager.cs
  41. 25 2
      Assembly-CSharp/PhotoModeMain.cs
  42. 1 1
      Assembly-CSharp/PhotoModeSaveAndLoad.cs
  43. 7 10
      Assembly-CSharp/PhotoWindowManager.cs
  44. 1 1
      Assembly-CSharp/PlayerStatus/Status.cs
  45. 1 0
      Assembly-CSharp/PresetServer.cs
  46. 35 23
      Assembly-CSharp/ProfileCtrl.cs
  47. 2 2
      Assembly-CSharp/ProfileMgr.cs
  48. 12 0
      Assembly-CSharp/RandomPresetContent.cs
  49. 195 40
      Assembly-CSharp/SceneEdit.cs
  50. 43 0
      Assembly-CSharp/SceneEditInfo.cs
  51. 37 18
      Assembly-CSharp/SceneEditWindow/CustomViewItem.cs
  52. 3 0
      Assembly-CSharp/SceneEditWindow/CustomViewItemData.cs
  53. 2 1
      Assembly-CSharp/SceneEditWindow/CustomViewWindow.cs
  54. 26 5
      Assembly-CSharp/SceneFreeModeSelectManager.cs
  55. 1 1
      Assembly-CSharp/SceneNPCEdit/SaveData.cs
  56. 54 19
      Assembly-CSharp/SceneUserEditMain.cs
  57. 15 19
      Assembly-CSharp/Schedule/ScheduleAPI.cs
  58. 1 1
      Assembly-CSharp/ScheduleTaskViewer.cs
  59. 47 1
      Assembly-CSharp/ScriptManager.cs
  60. 12 6
      Assembly-CSharp/SystemShortcut.cs
  61. 53 31
      Assembly-CSharp/TBody.cs
  62. 50 25
      Assembly-CSharp/TBodySkin.cs
  63. 244 60
      Assembly-CSharp/TMorph.cs
  64. 25 6
      Assembly-CSharp/WindowPartsFaceMorph.cs
  65. 1 1
      Assembly-CSharp/WindowPartsFingerPreset.cs
  66. 1 1
      Assembly-CSharp/YotogiParamBasicBar.cs
  67. 79 27
      Assembly-CSharp/Yotogis/Skill.cs
  68. 9 0
      Assembly-CSharp/com/workman/cm3d2/scene/dailyEtc/DailyAPI.cs
  69. 31 0
      Assembly-CSharp/scoutmode/LockData.cs
  70. 77 0
      Assembly-CSharp/scoutmode/SceneScoutScreenManager.cs
  71. 181 0
      Assembly-CSharp/scoutmode/ScoutCharacterSelectCtrl.cs
  72. 123 0
      Assembly-CSharp/scoutmode/ScoutInstanceData.cs
  73. 344 0
      Assembly-CSharp/scoutmode/ScoutMaidData.cs
  74. 263 0
      Assembly-CSharp/scoutmode/ScoutMaidOverrideData.cs
  75. 334 0
      Assembly-CSharp/scoutmode/ScoutMainScreenManager.cs
  76. 418 0
      Assembly-CSharp/scoutmode/ScoutManager.cs
  77. 278 0
      Assembly-CSharp/scoutmode/ScoutOption.cs
  78. 32 0
      Assembly-CSharp/scoutmode/ScoutOptionData.cs
  79. 117 0
      Assembly-CSharp/scoutmode/ScoutProgressInformation.cs
  80. 149 0
      Assembly-CSharp/scoutmode/ScoutStatusPanel.cs
  81. 22 0
      Assembly-CSharp/uGUIListViewer.cs
  82. 47 0
      Assembly-CSharp/wf/CsvCommonIdManager.cs

+ 5 - 5
Assembly-CSharp.sln

@@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio Version 16
 VisualStudioVersion = 16.0.28729.10
 MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Assembly-CSharp", "Assembly-CSharp\Assembly-CSharp.csproj", "{2815CB53-56FE-4331-A6F6-B4F864C9A9B7}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Assembly-CSharp", "Assembly-CSharp\Assembly-CSharp.csproj", "{A26CA03A-4339-487D-875B-38D0FBCFEDDB}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -11,10 +11,10 @@ Global
 		Release|Any CPU = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{2815CB53-56FE-4331-A6F6-B4F864C9A9B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{2815CB53-56FE-4331-A6F6-B4F864C9A9B7}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{2815CB53-56FE-4331-A6F6-B4F864C9A9B7}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{2815CB53-56FE-4331-A6F6-B4F864C9A9B7}.Release|Any CPU.Build.0 = Release|Any CPU
+		{A26CA03A-4339-487D-875B-38D0FBCFEDDB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{A26CA03A-4339-487D-875B-38D0FBCFEDDB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{A26CA03A-4339-487D-875B-38D0FBCFEDDB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{A26CA03A-4339-487D-875B-38D0FBCFEDDB}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE

+ 30 - 17
Assembly-CSharp/Assembly-CSharp.csproj

@@ -4,7 +4,7 @@
   <PropertyGroup>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProjectGuid>{2815CB53-56FE-4331-A6F6-B4F864C9A9B7}</ProjectGuid>
+    <ProjectGuid>{A26CA03A-4339-487D-875B-38D0FBCFEDDB}</ProjectGuid>
     <OutputType>Library</OutputType>
     <RootNamespace>Assembly-CSharp</RootNamespace>
     <AssemblyName>Assembly-CSharp</AssemblyName>
@@ -34,52 +34,52 @@
   </PropertyGroup>
   <ItemGroup>
     <Reference Include="Assembly-CSharp-firstpass">
-      <HintPath>A:\com3d2_up147.1\data\COM3D2x64_Data\Managed\Assembly-CSharp-firstpass.dll</HintPath>
+      <HintPath>A:\com3d2_up148\data\COM3D2x64_Data\Managed\Assembly-CSharp-firstpass.dll</HintPath>
     </Reference>
     <Reference Include="Assembly-UnityScript-firstpass">
-      <HintPath>A:\com3d2_up147.1\data\COM3D2x64_Data\Managed\Assembly-UnityScript-firstpass.dll</HintPath>
+      <HintPath>A:\com3d2_up148\data\COM3D2x64_Data\Managed\Assembly-UnityScript-firstpass.dll</HintPath>
     </Reference>
     <Reference Include="FoveUnityPlugin">
-      <HintPath>A:\com3d2_up147.1\data\COM3D2x64_Data\Managed\FoveUnityPlugin.dll</HintPath>
+      <HintPath>A:\com3d2_up148\data\COM3D2x64_Data\Managed\FoveUnityPlugin.dll</HintPath>
     </Reference>
     <Reference Include="Ionic.Zlib">
-      <HintPath>A:\com3d2_up147.1\data\COM3D2x64_Data\Managed\Ionic.Zlib.dll</HintPath>
+      <HintPath>A:\com3d2_up148\data\COM3D2x64_Data\Managed\Ionic.Zlib.dll</HintPath>
     </Reference>
     <Reference Include="JsonFx.Json">
-      <HintPath>A:\com3d2_up147.1\data\COM3D2x64_Data\Managed\JsonFx.Json.dll</HintPath>
+      <HintPath>A:\com3d2_up148\data\COM3D2x64_Data\Managed\JsonFx.Json.dll</HintPath>
     </Reference>
     <Reference Include="LeapCSharp.NET3.5">
-      <HintPath>A:\com3d2_up147.1\data\COM3D2x64_Data\Managed\LeapCSharp.NET3.5.dll</HintPath>
+      <HintPath>A:\com3d2_up148\data\COM3D2x64_Data\Managed\LeapCSharp.NET3.5.dll</HintPath>
     </Reference>
     <Reference Include="System">
-      <HintPath>A:\com3d2_up147.1\data\COM3D2x64_Data\Managed\System.dll</HintPath>
+      <HintPath>A:\com3d2_up148\data\COM3D2x64_Data\Managed\System.dll</HintPath>
     </Reference>
     <Reference Include="System.Core">
-      <HintPath>A:\com3d2_up147.1\data\COM3D2x64_Data\Managed\System.Core.dll</HintPath>
+      <HintPath>A:\com3d2_up148\data\COM3D2x64_Data\Managed\System.Core.dll</HintPath>
     </Reference>
     <Reference Include="System.Drawing">
-      <HintPath>A:\com3d2_up147.1\data\COM3D2x64_Data\Managed\System.Drawing.dll</HintPath>
+      <HintPath>A:\com3d2_up148\data\COM3D2x64_Data\Managed\System.Drawing.dll</HintPath>
     </Reference>
     <Reference Include="System.Windows.Forms">
-      <HintPath>A:\com3d2_up147.1\data\COM3D2x64_Data\Managed\System.Windows.Forms.dll</HintPath>
+      <HintPath>A:\com3d2_up148\data\COM3D2x64_Data\Managed\System.Windows.Forms.dll</HintPath>
     </Reference>
     <Reference Include="System.Xml">
-      <HintPath>A:\com3d2_up147.1\data\COM3D2x64_Data\Managed\System.Xml.dll</HintPath>
+      <HintPath>A:\com3d2_up148\data\COM3D2x64_Data\Managed\System.Xml.dll</HintPath>
     </Reference>
     <Reference Include="System.Xml.Linq">
-      <HintPath>A:\com3d2_up147.1\data\COM3D2x64_Data\Managed\System.Xml.Linq.dll</HintPath>
+      <HintPath>A:\com3d2_up148\data\COM3D2x64_Data\Managed\System.Xml.Linq.dll</HintPath>
     </Reference>
     <Reference Include="UnityEngine">
-      <HintPath>A:\com3d2_up147.1\data\COM3D2x64_Data\Managed\UnityEngine.dll</HintPath>
+      <HintPath>A:\com3d2_up148\data\COM3D2x64_Data\Managed\UnityEngine.dll</HintPath>
     </Reference>
     <Reference Include="UnityEngine.UI">
-      <HintPath>A:\com3d2_up147.1\data\COM3D2x64_Data\Managed\UnityEngine.UI.dll</HintPath>
+      <HintPath>A:\com3d2_up148\data\COM3D2x64_Data\Managed\UnityEngine.UI.dll</HintPath>
     </Reference>
     <Reference Include="Win32">
-      <HintPath>A:\com3d2_up147.1\data\COM3D2x64_Data\Managed\Win32.dll</HintPath>
+      <HintPath>A:\com3d2_up148\data\COM3D2x64_Data\Managed\Win32.dll</HintPath>
     </Reference>
     <Reference Include="zxing.unity">
-      <HintPath>A:\com3d2_up147.1\data\COM3D2x64_Data\Managed\zxing.unity.dll</HintPath>
+      <HintPath>A:\com3d2_up148\data\COM3D2x64_Data\Managed\zxing.unity.dll</HintPath>
     </Reference>
   </ItemGroup>
   <ItemGroup>
@@ -760,6 +760,7 @@
     <Compile Include="MaterialColorChanger.cs" />
     <Compile Include="MathCM.cs" />
     <Compile Include="MatPropSave.cs" />
+    <Compile Include="MayuAlphaWindow.cs" />
     <Compile Include="McSkip.cs" />
     <Compile Include="Menu.cs" />
     <Compile Include="MessageClass.cs" />
@@ -1146,6 +1147,18 @@
     <Compile Include="Schedule\WorkResultSceneMode.cs" />
     <Compile Include="Schedule\WorkResultSlot.cs" />
     <Compile Include="Score_Mgr.cs" />
+    <Compile Include="scoutmode\LockData.cs" />
+    <Compile Include="scoutmode\SceneScoutScreenManager.cs" />
+    <Compile Include="scoutmode\ScoutCharacterSelectCtrl.cs" />
+    <Compile Include="scoutmode\ScoutInstanceData.cs" />
+    <Compile Include="scoutmode\ScoutMaidData.cs" />
+    <Compile Include="scoutmode\ScoutMaidOverrideData.cs" />
+    <Compile Include="scoutmode\ScoutMainScreenManager.cs" />
+    <Compile Include="scoutmode\ScoutManager.cs" />
+    <Compile Include="scoutmode\ScoutOption.cs" />
+    <Compile Include="scoutmode\ScoutOptionData.cs" />
+    <Compile Include="scoutmode\ScoutProgressInformation.cs" />
+    <Compile Include="scoutmode\ScoutStatusPanel.cs" />
     <Compile Include="ScreenLoading.cs" />
     <Compile Include="ScreenTrophyMain.cs" />
     <Compile Include="ScriptManager.cs" />

+ 2 - 2
Assembly-CSharp/BaseKagManager.cs

@@ -2892,7 +2892,7 @@ public class BaseKagManager : IDisposable
 		}
 		if (tag_data.IsValid("allwear"))
 		{
-			for (int i = 67; i <= 96; i++)
+			for (int i = 81; i <= 110; i++)
 			{
 				maidAndMan.ResetProp((MPN)i, true);
 			}
@@ -5502,7 +5502,7 @@ public class BaseKagManager : IDisposable
 	public void Serialize(BinaryWriter binary)
 	{
 		binary.Write("CM3D2_KAG");
-		binary.Write(1470);
+		binary.Write(1480);
 		byte[] array = this.kag_.Serialize();
 		int value = array.Length;
 		binary.Write(value);

+ 1 - 1
Assembly-CSharp/BasePhotoCustomObject.cs

@@ -173,7 +173,7 @@ public abstract class BasePhotoCustomObject : MonoBehaviour, IComparable<BasePho
 			using (BinaryWriter binaryWriter = new BinaryWriter(memoryStream))
 			{
 				binaryWriter.Write("COM3D2_PHOTO_CUSTOM_OBJECT");
-				binaryWriter.Write(1470);
+				binaryWriter.Write(1480);
 				binaryWriter.Write(this.type.ToString());
 				binaryWriter.Write(this.scale_);
 				binaryWriter.Write(this.enabledTextureColor_);

+ 1 - 1
Assembly-CSharp/BasePhotoWindowManager.cs

@@ -153,7 +153,7 @@ public abstract class BasePhotoWindowManager : MonoBehaviour
 			using (BinaryWriter binaryWriter = new BinaryWriter(memoryStream))
 			{
 				binaryWriter.Write(this.save_header_uidata);
-				binaryWriter.Write(1470);
+				binaryWriter.Write(1480);
 				binaryWriter.Write(this.save_data_.Count);
 				foreach (KeyValuePair<string, Dictionary<string, Dictionary<string, string>>> keyValuePair3 in this.save_data_)
 				{

+ 38 - 0
Assembly-CSharp/BigThumbnail.cs

@@ -81,6 +81,44 @@ public class BigThumbnail : MonoBehaviour
 		this.alpha = 1f;
 	}
 
+	public void SetFile(params string[] files)
+	{
+		if (!this.isEnabled)
+		{
+			return;
+		}
+		this.Init();
+		this.alpha = 0f;
+		if (this.sprite_.sprite2D != null && this.sprite_.sprite2D.texture != null)
+		{
+			UnityEngine.Object.DestroyImmediate(this.sprite_.sprite2D.texture);
+		}
+		this.sprite_.sprite2D = null;
+		this.draw_tex_ = null;
+		if (files == null || files.Length <= 0)
+		{
+			return;
+		}
+		foreach (string text in files)
+		{
+			if (File.Exists(text))
+			{
+				this.draw_tex_ = UTY.LoadTexture(text);
+				break;
+			}
+		}
+		if (this.draw_tex_ == null)
+		{
+			return;
+		}
+		this.LoadFrameAndBG();
+		Sprite sprite = Sprite.Create(this.draw_tex_, new Rect(0f, 0f, (float)this.draw_tex_.width, (float)this.draw_tex_.height), default(Vector2));
+		sprite.name = "_thum_";
+		this.sprite_.sprite2D = sprite;
+		this.sprite_.SetDimensions(this.draw_tex_.width, this.draw_tex_.height);
+		this.alpha = 1f;
+	}
+
 	public float alpha
 	{
 		get

+ 56 - 2
Assembly-CSharp/BoneMorph_.cs

@@ -30,6 +30,13 @@ public class BoneMorph_
 
 	public void InitBoneMorphEdit(Transform t, MPN f_mpn, TBody.SlotID f_slot)
 	{
+		TBodySkin slot = t.GetComponentsInParent<TBody>(true)[0].GetSlot((int)f_slot);
+		this.InitBoneMorphEdit(t, f_mpn, f_slot, slot);
+	}
+
+	public void InitBoneMorphEdit(Transform t, MPN f_mpn, TBody.SlotID f_slot, TBodySkin tbskin)
+	{
+		this.m_tbSkin = tbskin;
 		Func<string, Transform, BoneMorph_.BoneMorphPos> func = delegate(string propertyName, Transform boneTrans)
 		{
 			this.m_listBoneMorphPos.RemoveAll((BoneMorph_.BoneMorphPos f) => f.strPropName == propertyName);
@@ -55,6 +62,17 @@ public class BoneMorph_
 			if (flag)
 			{
 				this.m_listBoneMorphPos.RemoveAll((BoneMorph_.BoneMorphPos f) => f.strPropName == "MayuY");
+				if (this.m_tbSkin.PartsVersion < 120)
+				{
+					HashSet<string> gp001AddPropNames = new HashSet<string>(new string[]
+					{
+						"MayuLongL",
+						"MayuLongR"
+					});
+					this.m_listBoneMorphPos.RemoveAll((BoneMorph_.BoneMorphPos f) => gp001AddPropNames.Contains(f.strPropName));
+					this.m_listBoneMorphRot.RemoveAll((BoneMorph_.BoneMorphRotatio f) => gp001AddPropNames.Contains(f.strPropName));
+					this.m_listBoneMorphScl.RemoveAll((BoneMorph_.BoneMorphScl f) => gp001AddPropNames.Contains(f.strPropName));
+				}
 			}
 			else
 			{
@@ -69,7 +87,9 @@ public class BoneMorph_
 					"Mayupos_L",
 					"Mayupos_R",
 					"Mayurot_L",
-					"Mayurot_R"
+					"Mayurot_R",
+					"MayuLongL",
+					"MayuLongR"
 				});
 				this.m_listBoneMorphPos.RemoveAll((BoneMorph_.BoneMorphPos f) => gp001AddPropNames.Contains(f.strPropName));
 				this.m_listBoneMorphRot.RemoveAll((BoneMorph_.BoneMorphRotatio f) => gp001AddPropNames.Contains(f.strPropName));
@@ -137,6 +157,20 @@ public class BoneMorph_
 				boneMorphScl2.m_vAddMin += new Vector3(0f, -0.3f, -0.3f);
 				boneMorphScl2.m_vAddMax += new Vector3(0f, 0.1f, 0.1f);
 			}
+			if (120 <= tbskin.PartsVersion)
+			{
+				Transform transform9 = CMT.SearchObjName(t, "Mayupos_L", false);
+				Transform transform10 = CMT.SearchObjName(t, "Mayupos_R", false);
+				if (transform9 != null && transform10 != null)
+				{
+					BoneMorph_.BoneMorphScl boneMorphScl3 = func3("MayuLongL", transform9);
+					boneMorphScl3.m_vAddMin += new Vector3(0f, 0f, -0.25f);
+					boneMorphScl3.m_vAddMax += new Vector3(0f, 0f, 0.25f);
+					BoneMorph_.BoneMorphScl boneMorphScl4 = func3("MayuLongR", transform10);
+					boneMorphScl4.m_vAddMin += new Vector3(0f, 0f, -0.25f);
+					boneMorphScl4.m_vAddMax += new Vector3(0f, 0f, 0.25f);
+				}
+			}
 		}
 	}
 
@@ -164,7 +198,9 @@ public class BoneMorph_
 				"EyeBallPosXR",
 				"EyeBallPosYR",
 				"EyeBallSclYL",
-				"EyeBallSclYR"
+				"EyeBallSclYR",
+				"MayuLongL",
+				"MayuLongR"
 			});
 			this.m_listBoneMorphPos.RemoveAll((BoneMorph_.BoneMorphPos f) => removeTargetPropNames.Contains(f.strPropName));
 			this.m_listBoneMorphRot.RemoveAll((BoneMorph_.BoneMorphRotatio f) => removeTargetPropNames.Contains(f.strPropName));
@@ -391,6 +427,10 @@ public class BoneMorph_
 				localScale2.y = y;
 				boneMorphScl.trBone.localScale = localScale2;
 			}
+			else if (boneMorphScl.strPropName == "MayuLongL" || boneMorphScl.strPropName == "MayuLongR")
+			{
+				boneMorphScl.trBone.localScale = boneMorphScl.Lerp(this.MayuLong);
+			}
 		}
 		foreach (BoneMorph_.BoneMorphRotatio boneMorphRotatio in this.m_listBoneMorphRot)
 		{
@@ -403,6 +443,14 @@ public class BoneMorph_
 				boneMorphRotatio.trBone.localRotation = boneMorphRotatio.Lerp(this.ROT_Mayu);
 			}
 		}
+		if (this.Yorime <= 0.5f)
+		{
+			this.m_tbSkin.body.m_editYorime = 2f * ((this.Yorime - 0.5f) / 0.5f);
+		}
+		else
+		{
+			this.m_tbSkin.body.m_editYorime = 5f * ((this.Yorime - 0.5f) / 0.5f);
+		}
 	}
 
 	private TextAsset textUserDef1;
@@ -461,12 +509,18 @@ public class BoneMorph_
 
 	private bool m_bMayuOffs;
 
+	public float MayuLong = 0.5f;
+
+	public float Yorime = 0.5f;
+
 	private List<BoneMorph_.BoneMorphPos> m_listBoneMorphPos = new List<BoneMorph_.BoneMorphPos>();
 
 	private List<BoneMorph_.BoneMorphScl> m_listBoneMorphScl = new List<BoneMorph_.BoneMorphScl>();
 
 	private List<BoneMorph_.BoneMorphRotatio> m_listBoneMorphRot = new List<BoneMorph_.BoneMorphRotatio>();
 
+	private TBodySkin m_tbSkin;
+
 	private static StringBuilder sbMinM = new StringBuilder(32);
 
 	private static StringBuilder sbMinP = new StringBuilder(32);

+ 11 - 0
Assembly-CSharp/CM3.cs

@@ -3,6 +3,17 @@ using System.Collections.Generic;
 
 public static class CM3
 {
+	public static void Init()
+	{
+		if (PluginData.IsEnabled("GP001FB"))
+		{
+			CM3.dicDelItem.Add(MPN.matsuge_low, "_i_eyelashesunder_del.menu");
+			CM3.dicDelItem.Add(MPN.futae, "_i_eyelid_del.menu");
+			CM3.dicDelItem.Add(MPN.folder_matsuge_low, "_i_eyelashesunder_del_folder.menu");
+			CM3.dicDelItem.Add(MPN.folder_futae, "_i_eyelid_del_folder.menu");
+		}
+	}
+
 	public static Dictionary<MPN, string> dicDelItem = new Dictionary<MPN, string>
 	{
 		{

+ 4 - 4
Assembly-CSharp/CMSystem.cs

@@ -855,7 +855,7 @@ public class CMSystem
 	{
 		XElement xelement = new XElement("Config", new object[]
 		{
-			new XAttribute("Version", 1470),
+			new XAttribute("Version", 1480),
 			new XElement("System", new XElement("SysButtonShowAlways", this.SysButtonShowAlways)),
 			new XElement("Screen", new object[]
 			{
@@ -1204,7 +1204,7 @@ public class CMSystem
 		MemoryStream memoryStream = new MemoryStream();
 		BinaryWriter binaryWriter = new BinaryWriter(memoryStream);
 		binaryWriter.Write("CM3D2_SYSTEM2");
-		binaryWriter.Write(1470);
+		binaryWriter.Write(1480);
 		binaryWriter.Write(this.m_dicEditColorPresetData.Count);
 		foreach (KeyValuePair<int, Dictionary<string, int>> keyValuePair in this.m_dicEditColorPresetData)
 		{
@@ -1910,7 +1910,7 @@ public class CMSystem
 
 		public void OnBeforeSerialize()
 		{
-			this.m_nVersion = 1470;
+			this.m_nVersion = 1480;
 		}
 
 		public void OnAfterDeserialize()
@@ -1918,7 +1918,7 @@ public class CMSystem
 		}
 
 		[SerializeField]
-		private int m_nVersion = 1470;
+		private int m_nVersion = 1480;
 
 		[SerializeField]
 		private string m_strDShowFilter = "Microsoft DTV-DVD Video Decoder";

+ 9 - 7
Assembly-CSharp/CharacterMgr.cs

@@ -224,6 +224,7 @@ public class CharacterMgr : MonoBehaviour
 
 	public void Init(GameMain f_gcGameMain)
 	{
+		CM3.Init();
 		BoneMorph.Init();
 		this.m_PlayerStatus = new PlayerStatus.Status();
 		this.m_goCharacter = new GameObject("Character");
@@ -999,7 +1000,7 @@ public class CharacterMgr : MonoBehaviour
 		BinaryWriter binaryWriter = new BinaryWriter(memoryStream);
 		string result = string.Empty;
 		binaryWriter.Write("CM3D2_PRESET_S");
-		binaryWriter.Write(1470);
+		binaryWriter.Write(1480);
 		binaryWriter.Write((char)presset_type);
 		maid.SerializePropLowCapacity(binaryWriter);
 		maid.SerializeMultiColor(binaryWriter);
@@ -1016,7 +1017,7 @@ public class CharacterMgr : MonoBehaviour
 		MemoryStream memoryStream = new MemoryStream();
 		BinaryWriter binaryWriter = new BinaryWriter(memoryStream);
 		binaryWriter.Write("CM3D2_PRESET");
-		binaryWriter.Write(1470);
+		binaryWriter.Write(1480);
 		binaryWriter.Write((int)f_type);
 		if (texture2D != null)
 		{
@@ -1061,7 +1062,7 @@ public class CharacterMgr : MonoBehaviour
 		MemoryStream memoryStream = new MemoryStream();
 		BinaryWriter binaryWriter = new BinaryWriter(memoryStream);
 		binaryWriter.Write("CM3D2_PRESET");
-		binaryWriter.Write(1470);
+		binaryWriter.Write(1480);
 		binaryWriter.Write((int)f_type);
 		if (texture2D != null)
 		{
@@ -1103,6 +1104,7 @@ public class CharacterMgr : MonoBehaviour
 		File.WriteAllBytes(presetDirectory + "\\" + text, bytes);
 	}
 
+	[Obsolete("GameUty.RidMenuDic廃止により使用不可", true)]
 	public static CharacterMgr.Preset LoadePresetLowCapacityData(string data_text)
 	{
 		if (string.IsNullOrEmpty(data_text) || data_text.IndexOf("^CM3D2P^") != 0)
@@ -1242,19 +1244,19 @@ public class CharacterMgr : MonoBehaviour
 		if (f_prest.ePreType == CharacterMgr.PresetType.Body)
 		{
 			array = (from mp in f_prest.listMprop
-			where (1 <= mp.idx && mp.idx <= 66) || (101 <= mp.idx && mp.idx <= 105)
+			where (1 <= mp.idx && mp.idx <= 80) || (115 <= mp.idx && mp.idx <= 122)
 			select mp).ToArray<MaidProp>();
 		}
 		else if (f_prest.ePreType == CharacterMgr.PresetType.Wear)
 		{
 			array = (from mp in f_prest.listMprop
-			where 67 <= mp.idx && mp.idx <= 96
+			where 81 <= mp.idx && mp.idx <= 110
 			select mp).ToArray<MaidProp>();
 		}
 		else
 		{
 			array = (from mp in f_prest.listMprop
-			where (1 <= mp.idx && mp.idx <= 96) || (101 <= mp.idx && mp.idx <= 105)
+			where (1 <= mp.idx && mp.idx <= 110) || (115 <= mp.idx && mp.idx <= 122)
 			select mp).ToArray<MaidProp>();
 		}
 		NDebug.Assert(array != null, "プリセットを実行する配列が空です。");
@@ -1322,7 +1324,7 @@ public class CharacterMgr : MonoBehaviour
 	public bool Serialize(BinaryWriter bwWrite)
 	{
 		bwWrite.Write("CM3D2_CHR_MGR");
-		bwWrite.Write(1470);
+		bwWrite.Write(1480);
 		this.m_PlayerStatus.Serialize(bwWrite);
 		bwWrite.Write(this.m_listStockMan.Count);
 		for (int i = 0; i < this.m_listStockMan.Count; i++)

+ 2 - 2
Assembly-CSharp/ControllerShortcutSettingData.cs

@@ -33,7 +33,7 @@ public static class ControllerShortcutSettingData
 	{
 		public void OnBeforeSerialize()
 		{
-			this.m_nVersion = 1470;
+			this.m_nVersion = 1480;
 		}
 
 		public void OnAfterDeserialize()
@@ -261,7 +261,7 @@ public static class ControllerShortcutSettingData
 		private const string CONF_NAME = "OvrControllerShortcutConfig.json";
 
 		[SerializeField]
-		private int m_nVersion = 1470;
+		private int m_nVersion = 1480;
 
 		[SerializeField]
 		private bool IsDirectShortcutMode = true;

+ 8 - 3
Assembly-CSharp/DailyCtrl.cs

@@ -4,6 +4,7 @@ using com.workman.cm3d2.button;
 using PlayerStatus;
 using PrivateMaidMode;
 using Schedule;
+using scoutmode;
 using UnityEngine;
 using wf;
 
@@ -52,7 +53,8 @@ public class DailyCtrl : MonoBehaviour
 					DailyCtrl.ButtonType.ManEdit,
 					DailyCtrl.ButtonType.Credit,
 					DailyCtrl.ButtonType.NPCEdit,
-					DailyCtrl.ButtonType.PrivateMaidModeSetting
+					DailyCtrl.ButtonType.PrivateMaidModeSetting,
+					DailyCtrl.ButtonType.ScoutMode
 				};
 			}
 			else
@@ -85,7 +87,8 @@ public class DailyCtrl : MonoBehaviour
 				DailyCtrl.ButtonType.Credit,
 				DailyCtrl.ButtonType.Dance,
 				DailyCtrl.ButtonType.NPCEdit,
-				DailyCtrl.ButtonType.PrivateMaidModeSetting
+				DailyCtrl.ButtonType.PrivateMaidModeSetting,
+				DailyCtrl.ButtonType.ScoutMode
 			};
 		}
 		else
@@ -99,6 +102,7 @@ public class DailyCtrl : MonoBehaviour
 		}
 		this.GetMenuButton(DailyCtrl.ButtonType.NPCEdit).active = (!Product.isPublic && PluginData.IsEnabled("GP001"));
 		this.GetMenuButton(DailyCtrl.ButtonType.PrivateMaidModeSetting).active = PluginData.IsEnabled("GP002");
+		this.GetMenuButton(DailyCtrl.ButtonType.ScoutMode).active = ScoutManager.isModeEnabled;
 		foreach (DailyCtrl.ButtonType type in array3)
 		{
 			this.GetMenuButton(type).active = false;
@@ -279,7 +283,8 @@ public class DailyCtrl : MonoBehaviour
 		Next,
 		MyRoomCustom,
 		NPCEdit,
-		PrivateMaidModeSetting
+		PrivateMaidModeSetting,
+		ScoutMode
 	}
 
 	[Serializable]

+ 6 - 1
Assembly-CSharp/DailyMgr.cs

@@ -175,17 +175,22 @@ public class DailyMgr : BaseCreatePanel
 			dictionary.Add(DailyCtrl.ButtonType.ManEdit, "label_useredit");
 			dictionary.Add(DailyCtrl.ButtonType.NPCEdit, "label_npcedit");
 			dictionary.Add(DailyCtrl.ButtonType.PrivateMaidModeSetting, "label_privatemaidmodesetting");
+			dictionary.Add(DailyCtrl.ButtonType.ScoutMode, "label_scoutmode");
 			dictionary.Add(DailyCtrl.ButtonType.LegacyMode, "label_legacymode");
 			dictionary.Add(DailyCtrl.ButtonType.Karaoke, "label_karaoke");
 			dictionary.Add(DailyCtrl.ButtonType.Credit, "label_credit");
 			if (dictionary.ContainsKey(menuButton.type))
 			{
+				if (menuButton.type == DailyCtrl.ButtonType.LegacyMode)
+				{
+					GameMain.Instance.CMSystem.SetTmpGenericFlag("AddAllOffset_Ignore", 0);
+				}
 				DailyAPI.EndType f_eEndType = DailyAPI.EndType.NormalSceneChange;
 				if (menuButton.type == DailyCtrl.ButtonType.FreeMode)
 				{
 					f_eEndType = DailyAPI.EndType.ToFreeMode;
 				}
-				else if (menuButton.type == DailyCtrl.ButtonType.Trophy || menuButton.type == DailyCtrl.ButtonType.PhotoMode || menuButton.type == DailyCtrl.ButtonType.DeskCustomize || menuButton.type == DailyCtrl.ButtonType.MaidManagement || menuButton.type == DailyCtrl.ButtonType.FacilityManagement)
+				else if (menuButton.type == DailyCtrl.ButtonType.Trophy || menuButton.type == DailyCtrl.ButtonType.PhotoMode || menuButton.type == DailyCtrl.ButtonType.DeskCustomize || menuButton.type == DailyCtrl.ButtonType.MaidManagement || menuButton.type == DailyCtrl.ButtonType.FacilityManagement || menuButton.type == DailyCtrl.ButtonType.ScoutMode)
 				{
 					f_eEndType = DailyAPI.EndType.TakeOver;
 				}

+ 1 - 1
Assembly-CSharp/DeskManager.cs

@@ -143,7 +143,7 @@ internal class DeskManager
 	public static void SerializeSingleSaveData(BinaryWriter binary)
 	{
 		binary.Write("CM3D2_DeskCustomize");
-		binary.Write(1470);
+		binary.Write(1480);
 		binary.Write(DeskManager.item_inst_data_.Count);
 		for (int i = 0; i < DeskManager.item_inst_data_.Count; i++)
 		{

+ 3 - 3
Assembly-CSharp/DynamicBone.cs

@@ -30,7 +30,7 @@ public class DynamicBone : MonoBehaviour
 			return false;
 		};
 		f_bw.Write("CM3D21_PHY");
-		f_bw.Write(1470);
+		f_bw.Write(1480);
 		if (this.m_Root == null)
 		{
 			NDebug.MessageBox("エラー", "×物理ルートボーンが設定されていません。");
@@ -94,7 +94,7 @@ public class DynamicBone : MonoBehaviour
 	public bool SerializeWriteCollider(BinaryWriter f_bw, string f_strFileName)
 	{
 		f_bw.Write("CM3D21_COL");
-		f_bw.Write(1470);
+		f_bw.Write(1480);
 		if (this.m_Colliders == null || this.m_Colliders.Count == 0)
 		{
 			NDebug.MessageBox("エラー", "×物理Collidersは空です。");
@@ -110,7 +110,7 @@ public class DynamicBone : MonoBehaviour
 			else
 			{
 				f_bw.Write(this.m_Colliders[i].TypeName);
-				this.m_Colliders[i].Serialize(f_bw, 1470);
+				this.m_Colliders[i].Serialize(f_bw, 1480);
 			}
 		}
 		this.m_ColliderFileName = f_strFileName;

+ 1 - 1
Assembly-CSharp/DynamicSkirtBone.cs

@@ -18,7 +18,7 @@ public class DynamicSkirtBone : MonoBehaviour
 	public bool SerializeWrite(BinaryWriter f_bw)
 	{
 		f_bw.Write("CM3D21_PSK");
-		f_bw.Write(1470);
+		f_bw.Write(1480);
 		f_bw.Write(this.m_fPanierRadius);
 		this.SerializeWriteAnimationCurve(f_bw, this.m_PanierRadiusDistrib);
 		int num = (this.m_PanierRadiusDistribGroup == null) ? 0 : this.m_PanierRadiusDistribGroup.Length;

+ 1 - 1
Assembly-CSharp/EditMod.cs

@@ -303,7 +303,7 @@ public class EditMod : MonoBehaviour
 		MemoryStream memoryStream = new MemoryStream();
 		BinaryWriter binaryWriter = new BinaryWriter(memoryStream);
 		binaryWriter.Write("CM3D2_MOD");
-		binaryWriter.Write(1470);
+		binaryWriter.Write(1480);
 		binaryWriter.Write(value);
 		binaryWriter.Write(text2.ToLower());
 		binaryWriter.Write(value2);

+ 1 - 1
Assembly-CSharp/EmpireLifeModeManager.cs

@@ -477,7 +477,7 @@ public class EmpireLifeModeManager : MonoBehaviour
 	public bool Serialize(BinaryWriter brWrite)
 	{
 		brWrite.Write("CM3D21_LIFE_MODE_MGR");
-		brWrite.Write(1470);
+		brWrite.Write(1480);
 		brWrite.Write("2");
 		DataArray<int, byte> saveDataScenarioExecuteCountArray = this.m_SaveDataScenarioExecuteCountArray;
 		if (EmpireLifeModeManager.<>f__mg$cache1 == null)

+ 22 - 10
Assembly-CSharp/FaceWindow.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Collections;
 using System.Collections.Generic;
 using I2.Loc;
 using UnityEngine;
@@ -48,6 +49,16 @@ public class FaceWindow : BaseMaidPhotoWindow
 	public override void Start()
 	{
 		base.Start();
+		GameMain.Instance.StartCoroutine(this.Setup());
+	}
+
+	private IEnumerator Setup()
+	{
+		do
+		{
+			yield return null;
+		}
+		while (!GameMain.Instance.MenuDataBase.JobFinished());
 		if (Product.isPublic)
 		{
 			this.PartVisibleCheckBox.gameObject.SetActive(false);
@@ -55,26 +66,26 @@ public class FaceWindow : BaseMaidPhotoWindow
 		this.placement_window_ = (base.mgr.GetWindow(PhotoWindowManager.WindowType.Placement) as PlacementWindow);
 		this.motion_window_ = (base.mgr.GetWindow(PhotoWindowManager.WindowType.Motion) as MotionWindow);
 		this.man_edit_mgr_ = new PhotoManEditManager();
-		List<SceneEdit.SMenuItem>[] array = new List<SceneEdit.SMenuItem>[]
+		List<SceneEdit.SMenuItem>[] itemLists = new List<SceneEdit.SMenuItem>[]
 		{
 			this.man_edit_mgr_.man_head_menu_list,
 			this.man_edit_mgr_.man_body_menu_list
 		};
-		UIWFTabPanel[] array2 = new UIWFTabPanel[]
+		UIWFTabPanel[] tagetPanels = new UIWFTabPanel[]
 		{
 			this.HeadItemTabPanel,
 			this.BodyItemTabPanel
 		};
-		EventDelegate.Callback[] array3 = new EventDelegate.Callback[]
+		EventDelegate.Callback[] callBackFunctions = new EventDelegate.Callback[]
 		{
 			new EventDelegate.Callback(this.OnSelectManHeadItem),
 			new EventDelegate.Callback(this.OnSelectManHeadItem)
 		};
-		for (int i = 0; i < array.Length; i++)
+		for (int i = 0; i < itemLists.Length; i++)
 		{
-			UIWFTabPanel uiwftabPanel = array2[i];
-			EventDelegate.Callback callback = array3[i];
-			foreach (SceneEdit.SMenuItem smenuItem in array[i])
+			UIWFTabPanel uiwftabPanel = tagetPanels[i];
+			EventDelegate.Callback callback = callBackFunctions[i];
+			foreach (SceneEdit.SMenuItem smenuItem in itemLists[i])
 			{
 				GameObject gameObject = Utility.CreatePrefab(uiwftabPanel.gameObject, "ScenePhotoMode/EditItemIcon", true);
 				if (smenuItem.m_texIconRef != null)
@@ -104,10 +115,10 @@ public class FaceWindow : BaseMaidPhotoWindow
 		this.CheckBoxFaceToCamera.enabled = flag;
 		checkBoxEyeToCamera.enabled = flag;
 		this.add_option_dic_ = new Dictionary<string, WFCheckBox>();
-		Transform transform = UTY.GetChildObject(this.content_game_object.gameObject, "ContentParent/AddOption/Btns", false).transform;
-		for (int j = 0; j < transform.childCount; j++)
+		Transform add_option_parent = UTY.GetChildObject(this.content_game_object.gameObject, "ContentParent/AddOption/Btns", false).transform;
+		for (int j = 0; j < add_option_parent.childCount; j++)
 		{
-			WFCheckBox component2 = transform.GetChild(j).GetComponent<WFCheckBox>();
+			WFCheckBox component2 = add_option_parent.GetChild(j).GetComponent<WFCheckBox>();
 			component2.check = false;
 			component2.enabled = false;
 			if (!Product.supportMultiLanguage)
@@ -140,6 +151,7 @@ public class FaceWindow : BaseMaidPhotoWindow
 		this.ContentParentMan.SetActive(false);
 		this.FaceMorphInput.SetFaceWindow(this);
 		this.noCharaActive.ChangeMode(true, true);
+		yield break;
 	}
 
 	public void OnDestroy()

+ 1 - 1
Assembly-CSharp/FacilityManager.cs

@@ -657,7 +657,7 @@ public class FacilityManager : MonoBehaviour
 		Stopwatch stopwatch = new Stopwatch();
 		stopwatch.Start();
 		brWrite.Write("CM3D21_FACILITY_MGR");
-		brWrite.Write(1470);
+		brWrite.Write(1480);
 		brWrite.Write("5");
 		int num = 0;
 		for (int i = 0; i < this.m_FacilityArray.Count; i++)

+ 1 - 1
Assembly-CSharp/GameInShopMain.cs

@@ -644,7 +644,7 @@ public class GameInShopMain : WfScreenChildren
 			this.backup_maid_prop_.Add(this.CreateData(maid, MPN.eye));
 			this.backup_maid_prop_.Add(this.CreateData(maid, MPN.eye_hi));
 			this.backup_maid_prop_.Add(this.CreateData(maid, MPN.eye_hi_r));
-			for (int i = 67; i <= 96; i++)
+			for (int i = 81; i <= 110; i++)
 			{
 				this.backup_maid_prop_.Add(this.CreateData(maid, (MPN)i));
 			}

+ 20 - 4
Assembly-CSharp/GameMain.cs

@@ -11,6 +11,7 @@ using MaidStatus;
 using PrivateMaidMode;
 using SceneNPCEdit;
 using Schedule;
+using scoutmode;
 using UnityEngine;
 using UnityEngine.SceneManagement;
 using UnityEngine.VR;
@@ -428,6 +429,7 @@ public class GameMain : MonoSingleton<GameMain>
 		this.m_ScenarioSelectMgr.InitScenarioData();
 		CasinoDataMgr.Instance.InitShopData();
 		VsDanceDataMgr.CreateInstance();
+		ScoutManager.CreateInstance();
 		this.m_LipSyncMgr = base.gameObject.AddComponent<OVRLipSync>();
 		this.m_LipSyncMgr.Init();
 		GameObject gameObject = GameObject.Find("SystemUI Root/Manager_SystemUI/MessageWindowMgr");
@@ -682,7 +684,7 @@ public class GameMain : MonoSingleton<GameMain>
 		serializeHeader.strComment = f_strComment;
 		serializeHeader.productTypeID = (int)Product.type;
 		binaryWriter.Write("COM3D2_SAVE");
-		binaryWriter.Write(1470);
+		binaryWriter.Write(1480);
 		this.SerializeWriteHeader(binaryWriter, serializeHeader);
 		binaryWriter.Write("bookmark_kk_01");
 		GameMain.BinaryBookmark binaryBookmark = new GameMain.BinaryBookmark(binaryWriter);
@@ -721,14 +723,16 @@ public class GameMain : MonoSingleton<GameMain>
 		CasinoDataMgr.Instance.Serialize(binaryWriter);
 		VsDanceDataMgr.Instance.Serialize(binaryWriter);
 		SaveData.Serialize(binaryWriter);
-		binaryWriter.Write(1002);
+		binaryWriter.Write(1003);
 		PrivateModeMgr.Instance.Serialize(binaryWriter);
 		this.m_CharacterMgr.SerializeAddition(binaryWriter);
+		ScoutManager.Instance.Serialize(binaryWriter);
 		string path = this.MakeSavePathFileName(f_nSaveNo);
 		File.WriteAllBytes(path, memoryStream.ToArray());
 		memoryStream.Close();
 		memoryStream.Dispose();
 		memoryStream = null;
+		ScoutManager.Instance.FixThumbnail();
 		this.UpdateSaveDataDay();
 		return true;
 	}
@@ -802,7 +806,7 @@ public class GameMain : MonoSingleton<GameMain>
 		MemoryStream memoryStream = new MemoryStream();
 		BinaryWriter binaryWriter = new BinaryWriter(memoryStream);
 		binaryWriter.Write("COM3D2_SAVE");
-		binaryWriter.Write(1470);
+		binaryWriter.Write(1480);
 		this.SerializeWriteHeader(binaryWriter, saveDataHeader);
 		binaryWriter.Write(array, (int)saveDataHeader.lHeaderSize, (int)((long)array.Length - saveDataHeader.lHeaderSize));
 		File.WriteAllBytes(path, memoryStream.ToArray());
@@ -1113,8 +1117,14 @@ public class GameMain : MonoSingleton<GameMain>
 			{
 				this.m_CharacterMgr.DeserializeAddition(binaryReader);
 			}
+			ScoutManager.ReCreateInstance();
+			if (num3 >= 1003)
+			{
+				ScoutManager.Instance.DeSerialize(binaryReader);
+			}
 			binaryReader.Close();
 			binaryReader = null;
+			ScoutManager.Instance.DeleteAllTempThumbnailFile();
 		}
 		catch (Exception ex)
 		{
@@ -1227,6 +1237,10 @@ public class GameMain : MonoSingleton<GameMain>
 	{
 		UnityEngine.Debug.Log("GameMain::OnFinalize Start");
 		base.BroadcastMessage("OnPreFinalize", SendMessageOptions.DontRequireReceiver);
+		if (this.onFinalizeEvent != null)
+		{
+			this.onFinalizeEvent();
+		}
 		UnityEngine.Object.DestroyImmediate(this.CharacterMgr);
 		UnityEngine.Object.DestroyImmediate(this.SoundMgr);
 		this.anm_parse_.Dispose();
@@ -1399,7 +1413,7 @@ public class GameMain : MonoSingleton<GameMain>
 		Product.OnApplicationQuit();
 	}
 
-	private const int SaveDataVersion = 1002;
+	private const int SaveDataVersion = 1003;
 
 	private static GameMain m_objInstance;
 
@@ -1457,6 +1471,8 @@ public class GameMain : MonoSingleton<GameMain>
 
 	private bool m_bQuitting;
 
+	public Action onFinalizeEvent;
+
 	private long m_lNewSaveDataNo = -1L;
 
 	[SerializeField]

+ 1 - 1
Assembly-CSharp/GameModeManager.cs

@@ -32,7 +32,7 @@ public static class GameModeManager
 	public static bool Serialize(BinaryWriter brWrite)
 	{
 		brWrite.Write("CM3D21_GAME_MODE_MGR");
-		brWrite.Write(1470);
+		brWrite.Write(1480);
 		brWrite.Write(1);
 		brWrite.Write((int)GameModeManager.m_NowGameModeType);
 		return true;

+ 20 - 46
Assembly-CSharp/GameUty.cs

@@ -1,7 +1,6 @@
 using System;
 using System.Collections.Generic;
 using System.IO;
-using System.Linq;
 using System.Text;
 using System.Text.RegularExpressions;
 using I2.Loc;
@@ -308,9 +307,9 @@ public class GameUty
 					{
 						GameUty.ExistCsvPathList.Add(text30);
 					}
-					for (int num15 = 2; num15 <= check_ver_no; num15++)
+					for (int num13 = 2; num13 <= check_ver_no; num13++)
 					{
-						AddFolderOrArchive(text31 + "_" + num15);
+						AddFolderOrArchive(text31 + "_" + num13);
 					}
 				}
 			}
@@ -331,7 +330,7 @@ public class GameUty
 					{
 						GameUty.ExistCsvPathList.Add(text30);
 					}
-					for (int num15 = 2; num15 <= check_ver_no; num15++)
+					for (int num13 = 2; num13 <= check_ver_no; num13++)
 					{
 						AddFolderOrArchive(string.Concat(new object[]
 						{
@@ -339,7 +338,7 @@ public class GameUty
 							"_",
 							text30,
 							"_",
-							num15
+							num13
 						}));
 					}
 				}
@@ -355,7 +354,7 @@ public class GameUty
 					{
 						GameUty.ExistCsvPathList.Add(text30);
 					}
-					for (int num15 = 2; num15 <= check_ver_no; num15++)
+					for (int num13 = 2; num13 <= check_ver_no; num13++)
 					{
 						AddFolderOrArchive(string.Concat(new object[]
 						{
@@ -363,7 +362,7 @@ public class GameUty
 							"_",
 							text30,
 							"_",
-							num15
+							num13
 						}));
 					}
 				}
@@ -729,7 +728,11 @@ public class GameUty
 			AddFolderOrArchive("parts2");
 			Debug.Log("■■■■■■■■■■■■■■■■■■■■" + stopWatch.Stop().ToString() + " ms");
 		}
-		GameUty.m_FileSystem.AddAutoPathForAllFolder();
+		GameUty.m_FileSystem.AddAutoPathForAllFolder(true);
+		while (!GameUty.m_FileSystem.IsFinishedAddAutoPathJob(true))
+		{
+		}
+		GameUty.m_FileSystem.ReleaseAddAutoPathJob();
 		if (Product.isPublic && !GameUty.m_FileSystem.IsExistentFile("21C399027026.dat"))
 		{
 			NDebug.MessageBox("Error", Product.type.ToString() + " : 21C399027026.dat");
@@ -792,49 +795,16 @@ public class GameUty
 				}
 			}
 		}
-		string[] fileListAtExtension = GameUty.m_FileSystem.GetFileListAtExtension(".menu");
-		List<string> list3 = new List<string>();
-		foreach (string path3 in fileListAtExtension)
-		{
-			list3.Add(Path.GetFileName(path3));
-		}
-		GameUty.m_aryMenuFiles = list3.ToArray();
 		if (GameUty.m_ModFileSystem != null)
 		{
-			string[] list4 = GameUty.m_ModFileSystem.GetList(string.Empty, AFileSystemBase.ListType.AllFile);
-			GameUty.m_aryModOnlysMenuFiles = Array.FindAll<string>(list4, (string i) => new Regex(".*\\.menu$").IsMatch(i));
-			GameUty.m_aryMenuFiles = GameUty.m_aryMenuFiles.Concat(GameUty.m_aryModOnlysMenuFiles).ToArray<string>();
+			string[] list3 = GameUty.m_ModFileSystem.GetList(string.Empty, AFileSystemBase.ListType.AllFile);
+			GameUty.m_aryModOnlysMenuFiles = Array.FindAll<string>(list3, (string i) => new Regex(".*\\.menu$").IsMatch(i));
 		}
 		if (GameUty.m_aryModOnlysMenuFiles != null && GameUty.m_aryModOnlysMenuFiles.Length != 0)
 		{
 			GameUty.ModPriorityToModFolderInfo = string.Empty;
 			Debug.Log(GameUty.ModPriorityToModFolderInfo + "■MOD有り。MODフォルダ優先モード" + GameUty.ModPriorityToModFolder.ToString());
 		}
-		if (GameUty.rid_menu_dic_.Count == 0)
-		{
-			string[] menuFiles = GameUty.MenuFiles;
-			GameUty.rid_menu_dic_ = new Dictionary<int, string>();
-			for (int num14 = 0; num14 < menuFiles.Length; num14++)
-			{
-				string fileName3 = Path.GetFileName(menuFiles[num14]);
-				int hashCode = fileName3.ToLower().GetHashCode();
-				if (!GameUty.rid_menu_dic_.ContainsKey(hashCode))
-				{
-					GameUty.rid_menu_dic_.Add(hashCode, fileName3);
-				}
-				else
-				{
-					NDebug.Assert(fileName3 == GameUty.rid_menu_dic_[hashCode], string.Concat(new string[]
-					{
-						"[",
-						fileName3,
-						"]と[",
-						GameUty.rid_menu_dic_[hashCode],
-						"]は同じハッシュキーです"
-					}));
-				}
-			}
-		}
 	}
 
 	public static void UpdateFileSystemPathToNewProduct()
@@ -1318,7 +1288,11 @@ public class GameUty
 		}
 		AddFolderOrArchive("voice2");
 		AddFolderOrArchive("voice3");
-		fileSystem.AddAutoPathForAllFolder();
+		fileSystem.AddAutoPathForAllFolder(true);
+		while (!fileSystem.IsFinishedAddAutoPathJob(true))
+		{
+		}
+		fileSystem.ReleaseAddAutoPathJob();
 		string[] list = fileSystem.GetList("bg", AFileSystemBase.ListType.AllFile);
 		if (list != null && 0 < list.Length)
 		{
@@ -1404,14 +1378,14 @@ public class GameUty
 
 	public static string GetBuildVersionText()
 	{
-		int num = 1470;
+		int num = 1480;
 		return (num >= 1000) ? ((float)num / 1000f).ToString("F2") : ((float)num / 100f).ToString("F2");
 	}
 
 	public static string GetGameVersionText()
 	{
 		string text = "COM3D2x64.exe";
-		int num = 1470;
+		int num = 1480;
 		string path = UTY.gameProjectPath + "\\update.lst";
 		string[] array = new string[0];
 		if (File.Exists(path))

+ 2 - 2
Assembly-CSharp/HandSignShortcut.cs

@@ -506,7 +506,7 @@ public class HandSignShortcut : MonoBehaviour
 	{
 		public void OnBeforeSerialize()
 		{
-			this.m_nVersion = 1470;
+			this.m_nVersion = 1480;
 		}
 
 		public void OnAfterDeserialize()
@@ -815,7 +815,7 @@ public class HandSignShortcut : MonoBehaviour
 		private const string CONF_NAME = "MaidFingerDataList.json";
 
 		[SerializeField]
-		private int m_nVersion = 1470;
+		private int m_nVersion = 1480;
 
 		[SerializeField]
 		private List<HandSignShortcut.MaidFingerData> MaidFingerDataList = new List<HandSignShortcut.MaidFingerData>();

+ 3 - 3
Assembly-CSharp/Kasizuki/KasizukiManager.cs

@@ -459,7 +459,7 @@ namespace Kasizuki
 			PlayerStatus.Status status = GameMain.Instance.CharacterMgr.status;
 			target.status.lastName = this.m_CachedOriginPlayerName;
 			status.playerName = this.m_CachedOriginPlayerName;
-			for (int i = 0; i < 114; i++)
+			for (int i = 0; i < 131; i++)
 			{
 				MPN mpn = (MPN)i;
 				if (mpn != MPN.null_mpn)
@@ -476,7 +476,7 @@ namespace Kasizuki
 		{
 			this.m_CachedOriginPlayerDataDic = new Dictionary<MPN, MaidProp>();
 			Maid man = GameMain.Instance.CharacterMgr.GetMan(0);
-			for (int i = 0; i < 114; i++)
+			for (int i = 0; i < 131; i++)
 			{
 				MPN mpn = (MPN)i;
 				MaidProp maidProp = new MaidProp();
@@ -872,7 +872,7 @@ namespace Kasizuki
 		public void Serialize(BinaryWriter bw)
 		{
 			bw.Write("COM3D2_KASIZUKI");
-			bw.Write(1470);
+			bw.Write(1480);
 			this.SerializeOriginHeader(bw);
 			foreach (KeyValuePair<int, KasizukiManager.SaveData> keyValuePair in this.m_SaveDataArray)
 			{

+ 17 - 0
Assembly-CSharp/MPN.cs

@@ -45,6 +45,17 @@ public enum MPN
 	MuneUpDown,
 	MuneYori,
 	MuneYawaraka,
+	MayuThick,
+	MayuLong,
+	Yorime,
+	MabutaUpIn,
+	MabutaUpIn2,
+	MabutaUpMiddle,
+	MabutaUpOut,
+	MabutaUpOut2,
+	MabutaLowIn,
+	MabutaLowUpMiddle,
+	MabutaLowUpOut,
 	body,
 	moza,
 	head,
@@ -69,6 +80,9 @@ public enum MPN
 	eyewhite,
 	nose,
 	facegloss,
+	matsuge_up,
+	matsuge_low,
+	futae,
 	wear,
 	skirt,
 	mizugi,
@@ -108,6 +122,9 @@ public enum MPN
 	folder_underhair,
 	folder_skin,
 	folder_eyewhite,
+	folder_matsuge_up,
+	folder_matsuge_low,
+	folder_futae,
 	kousoku_upper,
 	kousoku_lower,
 	seieki_naka,

+ 8 - 8
Assembly-CSharp/MPN_TYPE_RANGE.cs

@@ -3,14 +3,14 @@
 public enum MPN_TYPE_RANGE
 {
 	BODY_START = 1,
-	BODY_END = 66,
-	BODY_RELOAD_START = 44,
-	BODY_RELOAD_END = 100,
-	WEAR_START = 67,
-	WEAR_END = 96,
+	BODY_END = 80,
+	BODY_RELOAD_START = 55,
+	BODY_RELOAD_END = 114,
+	WEAR_START = 81,
+	WEAR_END = 110,
 	SET_START,
-	SET_END = 100,
+	SET_END = 114,
 	FOLDER_BODY_START,
-	FOLDER_BODY_END = 105,
-	MAX = 114
+	FOLDER_BODY_END = 122,
+	MAX = 131
 }

+ 133 - 32
Assembly-CSharp/Maid.cs

@@ -112,6 +112,36 @@ public class Maid : MonoBehaviour
 		}
 	}
 
+	public static string GetThumbnailFilePath(string guid, bool temp)
+	{
+		string thumbnailDictionary = Maid.ThumbnailDictionary;
+		if (Directory.Exists(thumbnailDictionary))
+		{
+			Directory.CreateDirectory(thumbnailDictionary);
+		}
+		return Path.Combine(thumbnailDictionary, ((!temp) ? string.Empty : "_tmp_thum_") + guid + ".png");
+	}
+
+	public static string GetIconThumbnailFilePath(string guid, bool temp)
+	{
+		string thumbnailDictionary = Maid.ThumbnailDictionary;
+		if (Directory.Exists(thumbnailDictionary))
+		{
+			Directory.CreateDirectory(thumbnailDictionary);
+		}
+		return Path.Combine(thumbnailDictionary, ((!temp) ? "icon_thum_" : "icon_thum_") + guid + ".png");
+	}
+
+	public static string GetKasizukiThumbnailFilePath(string guid, bool temp)
+	{
+		string thumbnailDictionary = Maid.ThumbnailDictionary;
+		if (Directory.Exists(thumbnailDictionary))
+		{
+			Directory.CreateDirectory(thumbnailDictionary);
+		}
+		return Path.Combine(thumbnailDictionary, ((!temp) ? "kasizuki_" : "_tmp_kasizuki_") + guid + ".png");
+	}
+
 	public static string ThumbnailDictionary
 	{
 		get
@@ -265,6 +295,17 @@ public class Maid : MonoBehaviour
 			Maid.CreateProp(0, 100, 10, MPN.MuneUpDown, 2),
 			Maid.CreateProp(0, 100, 40, MPN.MuneYori, 2),
 			Maid.CreateProp(0, 100, 50, MPN.MuneYawaraka, 2),
+			Maid.CreateProp(0, 100, 50, MPN.MayuThick, 2),
+			Maid.CreateProp(0, 100, 50, MPN.MayuLong, 2),
+			Maid.CreateProp(0, 100, 50, MPN.Yorime, 2),
+			Maid.CreateProp(0, 100, 50, MPN.MabutaUpIn, 1),
+			Maid.CreateProp(0, 100, 50, MPN.MabutaUpIn2, 1),
+			Maid.CreateProp(0, 100, 50, MPN.MabutaUpMiddle, 1),
+			Maid.CreateProp(0, 100, 50, MPN.MabutaUpOut, 1),
+			Maid.CreateProp(0, 100, 50, MPN.MabutaUpOut2, 1),
+			Maid.CreateProp(0, 100, 50, MPN.MabutaLowIn, 1),
+			Maid.CreateProp(0, 100, 50, MPN.MabutaLowUpMiddle, 1),
+			Maid.CreateProp(0, 100, 50, MPN.MabutaLowUpOut, 1),
 			Maid.CreateProp(string.Empty, MPN.body, 3),
 			Maid.CreateProp(string.Empty, MPN.head, 3),
 			Maid.CreateProp(string.Empty, MPN.hairf, 3),
@@ -317,6 +358,9 @@ public class Maid : MonoBehaviour
 			Maid.CreateProp(string.Empty, MPN.eyewhite, 3),
 			Maid.CreateProp(string.Empty, MPN.nose, 3),
 			Maid.CreateProp(string.Empty, MPN.facegloss, 3),
+			Maid.CreateProp(string.Empty, MPN.matsuge_up, 3),
+			Maid.CreateProp(string.Empty, MPN.matsuge_low, 3),
+			Maid.CreateProp(string.Empty, MPN.futae, 3),
 			Maid.CreateProp(string.Empty, MPN.moza, 3),
 			Maid.CreateProp(string.Empty, MPN.onepiece, 3),
 			Maid.CreateProp(string.Empty, MPN.set_maidwear, 3),
@@ -328,6 +372,9 @@ public class Maid : MonoBehaviour
 			Maid.CreateProp(string.Empty, MPN.folder_underhair, 3),
 			Maid.CreateProp(string.Empty, MPN.folder_skin, 3),
 			Maid.CreateProp(string.Empty, MPN.folder_eyewhite, 3),
+			Maid.CreateProp(string.Empty, MPN.folder_matsuge_up, 3),
+			Maid.CreateProp(string.Empty, MPN.folder_matsuge_low, 3),
+			Maid.CreateProp(string.Empty, MPN.folder_futae, 3),
 			Maid.CreateProp(string.Empty, MPN.kousoku_upper, 3),
 			Maid.CreateProp(string.Empty, MPN.kousoku_lower, 3),
 			Maid.CreateProp(string.Empty, MPN.seieki_naka, 3),
@@ -547,7 +594,7 @@ public class Maid : MonoBehaviour
 		flag = (prop.m_dicTBodyAttachPos.Count != 0);
 		flag2 = (prop.m_dicMaterialProp.Count != 0);
 		flag3 = (prop.m_dicBoneLength.Count != 0);
-		if (mps.idx != 43)
+		if (mps.idx != 54)
 		{
 			this.SetProp((MPN)mps.idx, mps.strFileName, mps.nFileNameRID, false, false);
 		}
@@ -559,7 +606,7 @@ public class Maid : MonoBehaviour
 			{
 				prop2.m_dicTBodySkinPos[keyValuePair.Key] = new KeyValuePair<int, BoneAttachPos>(keyValuePair.Value.Key, new BoneAttachPos(keyValuePair.Value.Value));
 			}
-			if (mps.idx != 43)
+			if (mps.idx != 54)
 			{
 				prop2.boDut = true;
 			}
@@ -578,7 +625,7 @@ public class Maid : MonoBehaviour
 				}
 				prop3.m_dicTBodyAttachPos[keyValuePair2.Key] = dictionary;
 			}
-			if (mps.idx != 43)
+			if (mps.idx != 54)
 			{
 				prop3.boDut = true;
 			}
@@ -592,7 +639,7 @@ public class Maid : MonoBehaviour
 			{
 				prop4.m_dicMaterialProp[keyValuePair4.Key] = new KeyValuePair<int, MatPropSave>(keyValuePair4.Value.Key, new MatPropSave(keyValuePair4.Value.Value));
 			}
-			if (mps.idx != 43)
+			if (mps.idx != 54)
 			{
 				prop4.boDut = true;
 			}
@@ -611,7 +658,7 @@ public class Maid : MonoBehaviour
 				}
 				prop5.m_dicBoneLength[keyValuePair5.Key] = new KeyValuePair<int, Dictionary<string, float>>(keyValuePair5.Value.Key, dictionary2);
 			}
-			if (mps.idx != 43)
+			if (mps.idx != 54)
 			{
 				prop5.boDut = true;
 			}
@@ -638,12 +685,12 @@ public class Maid : MonoBehaviour
 				}
 				if (Product.isPublic)
 				{
-					if (mp.idx == 71 && filename.ToLower() != "pants030_i_.menu")
+					if (mp.idx == 85 && filename.ToLower() != "pants030_i_.menu")
 					{
 						this.SetProp(mp, "pants030_i_.menu", 0, f_bTemp, f_bNoScale);
 						return;
 					}
-					if (mp.idx == 70 && filename.ToLower() != "bra030_i_.menu")
+					if (mp.idx == 84 && filename.ToLower() != "bra030_i_.menu")
 					{
 						this.SetProp(mp, "bra030_i_.menu", 0, f_bTemp, f_bNoScale);
 						return;
@@ -653,7 +700,7 @@ public class Maid : MonoBehaviour
 		}
 		else
 		{
-			if (mp.strFileName != filename || mp.bSubDut || (97 <= mp.idx && mp.idx <= 100))
+			if (mp.strFileName != filename || mp.bSubDut || (111 <= mp.idx && mp.idx <= 114))
 			{
 				mp.boDut = true;
 			}
@@ -685,7 +732,7 @@ public class Maid : MonoBehaviour
 				{
 					f_nFileNameRID = 0;
 				}
-				if (mp.idx == 96)
+				if (mp.idx == 110)
 				{
 					this.m_strBefOnepiceFileName = filename;
 					this.m_nBefOnepiceRID = f_nFileNameRID;
@@ -705,7 +752,7 @@ public class Maid : MonoBehaviour
 						}
 					}
 				}
-				else if (mp.idx == 67)
+				else if (mp.idx == 81)
 				{
 					this.m_strBefWearFileName = filename;
 					this.m_nBefWearRID = f_nFileNameRID;
@@ -718,7 +765,7 @@ public class Maid : MonoBehaviour
 						}
 					}
 				}
-				else if (mp.idx == 68)
+				else if (mp.idx == 82)
 				{
 					this.m_strBefSkirtFileName = filename;
 					this.m_nBefSkirtRID = f_nFileNameRID;
@@ -733,12 +780,12 @@ public class Maid : MonoBehaviour
 				}
 				else
 				{
-					if (mp.idx == 71 && filename.ToLower() != "pants030_i_.menu")
+					if (mp.idx == 85 && filename.ToLower() != "pants030_i_.menu")
 					{
 						this.SetProp(mp, "pants030_i_.menu", 0, f_bTemp, f_bNoScale);
 						return;
 					}
-					if (mp.idx == 70 && filename.ToLower() != "bra030_i_.menu")
+					if (mp.idx == 84 && filename.ToLower() != "bra030_i_.menu")
 					{
 						this.SetProp(mp, "bra030_i_.menu", 0, f_bTemp, f_bNoScale);
 						return;
@@ -956,19 +1003,19 @@ public class Maid : MonoBehaviour
 						this.body0.FixVisibleFlag(true);
 						this.boModelChg = true;
 					}
-					if (this.boMAN && maidProp.idx == 43)
+					if (this.boMAN && maidProp.idx == 54)
 					{
-						for (int i = 44; i <= 100; i++)
+						for (int i = 55; i <= 114; i++)
 						{
 							this.GetProp((MPN)i).boDut = true;
 						}
 						this.GetProp(MPN.moza).boDut = true;
 					}
-					else if (maidProp.idx == 50 || maidProp.idx == 46 || maidProp.idx == 47 || maidProp.idx == 49 || maidProp.idx == 48)
+					else if (maidProp.idx == 61 || maidProp.idx == 57 || maidProp.idx == 58 || maidProp.idx == 60 || maidProp.idx == 59)
 					{
 						this.GetProp(MPN.haircolor).boDut = true;
 					}
-					else if (maidProp.idx == 45)
+					else if (maidProp.idx == 56)
 					{
 						MPN[] array = new MPN[]
 						{
@@ -995,14 +1042,25 @@ public class Maid : MonoBehaviour
 							MPN.eyewhite,
 							MPN.nose,
 							MPN.facegloss,
-							MPN.lip
+							MPN.lip,
+							MPN.MayuThick,
+							MPN.MayuLong,
+							MPN.Yorime,
+							MPN.MabutaUpIn,
+							MPN.MabutaUpIn2,
+							MPN.MabutaUpMiddle,
+							MPN.MabutaUpOut,
+							MPN.MabutaUpOut2,
+							MPN.MabutaLowIn,
+							MPN.MabutaLowUpMiddle,
+							MPN.MabutaLowUpOut
 						};
 						foreach (MPN mpn in array)
 						{
 							this.GetProp(mpn).boDut = true;
 						}
 					}
-					else if (maidProp.idx == 52)
+					else if (maidProp.idx == 63)
 					{
 						MaidProp prop = this.GetProp(MPN.acctatoo);
 						prop.boDut = true;
@@ -1031,6 +1089,9 @@ public class Maid : MonoBehaviour
 						this.GetProp(MPN.lip).boDut = true;
 						this.GetProp(MPN.nose).boDut = true;
 						this.GetProp(MPN.facegloss).boDut = true;
+						this.GetProp(MPN.matsuge_up).boDut = true;
+						this.GetProp(MPN.matsuge_low).boDut = true;
+						this.GetProp(MPN.futae).boDut = true;
 					}
 					break;
 				}
@@ -1107,19 +1168,19 @@ public class Maid : MonoBehaviour
 						this.body0.FixVisibleFlag(true);
 						this.boModelChg = true;
 					}
-					if (this.boMAN && maidProp.idx == 43)
+					if (this.boMAN && maidProp.idx == 54)
 					{
-						for (int j = 44; j <= 100; j++)
+						for (int j = 55; j <= 114; j++)
 						{
 							this.GetProp((MPN)j).boDut = true;
 						}
 						this.GetProp(MPN.moza).boDut = true;
 					}
-					else if (maidProp.idx == 50 || maidProp.idx == 46 || maidProp.idx == 47 || maidProp.idx == 49 || maidProp.idx == 48)
+					else if (maidProp.idx == 61 || maidProp.idx == 57 || maidProp.idx == 58 || maidProp.idx == 60 || maidProp.idx == 59)
 					{
 						this.GetProp(MPN.haircolor).boDut = true;
 					}
-					else if (maidProp.idx == 45)
+					else if (maidProp.idx == 56)
 					{
 						MPN[] array = new MPN[]
 						{
@@ -1146,14 +1207,25 @@ public class Maid : MonoBehaviour
 							MPN.eyewhite,
 							MPN.nose,
 							MPN.facegloss,
-							MPN.lip
+							MPN.lip,
+							MPN.MayuThick,
+							MPN.MayuLong,
+							MPN.Yorime,
+							MPN.MabutaUpIn,
+							MPN.MabutaUpIn2,
+							MPN.MabutaUpMiddle,
+							MPN.MabutaUpOut,
+							MPN.MabutaUpOut2,
+							MPN.MabutaLowIn,
+							MPN.MabutaLowUpMiddle,
+							MPN.MabutaLowUpOut
 						};
 						foreach (MPN mpn in array)
 						{
 							this.GetProp(mpn).boDut = true;
 						}
 					}
-					else if (maidProp.idx == 52)
+					else if (maidProp.idx == 63)
 					{
 						MaidProp prop = this.GetProp(MPN.acctatoo);
 						prop.boDut = true;
@@ -1182,6 +1254,9 @@ public class Maid : MonoBehaviour
 						this.GetProp(MPN.lip).boDut = true;
 						this.GetProp(MPN.nose).boDut = true;
 						this.GetProp(MPN.facegloss).boDut = true;
+						this.GetProp(MPN.matsuge_up).boDut = true;
+						this.GetProp(MPN.matsuge_low).boDut = true;
+						this.GetProp(MPN.futae).boDut = true;
 					}
 				}
 			}
@@ -1246,7 +1321,7 @@ public class Maid : MonoBehaviour
 		}
 		else if (mp.type == 3)
 		{
-			if (Product.isPublic && (mp.boTempDut || mp.boDut) && (mp.idx == 44 || mp.idx == 55 || mp.idx == 62 || mp.idx == 63 || mp.idx == 44 || mp.idx == 82 || mp.idx == 90 || mp.idx == 91 || mp.idx == 93))
+			if (Product.isPublic && (mp.boTempDut || mp.boDut) && (mp.idx == 55 || mp.idx == 66 || mp.idx == 73 || mp.idx == 74 || mp.idx == 55 || mp.idx == 96 || mp.idx == 104 || mp.idx == 105 || mp.idx == 107))
 			{
 				mp.boDut = false;
 				mp.boTempDut = false;
@@ -1274,7 +1349,7 @@ public class Maid : MonoBehaviour
 				}
 				result = true;
 				mp.boTempDut = false;
-				if (97 <= mp.idx && mp.idx <= 100)
+				if (111 <= mp.idx && mp.idx <= 114)
 				{
 					mp.nTempFileNameRID = 0;
 					mp.strTempFileName = string.Empty;
@@ -1292,7 +1367,7 @@ public class Maid : MonoBehaviour
 				}
 				result = true;
 				mp.boDut = false;
-				if (97 <= mp.idx && mp.idx <= 100)
+				if (111 <= mp.idx && mp.idx <= 114)
 				{
 					mp.nFileNameRID = 0;
 					mp.strFileName = string.Empty;
@@ -1366,6 +1441,31 @@ public class Maid : MonoBehaviour
 		}
 	}
 
+	public int MayuAlpha
+	{
+		get
+		{
+			string materialProperty = this.body0.GetMaterialProperty("head", 3, "_Color", "Color");
+			if (string.IsNullOrEmpty(materialProperty))
+			{
+				return 0;
+			}
+			string[] array = materialProperty.Split(new char[]
+			{
+				':'
+			});
+			if (array == null || array.Length != 4)
+			{
+				return 0;
+			}
+			return (int)(float.Parse(array[3]) * 100f);
+		}
+		set
+		{
+			this.body0.SetMaterialProperty("mayu", "head", 3, "_Color", "Color", "1.0:1.0:1.0:" + ((float)value / 100f).ToString(), true);
+		}
+	}
+
 	public void SubPropAlpha(MPN f_mpn, int f_nSubNo, float f_fTexMulAlpha)
 	{
 		MaidProp maidProp = this.m_aryMaidProp[(int)f_mpn];
@@ -1386,7 +1486,7 @@ public class Maid : MonoBehaviour
 	public bool SerializeProp(BinaryWriter f_bwWrite)
 	{
 		f_bwWrite.Write("CM3D2_MPROP_LIST");
-		f_bwWrite.Write(1470);
+		f_bwWrite.Write(1480);
 		f_bwWrite.Write(this.m_dicMaidProp.Count);
 		int num = 0;
 		foreach (KeyValuePair<string, MaidProp> keyValuePair in this.m_dicMaidProp)
@@ -1420,7 +1520,7 @@ public class Maid : MonoBehaviour
 	public bool SerializeMisc(BinaryWriter f_bwWrite)
 	{
 		f_bwWrite.Write("CM3D2_MAID_MISC");
-		f_bwWrite.Write(1470);
+		f_bwWrite.Write(1480);
 		f_bwWrite.Write(this.m_nActiveSlotNo);
 		if (this.m_texIcon != null)
 		{
@@ -1445,7 +1545,7 @@ public class Maid : MonoBehaviour
 	public bool SerializeBody(BinaryWriter f_bwWrite)
 	{
 		f_bwWrite.Write("CM3D2_MAID_BODY");
-		f_bwWrite.Write(1470);
+		f_bwWrite.Write(1480);
 		return true;
 	}
 
@@ -1460,7 +1560,7 @@ public class Maid : MonoBehaviour
 			string tag = f_brRead.ReadString();
 			MaidProp prop = this.GetProp(tag);
 			prop.Deserialize(f_brRead);
-			if (num <= 135 && prop.idx == 83 && Path.GetFileNameWithoutExtension(prop.strFileName.ToLower()) == "acckubi007_i_")
+			if (num <= 135 && prop.idx == 97 && Path.GetFileNameWithoutExtension(prop.strFileName.ToLower()) == "acckubi007_i_")
 			{
 				prop.boDut = true;
 				prop.strFileName = CM3.dicDelItem[MPN.acckubi];
@@ -1615,6 +1715,7 @@ public class Maid : MonoBehaviour
 		return list;
 	}
 
+	[Obsolete("GameUty.RidMenuDic廃止により使用不可", true)]
 	public static List<MaidProp> DeserializePropLowCapacity(BinaryReader reader)
 	{
 		List<MaidProp> list = Maid.CreateInitMaidPropList();

+ 30 - 6
Assembly-CSharp/MaidParts.cs

@@ -8,7 +8,7 @@ public class MaidParts : MonoBehaviour
 	{
 		this.m_objMaid = f_objMaid;
 		this.m_Maid = f_Maid;
-		for (int i = 0; i < 10; i++)
+		for (int i = 0; i < 13; i++)
 		{
 			this.m_aryPartsColor[i] = MaidParts.m_aryPartsColorDefault[i];
 			this.m_aryPartsColorTable[i] = new Texture2D(256, 1, TextureFormat.RGBA32, false);
@@ -37,7 +37,7 @@ public class MaidParts : MonoBehaviour
 	public unsafe bool Serialize(BinaryWriter f_bwWrite)
 	{
 		f_bwWrite.Write("CM3D2_MULTI_COL");
-		f_bwWrite.Write(1470);
+		f_bwWrite.Write(1480);
 		f_bwWrite.Write(this.m_aryPartsColor.Length);
 		for (int i = 0; i < this.m_aryPartsColor.Length; i++)
 		{
@@ -63,8 +63,8 @@ public class MaidParts : MonoBehaviour
 
 	public unsafe static MaidParts.PartsColor[] DeserializePre(BinaryReader f_brRead)
 	{
-		MaidParts.PartsColor[] array = new MaidParts.PartsColor[10];
-		for (int i = 0; i < 10; i++)
+		MaidParts.PartsColor[] array = new MaidParts.PartsColor[13];
+		for (int i = 0; i < 13; i++)
 		{
 			array[i] = MaidParts.m_aryPartsColorDefault[i];
 		}
@@ -207,12 +207,33 @@ public class MaidParts : MonoBehaviour
 			m_nShadowChroma = 79,
 			m_nShadowBrightness = 321,
 			m_nShadowContrast = 0
+		},
+		new MaidParts.PartsColor
+		{
+			m_nMainHue = 0,
+			m_nMainChroma = 56,
+			m_nMainBrightness = 185,
+			m_nMainContrast = 47
+		},
+		new MaidParts.PartsColor
+		{
+			m_nMainHue = 0,
+			m_nMainChroma = 56,
+			m_nMainBrightness = 185,
+			m_nMainContrast = 47
+		},
+		new MaidParts.PartsColor
+		{
+			m_nMainHue = 18,
+			m_nMainChroma = 60,
+			m_nMainBrightness = 200,
+			m_nMainContrast = 128
 		}
 	};
 
-	private MaidParts.PartsColor[] m_aryPartsColor = new MaidParts.PartsColor[10];
+	private MaidParts.PartsColor[] m_aryPartsColor = new MaidParts.PartsColor[13];
 
-	private Texture2D[] m_aryPartsColorTable = new Texture2D[10];
+	private Texture2D[] m_aryPartsColorTable = new Texture2D[13];
 
 	private GameObject m_objMaid;
 
@@ -231,6 +252,9 @@ public class MaidParts : MonoBehaviour
 		HAIR_OUTLINE,
 		SKIN_OUTLINE,
 		EYE_WHITE,
+		MATSUGE_UP,
+		MATSUGE_LOW,
+		FUTAE,
 		MAX
 	}
 

+ 4 - 3
Assembly-CSharp/MaidProp.cs

@@ -8,7 +8,7 @@ public class MaidProp
 	public bool Serialize(BinaryWriter f_bwWrite)
 	{
 		f_bwWrite.Write("CM3D2_MPROP");
-		f_bwWrite.Write(1470);
+		f_bwWrite.Write(1480);
 		f_bwWrite.Write(this.idx);
 		f_bwWrite.Write(this.name);
 		f_bwWrite.Write(this.type);
@@ -189,7 +189,7 @@ public class MaidProp
 			this.strFileName = "_I_mayu_001_mugen.menu";
 			this.nFileNameRID = this.strFileName.ToLower().GetHashCode();
 		}
-		if (num <= 208 && this.idx == 54 && this.strFileName.ToLower() == "_I_acctatoo_del.menu".ToLower())
+		if (num <= 208 && this.idx == 65 && this.strFileName.ToLower() == "_I_acctatoo_del.menu".ToLower())
 		{
 			this.strFileName = CM3.dicDelItem[MPN.accnail];
 			this.nFileNameRID = this.strFileName.ToLower().GetHashCode();
@@ -284,7 +284,7 @@ public class MaidProp
 				}
 			}
 		}
-		if (num < 200 && this.idx == 47 && Path.GetFileNameWithoutExtension(this.strFileName.ToLower()) == "hair_r095_i_")
+		if (num < 200 && this.idx == 58 && Path.GetFileNameWithoutExtension(this.strFileName.ToLower()) == "hair_r095_i_")
 		{
 			this.strFileName = "hair_r110_i_.menu";
 			this.nFileNameRID = this.strFileName.ToLower().GetHashCode();
@@ -296,6 +296,7 @@ public class MaidProp
 		return true;
 	}
 
+	[Obsolete("GameUty.RidMenuDic廃止により使用不可", true)]
 	public bool DeserializeLowCapacity(BinaryReader reader)
 	{
 		this.value = reader.ReadInt32();

+ 17 - 5
Assembly-CSharp/MaidStatus/PersonalEventBlocker.cs

@@ -12,11 +12,23 @@ namespace MaidStatus
 				return;
 			}
 			PersonalEventBlocker.blockerDataList = new List<PersonalEventBlocker.Data>();
-			if (Product.type != Product.Type.EnAdult)
+			string text = string.Empty;
+			string str = string.Empty;
+			if (Product.type == Product.Type.EnAdult)
+			{
+				text = "maid_personaleventblocker_list.nei";
+				str = "maid_personaleventblocker_unlocklist_";
+			}
+			else if (Product.type == Product.Type.JpAdult)
+			{
+				text = "maid_personaleventblocker_list_jp.nei";
+				str = "maid_personaleventblocker_unlocklist_jp_";
+			}
+			if (string.IsNullOrEmpty(text) || !GameUty.FileSystem.IsExistentFile(text))
 			{
 				return;
 			}
-			using (AFileBase afileBase = GameUty.FileSystem.FileOpen("maid_personaleventblocker_list.nei"))
+			using (AFileBase afileBase = GameUty.FileSystem.FileOpen(text))
 			{
 				using (CsvParser csvParser = new CsvParser())
 				{
@@ -36,9 +48,9 @@ namespace MaidStatus
 			if (GameUty.PathList != null)
 			{
 				HashSet<PersonalEventBlocker.Data> hashSet = new HashSet<PersonalEventBlocker.Data>();
-				foreach (string str in GameUty.PathList)
+				foreach (string str2 in GameUty.PathList)
 				{
-					string f_strFileName = "maid_personaleventblocker_unlocklist_" + str + ".nei";
+					string f_strFileName = str + str2 + ".nei";
 					if (GameUty.FileSystem.IsExistentFile(f_strFileName))
 					{
 						using (AFileBase afileBase2 = GameUty.FileSystem.FileOpen(f_strFileName))
@@ -105,7 +117,7 @@ namespace MaidStatus
 
 		public static bool IsEnabledLifeMode(Personal.Data personal)
 		{
-			return PersonalEventBlocker.GetData(personal) == null;
+			return Product.type != Product.Type.EnAdult || PersonalEventBlocker.GetData(personal) == null;
 		}
 
 		private static List<PersonalEventBlocker.Data> blockerDataList;

+ 26 - 5
Assembly-CSharp/MaidStatus/Status.cs

@@ -809,6 +809,18 @@ namespace MaidStatus
 			}
 		}
 
+		public bool isScoutMaid
+		{
+			get
+			{
+				return this.flags_["__is_scout_maid"] == 1;
+			}
+			set
+			{
+				this.flags_["__is_scout_maid"] = ((!value) ? 0 : 1);
+			}
+		}
+
 		public int inranGap
 		{
 			get
@@ -912,14 +924,19 @@ namespace MaidStatus
 			return str;
 		}
 
-		public void Initialize(Maid maid)
+		public void SetNewGuidAndCreationTime(string guidText = null, string creationTimeText = null)
 		{
-			this.maid = maid;
-			this.guid = Guid.NewGuid().ToString();
-			this.creationTime = DateTime.Now.ToString("G", new CultureInfo("ja-JP")).Replace("/", string.Empty);
+			this.guid = ((!string.IsNullOrEmpty(guidText)) ? guidText : Guid.NewGuid().ToString());
+			this.creationTime = ((!string.IsNullOrEmpty(creationTimeText)) ? creationTimeText : DateTime.Now.ToString("G", new CultureInfo("ja-JP")).Replace("/", string.Empty));
 			string text = this.creationTime.Replace(":", string.Empty);
 			text = text.Replace(" ", string.Empty);
 			this.creationTimeNum = ulong.Parse(text);
+		}
+
+		public void Initialize(Maid maid)
+		{
+			this.maid = maid;
+			this.SetNewGuidAndCreationTime(null, null);
 			this.employmentDay = GameMain.Instance.CharacterMgr.status.days;
 			this.additionalRelation = AdditionalRelation.Vigilance;
 			this.specialRelation = SpecialRelation.Null;
@@ -1355,7 +1372,7 @@ namespace MaidStatus
 		{
 			this.SetFlag("__1330_specialrelation__", (int)this.specialRelation);
 			binary.Write("CM3D2_MAID_STATUS");
-			binary.Write(1470);
+			binary.Write(1480);
 			binary.Write(this.guid);
 			binary.Write(this.creationTime);
 			binary.Write((short)this.heroineType);
@@ -1774,6 +1791,10 @@ namespace MaidStatus
 					this.yotogiSkill.Add(data2);
 				}
 			}
+			if (this.GetFlag("処女喪失シナリオ初回") == 1 && this.initSeikeiken != Seikeiken.No_No)
+			{
+				this.initSeikeiken = Seikeiken.No_No;
+			}
 		}
 
 		public void Deserialize(StatusReader oldStatusReader, bool convertYotogiSkill)

+ 14 - 10
Assembly-CSharp/MaidStatus/YotogiClass.cs

@@ -290,12 +290,12 @@ namespace MaidStatus
 						{
 							bool condition3 = csvParser3.Open(afileBase3);
 							NDebug.Assert(condition3, file_name + "\nopen failed.");
-							for (int num = 1; num < csvParser3.max_cell_y; num++)
+							for (int num2 = 1; num2 < csvParser3.max_cell_y; num2++)
 							{
-								if (csvParser3.IsCellToExistData(0, num))
+								if (csvParser3.IsCellToExistData(0, num2))
 								{
-									string cellAsString2 = csvParser3.GetCellAsString(0, num);
-									string cellAsString3 = csvParser3.GetCellAsString(1, num);
+									string cellAsString2 = csvParser3.GetCellAsString(0, num2);
+									string cellAsString3 = csvParser3.GetCellAsString(1, num2);
 									if (!enabledIdListOld.ContainsKey(cellAsString2))
 									{
 										enabledIdListOld.Add(cellAsString2, cellAsString3);
@@ -331,19 +331,23 @@ namespace MaidStatus
 				Dictionary<string, int> dictionary2 = new Dictionary<string, int>();
 				for (int m = 1; m < array2[0].Value.max_cell_y; m++)
 				{
-					int cellAsInteger = array2[0].Value.GetCellAsInteger(0, m);
-					if (!YotogiClass.basicDatas.ContainsKey(cellAsInteger))
+					int num = array2[0].Value.GetCellAsInteger(0, m);
+					if (num == 56 || num == 57)
+					{
+						num += 2;
+					}
+					if (!YotogiClass.basicDatas.ContainsKey(num))
 					{
 						string cellAsString = array2[0].Value.GetCellAsString(1, m);
 						string text3 = (!enabledIdListOld.ContainsKey(cellAsString)) ? cellAsString : enabledIdListOld[cellAsString];
 						YotogiClass.Data value2 = new YotogiClass.Data(cellAsString, text3, array2[0].Value, array2[1].Value, array2[2].Value, array2[3].Value);
-						YotogiClass.basicDatas.Add(cellAsInteger, value2);
-						dictionary.Add(cellAsInteger, new KeyValuePair<string, string>(cellAsString, text3));
-						dictionary2.Add(cellAsString, cellAsInteger);
+						YotogiClass.basicDatas.Add(num, value2);
+						dictionary.Add(num, new KeyValuePair<string, string>(cellAsString, text3));
+						dictionary2.Add(cellAsString, num);
 					}
 					else
 					{
-						YotogiClass.basicDatas[cellAsInteger].SetClassType(AbstractClassData.ClassType.Share);
+						YotogiClass.basicDatas[num].SetClassType(AbstractClassData.ClassType.Share);
 					}
 				}
 				Dictionary<int, KeyValuePair<string, string>> dictionary3 = new Dictionary<int, KeyValuePair<string, string>>(YotogiClass.commonIdManager.idMap);

+ 53 - 0
Assembly-CSharp/MayuAlphaWindow.cs

@@ -0,0 +1,53 @@
+using System;
+using UnityEngine;
+
+public class MayuAlphaWindow : BasePhotoWindow
+{
+	public override string windowName
+	{
+		get
+		{
+			return "MayuWindow";
+		}
+	}
+
+	public override void Start()
+	{
+		base.Start();
+		this.SetWindowTitleFromLocalizeTerm("透明度");
+		this.m_goParent = base.transform.Find("Parent").gameObject;
+		this.maid = GameMain.Instance.CharacterMgr.GetMaid(0);
+		this.value = this.slider.value;
+		this.visible = false;
+	}
+
+	public void OnChangerValue(int value)
+	{
+		this.maid.MayuAlpha = value;
+	}
+
+	public override void Update()
+	{
+		if (SceneEdit.Instance.isFBFace && SceneEdit.Instance != null && SceneEdit.Instance.maid != null && SceneEdit.Instance.NowMPN == MPN.folder_mayu)
+		{
+			this.visible = true;
+			if (this.slider.value != this.value)
+			{
+				this.OnChangerValue((int)this.slider.value);
+				this.value = this.slider.value;
+			}
+		}
+		else
+		{
+			this.visible = false;
+		}
+	}
+
+	public PhotoSliderAndInput slider;
+
+	private GameObject m_goParent;
+
+	private float value;
+
+	private Maid maid;
+}

+ 199 - 149
Assembly-CSharp/Menu.cs

@@ -136,7 +136,7 @@ public class Menu : MonoBehaviour
 			text = mp.strFileName;
 		}
 		TBody body = maid.body0;
-		if (mp.idx == 61 || mp.idx == 64 || mp.idx == 65 || mp.idx == 66)
+		if (mp.idx == 72 || mp.idx == 75 || mp.idx == 76 || mp.idx == 77)
 		{
 			TBodySkin slot = body.GetSlot(1);
 			if (slot.PartsVersion < 110)
@@ -195,18 +195,18 @@ public class Menu : MonoBehaviour
 				}
 				if (stringCom == "name")
 				{
-					goto IL_1546;
+					goto IL_16D6;
 				}
 				if (stringCom == "ver")
 				{
 					TBodySkin slot2 = body.GetSlot(stringList[1]);
 					version = int.Parse(stringList[2]);
-					goto IL_1546;
+					goto IL_16D6;
 				}
 				if (stringCom == "アイテム")
 				{
 					Menu.SetMaidItemTemp(maid, stringList[1], f_bTemp);
-					goto IL_1546;
+					goto IL_16D6;
 				}
 				if (stringCom == "アイテム条件")
 				{
@@ -305,47 +305,69 @@ public class Menu : MonoBehaviour
 					NDebug.Assert("アイテム条件が不正です。「なら」が必要です。\n" + text7, false);
 					goto IL_414;
 					IL_414:
-					goto IL_1546;
+					goto IL_16D6;
 				}
 				if (stringCom == "if")
 				{
-					if (stringList[1].IndexOf("maidprop[") != 0)
-					{
-						goto IL_594;
-					}
-					string value = stringList[1].Substring(9, stringList[1].Length - 9 - 1);
-					MPN mpn = (MPN)Enum.Parse(typeof(MPN), value, false);
-					MaidProp prop = maid.GetProp(mpn);
-					if (!(stringList[2] == "==") || !(stringList[3] == "nothing") || prop.nFileNameRID != 0 || !(stringList[4] == "?") || stringList[5].IndexOf("setprop[") != 0)
+					if (stringList[1].IndexOf("maidprop[") == 0)
 					{
+						string value = stringList[1].Substring(9, stringList[1].Length - 9 - 1);
+						MPN mpn = (MPN)Enum.Parse(typeof(MPN), value, false);
+						MaidProp prop = maid.GetProp(mpn);
+						if (!(stringList[2] == "==") || !(stringList[3] == "nothing") || prop.nFileNameRID != 0 || !(stringList[4] == "?") || stringList[5].IndexOf("setprop[") != 0)
+						{
+							goto IL_594;
+						}
+						string value2 = stringList[5].Substring(8, stringList[5].Length - 8 - 1);
+						MPN idx = (MPN)Enum.Parse(typeof(MPN), value2, false);
+						if (!(stringList[6] == "="))
+						{
+							goto IL_594;
+						}
+						string text10;
+						if (stringList[7].IndexOf("getprop[") == 0)
+						{
+							string value3 = stringList[7].Substring(8, stringList[7].Length - 8 - 1);
+							MPN mpn2 = (MPN)Enum.Parse(typeof(MPN), value3, false);
+							MaidProp prop2 = maid.GetProp(mpn2);
+							text10 = prop2.strFileName;
+						}
+						else
+						{
+							text10 = stringList[7];
+						}
+						if (!string.IsNullOrEmpty(text10))
+						{
+							maid.SetProp(idx, text10, 0, false, false);
+							goto IL_594;
+						}
 						goto IL_594;
+						IL_594:
+						goto IL_677;
 					}
-					string value2 = stringList[5].Substring(8, stringList[5].Length - 8 - 1);
-					MPN idx = (MPN)Enum.Parse(typeof(MPN), value2, false);
-					if (!(stringList[6] == "="))
+					if (stringList[1].IndexOf("slot[") != 0)
 					{
-						goto IL_594;
+						goto IL_677;
 					}
-					string text10;
-					if (stringList[7].IndexOf("getprop[") == 0)
+					string[] array = stringList[1].Split(new char[]
 					{
-						string value3 = stringList[7].Substring(8, stringList[7].Length - 8 - 1);
-						MPN mpn2 = (MPN)Enum.Parse(typeof(MPN), value3, false);
-						MaidProp prop2 = maid.GetProp(mpn2);
-						text10 = prop2.strFileName;
-					}
-					else
+						'.'
+					});
+					string value4 = array[0].Substring(5, array[0].Length - 5 - 1);
+					TBody.SlotID f_nSlotNo = (TBody.SlotID)Enum.Parse(typeof(TBody.SlotID), value4, true);
+					TBodySkin slot6 = maid.body0.GetSlot((int)f_nSlotNo);
+					if (2 > array.Length || !(array[1] == "ver") || !(stringList[2] == "<"))
 					{
-						text10 = stringList[7];
+						goto IL_677;
 					}
-					if (!string.IsNullOrEmpty(text10))
+					int num4 = int.Parse(stringList[3]);
+					if (slot6.PartsVersion < num4 && stringList[4] == "?" && stringList[5] == "skip")
 					{
-						maid.SetProp(idx, text10, 0, false, false);
-						goto IL_594;
+						break;
 					}
-					goto IL_594;
-					IL_594:
-					goto IL_1546;
+					goto IL_677;
+					IL_677:
+					goto IL_16D6;
 				}
 				if (stringCom == "アイテムパラメータ")
 				{
@@ -360,26 +382,26 @@ public class Menu : MonoBehaviour
 							text12,
 							text13
 						}));
-						goto IL_609;
+						goto IL_6EC;
 					}
 					Debug.LogError("アイテムパラメータ 命令の引数が不正です。SlotNameを明示的に指定しする必要があります。アイテムパラメータ <スロット名> <変数名> <値> の順です。" + text7);
-					goto IL_609;
-					IL_609:
-					goto IL_1546;
+					goto IL_6EC;
+					IL_6EC:
+					goto IL_16D6;
 				}
 				if (stringCom == "半脱ぎ" || stringCom == "リソース参照")
 				{
 					string key;
-					string value4;
+					string value5;
 					if (stringCom == "半脱ぎ")
 					{
 						key = "半脱ぎ";
-						value4 = stringList[1];
+						value5 = stringList[1];
 					}
 					else
 					{
 						key = stringList[1];
-						value4 = stringList[2];
+						value5 = stringList[2];
 					}
 					int hashCode = Path.GetFileName(text.ToLower()).ToLower().GetHashCode();
 					SortedDictionary<string, string> sortedDictionary;
@@ -388,35 +410,35 @@ public class Menu : MonoBehaviour
 						string empty = string.Empty;
 						if (sortedDictionary.TryGetValue(key, out empty))
 						{
-							sortedDictionary[key] = value4;
-							goto IL_6BB;
+							sortedDictionary[key] = value5;
+							goto IL_79E;
 						}
-						sortedDictionary.Add(key, value4);
-						goto IL_6BB;
-						IL_6BB:
-						goto IL_6E0;
+						sortedDictionary.Add(key, value5);
+						goto IL_79E;
+						IL_79E:
+						goto IL_7C3;
 					}
 					sortedDictionary = new SortedDictionary<string, string>();
-					sortedDictionary.Add(key, value4);
+					sortedDictionary.Add(key, value5);
 					Menu.m_dicResourceRef.Add(hashCode, sortedDictionary);
-					goto IL_6E0;
-					IL_6E0:
-					goto IL_1546;
+					goto IL_7C3;
+					IL_7C3:
+					goto IL_16D6;
 				}
 				if (stringCom == "set")
 				{
-					goto IL_1546;
+					goto IL_16D6;
 				}
 				if (stringCom == "setname")
 				{
-					goto IL_1546;
+					goto IL_16D6;
 				}
 				if (stringCom == "setslotitem")
 				{
 					string tag = stringList[1];
 					uint val = uint.Parse(stringList[2]);
 					maid.SetProp(tag, (int)val, false);
-					goto IL_1546;
+					goto IL_16D6;
 				}
 				if (stringCom == "additem")
 				{
@@ -457,25 +479,25 @@ public class Menu : MonoBehaviour
 					}
 					body.AddItem((MPN)Enum.Parse(typeof(MPN), text9, true), text14, stringList[1], attachSlot, attachName, f_bTemp, version);
 					body.SetVisibleNodeSlot(text14, true, "_ALL_");
-					goto IL_1546;
+					goto IL_16D6;
 				}
 				if (stringCom == "nofloory")
 				{
 					TBody.SlotID index = (TBody.SlotID)Enum.Parse(typeof(TBody.SlotID), stringList[1], true);
 					body.goSlot[(int)index].m_bHitFloorY = false;
-					goto IL_1546;
+					goto IL_16D6;
 				}
 				if (stringCom == "saveitem")
 				{
 					text5 = stringList[1];
-					goto IL_1546;
+					goto IL_16D6;
 				}
 				if (stringCom == "category")
 				{
 					text9 = stringList[1];
 					flag2 = (text9 == "skin");
 					flag3 = (text9 == "haircolor");
-					goto IL_1546;
+					goto IL_16D6;
 				}
 				if (stringCom == "maskitem")
 				{
@@ -483,11 +505,11 @@ public class Menu : MonoBehaviour
 					{
 						string maskslot = stringList[1];
 						body.AddMask(text9, maskslot);
-						goto IL_92C;
+						goto IL_A0F;
 					}
-					goto IL_92C;
-					IL_92C:
-					goto IL_1546;
+					goto IL_A0F;
+					IL_A0F:
+					goto IL_16D6;
 				}
 				if (stringCom == "delitem")
 				{
@@ -497,27 +519,27 @@ public class Menu : MonoBehaviour
 						slotname3 = stringList[1];
 					}
 					body.DelItem((MPN)Enum.Parse(typeof(MPN), text9, true), slotname3);
-					goto IL_1546;
+					goto IL_16D6;
 				}
 				if (stringCom == "node消去")
 				{
 					body.SetVisibleNodeSlot(text9, false, stringList[1]);
-					goto IL_1546;
+					goto IL_16D6;
 				}
 				if (stringCom == "node表示")
 				{
 					body.SetVisibleNodeSlot(text9, true, stringList[1]);
-					goto IL_1546;
+					goto IL_16D6;
 				}
 				if (stringCom == "パーツnode消去")
 				{
 					body.SetVisibleNodeSlotParts(text9, stringList[1], false, stringList[2]);
-					goto IL_1546;
+					goto IL_16D6;
 				}
 				if (stringCom == "パーツnode表示")
 				{
 					body.SetVisibleNodeSlotParts(text9, stringList[1], true, stringList[2]);
-					goto IL_1546;
+					goto IL_16D6;
 				}
 				if (stringCom == "color")
 				{
@@ -526,69 +548,97 @@ public class Menu : MonoBehaviour
 					string prop_name = stringList[3];
 					Color col = new Color(float.Parse(stringList[4]) / 255f, float.Parse(stringList[5]) / 255f, float.Parse(stringList[6]) / 255f, float.Parse(stringList[7]) / 255f);
 					body.ChangeCol(name, matno, prop_name, col);
-					goto IL_1546;
+					goto IL_16D6;
 				}
 				if (stringCom == "mancolor")
 				{
 					Color manColor = new Color(float.Parse(stringList[1]) / 255f, float.Parse(stringList[2]) / 255f, float.Parse(stringList[3]) / 255f, 1f);
 					maid.ManColor = manColor;
 					maid.ManColorUpdate();
-					goto IL_1546;
+					goto IL_16D6;
 				}
 				if (stringCom == "tex" || stringCom == "テクスチャ変更")
 				{
 					string text15 = stringList[1];
-					int num4 = int.Parse(stringList[2]);
-					string text16 = stringList[3];
+					string[] array2 = stringList[2].Split(new char[]
+					{
+						'&'
+					});
+					int num5 = -1;
+					if (2 <= array2.Length)
+					{
+						foreach (string text16 in array2)
+						{
+							string[] array4 = text16.Split(new char[]
+							{
+								'='
+							});
+							MPN mpn3 = (MPN)Enum.Parse(typeof(MPN), array4[0], true);
+							if (mpn3 == (MPN)mp.idx)
+							{
+								int.TryParse(array4[1], out num5);
+								break;
+							}
+						}
+						if (num5 == -1)
+						{
+							NDebug.Assert("tex mat no error.", false);
+						}
+					}
+					else
+					{
+						int.TryParse(array2[0], out num5);
+						if (mp.idx == 72)
+						{
+							num5 = 7;
+						}
+					}
+					string text17 = stringList[3];
 					string filename = stringList[4];
 					MaidParts.PARTS_COLOR parts_COLOR = MaidParts.PARTS_COLOR.NONE;
 					if (stringList.Length == 6)
 					{
-						string text17 = stringList[5];
+						string text18 = stringList[5];
 						try
 						{
-							parts_COLOR = (MaidParts.PARTS_COLOR)Enum.Parse(typeof(MaidParts.PARTS_COLOR), text17.ToUpper());
+							parts_COLOR = (MaidParts.PARTS_COLOR)Enum.Parse(typeof(MaidParts.PARTS_COLOR), text18.ToUpper());
 						}
 						catch
 						{
-							NDebug.Assert("無限色IDがありません。" + text17, false);
+							NDebug.Assert("無限色IDがありません。" + text18, false);
 						}
 					}
-					if (mp.idx == 61)
-					{
-						num4 = 7;
-					}
 					if (flag2 && parts_COLOR == MaidParts.PARTS_COLOR.SKIN)
 					{
-						if (text15 == "body" && num4 == 0 && text16.ToLower() == "_maintex")
+						if (text15 == "body" && num5 == 0 && text17.ToLower() == "_maintex")
 						{
-							body.ChangeShader(text15, num4, "CM3D2_Toony_Lighted_Outline_Tex");
+							body.ChangeShader(text15, num5, "CM3D2_Toony_Lighted_Outline_Tex");
 							flag = true;
-							body.ChangeTex(text15, num4, "_OutlineTex", filename, null, MaidParts.PARTS_COLOR.SKIN_OUTLINE);
-							body.ChangeTex(text15, num4, "_OutlineToonRamp", "toonBlackA1.tex", null, MaidParts.PARTS_COLOR.SKIN_OUTLINE);
+							body.ChangeTex(text15, num5, "_OutlineTex", filename, null, MaidParts.PARTS_COLOR.SKIN_OUTLINE);
+							body.ChangeTex(text15, num5, "_OutlineToonRamp", "toonBlackA1.tex", null, MaidParts.PARTS_COLOR.SKIN_OUTLINE);
 						}
-						else if (text15 == "head" && num4 == 5 && text16.ToLower() == "_maintex")
+						else if (text15 == "head" && num5 == 5 && text17.ToLower() == "_maintex")
 						{
-							body.ChangeShader(text15, num4, "CM3D2_Toony_Lighted_Outline_Tex");
+							body.ChangeShader(text15, num5, "CM3D2_Toony_Lighted_Outline_Tex");
 							flag = true;
-							body.ChangeTex(text15, num4, "_OutlineTex", filename, null, MaidParts.PARTS_COLOR.SKIN_OUTLINE);
-							body.ChangeTex(text15, num4, "_OutlineToonRamp", "toonBlackA1.tex", null, MaidParts.PARTS_COLOR.SKIN_OUTLINE);
+							body.ChangeTex(text15, num5, "_OutlineTex", filename, null, MaidParts.PARTS_COLOR.SKIN_OUTLINE);
+							body.ChangeTex(text15, num5, "_OutlineToonRamp", "toonBlackA1.tex", null, MaidParts.PARTS_COLOR.SKIN_OUTLINE);
 						}
 					}
-					if (Product.isEnglish && !Product.isPublic && flag2 && text15 == "body" && num4 == 0 && text16.ToLower() == "_maintex")
+					if (Product.isEnglish && !Product.isPublic && flag2 && text15 == "body" && num5 == 0 && text17.ToLower() == "_maintex")
 					{
 						if (parts_COLOR == MaidParts.PARTS_COLOR.SKIN)
 						{
-							body.ChangeShader(text15, num4, "CM3D2_Toony_Lighted_Outline_Tex_Texwidth");
+							body.ChangeShader(text15, num5, "CM3D2_Toony_Lighted_Outline_Tex_Texwidth");
 						}
 						else
 						{
-							body.ChangeShader(text15, num4, "CM3D2_Toony_Lighted_Outline_Texwidth");
+							body.ChangeShader(text15, num5, "CM3D2_Toony_Lighted_Outline_Texwidth");
 						}
-						body.ChangeTex(text15, num4, "_OutlineWidthTex", "skin_en_outline_width.tex", null, MaidParts.PARTS_COLOR.NONE);
+						body.ChangeTex(text15, num5, "_OutlineWidthTex", "skin_en_outline_width.tex", null, MaidParts.PARTS_COLOR.NONE);
 						flag = true;
 					}
-					body.ChangeTex(text15, num4, text16, filename, null, parts_COLOR);
+					body.ChangeTex(text15, num5, text17, filename, null, parts_COLOR);
 					if (parts_COLOR != MaidParts.PARTS_COLOR.NONE)
 					{
 						maid.Parts.SetPartsColor(parts_COLOR, maid.Parts.GetPartsColor(parts_COLOR));
@@ -596,22 +646,22 @@ public class Menu : MonoBehaviour
 					if ((flag2 || flag3) && !flag)
 					{
 						body.RestoreShader(text15);
-						goto IL_D49;
+						goto IL_ED9;
 					}
-					goto IL_D49;
-					IL_D49:
-					goto IL_1546;
+					goto IL_ED9;
+					IL_ED9:
+					goto IL_16D6;
 				}
 				if (stringCom == "prop")
 				{
 					string tag2 = stringList[1];
 					string s = stringList[2];
 					maid.SetProp(tag2, int.Parse(s), false);
-					goto IL_1546;
+					goto IL_16D6;
 				}
 				if (stringCom == "テクスチャ乗算")
 				{
-					goto IL_1546;
+					goto IL_16D6;
 				}
 				if (stringCom == "テクスチャ合成")
 				{
@@ -622,12 +672,12 @@ public class Menu : MonoBehaviour
 					if ((text9 == "accTatoo" || text9 == "hokuro") && !text.Contains("_del"))
 					{
 						body.MulTexSet(stringList[1], int.Parse(stringList[2]), stringList[3], int.Parse(stringList[4]), stringList[5], (GameUty.SystemMaterial)Enum.Parse(typeof(GameUty.SystemMaterial), stringList[6]), true, 0, 0, 0f, 0f, true, f_SubProp, 1f, 1024);
-						goto IL_EAC;
+						goto IL_103C;
 					}
 					body.MulTexSet(stringList[1], int.Parse(stringList[2]), stringList[3], int.Parse(stringList[4]), stringList[5], (GameUty.SystemMaterial)Enum.Parse(typeof(GameUty.SystemMaterial), stringList[6]), false, 0, 0, 0f, 0f, false, null, 1f, 1024);
-					goto IL_EAC;
-					IL_EAC:
-					goto IL_1546;
+					goto IL_103C;
+					IL_103C:
+					goto IL_16D6;
 				}
 				if (stringCom == "テクスチャセット合成")
 				{
@@ -636,7 +686,7 @@ public class Menu : MonoBehaviour
 						NDebug.Assert("テクスチャセット合成 の引数が不正です。" + stringList.Length, false);
 					}
 					body.MulTexSet(stringList[1], int.Parse(stringList[2]), stringList[3], int.Parse(stringList[4]), stringList[5], (GameUty.SystemMaterial)Enum.Parse(typeof(GameUty.SystemMaterial), stringList[6]), true, 0, 0, 0f, 0f, true, null, 1f, 1024);
-					goto IL_1546;
+					goto IL_16D6;
 				}
 				if (stringCom == "マテリアル変更")
 				{
@@ -644,7 +694,7 @@ public class Menu : MonoBehaviour
 					int f_nMatNo = int.Parse(stringList[2]);
 					string f_strFileName = stringList[3];
 					body.ChangeMaterial(f_strSlotName, f_nMatNo, f_strFileName);
-					goto IL_1546;
+					goto IL_16D6;
 				}
 				if (stringCom == "shader")
 				{
@@ -653,14 +703,14 @@ public class Menu : MonoBehaviour
 					string f_strShaderFileName = stringList[3];
 					body.ChangeShader(f_strSlotName2, f_nMatNo2, f_strShaderFileName);
 					flag = true;
-					goto IL_1546;
+					goto IL_16D6;
 				}
 				if (stringCom == "アタッチポイントの設定")
 				{
 					if (stringList.Length < 5)
 					{
 						Debug.LogError("アタッチポイントの設定引数の数が不正です。 " + text7 + " " + text3);
-						goto IL_106F;
+						goto IL_11FF;
 					}
 					Vector3 v = new Vector3(float.Parse(stringList[2]), float.Parse(stringList[3]), float.Parse(stringList[4]));
 					Quaternion q = Quaternion.identity;
@@ -673,27 +723,27 @@ public class Menu : MonoBehaviour
 						Debug.LogError("アタッチポイントの設定引数に角度指定がありません。 " + text7 + "  " + text3);
 					}
 					body.SetAttachPoint(slotname, stringList[1], v, q, f_bTemp);
-					goto IL_106F;
-					IL_106F:
-					goto IL_1546;
+					goto IL_11FF;
+					IL_11FF:
+					goto IL_16D6;
 				}
 				if (stringCom == "blendset")
 				{
 					string blendSetName = stringList[1];
-					int num5 = (stringList.Length - 2) / 2;
+					int num6 = (stringList.Length - 2) / 2;
 					body.Face.morph.NewBlendSet(blendSetName);
-					for (int j = 0; j < num5; j++)
+					for (int k = 0; k < num6; k++)
 					{
-						string tag3 = stringList[2 + j * 2].ToLower();
-						float val2 = float.Parse(stringList[3 + j * 2]);
+						string tag3 = stringList[2 + k * 2].ToLower();
+						float val2 = float.Parse(stringList[3 + k * 2]);
 						body.Face.morph.SetValueBlendSet(blendSetName, tag3, val2);
 					}
-					goto IL_1546;
+					goto IL_16D6;
 				}
 				if (stringCom == "paramset")
 				{
 					body.Face.NewParamSet(text7);
-					goto IL_1546;
+					goto IL_16D6;
 				}
 				if (stringCom == "commenttype")
 				{
@@ -702,18 +752,18 @@ public class Menu : MonoBehaviour
 						maid.status.partsDic.Add(stringList[1], string.Empty);
 					}
 					maid.status.partsDic[stringList[1]] = stringList[2];
-					goto IL_1546;
+					goto IL_16D6;
 				}
 				if (stringCom == "useredit")
 				{
 					if (stringList[2].ToLower() == "material")
 					{
 						body.SetMaterialProperty(text9, stringList[3], int.Parse(stringList[4]), stringList[5], stringList[6], stringList[7], false);
-						goto IL_11C7;
+						goto IL_1357;
 					}
-					goto IL_11C7;
-					IL_11C7:
-					goto IL_1546;
+					goto IL_1357;
+					IL_1357:
+					goto IL_16D6;
 				}
 				if (stringCom == "bonemorph")
 				{
@@ -724,43 +774,43 @@ public class Menu : MonoBehaviour
 					if (stringList.Length == 9)
 					{
 						body.bonemorph.ChangeMorphPosValue(stringList[1], stringList[2], new Vector3(float.Parse(stringList[3]), float.Parse(stringList[4]), float.Parse(stringList[5])), new Vector3(float.Parse(stringList[6]), float.Parse(stringList[7]), float.Parse(stringList[8])));
-						goto IL_138D;
+						goto IL_151D;
 					}
-					string text18 = stringList[1].ToLower();
+					string text19 = stringList[1].ToLower();
 					string strPropName = stringList[2];
 					string f_strBoneName = stringList[3];
 					Vector3 f_fAddMin = new Vector3(float.Parse(stringList[4]), float.Parse(stringList[5]), float.Parse(stringList[6]));
 					Vector3 f_fAddMax = new Vector3(float.Parse(stringList[7]), float.Parse(stringList[8]), float.Parse(stringList[9]));
-					if (text18 != null)
+					if (text19 != null)
 					{
-						if (text18 == "pos")
+						if (text19 == "pos")
 						{
 							body.bonemorph.ChangeMorphPosValue(strPropName, f_strBoneName, f_fAddMin, f_fAddMax);
-							goto IL_138D;
+							goto IL_151D;
 						}
-						if (text18 == "rot")
+						if (text19 == "rot")
 						{
 							body.bonemorph.ChangeMorphRotatioValue(strPropName, f_strBoneName, f_fAddMin, f_fAddMax);
-							goto IL_138D;
+							goto IL_151D;
 						}
-						if (text18 == "scl")
+						if (text19 == "scl")
 						{
 							body.bonemorph.ChangeMorphSclValue(strPropName, f_strBoneName, f_fAddMin, f_fAddMax);
-							goto IL_138D;
+							goto IL_151D;
 						}
 					}
 					Debug.LogError(string.Concat(new string[]
 					{
 						"BoneMorpのタイプ指定が不正です[",
-						text18,
+						text19,
 						"]\n",
 						text7,
 						" ",
 						text3
 					}));
-					goto IL_138D;
-					IL_138D:
-					goto IL_1546;
+					goto IL_151D;
+					IL_151D:
+					goto IL_16D6;
 				}
 				if (stringCom == "length")
 				{
@@ -769,7 +819,7 @@ public class Menu : MonoBehaviour
 						Debug.LogError("lengthの設定引数の数が不正です。 " + text7 + " " + text3);
 					}
 					body.SetHairLengthDataList(stringList[1], stringList[2], stringList[3], stringList[4], new Vector3(float.Parse(stringList[5]), float.Parse(stringList[6]), float.Parse(stringList[7])), new Vector3(float.Parse(stringList[8]), float.Parse(stringList[9]), float.Parse(stringList[10])));
-					goto IL_1546;
+					goto IL_16D6;
 				}
 				if (stringCom == "anime")
 				{
@@ -785,7 +835,7 @@ public class Menu : MonoBehaviour
 						f_bLoop = (stringList[3] == "loop");
 					}
 					body.ItemAnimationPlay(f_slot, stringList[2], f_bLoop);
-					goto IL_1546;
+					goto IL_16D6;
 				}
 				if (stringCom == "param2")
 				{
@@ -793,23 +843,23 @@ public class Menu : MonoBehaviour
 					{
 						string slotname4 = stringList[1];
 						body.GetSlot(slotname4).SetParam2(stringList[2], stringList[3]);
-						goto IL_1500;
+						goto IL_1690;
 					}
 					Debug.LogError("param2の設定引数の数が不正です。 " + text7 + " " + text3);
-					goto IL_1500;
-					IL_1500:
-					goto IL_1546;
+					goto IL_1690;
+					IL_1690:
+					goto IL_16D6;
 				}
 				if (stringCom == "animematerial")
 				{
 					TBody.SlotID f_slot2 = (TBody.SlotID)Enum.Parse(typeof(TBody.SlotID), stringList[1], true);
 					string s2 = stringList[2];
 					body.MaterialAnimatorAdd(f_slot2, int.Parse(s2));
-					goto IL_1546;
+					goto IL_16D6;
 				}
-				goto IL_1546;
-				IL_1546:
-				goto IL_15C9;
+				goto IL_16D6;
+				IL_16D6:
+				goto IL_1759;
 			}
 			catch (Exception ex)
 			{
@@ -827,19 +877,19 @@ public class Menu : MonoBehaviour
 					ex.StackTrace
 				}));
 				NDebug.Assert("メニューファイル処理中にエラーが発生しました。" + Path.GetFileName(text), true);
-				goto IL_15C9;
+				goto IL_1759;
 			}
-			IL_15C9:
+			IL_1759:
 			goto IL_108;
 		}
 		list.Sort((Menu.LastParam a, Menu.LastParam b) => a.nOrder - a.nOrder);
-		for (int k = 0; k < list.Count; k++)
+		for (int l = 0; l < list.Count; l++)
 		{
-			Menu.LastParam lastParam = list[k];
+			Menu.LastParam lastParam = list[l];
 			if (lastParam.strComm == "アイテムパラメータ")
 			{
-				TBodySkin slot6 = body.GetSlot(lastParam.aryArgs[0]);
-				slot6.SetParam(lastParam.aryArgs[1], lastParam.aryArgs[2]);
+				TBodySkin slot7 = body.GetSlot(lastParam.aryArgs[0]);
+				slot7.SetParam(lastParam.aryArgs[1], lastParam.aryArgs[2]);
 			}
 		}
 		binaryReader.Close();
@@ -924,7 +974,7 @@ public class Menu : MonoBehaviour
 			Directory.CreateDirectory(text);
 		}
 		StreamWriter streamWriter = new StreamWriter(text + "\\" + text2 + ".txt", false, Encoding.UTF8);
-		streamWriter.WriteLine("出力バージョン\t" + 1470);
+		streamWriter.WriteLine("出力バージョン\t" + 1480);
 		streamWriter.WriteLine("基本アイテム\t" + filename.Replace(" ", ":"));
 		try
 		{
@@ -1292,7 +1342,7 @@ public class Menu : MonoBehaviour
 
 	private static void ProcModScriptBin(Maid maid, byte[] cd, string filename, MaidProp mp, bool f_bTemp = false)
 	{
-		if (mp != null && maid.body0 != null && (mp.idx == 61 || mp.idx == 64 || mp.idx == 65 || mp.idx == 66))
+		if (mp != null && maid.body0 != null && (mp.idx == 72 || mp.idx == 75 || mp.idx == 76 || mp.idx == 77))
 		{
 			TBodySkin slot = maid.body0.GetSlot(1);
 			if (slot.PartsVersion < 110)
@@ -1421,7 +1471,7 @@ public class Menu : MonoBehaviour
 						}
 					}
 					int matno = int.Parse(array[2]);
-					if (mp != null && mp.idx == 61)
+					if (mp != null && mp.idx == 72)
 					{
 						matno = 7;
 					}

+ 1 - 1
Assembly-CSharp/Misc.cs

@@ -2,7 +2,7 @@
 
 public class Misc
 {
-	public const int GAME_VERSION = 1470;
+	public const int GAME_VERSION = 1480;
 
 	public const string GAME_DATA_PATH = "GameData";
 

+ 3 - 3
Assembly-CSharp/ModCompile.cs

@@ -20,7 +20,7 @@ public class ModCompile : MonoBehaviour
 			Directory.CreateDirectory(text);
 		}
 		string path = text + "\\" + Path.GetFileNameWithoutExtension(f_strInMenuTextPathFileName);
-		for (int i = 0; i < 114; i++)
+		for (int i = 0; i < 131; i++)
 		{
 			string[] aryDefCategoryName = ModCompile.m_aryDefCategoryName;
 			int num = i;
@@ -604,7 +604,7 @@ public class ModCompile : MonoBehaviour
 		MemoryStream memoryStream = new MemoryStream();
 		BinaryWriter binaryWriter = new BinaryWriter(memoryStream);
 		binaryWriter.Write("CM3D2_MESH");
-		binaryWriter.Write(1470);
+		binaryWriter.Write(1480);
 		string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(f_strMqoFile);
 		binaryWriter.Write(fileNameWithoutExtension);
 		binaryWriter.Write(exObjIn2.strName);
@@ -948,7 +948,7 @@ public class ModCompile : MonoBehaviour
 		return true;
 	}
 
-	private static string[] m_aryDefCategoryName = new string[114];
+	private static string[] m_aryDefCategoryName = new string[131];
 
 	private static string[] m_aryDefSlotName;
 

+ 2 - 2
Assembly-CSharp/OvrIK.cs

@@ -1568,7 +1568,7 @@ public class OvrIK : MonoBehaviour
 	{
 		public void OnBeforeSerialize()
 		{
-			this.m_nVersion = 1470;
+			this.m_nVersion = 1480;
 		}
 
 		public void OnAfterDeserialize()
@@ -1628,7 +1628,7 @@ public class OvrIK : MonoBehaviour
 		private const string CONF_NAME = "OvrIK.json";
 
 		[SerializeField]
-		private int m_nVersion = 1470;
+		private int m_nVersion = 1480;
 
 		[SerializeField]
 		private float solver_locomotion_weight = 1f;

+ 5 - 2
Assembly-CSharp/PhotoManEditManager.cs

@@ -11,10 +11,13 @@ public class PhotoManEditManager
 		this.man_body_menu_list_ = new List<SceneEdit.SMenuItem>();
 		if (PhotoManEditManager.menu_file_name_list_ == null)
 		{
+			MenuDataBase menuDataBase = GameMain.Instance.MenuDataBase;
 			PhotoManEditManager.menu_file_name_list_ = new HashSet<string>();
-			foreach (string text in GameUty.MenuFiles)
+			for (int i = 0; i < menuDataBase.GetDataSize(); i++)
 			{
-				string text2 = text.ToLower();
+				menuDataBase.SetIndex(i);
+				string text = menuDataBase.GetMenuFileName().ToLower();
+				string text2 = text;
 				if (text2.Contains("mhead") || text2.Contains("mbody"))
 				{
 					SceneEdit.SMenuItem smenuItem = new SceneEdit.SMenuItem();

+ 25 - 2
Assembly-CSharp/PhotoModeMain.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Collections;
 using System.Xml.Linq;
 using UnityEngine;
 
@@ -13,10 +14,23 @@ public class PhotoModeMain : WfScreenChildren
 	public override void Awake()
 	{
 		base.Awake();
+		GameMain.Instance.StartCoroutine(this.Setup());
 	}
 
-	protected override void OnCall()
+	private IEnumerator Setup()
 	{
+		GameMain.Instance.LoadIcon.NextLoadIcontImmediatelyDisplay();
+		GameMain.Instance.LoadIcon.force_draw_new = true;
+		do
+		{
+			yield return null;
+		}
+		while (!GameMain.Instance.MenuDataBase.JobFinished());
+		for (int i = 0; i < 5; i++)
+		{
+			yield return null;
+		}
+		GameMain.Instance.LoadIcon.force_draw_new = false;
 		this.photo_mgr_ = this.RootPanel.GetComponentInChildren<PhotoWindowManager>();
 		EventDelegate.Add(this.photo_mgr_.EndButton.onClick, new EventDelegate.Callback(this.OnEnd));
 		this.photo_mgr_.CallEditSceneFunction = new Action<Maid>(this.OnCallEdit);
@@ -25,11 +39,18 @@ public class PhotoModeMain : WfScreenChildren
 			base.SetFadeStatus(WfScreenChildren.FadeStatus.Wait);
 			this.photo_mgr_.SaveAndLoadManager.ReadSave(PhotoModeMain.backupSaveData);
 		}
+		this.completedSetUp = true;
+		this.photo_mgr_.Initialize();
+		yield break;
+	}
+
+	protected override void OnCall()
+	{
 	}
 
 	protected override bool IsCallFadeIn()
 	{
-		return PhotoModeMain.backupSaveData == null;
+		return PhotoModeMain.backupSaveData == null && this.completedSetUp;
 	}
 
 	public void OnDestroy()
@@ -88,5 +109,7 @@ public class PhotoModeMain : WfScreenChildren
 
 	private static XDocument backupSaveData;
 
+	private bool completedSetUp;
+
 	private PhotoWindowManager photo_mgr_;
 }

+ 1 - 1
Assembly-CSharp/PhotoModeSaveAndLoad.cs

@@ -450,7 +450,7 @@ public class PhotoModeSaveAndLoad : MonoBehaviour
 	private XElement CreateCommonData(string title, string comment)
 	{
 		string value = DateTime.ParseExact(DateTime.Now.ToString("yyyyMMddHHmmss"), "yyyyMMddHHmmss", null).ToString("yyyy.MM.dd HH:mm");
-		XElement xelement = new XElement("GameVersion", 1470);
+		XElement xelement = new XElement("GameVersion", 1480);
 		XElement xelement2 = new XElement("SaveTime", value);
 		XElement xelement3 = new XElement("Title", title);
 		XElement xelement4 = new XElement("Comment", comment);

+ 7 - 10
Assembly-CSharp/PhotoWindowManager.cs

@@ -141,18 +141,17 @@ public class PhotoWindowManager : BasePhotoWindowManager
 		this.SaveAndLoadManager.folder_path = PhotoWindowManager.path_photo_save;
 		this.SaveAndLoadManager.onSerializeEvent = new Func<XElement>(this.OnSerializeEvent);
 		this.SaveAndLoadManager.onDeserializeEvent = new Action<XElement>(this.OnDeserializeEvent);
-		this.is_first_ = true;
+	}
+
+	public void Initialize()
+	{
+		this.OnMaidChangeEvent(null);
+		uGUITutorialPanel.OpenTutorial("ScenePhotoMode", null, false);
+		GameMain.Instance.SysShortcut.strSceneHelpName = "ScenePhotoMode";
 	}
 
 	public virtual void Update()
 	{
-		if (this.is_first_)
-		{
-			this.OnMaidChangeEvent(null);
-			this.is_first_ = false;
-			uGUITutorialPanel.OpenTutorial("ScenePhotoMode", null, false);
-			GameMain.Instance.SysShortcut.strSceneHelpName = "ScenePhotoMode";
-		}
 	}
 
 	public void CallTutorial()
@@ -691,8 +690,6 @@ public class PhotoWindowManager : BasePhotoWindowManager
 
 	public List<Action<Maid>> onMaidChangeEventList = new List<Action<Maid>>();
 
-	private bool is_first_;
-
 	private Maid select_maid_;
 
 	private Dictionary<string, Dictionary<string, Dictionary<string, string>>> maid_store_data_ = new Dictionary<string, Dictionary<string, Dictionary<string, string>>>();

+ 1 - 1
Assembly-CSharp/PlayerStatus/Status.cs

@@ -831,7 +831,7 @@ namespace PlayerStatus
 		public void Serialize(BinaryWriter binary)
 		{
 			binary.Write("CM3D2_PLAYER_STATUS");
-			binary.Write(1470);
+			binary.Write(1480);
 			binary.Write(this.playerName_);
 			binary.Write(this.days_);
 			binary.Write(this.totalPurchasePrice_);

+ 1 - 0
Assembly-CSharp/PresetServer.cs

@@ -47,6 +47,7 @@ public class PresetServer : MonoBehaviour
 		this.tcpWEB = null;
 	}
 
+	[Obsolete("GameUty.RidMenuDic廃止により使用不可", true)]
 	public void Update()
 	{
 		if (this.m_listener == null)

+ 35 - 23
Assembly-CSharp/ProfileCtrl.cs

@@ -5,6 +5,7 @@ using Edit;
 using I2.Loc;
 using MaidStatus;
 using MaidStatus.CsvData;
+using scoutmode;
 using UnityEngine;
 using wf;
 using Yotogis;
@@ -97,36 +98,40 @@ public class ProfileCtrl : MonoBehaviour
 		GameObject childObject5 = UTY.GetChildObject(this.m_goProfilePanel, "CharacterInfo/Personal/PopupList", false);
 		this.m_pPersonal = childObject5.GetComponent<UIPopupList>();
 		this.m_lPersonal = UTY.GetChildObject(childObject5, "LabelParent/Label", false).GetComponent<UILabel>();
-		bool flag = GameMain.Instance.CharacterMgr.status.GetFlag("オープニング終了") == 1;
+		bool flag = true;
+		flag = (GameMain.Instance.CharacterMgr.status.GetFlag("オープニング終了") == 1);
 		List<Personal.Data> allDatas = Personal.GetAllDatas(true);
 		List<Personal.Data> list = new List<Personal.Data>();
 		foreach (Personal.Data data in allDatas)
 		{
-			string a = data.uniqueName.ToLower();
-			if (data.oldPersonal)
+			if (SceneEdit.Instance.modeType != SceneEdit.ModeType.ScoutChara || LockData.personalEnabledIdList.Contains(data.uniqueName))
 			{
-				if (a == "pure" || a == "cool" || a == "pride")
+				string a = data.uniqueName.ToLower();
+				if (data.oldPersonal)
 				{
-					if (GameMain.Instance.CharacterMgr.status.isAvailableTransfer)
+					if (a == "pure" || a == "cool" || a == "pride")
 					{
-						list.Add(data);
+						if (GameMain.Instance.CharacterMgr.status.isAvailableTransfer)
+						{
+							list.Add(data);
+						}
 					}
-				}
-				else if (flag)
-				{
-					if (data.single)
-					{
-						list.Add(data);
-					}
-					else if (!string.IsNullOrEmpty(GameMain.Instance.CMSystem.CM3D2Path) && data.compatible)
+					else if (flag)
 					{
-						list.Add(data);
+						if (data.single)
+						{
+							list.Add(data);
+						}
+						else if (!string.IsNullOrEmpty(GameMain.Instance.CMSystem.CM3D2Path) && data.compatible)
+						{
+							list.Add(data);
+						}
 					}
 				}
-			}
-			else
-			{
-				list.Add(data);
+				else
+				{
+					list.Add(data);
+				}
 			}
 		}
 		this.m_pPersonal.items.Clear();
@@ -523,7 +528,7 @@ public class ProfileCtrl : MonoBehaviour
 		if (ProfileCtrl.m_dicPersonal.TryGetValue(selectValue, out personal))
 		{
 			this.m_maidStatus.SetPersonal(personal);
-			if (SceneEdit.Instance != null && (SceneEdit.Instance.modeType == SceneEdit.ModeType.OriginalChara || SceneEdit.Instance.modeType == SceneEdit.ModeType.MainChara))
+			if (SceneEdit.Instance != null && (SceneEdit.Instance.modeType == SceneEdit.ModeType.OriginalChara || SceneEdit.Instance.modeType == SceneEdit.ModeType.MainChara || SceneEdit.Instance.modeType == SceneEdit.ModeType.ScoutChara))
 			{
 				this.m_maidStatus.additionalRelation = AdditionalRelation.Vigilance;
 			}
@@ -550,10 +555,17 @@ public class ProfileCtrl : MonoBehaviour
 		{
 			if (EnumConvert.GetTerm(seikeiken) == selectValue)
 			{
-				Seikeiken initSeikeiken = Seikeiken.No_No;
-				if (ProfileCtrl.m_dicSexualExperience.TryGetValue(EnumConvert.GetString(seikeiken), out initSeikeiken))
+				Seikeiken seikeiken2 = Seikeiken.No_No;
+				if (ProfileCtrl.m_dicSexualExperience.TryGetValue(EnumConvert.GetString(seikeiken), out seikeiken2))
 				{
-					this.m_maidStatus.seikeiken = (this.m_maidStatus.initSeikeiken = initSeikeiken);
+					if (this.m_enabledInput)
+					{
+						this.m_maidStatus.seikeiken = (this.m_maidStatus.initSeikeiken = seikeiken2);
+					}
+					else
+					{
+						this.m_maidStatus.seikeiken = seikeiken2;
+					}
 				}
 				break;
 			}

+ 2 - 2
Assembly-CSharp/ProfileMgr.cs

@@ -30,8 +30,8 @@ public class ProfileMgr : BaseMgr<ProfileMgr>
 		this.m_profileCtrl = this.m_goProfilePanel.GetComponent<ProfileCtrl>();
 		Maid maid = GameMain.Instance.CharacterMgr.GetMaid(0);
 		this.m_maidStatus = maid.status;
-		this.m_enabledInput = (this.sceneEdit.modeType == SceneEdit.ModeType.OriginalChara || this.sceneEdit.modeType == SceneEdit.ModeType.MainChara);
-		this.m_enabledPersonalityInput = (this.sceneEdit.modeType == SceneEdit.ModeType.OriginalChara);
+		this.m_enabledInput = (this.sceneEdit.modeType == SceneEdit.ModeType.OriginalChara || this.sceneEdit.modeType == SceneEdit.ModeType.MainChara || this.sceneEdit.modeType == SceneEdit.ModeType.ScoutChara);
+		this.m_enabledPersonalityInput = (this.sceneEdit.modeType == SceneEdit.ModeType.OriginalChara || this.sceneEdit.modeType == SceneEdit.ModeType.ScoutChara);
 		this.m_profileCtrl.Init(this.m_goProfilePanel, this.m_maidStatus);
 		this.m_profileCtrl.SetActiveViewerAndButton(ProfileMgr.UpperButtonType.None);
 		this.m_dicDividedPoint = this.InitDicDividedPoint();

+ 12 - 0
Assembly-CSharp/RandomPresetContent.cs

@@ -401,6 +401,18 @@ public class RandomPresetContent
 		{
 			MPN.eyewhite,
 			MPN.folder_eyewhite
+		},
+		{
+			MPN.matsuge_up,
+			MPN.folder_matsuge_up
+		},
+		{
+			MPN.matsuge_low,
+			MPN.folder_matsuge_low
+		},
+		{
+			MPN.futae,
+			MPN.folder_futae
 		}
 	};
 

+ 195 - 40
Assembly-CSharp/SceneEdit.cs

@@ -102,6 +102,14 @@ public class SceneEdit : MonoBehaviour
 		}
 	}
 
+	public bool isFBFace
+	{
+		get
+		{
+			return this.maid != null && this.maid.body0 != null && 120 <= this.maid.body0.GetSlot(1).PartsVersion;
+		}
+	}
+
 	public List<SceneEdit.SCategory> CategoryList
 	{
 		get
@@ -209,6 +217,11 @@ public class SceneEdit : MonoBehaviour
 				this.modeType = SceneEdit.ModeType.NpcEdit;
 				flag = true;
 			}
+			else if (tag_backup.TryGetValue("scout", out strScriptArg))
+			{
+				this.modeType = SceneEdit.ModeType.ScoutChara;
+				flag = true;
+			}
 			if (!flag)
 			{
 				NDebug.Assert("エディットシーンのモード指定がありませんでした。次のうち必ず一つは指定してください[original|main|after|costume]", false);
@@ -444,11 +457,16 @@ public class SceneEdit : MonoBehaviour
 		this.m_dicColor.Clear();
 		base.StartCoroutine(this.InitMenuNative());
 		GameMain.Instance.TutorialPanel.SetImage(TutorialPanel.ImageSet.Edit, false);
-		if (PluginData.IsEnabled("GP001") || Product.type == Product.Type.JpPublic)
+		if (Product.type == Product.Type.JpPublic || (PluginData.IsEnabled("GP001") && !PluginData.IsEnabled("GP001FB")))
 		{
 			uGUITutorialPanel.OpenTutorial("SceneEditGP01", null, false);
 			GameMain.Instance.SysShortcut.strSceneHelpName = "SceneEditGP01";
 		}
+		else if (PluginData.IsEnabled("GP001FB"))
+		{
+			uGUITutorialPanel.OpenTutorial("SceneEditGPFB01", null, false);
+			GameMain.Instance.SysShortcut.strSceneHelpName = "SceneEditGPFB01";
+		}
 		else
 		{
 			GameMain.Instance.SysShortcut.strSceneHelpName = string.Empty;
@@ -611,16 +629,16 @@ public class SceneEdit : MonoBehaviour
 		{
 			yield return null;
 		}
-		while (!GameMain.Instance.MenuDataBase.JobFinished())
+		MenuDataBase menuDataBase = GameMain.Instance.MenuDataBase;
+		while (!menuDataBase.JobFinished())
 		{
 			yield return null;
 		}
 		this.InitCategoryList();
-		int fileCount = GameMain.Instance.MenuDataBase.GetDataSize();
+		int fileCount = menuDataBase.GetDataSize();
 		List<SceneEdit.SMenuItem> menuList = new List<SceneEdit.SMenuItem>(fileCount);
 		this.m_menuRidDic = new Dictionary<int, SceneEdit.SMenuItem>(fileCount);
 		Dictionary<int, List<int>> menuGroupMemberDic = new Dictionary<int, List<int>>();
-		MenuDataBase menuDataBase = GameMain.Instance.MenuDataBase;
 		float time = Time.realtimeSinceStartup;
 		for (int i = 0; i < fileCount; i++)
 		{
@@ -866,30 +884,34 @@ public class SceneEdit : MonoBehaviour
 					m_nSliderValue = 500,
 					m_strCateName = keyValuePair2.Key.ToString(),
 					m_strMenuName = keyValuePair2.Value.m_strBtnPartsTypeName,
-					m_requestNewFace = keyValuePair2.Value.m_requestNewFace
+					m_requestNewFace = keyValuePair2.Value.m_requestNewFace,
+					m_requestFBFace = keyValuePair2.Value.m_requestFBFace
 				});
 			}
 		}
 		for (int nM = 0; nM < menuList.Count; nM++)
 		{
 			SceneEdit.SMenuItem mi = menuList[nM];
-			if (mi.m_eColorSetMPN != MPN.null_mpn)
+			if (SceneEditInfo.m_dicPartsTypePair.ContainsKey(mi.m_eColorSetMPN))
 			{
-				if (mi.m_strMenuNameInColorSet != null)
+				if (mi.m_eColorSetMPN != MPN.null_mpn)
 				{
-					mi.m_strMenuNameInColorSet = mi.m_strMenuNameInColorSet.Replace("*", ".*");
-					mi.m_listColorSet = this.m_dicColor[mi.m_eColorSetMPN].FindAll((SceneEdit.SMenuItem i) => new Regex(mi.m_strMenuNameInColorSet).IsMatch(i.m_strMenuFileName));
+					if (mi.m_strMenuNameInColorSet != null)
+					{
+						mi.m_strMenuNameInColorSet = mi.m_strMenuNameInColorSet.Replace("*", ".*");
+						mi.m_listColorSet = this.m_dicColor[mi.m_eColorSetMPN].FindAll((SceneEdit.SMenuItem i) => new Regex(mi.m_strMenuNameInColorSet).IsMatch(i.m_strMenuFileName));
+					}
+					else
+					{
+						mi.m_listColorSet = this.m_dicColor[mi.m_eColorSetMPN];
+					}
 				}
-				else
+				if (0.5f < Time.realtimeSinceStartup - time)
 				{
-					mi.m_listColorSet = this.m_dicColor[mi.m_eColorSetMPN];
+					yield return null;
+					time = Time.realtimeSinceStartup;
 				}
 			}
-			if (0.5f < Time.realtimeSinceStartup - time)
-			{
-				yield return null;
-				time = Time.realtimeSinceStartup;
-			}
 		}
 		for (int j = 0; j < this.m_listCategory.Count; j++)
 		{
@@ -1174,6 +1196,35 @@ public class SceneEdit : MonoBehaviour
 			return false;
 		}
 		SceneEditInfo.CCateNameType cateType;
+		if (!string.IsNullOrEmpty(f_mi.m_strMenuFileName) && Product.type == Product.Type.JpAdult)
+		{
+			if (SceneEditInfo.m_listCollaboCategory.Contains(f_mi.m_strMenuFileName.ToLower()))
+			{
+				if (mpn != MPN.null_mpn && SceneEditInfo.m_dicPartsTypePair.TryGetValue(mpn, out cateType))
+				{
+					cateType.m_strBtnPartsTypeName = "コラボ";
+					cateType.m_ePartsType = "set_collabo";
+				}
+			}
+			else if (mpn != MPN.null_mpn && SceneEditInfo.m_dicPartsTypePair.TryGetValue(mpn, out cateType) && cateType.m_strBtnPartsTypeName == "コラボ" && cateType.m_ePartsType == "set_collabo")
+			{
+				if (mpn == MPN.set_maidwear)
+				{
+					cateType.m_strBtnPartsTypeName = "メイド服";
+					cateType.m_ePartsType = "set_maidwear";
+				}
+				else if (mpn == MPN.set_mywear)
+				{
+					cateType.m_strBtnPartsTypeName = "コスチューム";
+					cateType.m_ePartsType = "set_mywear";
+				}
+				else if (mpn == MPN.set_underwear)
+				{
+					cateType.m_strBtnPartsTypeName = "下着";
+					cateType.m_ePartsType = "set_underwear";
+				}
+			}
+		}
 		if (mpn != MPN.null_mpn && SceneEditInfo.m_dicPartsTypePair.TryGetValue(mpn, out cateType))
 		{
 			if (cateType.m_eType == SceneEditInfo.CCateNameType.EType.Item || cateType.m_eType == SceneEditInfo.CCateNameType.EType.Set || cateType.m_eType == SceneEditInfo.CCateNameType.EType.Slider)
@@ -1194,7 +1245,7 @@ public class SceneEdit : MonoBehaviour
 					{
 						f_strPartsTypeName = cateType.m_strBtnPartsTypeName;
 					}
-					spartsType = new SceneEdit.SPartsType(cateType.m_eType, mpn, f_strPartsTypeName, cateType.m_ePartsType);
+					spartsType = new SceneEdit.SPartsType(cateType.m_eType, mpn, f_strPartsTypeName, cateType.m_ePartsType, cateType.m_requestNewFace, cateType.m_requestFBFace);
 					if (this.enabledMpns.Count == 0)
 					{
 						spartsType.m_isEnabled = true;
@@ -1538,7 +1589,7 @@ public class SceneEdit : MonoBehaviour
 		for (int n = 0; n < f_cate.m_listPartsType.Count; n++)
 		{
 			SceneEdit.SPartsType spartsType = f_cate.m_listPartsType[n];
-			if (MPN.EarNone <= spartsType.m_mpn && spartsType.m_mpn <= MPN.EarScl && !PluginData.IsEnabled("GP001"))
+			if ((!PluginData.IsEnabled("GP001") && !PluginData.IsEnabled("GP001FB") && spartsType.m_isGP01Face) || (!PluginData.IsEnabled("GP001FB") && spartsType.m_isFBFace))
 			{
 				this.m_listBtnPartsType.Add(null);
 			}
@@ -1556,6 +1607,10 @@ public class SceneEdit : MonoBehaviour
 				buttonEdit.m_PartsType = spartsType;
 				UIButton uibutton = gameObject2.GetComponentsInChildren<UIButton>(true)[0];
 				uibutton.isEnabled = spartsType.m_isEnabled;
+				if (spartsType.m_isFBFace && !this.isFBFace)
+				{
+					uibutton.isEnabled = false;
+				}
 				if (uibutton.isEnabled)
 				{
 					EventDelegate.Add(uibutton.onClick, new EventDelegate.Callback(this.ClickCallback));
@@ -1666,29 +1721,64 @@ public class SceneEdit : MonoBehaviour
 				}
 				if (!flag || !smenuItem.m_bMember)
 				{
-					SceneEdit.MenuItemSet menuItemSet3 = new SceneEdit.MenuItemSet(uipanelSet.goGrid, smenuItem, f_strPrefabName, f_bSelectedFrame);
+					if (f_pt.m_ePartsType == "set_collabo" && m == 0)
+					{
+						SceneEdit.SPartsType spartsType = this.m_listCategory[5].m_listPartsType.Find((SceneEdit.SPartsType val) => val.m_ePartsType == "set_mywear");
+						SceneEdit.SMenuItem smenuItem2 = null;
+						if (spartsType != null)
+						{
+							smenuItem2 = spartsType.m_listMenu[0];
+						}
+						if (smenuItem2 != null)
+						{
+							SceneEdit.MenuItemSet menuItemSet3 = new SceneEdit.MenuItemSet(uipanelSet.goGrid, smenuItem2, f_strPrefabName, f_bSelectedFrame);
+							if (smenuItem2.m_boDelOnly)
+							{
+								this.m_misDelOnly = menuItemSet3;
+							}
+							if (menuItemSet3.mi.m_strCateName.IndexOf("set_") != -1 && menuItemSet3.mi.m_bGroupLeader && flag)
+							{
+								EventDelegate.Add(menuItemSet3.gcBtn.onClick, new EventDelegate.Callback(this.ClickCallbackFromSetGroup));
+							}
+							else
+							{
+								EventDelegate.Add(menuItemSet3.gcBtn.onClick, new EventDelegate.Callback(this.ClickCallback));
+							}
+							if (smenuItem.m_bGroupLeader && flag)
+							{
+								EventDelegate.Add(menuItemSet3.gcEvent.onHoverOver, new EventDelegate.Callback(this.HoverOverCallbackOnGroup));
+							}
+							else
+							{
+								EventDelegate.Add(menuItemSet3.gcEvent.onHoverOver, new EventDelegate.Callback(this.HoverOverCallback));
+							}
+							EventDelegate.Add(menuItemSet3.gcEvent.onHoverOut, new EventDelegate.Callback(this.HoverOutCallback));
+							this.m_listBtnMenuItem.Add(menuItemSet3);
+						}
+					}
+					SceneEdit.MenuItemSet menuItemSet4 = new SceneEdit.MenuItemSet(uipanelSet.goGrid, smenuItem, f_strPrefabName, f_bSelectedFrame);
 					if (smenuItem.m_boDelOnly)
 					{
-						this.m_misDelOnly = menuItemSet3;
+						this.m_misDelOnly = menuItemSet4;
 					}
-					if (menuItemSet3.mi.m_strCateName.IndexOf("set_") != -1 && menuItemSet3.mi.m_bGroupLeader && flag)
+					if (menuItemSet4.mi.m_strCateName.IndexOf("set_") != -1 && menuItemSet4.mi.m_bGroupLeader && flag)
 					{
-						EventDelegate.Add(menuItemSet3.gcBtn.onClick, new EventDelegate.Callback(this.ClickCallbackFromSetGroup));
+						EventDelegate.Add(menuItemSet4.gcBtn.onClick, new EventDelegate.Callback(this.ClickCallbackFromSetGroup));
 					}
 					else
 					{
-						EventDelegate.Add(menuItemSet3.gcBtn.onClick, new EventDelegate.Callback(this.ClickCallback));
+						EventDelegate.Add(menuItemSet4.gcBtn.onClick, new EventDelegate.Callback(this.ClickCallback));
 					}
 					if (smenuItem.m_bGroupLeader && flag)
 					{
-						EventDelegate.Add(menuItemSet3.gcEvent.onHoverOver, new EventDelegate.Callback(this.HoverOverCallbackOnGroup));
+						EventDelegate.Add(menuItemSet4.gcEvent.onHoverOver, new EventDelegate.Callback(this.HoverOverCallbackOnGroup));
 					}
 					else
 					{
-						EventDelegate.Add(menuItemSet3.gcEvent.onHoverOver, new EventDelegate.Callback(this.HoverOverCallback));
+						EventDelegate.Add(menuItemSet4.gcEvent.onHoverOver, new EventDelegate.Callback(this.HoverOverCallback));
 					}
-					EventDelegate.Add(menuItemSet3.gcEvent.onHoverOut, new EventDelegate.Callback(this.HoverOutCallback));
-					this.m_listBtnMenuItem.Add(menuItemSet3);
+					EventDelegate.Add(menuItemSet4.gcEvent.onHoverOut, new EventDelegate.Callback(this.HoverOutCallback));
+					this.m_listBtnMenuItem.Add(menuItemSet4);
 				}
 			}
 			uipanelSet.gcUIGrid.GetComponent<UIGrid>().enabled = true;
@@ -1710,17 +1800,17 @@ public class SceneEdit : MonoBehaviour
 			this.m_Panel_GroupSet.SetActive(false);
 			this.m_Panel_SliderItem.SetActive(true);
 			bool flag2 = false;
-			foreach (SceneEdit.SMenuItem smenuItem2 in f_pt.m_listMenu)
+			foreach (SceneEdit.SMenuItem smenuItem3 in f_pt.m_listMenu)
 			{
-				if (!smenuItem2.m_requestNewFace || this.isNewFace)
+				if ((!smenuItem3.m_requestNewFace || this.isNewFace) && (!smenuItem3.m_requestFBFace || this.isFBFace))
 				{
-					if (!Product.isPublic || smenuItem2.m_mpn != MPN.MuneYawaraka)
+					if (!Product.isPublic || smenuItem3.m_mpn != MPN.MuneYawaraka)
 					{
 						SceneEdit.SliderItemSet sliderItemSet2;
-						if (smenuItem2.m_mpn == MPN.EarNone)
+						if (smenuItem3.m_mpn == MPN.EarNone)
 						{
 							SceneEdit.SwitchItemSet switchItemSet = new SceneEdit.SwitchItemSet();
-							switchItemSet.Create(this.m_Panel_SliderItem.goGrid, smenuItem2);
+							switchItemSet.Create(this.m_Panel_SliderItem.goGrid, smenuItem3);
 							switchItemSet.onClickEvent = delegate(bool earNone, SceneEdit.SMenuItem menu)
 							{
 								int num2 = (!earNone) ? 0 : 1;
@@ -1737,9 +1827,9 @@ public class SceneEdit : MonoBehaviour
 						else
 						{
 							sliderItemSet2 = new SceneEdit.SliderItemSet();
-							sliderItemSet2.Create(this.m_Panel_SliderItem.goGrid, smenuItem2);
+							sliderItemSet2.Create(this.m_Panel_SliderItem.goGrid, smenuItem3);
 							EventDelegate.Add(sliderItemSet2.gcSlider.onChange, new EventDelegate.Callback(this.SlideCallback));
-							flag2 |= (smenuItem2.m_mpn == MPN.MuneYawaraka);
+							flag2 |= (smenuItem3.m_mpn == MPN.MuneYawaraka);
 						}
 						this.m_listSliderItem.Add(sliderItemSet2);
 					}
@@ -2296,6 +2386,10 @@ public class SceneEdit : MonoBehaviour
 			UIButton component6 = componentInChildren.GetComponent<UIButton>();
 			component6.defaultColor = new Color(component6.defaultColor.r, component6.defaultColor.g, component6.defaultColor.b, 1f);
 			this.colorPaletteMgr.Close();
+			if (componentInChildren.m_PartsType.m_strPartsTypeName == "コラボ" && componentInChildren.m_PartsType.m_mpn == MPN.set_underwear)
+			{
+				componentInChildren.m_PartsType.m_mpn = MPN.set_maidwear;
+			}
 			this.PartsTypeWearMode(componentInChildren.m_PartsType.m_mpn);
 			this.PartsTypeCamera(componentInChildren.m_PartsType.m_mpn);
 			if (componentInChildren.m_PartsType.m_mpn == MPN.accha)
@@ -2454,6 +2548,21 @@ public class SceneEdit : MonoBehaviour
 			}
 			else if (!this.m_bOpenSetGroupPanel)
 			{
+				if (componentInChildren.m_MenuItem.m_ParentPartsType.m_ePartsType == "set_collabo" && componentInChildren.m_MenuItem.m_mpn == MPN.set_mywear)
+				{
+					componentInChildren.m_MenuItem.m_ParentPartsType.m_mpn = MPN.set_mywear;
+					this.PartsTypeWearMode(componentInChildren.m_MenuItem.m_ParentPartsType.m_mpn);
+				}
+				else if (componentInChildren.m_MenuItem.m_ParentPartsType.m_ePartsType == "set_collabo" && componentInChildren.m_MenuItem.m_mpn == MPN.set_maidwear)
+				{
+					componentInChildren.m_MenuItem.m_ParentPartsType.m_mpn = MPN.set_maidwear;
+					this.PartsTypeWearMode(componentInChildren.m_MenuItem.m_ParentPartsType.m_mpn);
+				}
+				else if (componentInChildren.m_MenuItem.m_ParentPartsType.m_ePartsType == "set_collabo" && componentInChildren.m_MenuItem.m_mpn == MPN.set_underwear)
+				{
+					componentInChildren.m_MenuItem.m_ParentPartsType.m_mpn = MPN.set_underwear;
+					this.PartsTypeWearMode(componentInChildren.m_MenuItem.m_ParentPartsType.m_mpn);
+				}
 				this.UpdateSelectedMenuItem(componentInChildren.m_MenuItem.m_ParentPartsType);
 			}
 			else
@@ -2705,9 +2814,11 @@ public class SceneEdit : MonoBehaviour
 			foreach (SceneEdit.SPartsType spartsType in scategory.m_listPartsType)
 			{
 				bool flag = 0 < spartsType.m_listMenu.Count;
+				bool flag2 = false;
 				if (spartsType.m_eType == SceneEditInfo.CCateNameType.EType.Item)
 				{
 					flag = SceneEditInfo.m_dicPartsTypePair[spartsType.m_mpn].m_requestNewFace;
+					flag2 = SceneEditInfo.m_dicPartsTypePair[spartsType.m_mpn].m_requestFBFace;
 				}
 				else
 				{
@@ -2718,12 +2829,21 @@ public class SceneEdit : MonoBehaviour
 							flag = false;
 							break;
 						}
+						if (!smenuItem.m_requestFBFace)
+						{
+							flag2 = false;
+							break;
+						}
 					}
 				}
 				if (flag)
 				{
 					spartsType.m_isEnabled = this.isNewFace;
 				}
+				else if (flag2)
+				{
+					spartsType.m_isEnabled = this.isFBFace;
+				}
 				if (spartsType.m_mpn == MPN.accmimi)
 				{
 					spartsType.m_isEnabled = (this.maid.GetProp(MPN.EarNone).value == 0);
@@ -2740,6 +2860,10 @@ public class SceneEdit : MonoBehaviour
 			{
 				ButtonEdit buttonEdit = gameObject.GetComponentsInChildren<ButtonEdit>(true)[0];
 				SceneEdit.SPartsType partsType = buttonEdit.m_PartsType;
+				if ((partsType.m_isFBFace && !this.isFBFace) || (partsType.m_isFBFace && this.isFBFace))
+				{
+					partsType.m_isEnabled = this.isFBFace;
+				}
 				UIButton uibutton = gameObject.GetComponentsInChildren<UIButton>(true)[0];
 				uibutton.isEnabled = partsType.m_isEnabled;
 				if (uibutton.isEnabled && (uibutton.onClick == null || uibutton.onClick.Count == 0))
@@ -2773,7 +2897,7 @@ public class SceneEdit : MonoBehaviour
 				this.customPartsWindowVisibleButton.windowVisible = false;
 			}
 			maid.body0.SetMaskMode(TBody.MaskMode.None);
-			if (this.modeType == SceneEdit.ModeType.OriginalChara || this.modeType == SceneEdit.ModeType.MainChara)
+			if (this.modeType == SceneEdit.ModeType.OriginalChara || this.modeType == SceneEdit.ModeType.MainChara || this.modeType == SceneEdit.ModeType.ScoutChara)
 			{
 				FFNameDialog.OnClick value = delegate()
 				{
@@ -2844,7 +2968,7 @@ public class SceneEdit : MonoBehaviour
 		this.m_maid.boMabataki = false;
 		if (this.modeType == SceneEdit.ModeType.CostumeEdit)
 		{
-			for (int i = 67; i <= 66; i++)
+			for (int i = 81; i <= 80; i++)
 			{
 				this.maid.ResetProp((MPN)i, true);
 			}
@@ -2988,9 +3112,20 @@ public class SceneEdit : MonoBehaviour
 			mpn = MPN.folder_skin;
 			break;
 		default:
-			if (mpn == MPN.eyewhite)
+			switch (mpn)
 			{
+			case MPN.eyewhite:
 				mpn = MPN.folder_eyewhite;
+				break;
+			case MPN.matsuge_up:
+				mpn = MPN.folder_matsuge_up;
+				break;
+			case MPN.matsuge_low:
+				mpn = MPN.folder_matsuge_low;
+				break;
+			case MPN.futae:
+				mpn = MPN.folder_futae;
+				break;
 			}
 			break;
 		case MPN.underhair:
@@ -3038,9 +3173,20 @@ public class SceneEdit : MonoBehaviour
 			mpn = MPN.folder_skin;
 			break;
 		default:
-			if (mpn == MPN.eyewhite)
+			switch (mpn)
 			{
+			case MPN.eyewhite:
 				mpn = MPN.folder_eyewhite;
+				break;
+			case MPN.matsuge_up:
+				mpn = MPN.folder_matsuge_up;
+				break;
+			case MPN.matsuge_low:
+				mpn = MPN.folder_matsuge_low;
+				break;
+			case MPN.futae:
+				mpn = MPN.folder_futae;
+				break;
 			}
 			break;
 		case MPN.underhair:
@@ -3411,7 +3557,8 @@ public class SceneEdit : MonoBehaviour
 		MainChara,
 		AfterEdit,
 		CostumeEdit,
-		NpcEdit
+		NpcEdit,
+		ScoutChara
 	}
 
 	private enum TouchType
@@ -3552,6 +3699,8 @@ public class SceneEdit : MonoBehaviour
 
 		public bool m_requestNewFace;
 
+		public bool m_requestFBFace;
+
 		public MPN m_mpn;
 
 		public bool m_bColor;
@@ -3599,7 +3748,7 @@ public class SceneEdit : MonoBehaviour
 
 	public class SPartsType : IDisposable
 	{
-		public SPartsType(SceneEditInfo.CCateNameType.EType f_eType, MPN f_mpn, string f_strPartsTypeName, string f_ePartsType)
+		public SPartsType(SceneEditInfo.CCateNameType.EType f_eType, MPN f_mpn, string f_strPartsTypeName, string f_ePartsType, bool f_isGP01Face, bool f_isFBFace)
 		{
 			this.m_nIdx = SceneEditInfo.m_dicPartsTypePair[f_mpn].m_nIdx;
 			this.m_eType = f_eType;
@@ -3607,6 +3756,8 @@ public class SceneEdit : MonoBehaviour
 			this.m_strPartsTypeName = f_strPartsTypeName;
 			this.m_ePartsType = f_ePartsType;
 			this.m_isEnabled = true;
+			this.m_isGP01Face = f_isGP01Face;
+			this.m_isFBFace = f_isFBFace;
 		}
 
 		public void Dispose()
@@ -3671,6 +3822,10 @@ public class SceneEdit : MonoBehaviour
 
 		public bool m_isEnabled;
 
+		public bool m_isGP01Face;
+
+		public bool m_isFBFace;
+
 		public List<SceneEdit.SMenuItem> m_listMenu = new List<SceneEdit.SMenuItem>();
 
 		public GameObject m_goButton;

+ 43 - 0
Assembly-CSharp/SceneEditInfo.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.IO;
 using UnityEngine;
 using wf;
 
@@ -79,6 +80,7 @@ public static class SceneEditInfo
 								if (!flag || !Product.isPublic)
 								{
 									ccateNameType.m_requestNewFace = (csvParser.GetCellAsString(num++, i) == "〇");
+									ccateNameType.m_requestFBFace = (csvParser.GetCellAsString(num++, i) == "〇");
 									NDebug.Assert(!SceneEditInfo.dicPartsTypePair_.ContainsKey(key), "MPN[" + key.ToString() + "]が重複しています");
 									if (!dictionary.ContainsKey(ccateNameType.m_eMenuCate))
 									{
@@ -192,12 +194,51 @@ public static class SceneEditInfo
 		}
 	}
 
+	public static List<string> m_listCollaboCategory
+	{
+		get
+		{
+			if (SceneEditInfo.m_listCollabo_Category == null)
+			{
+				string text = "edit_collabo_category.nei";
+				SceneEditInfo.m_listCollabo_Category = new List<string>();
+				using (AFileBase afileBase = GameUty.FileSystem.FileOpen(text))
+				{
+					using (CsvParser csvParser = new CsvParser())
+					{
+						bool condition = csvParser.Open(afileBase);
+						NDebug.Assert(condition, text + "\nopen failed.");
+						for (int i = 1; i < csvParser.max_cell_y; i++)
+						{
+							if (csvParser.IsCellToExistData(0, i))
+							{
+								string text2 = csvParser.GetCellAsString(0, i).Trim();
+								if (!string.IsNullOrEmpty(text2))
+								{
+									text2 = text2.ToLower();
+									if (string.IsNullOrEmpty(Path.GetExtension(text2)))
+									{
+										text2 += ".menu";
+									}
+									SceneEditInfo.m_listCollabo_Category.Add(text2);
+								}
+							}
+						}
+					}
+				}
+			}
+			return SceneEditInfo.m_listCollabo_Category;
+		}
+	}
+
 	private static Dictionary<MPN, SceneEditInfo.CCateNameType> dicPartsTypePair_;
 
 	private static Dictionary<MPN, TBody.MaskMode> dicPartsTypeWearMode_;
 
 	private static Dictionary<MPN, SceneEditInfo.CamToBone> m_dicPartsTypeCamera_;
 
+	private static List<string> m_listCollabo_Category;
+
 	public enum EMenuCategory
 	{
 		頭,
@@ -242,6 +283,8 @@ public static class SceneEditInfo
 
 		public bool m_requestNewFace;
 
+		public bool m_requestFBFace;
+
 		public enum EType
 		{
 			Item,

+ 37 - 18
Assembly-CSharp/SceneEditWindow/CustomViewItem.cs

@@ -49,7 +49,7 @@ namespace SceneEditWindow
 				}
 			}
 			bool flag2 = true;
-			if (this.requestNewFace && !this.sceneEdit.isNewFace)
+			if ((this.requestNewFace && !this.sceneEdit.isNewFace) || (this.requestFBFace && !this.sceneEdit.isFBFace))
 			{
 				this.settingRid = 0;
 				num = -1;
@@ -104,6 +104,11 @@ namespace SceneEditWindow
 					this.iconTex.color = Color.white;
 				}
 			}
+			if ((this.sceneEdit.modeType == SceneEdit.ModeType.CostumeEdit && this.requestNewFace) || (this.sceneEdit.modeType == SceneEdit.ModeType.CostumeEdit && this.requestFBFace))
+			{
+				this.button.isEnabled = false;
+				this.button.tweenTarget = this.buttonTweenTarget;
+			}
 			return flag;
 		}
 
@@ -130,34 +135,45 @@ namespace SceneEditWindow
 			bool flag = false;
 			switch (mpn)
 			{
-			case MPN.skin:
-				mpn = MPN.folder_skin;
+			case MPN.chikubicolor:
+				mpn = MPN.chikubi;
+				flag = true;
+				break;
+			case MPN.eyewhite:
+				mpn = MPN.folder_eyewhite;
 				flag = true;
 				break;
 			default:
-				if (mpn != MPN.chikubicolor)
-				{
-					if (mpn == MPN.eyewhite)
-					{
-						mpn = MPN.folder_eyewhite;
-					}
-				}
-				else
+				switch (mpn)
 				{
-					mpn = MPN.chikubi;
+				case MPN.skin:
+					mpn = MPN.folder_skin;
+					flag = true;
+					break;
+				case MPN.underhair:
+					mpn = MPN.folder_underhair;
+					flag = true;
+					break;
+				case MPN.mayu:
+					mpn = MPN.folder_mayu;
 					flag = true;
+					break;
+				case MPN.eye:
+					mpn = MPN.folder_eye;
+					flag = true;
+					break;
 				}
 				break;
-			case MPN.underhair:
-				mpn = MPN.folder_underhair;
+			case MPN.matsuge_up:
+				mpn = MPN.folder_matsuge_up;
 				flag = true;
 				break;
-			case MPN.mayu:
-				mpn = MPN.folder_mayu;
+			case MPN.matsuge_low:
+				mpn = MPN.folder_matsuge_low;
 				flag = true;
 				break;
-			case MPN.eye:
-				mpn = MPN.folder_eye;
+			case MPN.futae:
+				mpn = MPN.folder_futae;
 				flag = true;
 				break;
 			}
@@ -221,6 +237,9 @@ namespace SceneEditWindow
 		[NonSerialized]
 		public bool requestNewFace;
 
+		[NonSerialized]
+		public bool requestFBFace;
+
 		private UIButton button;
 
 		private GameObject buttonTweenTarget;

+ 3 - 0
Assembly-CSharp/SceneEditWindow/CustomViewItemData.cs

@@ -38,6 +38,7 @@ namespace SceneEditWindow
 							}
 							item.iconTexName = Path.ChangeExtension(csvParser.GetCellAsString(num++, i).ToString(), "tex");
 							item.requestNewFace = (csvParser.GetCellAsString(num++, i) == "〇");
+							item.requestFBFace = (csvParser.GetCellAsString(num++, i) == "〇");
 							CustomViewItemData.itemList.Add(item);
 						}
 					}
@@ -54,6 +55,8 @@ namespace SceneEditWindow
 			public string iconTexName;
 
 			public bool requestNewFace;
+
+			public bool requestFBFace;
 		}
 	}
 }

+ 2 - 1
Assembly-CSharp/SceneEditWindow/CustomViewWindow.cs

@@ -64,7 +64,7 @@ namespace SceneEditWindow
 			}
 			foreach (CustomViewItemData.ItemData itemData in CustomViewItemData.itemList)
 			{
-				if (hashSet.Contains(itemData.mpn) && (!itemData.requestNewFace || PluginData.IsEnabled("GP001")))
+				if (hashSet.Contains(itemData.mpn) && (!itemData.requestNewFace || PluginData.IsEnabled("GP001") || PluginData.IsEnabled("GP001FB")) && (!itemData.requestFBFace || PluginData.IsEnabled("GP001FB")))
 				{
 					if (!this.texDic.ContainsKey(itemData.iconTexName))
 					{
@@ -74,6 +74,7 @@ namespace SceneEditWindow
 					componentInChildren.sceneEdit = this.sceneEdit;
 					componentInChildren.mpn = itemData.mpn;
 					componentInChildren.requestNewFace = itemData.requestNewFace;
+					componentInChildren.requestFBFace = itemData.requestFBFace;
 					componentInChildren.defaultIconTexture = this.texDic[itemData.iconTexName];
 					componentInChildren.GetComponentInChildren<UIWidget>().depth = 15;
 					this.itemList.Add(componentInChildren);

+ 26 - 5
Assembly-CSharp/SceneFreeModeSelectManager.cs

@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using MaidStatus;
+using Schedule;
 using UnityEngine;
 
 public class SceneFreeModeSelectManager : WfScreenManager
@@ -76,6 +77,7 @@ public class SceneFreeModeSelectManager : WfScreenManager
 		}
 		else
 		{
+			childObject5.gameObject.SetActive(true);
 			if (maid.status.subCharaData != null)
 			{
 				if (childObject != null)
@@ -86,11 +88,31 @@ public class SceneFreeModeSelectManager : WfScreenManager
 				{
 					childObject3.SetActive(false);
 				}
+				if (childObject5 != null)
+				{
+					List<FreeModeItemVip> list = FreeModeItemVip.CreateItemVipList(maid.status);
+					if (list != null)
+					{
+						List<FreeModeItemVip> list2 = new List<FreeModeItemVip>();
+						foreach (FreeModeItemVip freeModeItemVip in list)
+						{
+							if (!GameMain.Instance.CharacterMgr.status.lockNTRPlay || !ScheduleCSVData.NetorareFlag.Contains(freeModeItemVip.vip_data.id))
+							{
+								if (ScheduleAPI.VisibleNightWork(freeModeItemVip.vip_data.id, maid, false))
+								{
+									list2.Add(freeModeItemVip);
+								}
+							}
+						}
+						list = list2;
+					}
+					childObject5.SetActive(list != null && 0 < list.Count);
+				}
 			}
 			else if (maid.status.mainChara)
 			{
-				List<FreeModeItemEveryday> list = FreeModeItemEveryday.CreateItemEverydayList(FreeModeItemEveryday.ScnearioType.Story, null);
-				if (list.Count <= 0)
+				List<FreeModeItemEveryday> list3 = FreeModeItemEveryday.CreateItemEverydayList(FreeModeItemEveryday.ScnearioType.Story, null);
+				if (list3.Count <= 0)
 				{
 					UIButton component2 = childObject.GetComponent<UIButton>();
 					component2.isEnabled = false;
@@ -108,7 +130,6 @@ public class SceneFreeModeSelectManager : WfScreenManager
 					childObject6.SetActive(false);
 				}
 			}
-			childObject5.gameObject.SetActive(true);
 			childObject4.gameObject.SetActive(false);
 		}
 		if (childObject3.gameObject.activeSelf)
@@ -121,8 +142,8 @@ public class SceneFreeModeSelectManager : WfScreenManager
 		}
 		if (childObject2.gameObject.activeSelf)
 		{
-			List<FreeModeItemEveryday> list2 = FreeModeItemEveryday.CreateItemEverydayList(FreeModeItemEveryday.ScnearioType.Nitijyou, maid.status);
-			if (list2.Count <= 0)
+			List<FreeModeItemEveryday> list4 = FreeModeItemEveryday.CreateItemEverydayList(FreeModeItemEveryday.ScnearioType.Nitijyou, maid.status);
+			if (list4.Count <= 0)
 			{
 				childObject2.gameObject.SetActive(false);
 			}

+ 1 - 1
Assembly-CSharp/SceneNPCEdit/SaveData.cs

@@ -10,7 +10,7 @@ namespace SceneNPCEdit
 		public static void Serialize(BinaryWriter binary)
 		{
 			binary.Write("CM3D2_NPCEDIT");
-			binary.Write(1470);
+			binary.Write(1480);
 			binary.Write(SaveData.presetData.Count);
 			foreach (KeyValuePair<int, byte[]> keyValuePair in SaveData.presetData)
 			{

+ 54 - 19
Assembly-CSharp/SceneUserEditMain.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Collections;
 using System.Collections.Generic;
 using com.workman.cm3d2.scene.dailyEtc;
 using UnityEngine;
@@ -25,27 +26,57 @@ public class SceneUserEditMain : WfScreenChildren
 			this.playerNameInput.value = MaidRandomName.GetPlayerName();
 		});
 		EventDelegate.Add(this.okButton.onClick, new EventDelegate.Callback(this.OnClickOK));
+	}
+
+	public void Start()
+	{
+		GameMain.Instance.StartCoroutine(this.SetupManEditManager());
+	}
+
+	public void OnDestroy()
+	{
+		if (this.manEditManager != null)
+		{
+			this.manEditManager.Destroy();
+			this.manEditManager = null;
+		}
+		if (GameMain.Instance.MainCamera != null)
+		{
+			GameMain.Instance.MainCamera.SetTargetOffset(Vector3.zero, false);
+		}
+	}
+
+	private IEnumerator SetupManEditManager()
+	{
+		GameMain.Instance.LoadIcon.NextLoadIcontImmediatelyDisplay();
+		GameMain.Instance.LoadIcon.force_draw_new = true;
+		do
+		{
+			yield return null;
+		}
+		while (!GameMain.Instance.MenuDataBase.JobFinished());
+		GameMain.Instance.LoadIcon.force_draw_new = false;
 		this.manEditManager = new PhotoManEditManager();
-		List<SceneEdit.SMenuItem>[] array2 = new List<SceneEdit.SMenuItem>[]
+		List<SceneEdit.SMenuItem>[] itemLists = new List<SceneEdit.SMenuItem>[]
 		{
 			this.manEditManager.man_head_menu_list,
 			this.manEditManager.man_body_menu_list
 		};
-		UIWFTabPanel[] array3 = new UIWFTabPanel[]
+		UIWFTabPanel[] tagetPanels = new UIWFTabPanel[]
 		{
 			this.HeadItemTabPanel,
 			this.BodyItemTabPanel
 		};
-		EventDelegate.Callback[] array4 = new EventDelegate.Callback[]
+		EventDelegate.Callback[] callBackFunctions = new EventDelegate.Callback[]
 		{
 			new EventDelegate.Callback(this.OnSelectManHeadItem),
 			new EventDelegate.Callback(this.OnSelectManHeadItem)
 		};
-		for (int j = 0; j < array2.Length; j++)
+		for (int i = 0; i < itemLists.Length; i++)
 		{
-			UIWFTabPanel uiwftabPanel = array3[j];
-			EventDelegate.Callback callback = array4[j];
-			foreach (SceneEdit.SMenuItem smenuItem in array2[j])
+			UIWFTabPanel uiwftabPanel = tagetPanels[i];
+			EventDelegate.Callback callback = callBackFunctions[i];
+			foreach (SceneEdit.SMenuItem smenuItem in itemLists[i])
 			{
 				GameObject gameObject = Utility.CreatePrefab(uiwftabPanel.gameObject, "ScenePhotoMode/EditItemIcon", true);
 				if (smenuItem.m_texIconRef != null)
@@ -65,23 +96,23 @@ public class SceneUserEditMain : WfScreenChildren
 			Utility.ResetNGUI(uiwftabPanel.transform.parent.GetComponent<UIScrollView>());
 			uiwftabPanel.UpdateChildren();
 		}
-	}
-
-	public void OnDestroy()
-	{
-		if (this.manEditManager != null)
-		{
-			this.manEditManager.Destroy();
-			this.manEditManager = null;
-		}
-		if (GameMain.Instance.MainCamera != null)
+		do
 		{
-			GameMain.Instance.MainCamera.SetTargetOffset(Vector3.zero, false);
+			yield return null;
 		}
+		while (!this.calledOnCallEvent && GameMain.Instance.CharacterMgr.IsBusy());
+		this.CallAfter();
+		this.completedSetUp = true;
+		yield break;
 	}
 
 	protected override void OnCall()
 	{
+		this.calledOnCallEvent = true;
+	}
+
+	protected void CallAfter()
+	{
 		this.fadeWaitCount = 0;
 		GameMain.Instance.MainLight.Reset();
 		GameMain.Instance.CharacterMgr.ResetCharaPosAll();
@@ -167,7 +198,7 @@ public class SceneUserEditMain : WfScreenChildren
 	protected override bool IsCallFadeIn()
 	{
 		this.fadeWaitCount++;
-		return 2 < this.fadeWaitCount;
+		return 2 < this.fadeWaitCount && this.completedSetUp;
 	}
 
 	private void OnChangePlayerName()
@@ -346,4 +377,8 @@ public class SceneUserEditMain : WfScreenChildren
 	private PhotoManEditManager.Controller manController;
 
 	private int fadeWaitCount;
+
+	private bool calledOnCallEvent;
+
+	private bool completedSetUp;
 }

+ 15 - 19
Assembly-CSharp/Schedule/ScheduleAPI.cs

@@ -592,13 +592,6 @@ namespace Schedule
 			{
 				return list;
 			}
-			foreach (PersonalEventBlocker.Data data in PersonalEventBlocker.GetAllDatas())
-			{
-				if (condPersonalIds.Contains(data.personal.id))
-				{
-					condPersonalIds.Remove(data.personal.id);
-				}
-			}
 			for (int i = 0; i < GameMain.Instance.CharacterMgr.GetStockMaidCount(); i++)
 			{
 				Maid stockMaid = GameMain.Instance.CharacterMgr.GetStockMaid(i);
@@ -606,25 +599,28 @@ namespace Schedule
 				{
 					if (!(excludeMaid != null) || !(excludeMaid.status.guid == stockMaid.status.guid))
 					{
-						if (workData.id == 10072 && workData.isCheckGP002Personal)
-						{
-							if ((stockMaid.status.seikeiken == Seikeiken.Yes_No || stockMaid.status.seikeiken == Seikeiken.Yes_Yes) && condPersonalIds.Contains(stockMaid.status.personal.id) && PluginData.IsEnabledForGP002Personal(stockMaid.status.personal.uniqueName))
-							{
-								list.Add(stockMaid);
-							}
-						}
-						else if (stockMaid.status.seikeiken == Seikeiken.Yes_Yes && stockMaid.status.relation >= Relation.Lover && condPersonalIds.Contains(stockMaid.status.personal.id))
+						if (PersonalEventBlocker.IsEnabledScheduleTask(stockMaid.status.personal, workData.id))
 						{
-							if (workData.isCheckGP002Personal)
+							if (workData.id == 10072 && workData.isCheckGP002Personal)
 							{
-								if (PluginData.IsEnabledForGP002Personal(stockMaid.status.personal.uniqueName))
+								if ((stockMaid.status.seikeiken == Seikeiken.Yes_No || stockMaid.status.seikeiken == Seikeiken.Yes_Yes) && condPersonalIds.Contains(stockMaid.status.personal.id) && PluginData.IsEnabledForGP002Personal(stockMaid.status.personal.uniqueName))
 								{
 									list.Add(stockMaid);
 								}
 							}
-							else
+							else if (stockMaid.status.seikeiken == Seikeiken.Yes_Yes && stockMaid.status.relation >= Relation.Lover && condPersonalIds.Contains(stockMaid.status.personal.id))
 							{
-								list.Add(stockMaid);
+								if (workData.isCheckGP002Personal)
+								{
+									if (PluginData.IsEnabledForGP002Personal(stockMaid.status.personal.uniqueName))
+									{
+										list.Add(stockMaid);
+									}
+								}
+								else
+								{
+									list.Add(stockMaid);
+								}
 							}
 						}
 					}

+ 1 - 1
Assembly-CSharp/ScheduleTaskViewer.cs

@@ -23,7 +23,7 @@ public class ScheduleTaskViewer : MonoBehaviour
 			gameObject.name = name;
 			GameObject childObject = UTY.GetChildObject(gameObject, "Label", false);
 			UILabel component = childObject.GetComponent<UILabel>();
-			component.text = gameObject.name;
+			component.text = gameObject.name.Replace("<改行>", "\n");
 			Localize component2 = childObject.GetComponent<Localize>();
 			component2.SetTerm("SceneDaily/スケジュール/カテゴリー/" + name);
 			return UTY.GetChildObject(gameObject, "Button", false).GetComponent<UIButton>();

+ 47 - 1
Assembly-CSharp/ScriptManager.cs

@@ -10,6 +10,7 @@ using MaidStatus.Old;
 using PlayerStatus;
 using PrivateMaidMode;
 using Schedule;
+using scoutmode;
 using UnityEngine;
 using wf;
 
@@ -366,6 +367,9 @@ public class ScriptManager : IDisposable
 		this.tjs_.AddFunction("SetPrivateModeMaid", new TJSScript.FunctionCallBack(this.TJSFuncSetPrivateModeMaid));
 		this.tjs_.AddFunction("SetLockNTRPlay", new TJSScript.FunctionCallBack(this.TJSFuncSetLockNTRPlay));
 		this.tjs_.AddFunction("IsEnabeldAdditionalRelation", new TJSScript.FunctionCallBack(this.TJSFuncIsEnabeldAdditionalRelation));
+		this.tjs_.AddFunction("HireScoutMaid", new TJSScript.FunctionCallBack(this.TJSFuncHireScoutMaid));
+		this.tjs_.AddFunction("SuspendedScout", new TJSScript.FunctionCallBack(this.TJSFuncSuspendedScout));
+		this.tjs_.AddFunction("CancelScout", new TJSScript.FunctionCallBack(this.TJSFuncCancelScout));
 		MotionKagManager motionKagManager = new MotionKagManager(this.tjs_, this);
 		motionKagManager.Initialize();
 		motionKagManager.SetSloatNo(0);
@@ -1075,6 +1079,18 @@ public class ScriptManager : IDisposable
 		{
 			result.SetInteger(status.selectedJobClass.level);
 		}
+		else if (a == "スリーサイズB")
+		{
+			result.SetInteger(status.body.bust);
+		}
+		else if (a == "スリーサイズW")
+		{
+			result.SetInteger(status.body.waist);
+		}
+		else if (a == "スリーサイズH")
+		{
+			result.SetInteger(status.body.hip);
+		}
 		else if (flag)
 		{
 			if (a == "レンタルメイド")
@@ -3230,6 +3246,36 @@ public class ScriptManager : IDisposable
 		result.SetBool(Product.enabeldAdditionalRelation);
 	}
 
+	public void TJSFuncHireScoutMaid(TJSVariantRef[] tjs_param, TJSVariantRef result)
+	{
+		if (GameMain.Instance.CharacterMgr.GetMaid(0) == null)
+		{
+			return;
+		}
+		Maid maid = GameMain.Instance.CharacterMgr.GetMaid(0);
+		ScoutManager.Instance.HireScoutMaid(maid);
+	}
+
+	public void TJSFuncSuspendedScout(TJSVariantRef[] tjs_param, TJSVariantRef result)
+	{
+		if (GameMain.Instance.CharacterMgr.GetMaid(0) == null)
+		{
+			return;
+		}
+		Maid maid = GameMain.Instance.CharacterMgr.GetMaid(0);
+		ScoutManager.Instance.SuspendedScout(maid);
+	}
+
+	public void TJSFuncCancelScout(TJSVariantRef[] tjs_param, TJSVariantRef result)
+	{
+		if (GameMain.Instance.CharacterMgr.GetMaid(0) == null)
+		{
+			return;
+		}
+		Maid maid = GameMain.Instance.CharacterMgr.GetMaid(0);
+		ScoutManager.Instance.CancelScout(maid);
+	}
+
 	public void TJSFuncGetRemainingDanceTime(TJSVariantRef[] tjs_param, TJSVariantRef result)
 	{
 		if (result == null)
@@ -3353,7 +3399,7 @@ public class ScriptManager : IDisposable
 	public void Serialize(BinaryWriter binary)
 	{
 		binary.Write("CM3D2_SCRIPT");
-		binary.Write(1470);
+		binary.Write(1480);
 		this.adv_kag_.Serialize(binary);
 	}
 

+ 12 - 6
Assembly-CSharp/SystemShortcut.cs

@@ -106,12 +106,6 @@ public class SystemShortcut : MonoBehaviour
 			num++;
 		}
 		this.m_uiBase.width = 420 - num * 40;
-		Vector2 vector = new Vector2(700f, 110f);
-		this.m_hitArea.size = new Vector3((float)this.m_uiBase.width + vector.x, (float)this.m_uiBase.height + vector.y, 0f);
-		Vector3 center = this.m_uiBase.GetComponent<BoxCollider>().center;
-		center.x += vector.x / 2f;
-		center.y -= 50f;
-		this.m_hitArea.center = center;
 		UTY.GetChildObject(this.m_goBase, "Grid", false).GetComponent<UIGrid>().repositionNow = true;
 		SceneManager.activeSceneChanged += this.OnActiveSceneChanged;
 		SceneManager.sceneUnloaded += this.OnSceneUnloaded;
@@ -432,6 +426,12 @@ public class SystemShortcut : MonoBehaviour
 			this.m_uiPanel.alpha = 0f;
 		}
 		this.SetVRAvatarButtonInteractable();
+		Vector2 vector = new Vector2(700f, (float)((!this.m_goBtn[10].activeSelf) ? 20 : 110));
+		this.m_hitArea.size = new Vector3((float)this.m_uiBase.width + vector.x, (float)this.m_uiBase.height + vector.y, 0f);
+		Vector3 center = this.m_uiBase.GetComponent<BoxCollider>().center;
+		center.x = -190f + vector.x / 2f;
+		center.y = (float)((!this.m_goBtn[10].activeSelf) ? -5 : -50);
+		this.m_hitArea.center = center;
 	}
 
 	private void Update()
@@ -507,6 +507,12 @@ public class SystemShortcut : MonoBehaviour
 		this.SetHelpButtonInteractable();
 		uGUITutorialPanel.CloseTutorial(true, false);
 		this.SetVRAvatarButtonInteractable();
+		Vector2 vector = new Vector2(700f, (float)((!this.m_goBtn[10].activeSelf) ? 20 : 110));
+		this.m_hitArea.size = new Vector3((float)this.m_uiBase.width + vector.x, (float)this.m_uiBase.height + vector.y, 0f);
+		Vector3 center = this.m_uiBase.GetComponent<BoxCollider>().center;
+		center.x = -190f + vector.x / 2f;
+		center.y = (float)((!this.m_goBtn[10].activeSelf) ? -5 : -50);
+		this.m_hitArea.center = center;
 	}
 
 	private void OnSceneUnloaded(Scene unloadedScene)

+ 53 - 31
Assembly-CSharp/TBody.cs

@@ -575,7 +575,7 @@ public class TBody : MonoBehaviour
 			this.quaUpperArmR = CMT.SearchObjName(tbodySkin.obj_tr, "Bip01 R UpperArm", false).localRotation;
 		}
 		this.bonemorph.Init();
-		this.bonemorph.InitBoneMorphEdit(tbodySkin.obj_tr, mpn, (TBody.SlotID)num);
+		this.bonemorph.InitBoneMorphEdit(tbodySkin.obj_tr, mpn, (TBody.SlotID)num, tbodySkin);
 		this.bonemorph.AddRoot(this.m_trBones);
 		this.bonemorph.Blend();
 		if (this.boMAN)
@@ -709,6 +709,38 @@ public class TBody : MonoBehaviour
 			this.goSlot[7].bonehair.bodyhit.ScaleMune("MOMO", num2);
 			this.goSlot[7].m_BonehairBodyhitScaleBackup["MOMO"] = num2;
 		}
+		if (tag == "mabutaupin")
+		{
+			this.goSlot[1].morph.m_MabutaUpIn.rate = f;
+		}
+		if (tag == "mabutaupin2")
+		{
+			this.goSlot[1].morph.m_MabutaUpIn2.rate = f;
+		}
+		if (tag == "mabutaupmiddle")
+		{
+			this.goSlot[1].morph.m_MabutaUpMiddle.rate = f;
+		}
+		if (tag == "mabutaupout")
+		{
+			this.goSlot[1].morph.m_MabutaUpOut.rate = f;
+		}
+		if (tag == "mabutaupout2")
+		{
+			this.goSlot[1].morph.m_MabutaUpOut2.rate = f;
+		}
+		if (tag == "mabutalowin")
+		{
+			this.goSlot[1].morph.m_MabutaLowIn.rate = f;
+		}
+		if (tag == "mabutalowupmiddle")
+		{
+			this.goSlot[1].morph.m_MabutaLowUpMiddle.rate = f;
+		}
+		if (tag == "mabutalowupout")
+		{
+			this.goSlot[1].morph.m_MabutaLowUpOut.rate = f;
+		}
 		try
 		{
 			if (this.goSlot[0].morph.hash.ContainsKey(tag))
@@ -900,6 +932,14 @@ public class TBody : MonoBehaviour
 		{
 			this.goSlot[1].morph.m_MayuShapeOut.rate = Mathf.Lerp(-1f, 1f, f);
 		}
+		if (tag == "MayuLong")
+		{
+			this.bonemorph.MayuLong = f;
+		}
+		if (tag == "Yorime")
+		{
+			this.bonemorph.Yorime = f;
+		}
 		if (tag == "MuneUpDown")
 		{
 			this.jbMuneL.MuneUpDown = (f - 0.5f) * 60f;
@@ -925,6 +965,10 @@ public class TBody : MonoBehaviour
 			jbMuneR.m_fMuneYawaraka = f;
 			flag = true;
 		}
+		if (tag == "MayuThick")
+		{
+			this.goSlot[1].MayuThick = f;
+		}
 		if (!flag)
 		{
 		}
@@ -1083,7 +1127,7 @@ public class TBody : MonoBehaviour
 					catch (Exception ex)
 					{
 						NDebug.Assert("テクスチャの変更に失敗しました。以前のテクスチャを破棄できませんでした。" + ex.Message, false);
-						goto IL_513;
+						goto IL_4D3;
 					}
 					this.MulTexRemove(slotname, matno, prop_name, -1);
 					if (texture == null)
@@ -1144,20 +1188,8 @@ public class TBody : MonoBehaviour
 					Material material2 = renderer.materials[matno];
 					material2.SetTexture(prop_name, texture);
 				}
-				else
-				{
-					NDebug.Assert(string.Concat(new object[]
-					{
-						"マテリアル番号指定が ",
-						renderer.name,
-						"のマテリアル数を超えています。",
-						slotname,
-						" / ",
-						matno
-					}), false);
-				}
 			}
-			IL_513:;
+			IL_4D3:;
 		}
 	}
 
@@ -1174,21 +1206,9 @@ public class TBody : MonoBehaviour
 		foreach (Transform transform in obj.transform.GetComponentsInChildren<Transform>(true))
 		{
 			Renderer component = transform.GetComponent<Renderer>();
-			if (component != null && component.material != null)
+			if (component != null && component.material != null && f_nMatNo < component.materials.Length)
 			{
-				if (f_nMatNo < component.materials.Length)
-				{
-					return component.materials[f_nMatNo];
-				}
-				NDebug.Assert(string.Concat(new object[]
-				{
-					"マテリアル番号指定が ",
-					component.name,
-					" のマテリアル数を超えています。",
-					f_strSlotname,
-					" / ",
-					f_nMatNo
-				}), false);
+				return component.materials[f_nMatNo];
 			}
 		}
 		return null;
@@ -3015,8 +3035,8 @@ public class TBody : MonoBehaviour
 			{
 				this.EyeEulerAngle *= 0.95f;
 			}
-			this.trsEyeL.localRotation = this.quaDefEyeL * Quaternion.Euler(0f, -this.EyeEulerAngle.x * 0.2f, -this.EyeEulerAngle.z * 0.1f);
-			this.trsEyeR.localRotation = this.quaDefEyeR * Quaternion.Euler(0f, this.EyeEulerAngle.x * 0.2f, this.EyeEulerAngle.z * 0.1f);
+			this.trsEyeL.localRotation = this.quaDefEyeL * Quaternion.Euler(0f, -this.EyeEulerAngle.x * 0.2f + this.m_editYorime, -this.EyeEulerAngle.z * 0.1f);
+			this.trsEyeR.localRotation = this.quaDefEyeR * Quaternion.Euler(0f, this.EyeEulerAngle.x * 0.2f + this.m_editYorime, this.EyeEulerAngle.z * 0.1f);
 		}
 	}
 
@@ -3616,6 +3636,8 @@ public class TBody : MonoBehaviour
 
 	public bool m_drawBodyHitSphere;
 
+	public float m_editYorime;
+
 	private Dictionary<string, TBody.TexLay.Mat> m_dicLaySlot = new Dictionary<string, TBody.TexLay.Mat>();
 
 	private TBody.MaskMode m_eMaskMode;

+ 50 - 25
Assembly-CSharp/TBodySkin.cs

@@ -2,7 +2,6 @@
 using System.Collections;
 using System.Collections.Generic;
 using System.IO;
-using System.Reflection;
 using System.Text.RegularExpressions;
 using UnityEngine;
 
@@ -179,39 +178,37 @@ public class TBodySkin
 						material.EnableKeyword(f_strPropName);
 					}
 				}
-				else
+				else if (material.HasProperty(f_strPropName))
 				{
-					Type type = Assembly.Load("UnityEngine.dll").GetType(f_strTypeName);
-					if (type == null)
+					if (f_strTypeName == "Color")
 					{
-						type = Type.GetType(f_strTypeName, false, true);
+						string[] array = f_strValue.Split(new char[]
+						{
+							':'
+						});
+						material.SetColor(f_strPropName, new Color(float.Parse(array[0]), float.Parse(array[1]), float.Parse(array[2]), float.Parse(array[3])));
 					}
-					if (type == null)
+					else
 					{
-						Debug.LogError("タイプ " + f_strTypeName + " は存在しません。");
-						return;
+						material.SetFloat(f_strPropName, float.Parse(f_strValue));
 					}
-					if (material.HasProperty(f_strPropName))
+					if (f_bEditSave)
 					{
-						material.SetFloat(f_strPropName, float.Parse(f_strValue));
-						if (f_bEditSave)
-						{
-							this.body.maid.SetMaterialProperty(f_SrcMpn, this.SlotId, f_nMatNo, f_strPropName, f_strTypeName, f_strValue);
-						}
-						else
-						{
-							MatPropSave materialProperty = this.body.maid.GetMaterialProperty(f_SrcMpn, this.SlotId);
-							if (materialProperty != null)
-							{
-								this.SetMaterialProperty(f_SrcMpn, materialProperty.nMatNo, materialProperty.strPropName, materialProperty.strTypeName, materialProperty.strValue, true);
-							}
-						}
+						this.body.maid.SetMaterialProperty(f_SrcMpn, this.SlotId, f_nMatNo, f_strPropName, f_strTypeName, f_strValue);
 					}
 					else
 					{
-						Debug.LogWarning(f_strPropName + "はありませんでした。");
+						MatPropSave materialProperty = this.body.maid.GetMaterialProperty(f_SrcMpn, this.SlotId);
+						if (materialProperty != null)
+						{
+							this.SetMaterialProperty(f_SrcMpn, materialProperty.nMatNo, materialProperty.strPropName, materialProperty.strTypeName, materialProperty.strValue, true);
+						}
 					}
 				}
+				else
+				{
+					Debug.LogError(f_strPropName + "はありませんでした。");
+				}
 			}
 		}
 	}
@@ -222,7 +219,6 @@ public class TBodySkin
 		{
 			return string.Empty;
 		}
-		bool flag = f_strType == "DEFINE";
 		Transform[] componentsInChildren = this.obj.transform.GetComponentsInChildren<Transform>(true);
 		int i = 0;
 		while (i < componentsInChildren.Length)
@@ -232,10 +228,24 @@ public class TBodySkin
 			if (component != null && component.material != null && f_nMatNo < component.materials.Length)
 			{
 				Material material = component.materials[f_nMatNo];
-				if (flag)
+				if (f_strType == "DEFINE")
 				{
 					return (!material.IsKeywordEnabled(f_strPropName)) ? "0" : "1";
 				}
+				if (f_strType == "Color")
+				{
+					Color color = material.GetColor(f_strPropName);
+					return string.Concat(new string[]
+					{
+						color.r.ToString(),
+						":",
+						color.g.ToString(),
+						":",
+						color.b.ToString(),
+						":",
+						color.a.ToString()
+					});
+				}
 				return material.GetFloat(f_strPropName).ToString();
 			}
 			else
@@ -284,6 +294,21 @@ public class TBodySkin
 		this.m_dicBackupShader.Clear();
 	}
 
+	public float MayuThick
+	{
+		set
+		{
+			if (this.SlotId == TBody.SlotID.head && 120 <= this.PartsVersion)
+			{
+				SkinnedMeshRenderer componentInChildren = this.obj.GetComponentInChildren<SkinnedMeshRenderer>();
+				Material material = componentInChildren.materials[3];
+				float num = 0.5f * (value - 0.5f) / -0.5f;
+				material.SetTextureScale("_MainTex", new Vector2(1f, 1f + num));
+				material.SetTextureOffset("_MainTex", new Vector2(0f, -(num / 2f)));
+			}
+		}
+	}
+
 	public bool EnablePartsPosEdit
 	{
 		get

+ 244 - 60
Assembly-CSharp/TMorph.cs

@@ -147,22 +147,81 @@ public class TMorph
 		this.m_MayuShapeIn.rate = (this.m_MayuShapeOut.rate = 0f);
 		this.m_MayuShapeIn.idx = ((!this.hash.ContainsKey("mayueditin")) ? -1 : ((int)this.hash["mayueditin"]));
 		this.m_MayuShapeOut.idx = ((!this.hash.ContainsKey("mayueditout")) ? -1 : ((int)this.hash["mayueditout"]));
-		this.m_fEyeCloseRate = 0f;
-		this.BlendDataIdx_EyeClose = new int[10];
-		if (this.hash.ContainsKey("eyeclose"))
+		if (120 <= this.bodyskin.PartsVersion)
 		{
-			this.BlendDataIdx_EyeClose[0] = (int)this.hash["eyeclose"];
+			Action<string, TMorph.IdxMinMaxRatePair> action = delegate(string no, TMorph.IdxMinMaxRatePair idx)
+			{
+				bool flag = false;
+				flag |= ((idx.idxDwL = ((!this.hash.ContainsKey("eyeeditl" + no + "_dw")) ? -1 : ((int)this.hash["eyeeditl" + no + "_dw"]))) == -1);
+				flag |= ((idx.idxUpL = ((!this.hash.ContainsKey("eyeeditl" + no + "_up")) ? -1 : ((int)this.hash["eyeeditl" + no + "_up"]))) == -1);
+				flag |= ((idx.idxDwR = ((!this.hash.ContainsKey("eyeeditr" + no + "_dw")) ? -1 : ((int)this.hash["eyeeditr" + no + "_dw"]))) == -1);
+				flag |= ((idx.idxUpR = ((!this.hash.ContainsKey("eyeeditr" + no + "_up")) ? -1 : ((int)this.hash["eyeeditr" + no + "_up"]))) == -1);
+				if (flag)
+				{
+					Debug.LogError("not fund shape key name");
+					return;
+				}
+				idx.exec = delegate(float rateL, float rateR)
+				{
+					float num4 = Mathf.Clamp01((idx.rate - 0.5f) / -0.5f);
+					float num5 = Mathf.Clamp01((idx.rate - 0.5f) / 0.5f);
+					this.BlendValues[idx.idxDwL] = num4 * rateL;
+					this.BlendValues[idx.idxDwR] = num4 * rateR;
+					this.BlendValues[idx.idxUpL] = num5 * rateL;
+					this.BlendValues[idx.idxUpR] = num5 * rateR;
+				};
+				if (this.m_IdxMinMaxList == null)
+				{
+					this.m_IdxMinMaxList = new List<TMorph.IdxMinMaxRatePair>();
+				}
+				this.m_IdxMinMaxList.Add(idx);
+			};
+			action("1", this.m_MabutaUpIn);
+			action("2", this.m_MabutaUpIn2);
+			action("3", this.m_MabutaUpMiddle);
+			action("4", this.m_MabutaUpOut);
+			action("5", this.m_MabutaUpOut2);
+			action("6", this.m_MabutaLowUpOut);
+			action("7", this.m_MabutaLowUpMiddle);
+			action("8", this.m_MabutaLowIn);
 		}
-		for (int k = 1; k < 10; k++)
+		this.m_fEyeCloseRate = 0f;
+		this.BlendDataIdx_EyeClose = new int[][]
+		{
+			new int[10],
+			new int[10],
+			new int[10]
+		};
+		if (this.bodyskin.PartsVersion < 120)
 		{
-			if (this.hash.ContainsKey("eyeclose" + k.ToString()))
+			if (this.hash.ContainsKey("eyeclose"))
+			{
+				this.BlendDataIdx_EyeClose[0][0] = (int)this.hash["eyeclose"];
+			}
+			for (int k = 1; k < 10; k++)
+			{
+				if (this.hash.ContainsKey("eyeclose" + k.ToString()))
+				{
+					this.BlendDataIdx_EyeClose[0][k] = (int)this.hash["eyeclose" + k.ToString()];
+				}
+			}
+			if (!this.bodyskin.body.boMAN && this.Category == "head" && this.BlendDataIdx_EyeClose[0][0] == 0)
 			{
-				this.BlendDataIdx_EyeClose[k] = (int)this.hash["eyeclose" + k.ToString()];
+				Debug.LogError("Face[eyeclose]");
 			}
 		}
-		if (!this.bodyskin.body.boMAN && this.Category == "head" && this.BlendDataIdx_EyeClose[0] == 0)
+		else
 		{
-			Debug.LogError("Face[eyeclose]");
+			for (int l = 0; l < 3; l++)
+			{
+				for (int m = 0; m < 10; m++)
+				{
+					if (this.hash.ContainsKey("eyeclose" + (m + 1).ToString() + TMorph.crcFaceTypesStr[l]))
+					{
+						this.BlendDataIdx_EyeClose[l][m] = (int)this.hash["eyeclose" + (m + 1).ToString() + TMorph.crcFaceTypesStr[l]];
+					}
+				}
+			}
 		}
 		if (this.hash.ContainsKey("toothoff"))
 		{
@@ -229,7 +288,7 @@ public class TMorph
 		fixed (BoneWeight* ptr = &this.m_bws[0])
 		{
 			BoneWeight* ptr2 = ptr;
-			for (int l = 0; l < this.VCount; l++)
+			for (int n = 0; n < this.VCount; n++)
 			{
 				int num = ptr2->boneIndex0;
 				float num2 = ptr2->weight0;
@@ -248,28 +307,28 @@ public class TMorph
 					num2 = ptr2->weight3;
 					num = ptr2->boneIndex3;
 				}
-				this.BindBone[l] = num;
-				Vector3 vector = this.m_bindposes[num].MultiplyPoint3x4(this.m_vOriVert[l]);
-				this.BindVert[l] = vector;
-				this.DefVert[l] = this.m_bones[num].TransformPoint(vector);
-				this.m_AtrVert[l] = 0;
-				for (int m = 0; m < TMorph.AtrVertChk.Length; m++)
+				this.BindBone[n] = num;
+				Vector3 vector = this.m_bindposes[num].MultiplyPoint3x4(this.m_vOriVert[n]);
+				this.BindVert[n] = vector;
+				this.DefVert[n] = this.m_bones[num].TransformPoint(vector);
+				this.m_AtrVert[n] = 0;
+				for (int num3 = 0; num3 < TMorph.AtrVertChk.Length; num3++)
 				{
-					if (this.BoneNames[ptr2->boneIndex0].Contains(TMorph.AtrVertChk[m]))
+					if (this.BoneNames[ptr2->boneIndex0].Contains(TMorph.AtrVertChk[num3]))
 					{
-						this.m_AtrVert[l] |= 1 << m;
+						this.m_AtrVert[n] |= 1 << num3;
 					}
-					if (ptr2->weight1 > 0f && this.BoneNames[ptr2->boneIndex1].Contains(TMorph.AtrVertChk[m]))
+					if (ptr2->weight1 > 0f && this.BoneNames[ptr2->boneIndex1].Contains(TMorph.AtrVertChk[num3]))
 					{
-						this.m_AtrVert[l] |= 1 << m;
+						this.m_AtrVert[n] |= 1 << num3;
 					}
-					if (ptr2->weight2 > 0f && this.BoneNames[ptr2->boneIndex2].Contains(TMorph.AtrVertChk[m]))
+					if (ptr2->weight2 > 0f && this.BoneNames[ptr2->boneIndex2].Contains(TMorph.AtrVertChk[num3]))
 					{
-						this.m_AtrVert[l] |= 1 << m;
+						this.m_AtrVert[n] |= 1 << num3;
 					}
-					if (ptr2->weight3 > 0f && this.BoneNames[ptr2->boneIndex3].Contains(TMorph.AtrVertChk[m]))
+					if (ptr2->weight3 > 0f && this.BoneNames[ptr2->boneIndex3].Contains(TMorph.AtrVertChk[num3]))
 					{
-						this.m_AtrVert[l] |= 1 << m;
+						this.m_AtrVert[n] |= 1 << num3;
 					}
 				}
 				ptr2++;
@@ -513,21 +572,48 @@ public class TMorph
 			Debug.LogError("表情がありません。" + BlendSetName);
 			return;
 		}
-		if (!this.hash.Contains(tag))
+		if (tag.Contains("*"))
 		{
-			Debug.LogError("表情がありません。tag=" + tag);
-			return;
-		}
-		int num = (int)this.hash[tag];
-		if (tag == "hoho2")
-		{
-			this.IdxHOHO2 = num;
+			for (int i = 0; i < 3; i++)
+			{
+				string text = tag.Replace("*", TMorph.crcFaceTypesStr[i]);
+				if (!this.hash.Contains(text))
+				{
+					Debug.LogError("表情がありません。tag=" + text);
+				}
+				else
+				{
+					int num = (int)this.hash[text];
+					if (text == "hoho2")
+					{
+						this.IdxHOHO2 = num;
+					}
+					if (text == "hoho")
+					{
+						this.IdxHOHO = num;
+					}
+					this.dicBlendSet[BlendSetName][num] = val * 0.01f;
+				}
+			}
 		}
-		if (tag == "hoho")
+		else
 		{
-			this.IdxHOHO = num;
+			if (!this.hash.Contains(tag))
+			{
+				Debug.LogError("表情がありません。tag=" + tag);
+				return;
+			}
+			int num2 = (int)this.hash[tag];
+			if (tag == "hoho2")
+			{
+				this.IdxHOHO2 = num2;
+			}
+			if (tag == "hoho")
+			{
+				this.IdxHOHO = num2;
+			}
+			this.dicBlendSet[BlendSetName][num2] = val * 0.01f;
 		}
-		this.dicBlendSet[BlendSetName][num] = val * 0.01f;
 	}
 
 	public void ClearBlendValues()
@@ -579,24 +665,60 @@ public class TMorph
 		Debug.LogError("表情がありません。" + BlendSetName);
 	}
 
+	public TMorph.GP01FB_FACE_TYPE GetFaceTypeGP01FB()
+	{
+		float num = this.m_MabutaUpOut2.rate - 0.5f;
+		float num2 = Mathf.Clamp01(num / -0.5f);
+		float num3 = Mathf.Clamp01(num / 0.5f);
+		if (num2 < 0.35f && num3 < 0.35f)
+		{
+			return TMorph.GP01FB_FACE_TYPE.NORMAL;
+		}
+		if (0.35f <= num2)
+		{
+			return TMorph.GP01FB_FACE_TYPE.TARE;
+		}
+		if (0.35f <= num3)
+		{
+			return TMorph.GP01FB_FACE_TYPE.TSURI;
+		}
+		return TMorph.GP01FB_FACE_TYPE.MAX;
+	}
+
 	public void FixBlendValues_Face()
 	{
-		this.BlendValuesTemp[this.BlendDataIdx_EyeClose[0]] = this.m_fEyeCloseRate + this.BlendValuesBackup[this.BlendDataIdx_EyeClose[0]] * (1f - this.m_fEyeCloseRate);
-		for (int i = 1; i < 10; i++)
+		if (120 <= this.bodyskin.PartsVersion)
 		{
-			if (this.BlendDataIdx_EyeClose[i] != 0)
+			this.m_crcFaceTypeNow = this.GetFaceTypeGP01FB();
+			for (int i = 0; i < 3; i++)
 			{
-				this.BlendValuesTemp[this.BlendDataIdx_EyeClose[i]] = this.BlendValuesBackup[this.BlendDataIdx_EyeClose[i]] * (1f - this.m_fEyeCloseRate);
+				if (i != (int)this.m_crcFaceTypeNow)
+				{
+					int[] array = this.BlendDataIdx_EyeClose[i];
+					for (int j = 0; j < array.Length; j++)
+					{
+						this.BlendValues[array[j]] = 0f;
+					}
+				}
+			}
+		}
+		int[] array2 = this.BlendDataIdx_EyeClose[(int)this.m_crcFaceTypeNow];
+		this.BlendValuesTemp[array2[0]] = this.m_fEyeCloseRate + this.BlendValuesBackup[array2[0]] * (1f - this.m_fEyeCloseRate);
+		for (int k = 1; k < 10; k++)
+		{
+			if (array2[k] != 0)
+			{
+				this.BlendValuesTemp[array2[k]] = this.BlendValuesBackup[array2[k]] * (1f - this.m_fEyeCloseRate);
 			}
 		}
 		if (0f < this.EyeMabataki)
 		{
 			float num = 0f;
-			for (int j = 0; j < 10; j++)
+			for (int l = 0; l < 10; l++)
 			{
-				if (this.BlendDataIdx_EyeClose[j] != 0)
+				if (array2[l] != 0)
 				{
-					num += this.BlendValuesTemp[this.BlendDataIdx_EyeClose[j]];
+					num += this.BlendValuesTemp[array2[l]];
 				}
 			}
 			if (num > 1f)
@@ -604,17 +726,17 @@ public class TMorph
 				num = 1f;
 			}
 			float num2 = 1f - num;
-			float num3 = this.BlendValuesTemp[this.BlendDataIdx_EyeClose[0]] + num2 * this.EyeMabataki;
+			float num3 = this.BlendValuesTemp[array2[0]] + num2 * this.EyeMabataki;
 			if (num3 > 0f)
 			{
-				this.BlendValuesTemp[this.BlendDataIdx_EyeClose[0]] = num3;
+				this.BlendValuesTemp[array2[0]] = num3;
 			}
 		}
-		for (int k = 0; k < 10; k++)
+		for (int m = 0; m < 10; m++)
 		{
-			if (this.BlendDataIdx_EyeClose[k] != 0)
+			if (array2[m] != 0)
 			{
-				this.BlendValues[this.BlendDataIdx_EyeClose[k]] = this.BlendValuesTemp[this.BlendDataIdx_EyeClose[k]];
+				this.BlendValues[array2[m]] = this.BlendValuesTemp[array2[m]];
 			}
 		}
 		if (this.m_EarNoneData.idx != -1)
@@ -641,6 +763,18 @@ public class TMorph
 		{
 			this.BlendValues[this.m_MayuShapeOut.idx] = this.m_MayuShapeOut.rate;
 		}
+		if (120 <= this.bodyskin.PartsVersion && this.m_IdxMinMaxList != null)
+		{
+			float arg = 1f - Mathf.Clamp01(this.BlendValues[array2[0]] + this.BlendValues[array2[1]] + this.BlendValues[array2[4]] + this.BlendValues[array2[5]]);
+			float arg2 = 1f - Mathf.Clamp01(this.BlendValues[array2[0]] + this.BlendValues[array2[1]] + this.BlendValues[array2[6]] + this.BlendValues[array2[7]]);
+			foreach (TMorph.IdxMinMaxRatePair idxMinMaxRatePair in this.m_IdxMinMaxList)
+			{
+				if (idxMinMaxRatePair.exec != null)
+				{
+					idxMinMaxRatePair.exec(arg, arg2);
+				}
+			}
+		}
 		if (this.boLipSync)
 		{
 			this.BlendValues[this.BlendDataIdx_LipSync_A] = this.LipSync1 * 0.8f;
@@ -687,12 +821,12 @@ public class TMorph
 			this.BlendValues[this.BlendDataIdx_NoseFook] = 0f;
 		}
 		int num5 = 0;
-		for (int l = 0; l < this.MorphCount; l++)
+		for (int n = 0; n < this.MorphCount; n++)
 		{
-			if (this.BlendValuesCHK[l] != this.BlendValues[l])
+			if (this.BlendValuesCHK[n] != this.BlendValues[n])
 			{
 				num5++;
-				this.BlendValuesCHK[l] = this.BlendValues[l];
+				this.BlendValuesCHK[n] = this.BlendValues[n];
 			}
 		}
 		if (num5 == 0)
@@ -717,22 +851,22 @@ public class TMorph
 		{
 			this.BlendValues[this.IdxHOHO2] = 1f;
 		}
-		for (int m = 0; m < this.MorphCount; m++)
+		for (int num6 = 0; num6 < this.MorphCount; num6++)
 		{
-			if (this.BlendDatas[m] == null)
+			if (this.BlendDatas[num6] == null)
 			{
-				this.UruUruScaleX = this.BlendValues[m];
+				this.UruUruScaleX = this.BlendValues[num6];
 			}
 			else
 			{
-				float num6 = this.BlendValues[m];
-				if (num6 >= 0.01f || m == this.m_MayuShapeIn.idx || m == this.m_MayuShapeOut.idx)
+				float num7 = this.BlendValues[num6];
+				if (num7 >= 0.01f || num6 == this.m_MayuShapeIn.idx || num6 == this.m_MayuShapeOut.idx)
 				{
-					int num7 = this.BlendDatas[m].v_index.Length;
-					for (int n = 0; n < num7; n++)
+					int num8 = this.BlendDatas[num6].v_index.Length;
+					for (int num9 = 0; num9 < num8; num9++)
 					{
-						int num8 = this.BlendDatas[m].v_index[n];
-						this.m_vTmpVert[num8] += this.BlendDatas[m].vert[n] * num6;
+						int num10 = this.BlendDatas[num6].v_index[num9];
+						this.m_vTmpVert[num10] += this.BlendDatas[num6].vert[num9] * num7;
 					}
 				}
 			}
@@ -1332,7 +1466,16 @@ public class TMorph
 
 	public List<BlendData> BlendDatas;
 
-	public int[] BlendDataIdx_EyeClose;
+	public static readonly string[] crcFaceTypesStr = new string[]
+	{
+		"_normal",
+		"_tare",
+		"_tsuri"
+	};
+
+	private TMorph.GP01FB_FACE_TYPE m_crcFaceTypeNow;
+
+	public int[][] BlendDataIdx_EyeClose;
 
 	public float m_fEyeCloseRate;
 
@@ -1350,6 +1493,24 @@ public class TMorph
 
 	public TMorph.IdxRatePair<float> m_MayuShapeOut;
 
+	public TMorph.IdxMinMaxRatePair m_MabutaUpIn = new TMorph.IdxMinMaxRatePair();
+
+	public TMorph.IdxMinMaxRatePair m_MabutaUpIn2 = new TMorph.IdxMinMaxRatePair();
+
+	public TMorph.IdxMinMaxRatePair m_MabutaUpMiddle = new TMorph.IdxMinMaxRatePair();
+
+	public TMorph.IdxMinMaxRatePair m_MabutaUpOut = new TMorph.IdxMinMaxRatePair();
+
+	public TMorph.IdxMinMaxRatePair m_MabutaUpOut2 = new TMorph.IdxMinMaxRatePair();
+
+	public TMorph.IdxMinMaxRatePair m_MabutaLowIn = new TMorph.IdxMinMaxRatePair();
+
+	public TMorph.IdxMinMaxRatePair m_MabutaLowUpMiddle = new TMorph.IdxMinMaxRatePair();
+
+	public TMorph.IdxMinMaxRatePair m_MabutaLowUpOut = new TMorph.IdxMinMaxRatePair();
+
+	private List<TMorph.IdxMinMaxRatePair> m_IdxMinMaxList;
+
 	public int BlendDataIdx_LipSyncTh;
 
 	public int BlendDataIdx_LipSync_A;
@@ -1465,6 +1626,29 @@ public class TMorph
 		public T rate;
 	}
 
+	public class IdxMinMaxRatePair
+	{
+		public int idxDwL;
+
+		public int idxUpL;
+
+		public int idxDwR;
+
+		public int idxUpR;
+
+		public float rate;
+
+		public Action<float, float> exec;
+	}
+
+	public enum GP01FB_FACE_TYPE
+	{
+		NORMAL,
+		TARE,
+		TSURI,
+		MAX
+	}
+
 	public class TempAttachPos
 	{
 		public int m_nVidx;

+ 25 - 6
Assembly-CSharp/WindowPartsFaceMorph.cs

@@ -151,14 +151,14 @@ public class WindowPartsFaceMorph : MonoBehaviour
 		{
 			return;
 		}
-		Dictionary<string, int> dictionary = this.blendIdDictionary[maid.status.guid];
+		Dictionary<string, int> blendIdDic = this.blendIdDictionary[maid.status.guid];
 		for (int i = 0; i < this.propValInput.Length; i++)
 		{
 			for (int j = 0; j < this.propValInput[i].SliderAndInput.Length; j++)
 			{
 				string name = this.propValInput[i].SliderAndInput[j].Name;
 				PhotoSliderAndInput sliderAndInput = this.propValInput[i].GetSliderAndInput(name);
-				sliderAndInput.ResetNum = this.backupBlendSets[maid.status.guid][this.selectData.setting_name][dictionary[name]];
+				sliderAndInput.ResetNum = this.backupBlendSets[maid.status.guid][this.selectData.setting_name][this.GetBlendIdx(maid.body0.Face, blendIdDic, name)];
 				List<Action<float>> onChangeValue = sliderAndInput.onChangeValue;
 				sliderAndInput.onChangeValue = new List<Action<float>>();
 				sliderAndInput.value = this.GetValue(maid, name);
@@ -179,8 +179,8 @@ public class WindowPartsFaceMorph : MonoBehaviour
 		{
 			return;
 		}
-		Dictionary<string, int> dictionary = this.blendIdDictionary[maid.status.guid];
-		this.selectData.BlendArray(maid)[dictionary[name]] = val;
+		Dictionary<string, int> blendIdDic = this.blendIdDictionary[maid.status.guid];
+		this.selectData.BlendArray(maid)[this.GetBlendIdx(maid.body0.Face, blendIdDic, name)] = val;
 	}
 
 	private float GetValue(Maid maid, string name)
@@ -189,8 +189,27 @@ public class WindowPartsFaceMorph : MonoBehaviour
 		{
 			return 0f;
 		}
-		Dictionary<string, int> dictionary = this.blendIdDictionary[maid.status.guid];
-		return this.selectData.BlendArray(maid)[dictionary[name]];
+		Dictionary<string, int> blendIdDic = this.blendIdDictionary[maid.status.guid];
+		return this.selectData.BlendArray(maid)[this.GetBlendIdx(maid.body0.Face, blendIdDic, name)];
+	}
+
+	private int GetBlendIdx(TBodySkin face, Dictionary<string, int> blendIdDic, string name)
+	{
+		if (120 <= face.PartsVersion && name.IndexOf("eyeclose") == 0)
+		{
+			string text = name;
+			if (text == "eyeclose")
+			{
+				text += "1";
+			}
+			TMorph.GP01FB_FACE_TYPE faceTypeGP01FB = face.morph.GetFaceTypeGP01FB();
+			text += TMorph.crcFaceTypesStr[(int)faceTypeGP01FB];
+			if (blendIdDic.ContainsKey(text))
+			{
+				name = text;
+			}
+		}
+		return blendIdDic[name];
 	}
 
 	public bool visible

+ 1 - 1
Assembly-CSharp/WindowPartsFingerPreset.cs

@@ -182,7 +182,7 @@ public class WindowPartsFingerPreset : MonoBehaviour
 	{
 		WindowPartsFingerBlend.Type blendType = tareget_blend.BlendType;
 		FingerBlend.BaseFinger baseFingerClass = tareget_blend.GetBaseFingerClass(tareget_blend.mgr.select_maid, blendType);
-		XElement xelement = new XElement("GameVersion", 1470);
+		XElement xelement = new XElement("GameVersion", 1480);
 		XElement xelement2 = new XElement("RightData", blendType == WindowPartsFingerBlend.Type.RightArm || blendType == WindowPartsFingerBlend.Type.RightLeg);
 		XElement xelement3 = new XElement("BinaryData", Convert.ToBase64String(baseFingerClass.GetBinary()));
 		XNode[] contents = new XNode[]

+ 1 - 1
Assembly-CSharp/YotogiParamBasicBar.cs

@@ -45,7 +45,7 @@ public class YotogiParamBasicBar : MonoBehaviour
 			UILabel component = UTY.GetChildObject(base.gameObject, "Mind/Name", false).GetComponent<UILabel>();
 			if (component != null)
 			{
-				Utility.SetLocalizeTerm(component, "MaidStatus/時間", false);
+				Utility.SetLocalizeTerm(component, "MaidStatus/時間", true);
 			}
 		}
 	}

+ 79 - 27
Assembly-CSharp/Yotogis/Skill.cs

@@ -185,6 +185,57 @@ namespace Yotogis
 
 		public static class Old
 		{
+			public static int ConvertId(int id)
+			{
+				if (id != 12700)
+				{
+					if (id != 12710)
+					{
+						if (id != 12720)
+						{
+							if (id != 12730)
+							{
+								if (id != 12740)
+								{
+									if (id != 12750)
+									{
+										if (id == 12760)
+										{
+											id = 12795;
+										}
+									}
+									else
+									{
+										id = 12790;
+									}
+								}
+								else
+								{
+									id = 12785;
+								}
+							}
+							else
+							{
+								id = 12780;
+							}
+						}
+						else
+						{
+							id = 12775;
+						}
+					}
+					else
+					{
+						id = 12770;
+					}
+				}
+				else
+				{
+					id = 12765;
+				}
+				return id;
+			}
+
 			public static void CreateData()
 			{
 				if (Skill.Old.skill_data_id_list_ != null)
@@ -212,14 +263,14 @@ namespace Yotogis
 						{
 							bool condition4 = csvParser5.Open(afileBase5);
 							NDebug.Assert(condition4, file_name + "\nopen failed.");
-							for (int num = 1; num < csvParser5.max_cell_y; num++)
+							for (int num2 = 1; num2 < csvParser5.max_cell_y; num2++)
 							{
-								if (csvParser5.IsCellToExistData(0, num))
+								if (csvParser5.IsCellToExistData(0, num2))
 								{
-									int cellAsInteger3 = csvParser5.GetCellAsInteger(0, num);
-									if (!enabled_id_list.Contains(cellAsInteger3))
+									int item = Skill.Old.ConvertId(csvParser5.GetCellAsInteger(0, num2));
+									if (!enabled_id_list.Contains(item))
 									{
-										enabled_id_list.Add(cellAsInteger3);
+										enabled_id_list.Add(item);
 									}
 								}
 							}
@@ -243,12 +294,12 @@ namespace Yotogis
 							if (csvParser.IsCellToExistData(0, j))
 							{
 								NDebug.Assert(csvParser.IsCellToExistData(0, j + 1), "[2.0]yotogi_skil_command_data.nei\n" + csvParser.GetCellAsString(0, j) + "のスキルID設定がありません");
-								int cellAsInteger = csvParser.GetCellAsInteger(0, j + 1);
-								if (enabled_id_list.Contains(cellAsInteger))
+								int num = Skill.Old.ConvertId(csvParser.GetCellAsInteger(0, j + 1));
+								if (enabled_id_list.Contains(num))
 								{
-									NDebug.Assert(!dictionary.ContainsKey(cellAsInteger), "コマンド設定\n" + cellAsInteger + "のスキルID設定が重複しています");
+									NDebug.Assert(!dictionary.ContainsKey(num), "コマンド設定\n" + num + "のスキルID設定が重複しています");
 									Dictionary<int, int[]> dictionary2 = dictionary;
-									int key = cellAsInteger;
+									int key = num;
 									int[] array = new int[2];
 									array[0] = j;
 									dictionary2.Add(key, array);
@@ -270,12 +321,12 @@ namespace Yotogis
 							if (csvParser2.IsCellToExistData(0, k))
 							{
 								NDebug.Assert(csvParser2.IsCellToExistData(0, k + 1), "[2.0]yotogi_skil_command_status.nei\n" + csvParser2.GetCellAsString(0, k) + "のスキルID設定がありません");
-								if (enabled_id_list.Contains(csvParser2.GetCellAsInteger(0, k + 1)))
+								if (enabled_id_list.Contains(Skill.Old.ConvertId(csvParser2.GetCellAsInteger(0, k + 1))))
 								{
-									int cellAsInteger2 = csvParser2.GetCellAsInteger(0, k + 1);
+									int key2 = Skill.Old.ConvertId(csvParser2.GetCellAsInteger(0, k + 1));
 									str = csvParser2.GetCellAsString(0, k);
-									NDebug.Assert(dictionary.ContainsKey(cellAsInteger2), str + "の情報は見つかりませんでした");
-									dictionary[cellAsInteger2][1] = k;
+									NDebug.Assert(dictionary.ContainsKey(key2), str + "の情報は見つかりませんでした");
+									dictionary[key2][1] = k;
 								}
 								k++;
 							}
@@ -302,7 +353,7 @@ namespace Yotogis
 								NDebug.Assert(condition3, "yotogi_skil_detail.nei\nopen failed.");
 								for (int m = 1; m < csvParser4.max_cell_y; m++)
 								{
-									if (enabled_id_list.Contains(csvParser4.GetCellAsInteger(0, m)))
+									if (enabled_id_list.Contains(Skill.Old.ConvertId(csvParser4.GetCellAsInteger(0, m))))
 									{
 										Skill.Old.Data data = new Skill.Old.Data(csvParser4, csvParser3, m, dictionary);
 										if (!hashSet.Add(data.id))
@@ -333,12 +384,12 @@ namespace Yotogis
 						{
 							bool condition4 = csvParser5.Open(afileBase5);
 							NDebug.Assert(condition4, file_name + "\nopen failed.");
-							for (int num = 1; num < csvParser5.max_cell_y; num++)
+							for (int num2 = 1; num2 < csvParser5.max_cell_y; num2++)
 							{
-								if (csvParser5.IsCellToExistData(0, num))
+								if (csvParser5.IsCellToExistData(0, num2))
 								{
-									string cellAsString = csvParser5.GetCellAsString(0, num);
-									string cellAsString2 = csvParser5.GetCellAsString(1, num);
+									string cellAsString = csvParser5.GetCellAsString(0, num2);
+									string cellAsString2 = csvParser5.GetCellAsString(1, num2);
 									YotogiOld.Stage stage = YotogiOld.Stage.MAX;
 									try
 									{
@@ -425,7 +476,8 @@ namespace Yotogis
 				public Data(CsvParser csv, CsvParser csv_acq, int y, Dictionary<int, int[]> command_data_cell_dic)
 				{
 					int num = 0;
-					this.id = csv.GetCellAsInteger(num++, y);
+					int cellAsInteger = csv.GetCellAsInteger(num++, y);
+					this.id = Skill.Old.ConvertId(cellAsInteger);
 					num++;
 					string cellAsString = csv.GetCellAsString(num++, y);
 					try
@@ -450,11 +502,11 @@ namespace Yotogis
 					}
 					this.exec_need_hp = csv.GetCellAsInteger(num++, y);
 					this.add_yotogi_class_exp = csv.GetCellAsInteger(num++, y);
-					int cellAsInteger = csv.GetCellAsInteger(num++, y);
 					int cellAsInteger2 = csv.GetCellAsInteger(num++, y);
+					int cellAsInteger3 = csv.GetCellAsInteger(num++, y);
 					this.skill_exp_table = new int[3];
-					this.skill_exp_table[1] = cellAsInteger;
-					this.skill_exp_table[2] = cellAsInteger2;
+					this.skill_exp_table[1] = cellAsInteger2;
+					this.skill_exp_table[2] = cellAsInteger3;
 					cellAsString = csv.GetCellAsString(num++, y);
 					if (string.IsNullOrEmpty(cellAsString) || cellAsString == "×")
 					{
@@ -516,15 +568,15 @@ namespace Yotogis
 						string cellAsString4 = csv.GetCellAsString(num++, y);
 						if (string.IsNullOrEmpty(cellAsString3))
 						{
-							IL_3BA:
+							IL_3C3:
 							NDebug.Assert(command_data_cell_dic.ContainsKey(this.id), this.name + "の情報は見つかりませんでした");
 							int[] array3 = command_data_cell_dic[this.id];
 							this.command_basic_cell_y = array3[0];
 							this.command_status_cell_y = array3[1];
 							num = 0;
-							int cellAsInteger3 = csv_acq.GetCellAsInteger(num++, y);
+							int num2 = Skill.Old.ConvertId(csv_acq.GetCellAsInteger(num++, y));
 							num++;
-							NDebug.Assert(cellAsInteger3 == this.id, "スキル取得条件とスキル詳細のIDラインが一致していません");
+							NDebug.Assert(num2 == this.id, "スキル取得条件とスキル詳細のIDラインが一致していません");
 							this.getcondition_data = new Skill.Old.Data.GetConditionData();
 							this.getcondition_data.seikeiken = new bool[4];
 							for (int l = 0; l < this.getcondition_data.seikeiken.Length; l++)
@@ -541,7 +593,7 @@ namespace Yotogis
 							num += 2;
 							if (csv_acq.IsCellToExistData(num, y) && csv_acq.IsCellToExistData(1, y))
 							{
-								this.getcondition_data.yotogi_class = YotogiClass.GetData(csv_acq.GetCellAsString(num++, y));
+								this.getcondition_data.yotogi_class = ((cellAsInteger != this.id) ? YotogiClass.GetData(csv_acq.GetCellAsString(num++, y) + "_old") : YotogiClass.GetData(csv_acq.GetCellAsString(num++, y)));
 								this.getcondition_data.yotogi_class_level = csv_acq.GetCellAsInteger(num++, y);
 							}
 							else
@@ -591,7 +643,7 @@ namespace Yotogis
 							this.exec_stage.Add(key, true);
 						}
 					}
-					goto IL_3BA;
+					goto IL_3C3;
 				}
 
 				public void SetNewSkillData(Skill.Data data)

+ 9 - 0
Assembly-CSharp/com/workman/cm3d2/scene/dailyEtc/DailyAPI.cs

@@ -265,6 +265,7 @@ namespace com.workman.cm3d2.scene.dailyEtc
 			bool isLegacy = DailyMgr.IsLegacy;
 			bool bDay = this.m_bDay;
 			bool isAvailableTransfer = GameMain.Instance.CharacterMgr.status.isAvailableTransfer;
+			bool flag = PluginData.IsEnabled("GP001FB");
 			string text = string.Empty;
 			if (isLegacy)
 			{
@@ -278,10 +279,18 @@ namespace com.workman.cm3d2.scene.dailyEtc
 				if (isAvailableTransfer)
 				{
 					text = "SceneDailyDayTimeAvailableTransfer";
+					if (flag)
+					{
+						text = "SceneDailyDayTimeAvailableTransfer_GP001FB";
+					}
 				}
 				else
 				{
 					text = "SceneDailyDayTime";
+					if (flag)
+					{
+						text = "SceneDailyDayTime_GP001FB";
+					}
 				}
 			}
 			else if (isAvailableTransfer)

+ 31 - 0
Assembly-CSharp/scoutmode/LockData.cs

@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using wf;
+
+namespace scoutmode
+{
+	public static class LockData
+	{
+		public static HashSet<string> personalEnabledIdList
+		{
+			get
+			{
+				LockData.CreateData();
+				return LockData.personalEnabledIdList_;
+			}
+		}
+
+		public static void CreateData()
+		{
+			if (LockData.personalEnabledIdList_ != null)
+			{
+				return;
+			}
+			HashSet<string> collection = new HashSet<string>();
+			CsvCommonIdManager.ReadEnabledIdList(GameUty.FileSystem, GameUty.PathList, "scoutmode_personal_enabled_list", ref collection);
+			LockData.personalEnabledIdList_ = new HashSet<string>(collection);
+		}
+
+		private static HashSet<string> personalEnabledIdList_;
+	}
+}

+ 77 - 0
Assembly-CSharp/scoutmode/SceneScoutScreenManager.cs

@@ -0,0 +1,77 @@
+using System;
+using System.Collections.Generic;
+
+namespace scoutmode
+{
+	public class SceneScoutScreenManager : WfScreenManager
+	{
+		public ADVKagManager advKag
+		{
+			get
+			{
+				return GameMain.Instance.ScriptMgr.adv_kag;
+			}
+		}
+
+		public WfScreenMoveChildren moveScreen { get; private set; }
+
+		public override void Start()
+		{
+			base.Start();
+			this.moveScreen = base.children_dic["Move"].GetComponent<WfScreenMoveChildren>();
+			string empty = string.Empty;
+			string empty2 = string.Empty;
+			if (this.advKag.tag_backup != null && this.advKag.tag_backup.Count > 0)
+			{
+				this.backupTag = new Dictionary<string, string>(this.advKag.tag_backup);
+				NDebug.Assert(this.advKag.tag_backup.ContainsKey("name") && this.advKag.tag_backup["name"].ToLower() == "SceneScout".ToLower(), "シーン名SceneScoutの名前が不正です");
+				NDebug.Assert(this.advKag.tag_backup.ContainsKey("label"), "SceneCallにlabelの設定がされていませんでした");
+				NDebug.Assert(this.advKag.tag_backup.ContainsKey("start_label"), "SceneCallにstart_labelの設定がされていませんでした");
+				NDebug.Assert(this.advKag.tag_backup.ContainsKey("add_label"), "SceneCallにadd_labelの設定がされていませんでした");
+				ScoutMainScreenManager component = base.children_dic["Main"].GetComponent<ScoutMainScreenManager>();
+				if (this.advKag.tag_backup.ContainsKey("create_return"))
+				{
+					component.OnAddedScoutMaidReturned();
+				}
+				this.CallScreen("Main");
+				return;
+			}
+			this.advKag.LoadScriptFile("debug_scourt.ks", "*シーンコール");
+			this.advKag.kag.Exec();
+		}
+
+		public void CallAddScoutCharacter(WfScreenChildren finishScreen)
+		{
+			this.moveScreen.SetNextLabel(this.backupTag["add_label"]);
+			finishScreen.Finish();
+		}
+
+		public void CallStart(WfScreenChildren finishScreen)
+		{
+			this.moveScreen.SetNextLabel(this.backupTag["start_label"]);
+			finishScreen.Finish();
+		}
+
+		public void CallExist(WfScreenChildren finishScreen)
+		{
+			this.moveScreen.SetNextLabel(this.backupTag["label"]);
+			finishScreen.Finish();
+		}
+
+		protected override void SettingChildrenList(Dictionary<string, WfScreenChildren> childrenDic)
+		{
+			foreach (string text in new string[]
+			{
+				"Main",
+				"Move"
+			})
+			{
+				WfScreenChildren component = UTY.GetChildObject(base.gameObject, text, false).GetComponent<WfScreenChildren>();
+				component.parent_mgr = this;
+				childrenDic.Add(text, component);
+			}
+		}
+
+		public Dictionary<string, string> backupTag = new Dictionary<string, string>();
+	}
+}

+ 181 - 0
Assembly-CSharp/scoutmode/ScoutCharacterSelectCtrl.cs

@@ -0,0 +1,181 @@
+using System;
+using System.Collections.Generic;
+using Kasizuki;
+using UnityEngine;
+
+namespace scoutmode
+{
+	public class ScoutCharacterSelectCtrl : NGUIWindow
+	{
+		public ScoutMaidData selectedMaidData { get; private set; }
+
+		private void Init()
+		{
+			if (this.m_IsInit)
+			{
+				return;
+			}
+			this.m_IsInit = true;
+		}
+
+		private void Start()
+		{
+			this.Init();
+		}
+
+		public void SetData()
+		{
+			this.Init();
+			List<ScoutMaidData> maidList = this.callbackGetScoutMaidList();
+			this.m_ListViewer.Show<Transform>(maidList.Count, delegate(int i, Transform trans)
+			{
+				this.CreateItem(maidList[i], i, trans);
+			});
+			UIGrid componentInParent = this.m_ListViewer.parentItemArea.GetComponentInParent<UIGrid>();
+			if (componentInParent)
+			{
+				componentInParent.repositionNow = true;
+			}
+			UIScrollView componentInParent2 = this.m_ListViewer.parentItemArea.GetComponentInParent<UIScrollView>();
+			if (componentInParent2)
+			{
+				componentInParent2.ResetPosition();
+			}
+		}
+
+		public void DeleteItem(ScoutMaidData maid)
+		{
+			if (!this.itemDictionary.ContainsKey(maid))
+			{
+				return;
+			}
+			GameObject gameObject = null;
+			GameObject[] itemArray = this.m_ListViewer.ItemArray;
+			for (int i = 0; i < itemArray.Length; i++)
+			{
+				GameObject x = itemArray[i];
+				if (!(x != this.itemDictionary[maid]))
+				{
+					if (i + 1 < itemArray.Length)
+					{
+						gameObject = itemArray[i + 1];
+					}
+					else if (i - 1 >= 0)
+					{
+						gameObject = itemArray[i - 1];
+					}
+					break;
+				}
+			}
+			this.m_ListViewer.RemoveItem(this.itemDictionary[maid]);
+			this.selectedMaidData = null;
+			if (gameObject != null)
+			{
+				UIButton componentInChildren = gameObject.GetComponentInChildren<UIButton>();
+				if (componentInChildren != null && componentInChildren.onClick != null)
+				{
+					EventDelegate.Execute(componentInChildren.onClick);
+				}
+			}
+			UIGrid componentInParent = this.m_ListViewer.parentItemArea.GetComponentInParent<UIGrid>();
+			if (componentInParent)
+			{
+				componentInParent.Reposition();
+			}
+		}
+
+		private void CreateItem(ScoutMaidData maid, int index, Transform item)
+		{
+			GameObject itemObj = item.gameObject;
+			this.itemDictionary[maid] = itemObj;
+			UIButton componentInChildren = item.GetComponentInChildren<UIButton>(item);
+			EventDelegate.Add(componentInChildren.onClick, delegate()
+			{
+				this.selectedMaidData = maid;
+				if (this.callbackSelectItem != null)
+				{
+					this.callbackSelectItem(maid);
+				}
+				this.UpdateListColor(itemObj);
+			});
+			UI2DSprite component = UTY.GetChildObject(itemObj, "BG/ThumbnailFrame/Thumbnail", false).GetComponent<UI2DSprite>();
+			UILabel component2 = UTY.GetChildObject(itemObj, "BG/FirstName", false).GetComponent<UILabel>();
+			UILabel component3 = UTY.GetChildObject(itemObj, "BG/LastName", false).GetComponent<UILabel>();
+			Texture2D texture2D = null;
+			byte[] iconImageBinary = maid.iconImageBinary;
+			if (iconImageBinary != null)
+			{
+				texture2D = new Texture2D(1, 1, TextureFormat.ARGB32, false);
+				texture2D.LoadImage(iconImageBinary);
+			}
+			if (texture2D != null)
+			{
+				Sprite sprite2D = Sprite.Create(texture2D, new Rect(0f, 0f, (float)texture2D.width, (float)texture2D.height), default(Vector2));
+				component.sprite2D = sprite2D;
+			}
+			else
+			{
+				component.sprite2D = null;
+			}
+			if (maid.status != null)
+			{
+				component3.text = maid.status.name1;
+				component2.text = maid.status.name2;
+			}
+		}
+
+		private void UpdateListColor(GameObject target)
+		{
+			if (!this.m_IsInit)
+			{
+				return;
+			}
+			foreach (GameObject f_goParent in this.m_ListViewer.ItemArray)
+			{
+				GameObject childObject = UTY.GetChildObject(f_goParent, "BG/mask", true);
+				if (childObject)
+				{
+					childObject.SetActive(true);
+				}
+			}
+			if (target != null)
+			{
+				GameObject childObject = UTY.GetChildObject(target, "BG/mask", true);
+				if (childObject)
+				{
+					childObject.SetActive(false);
+				}
+			}
+		}
+
+		public BigThumbnail bigThumbnail
+		{
+			get
+			{
+				return this.m_BigThumbnail;
+			}
+		}
+
+		public uGUIListViewer listViewer
+		{
+			get
+			{
+				return this.m_ListViewer;
+			}
+		}
+
+		public Func<List<ScoutMaidData>> callbackGetScoutMaidList;
+
+		public Action<ScoutMaidData> callbackSelectItem;
+
+		private Dictionary<ScoutMaidData, GameObject> itemDictionary = new Dictionary<ScoutMaidData, GameObject>();
+
+		private bool m_IsInit;
+
+		[SerializeField]
+		private BigThumbnail m_BigThumbnail;
+
+		[SerializeField]
+		private uGUIListViewer m_ListViewer;
+	}
+}

+ 123 - 0
Assembly-CSharp/scoutmode/ScoutInstanceData.cs

@@ -0,0 +1,123 @@
+using System;
+using System.Collections.Generic;
+using MaidStatus;
+using UnityEngine;
+
+namespace scoutmode
+{
+	[Serializable]
+	public class ScoutInstanceData : ISerializationCallbackReceiver, ICloneable
+	{
+		public void Apply(Maid maid)
+		{
+			if (this.enabled)
+			{
+				maid.status.relation = this.relation;
+				maid.status.additionalRelation = this.additionalRelation;
+				maid.status.likability = this.likability;
+				maid.status.seikeiken = this.seikeiken;
+				foreach (string flagName in maid.status.flags.GetKeyArray())
+				{
+					maid.status.RemoveFlag(flagName);
+				}
+				foreach (KeyValuePair<string, int> keyValuePair in this.maidFlags)
+				{
+					maid.status.AddFlag(keyValuePair.Key, keyValuePair.Value);
+				}
+			}
+		}
+
+		public void Create(Maid maid, string stageName, ScoutOptionData options)
+		{
+			if (maid == null || this.enabled)
+			{
+				return;
+			}
+			this.enabled = true;
+			this.stageName = stageName;
+			this.options = options;
+			this.Update(maid);
+		}
+
+		public void Update(Maid maid)
+		{
+			if (maid == null)
+			{
+				return;
+			}
+			this.relation = maid.status.relation;
+			this.additionalRelation = maid.status.additionalRelation;
+			this.likability = maid.status.likability;
+			this.seikeiken = maid.status.seikeiken;
+			this.maidFlags = maid.status.flags.Copy();
+		}
+
+		public void Destroy()
+		{
+			this.enabled = false;
+		}
+
+		public void OnBeforeSerialize()
+		{
+			this.version = 1000;
+			if (this.maidFlags == null)
+			{
+				this.maidFlags = new Dictionary<string, int>();
+			}
+			if (!this.enabled)
+			{
+				this.maidFlags.Clear();
+			}
+			this.maidFlags_Key = new string[this.maidFlags.Count];
+			this.maidFlags_Value = new int[this.maidFlags.Count];
+			int num = 0;
+			foreach (KeyValuePair<string, int> keyValuePair in this.maidFlags)
+			{
+				this.maidFlags_Key[num] = keyValuePair.Key;
+				this.maidFlags_Value[num] = keyValuePair.Value;
+				num++;
+			}
+		}
+
+		public void OnAfterDeserialize()
+		{
+			this.maidFlags = new Dictionary<string, int>();
+			for (int i = 0; i < this.maidFlags_Key.Length; i++)
+			{
+				this.maidFlags.Add(this.maidFlags_Key[i], this.maidFlags_Value[i]);
+			}
+		}
+
+		public object Clone()
+		{
+			ScoutInstanceData scoutInstanceData = (ScoutInstanceData)base.MemberwiseClone();
+			return JsonUtility.FromJson<ScoutInstanceData>(JsonUtility.ToJson(this));
+		}
+
+		private const int FixVersion = 1000;
+
+		public int version = 1000;
+
+		public bool enabled;
+
+		public Relation relation;
+
+		public AdditionalRelation additionalRelation;
+
+		public int likability;
+
+		public string stageName;
+
+		public Seikeiken seikeiken;
+
+		public Dictionary<string, int> maidFlags = new Dictionary<string, int>();
+
+		public ScoutOptionData options;
+
+		[SerializeField]
+		private string[] maidFlags_Key;
+
+		[SerializeField]
+		private int[] maidFlags_Value;
+	}
+}

+ 344 - 0
Assembly-CSharp/scoutmode/ScoutMaidData.cs

@@ -0,0 +1,344 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using Edit;
+using MaidStatus;
+using MaidStatus.CsvData;
+using UnityEngine;
+using Yotogis;
+
+namespace scoutmode
+{
+	public class ScoutMaidData : ICloneable
+	{
+		public static string GetThumbnailFilePath(string guid, bool temp)
+		{
+			return Path.Combine(Maid.ThumbnailDictionary, ((!temp) ? "_scout_" : "_scout_tmp_thum_") + guid + ".png");
+		}
+
+		public static string GetIconThumbnailFilePath(string guid, bool temp)
+		{
+			return Path.Combine(Maid.ThumbnailDictionary, ((!temp) ? "_scout_icon_thum_" : "_scout_tmp_icon_thum_") + guid + ".png");
+		}
+
+		public static string GetKasizukiThumbnailFilePath(string guid, bool temp)
+		{
+			return Path.Combine(Maid.ThumbnailDictionary, ((!temp) ? "_scout_kasizuki_" : "_scout_tmp_kasizuki_") + guid + ".png");
+		}
+
+		public ScoutMaidData.SimpleStatus status { get; private set; }
+
+		public byte[] iconImageBinary { get; private set; }
+
+		public byte[] pressetBinary { get; private set; }
+
+		public byte[] statusBinary { get; private set; }
+
+		public ScoutMaidOverrideData overrideData { get; private set; }
+
+		public ScoutInstanceData instanceData { get; private set; }
+
+		public bool isOverRideData
+		{
+			get
+			{
+				return this.overrideData.enabled;
+			}
+		}
+
+		public void CreateData(Maid maid)
+		{
+			Status status = maid.status;
+			this.pressetBinary = GameMain.Instance.CharacterMgr.PresetSaveNotWriteFile(maid, CharacterMgr.PresetType.All);
+			MemoryStream memoryStream = new MemoryStream();
+			BinaryWriter binary = new BinaryWriter(memoryStream);
+			status.isScoutMaid = true;
+			status.Serialize(binary);
+			status.isScoutMaid = false;
+			this.statusBinary = memoryStream.ToArray();
+			this.iconImageBinary = maid.GetThumIcon().EncodeToPNG();
+			this.status = new ScoutMaidData.SimpleStatus();
+			this.status.guid = status.guid;
+			this.status.creationTimeNum = status.creationTimeNum;
+			NamePair charaName = status.charaName;
+			this.status.name1 = charaName.name1;
+			this.status.name2 = charaName.name2;
+			this.status.personalId = status.personal.id;
+			this.status.initSeikeiken = status.initSeikeiken;
+			this.status.seikeiken = status.seikeiken;
+			this.status.height = status.body.height;
+			this.status.weight = status.body.weight;
+			this.status.bust = status.body.bust;
+			this.status.waist = status.body.waist;
+			this.status.hip = status.body.hip;
+			this.status.cup = status.body.cup;
+			this.status.lovely = status.lovely;
+			this.status.elegance = status.elegance;
+			this.status.charm = status.charm;
+			this.status.care = status.care;
+			this.status.reception = status.reception;
+			this.status.cooking = status.cooking;
+			this.status.dance = status.dance;
+			this.status.vocal = status.vocal;
+			this.status.teachRate = status.teachRate;
+			this.status.studyRate = status.studyRate;
+			this.status.maxHp = status.maxHp;
+			this.status.maxMind = status.maxMind;
+			this.status.inyoku = status.inyoku;
+			this.status.mvalue = status.mvalue;
+			this.status.hentai = status.hentai;
+			this.status.housi = status.housi;
+			this.status.maidPoint = GameMain.Instance.CharacterMgr.status.maidPoint;
+			this.status.playCountYotogi = status.playCountYotogi;
+			this.overrideData = new ScoutMaidOverrideData();
+			this.instanceData = new ScoutInstanceData();
+		}
+
+		public void Apply(Maid maid)
+		{
+			if (maid == null)
+			{
+				return;
+			}
+			byte[] pressetBinary = this.pressetBinary;
+			if (this.overrideData.pressetBinary != null && this.overrideData.pressetBinary.Length > 0)
+			{
+				pressetBinary = this.overrideData.pressetBinary;
+			}
+			using (BinaryReader binaryReader = new BinaryReader(new MemoryStream(pressetBinary)))
+			{
+				GameMain.Instance.CharacterMgr.PresetSet(maid, GameMain.Instance.CharacterMgr.PresetLoad(binaryReader, string.Empty));
+			}
+			using (BinaryReader binaryReader2 = new BinaryReader(new MemoryStream(this.statusBinary)))
+			{
+				maid.status.Deserialize(binaryReader2);
+			}
+			this.overrideData.Apply(maid);
+			this.instanceData.Apply(maid);
+			foreach (int featureId in maid.status.features.GetKeyArray())
+			{
+				maid.status.RemoveFeature(featureId);
+			}
+			List<Feature.Data> allDatas = Feature.GetAllDatas(true);
+			foreach (Personal.Data.LearnFeature learnFeature in maid.status.personal.acquisitionFeatureList)
+			{
+				if (learnFeature.isLearnPossible(maid.status))
+				{
+					maid.status.AddFeature(learnFeature.feature);
+				}
+			}
+			AbstractClassData.ClassType classTypeFlags = AbstractClassData.ClassType.Share | AbstractClassData.ClassType.New | AbstractClassData.ClassType.Old;
+			maid.status.yotogiClass.Clear();
+			foreach (YotogiClass.Data data in maid.status.yotogiClass.GetLearnPossibleClassDatas(false, classTypeFlags))
+			{
+				if (GameMain.Instance.CharacterMgr.status.IsYotogiClassOpenFlag(data.id))
+				{
+					maid.status.yotogiClass.Add(data.id, false, true);
+				}
+			}
+			int id = maid.status.selectedJobClass.data.id;
+			HashSet<int> hashSet = new HashSet<int>();
+			foreach (KeyValuePair<int, ClassData<JobClass.Data>> keyValuePair in maid.status.jobClass.GetAllDatas())
+			{
+				hashSet.Add(keyValuePair.Key);
+			}
+			HashSet<int> hashSet2 = new HashSet<int>();
+			foreach (JobClass.Data data2 in maid.status.jobClass.GetLearnPossibleClassDatas(false, classTypeFlags))
+			{
+				if (GameMain.Instance.CharacterMgr.status.IsJobClassOpenFlag(data2.id))
+				{
+					hashSet2.Add(data2.id);
+				}
+			}
+			HashSet<int> hashSet3 = new HashSet<int>();
+			foreach (int item in hashSet)
+			{
+				if (!hashSet2.Contains(item))
+				{
+					hashSet3.Add(item);
+				}
+			}
+			HashSet<int> hashSet4 = new HashSet<int>();
+			foreach (int item2 in hashSet2)
+			{
+				if (!hashSet.Contains(item2))
+				{
+					hashSet4.Add(item2);
+				}
+			}
+			foreach (int id2 in hashSet3)
+			{
+				maid.status.jobClass.Remove(id2, true);
+			}
+			int num = -1;
+			foreach (int num2 in hashSet4)
+			{
+				maid.status.jobClass.Add(num2, false, true);
+				num = ((num >= num2) ? num : num2);
+			}
+			if (num != -1)
+			{
+				maid.status.ChangeJobClass(num);
+			}
+			maid.status.yotogiSkill.Clear();
+			List<Skill.Data> learnPossibleSkills = Skill.GetLearnPossibleSkills(maid.status);
+			foreach (Skill.Data data3 in learnPossibleSkills)
+			{
+				maid.status.yotogiSkill.Add(data3.id);
+			}
+			maid.status.UpdateClassBonusStatus();
+			maid.status.sexPlayNumberOfPeople = MaidProfile.UpdateInitPlayNumber(maid.status.maid);
+			maid.status.UpdateBodyParam();
+			maid.status.profileComment = MaidProfile.Create(maid.status.maid, true);
+			maid.status.SetFlag("__スカウトメイド", 1);
+		}
+
+		public byte[] GetIconImageBinary()
+		{
+			return (this.overrideData.iconImageBinary == null || this.overrideData.iconImageBinary.Length <= 0) ? this.iconImageBinary : this.overrideData.iconImageBinary;
+		}
+
+		public byte[] GetPressetBinary()
+		{
+			return (this.overrideData.pressetBinary == null || this.overrideData.pressetBinary.Length <= 0) ? this.pressetBinary : this.overrideData.pressetBinary;
+		}
+
+		public byte[] Serialize()
+		{
+			MemoryStream memoryStream = new MemoryStream();
+			BinaryWriter binaryWriter = new BinaryWriter(memoryStream);
+			binaryWriter.Write("COM3D2_SCOUT_DATA");
+			binaryWriter.Write(1000);
+			binaryWriter.Write(JsonUtility.ToJson(this.status));
+			binaryWriter.Write(this.iconImageBinary.Length);
+			binaryWriter.Write(this.iconImageBinary);
+			binaryWriter.Write(this.pressetBinary.Length);
+			binaryWriter.Write(this.pressetBinary);
+			binaryWriter.Write(this.statusBinary.Length);
+			binaryWriter.Write(this.statusBinary);
+			byte[] array = this.overrideData.Serialize();
+			binaryWriter.Write(array.Length);
+			binaryWriter.Write(array);
+			binaryWriter.Write(JsonUtility.ToJson(this.instanceData));
+			return memoryStream.ToArray();
+		}
+
+		public void DeSerialize(byte[] data)
+		{
+			MemoryStream input = new MemoryStream(data);
+			BinaryReader binaryReader = new BinaryReader(input);
+			NDebug.Assert(binaryReader.ReadString() == "COM3D2_SCOUT_DATA", "ScoutMaidData::DeSerialize Header Check error.");
+			int num = binaryReader.ReadInt32();
+			this.status = JsonUtility.FromJson<ScoutMaidData.SimpleStatus>(binaryReader.ReadString());
+			int count = binaryReader.ReadInt32();
+			this.iconImageBinary = binaryReader.ReadBytes(count);
+			count = binaryReader.ReadInt32();
+			this.pressetBinary = binaryReader.ReadBytes(count);
+			count = binaryReader.ReadInt32();
+			this.statusBinary = binaryReader.ReadBytes(count);
+			this.overrideData = new ScoutMaidOverrideData();
+			count = binaryReader.ReadInt32();
+			this.overrideData.DeSerialize(binaryReader.ReadBytes(count));
+			this.instanceData = JsonUtility.FromJson<ScoutInstanceData>(binaryReader.ReadString());
+		}
+
+		public object Clone()
+		{
+			ScoutMaidData scoutMaidData = (ScoutMaidData)base.MemberwiseClone();
+			scoutMaidData.status = JsonUtility.FromJson<ScoutMaidData.SimpleStatus>(JsonUtility.ToJson(this.status));
+			scoutMaidData.iconImageBinary = (byte[])this.iconImageBinary.Clone();
+			scoutMaidData.pressetBinary = (byte[])this.pressetBinary.Clone();
+			scoutMaidData.statusBinary = (byte[])this.statusBinary.Clone();
+			scoutMaidData.overrideData = (this.overrideData.Clone() as ScoutMaidOverrideData);
+			scoutMaidData.instanceData = (this.instanceData.Clone() as ScoutInstanceData);
+			return scoutMaidData;
+		}
+
+		private const int FixVersion = 1000;
+
+		[Serializable]
+		public class SimpleStatus : ISerializationCallbackReceiver
+		{
+			public Personal.Data personal
+			{
+				get
+				{
+					return Personal.GetData(this.personalId);
+				}
+			}
+
+			public void OnBeforeSerialize()
+			{
+				this.version = 1000;
+			}
+
+			public void OnAfterDeserialize()
+			{
+			}
+
+			public int version = 1000;
+
+			public string guid;
+
+			public ulong creationTimeNum;
+
+			public string name1;
+
+			public string name2;
+
+			public int personalId;
+
+			public Seikeiken initSeikeiken;
+
+			public Seikeiken seikeiken;
+
+			public int height;
+
+			public int weight;
+
+			public int bust;
+
+			public int waist;
+
+			public int hip;
+
+			public string cup;
+
+			public int care;
+
+			public int reception;
+
+			public int teachRate;
+
+			public int studyRate;
+
+			public int maxHp;
+
+			public int maxMind;
+
+			public int lovely;
+
+			public int elegance;
+
+			public int charm;
+
+			public int cooking;
+
+			public int dance;
+
+			public int vocal;
+
+			public int inyoku;
+
+			public int mvalue;
+
+			public int hentai;
+
+			public int housi;
+
+			public int maidPoint;
+
+			public int playCountYotogi;
+		}
+	}
+}

+ 263 - 0
Assembly-CSharp/scoutmode/ScoutMaidOverrideData.cs

@@ -0,0 +1,263 @@
+using System;
+using System.IO;
+using MaidStatus;
+using UnityEngine;
+using wf;
+
+namespace scoutmode
+{
+	public class ScoutMaidOverrideData : ICloneable
+	{
+		public string guid { get; private set; }
+
+		public bool enabled { get; private set; }
+
+		public void CreateStatus(ScoutMaidData.SimpleStatus status)
+		{
+			this.enabled = true;
+			this.guid = Guid.NewGuid().ToString();
+			this.status.SetStatus(status);
+		}
+
+		public void Apply(Maid maid)
+		{
+			if (!this.enabled)
+			{
+				return;
+			}
+			if (!string.IsNullOrEmpty(this.guid))
+			{
+				maid.status.SetNewGuidAndCreationTime(this.guid, maid.status.creationTime);
+			}
+			MaidStatus.Status status = maid.status;
+			status.SetPersonal(this.status.personalId);
+			status.seikeiken = (status.initSeikeiken = this.status.seikeiken);
+			status.baseLovely = this.status.lovely;
+			status.baseElegance = this.status.elegance;
+			status.baseCharm = this.status.charm;
+			status.baseCooking = this.status.cooking;
+			status.baseDance = this.status.dance;
+			status.baseVocal = this.status.vocal;
+			status.baseInyoku = this.status.inyoku;
+			status.baseMvalue = this.status.mvalue;
+			status.baseHentai = this.status.hentai;
+			status.baseHousi = this.status.housi;
+		}
+
+		public void Destroy()
+		{
+			this.enabled = false;
+		}
+
+		public byte[] Serialize()
+		{
+			MemoryStream memoryStream = new MemoryStream();
+			BinaryWriter binaryWriter = new BinaryWriter(memoryStream);
+			binaryWriter.Write("COM3D2_SCOUT_OVERRIDE_DATA");
+			binaryWriter.Write(1000);
+			binaryWriter.Write((this.guid != null) ? this.guid : string.Empty);
+			binaryWriter.Write(JsonUtility.ToJson(this.status));
+			binaryWriter.Write(this.enabled);
+			int num = (this.iconImageBinary != null && this.iconImageBinary.Length > 0) ? this.iconImageBinary.Length : 0;
+			binaryWriter.Write(num);
+			if (num > 0)
+			{
+				binaryWriter.Write(this.iconImageBinary);
+			}
+			num = ((this.pressetBinary != null && this.pressetBinary.Length > 0) ? this.pressetBinary.Length : 0);
+			binaryWriter.Write(num);
+			if (num > 0)
+			{
+				binaryWriter.Write(this.pressetBinary);
+			}
+			return memoryStream.ToArray();
+		}
+
+		public void DeSerialize(byte[] data)
+		{
+			MemoryStream input = new MemoryStream(data);
+			BinaryReader binaryReader = new BinaryReader(input);
+			NDebug.Assert(binaryReader.ReadString() == "COM3D2_SCOUT_OVERRIDE_DATA", "ScoutMaidData::ScoutMaidOverrideData::DeSerialize Header Check error.");
+			int num = binaryReader.ReadInt32();
+			this.guid = binaryReader.ReadString();
+			this.status = JsonUtility.FromJson<ScoutMaidOverrideData.Status>(binaryReader.ReadString());
+			this.enabled = binaryReader.ReadBoolean();
+			int num2 = binaryReader.ReadInt32();
+			this.iconImageBinary = ((num2 > 0) ? binaryReader.ReadBytes(num2) : null);
+			num2 = binaryReader.ReadInt32();
+			this.pressetBinary = ((num2 > 0) ? binaryReader.ReadBytes(num2) : null);
+		}
+
+		public object Clone()
+		{
+			ScoutMaidOverrideData scoutMaidOverrideData = (ScoutMaidOverrideData)base.MemberwiseClone();
+			scoutMaidOverrideData.status = JsonUtility.FromJson<ScoutMaidOverrideData.Status>(JsonUtility.ToJson(this.status));
+			scoutMaidOverrideData.iconImageBinary = ((this.iconImageBinary != null && this.iconImageBinary.Length > 0) ? ((byte[])this.iconImageBinary.Clone()) : null);
+			scoutMaidOverrideData.pressetBinary = ((this.pressetBinary != null && this.pressetBinary.Length > 0) ? ((byte[])this.pressetBinary.Clone()) : null);
+			return scoutMaidOverrideData;
+		}
+
+		private const int FixVersion = 1000;
+
+		public ScoutMaidOverrideData.Status status = new ScoutMaidOverrideData.Status();
+
+		public byte[] iconImageBinary;
+
+		public byte[] pressetBinary;
+
+		[Serializable]
+		public class Status : ISerializationCallbackReceiver
+		{
+			public Personal.Data personal
+			{
+				get
+				{
+					return Personal.GetData(this.personalId);
+				}
+			}
+
+			public void SetStatus(ScoutMaidData.SimpleStatus status)
+			{
+				this.personalId = status.personalId;
+				this.seikeiken = status.seikeiken;
+				this.lovely = status.lovely;
+				this.elegance = status.elegance;
+				this.charm = status.charm;
+				this.cooking = status.cooking;
+				this.dance = status.dance;
+				this.vocal = status.vocal;
+				this.inyoku = status.inyoku;
+				this.mvalue = status.mvalue;
+				this.hentai = status.hentai;
+				this.housi = status.housi;
+			}
+
+			public void ClearStatus()
+			{
+				this.lovely = 0;
+				this.elegance = 0;
+				this.charm = 0;
+				this.cooking = 0;
+				this.dance = 0;
+				this.vocal = 0;
+				this.inyoku = 0;
+				this.mvalue = 0;
+				this.hentai = 0;
+				this.housi = 0;
+			}
+
+			public bool AddRandomStatusValue(int value)
+			{
+				switch (UnityEngine.Random.Range(0, 10))
+				{
+				case 0:
+					if (this.lovely == 9999)
+					{
+						return false;
+					}
+					this.lovely = wf.Math.Round4(this.lovely + value);
+					break;
+				case 1:
+					if (this.elegance == 9999)
+					{
+						return false;
+					}
+					this.elegance = wf.Math.Round4(this.elegance + value);
+					break;
+				case 2:
+					if (this.charm == 9999)
+					{
+						return false;
+					}
+					this.charm = wf.Math.Round4(this.charm + value);
+					break;
+				case 3:
+					if (this.cooking == 9999)
+					{
+						return false;
+					}
+					this.cooking = wf.Math.Round4(this.cooking + value);
+					break;
+				case 4:
+					if (this.dance == 9999)
+					{
+						return false;
+					}
+					this.dance = wf.Math.Round4(this.dance + value);
+					break;
+				case 5:
+					if (this.vocal == 9999)
+					{
+						return false;
+					}
+					this.vocal = wf.Math.Round4(this.vocal + value);
+					break;
+				case 6:
+					if (this.inyoku == 9999)
+					{
+						return false;
+					}
+					this.inyoku = wf.Math.Round4(this.inyoku + value);
+					break;
+				case 7:
+					if (this.mvalue == 9999)
+					{
+						return false;
+					}
+					this.mvalue = wf.Math.Round4(this.mvalue + value);
+					break;
+				case 8:
+					if (this.hentai == 9999)
+					{
+						return false;
+					}
+					this.hentai = wf.Math.Round4(this.hentai + value);
+					break;
+				case 9:
+					if (this.housi == 9999)
+					{
+						return false;
+					}
+					this.housi = wf.Math.Round4(this.housi + value);
+					break;
+				}
+				return true;
+			}
+
+			public void OnBeforeSerialize()
+			{
+				this.version = 1000;
+			}
+
+			public void OnAfterDeserialize()
+			{
+			}
+
+			public int version = 1000;
+
+			public int personalId;
+
+			public Seikeiken seikeiken;
+
+			public int lovely;
+
+			public int elegance;
+
+			public int charm;
+
+			public int cooking;
+
+			public int dance;
+
+			public int vocal;
+
+			public int inyoku;
+
+			public int mvalue;
+
+			public int hentai;
+
+			public int housi;
+		}
+	}
+}

+ 334 - 0
Assembly-CSharp/scoutmode/ScoutMainScreenManager.cs

@@ -0,0 +1,334 @@
+using System;
+using UnityEngine;
+
+namespace scoutmode
+{
+	public class ScoutMainScreenManager : WfScreenChildren
+	{
+		public new SceneScoutScreenManager parent_mgr
+		{
+			get
+			{
+				return base.parent_mgr as SceneScoutScreenManager;
+			}
+		}
+
+		public ScoutMaidData scoutingMaidData { get; private set; }
+
+		public ScoutMaidData selectedScoutMaid { get; private set; }
+
+		public string SelectedStageName
+		{
+			get
+			{
+				return this.progressInformation.SelectStage.ToString();
+			}
+		}
+
+		private ScoutManager Manager
+		{
+			get
+			{
+				return ScoutManager.Instance;
+			}
+		}
+
+		public override void Awake()
+		{
+			base.Awake();
+			if (this.menus != null)
+			{
+				ScoutMainScreenManager.MenuButton[] array = this.menus;
+				for (int i = 0; i < array.Length; i++)
+				{
+					ScoutMainScreenManager.MenuButton menu = array[i];
+					ScoutMainScreenManager $this = this;
+					if (menu.button != null)
+					{
+						EventDelegate.Add(menu.button.onClick, delegate()
+						{
+							$this.OnClickMenuButton(menu.type);
+						});
+					}
+				}
+			}
+		}
+
+		protected override void OnCall()
+		{
+			GameMain.Instance.MainLight.Reset();
+			GameMain.Instance.CharacterMgr.ResetCharaPosAll();
+			GameMain.Instance.MainCamera.Reset(CameraMain.CameraType.Target, true);
+			GameMain.Instance.CharacterMgr.DeactivateCharaAll();
+			GameMain.Instance.CharacterMgr.Deactivate(0, false);
+			GameMain.Instance.SoundMgr.PlayBGM("BGM015.ogg", 1f, true);
+			GameMain.Instance.BgMgr.ChangeBg((!GameMain.Instance.CharacterMgr.status.isDaytime) ? "ShinShitsumu_ChairRot_Night" : "ShinShitsumu_ChairRot");
+			this.showStatusPanel = false;
+			this.OnSelectedScoutMaid(null);
+			this.scoutCharaSelect.callbackGetScoutMaidList = (() => this.Manager.scoutMaidList);
+			this.scoutCharaSelect.callbackSelectItem = new Action<ScoutMaidData>(this.OnSelectedScoutMaid);
+			this.scoutCharaSelect.SetData();
+			this.progressInformation.SetStage((!GameMain.Instance.CharacterMgr.status.isDaytime) ? ScoutProgressInformation.Stage.Club : ScoutProgressInformation.Stage.ShoppingMall);
+			foreach (ScoutMaidData scoutMaidData in this.Manager.scoutMaidList)
+			{
+				if (scoutMaidData.instanceData.enabled && scoutMaidData.instanceData.stageName == this.SelectedStageName)
+				{
+					this.scoutingMaidData = scoutMaidData;
+					break;
+				}
+			}
+			this.UpdateProgressInfoCharacter();
+			ScoutOption scoutOption = this.scoutOption;
+			scoutOption.onChangeValue = (Action<ScoutOption.SettingType, string>)Delegate.Combine(scoutOption.onChangeValue, new Action<ScoutOption.SettingType, string>(delegate(ScoutOption.SettingType type, string value)
+			{
+				if (type == ScoutOption.SettingType.BaseChara)
+				{
+					this.UpdateProgressInfoCharacter();
+				}
+			}));
+			foreach (ScoutMainScreenManager.MenuButton menuButton in this.menus)
+			{
+				if (menuButton.type == ScoutMainScreenManager.ButtonType.Cancel)
+				{
+					menuButton.button.transform.parent.gameObject.SetActive(false);
+					break;
+				}
+			}
+			uGUITutorialPanel.OpenTutorial("SceneScout", null, false);
+			GameMain.Instance.SysShortcut.strSceneHelpName = "SceneScout";
+		}
+
+		public void OnClickMenuButton(ScoutMainScreenManager.ButtonType type)
+		{
+			Debug.Log(type.ToString());
+			if (type == ScoutMainScreenManager.ButtonType.AddScoutMaid)
+			{
+				this.AddScoutMaid();
+			}
+			else if (type == ScoutMainScreenManager.ButtonType.DeleteScoutMaid)
+			{
+				this.DeleteScoutMaid(this.scoutCharaSelect.selectedMaidData);
+			}
+			else if (type == ScoutMainScreenManager.ButtonType.Start)
+			{
+				this.StartScout();
+			}
+			else if (type == ScoutMainScreenManager.ButtonType.ShowStatus)
+			{
+				this.showStatusPanel = !this.showStatusPanel;
+				this.UpdateShowPanels();
+			}
+			else if (type == ScoutMainScreenManager.ButtonType.Exist)
+			{
+				this.parent_mgr.CallExist(this);
+			}
+			else if (type == ScoutMainScreenManager.ButtonType.Cancel)
+			{
+				this.Manager.CancelScout(this.scoutingMaidData);
+				this.scoutingMaidData = null;
+				this.UpdateProgressInfoCharacter();
+				this.UpdateShowPanels();
+			}
+		}
+
+		private bool StartScout()
+		{
+			ScoutMaidData callScoutMaid = null;
+			if (this.scoutingMaidData == null)
+			{
+				callScoutMaid = this.selectedScoutMaid;
+				if (!ScoutManager.Instance.options.baseCharaSelect)
+				{
+					callScoutMaid = this.Manager.GetRandomWaitingScoutmaid();
+				}
+				else if (callScoutMaid != null && callScoutMaid.instanceData.enabled)
+				{
+					GameMain.Instance.SysDlg.Show("指定キャラクターは既にスカウト中のため開始できません", SystemDialog.TYPE.OK, null, null);
+					return false;
+				}
+				if (callScoutMaid == null)
+				{
+					GameMain.Instance.SysDlg.Show("新たにスカウトを開始するメイドが存在しません", SystemDialog.TYPE.OK, null, null);
+					return false;
+				}
+				this.Manager.CreateRandomScoutMaidData(callScoutMaid, ScoutManager.Instance.options);
+			}
+			else
+			{
+				foreach (ScoutMaidData scoutMaidData in this.Manager.scoutMaidList)
+				{
+					if (scoutMaidData.instanceData.enabled && scoutMaidData.instanceData.stageName == this.SelectedStageName)
+					{
+						callScoutMaid = scoutMaidData;
+						break;
+					}
+				}
+			}
+			if (callScoutMaid == null)
+			{
+				return false;
+			}
+			this.onFinishEvent = delegate()
+			{
+				this.Manager.StartScout(this.Manager.ActiveScoutMaid(callScoutMaid, 0), this.SelectedStageName, ScoutManager.Instance.options);
+				this.progressInformation.ChangeBg(this.progressInformation.SelectStage);
+			};
+			this.parent_mgr.CallStart(this);
+			return true;
+		}
+
+		private void AddScoutMaid()
+		{
+			this.onFinishEvent = delegate()
+			{
+				Maid maid = GameMain.Instance.CharacterMgr.AddStockMaid();
+				maid.Visible = true;
+				GameMain.Instance.CharacterMgr.SetActiveMaid(maid, 0);
+			};
+			this.parent_mgr.CallAddScoutCharacter(this);
+		}
+
+		private void DeleteScoutMaid(ScoutMaidData scoutMaid)
+		{
+			if (scoutMaid == null)
+			{
+				return;
+			}
+			if (scoutMaid.instanceData.enabled)
+			{
+				GameMain.Instance.SysDlg.Show("スカウト中のため削除できません", SystemDialog.TYPE.OK, null, null);
+				return;
+			}
+			this.Manager.RemoveScoutMaid(scoutMaid);
+			this.scoutCharaSelect.DeleteItem(scoutMaid);
+			if (this.scoutCharaSelect.selectedMaidData == null)
+			{
+				this.OnSelectedScoutMaid(null);
+			}
+		}
+
+		public void OnSelectedScoutMaid(ScoutMaidData scoutMaid)
+		{
+			foreach (ScoutMainScreenManager.MenuButton menuButton in this.menus)
+			{
+				if (!(menuButton.button == null) && ScoutMainScreenManager.ButtonType.Start > menuButton.type)
+				{
+					if (menuButton.type == ScoutMainScreenManager.ButtonType.DeleteScoutMaid || menuButton.type == ScoutMainScreenManager.ButtonType.ShowStatus)
+					{
+						menuButton.button.isEnabled = (scoutMaid != null);
+					}
+				}
+			}
+			if (scoutMaid != null)
+			{
+				this.scoutCharaSelect.bigThumbnail.SetFile(new string[]
+				{
+					ScoutMaidData.GetThumbnailFilePath(scoutMaid.status.guid, true),
+					ScoutMaidData.GetThumbnailFilePath(scoutMaid.status.guid, false)
+				});
+			}
+			else
+			{
+				this.scoutCharaSelect.bigThumbnail.SetFile(null);
+			}
+			this.selectedScoutMaid = scoutMaid;
+			this.UpdateProgressInfoCharacter();
+			this.UpdateShowPanels();
+		}
+
+		public void OnAddedScoutMaidReturned()
+		{
+			Maid maid = GameMain.Instance.CharacterMgr.GetMaid(0);
+			this.Manager.AddScoutMaid(maid);
+			GameMain.Instance.CharacterMgr.BanishmentMaid(maid);
+		}
+
+		private void UpdateShowPanels()
+		{
+			this.scoutCharaSelect.bigThumbnail.Visible = (!this.showStatusPanel && this.selectedScoutMaid != null);
+			this.statusPanel.visible = (this.showStatusPanel && this.selectedScoutMaid != null);
+			if (this.statusPanel.visible)
+			{
+				this.statusPanel.SetDrawStatus(this.selectedScoutMaid);
+			}
+		}
+
+		private void UpdateProgressInfoCharacter()
+		{
+			bool isEnabled = false;
+			if (this.scoutingMaidData != null)
+			{
+				this.progressInformation.SetCharacter(this.scoutingMaidData, true);
+				isEnabled = true;
+			}
+			else if (this.Manager.options.baseCharaSelect)
+			{
+				this.progressInformation.SetCharacter(this.selectedScoutMaid, false);
+				isEnabled = (this.selectedScoutMaid != null);
+			}
+			else if (this.Manager.GetRandomWaitingScoutmaid() != null)
+			{
+				this.progressInformation.SetCharacterRandom();
+				isEnabled = true;
+			}
+			else
+			{
+				this.progressInformation.SetCharacter(null, false);
+			}
+			foreach (ScoutMainScreenManager.MenuButton menuButton in this.menus)
+			{
+				if (menuButton.type == ScoutMainScreenManager.ButtonType.Start)
+				{
+					menuButton.button.isEnabled = isEnabled;
+					break;
+				}
+			}
+		}
+
+		protected override void OnFinish()
+		{
+			if (this.onFinishEvent != null)
+			{
+				this.onFinishEvent();
+			}
+			this.parent_mgr.CallScreen("Move");
+		}
+
+		[SerializeField]
+		private ScoutMainScreenManager.MenuButton[] menus;
+
+		[SerializeField]
+		private ScoutCharacterSelectCtrl scoutCharaSelect;
+
+		[SerializeField]
+		private ScoutOption scoutOption;
+
+		[SerializeField]
+		private ScoutProgressInformation progressInformation;
+
+		[SerializeField]
+		private ScoutStatusPanel statusPanel;
+
+		private Action onFinishEvent;
+
+		private bool showStatusPanel;
+
+		public enum ButtonType
+		{
+			AddScoutMaid = 10,
+			DeleteScoutMaid = 20,
+			ShowStatus = 30,
+			Start = 100,
+			Exist = 110,
+			Cancel = 120
+		}
+
+		[Serializable]
+		private struct MenuButton
+		{
+			public ScoutMainScreenManager.ButtonType type;
+
+			public UIButton button;
+		}
+	}
+}

+ 418 - 0
Assembly-CSharp/scoutmode/ScoutManager.cs

@@ -0,0 +1,418 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using MaidStatus;
+using UnityEngine;
+using wf;
+
+namespace scoutmode
+{
+	public class ScoutManager
+	{
+		public ScoutManager()
+		{
+			this.scoutMaidList = new List<ScoutMaidData>();
+		}
+
+		public static bool isModeEnabled
+		{
+			get
+			{
+				return Product.type == Product.Type.JpAdult && PluginData.IsEnabled("GP001FB") && GameMain.Instance.CharacterMgr.status.GetFlag("借金返済_完済") != 0;
+			}
+		}
+
+		public static ScoutManager Instance { get; private set; }
+
+		public static ScoutManager CreateInstance()
+		{
+			if (ScoutManager.Instance == null)
+			{
+				ScoutManager.Instance = new ScoutManager();
+			}
+			GameMain instance = GameMain.Instance;
+			instance.onFinalizeEvent = (Action)Delegate.Combine(instance.onFinalizeEvent, new Action(ScoutManager.Instance.OnOnFinalize));
+			return ScoutManager.Instance;
+		}
+
+		public static ScoutManager ReCreateInstance()
+		{
+			if (ScoutManager.Instance != null)
+			{
+				ScoutManager.Instance.DeleteAllTempThumbnailFile();
+			}
+			ScoutManager.Instance = null;
+			return ScoutManager.CreateInstance();
+		}
+
+		public List<ScoutMaidData> scoutMaidList { get; private set; }
+
+		public ScoutMaidData GetScoutMaid(string guid)
+		{
+			foreach (ScoutMaidData scoutMaidData in this.scoutMaidList)
+			{
+				if (guid == scoutMaidData.status.guid || (scoutMaidData.isOverRideData && guid == scoutMaidData.overrideData.guid))
+				{
+					return scoutMaidData;
+				}
+			}
+			return null;
+		}
+
+		public void AddScoutMaid(Maid maid)
+		{
+			ScoutMaidData scoutMaidData = new ScoutMaidData();
+			scoutMaidData.CreateData(maid);
+			this.scoutMaidList.Add(scoutMaidData);
+			this.scoutMaidList.Sort((ScoutMaidData a, ScoutMaidData b) => a.status.creationTimeNum.CompareTo(b.status.creationTimeNum));
+			string guid = scoutMaidData.status.guid;
+			string thumbnailDictionary = Maid.ThumbnailDictionary;
+			this.RenameFile(Path.Combine(thumbnailDictionary, "_tmp_thum_" + guid + ".png"), ScoutMaidData.GetThumbnailFilePath(guid, true));
+			this.RenameFile(Path.Combine(thumbnailDictionary, "icon_thum_" + guid + ".png"), ScoutMaidData.GetIconThumbnailFilePath(guid, true));
+			this.RenameFile(Path.Combine(thumbnailDictionary, "_tmp_kasizuki_" + guid + ".png"), ScoutMaidData.GetKasizukiThumbnailFilePath(guid, true));
+		}
+
+		public bool CreateRandomScoutMaidData(ScoutMaidData scoutMaid, ScoutOptionData execOptions)
+		{
+			if (execOptions == null || scoutMaid == null)
+			{
+				return false;
+			}
+			scoutMaid.overrideData.Destroy();
+			if (execOptions.inheritPersonality && execOptions.inheritSeikeiken && execOptions.inheritMaidPoint)
+			{
+				return false;
+			}
+			scoutMaid.overrideData.CreateStatus(scoutMaid.status);
+			ScoutMaidOverrideData.Status status = scoutMaid.overrideData.status;
+			if (!execOptions.inheritPersonality)
+			{
+				List<Personal.Data> list = new List<Personal.Data>();
+				foreach (Personal.Data data in Personal.GetAllDatas(true))
+				{
+					if (LockData.personalEnabledIdList.Contains(data.uniqueName))
+					{
+						string a = data.uniqueName.ToLower();
+						if (data.oldPersonal)
+						{
+							if (a == "pure" || a == "cool" || a == "pride")
+							{
+								if (GameMain.Instance.CharacterMgr.status.isAvailableTransfer)
+								{
+									list.Add(data);
+								}
+							}
+							else if (data.single)
+							{
+								list.Add(data);
+							}
+							else if (!string.IsNullOrEmpty(GameMain.Instance.CMSystem.CM3D2Path) && data.compatible)
+							{
+								list.Add(data);
+							}
+						}
+						else
+						{
+							list.Add(data);
+						}
+					}
+				}
+				status.personalId = list[UnityEngine.Random.Range(0, list.Count)].id;
+			}
+			if (!execOptions.inheritSeikeiken)
+			{
+				status.seikeiken = (Seikeiken)UnityEngine.Random.Range(0, 4);
+			}
+			if (!execOptions.inheritMaidPoint)
+			{
+				status.ClearStatus();
+				int num = scoutMaid.status.maidPoint;
+				while (0 < num)
+				{
+					if (!status.AddRandomStatusValue(20))
+					{
+						for (int i = 0; i < 5; i++)
+						{
+							if (status.AddRandomStatusValue(20))
+							{
+								break;
+							}
+						}
+					}
+					num--;
+				}
+			}
+			return true;
+		}
+
+		public void RemoveScoutMaid(ScoutMaidData scoutMaid)
+		{
+			this.scoutMaidList.Remove(scoutMaid);
+		}
+
+		public bool StartScout(Maid maid, string stageName, ScoutOptionData options)
+		{
+			ScoutMaidData scoutMaid = this.GetScoutMaid(maid.status.guid);
+			if (scoutMaid != null && !scoutMaid.instanceData.enabled)
+			{
+				scoutMaid.instanceData.Create(maid, stageName, options);
+				return true;
+			}
+			return false;
+		}
+
+		public Maid ActiveScoutMaid(ScoutMaidData scoutMaid, int slotNo)
+		{
+			if (scoutMaid == null)
+			{
+				return null;
+			}
+			Maid maid = GameMain.Instance.CharacterMgr.AddStockMaid();
+			maid.Visible = true;
+			GameMain.Instance.CharacterMgr.SetActiveMaid(maid, slotNo);
+			scoutMaid.Apply(maid);
+			return maid;
+		}
+
+		public bool SuspendedScout(Maid maid)
+		{
+			if (maid == null || maid.status.GetFlag("__スカウトメイド") != 1)
+			{
+				return false;
+			}
+			ScoutMaidData scoutMaid = this.GetScoutMaid(maid.status.guid);
+			NDebug.Assert(scoutMaid != null, "スカウトメイドデータの特定ができませんでした");
+			scoutMaid.instanceData.Update(maid);
+			GameMain.Instance.CharacterMgr.DeactivateMaid(maid);
+			GameMain.Instance.CharacterMgr.BanishmentMaid(maid);
+			return true;
+		}
+
+		public bool CancelScout(Maid maid)
+		{
+			if (maid == null || maid.status.GetFlag("__スカウトメイド") != 1)
+			{
+				return false;
+			}
+			ScoutMaidData scoutMaid = this.GetScoutMaid(maid.status.guid);
+			NDebug.Assert(scoutMaid != null, "スカウトメイドデータの特定ができませんでした");
+			if (!this.CancelScout(scoutMaid))
+			{
+				return false;
+			}
+			GameMain.Instance.CharacterMgr.DeactivateMaid(maid);
+			GameMain.Instance.CharacterMgr.BanishmentMaid(maid);
+			return true;
+		}
+
+		public bool CancelScout(ScoutMaidData scoutMaid)
+		{
+			if (scoutMaid == null || !scoutMaid.instanceData.enabled)
+			{
+				return false;
+			}
+			scoutMaid.overrideData.Destroy();
+			scoutMaid.instanceData.Destroy();
+			return true;
+		}
+
+		public void HireScoutMaid(Maid maid)
+		{
+			if (maid == null)
+			{
+				return;
+			}
+			ScoutMaidData scoutMaid = this.GetScoutMaid(maid.status.guid);
+			NDebug.Assert(scoutMaid != null, "スカウトメイドデータの特定ができませんでした");
+			maid.status.SetNewGuidAndCreationTime(null, null);
+			maid.status.employmentDay = GameMain.Instance.CharacterMgr.status.days;
+			byte[] iconImageBinary = scoutMaid.GetIconImageBinary();
+			if (iconImageBinary != null)
+			{
+				Texture2D texture2D = new Texture2D(1, 1, TextureFormat.ARGB32, false);
+				texture2D.LoadImage(iconImageBinary);
+				maid.SetThumIcon(texture2D);
+			}
+			foreach (string text in new string[]
+			{
+				ScoutMaidData.GetThumbnailFilePath(scoutMaid.status.guid, true),
+				ScoutMaidData.GetThumbnailFilePath(scoutMaid.status.guid, false)
+			})
+			{
+				string thumbnailFilePath = Maid.GetThumbnailFilePath(maid.status.guid, true);
+				if (File.Exists(text) && !File.Exists(thumbnailFilePath))
+				{
+					File.Copy(text, thumbnailFilePath);
+					break;
+				}
+			}
+			foreach (string text2 in new string[]
+			{
+				ScoutMaidData.GetIconThumbnailFilePath(scoutMaid.status.guid, true),
+				ScoutMaidData.GetIconThumbnailFilePath(scoutMaid.status.guid, false)
+			})
+			{
+				string thumbnailFilePath2 = Maid.GetThumbnailFilePath(maid.status.guid, true);
+				if (File.Exists(text2) && !File.Exists(thumbnailFilePath2))
+				{
+					File.Copy(text2, thumbnailFilePath2);
+					break;
+				}
+			}
+			foreach (string text3 in new string[]
+			{
+				ScoutMaidData.GetKasizukiThumbnailFilePath(scoutMaid.status.guid, true),
+				ScoutMaidData.GetKasizukiThumbnailFilePath(scoutMaid.status.guid, false)
+			})
+			{
+				string kasizukiThumbnailFilePath = Maid.GetKasizukiThumbnailFilePath(maid.status.guid, true);
+				if (File.Exists(text3) && !File.Exists(kasizukiThumbnailFilePath))
+				{
+					File.Copy(text3, kasizukiThumbnailFilePath);
+					break;
+				}
+			}
+			scoutMaid.overrideData.Destroy();
+			scoutMaid.instanceData.Destroy();
+			if (scoutMaid.instanceData.options.isBaseCharaDelete)
+			{
+				this.RemoveScoutMaid(scoutMaid);
+			}
+			GameMain.Instance.CharacterMgr.DeactivateMaid(maid);
+		}
+
+		public ScoutMaidData GetRandomWaitingScoutmaid()
+		{
+			List<ScoutMaidData> list = new List<ScoutMaidData>();
+			foreach (ScoutMaidData scoutMaidData in this.scoutMaidList)
+			{
+				if (!scoutMaidData.instanceData.enabled && !scoutMaidData.isOverRideData)
+				{
+					list.Add(scoutMaidData);
+				}
+			}
+			return (list.Count <= 0) ? null : list[UnityEngine.Random.Range(0, list.Count)];
+		}
+
+		public void Serialize(BinaryWriter bw)
+		{
+			byte[] array = new byte[0];
+			MemoryStream memoryStream = new MemoryStream();
+			BinaryWriter binaryWriter = new BinaryWriter(memoryStream);
+			int count = this.scoutMaidList.Count;
+			binaryWriter.Write(count);
+			foreach (ScoutMaidData scoutMaidData in this.scoutMaidList)
+			{
+				byte[] array2 = scoutMaidData.Serialize();
+				binaryWriter.Write(array2.Length);
+				binaryWriter.Write(array2);
+			}
+			array = Utility.ZlibCompresss(memoryStream.ToArray());
+			bw.Write(array.Length);
+			bw.Write(array);
+			bw.Write(JsonUtility.ToJson(this.options));
+		}
+
+		public void DeSerialize(BinaryReader br)
+		{
+			int count = br.ReadInt32();
+			byte[] buffer = Utility.ZlibUncompress(br.ReadBytes(count));
+			BinaryReader binaryReader = new BinaryReader(new MemoryStream(buffer));
+			int num = binaryReader.ReadInt32();
+			this.scoutMaidList.Clear();
+			for (int i = 0; i < num; i++)
+			{
+				ScoutMaidData scoutMaidData = new ScoutMaidData();
+				int count2 = binaryReader.ReadInt32();
+				scoutMaidData.DeSerialize(binaryReader.ReadBytes(count2));
+				this.scoutMaidList.Add(scoutMaidData);
+			}
+			this.options = JsonUtility.FromJson<ScoutOptionData>(br.ReadString());
+		}
+
+		public void FixThumbnail()
+		{
+			foreach (ScoutMaidData scoutMaidData in this.scoutMaidList)
+			{
+				string guid = scoutMaidData.status.guid;
+				this.RenameFile(ScoutMaidData.GetThumbnailFilePath(guid, true), ScoutMaidData.GetThumbnailFilePath(guid, false));
+				this.RenameFile(ScoutMaidData.GetIconThumbnailFilePath(guid, true), ScoutMaidData.GetIconThumbnailFilePath(guid, false));
+				this.RenameFile(ScoutMaidData.GetKasizukiThumbnailFilePath(guid, true), ScoutMaidData.GetKasizukiThumbnailFilePath(guid, false));
+			}
+			foreach (string guid2 in this.removeScoutMaidGuid)
+			{
+				foreach (string path in new string[]
+				{
+					ScoutMaidData.GetThumbnailFilePath(guid2, false),
+					ScoutMaidData.GetIconThumbnailFilePath(guid2, false),
+					ScoutMaidData.GetKasizukiThumbnailFilePath(guid2, false)
+				})
+				{
+					if (File.Exists(path))
+					{
+						File.Delete(path);
+					}
+				}
+			}
+			this.DeleteAllTempThumbnailFile();
+		}
+
+		public void DeleteAllTempThumbnailFile()
+		{
+			foreach (string guid in this.removeScoutMaidGuid)
+			{
+				foreach (string path in new string[]
+				{
+					ScoutMaidData.GetThumbnailFilePath(guid, true),
+					ScoutMaidData.GetIconThumbnailFilePath(guid, true),
+					ScoutMaidData.GetKasizukiThumbnailFilePath(guid, true)
+				})
+				{
+					if (File.Exists(path))
+					{
+						File.Delete(path);
+					}
+				}
+			}
+			foreach (ScoutMaidData scoutMaidData in this.scoutMaidList)
+			{
+				string guid2 = scoutMaidData.status.guid;
+				foreach (string path2 in new string[]
+				{
+					ScoutMaidData.GetThumbnailFilePath(guid2, true),
+					ScoutMaidData.GetIconThumbnailFilePath(guid2, true),
+					ScoutMaidData.GetKasizukiThumbnailFilePath(guid2, true)
+				})
+				{
+					if (File.Exists(path2))
+					{
+						File.Delete(path2);
+					}
+				}
+			}
+			this.removeScoutMaidGuid.Clear();
+		}
+
+		private void OnOnFinalize()
+		{
+			this.DeleteAllTempThumbnailFile();
+		}
+
+		private void RenameFile(string src, string dest)
+		{
+			if (!File.Exists(src))
+			{
+				return;
+			}
+			if (File.Exists(dest))
+			{
+				File.Delete(dest);
+			}
+			File.Move(src, dest);
+		}
+
+		public ScoutOptionData options = new ScoutOptionData();
+
+		private HashSet<string> removeScoutMaidGuid = new HashSet<string>();
+	}
+}

+ 278 - 0
Assembly-CSharp/scoutmode/ScoutOption.cs

@@ -0,0 +1,278 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using I2.Loc;
+using UnityEngine;
+
+namespace scoutmode
+{
+	public class ScoutOption : MonoBehaviour
+	{
+		private ScoutOptionData options
+		{
+			get
+			{
+				return ScoutManager.Instance.options;
+			}
+		}
+
+		private void Start()
+		{
+			IEnumerator enumerator = this.buttonGroup.GetEnumerator();
+			try
+			{
+				while (enumerator.MoveNext())
+				{
+					object obj = enumerator.Current;
+					Transform transform = (Transform)obj;
+					UIPopupList componentInChildren = transform.GetComponentInChildren<UIPopupList>();
+					if (componentInChildren)
+					{
+						ScoutOption.NeedData needData = new ScoutOption.NeedData();
+						if (transform.Find("Label"))
+						{
+							needData.label = transform.Find("Label").GetComponent<UILabel>();
+							needData.localize = needData.label.GetComponent<Localize>();
+						}
+						needData.button = transform.GetComponentInChildren<UIButton>();
+						needData.collider = transform.GetComponentInChildren<BoxCollider>();
+						this.settingUIList.Add(componentInChildren, needData);
+						EventDelegate.Add(componentInChildren.onChange, new EventDelegate.Callback(this.OnValueSetting));
+					}
+				}
+			}
+			finally
+			{
+				IDisposable disposable;
+				if ((disposable = (enumerator as IDisposable)) != null)
+				{
+					disposable.Dispose();
+				}
+			}
+			this.UpdateUI();
+		}
+
+		public void DisSelectable()
+		{
+			foreach (KeyValuePair<UIPopupList, ScoutOption.NeedData> keyValuePair in this.settingUIList)
+			{
+				if (keyValuePair.Value.collider)
+				{
+					keyValuePair.Value.collider.enabled = false;
+				}
+			}
+		}
+
+		public void UpdateUI()
+		{
+			IEnumerator enumerator = this.buttonGroup.GetEnumerator();
+			try
+			{
+				while (enumerator.MoveNext())
+				{
+					object obj = enumerator.Current;
+					Transform transform = (Transform)obj;
+					UIPopupList componentInChildren = transform.GetComponentInChildren<UIPopupList>();
+					if (componentInChildren != null)
+					{
+						this.SetUIValue(componentInChildren);
+					}
+				}
+			}
+			finally
+			{
+				IDisposable disposable;
+				if ((disposable = (enumerator as IDisposable)) != null)
+				{
+					disposable.Dispose();
+				}
+			}
+		}
+
+		private void SetUIValue(UIPopupList list)
+		{
+			ScoutOption.UIInspectorSetting uiinspectorSetting = this.settingList.SingleOrDefault((ScoutOption.UIInspectorSetting e) => e.popUpUI == list);
+			if (uiinspectorSetting == null)
+			{
+				return;
+			}
+			foreach (string text in list.items)
+			{
+				bool flag = false;
+				string text2 = text.Replace("\r", string.Empty);
+				string text3 = text2;
+				string[] array = text2.Split(new char[]
+				{
+					'/'
+				});
+				if (array != null && 1 < array.Length)
+				{
+					text3 = array[array.Length - 1];
+					flag = true;
+				}
+				if (this.IsMatch(uiinspectorSetting.myType, text3))
+				{
+					list.value = ((!flag) ? text3 : text2);
+					break;
+				}
+			}
+		}
+
+		private bool IsMatch(ScoutOption.SettingType type, string text)
+		{
+			bool result = false;
+			if (type == ScoutOption.SettingType.BaseChara)
+			{
+				if (this.options.baseCharaSelect)
+				{
+					result = (text == "登録キャラから選択する");
+				}
+				else
+				{
+					result = (text == "登録キャラからランダム");
+				}
+			}
+			else if (type == ScoutOption.SettingType.Personality || type == ScoutOption.SettingType.Seikeiken || type == ScoutOption.SettingType.MaidPoint)
+			{
+				bool flag = false;
+				if (type != ScoutOption.SettingType.Personality)
+				{
+					if (type != ScoutOption.SettingType.Seikeiken)
+					{
+						if (type == ScoutOption.SettingType.MaidPoint)
+						{
+							flag = this.options.inheritMaidPoint;
+						}
+					}
+					else
+					{
+						flag = this.options.inheritSeikeiken;
+					}
+				}
+				else
+				{
+					flag = this.options.inheritPersonality;
+				}
+				if (flag)
+				{
+					result = (text == "①のキャラと同じ");
+				}
+				else
+				{
+					result = (text == "ランダム");
+				}
+			}
+			else if (type == ScoutOption.SettingType.BaseCharaDelete)
+			{
+				if (this.options.isBaseCharaDelete)
+				{
+					result = (text == "①のベースキャラを消す");
+				}
+				else
+				{
+					result = (text == "①のベースキャラを消さない");
+				}
+			}
+			return result;
+		}
+
+		private void OnValueSetting()
+		{
+			string text = UIPopupList.current.value.Replace("\r", string.Empty);
+			string text2 = text;
+			bool isLocalized = UIPopupList.current.isLocalized;
+			if (isLocalized)
+			{
+				string[] array = text2.Split(new char[]
+				{
+					'/'
+				});
+				if (array != null && 1 < array.Length)
+				{
+					text2 = array[array.Length - 1];
+				}
+			}
+			ScoutOption.UIInspectorSetting uiinspectorSetting = this.settingList.SingleOrDefault((ScoutOption.UIInspectorSetting e) => e.popUpUI == UIPopupList.current);
+			if (uiinspectorSetting == null)
+			{
+				return;
+			}
+			if (uiinspectorSetting.myType == ScoutOption.SettingType.BaseChara)
+			{
+				this.options.baseCharaSelect = (text2 == "登録キャラから選択する");
+			}
+			else if (uiinspectorSetting.myType == ScoutOption.SettingType.Personality)
+			{
+				this.options.inheritPersonality = (text2 == "①のキャラと同じ");
+			}
+			else if (uiinspectorSetting.myType == ScoutOption.SettingType.Seikeiken)
+			{
+				this.options.inheritSeikeiken = (text2 == "①のキャラと同じ");
+			}
+			else if (uiinspectorSetting.myType == ScoutOption.SettingType.MaidPoint)
+			{
+				this.options.inheritMaidPoint = (text2 == "①のキャラと同じ");
+			}
+			else if (uiinspectorSetting.myType == ScoutOption.SettingType.BaseCharaDelete)
+			{
+				this.options.isBaseCharaDelete = (text2 == "①のベースキャラを消す");
+			}
+			if (this.settingUIList[UIPopupList.current].label)
+			{
+				if (isLocalized && this.settingUIList[UIPopupList.current].localize != null)
+				{
+					this.settingUIList[UIPopupList.current].localize.SetTerm(text);
+				}
+				else
+				{
+					this.settingUIList[UIPopupList.current].label.text = text;
+				}
+			}
+			if (this.onChangeValue != null)
+			{
+				this.onChangeValue(uiinspectorSetting.myType, text2);
+			}
+		}
+
+		[SerializeField]
+		[Header("ボタンUIグループ")]
+		private Transform buttonGroup;
+
+		[SerializeField]
+		[Header("各UI設定")]
+		private List<ScoutOption.UIInspectorSetting> settingList;
+
+		public Action<ScoutOption.SettingType, string> onChangeValue;
+
+		private Dictionary<UIPopupList, ScoutOption.NeedData> settingUIList = new Dictionary<UIPopupList, ScoutOption.NeedData>();
+
+		public enum SettingType
+		{
+			BaseChara,
+			Personality,
+			Seikeiken,
+			MaidPoint,
+			BaseCharaDelete
+		}
+
+		private class NeedData
+		{
+			public UILabel label;
+
+			public Localize localize;
+
+			public UIButton button;
+
+			public BoxCollider collider;
+		}
+
+		[Serializable]
+		private class UIInspectorSetting
+		{
+			public ScoutOption.SettingType myType;
+
+			public UIPopupList popUpUI;
+		}
+	}
+}

+ 32 - 0
Assembly-CSharp/scoutmode/ScoutOptionData.cs

@@ -0,0 +1,32 @@
+using System;
+using UnityEngine;
+
+namespace scoutmode
+{
+	[Serializable]
+	public class ScoutOptionData : ISerializationCallbackReceiver
+	{
+		public void OnBeforeSerialize()
+		{
+			this.version = 1000;
+		}
+
+		public void OnAfterDeserialize()
+		{
+		}
+
+		private const int FixVersion = 1000;
+
+		public int version = 1000;
+
+		public bool baseCharaSelect;
+
+		public bool inheritPersonality = true;
+
+		public bool inheritSeikeiken = true;
+
+		public bool inheritMaidPoint = true;
+
+		public bool isBaseCharaDelete;
+	}
+}

+ 117 - 0
Assembly-CSharp/scoutmode/ScoutProgressInformation.cs

@@ -0,0 +1,117 @@
+using System;
+using I2.Loc;
+using UnityEngine;
+using wf;
+
+namespace scoutmode
+{
+	public class ScoutProgressInformation : MonoBehaviour
+	{
+		public ScoutProgressInformation.Stage SelectStage { get; private set; }
+
+		public void SetStage(ScoutProgressInformation.Stage stage)
+		{
+			this.SelectStage = stage;
+			YotogiStage.Data data = null;
+			if (this.SelectStage == ScoutProgressInformation.Stage.ShoppingMall)
+			{
+				data = YotogiStage.GetData("ショッピングモール");
+			}
+			else if (this.SelectStage == ScoutProgressInformation.Stage.Club)
+			{
+				data = YotogiStage.GetData("劇場");
+			}
+			if (this.stageSprite.sprite2D != null)
+			{
+				UnityEngine.Object.Destroy(this.stageSprite.sprite2D.texture);
+			}
+			if (data != null)
+			{
+				this.stageNameLabel.text = data.drawName;
+				Utility.SetLocalizeTerm(this.stageNameLabel, data.termName, false);
+				string f_strFileName = data.thumbnailName[(!GameMain.Instance.CharacterMgr.status.isDaytime) ? 1 : 0];
+				Texture2D texture2D = ImportCM.CreateTexture(f_strFileName);
+				this.stageSprite.sprite2D = Sprite.Create(texture2D, new Rect(0f, 0f, (float)texture2D.width, (float)texture2D.height), default(Vector2));
+				this.stageSprite.SetDimensions(this.stageSprite.sprite2D.texture.width, this.stageSprite.sprite2D.texture.height);
+			}
+		}
+
+		public void SetCharacterRandom()
+		{
+			this.charaNameLabel1.text = "??????";
+			this.charaNameLabel2.text = "??????";
+			this.charaThumbnailSprite.sprite2D = null;
+			this.charaPanel.SetActive(true);
+		}
+
+		public void SetCharacter(ScoutMaidData scoutMaid, bool isScouting)
+		{
+			this.charaPanel.SetActive(scoutMaid != null);
+			if (!this.charaPanel.activeSelf)
+			{
+				return;
+			}
+			if (isScouting)
+			{
+				Utility.SetLocalizeTerm(this.charaThumbnailLocalize, "SceneScout/スカウト中キャラクター", true);
+			}
+			else
+			{
+				Utility.SetLocalizeTerm(this.charaThumbnailLocalize, "SceneScout/スカウト予定キャラクター", true);
+			}
+			this.charaNameLabel1.text = scoutMaid.status.name1;
+			this.charaNameLabel2.text = scoutMaid.status.name2;
+			if (this.charaThumbnailSprite.sprite2D != null)
+			{
+				UnityEngine.Object.Destroy(this.charaThumbnailSprite.sprite2D.texture);
+			}
+			byte[] iconImageBinary = scoutMaid.GetIconImageBinary();
+			if (iconImageBinary != null)
+			{
+				Texture2D texture2D = new Texture2D(1, 1, TextureFormat.ARGB32, false);
+				texture2D.LoadImage(iconImageBinary);
+				this.charaThumbnailSprite.sprite2D = Sprite.Create(texture2D, new Rect(0f, 0f, (float)texture2D.width, (float)texture2D.height), default(Vector2));
+				this.charaThumbnailSprite.SetDimensions(this.charaThumbnailSprite.sprite2D.texture.width, this.charaThumbnailSprite.sprite2D.texture.height);
+			}
+		}
+
+		public void ChangeBg(ScoutProgressInformation.Stage stage)
+		{
+			if (this.SelectStage == ScoutProgressInformation.Stage.ShoppingMall)
+			{
+				GameMain.Instance.BgMgr.ChangeBg("ShoppingMall");
+			}
+			else if (this.SelectStage == ScoutProgressInformation.Stage.Club)
+			{
+				GameMain.Instance.BgMgr.ChangeBg("Theater");
+			}
+		}
+
+		[SerializeField]
+		private UI2DSprite stageSprite;
+
+		[SerializeField]
+		private UILabel stageNameLabel;
+
+		[SerializeField]
+		private GameObject charaPanel;
+
+		[SerializeField]
+		private Localize charaThumbnailLocalize;
+
+		[SerializeField]
+		private UI2DSprite charaThumbnailSprite;
+
+		[SerializeField]
+		private UILabel charaNameLabel1;
+
+		[SerializeField]
+		private UILabel charaNameLabel2;
+
+		public enum Stage
+		{
+			ShoppingMall,
+			Club
+		}
+	}
+}

+ 149 - 0
Assembly-CSharp/scoutmode/ScoutStatusPanel.cs

@@ -0,0 +1,149 @@
+using System;
+using I2.Loc;
+using MaidStatus;
+using UnityEngine;
+using wf;
+
+namespace scoutmode
+{
+	public class ScoutStatusPanel : MonoBehaviour
+	{
+		public bool visible
+		{
+			get
+			{
+				return base.gameObject.activeSelf;
+			}
+			set
+			{
+				base.gameObject.SetActive(value);
+			}
+		}
+
+		public void SetDrawStatus(ScoutMaidData scoutMaid)
+		{
+			if (scoutMaid == null)
+			{
+				return;
+			}
+			ScoutMaidData.SimpleStatus status = scoutMaid.status;
+			if (this.charaThumbnailSprite.sprite2D != null)
+			{
+				UnityEngine.Object.Destroy(this.charaThumbnailSprite.sprite2D.texture);
+			}
+			byte[] iconImageBinary = scoutMaid.iconImageBinary;
+			if (iconImageBinary != null)
+			{
+				Texture2D texture2D = new Texture2D(1, 1, TextureFormat.ARGB32, false);
+				texture2D.LoadImage(iconImageBinary);
+				this.charaThumbnailSprite.sprite2D = Sprite.Create(texture2D, new Rect(0f, 0f, (float)texture2D.width, (float)texture2D.height), default(Vector2));
+				this.charaThumbnailSprite.SetDimensions(this.charaThumbnailSprite.sprite2D.texture.width, this.charaThumbnailSprite.sprite2D.texture.height);
+			}
+			this.charaName1.text = status.name1;
+			this.charaName2.text = status.name2;
+			this.heroineType.GetComponent<UILabel>().text = status.personal.drawName;
+			Utility.SetLocalizeTerm(this.heroineType, status.personal.termName, false);
+			this.seikeiken.GetComponent<UILabel>().text = EnumConvert.GetString(status.seikeiken);
+			Utility.SetLocalizeTerm(this.seikeiken, EnumConvert.GetTerm(status.seikeiken), false);
+			this.height.text = status.height.ToString();
+			this.weight.text = status.weight.ToString();
+			this.bust.text = status.bust.ToString();
+			this.cup.text = status.cup;
+			this.waist.text = status.waist.ToString();
+			this.hip.text = status.hip.ToString();
+			this.lovely.text = status.lovely.ToString();
+			this.elegance.text = status.elegance.ToString();
+			this.charm.text = status.charm.ToString();
+			this.care.text = status.care.ToString();
+			this.reception.text = status.reception.ToString();
+			this.cooking.text = status.cooking.ToString();
+			this.dance.text = status.dance.ToString();
+			this.vocal.text = status.vocal.ToString();
+			this.teachRate.text = ((int)System.Math.Floor((double)status.teachRate / 10.0)).ToString();
+			this.studyRate.text = ((int)System.Math.Floor((double)status.studyRate / 10.0)).ToString();
+			this.inyoku.text = status.inyoku.ToString();
+			this.mValue.text = status.mvalue.ToString();
+			this.hentai.text = status.hentai.ToString();
+			this.housi.text = status.housi.ToString();
+			this.yotogiPlayCount.text = status.playCountYotogi.ToString();
+		}
+
+		[SerializeField]
+		private UI2DSprite charaThumbnailSprite;
+
+		[SerializeField]
+		private UILabel charaName1;
+
+		[SerializeField]
+		private UILabel charaName2;
+
+		[SerializeField]
+		private Localize heroineType;
+
+		[SerializeField]
+		private Localize seikeiken;
+
+		[SerializeField]
+		private UILabel height;
+
+		[SerializeField]
+		private UILabel weight;
+
+		[SerializeField]
+		private UILabel bust;
+
+		[SerializeField]
+		private UILabel cup;
+
+		[SerializeField]
+		private UILabel waist;
+
+		[SerializeField]
+		private UILabel hip;
+
+		[SerializeField]
+		private UILabel lovely;
+
+		[SerializeField]
+		private UILabel elegance;
+
+		[SerializeField]
+		private UILabel charm;
+
+		[SerializeField]
+		private UILabel care;
+
+		[SerializeField]
+		private UILabel reception;
+
+		[SerializeField]
+		private UILabel cooking;
+
+		[SerializeField]
+		private UILabel dance;
+
+		[SerializeField]
+		private UILabel vocal;
+
+		[SerializeField]
+		private UILabel teachRate;
+
+		[SerializeField]
+		private UILabel studyRate;
+
+		[SerializeField]
+		private UILabel inyoku;
+
+		[SerializeField]
+		private UILabel mValue;
+
+		[SerializeField]
+		private UILabel hentai;
+
+		[SerializeField]
+		private UILabel housi;
+
+		[SerializeField]
+		private UILabel yotogiPlayCount;
+	}
+}

+ 22 - 0
Assembly-CSharp/uGUIListViewer.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Collections.Generic;
 using UnityEngine;
 
 public class uGUIListViewer : MonoBehaviour
@@ -115,6 +116,27 @@ public class uGUIListViewer : MonoBehaviour
 		this.m_ItemArray = null;
 	}
 
+	public void RemoveItem(GameObject obj)
+	{
+		if (this.m_ItemArray != null)
+		{
+			List<GameObject> list = new List<GameObject>(this.m_ItemArray.Length);
+			for (int i = 0; i < this.m_ItemArray.Length; i++)
+			{
+				if (obj != this.m_ItemArray[i])
+				{
+					list.Add(this.m_ItemArray[i]);
+				}
+				else
+				{
+					this.m_ItemArray[i].transform.SetParent(null, false);
+					UnityEngine.Object.Destroy(this.m_ItemArray[i]);
+				}
+			}
+			this.m_ItemArray = list.ToArray();
+		}
+	}
+
 	[SerializeField]
 	private Transform m_ParentItemArea;
 

+ 47 - 0
Assembly-CSharp/wf/CsvCommonIdManager.cs

@@ -171,6 +171,53 @@ namespace wf
 			}
 		}
 
+		public static void ReadEnabledIdList(AFileSystemBase fileSystem, List<string> pathList, string fileName, ref HashSet<string> destList)
+		{
+			if (destList == null)
+			{
+				destList = new HashSet<string>();
+			}
+			string str = fileName;
+			fileName += ".nei";
+			if (!fileSystem.IsExistentFile(fileName))
+			{
+				if (pathList != null)
+				{
+					foreach (string str2 in pathList)
+					{
+						CsvCommonIdManager.ReadEnabledIdList(fileSystem, null, str + "_" + str2, ref destList);
+					}
+				}
+				return;
+			}
+			using (AFileBase afileBase = fileSystem.FileOpen(fileName))
+			{
+				using (CsvParser csvParser = new CsvParser())
+				{
+					bool condition = csvParser.Open(afileBase);
+					NDebug.Assert(condition, fileName + "\nopen failed.");
+					for (int i = 1; i < csvParser.max_cell_y; i++)
+					{
+						if (csvParser.IsCellToExistData(0, i))
+						{
+							string cellAsString = csvParser.GetCellAsString(0, i);
+							if (!destList.Contains(cellAsString))
+							{
+								destList.Add(cellAsString);
+							}
+						}
+					}
+				}
+			}
+			if (pathList != null)
+			{
+				foreach (string str3 in pathList)
+				{
+					CsvCommonIdManager.ReadEnabledIdList(fileSystem, null, str + "_" + str3, ref destList);
+				}
+			}
+		}
+
 		public readonly SortedDictionary<int, KeyValuePair<string, string>> idMap;
 
 		public readonly Dictionary<string, int> nameMap;