denikson 5 years ago
parent
commit
9c846e471d
46 changed files with 1120 additions and 161 deletions
  1. 5 5
      Assembly-CSharp.sln
  2. 4 1
      Assembly-CSharp/Assembly-CSharp.csproj
  3. 1 1
      Assembly-CSharp/BaseKagManager.cs
  4. 1 1
      Assembly-CSharp/BasePhotoCustomObject.cs
  5. 1 1
      Assembly-CSharp/BasePhotoWindowManager.cs
  6. 4 4
      Assembly-CSharp/CMSystem.cs
  7. 3 3
      Assembly-CSharp/CharacterMgr.cs
  8. 17 27
      Assembly-CSharp/CharacterSelectMain.cs
  9. 2 2
      Assembly-CSharp/ControllerShortcutSettingData.cs
  10. 1 1
      Assembly-CSharp/DeskManager.cs
  11. 3 3
      Assembly-CSharp/DynamicBone.cs
  12. 2 2
      Assembly-CSharp/DynamicSkirtBone.cs
  13. 1 1
      Assembly-CSharp/EditMod.cs
  14. 1 1
      Assembly-CSharp/FacilityManager.cs
  15. 2 2
      Assembly-CSharp/GameMain.cs
  16. 2 2
      Assembly-CSharp/GameUty.cs
  17. 340 0
      Assembly-CSharp/GravityControlWindow.cs
  18. 167 0
      Assembly-CSharp/GravityTransformControl.cs
  19. 2 2
      Assembly-CSharp/HandSignShortcut.cs
  20. 42 7
      Assembly-CSharp/IKMgrData.cs
  21. 62 0
      Assembly-CSharp/KaraokeDataManager.cs
  22. 1 1
      Assembly-CSharp/Kasizuki/KasizukiManager.cs
  23. 3 3
      Assembly-CSharp/Maid.cs
  24. 1 1
      Assembly-CSharp/MaidParts.cs
  25. 1 1
      Assembly-CSharp/MaidProp.cs
  26. 1 1
      Assembly-CSharp/MaidStatus/Status.cs
  27. 1 1
      Assembly-CSharp/Menu.cs
  28. 76 58
      Assembly-CSharp/MessageClass.cs
  29. 1 1
      Assembly-CSharp/Misc.cs
  30. 1 1
      Assembly-CSharp/ModCompile.cs
  31. 26 2
      Assembly-CSharp/ObjectCreateWindow.cs
  32. 2 2
      Assembly-CSharp/OvrIK.cs
  33. 48 2
      Assembly-CSharp/PhotoCustomObjectSphere.cs
  34. 1 1
      Assembly-CSharp/PhotoModeSaveAndLoad.cs
  35. 4 2
      Assembly-CSharp/PhotoWindowManager.cs
  36. 1 1
      Assembly-CSharp/PlayerStatus/Status.cs
  37. 1 1
      Assembly-CSharp/ScriptManager.cs
  38. 149 0
      Assembly-CSharp/SubtitlesDisplayManager.cs
  39. 44 14
      Assembly-CSharp/TBody.cs
  40. 1 0
      Assembly-CSharp/UndressingWindow.cs
  41. 1 1
      Assembly-CSharp/WindowPartsFingerPreset.cs
  42. 4 0
      Assembly-CSharp/WindowPartsMekureCheckBox.cs
  43. 34 0
      Assembly-CSharp/YotogiKagManager.cs
  44. 30 0
      Assembly-CSharp/YotogiPlayManager.cs
  45. 14 1
      Assembly-CSharp/uGUIKaraokeSelect.cs
  46. 11 0
      Assembly-CSharp/wf/Math.cs

+ 5 - 5
Assembly-CSharp.sln

@@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio 15
 VisualStudioVersion = 15.0.26228.4
 MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Assembly-CSharp", "Assembly-CSharp\Assembly-CSharp.csproj", "{188ABBD5-5112-41C6-8EA9-ED44648D9E67}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Assembly-CSharp", "Assembly-CSharp\Assembly-CSharp.csproj", "{265EC8A8-1F99-4A69-B097-66490F1971D5}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -11,10 +11,10 @@ Global
 		Release|Any CPU = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{188ABBD5-5112-41C6-8EA9-ED44648D9E67}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{188ABBD5-5112-41C6-8EA9-ED44648D9E67}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{188ABBD5-5112-41C6-8EA9-ED44648D9E67}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{188ABBD5-5112-41C6-8EA9-ED44648D9E67}.Release|Any CPU.Build.0 = Release|Any CPU
+		{265EC8A8-1F99-4A69-B097-66490F1971D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{265EC8A8-1F99-4A69-B097-66490F1971D5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{265EC8A8-1F99-4A69-B097-66490F1971D5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{265EC8A8-1F99-4A69-B097-66490F1971D5}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE

+ 4 - 1
Assembly-CSharp/Assembly-CSharp.csproj

@@ -4,7 +4,7 @@
   <PropertyGroup>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProjectGuid>{188ABBD5-5112-41C6-8EA9-ED44648D9E67}</ProjectGuid>
+    <ProjectGuid>{265EC8A8-1F99-4A69-B097-66490F1971D5}</ProjectGuid>
     <OutputType>Library</OutputType>
     <RootNamespace>Assembly-CSharp</RootNamespace>
     <AssemblyName>Assembly-CSharp</AssemblyName>
@@ -407,6 +407,8 @@
     <Compile Include="GizmoObject.cs" />
     <Compile Include="GizmoRender.cs" />
     <Compile Include="GizmoRenderTarget.cs" />
+    <Compile Include="GravityControlWindow.cs" />
+    <Compile Include="GravityTransformControl.cs" />
     <Compile Include="HairLongWindow.cs" />
     <Compile Include="HairMode.cs" />
     <Compile Include="Hand.cs" />
@@ -1062,6 +1064,7 @@
     <Compile Include="SubProp.cs" />
     <Compile Include="SubSlotEditItem.cs" />
     <Compile Include="SubSlotEditManager.cs" />
+    <Compile Include="SubtitlesDisplayManager.cs" />
     <Compile Include="SystemDialog.cs" />
     <Compile Include="SystemInfoHUD.cs" />
     <Compile Include="SystemShortcut.cs" />

+ 1 - 1
Assembly-CSharp/BaseKagManager.cs

@@ -4093,7 +4093,7 @@ public class BaseKagManager : IDisposable
 	public void Serialize(BinaryWriter binary)
 	{
 		binary.Write("CM3D2_KAG");
-		binary.Write(1130);
+		binary.Write(1140);
 		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(1130);
+				binaryWriter.Write(1140);
 				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(1130);
+				binaryWriter.Write(1140);
 				binaryWriter.Write(this.save_data_.Count);
 				foreach (KeyValuePair<string, Dictionary<string, Dictionary<string, string>>> keyValuePair3 in this.save_data_)
 				{

+ 4 - 4
Assembly-CSharp/CMSystem.cs

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

+ 3 - 3
Assembly-CSharp/CharacterMgr.cs

@@ -949,7 +949,7 @@ public class CharacterMgr : MonoBehaviour
 		BinaryWriter binaryWriter = new BinaryWriter(memoryStream);
 		string result = string.Empty;
 		binaryWriter.Write("CM3D2_PRESET_S");
-		binaryWriter.Write(1130);
+		binaryWriter.Write(1140);
 		binaryWriter.Write((char)presset_type);
 		maid.SerializePropLowCapacity(binaryWriter);
 		maid.SerializeMultiColor(binaryWriter);
@@ -966,7 +966,7 @@ public class CharacterMgr : MonoBehaviour
 		MemoryStream memoryStream = new MemoryStream();
 		BinaryWriter binaryWriter = new BinaryWriter(memoryStream);
 		binaryWriter.Write("CM3D2_PRESET");
-		binaryWriter.Write(1130);
+		binaryWriter.Write(1140);
 		binaryWriter.Write((int)f_type);
 		if (texture2D != null)
 		{
@@ -1246,7 +1246,7 @@ public class CharacterMgr : MonoBehaviour
 	public bool Serialize(BinaryWriter bwWrite)
 	{
 		bwWrite.Write("CM3D2_CHR_MGR");
-		bwWrite.Write(1130);
+		bwWrite.Write(1140);
 		this.m_PlayerStatus.Serialize(bwWrite);
 		bwWrite.Write(this.m_listStockMan.Count);
 		for (int i = 0; i < this.m_listStockMan.Count; i++)

+ 17 - 27
Assembly-CSharp/CharacterSelectMain.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.Runtime.CompilerServices;
 using com.workman.cm3d2.scene.dailyEtc;
 using MaidStatus;
 using PlayerStatus;
@@ -329,19 +330,12 @@ public class CharacterSelectMain : WfScreenChildren
 		}
 		else if (this.scene_chara_select_.select_type == SceneCharacterSelect.SelectType.VRKaraokeSelect)
 		{
-			this.chara_select_mgr_.SetCallBackMaidList(delegate(List<Maid> draw_maid_list)
+			CharacterSelectManager characterSelectManager = this.chara_select_mgr_;
+			if (CharacterSelectMain.<>f__mg$cache0 == null)
 			{
-				List<Maid> list3 = new List<Maid>();
-				CharacterSelectManager.DefaultMaidList(list3);
-				for (int m = 0; m < list3.Count; m++)
-				{
-					Maid maid = list3[m];
-					if (maid.status.heroineType != HeroineType.Sub)
-					{
-						draw_maid_list.Add(maid);
-					}
-				}
-			});
+				CharacterSelectMain.<>f__mg$cache0 = new CharacterSelectManager.CallBackMaidList(KaraokeDataManager.GetMaidListKaraoke);
+			}
+			characterSelectManager.SetCallBackMaidList(CharacterSelectMain.<>f__mg$cache0);
 			this.chara_select_mgr_.SetCallBackCallBackOnSelect(new CharacterSelectManager.CallBackOnSelect(this.OnSelectChara));
 			this.chara_select_mgr_.Create(CharacterSelectManager.Type.Select, 3, true);
 			if (this.chara_select_mgr_.maid_list_count == 1)
@@ -420,22 +414,12 @@ public class CharacterSelectMain : WfScreenChildren
 	private void OnCallAdditionalType()
 	{
 		Debug.Log("メイドをアクティブ化させるスロット : " + this.scene_chara_select_.select_maid_slot);
-		this.chara_select_mgr_.SetCallBackMaidList(delegate(List<Maid> draw_maid_list)
+		CharacterSelectManager characterSelectManager = this.chara_select_mgr_;
+		if (CharacterSelectMain.<>f__mg$cache1 == null)
 		{
-			List<Maid> list = new List<Maid>();
-			CharacterSelectManager.DefaultMaidList(list);
-			for (int j = 0; j < list.Count; j++)
-			{
-				Maid maid = list[j];
-				if (maid.status.heroineType != HeroineType.Sub)
-				{
-					if (maid.ActiveSlotNo == -1)
-					{
-						draw_maid_list.Add(maid);
-					}
-				}
-			}
-		});
+			CharacterSelectMain.<>f__mg$cache1 = new CharacterSelectManager.CallBackMaidList(KaraokeDataManager.GetMaidListAdditional);
+		}
+		characterSelectManager.SetCallBackMaidList(CharacterSelectMain.<>f__mg$cache1);
 		this.chara_select_mgr_.SetCallBackCallBackOnSelect(new CharacterSelectManager.CallBackOnSelect(this.OnSelectChara));
 		this.chara_select_mgr_.Create(CharacterSelectManager.Type.Select, 3, true);
 		if (this.chara_select_mgr_.maid_list_count == 1)
@@ -712,4 +696,10 @@ public class CharacterSelectMain : WfScreenChildren
 	private bool auto_select_;
 
 	private FFNameDialog ovr_dance_cam_dlg_;
+
+	[CompilerGenerated]
+	private static CharacterSelectManager.CallBackMaidList <>f__mg$cache0;
+
+	[CompilerGenerated]
+	private static CharacterSelectManager.CallBackMaidList <>f__mg$cache1;
 }

+ 2 - 2
Assembly-CSharp/ControllerShortcutSettingData.cs

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

+ 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(1130);
+		binary.Write(1140);
 		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(1130);
+		f_bw.Write(1140);
 		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(1130);
+		f_bw.Write(1140);
 		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, 1130);
+				this.m_Colliders[i].Serialize(f_bw, 1140);
 			}
 		}
 		this.m_ColliderFileName = f_strFileName;

+ 2 - 2
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(1130);
+		f_bw.Write(1140);
 		f_bw.Write(this.m_fPanierRadius);
 		this.SerializeWriteAnimationCurve(f_bw, this.m_PanierRadiusDistrib);
 		int num = (this.m_PanierRadiusDistribGroup == null) ? 0 : this.m_PanierRadiusDistribGroup.Length;
@@ -539,7 +539,7 @@ public class DynamicSkirtBone : MonoBehaviour
 		}
 	}
 
-	private void UpdateParameters()
+	public void UpdateParameters()
 	{
 		bool flag = this.m_PanierRadiusDistrib != null && this.m_PanierRadiusDistrib.length != 0;
 		bool flag2 = this.m_PanierForceDistrib != null && this.m_PanierForceDistrib.length != 0;

+ 1 - 1
Assembly-CSharp/EditMod.cs

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

+ 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(1130);
+		brWrite.Write(1140);
 		brWrite.Write("5");
 		int num = 0;
 		for (int i = 0; i < this.m_FacilityArray.Count; i++)

+ 2 - 2
Assembly-CSharp/GameMain.cs

@@ -666,7 +666,7 @@ public class GameMain : MonoSingleton<GameMain>
 		serializeHeader.nMaidNum = this.m_CharacterMgr.GetStockMaidCount();
 		serializeHeader.strComment = f_strComment;
 		binaryWriter.Write("COM3D2_SAVE");
-		binaryWriter.Write(1130);
+		binaryWriter.Write(1140);
 		this.SerializeWriteHeader(binaryWriter, serializeHeader);
 		binaryWriter.Write("bookmark_kk_01");
 		GameMain.BinaryBookmark binaryBookmark = new GameMain.BinaryBookmark(binaryWriter);
@@ -780,7 +780,7 @@ public class GameMain : MonoSingleton<GameMain>
 		MemoryStream memoryStream = new MemoryStream();
 		BinaryWriter binaryWriter = new BinaryWriter(memoryStream);
 		binaryWriter.Write("COM3D2_SAVE");
-		binaryWriter.Write(1130);
+		binaryWriter.Write(1140);
 		this.SerializeWriteHeader(binaryWriter, saveDataHeader);
 		binaryWriter.Write(array, (int)saveDataHeader.lHeaderSize, (int)((long)array.Length - saveDataHeader.lHeaderSize));
 		File.WriteAllBytes(path, memoryStream.ToArray());

+ 2 - 2
Assembly-CSharp/GameUty.cs

@@ -912,14 +912,14 @@ public class GameUty
 
 	public static string GetBuildVersionText()
 	{
-		int num = 1130;
+		int num = 1140;
 		return (num >= 1000) ? ((float)num / 1000f).ToString("F2") : ((float)num / 100f).ToString("F2");
 	}
 
 	public static string GetGameVersionText()
 	{
 		string text = "COM3D2x64.exe";
-		int num = 1130;
+		int num = 1140;
 		string path = Path.GetFullPath(".\\") + "update.lst";
 		string[] array = new string[0];
 		if (File.Exists(path))

+ 340 - 0
Assembly-CSharp/GravityControlWindow.cs

@@ -0,0 +1,340 @@
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+using wf;
+
+public class GravityControlWindow : BaseMaidPhotoWindow
+{
+	public override void Awake()
+	{
+		base.Awake();
+		this.selectGravityData = null;
+		this.editSubWindow = this.subWindows[0];
+		this.noCharaActive = base.GetComponentInChildren<PhotoNoCharaActive>();
+		foreach (GravityControlWindow.GravityData gravityData in this.gravityDatas)
+		{
+			NDebug.Assert(!string.IsNullOrEmpty(gravityData.categoryName), "GravityControlWindow 初期化エラーcategoryNameが不正です");
+			NDebug.Assert(0 < gravityData.slotIds.Length, "GravityControlWindow 初期化エラーslotIdsが不正です");
+			EventDelegate.Add(gravityData.button.onClick, delegate
+			{
+				for (int j = 0; j < this.gravityDatas.Length; j++)
+				{
+					if (this.gravityDatas[j].button == UIButton.current)
+					{
+						if (this.gravityDatas[j] == this.selectGravityData)
+						{
+							this.CloseEditSubWindow();
+						}
+						else
+						{
+							this.OnSelectCategoryButton(this.gravityDatas[j]);
+						}
+						break;
+					}
+				}
+			});
+		}
+		this.checkBoxEnabledGravityControl.onClick.Add(delegate(WFCheckBox check_box)
+		{
+			if (base.mgr.select_maid == null || base.mgr.select_maid.boMAN || this.selectGravityData == null)
+			{
+				return;
+			}
+			GravityTransformControl gravityTransformControl = this.GetGravityTransformControl(base.mgr.select_maid, this.selectGravityData.categoryName);
+			if (gravityTransformControl == null)
+			{
+				return;
+			}
+			gravityTransformControl.isEnabled = check_box.check;
+		});
+		this.UpdateChildren();
+	}
+
+	public override void Start()
+	{
+		base.Start();
+		this.noCharaActive.ChangeMode(true, true);
+		this.editSubWindow.SetButtonEnabled(BasePhotoSubWindow.BtnType.End, true, false);
+		this.editSubWindow.GetButtonOnClickEventList(BasePhotoSubWindow.BtnType.End).Add(new Action(this.CloseEditSubWindow));
+		this.editSubWindow.visible = false;
+	}
+
+	public override void OnMaidAddEvent(Maid maid, bool is_deserialize_load)
+	{
+		if (maid == null || maid.boMAN)
+		{
+			return;
+		}
+		Dictionary<string, GravityTransformControl> dictionary = new Dictionary<string, GravityTransformControl>();
+		foreach (GravityControlWindow.GravityData gravityData in this.gravityDatas)
+		{
+			string text = "GravityDatas_" + maid.status.guid + "_" + gravityData.categoryName;
+			Transform bone = maid.body0.GetBone("Bip01");
+			Transform transform = bone.Find(text);
+			if (transform == null)
+			{
+				GameObject gameObject = new GameObject();
+				gameObject.name = text;
+				gameObject.transform.SetParent(bone, false);
+				gameObject.transform.SetParent(maid.transform, true);
+				gameObject.transform.localScale = Vector3.one;
+				gameObject.transform.rotation = Quaternion.identity;
+				GameObject gameObject2 = new GameObject();
+				gameObject2.transform.SetParent(gameObject.transform, false);
+				gameObject2.name = text;
+				transform = gameObject2.transform;
+			}
+			else
+			{
+				transform = transform.transform.GetChild(0);
+			}
+			GravityTransformControl gravityTransformControl = transform.gameObject.AddComponent<GravityTransformControl>();
+			gravityTransformControl.transTargetObject = new PhotoTransTargetObject(transform.gameObject, text, PhotoTransTargetObject.Type.Prefab, Vector2.one);
+			gravityTransformControl.SetTargetSlods(gravityData.slotIds);
+			gravityTransformControl.forceRate = gravityData.forceRate;
+			dictionary.Add(gravityData.categoryName, gravityTransformControl);
+			Dictionary<string, string> maidStoreData = base.GetMaidStoreData(maid);
+			string categoryName = gravityData.categoryName;
+			if (gravityTransformControl.isValid)
+			{
+				if (maidStoreData.ContainsKey(categoryName))
+				{
+					gravityTransformControl.isEnabled = bool.Parse(maidStoreData[categoryName]);
+					gravityTransformControl.transform.localPosition = Parse.Vector3(maidStoreData[categoryName + "pos"]);
+				}
+			}
+			else if (maidStoreData != null && maidStoreData.ContainsKey(categoryName))
+			{
+				maidStoreData.Remove(categoryName);
+				maidStoreData.Remove(categoryName + "pos");
+			}
+		}
+		this.activeMaidControllerList.Add(maid.status.guid, dictionary);
+		this.noCharaActive.ChangeMode(false, true);
+	}
+
+	public override void OnMaidRemoveEvent(Maid maid)
+	{
+		if (maid == null || maid.boMAN)
+		{
+			return;
+		}
+		foreach (GravityControlWindow.GravityData gravityData in this.gravityDatas)
+		{
+			GravityTransformControl gravityTransformControl = this.GetGravityTransformControl(maid, gravityData.categoryName);
+			GameObject gameObject = gravityTransformControl.transform.parent.gameObject;
+			if (gravityTransformControl.transTargetObject != null)
+			{
+				gravityTransformControl.transTargetObject.Delete();
+			}
+			UnityEngine.Object.DestroyImmediate(gameObject);
+		}
+		if (this.activeMaidControllerList.ContainsKey(maid.status.guid))
+		{
+			this.activeMaidControllerList.Remove(maid.status.guid);
+		}
+		if (this.activeMaidControllerList.Count <= 0)
+		{
+			this.noCharaActive.ChangeMode(true, true);
+		}
+	}
+
+	public override void OnMaidChangeEvent(Maid maid)
+	{
+		base.OnMaidChangeEvent(maid);
+		foreach (GravityControlWindow.GravityData gravityData in this.gravityDatas)
+		{
+			GravityTransformControl gravityTransformControl = (!(maid == null) && !maid.boMAN) ? this.GetGravityTransformControl(maid, gravityData.categoryName) : null;
+			bool flag = !(gravityTransformControl == null) && gravityTransformControl.isValid;
+			if (!flag)
+			{
+				gravityData.button.SetSelect(false);
+			}
+			gravityData.button.isEnabled = flag;
+		}
+		if (this.selectGravityData != null)
+		{
+			this.OnSelectCategoryButton(this.selectGravityData);
+		}
+	}
+
+	public void OnChangeMekure()
+	{
+		if (base.mgr.select_maid == null || base.mgr.select_maid.boMAN)
+		{
+			return;
+		}
+		foreach (GravityControlWindow.GravityData gravityData in this.gravityDatas)
+		{
+			GravityTransformControl gravityTransformControl = this.GetGravityTransformControl(base.mgr.select_maid, gravityData.categoryName);
+			if (!(gravityTransformControl == null))
+			{
+				gravityTransformControl.OnChangeMekure();
+			}
+		}
+	}
+
+	public override void OnSerializeEvent()
+	{
+		List<string> maidStoreGuidList = base.mgr.GetMaidStoreGuidList();
+		foreach (string text in maidStoreGuidList)
+		{
+			Dictionary<string, string> maidStoreData = base.GetMaidStoreData(text);
+			if (maidStoreData != null)
+			{
+				foreach (GravityControlWindow.GravityData gravityData in this.gravityDatas)
+				{
+					string categoryName = gravityData.categoryName;
+					GravityTransformControl gravityTransformControl = this.GetGravityTransformControl(text, gravityData.categoryName);
+					if (!(gravityTransformControl == null))
+					{
+						if (gravityTransformControl.isValid)
+						{
+							maidStoreData[categoryName] = gravityTransformControl.isEnabled.ToString();
+							maidStoreData[categoryName + "pos"] = gravityTransformControl.transform.localPosition.ToString("G9");
+						}
+						else
+						{
+							maidStoreData[categoryName] = false.ToString();
+							maidStoreData[categoryName + "pos"] = Vector3.zero.ToString("G9");
+						}
+					}
+				}
+			}
+		}
+	}
+
+	public override void OnDeserializeEvent()
+	{
+	}
+
+	private void OnSelectCategoryButton(GravityControlWindow.GravityData selectedData)
+	{
+		this.CloseEditSubWindow();
+		if (base.mgr.select_maid == null || base.mgr.select_maid.boMAN || selectedData == null || !selectedData.button.isEnabled)
+		{
+			return;
+		}
+		GravityTransformControl gravityTransformControl = this.GetGravityTransformControl(base.mgr.select_maid, selectedData.categoryName);
+		if (gravityTransformControl == null)
+		{
+			return;
+		}
+		this.transInput.SetTarget(gravityTransformControl.transform, Vector3.zero);
+		this.checkBoxEnabledGravityControl.check = gravityTransformControl.isEnabled;
+		gravityTransformControl.visibleTransTargetObject = true;
+		this.editSubWindow.visible = true;
+		selectedData.isSelectedButton = true;
+		this.selectGravityData = selectedData;
+	}
+
+	private void CloseEditSubWindow()
+	{
+		if (this.selectGravityData != null)
+		{
+			this.selectGravityData.isSelectedButton = false;
+			this.selectGravityData.button.SetSelect(false);
+			this.editSubWindow.visible = false;
+		}
+		foreach (KeyValuePair<string, Dictionary<string, GravityTransformControl>> keyValuePair in this.activeMaidControllerList)
+		{
+			foreach (KeyValuePair<string, GravityTransformControl> keyValuePair2 in keyValuePair.Value)
+			{
+				keyValuePair2.Value.visibleTransTargetObject = false;
+			}
+		}
+		this.selectGravityData = null;
+	}
+
+	private GravityTransformControl GetGravityTransformControl(Maid maid, string gravityCategoryName)
+	{
+		if (maid == null)
+		{
+			return null;
+		}
+		return this.GetGravityTransformControl(maid.status.guid, gravityCategoryName);
+	}
+
+	private GravityTransformControl GetGravityTransformControl(string maidGuid, string gravityCategoryName)
+	{
+		GravityTransformControl result = null;
+		if (this.activeMaidControllerList.ContainsKey(maidGuid))
+		{
+			result = ((!this.activeMaidControllerList[maidGuid].ContainsKey(gravityCategoryName)) ? null : this.activeMaidControllerList[maidGuid][gravityCategoryName]);
+		}
+		return result;
+	}
+
+	[SerializeField]
+	private GravityControlWindow.GravityData[] gravityDatas;
+
+	[SerializeField]
+	private WFCheckBox checkBoxEnabledGravityControl;
+
+	[SerializeField]
+	private PhotTransInput transInput;
+
+	private GravityControlWindow.GravityData selectGravityData;
+
+	private BasePhotoSubWindow editSubWindow;
+
+	private PhotoNoCharaActive noCharaActive;
+
+	private Dictionary<string, Dictionary<string, GravityTransformControl>> activeMaidControllerList = new Dictionary<string, Dictionary<string, GravityTransformControl>>();
+
+	[Serializable]
+	private class GravityData
+	{
+		public TBody.SlotID[] slotIds
+		{
+			get
+			{
+				if (this.slotIds_ == null && this.slotIdNames != null)
+				{
+					this.slotIds_ = new TBody.SlotID[this.slotIdNames.Length];
+					for (int i = 0; i < this.slotIdNames.Length; i++)
+					{
+						this.slotIds_[i] = (TBody.SlotID)Enum.Parse(typeof(TBody.SlotID), this.slotIdNames[i]);
+					}
+				}
+				return this.slotIds_;
+			}
+		}
+
+		public bool isSelectedButton
+		{
+			get
+			{
+				return this.button.isSelected;
+			}
+			set
+			{
+				if (value)
+				{
+					BoxCollider component = this.button.GetComponent<BoxCollider>();
+					Vector3 size = component.size;
+					this.button.SetSelect(true);
+					component.size = size;
+				}
+				else
+				{
+					this.button.SetSelect(false);
+				}
+			}
+		}
+
+		[SerializeField]
+		public string categoryName;
+
+		[SerializeField]
+		public float forceRate;
+
+		[SerializeField]
+		public UIWFTabButton button;
+
+		[SerializeField]
+		private string[] slotIdNames;
+
+		private TBody.SlotID[] slotIds_;
+	}
+}

+ 167 - 0
Assembly-CSharp/GravityTransformControl.cs

@@ -0,0 +1,167 @@
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+using wf;
+
+public class GravityTransformControl : MonoBehaviour
+{
+	public bool isEnabled
+	{
+		get
+		{
+			return this.isEnabled_;
+		}
+		set
+		{
+			this.isEnabled_ = false;
+			if (value && this.isValid)
+			{
+				this.isEnabled_ = true;
+			}
+		}
+	}
+
+	public bool isValid
+	{
+		get
+		{
+			return (this.dynamickirtBones != null && this.dynamickirtBones.Count != 0) || (this.dynamicBones != null && this.dynamicBones.Count != 0);
+		}
+	}
+
+	public bool visibleTransTargetObject
+	{
+		get
+		{
+			return this.transTargetObject != null && this.transTargetObject.axis_obj.Visible;
+		}
+		set
+		{
+			if (this.transTargetObject != null)
+			{
+				this.transTargetObject.axis_obj.Visible = value;
+			}
+		}
+	}
+
+	private void Awake()
+	{
+		if (this.maidBody != null)
+		{
+			return;
+		}
+		Transform parent = base.transform.parent;
+		while (parent != null)
+		{
+			this.maidBody = parent.GetComponent<TBody>();
+			if (this.maidBody != null)
+			{
+				break;
+			}
+			parent = parent.parent;
+		}
+	}
+
+	public void SetTargetSlods(TBody.SlotID[] slotIds)
+	{
+		this.Awake();
+		this.targetSloatIds = slotIds;
+		this.dynamickirtBones.Clear();
+		this.dynamicBones.Clear();
+		foreach (TBody.SlotID index in slotIds)
+		{
+			if (this.maidBody.goSlot[(int)index] != null && !(this.maidBody.goSlot[(int)index].obj == null))
+			{
+				DynamicSkirtBone component = this.maidBody.goSlot[(int)index].obj.GetComponent<DynamicSkirtBone>();
+				if (component != null)
+				{
+					this.dynamickirtBones.Add(new KeyValuePair<DynamicSkirtBone, Vector3>(component, component.m_vGravity));
+				}
+				DynamicBone component2 = this.maidBody.goSlot[(int)index].obj.GetComponent<DynamicBone>();
+				if (component2 != null)
+				{
+					this.dynamicBones.Add(new KeyValuePair<DynamicBone, Vector3>(component2, component2.m_Force));
+				}
+			}
+		}
+	}
+
+	public bool OnChangeMekure()
+	{
+		bool flag = false;
+		foreach (KeyValuePair<DynamicSkirtBone, Vector3> keyValuePair in this.dynamickirtBones)
+		{
+			if (keyValuePair.Key == null)
+			{
+				flag = true;
+				break;
+			}
+		}
+		if (!flag)
+		{
+			foreach (KeyValuePair<DynamicBone, Vector3> keyValuePair2 in this.dynamicBones)
+			{
+				if (keyValuePair2.Key == null)
+				{
+					flag = true;
+					break;
+				}
+			}
+		}
+		if (flag)
+		{
+			this.SetTargetSlods(this.targetSloatIds);
+		}
+		return true;
+	}
+
+	public void Update()
+	{
+		Vector3 b = Vector3.zero;
+		Vector3 vector = base.transform.localPosition;
+		vector = new Vector3(Mathf.Max(Mathf.Min(1f, vector.x), -1f), Mathf.Max(Mathf.Min(1f, vector.y), -1f), Mathf.Max(Mathf.Min(1f, vector.z), -1f));
+		base.transform.localPosition = vector;
+		if (!this.isEnabled)
+		{
+			vector = Vector3.zero;
+		}
+		if (!wf.Math.Approximately(vector, Vector3.zero))
+		{
+			b = vector * this.forceRate;
+		}
+		foreach (KeyValuePair<DynamicSkirtBone, Vector3> keyValuePair in this.dynamickirtBones)
+		{
+			DynamicSkirtBone key = keyValuePair.Key;
+			Vector3 vector2 = keyValuePair.Value + b;
+			if (!wf.Math.Approximately(key.m_vGravity, vector2))
+			{
+				key.m_vGravity = vector2;
+				key.UpdateParameters();
+			}
+		}
+		foreach (KeyValuePair<DynamicBone, Vector3> keyValuePair2 in this.dynamicBones)
+		{
+			DynamicBone key2 = keyValuePair2.Key;
+			Vector3 vector3 = keyValuePair2.Value + b;
+			if (!wf.Math.Approximately(key2.m_Force, vector3))
+			{
+				key2.m_Force = vector3;
+				key2.UpdateParameters();
+			}
+		}
+	}
+
+	public float forceRate = 1f;
+
+	public PhotoTransTargetObject transTargetObject;
+
+	private TBody maidBody;
+
+	private TBody.SlotID[] targetSloatIds;
+
+	private List<KeyValuePair<DynamicSkirtBone, Vector3>> dynamickirtBones = new List<KeyValuePair<DynamicSkirtBone, Vector3>>();
+
+	private List<KeyValuePair<DynamicBone, Vector3>> dynamicBones = new List<KeyValuePair<DynamicBone, Vector3>>();
+
+	private bool isEnabled_;
+}

+ 2 - 2
Assembly-CSharp/HandSignShortcut.cs

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

+ 42 - 7
Assembly-CSharp/IKMgrData.cs

@@ -5,6 +5,8 @@ using UnityEngine;
 [Serializable]
 public class IKMgrData
 {
+	public TBody Body { get; private set; }
+
 	public Transform KinematicTgt
 	{
 		get
@@ -109,8 +111,20 @@ public class IKMgrData
 		this.KinematicTgt.rotation = tgt_rot * Quaternion.Euler(tgt_offset);
 	}
 
-	private void ApplyIKSetting(IKMgrData.IKParam data, List<TBodySkin> goSlot)
+	private void ApplyIKSetting(IKMgrData.IKParam data)
 	{
+		if (this.IsExecLate)
+		{
+			return;
+		}
+		if (data.TgtMaid && data.TgtMaid != this.Body.maid && !data.TgtMaid.body0.LateUpdateEnd)
+		{
+			TBody body = data.TgtMaid.body0;
+			body.OnLateUpdateEnd = (Action)Delegate.Combine(body.OnLateUpdateEnd, new Action(this.AfterExec));
+			data.IsIKExec = false;
+			this.IsExecLate = true;
+			return;
+		}
 		data.IsIKExec = true;
 		if (data.Target != null)
 		{
@@ -136,7 +150,7 @@ public class IKMgrData
 		}
 		else if (data.Tgt_AttachName != string.Empty)
 		{
-			if (goSlot[data.Tgt_AttachSlot].morph != null)
+			if (this.Body.goSlot[data.Tgt_AttachSlot].morph != null)
 			{
 				if (data.TgtMaid != null && data.TgtMaid.body0 != null)
 				{
@@ -179,9 +193,27 @@ public class IKMgrData
 		}
 	}
 
-	public void SetKinematicTgt(Transform tgt, int weight = 3)
+	private void AfterExec()
+	{
+		this.IKExec();
+		if (!this.Body.IKExecLate)
+		{
+			this.Body.AutoTwist();
+			for (int i = 0; i < this.Body.goSlot.Count; i++)
+			{
+				if (this.Body.goSlot[i].obj != null)
+				{
+					this.Body.goSlot[i].CopyTrans();
+				}
+				this.Body.goSlot[i].Update();
+			}
+		}
+	}
+
+	public void SetKinematicTgt(Transform tgt, TBody body, int weight = 3)
 	{
 		this.m_KinematicTgt = tgt;
+		this.Body = body;
 		this.m_KinematicList.Clear();
 		int num = 0;
 		Transform transform = tgt;
@@ -220,11 +252,12 @@ public class IKMgrData
 		return this.PointIK;
 	}
 
-	public void IKExec(List<TBodySkin> goSlot)
+	public void IKExec()
 	{
-		this.ApplyIKSetting(this.PointIK, goSlot);
-		this.ApplyIKSetting(this.RotateIK, goSlot);
-		if (this.IsIkExec)
+		this.IsExecLate = false;
+		this.ApplyIKSetting(this.PointIK);
+		this.ApplyIKSetting(this.RotateIK);
+		if (this.IsIkExec && !this.IsExecLate)
 		{
 			if (this.m_AttachPointData != null)
 			{
@@ -306,6 +339,8 @@ public class IKMgrData
 
 	private IKMgrData.AttachPointIKData m_AttachPointData;
 
+	public bool IsExecLate;
+
 	public enum IKAttachType
 	{
 		Point,

+ 62 - 0
Assembly-CSharp/KaraokeDataManager.cs

@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.Text;
+using MaidStatus;
 using UnityEngine;
 using UnityEngine.EventSystems;
 
@@ -200,6 +201,65 @@ public class KaraokeDataManager : MonoBehaviour
 		});
 	}
 
+	public static bool IsEnablePersonalKaraoke003(Maid maid)
+	{
+		return KaraokeDataManager.IsEnablePersonalKaraoke003(maid.status.personal.uniqueName);
+	}
+
+	public static bool IsEnablePersonalKaraoke003(string personalUniqueName)
+	{
+		List<string> list = new List<string>
+		{
+			"Muku",
+			"Majime",
+			"Rindere",
+			"Pure",
+			"Cool",
+			"Pride"
+		};
+		return list.Contains(personalUniqueName);
+	}
+
+	public static void GetMaidListAdditional(List<Maid> draw_list)
+	{
+		List<Maid> list = new List<Maid>();
+		List<Maid> list2 = new List<Maid>();
+		CharacterSelectManager.DefaultMaidList(list2);
+		for (int i = 0; i < list2.Count; i++)
+		{
+			Maid maid = list2[i];
+			if (maid.status.heroineType != HeroineType.Sub)
+			{
+				if (maid.ActiveSlotNo == -1)
+				{
+					if (KaraokeDataManager.IsEnablePersonalKaraoke003(maid))
+					{
+						list.Add(maid);
+					}
+				}
+			}
+		}
+		draw_list.Clear();
+		draw_list.AddRange(list);
+	}
+
+	public static void GetMaidListKaraoke(List<Maid> draw_list)
+	{
+		List<Maid> list = new List<Maid>();
+		List<Maid> list2 = new List<Maid>();
+		CharacterSelectManager.DefaultMaidList(list2);
+		for (int i = 0; i < list2.Count; i++)
+		{
+			Maid maid = list2[i];
+			if (maid.status.heroineType != HeroineType.Sub)
+			{
+				list.Add(maid);
+			}
+		}
+		draw_list.Clear();
+		draw_list.AddRange(list);
+	}
+
 	private void Awake()
 	{
 		this.LoadMusicData();
@@ -726,6 +786,8 @@ public class KaraokeDataManager : MonoBehaviour
 		public string pluginType = string.Empty;
 
 		private bool isEnableID;
+
+		public static readonly int ID_BUTTON_MAID_ADDITIONAL = 140;
 	}
 
 	public class MusicData

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

@@ -788,7 +788,7 @@ namespace Kasizuki
 		public void Serialize(BinaryWriter bw)
 		{
 			bw.Write("COM3D2_KASIZUKI");
-			bw.Write(1130);
+			bw.Write(1140);
 			this.SerializeOriginHeader(bw);
 			foreach (KeyValuePair<int, KasizukiManager.SaveData> keyValuePair in this.m_SaveDataArray)
 			{

+ 3 - 3
Assembly-CSharp/Maid.cs

@@ -1205,7 +1205,7 @@ public class Maid : MonoBehaviour
 	public bool SerializeProp(BinaryWriter f_bwWrite)
 	{
 		f_bwWrite.Write("CM3D2_MPROP_LIST");
-		f_bwWrite.Write(1130);
+		f_bwWrite.Write(1140);
 		f_bwWrite.Write(this.m_dicMaidProp.Count);
 		foreach (KeyValuePair<string, MaidProp> keyValuePair in this.m_dicMaidProp)
 		{
@@ -1237,7 +1237,7 @@ public class Maid : MonoBehaviour
 	public bool SerializeMisc(BinaryWriter f_bwWrite)
 	{
 		f_bwWrite.Write("CM3D2_MAID_MISC");
-		f_bwWrite.Write(1130);
+		f_bwWrite.Write(1140);
 		f_bwWrite.Write(this.m_nActiveSlotNo);
 		if (this.m_texIcon != null)
 		{
@@ -1262,7 +1262,7 @@ public class Maid : MonoBehaviour
 	public bool SerializeBody(BinaryWriter f_bwWrite)
 	{
 		f_bwWrite.Write("CM3D2_MAID_BODY");
-		f_bwWrite.Write(1130);
+		f_bwWrite.Write(1140);
 		return true;
 	}
 

+ 1 - 1
Assembly-CSharp/MaidParts.cs

@@ -35,7 +35,7 @@ public class MaidParts : MonoBehaviour
 	public unsafe bool Serialize(BinaryWriter f_bwWrite)
 	{
 		f_bwWrite.Write("CM3D2_MULTI_COL");
-		f_bwWrite.Write(1130);
+		f_bwWrite.Write(1140);
 		f_bwWrite.Write(this.m_aryPartsColor.Length);
 		for (int i = 0; i < this.m_aryPartsColor.Length; i++)
 		{

+ 1 - 1
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(1130);
+		f_bwWrite.Write(1140);
 		f_bwWrite.Write(this.idx);
 		f_bwWrite.Write(this.name);
 		f_bwWrite.Write(this.type);

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

@@ -1199,7 +1199,7 @@ namespace MaidStatus
 		public void Serialize(BinaryWriter binary)
 		{
 			binary.Write("CM3D2_MAID_STATUS");
-			binary.Write(1130);
+			binary.Write(1140);
 			binary.Write(this.guid);
 			binary.Write(this.creationTime);
 			binary.Write((short)this.heroineType);

+ 1 - 1
Assembly-CSharp/Menu.cs

@@ -747,7 +747,7 @@ public class Menu : MonoBehaviour
 			Directory.CreateDirectory(text);
 		}
 		StreamWriter streamWriter = new StreamWriter(text + "\\" + text2 + ".txt", false, Encoding.UTF8);
-		streamWriter.WriteLine("出力バージョン\t" + 1130);
+		streamWriter.WriteLine("出力バージョン\t" + 1140);
 		streamWriter.WriteLine("基本アイテム\t" + filename.Replace(" ", ":"));
 		try
 		{

+ 76 - 58
Assembly-CSharp/MessageClass.cs

@@ -19,71 +19,25 @@ public class MessageClass
 		this.hitret_sprite_.alpha = 0f;
 	}
 
-	public void SetText(string name, string text, string voice_file, int voice_pitch)
-	{
-		this.exit_wait_count_ = -1;
-		this.name_label_.text = name;
-		this.ch_anime_data_.Clear();
-		this.ch_anime_data_.text_info = new StringInfo(MessageClass.GetWrapString(this.message_label_, text));
-		this.ch_anime_data_.type = MessageClass.ChAnimeData.Type.Execution;
-		this.ch_anime_data_.start_time = GameMain.tick_count;
-		this.ch_anime_data_.start_time = this.ch_anime_data_.start_time - this.ch_wait;
-		this.hitret_sprite_.alpha = 0f;
-		this.message_mgr_.AddBackLog(name, this.ch_anime_data_.text_info.String, voice_file, voice_pitch);
-		this.Update();
-	}
-
-	public void Clear()
-	{
-		this.exit_wait_count_ = -1;
-		UILabel uilabel = this.message_label_;
-		string empty = string.Empty;
-		this.name_label_.text = empty;
-		uilabel.text = empty;
-		this.ch_anime_data_.Clear();
-		this.hitret_sprite_.alpha = 0f;
-	}
-
-	public void FinishChAnime()
-	{
-		if (this.ch_anime_data_.type == MessageClass.ChAnimeData.Type.Null)
-		{
-			return;
-		}
-		this.message_label_.text = this.ch_anime_data_.text_info.String;
-		this.ch_anime_data_.Clear();
-		this.hitret_sprite_.alpha = 255f;
-		this.exit_wait_count_ = GameMain.tick_count;
-	}
-
-	public void Update()
+	public static KeyValuePair<string, string> GetTranslationText(string baseText)
 	{
-		if (this.ch_anime_data_.type == MessageClass.ChAnimeData.Type.Null)
+		if (string.IsNullOrEmpty(baseText))
 		{
-			return;
-		}
-		if (this.skip_mode || this.ch_wait <= 0)
-		{
-			this.FinishChAnime();
-			return;
+			return new KeyValuePair<string, string>(string.Empty, string.Empty);
 		}
-		int num = Mathf.Max(0, Mathf.Min((GameMain.tick_count - this.ch_anime_data_.start_time) / this.ch_wait, this.ch_anime_data_.text_info.LengthInTextElements));
-		if (num == this.ch_anime_data_.text_info.LengthInTextElements)
+		int num = baseText.IndexOf("<E>");
+		if (num < 0)
 		{
-			this.FinishChAnime();
-		}
-		else
-		{
-			this.message_label_.text = this.ch_anime_data_.text_info.SubstringByTextElements(0, num);
+			num = baseText.IndexOf("<e>");
+			if (num < 0)
+			{
+				return new KeyValuePair<string, string>(baseText, string.Empty);
+			}
 		}
+		return new KeyValuePair<string, string>(baseText.Substring(0, num), baseText.Substring(num + 3, baseText.Length - (num + 3)));
 	}
 
-	public int GetExitWaitCount()
-	{
-		return (this.exit_wait_count_ >= 0) ? (GameMain.tick_count - this.exit_wait_count_) : this.exit_wait_count_;
-	}
-
-	private static string GetWrapString(UILabel draw_target, string text)
+	public static string GetWrapString(UILabel draw_target, string text)
 	{
 		string text2 = string.Empty;
 		draw_target.Wrap(text, out text2);
@@ -154,6 +108,70 @@ public class MessageClass
 		return text2;
 	}
 
+	public void SetText(string name, string text, string voice_file, int voice_pitch)
+	{
+		this.exit_wait_count_ = -1;
+		this.name_label_.text = name;
+		this.ch_anime_data_.Clear();
+		this.ch_anime_data_.text_info = new StringInfo(MessageClass.GetWrapString(this.message_label_, text));
+		this.ch_anime_data_.type = MessageClass.ChAnimeData.Type.Execution;
+		this.ch_anime_data_.start_time = GameMain.tick_count;
+		this.ch_anime_data_.start_time = this.ch_anime_data_.start_time - this.ch_wait;
+		this.hitret_sprite_.alpha = 0f;
+		this.message_mgr_.AddBackLog(name, this.ch_anime_data_.text_info.String, voice_file, voice_pitch);
+		this.Update();
+	}
+
+	public void Clear()
+	{
+		this.exit_wait_count_ = -1;
+		UILabel uilabel = this.message_label_;
+		string empty = string.Empty;
+		this.name_label_.text = empty;
+		uilabel.text = empty;
+		this.ch_anime_data_.Clear();
+		this.hitret_sprite_.alpha = 0f;
+	}
+
+	public void FinishChAnime()
+	{
+		if (this.ch_anime_data_.type == MessageClass.ChAnimeData.Type.Null)
+		{
+			return;
+		}
+		this.message_label_.text = this.ch_anime_data_.text_info.String;
+		this.ch_anime_data_.Clear();
+		this.hitret_sprite_.alpha = 255f;
+		this.exit_wait_count_ = GameMain.tick_count;
+	}
+
+	public void Update()
+	{
+		if (this.ch_anime_data_.type == MessageClass.ChAnimeData.Type.Null)
+		{
+			return;
+		}
+		if (this.skip_mode || this.ch_wait <= 0)
+		{
+			this.FinishChAnime();
+			return;
+		}
+		int num = Mathf.Max(0, Mathf.Min((GameMain.tick_count - this.ch_anime_data_.start_time) / this.ch_wait, this.ch_anime_data_.text_info.LengthInTextElements));
+		if (num == this.ch_anime_data_.text_info.LengthInTextElements)
+		{
+			this.FinishChAnime();
+		}
+		else
+		{
+			this.message_label_.text = this.ch_anime_data_.text_info.SubstringByTextElements(0, num);
+		}
+	}
+
+	public int GetExitWaitCount()
+	{
+		return (this.exit_wait_count_ >= 0) ? (GameMain.tick_count - this.exit_wait_count_) : this.exit_wait_count_;
+	}
+
 	public bool ch_anime_enabled
 	{
 		get

+ 1 - 1
Assembly-CSharp/Misc.cs

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

+ 1 - 1
Assembly-CSharp/ModCompile.cs

@@ -604,7 +604,7 @@ public class ModCompile : MonoBehaviour
 		MemoryStream memoryStream = new MemoryStream();
 		BinaryWriter binaryWriter = new BinaryWriter(memoryStream);
 		binaryWriter.Write("CM3D2_MESH");
-		binaryWriter.Write(1130);
+		binaryWriter.Write(1140);
 		string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(f_strMqoFile);
 		binaryWriter.Write(fileNameWithoutExtension);
 		binaryWriter.Write(exObjIn2.strName);

+ 26 - 2
Assembly-CSharp/ObjectCreateWindow.cs

@@ -105,6 +105,22 @@ public class ObjectCreateWindow : BaseMaidPhotoWindow
 				(this.selectData.customObject as PhotoCustomObjectPlane).backRenderingType = backRenderingType;
 			}
 		});
+		EventDelegate.Add(this.sphereBackDrawPopupList.onChange, delegate
+		{
+			if (this.selectData != null && this.selectData.customObject.type == BasePhotoCustomObject.Type.Sphere)
+			{
+				PhotoCustomObjectSphere.RenderingType renderingType = PhotoCustomObjectSphere.RenderingType.TwoSides;
+				if (UIPopupList.current.value.IndexOf("表面表示") == 0)
+				{
+					renderingType = PhotoCustomObjectSphere.RenderingType.Front;
+				}
+				else if (UIPopupList.current.value.IndexOf("裏面表示") == 0)
+				{
+					renderingType = PhotoCustomObjectSphere.RenderingType.Back;
+				}
+				(this.selectData.customObject as PhotoCustomObjectSphere).renderingType = renderingType;
+			}
+		});
 		this.camera_move_support_ = base.gameObject.AddComponent<WfCameraMoveSupport>();
 		this.scroll_view_ = NGUITools.FindInParents<UIScrollView>(this.objectListGrid.transform);
 		EventDelegate.Add(this.saveButton.onClick, new EventDelegate.Callback(this.OnClickSave));
@@ -245,15 +261,19 @@ public class ObjectCreateWindow : BaseMaidPhotoWindow
 		this.editScaleSlider.value = customObject.scale;
 		this.texColorPalette.ColorPalette.SetColor(customObject.textureColor);
 		this.texColorPalette.ColorPalette.UIUpdate();
+		this.planeUIParent.SetActive(false);
+		this.sphereUIParent.SetActive(false);
 		if (this.selectData.customObject.type == BasePhotoCustomObject.Type.Plane)
 		{
 			this.planeUIParent.SetActive(true);
 			PhotoCustomObjectPlane.BackRenderingType backRenderingType = (this.selectData.customObject as PhotoCustomObjectPlane).backRenderingType;
 			this.planeBackDrawPopupList.value = ((backRenderingType != PhotoCustomObjectPlane.BackRenderingType.Flip) ? ((backRenderingType != PhotoCustomObjectPlane.BackRenderingType.None) ? "鏡合わせ" : "透明") : "反転");
 		}
-		else
+		else if (this.selectData.customObject.type == BasePhotoCustomObject.Type.Sphere)
 		{
-			this.planeUIParent.SetActive(false);
+			this.sphereUIParent.SetActive(true);
+			PhotoCustomObjectSphere.RenderingType renderingType = (this.selectData.customObject as PhotoCustomObjectSphere).renderingType;
+			this.sphereBackDrawPopupList.value = ((renderingType != PhotoCustomObjectSphere.RenderingType.TwoSides) ? ((renderingType != PhotoCustomObjectSphere.RenderingType.Front) ? "裏面表示" : "表面表示") : "両面表示");
 		}
 	}
 
@@ -441,6 +461,10 @@ public class ObjectCreateWindow : BaseMaidPhotoWindow
 
 	public UIPopupList planeBackDrawPopupList;
 
+	public GameObject sphereUIParent;
+
+	public UIPopupList sphereBackDrawPopupList;
+
 	private Dictionary<int, BasePhotoCustomObject> buttonDic = new Dictionary<int, BasePhotoCustomObject>();
 
 	private List<ObjectCreateWindow.Data> target_list_ = new List<ObjectCreateWindow.Data>();

+ 2 - 2
Assembly-CSharp/OvrIK.cs

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

+ 48 - 2
Assembly-CSharp/PhotoCustomObjectSphere.cs

@@ -36,6 +36,34 @@ public class PhotoCustomObjectSphere : BasePhotoCustomObject
 		}
 	}
 
+	public PhotoCustomObjectSphere.RenderingType renderingType
+	{
+		get
+		{
+			return this.renderingType_;
+		}
+		set
+		{
+			this.renderingType_ = value;
+			if (this.material == null)
+			{
+				return;
+			}
+			if (this.renderingType_ == PhotoCustomObjectSphere.RenderingType.TwoSides)
+			{
+				this.material.SetFloat("_Cull", 0f);
+			}
+			else if (this.renderingType_ == PhotoCustomObjectSphere.RenderingType.Front)
+			{
+				this.material.SetFloat("_Cull", 2f);
+			}
+			else if (this.renderingType_ == PhotoCustomObjectSphere.RenderingType.Back)
+			{
+				this.material.SetFloat("_Cull", 1f);
+			}
+		}
+	}
+
 	public override void Awake()
 	{
 		base.Awake();
@@ -47,7 +75,7 @@ public class PhotoCustomObjectSphere : BasePhotoCustomObject
 				renderer.material = this.material;
 			}
 		}
-		this.material.SetFloat("_Cull", 0f);
+		this.renderingType = PhotoCustomObjectSphere.RenderingType.TwoSides;
 		this.material.SetFloat("_ZWrite", 1f);
 		this.material.renderQueue = 2980;
 		this.scaleTransform.gameObject.SetActive(false);
@@ -122,7 +150,8 @@ public class PhotoCustomObjectSphere : BasePhotoCustomObject
 
 	protected override void OnSerialize(BinaryWriter writer)
 	{
-		writer.Write(1001);
+		writer.Write(1002);
+		writer.Write(this.renderingType.ToString());
 		writer.Write(this.isAlphaTexture_);
 		writer.Write(this.imageBinary.Length);
 		writer.Write(this.imageBinary);
@@ -139,6 +168,14 @@ public class PhotoCustomObjectSphere : BasePhotoCustomObject
 		{
 			num = reader.ReadInt32();
 		}
+		if (1002 <= num)
+		{
+			this.renderingType = (PhotoCustomObjectSphere.RenderingType)Enum.Parse(typeof(PhotoCustomObjectSphere.RenderingType), reader.ReadString());
+		}
+		else
+		{
+			this.renderingType = PhotoCustomObjectSphere.RenderingType.TwoSides;
+		}
 		if (1001 <= num)
 		{
 			this.isAlphaTexture_ = reader.ReadBoolean();
@@ -175,4 +212,13 @@ public class PhotoCustomObjectSphere : BasePhotoCustomObject
 	protected bool isAlphaTexture_;
 
 	private bool alphaCheck = true;
+
+	private PhotoCustomObjectSphere.RenderingType renderingType_;
+
+	public enum RenderingType
+	{
+		TwoSides,
+		Front,
+		Back
+	}
 }

+ 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", 1130);
+		XElement xelement = new XElement("GameVersion", 1140);
 		XElement xelement2 = new XElement("SaveTime", value);
 		XElement xelement3 = new XElement("Title", title);
 		XElement xelement4 = new XElement("Comment", comment);

+ 4 - 2
Assembly-CSharp/PhotoWindowManager.cs

@@ -678,7 +678,8 @@ public class PhotoWindowManager : BasePhotoWindowManager
 		PhotoWindowManager.WindowType.ScenePreset,
 		PhotoWindowManager.WindowType.AlignmentPreset,
 		PhotoWindowManager.WindowType.MaidItem,
-		PhotoWindowManager.WindowType.Undressing
+		PhotoWindowManager.WindowType.Undressing,
+		PhotoWindowManager.WindowType.GravityContro
 	};
 
 	public PhotoModeSaveAndLoad SaveAndLoadManager;
@@ -716,6 +717,7 @@ public class PhotoWindowManager : BasePhotoWindowManager
 		Message,
 		ScenePreset,
 		AlignmentPreset,
-		ObjectCreate
+		ObjectCreate,
+		GravityContro
 	}
 }

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

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

+ 1 - 1
Assembly-CSharp/ScriptManager.cs

@@ -2920,7 +2920,7 @@ public class ScriptManager : IDisposable
 	public void Serialize(BinaryWriter binary)
 	{
 		binary.Write("CM3D2_SCRIPT");
-		binary.Write(1130);
+		binary.Write(1140);
 		this.adv_kag_.Serialize(binary);
 	}
 

+ 149 - 0
Assembly-CSharp/SubtitlesDisplayManager.cs

@@ -0,0 +1,149 @@
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class SubtitlesDisplayManager : MonoBehaviour
+{
+	public string originalText
+	{
+		get
+		{
+			return this.originalUILabel.text;
+		}
+		set
+		{
+			this.Awake();
+			if (this.originalText_ == value)
+			{
+				return;
+			}
+			this.originalUILabel.text = (this.originalText_ = ((!string.IsNullOrEmpty(value)) ? MessageClass.GetWrapString(this.originalUILabel, value) : string.Empty));
+			if (this.displayType_ == SubtitlesDisplayManager.DisplayType.ON_OFF)
+			{
+				this.singleUILabel.text = this.originalText_;
+			}
+		}
+	}
+
+	public string subtitlesText
+	{
+		get
+		{
+			return this.subtitlesUILabel.text;
+		}
+		set
+		{
+			this.Awake();
+			if (this.subtitlesText_ == value)
+			{
+				return;
+			}
+			this.subtitlesUILabel.text = (this.subtitlesText_ = ((!string.IsNullOrEmpty(value)) ? value : string.Empty));
+			if (this.displayType_ == SubtitlesDisplayManager.DisplayType.OFF_ON)
+			{
+				this.singleUILabel.text = this.subtitlesText_;
+			}
+		}
+	}
+
+	public SubtitlesDisplayManager.DisplayType displayType
+	{
+		get
+		{
+			return this.displayType_;
+		}
+		set
+		{
+			this.Awake();
+			this.displayType_ = value;
+			if (this.displayType_ == SubtitlesDisplayManager.DisplayType.ON_ON)
+			{
+				this.twoTextAreaObject.SetActive(true);
+				this.singleTextAreaObject.SetActive(false);
+			}
+			else if (this.displayType_ == SubtitlesDisplayManager.DisplayType.OFF_OFF)
+			{
+				this.twoTextAreaObject.SetActive(false);
+				this.singleTextAreaObject.SetActive(false);
+			}
+			else if (this.displayType_ == SubtitlesDisplayManager.DisplayType.OFF_ON || this.displayType_ == SubtitlesDisplayManager.DisplayType.ON_OFF)
+			{
+				this.twoTextAreaObject.SetActive(false);
+				this.singleTextAreaObject.SetActive(true);
+				this.singleUILabel.text = ((this.displayType_ != SubtitlesDisplayManager.DisplayType.OFF_ON) ? this.originalText_ : this.subtitlesText_);
+			}
+		}
+	}
+
+	public bool visible
+	{
+		get
+		{
+			return base.gameObject.activeInHierarchy;
+		}
+		set
+		{
+			base.gameObject.SetActive(value);
+		}
+	}
+
+	private void Awake()
+	{
+		if (this.callAwake)
+		{
+			return;
+		}
+		this.callAwake = true;
+		string empty = string.Empty;
+		this.subtitlesText = empty;
+		this.originalText = empty;
+		this.displayType = SubtitlesDisplayManager.DisplayType.ON_ON;
+	}
+
+	public void SetTextFromScriptStyle(string text)
+	{
+		if (string.IsNullOrEmpty(text))
+		{
+			string empty = string.Empty;
+			this.subtitlesText = empty;
+			this.originalText = empty;
+			return;
+		}
+		KeyValuePair<string, string> translationText = MessageClass.GetTranslationText(text);
+		this.originalText = translationText.Key;
+		this.subtitlesText = translationText.Value;
+	}
+
+	[Header("日本語と翻訳,2テキスト表示する時の設定")]
+	[SerializeField]
+	private GameObject twoTextAreaObject;
+
+	[SerializeField]
+	private UILabel originalUILabel;
+
+	[SerializeField]
+	private UILabel subtitlesUILabel;
+
+	[Header("日本語 or 翻訳の1テキストのみ表示する時の設定")]
+	[SerializeField]
+	private GameObject singleTextAreaObject;
+
+	[SerializeField]
+	private UILabel singleUILabel;
+
+	private bool callAwake;
+
+	private string originalText_;
+
+	private string subtitlesText_;
+
+	private SubtitlesDisplayManager.DisplayType displayType_;
+
+	public enum DisplayType
+	{
+		ON_ON,
+		OFF_OFF,
+		OFF_ON,
+		ON_OFF
+	}
+}

+ 44 - 14
Assembly-CSharp/TBody.cs

@@ -31,6 +31,14 @@ public class TBody : MonoBehaviour
 		}
 	}
 
+	public bool IKExecLate
+	{
+		get
+		{
+			return this.IKHandL.IsExecLate || this.IKHandR.IsExecLate || this.IKMuneL.IsExecLate || this.IKMuneR.IsExecLate;
+		}
+	}
+
 	public Transform SmBody
 	{
 		get
@@ -292,13 +300,13 @@ public class TBody : MonoBehaviour
 		{
 			Debug.LogError("HandL null");
 		}
-		this.IKHandL.SetKinematicTgt(this.HandL, 3);
+		this.IKHandL.SetKinematicTgt(this.HandL, this, 3);
 		this.IKHandL.IkCmoInit(this);
 		if (!this.StrIKDataPair.ContainsKey("左手"))
 		{
 			this.StrIKDataPair.Add("左手", this.IKHandL);
 		}
-		this.IKHandR.SetKinematicTgt(this.HandR, 3);
+		this.IKHandR.SetKinematicTgt(this.HandR, this, 3);
 		this.IKHandR.IkCmoInit(this);
 		if (!this.StrIKDataPair.ContainsKey("右手"))
 		{
@@ -452,8 +460,8 @@ public class TBody : MonoBehaviour
 		Transform transform2 = (!this.m_trsMuneRsub) ? CMT.SearchObjName(this.m_trBones, "Mune_R_sub", true) : this.m_trsMuneRsub;
 		this.IKMuneL.CreateAttachPointObj("_IK_nippleL", transform, this, "body", "乳首左");
 		this.IKMuneR.CreateAttachPointObj("_IK_nippleR", transform2, this, "body", "乳首右");
-		this.IKMuneL.SetKinematicTgt(transform, 2);
-		this.IKMuneR.SetKinematicTgt(transform2, 2);
+		this.IKMuneL.SetKinematicTgt(transform, this, 2);
+		this.IKMuneR.SetKinematicTgt(transform2, this, 2);
 		if (!this.StrIKDataPair.ContainsKey("左胸"))
 		{
 			this.StrIKDataPair.Add("左胸", this.IKMuneL);
@@ -2400,6 +2408,7 @@ public class TBody : MonoBehaviour
 
 	private void Update()
 	{
+		this.LateUpdateEnd = false;
 		for (int i = 0; i < this.goSlot.Count; i++)
 		{
 			this.goSlot[i].TextureCache.Update();
@@ -2543,29 +2552,37 @@ public class TBody : MonoBehaviour
 		{
 			return;
 		}
+		this.IKHandL.IsExecLate = (this.IKHandR.IsExecLate = false);
+		this.IKMuneL.IsExecLate = (this.IKMuneR.IsExecLate = false);
 		this.MoveHeadAndEye();
-		this.IKHandL.IKExec(this.goSlot);
-		this.IKHandR.IKExec(this.goSlot);
+		this.IKHandL.IKExec();
+		this.IKHandR.IKExec();
 		this.MoveMomoniku();
-		this.AutoTwist();
+		if (!this.IKExecLate)
+		{
+			this.AutoTwist();
+		}
 		if (!this.boMAN)
 		{
 			this.IKMuneL.SyncAttachPoint();
 			this.IKMuneR.SyncAttachPoint();
 			this.jbMuneL.LateUpdateSelf();
 			this.jbMuneR.LateUpdateSelf();
-			this.IKMuneL.IKExec(this.goSlot);
-			this.IKMuneR.IKExec(this.goSlot);
+			this.IKMuneL.IKExec();
+			this.IKMuneR.IKExec();
 		}
 		if (this.boMAN && this.trManChinko != null)
 		{
 			this.trManChinko.localPosition = this.vecChinkoOffset;
 		}
-		for (int i = 0; i < this.goSlot.Count; i++)
+		if (!this.IKExecLate)
 		{
-			if (this.goSlot[i].obj != null)
+			for (int i = 0; i < this.goSlot.Count; i++)
 			{
-				this.goSlot[i].CopyTrans();
+				if (this.goSlot[i].obj != null)
+				{
+					this.goSlot[i].CopyTrans();
+				}
 			}
 		}
 		if (!this.boMAN)
@@ -2577,9 +2594,12 @@ public class TBody : MonoBehaviour
 			this.JumpDis = (this.JumpDis + this.JumpDis_old) * 0.5f;
 			this.JumpDis_old = this.JumpDis;
 		}
-		for (int j = 0; j < this.goSlot.Count; j++)
+		if (!this.IKExecLate)
 		{
-			this.goSlot[j].Update();
+			for (int j = 0; j < this.goSlot.Count; j++)
+			{
+				this.goSlot[j].Update();
+			}
 		}
 		if (!this.boMAN)
 		{
@@ -2588,6 +2608,12 @@ public class TBody : MonoBehaviour
 			this.Thigh_L_pos_old = this.Thigh_L.position;
 			this.Thigh_R_pos_old = this.Thigh_R.position;
 		}
+		this.LateUpdateEnd = true;
+		if (this.OnLateUpdateEnd != null)
+		{
+			this.OnLateUpdateEnd();
+		}
+		this.OnLateUpdateEnd = null;
 	}
 
 	public float DegPer(float r, float per)
@@ -2947,6 +2973,10 @@ public class TBody : MonoBehaviour
 
 	public Dictionary<string, IKMgrData> StrIKDataPair = new Dictionary<string, IKMgrData>();
 
+	public Action OnLateUpdateEnd;
+
+	public bool LateUpdateEnd;
+
 	private Transform m_SMbody;
 
 	public Transform trsHead;

+ 1 - 0
Assembly-CSharp/UndressingWindow.cs

@@ -42,6 +42,7 @@ public class UndressingWindow : BaseMaidPhotoWindow
 	public override void Start()
 	{
 		base.Start();
+		this.MekureFront.mgr = (this.MekureBack.mgr = (this.Zurasi.mgr = base.mgr));
 		this.MekureFront.onClick.Add(delegate(WFCheckBox check_box)
 		{
 			this.MekureBack.UpdateGui();

+ 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", 1130);
+		XElement xelement = new XElement("GameVersion", 1140);
 		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[]

+ 4 - 0
Assembly-CSharp/WindowPartsMekureCheckBox.cs

@@ -62,6 +62,8 @@ public class WindowPartsMekureCheckBox : WFCheckBox
 			}
 		}
 		this.maid_.AllProcProp();
+		GravityControlWindow gravityControlWindow = this.mgr.GetWindow(PhotoWindowManager.WindowType.GravityContro) as GravityControlWindow;
+		gravityControlWindow.OnChangeMekure();
 	}
 
 	private bool IsItemChangeEnabled(Maid maid)
@@ -140,6 +142,8 @@ public class WindowPartsMekureCheckBox : WFCheckBox
 
 	public WindowPartsMekureCheckBox.Mode CheckBoxMode;
 
+	public PhotoWindowManager mgr;
+
 	private Maid maid_;
 
 	public enum Mode

+ 34 - 0
Assembly-CSharp/YotogiKagManager.cs

@@ -5,6 +5,7 @@ public class YotogiKagManager : BaseKagManager
 {
 	public YotogiKagManager(TJSScript tjs, ScriptManager script_mgr) : base(tjs, script_mgr)
 	{
+		this.pickUpText = (this.repeatStackText = false);
 	}
 
 	public override void Initialize()
@@ -86,6 +87,16 @@ public class YotogiKagManager : BaseKagManager
 		{
 			Maid voiceTargetMaid = BaseKagManager.GetVoiceTargetMaid(tag_data);
 			this.PlayVoice(voiceTargetMaid, tag_data.GetTagProperty("voice").AsString() + ".ogg");
+			if (voiceTargetMaid.AudioMan.isPlay())
+			{
+				float length = voiceTargetMaid.AudioMan.GetLength();
+				if (this.yotogi_mgr_ != null)
+				{
+					this.yotogi_mgr_.play_mgr.SetMessageTextDisplayTime((int)(length * 1000f));
+				}
+			}
+			this.pickUpText = true;
+			this.repeatStackText = false;
 		}
 		return false;
 	}
@@ -108,6 +119,8 @@ public class YotogiKagManager : BaseKagManager
 				this.yotogi_old_mgr_.SetRepeatVoiceFile(tag_data.GetTagProperty("voice").AsString() + ".ogg", maid_no);
 			}
 		}
+		this.pickUpText = true;
+		this.repeatStackText = true;
 		return false;
 	}
 
@@ -122,6 +135,7 @@ public class YotogiKagManager : BaseKagManager
 		{
 			this.yotogi_mgr_.AddRepeatVoiceFile(tag_data.GetTagProperty("voice").AsString() + ".ogg", maid_no);
 		}
+		this.pickUpText = (this.repeatStackText = false);
 		return false;
 	}
 
@@ -159,7 +173,23 @@ public class YotogiKagManager : BaseKagManager
 
 	public bool TagHitRet(KagTagSupport tag_data)
 	{
+		if (this.pickUpText && this.yotogi_mgr_ != null)
+		{
+			string text = this.kag_.GetText();
+			if (!string.IsNullOrEmpty(text))
+			{
+				if (this.repeatStackText)
+				{
+					this.yotogi_mgr_.play_mgr.AddRepeatVoiceText(text);
+				}
+				else
+				{
+					this.yotogi_mgr_.play_mgr.SetMessageText(text);
+				}
+			}
+		}
 		this.kag_.TextClear();
+		this.pickUpText = (this.repeatStackText = false);
 		return false;
 	}
 
@@ -183,4 +213,8 @@ public class YotogiKagManager : BaseKagManager
 	private YotogiManager yotogi_mgr_;
 
 	private YotogiOldManager yotogi_old_mgr_;
+
+	private bool pickUpText;
+
+	private bool repeatStackText;
 }

+ 30 - 0
Assembly-CSharp/YotogiPlayManager.cs

@@ -159,6 +159,11 @@ public class YotogiPlayManager : WfScreenChildren
 		}
 		this.particleBreathe = false;
 		this.particleLoveLiquidType = 0;
+		if (this.subtitlesManager != null)
+		{
+			this.subtitlesManager.visible = false;
+			this.subtitlesManager.SetTextFromScriptStyle(string.Empty);
+		}
 	}
 
 	private void Initialize()
@@ -330,6 +335,11 @@ public class YotogiPlayManager : WfScreenChildren
 							if (maid != null && maid.AudioMan != null)
 							{
 								maid.AudioMan.LoadPlay(repeatVoiceData.repeat_voice_file, 0f, false, true);
+								if (this.subtitlesManager != null && !string.IsNullOrEmpty(repeatVoiceData.text))
+								{
+									this.message_display_time_ = float.MaxValue;
+									this.subtitlesManager.SetTextFromScriptStyle(repeatVoiceData.text);
+								}
 							}
 						}
 					}
@@ -380,6 +390,7 @@ public class YotogiPlayManager : WfScreenChildren
 
 	public bool NextSkill()
 	{
+		this.message_display_time_ = 0f;
 		int num = (!YotogiStageSelectManager.SelectedStageRefDayTime) ? 1 : 0;
 		string text = YotogiStageSelectManager.SelectedStage.prefabName[num];
 		if (0 <= text.IndexOf("?"))
@@ -565,6 +576,14 @@ public class YotogiPlayManager : WfScreenChildren
 		}
 	}
 
+	public void SetMessageText(string text)
+	{
+	}
+
+	public void SetMessageTextDisplayTime(int time)
+	{
+	}
+
 	public void SetRepeatVoiceFile(string file_name, int maid_no)
 	{
 		this.repeat_voice_data_list_.Clear();
@@ -580,6 +599,10 @@ public class YotogiPlayManager : WfScreenChildren
 		this.repeat_voice_data_list_.Add(repeatVoiceData);
 	}
 
+	public void AddRepeatVoiceText(string text)
+	{
+	}
+
 	public void ClearRepeatVoiceData()
 	{
 		this.repeat_voice_data_list_.Clear();
@@ -671,6 +694,7 @@ public class YotogiPlayManager : WfScreenChildren
 		action(list2, "指導", param.teach_rate / 10);
 		this.param_scroll_.CallFadeIn(list2);
 		this.ClearCommandFile();
+		this.SetMessageTextDisplayTime(0);
 		Maid maid = this.maid_;
 		if (0 < command_data.basic.ref_maid_no)
 		{
@@ -1967,6 +1991,8 @@ public class YotogiPlayManager : WfScreenChildren
 
 	public int kRepeatWaitTime = 200;
 
+	public SubtitlesDisplayManager subtitlesManager;
+
 	public bool lockRepeatVoiceUpdate;
 
 	private Maid maid_;
@@ -2049,6 +2075,8 @@ public class YotogiPlayManager : WfScreenChildren
 
 	private int free_mode_backup_excitement_;
 
+	private float message_display_time_;
+
 	private struct FreeModeBackUpData
 	{
 		public Seikeiken seikeiken;
@@ -2061,5 +2089,7 @@ public class YotogiPlayManager : WfScreenChildren
 		public int elapsed_time;
 
 		public int maid_no;
+
+		public string text;
 	}
 }

+ 14 - 1
Assembly-CSharp/uGUIKaraokeSelect.cs

@@ -44,6 +44,10 @@ public class uGUIKaraokeSelect : MonoBehaviour
 		{
 			this.m_ButtonSelectBG.interactable = false;
 		}
+		if (this.GetFoodDataArray().Length <= 0)
+		{
+			this.m_ButtonSelectFood.interactable = false;
+		}
 	}
 
 	public void OpenListSelectMusic(bool isOn)
@@ -368,7 +372,16 @@ public class uGUIKaraokeSelect : MonoBehaviour
 
 	private KaraokeDataManager.FoodData[] GetFoodDataArray()
 	{
-		return this.m_Manager.GetFoodDataArray(true);
+		KaraokeDataManager.FoodData[] foodDataArray = this.m_Manager.GetFoodDataArray(true);
+		List<KaraokeDataManager.FoodData> list = new List<KaraokeDataManager.FoodData>();
+		foreach (KaraokeDataManager.FoodData foodData in foodDataArray)
+		{
+			if (foodData.ID != KaraokeDataManager.FoodData.ID_BUTTON_MAID_ADDITIONAL || KaraokeDataManager.IsEnablePersonalKaraoke003(GameMain.Instance.CharacterMgr.GetMaid(0)))
+			{
+				list.Add(foodData);
+			}
+		}
+		return list.ToArray();
 	}
 
 	private KaraokeDataManager.BackgroundData[] GetBackgroundDataArray()

+ 11 - 0
Assembly-CSharp/wf/Math.cs

@@ -1,4 +1,5 @@
 using System;
+using UnityEngine;
 
 namespace wf
 {
@@ -48,5 +49,15 @@ namespace wf
 		{
 			return Math.Min(Math.Max(num, min), max);
 		}
+
+		public static bool Approximately(Vector2 objA, Vector2 objB)
+		{
+			return Mathf.Approximately(objA.x, objB.x) && Mathf.Approximately(objA.y, objB.y);
+		}
+
+		public static bool Approximately(Vector3 objA, Vector3 objB)
+		{
+			return Mathf.Approximately(objA.x, objB.x) && Mathf.Approximately(objA.y, objB.y) && Mathf.Approximately(objA.z, objB.z);
+		}
 	}
 }