denikson 6 лет назад
Родитель
Сommit
a4a0957cd4
109 измененных файлов с 3471 добавлено и 1445 удалено
  1. 5 5
      Assembly-CSharp.sln
  2. 9 4
      Assembly-CSharp/ADVKagManager.cs
  3. 4 1
      Assembly-CSharp/AVProVideoPlayer.cs
  4. 2 1
      Assembly-CSharp/AbstractFreeModeItem.cs
  5. 34 17
      Assembly-CSharp/Assembly-CSharp.csproj
  6. 43 1
      Assembly-CSharp/AudioMixerMgr.cs
  7. 29 1
      Assembly-CSharp/AudioSourceMgr.cs
  8. 12 2
      Assembly-CSharp/BacklogCtrl.cs
  9. 13 5
      Assembly-CSharp/BaseKagManager.cs
  10. 1 1
      Assembly-CSharp/BasePhotoCustomObject.cs
  11. 1 1
      Assembly-CSharp/BasePhotoWindowManager.cs
  12. 2 2
      Assembly-CSharp/BjMotionControl.cs
  13. 13 5
      Assembly-CSharp/CMSystem.cs
  14. 69 8
      Assembly-CSharp/CharacterMgr.cs
  15. 156 0
      Assembly-CSharp/CharacterSelectMain.cs
  16. 1 1
      Assembly-CSharp/CompetitiveShowAPI.cs
  17. 2 2
      Assembly-CSharp/CompetitiveShowMgr.cs
  18. 0 726
      Assembly-CSharp/ConfigCtrl.cs
  19. 42 0
      Assembly-CSharp/ConfigIntegerSlider.cs
  20. 624 0
      Assembly-CSharp/ConfigManager.cs
  21. 38 300
      Assembly-CSharp/ConfigMgr.cs
  22. 61 0
      Assembly-CSharp/ConfigSelectButton.cs
  23. 2 2
      Assembly-CSharp/ControllerShortcutSettingData.cs
  24. 2 2
      Assembly-CSharp/CostumePartsEnabledCtrl.cs
  25. 7 3
      Assembly-CSharp/DailyCtrl.cs
  26. 1 0
      Assembly-CSharp/DailyMgr.cs
  27. 2 2
      Assembly-CSharp/Dance/UndressItem.cs
  28. 10 1
      Assembly-CSharp/DanceMain.cs
  29. 1 2
      Assembly-CSharp/DanceSelect.cs
  30. 1 1
      Assembly-CSharp/DeskManager.cs
  31. 3 3
      Assembly-CSharp/DynamicBone.cs
  32. 1 1
      Assembly-CSharp/DynamicSkirtBone.cs
  33. 88 0
      Assembly-CSharp/EditItemTextureCache.cs
  34. 1 1
      Assembly-CSharp/EditMod.cs
  35. 32 0
      Assembly-CSharp/EmpireLifeModeAPI.cs
  36. 1 1
      Assembly-CSharp/EmpireLifeModeManager.cs
  37. 2 2
      Assembly-CSharp/FaceWindow.cs
  38. 1 1
      Assembly-CSharp/FacilityManager.cs
  39. 213 0
      Assembly-CSharp/FreeModeItemLifeMode.cs
  40. 58 1
      Assembly-CSharp/FreeModeSceneSelectBase.cs
  41. 9 1
      Assembly-CSharp/FreeModeSelect.cs
  42. 100 19
      Assembly-CSharp/FreeSkillSelect.cs
  43. 1 1
      Assembly-CSharp/GameInShopMain.cs
  44. 5 2
      Assembly-CSharp/GameMain.cs
  45. 1 1
      Assembly-CSharp/GameModeManager.cs
  46. 9 2
      Assembly-CSharp/GameUty.cs
  47. 4 17
      Assembly-CSharp/GizmoRenderTarget.cs
  48. 2 2
      Assembly-CSharp/HandSignShortcut.cs
  49. 1 1
      Assembly-CSharp/Kasizuki/KasizukiManager.cs
  50. 3 3
      Assembly-CSharp/Maid.cs
  51. 7 7
      Assembly-CSharp/MaidParts.cs
  52. 1 1
      Assembly-CSharp/MaidProp.cs
  53. 19 1
      Assembly-CSharp/MaidStatus/Status.cs
  54. 12 0
      Assembly-CSharp/MaidStatus/VoiceGroup.cs
  55. 177 138
      Assembly-CSharp/Menu.cs
  56. 13 3
      Assembly-CSharp/MessageClass.cs
  57. 11 6
      Assembly-CSharp/MessageWindowMgr.cs
  58. 1 1
      Assembly-CSharp/Misc.cs
  59. 1 1
      Assembly-CSharp/ModCompile.cs
  60. 4 0
      Assembly-CSharp/OnaholeMotion.cs
  61. 2 2
      Assembly-CSharp/OvrIK.cs
  62. 5 5
      Assembly-CSharp/PhotoManEditManager.cs
  63. 1 1
      Assembly-CSharp/PhotoModeSaveAndLoad.cs
  64. 1 1
      Assembly-CSharp/PhotoMotionData.cs
  65. 1 1
      Assembly-CSharp/PlayerStatus/Status.cs
  66. 5 1
      Assembly-CSharp/PresetButtonCtrl.cs
  67. 1 1
      Assembly-CSharp/RandomPresetContent.cs
  68. 4 4
      Assembly-CSharp/RandomPresetCtrl.cs
  69. 0 6
      Assembly-CSharp/ScenarioData.cs
  70. 1 1
      Assembly-CSharp/SceneCasino.cs
  71. 1 1
      Assembly-CSharp/SceneCasinoShop.cs
  72. 2 1
      Assembly-CSharp/SceneCharacterSelect.cs
  73. 61 25
      Assembly-CSharp/SceneEdit.cs
  74. 4 4
      Assembly-CSharp/SceneEditWindow/CustomViewItem.cs
  75. 0 1
      Assembly-CSharp/SceneEditWindow/CustomViewWindow.cs
  76. 1 1
      Assembly-CSharp/SceneEditWindow/PoseIconData.cs
  77. 63 3
      Assembly-CSharp/SceneFreeModeSelectManager.cs
  78. 219 0
      Assembly-CSharp/SceneNPCEdit/EditCharacterDatabase.cs
  79. 106 0
      Assembly-CSharp/SceneNPCEdit/NPCCharaSelect.cs
  80. 57 0
      Assembly-CSharp/SceneNPCEdit/NPCEdit.cs
  81. 155 0
      Assembly-CSharp/SceneNPCEdit/NPCEditMain.cs
  82. 110 0
      Assembly-CSharp/SceneNPCEdit/NPCEditPlate.cs
  83. 29 0
      Assembly-CSharp/SceneNPCEdit/NPCEditStatus.cs
  84. 111 0
      Assembly-CSharp/SceneNPCEdit/SaveData.cs
  85. 3 3
      Assembly-CSharp/SceneUserEditMain.cs
  86. 7 3
      Assembly-CSharp/ScriptManager.cs
  87. 45 14
      Assembly-CSharp/SoundMgr.cs
  88. 4 4
      Assembly-CSharp/SubSlotEditItem.cs
  89. 64 0
      Assembly-CSharp/TBody.cs
  90. 27 25
      Assembly-CSharp/TBodySkin.cs
  91. 15 0
      Assembly-CSharp/TBoneHair_.cs
  92. 2 3
      Assembly-CSharp/UserEditAPI.cs
  93. 1 1
      Assembly-CSharp/UserEditMgr.cs
  94. 1 1
      Assembly-CSharp/VRRentalMaidMenu.cs
  95. 33 0
      Assembly-CSharp/VsDanceDataMgr.cs
  96. 1 1
      Assembly-CSharp/WindowPartsFingerPreset.cs
  97. 8 1
      Assembly-CSharp/YotogiKagManager.cs
  98. 1 1
      Assembly-CSharp/YotogiManager.cs
  99. 1 1
      Assembly-CSharp/YotogiOldSkillSelectWaitMotion.cs
  100. 3 6
      Assembly-CSharp/YotogiResultManager.cs
  101. 1 5
      Assembly-CSharp/YotogiSkillListManager.cs
  102. 1 1
      Assembly-CSharp/YotogiSkillSelectWaitMotion.cs
  103. 26 3
      Assembly-CSharp/Yotogis/Skill.cs
  104. 48 0
      Assembly-CSharp/config/ui/IntegerSlider.cs
  105. 4 0
      Assembly-CSharp/jiggleBone.cs
  106. 139 0
      Assembly-CSharp/wf/CsvCommonDatabaseIDType.cs
  107. 54 0
      Assembly-CSharp/wf/CsvCommonDatabaseUniqueType.cs
  108. 24 0
      Assembly-CSharp/wf/ui/AbstractSliderWrapper.cs
  109. 50 0
      Assembly-CSharp/wf/ui/NGUISlider.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", "{1EAB0037-E96F-4464-A820-80B5463AAB3A}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Assembly-CSharp", "Assembly-CSharp\Assembly-CSharp.csproj", "{8CE48584-AE4B-44DE-B9DF-2F39AA7910F0}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -11,10 +11,10 @@ Global
 		Release|Any CPU = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{1EAB0037-E96F-4464-A820-80B5463AAB3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{1EAB0037-E96F-4464-A820-80B5463AAB3A}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{1EAB0037-E96F-4464-A820-80B5463AAB3A}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{1EAB0037-E96F-4464-A820-80B5463AAB3A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{8CE48584-AE4B-44DE-B9DF-2F39AA7910F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8CE48584-AE4B-44DE-B9DF-2F39AA7910F0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8CE48584-AE4B-44DE-B9DF-2F39AA7910F0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{8CE48584-AE4B-44DE-B9DF-2F39AA7910F0}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE

+ 9 - 4
Assembly-CSharp/ADVKagManager.cs

@@ -181,11 +181,13 @@ public class ADVKagManager : BaseKagManager
 		}
 		this.text_data_.text = this.text_data_.text.Replace('|', '\n');
 		int voice_pitch = 50;
+		AudioSourceMgr.Type type = AudioSourceMgr.Type.Voice;
 		if (this.text_data_.voice_maid != null)
 		{
 			voice_pitch = this.text_data_.voice_maid.VoicePitch;
+			type = this.text_data_.voice_maid.AudioMan.SoundType;
 		}
-		this.message_mgr_.SetText(this.text_data_.talk_name, this.text_data_.text, this.text_data_.voice_file, voice_pitch);
+		this.message_mgr_.SetText(this.text_data_.talk_name, this.text_data_.text, this.text_data_.voice_file, voice_pitch, type);
 		if (!string.IsNullOrEmpty(this.text_data_.voice_file))
 		{
 			GameMain.Instance.SoundMgr.VoiceStopAll();
@@ -197,7 +199,7 @@ public class ADVKagManager : BaseKagManager
 				}
 				else
 				{
-					GameMain.Instance.SoundMgr.PlayDummyVoice(this.text_data_.voice_file, 0f, false, false, voice_pitch);
+					GameMain.Instance.SoundMgr.PlayDummyVoice(this.text_data_.voice_file, 0f, false, false, voice_pitch, type);
 				}
 			}
 			this.text_data_.voice_maid = null;
@@ -341,8 +343,11 @@ public class ADVKagManager : BaseKagManager
 	{
 		Action<string, string> onClickCallBack = delegate(string choices_title, string label_name)
 		{
-			string text = "=> " + choices_title;
-			this.message_mgr_.AddBackLog(string.Empty, text, string.Empty, 0);
+			if (!GameUty.supportMultiLanguage)
+			{
+				string text = "=> " + choices_title;
+				this.message_mgr_.AddBackLog(string.Empty, text, string.Empty, 0, AudioSourceMgr.Type.VoiceHeroine);
+			}
 			this.kag_.GoToLabel(label_name);
 			this.kag_.Exec();
 		};

+ 4 - 1
Assembly-CSharp/AVProVideoPlayer.cs

@@ -31,7 +31,10 @@ public class AVProVideoPlayer : MonoBehaviour
 	private void Start()
 	{
 		bool flag = this.m_player.OpenVideoFromFile(MediaPlayer.FileLocation.AbsolutePathOrURL, this.m_player.m_VideoPath, false);
-		NDebug.Assert(flag, "ビデオファイルを開けませんでした。\n" + this.m_player.m_VideoPath);
+		if (!flag)
+		{
+			NDebug.MessageBox("エラー", "ビデオファイルを開けませんでした。\nファイルの存在=" + File.Exists(this.m_player.m_VideoPath).ToString() + "\n" + this.m_player.m_VideoPath);
+		}
 		if (flag && this.m_player.VideoOpened && this.m_bAutoStart)
 		{
 			this.Play();

+ 2 - 1
Assembly-CSharp/AbstractFreeModeItem.cs

@@ -133,7 +133,8 @@ public abstract class AbstractFreeModeItem
 	{
 		MainStory,
 		Vip,
-		Normal
+		Normal,
+		LifeMode
 	}
 
 	public enum GameMode

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

@@ -4,7 +4,7 @@
   <PropertyGroup>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProjectGuid>{1EAB0037-E96F-4464-A820-80B5463AAB3A}</ProjectGuid>
+    <ProjectGuid>{8CE48584-AE4B-44DE-B9DF-2F39AA7910F0}</ProjectGuid>
     <OutputType>Library</OutputType>
     <RootNamespace>Assembly-CSharp</RootNamespace>
     <AssemblyName>Assembly-CSharp</AssemblyName>
@@ -34,49 +34,49 @@
   </PropertyGroup>
   <ItemGroup>
     <Reference Include="Assembly-CSharp-firstpass">
-      <HintPath>..\..\..\..\..\Programs\COM3D2\com3d2_up124\data\COM3D2x64_Data\Managed\Assembly-CSharp-firstpass.dll</HintPath>
+      <HintPath>..\..\COM\up125\Managed\Assembly-CSharp-firstpass.dll</HintPath>
     </Reference>
     <Reference Include="Assembly-UnityScript-firstpass">
-      <HintPath>..\..\..\..\..\Programs\COM3D2\com3d2_up124\data\COM3D2x64_Data\Managed\Assembly-UnityScript-firstpass.dll</HintPath>
+      <HintPath>..\..\COM\up125\Managed\Assembly-UnityScript-firstpass.dll</HintPath>
     </Reference>
     <Reference Include="FoveUnityPlugin">
-      <HintPath>..\..\..\..\..\Programs\COM3D2\com3d2_up124\data\COM3D2x64_Data\Managed\FoveUnityPlugin.dll</HintPath>
+      <HintPath>..\..\COM\up125\Managed\FoveUnityPlugin.dll</HintPath>
     </Reference>
     <Reference Include="Ionic.Zlib">
-      <HintPath>..\..\..\..\..\Programs\COM3D2\com3d2_up124\data\COM3D2x64_Data\Managed\Ionic.Zlib.dll</HintPath>
+      <HintPath>..\..\COM\up125\Managed\Ionic.Zlib.dll</HintPath>
     </Reference>
     <Reference Include="JsonFx.Json">
-      <HintPath>..\..\..\..\..\Programs\COM3D2\com3d2_up124\data\COM3D2x64_Data\Managed\JsonFx.Json.dll</HintPath>
+      <HintPath>..\..\COM\up125\Managed\JsonFx.Json.dll</HintPath>
     </Reference>
     <Reference Include="LeapCSharp.NET3.5">
-      <HintPath>..\..\..\..\..\Programs\COM3D2\com3d2_up124\data\COM3D2x64_Data\Managed\LeapCSharp.NET3.5.dll</HintPath>
+      <HintPath>..\..\COM\up125\Managed\LeapCSharp.NET3.5.dll</HintPath>
     </Reference>
     <Reference Include="System">
-      <HintPath>..\..\..\..\..\Programs\COM3D2\com3d2_up124\data\COM3D2x64_Data\Managed\System.dll</HintPath>
+      <HintPath>..\..\COM\up125\Managed\System.dll</HintPath>
     </Reference>
     <Reference Include="System.Core">
-      <HintPath>..\..\..\..\..\Programs\COM3D2\com3d2_up124\data\COM3D2x64_Data\Managed\System.Core.dll</HintPath>
+      <HintPath>..\..\COM\up125\Managed\System.Core.dll</HintPath>
     </Reference>
     <Reference Include="System.Drawing">
-      <HintPath>..\..\..\..\..\Programs\COM3D2\com3d2_up124\data\COM3D2x64_Data\Managed\System.Drawing.dll</HintPath>
+      <HintPath>..\..\COM\up125\Managed\System.Drawing.dll</HintPath>
     </Reference>
     <Reference Include="System.Windows.Forms">
-      <HintPath>..\..\..\..\..\Programs\COM3D2\com3d2_up124\data\COM3D2x64_Data\Managed\System.Windows.Forms.dll</HintPath>
+      <HintPath>..\..\COM\up125\Managed\System.Windows.Forms.dll</HintPath>
     </Reference>
     <Reference Include="System.Xml">
-      <HintPath>..\..\..\..\..\Programs\COM3D2\com3d2_up124\data\COM3D2x64_Data\Managed\System.Xml.dll</HintPath>
+      <HintPath>..\..\COM\up125\Managed\System.Xml.dll</HintPath>
     </Reference>
     <Reference Include="System.Xml.Linq">
-      <HintPath>..\..\..\..\..\Programs\COM3D2\com3d2_up124\data\COM3D2x64_Data\Managed\System.Xml.Linq.dll</HintPath>
+      <HintPath>..\..\COM\up125\Managed\System.Xml.Linq.dll</HintPath>
     </Reference>
     <Reference Include="UnityEngine">
-      <HintPath>..\..\..\..\..\Programs\COM3D2\com3d2_up124\data\COM3D2x64_Data\Managed\UnityEngine.dll</HintPath>
+      <HintPath>..\..\COM\up125\Managed\UnityEngine.dll</HintPath>
     </Reference>
     <Reference Include="UnityEngine.UI">
-      <HintPath>..\..\..\..\..\Programs\COM3D2\com3d2_up124\data\COM3D2x64_Data\Managed\UnityEngine.UI.dll</HintPath>
+      <HintPath>..\..\COM\up125\Managed\UnityEngine.UI.dll</HintPath>
     </Reference>
     <Reference Include="zxing.unity">
-      <HintPath>..\..\..\..\..\Programs\COM3D2\com3d2_up124\data\COM3D2x64_Data\Managed\zxing.unity.dll</HintPath>
+      <HintPath>..\..\COM\up125\Managed\zxing.unity.dll</HintPath>
     </Reference>
   </ItemGroup>
   <ItemGroup>
@@ -268,9 +268,12 @@
     <Compile Include="com\workman\cm3d2\task\Task.cs" />
     <Compile Include="ConfigCblManager.cs" />
     <Compile Include="ConfigCblReactionSetting.cs" />
-    <Compile Include="ConfigCtrl.cs" />
+    <Compile Include="ConfigIntegerSlider.cs" />
+    <Compile Include="ConfigManager.cs" />
     <Compile Include="ConfigMgr.cs" />
+    <Compile Include="ConfigSelectButton.cs" />
     <Compile Include="ConfigVRCtrl.cs" />
+    <Compile Include="config\ui\IntegerSlider.cs" />
     <Compile Include="ConfrontCutIn.cs" />
     <Compile Include="ControllerShortcutSettingData.cs" />
     <Compile Include="ControllerShortcutWindow.cs" />
@@ -349,6 +352,7 @@
     <Compile Include="DynamicBoneMuneCollider.cs" />
     <Compile Include="DynamicBonePlaneCollider.cs" />
     <Compile Include="DynamicSkirtBone.cs" />
+    <Compile Include="EditItemTextureCache.cs" />
     <Compile Include="EditMod.cs" />
     <Compile Include="EditOkCancel.cs" />
     <Compile Include="EditViewReset.cs" />
@@ -398,6 +402,7 @@
     <Compile Include="FpsCounter.cs" />
     <Compile Include="FreeModeInit.cs" />
     <Compile Include="FreeModeItemEveryday.cs" />
+    <Compile Include="FreeModeItemLifeMode.cs" />
     <Compile Include="FreeModeItemList.cs" />
     <Compile Include="FreeModeItemVip.cs" />
     <Compile Include="FreeModeSceneSelectBase.cs" />
@@ -713,6 +718,7 @@
     <Compile Include="MaidStatus\Status.cs" />
     <Compile Include="MaidStatus\SubMaid.cs" />
     <Compile Include="MaidStatus\Title.cs" />
+    <Compile Include="MaidStatus\VoiceGroup.cs" />
     <Compile Include="MaidStatus\WorkData.cs" />
     <Compile Include="MaidStatus\YotogiClass.cs" />
     <Compile Include="MaidStatus\YotogiClassSystem.cs" />
@@ -1045,6 +1051,13 @@
     <Compile Include="SceneMainMenuWithChubLipMain.cs" />
     <Compile Include="SceneMotionIKEdit.cs" />
     <Compile Include="SceneNetorareCheck.cs" />
+    <Compile Include="SceneNPCEdit\EditCharacterDatabase.cs" />
+    <Compile Include="SceneNPCEdit\NPCCharaSelect.cs" />
+    <Compile Include="SceneNPCEdit\NPCEdit.cs" />
+    <Compile Include="SceneNPCEdit\NPCEditMain.cs" />
+    <Compile Include="SceneNPCEdit\NPCEditPlate.cs" />
+    <Compile Include="SceneNPCEdit\NPCEditStatus.cs" />
+    <Compile Include="SceneNPCEdit\SaveData.cs" />
     <Compile Include="ScenePresetWindow.cs" />
     <Compile Include="SceneScenarioSelect.cs" />
     <Compile Include="SceneSingleEffect.cs" />
@@ -1508,6 +1521,8 @@
     <Compile Include="WfScreenManager.cs" />
     <Compile Include="WfScreenMoveChildren.cs" />
     <Compile Include="wf\CRC32.cs" />
+    <Compile Include="wf\CsvCommonDatabaseIDType.cs" />
+    <Compile Include="wf\CsvCommonDatabaseUniqueType.cs" />
     <Compile Include="wf\CsvCommonIdManager.cs" />
     <Compile Include="wf\GameUtility.cs" />
     <Compile Include="wf\HSVColor.cs" />
@@ -1517,6 +1532,8 @@
     <Compile Include="wf\ReadOnlySortedDictionary.cs" />
     <Compile Include="wf\StopWatch.cs" />
     <Compile Include="wf\TweenHash.cs" />
+    <Compile Include="wf\ui\AbstractSliderWrapper.cs" />
+    <Compile Include="wf\ui\NGUISlider.cs" />
     <Compile Include="wf\Utility.cs" />
     <Compile Include="wf\Xml.cs" />
     <Compile Include="WindowAutoYaw.cs" />

+ 43 - 1
Assembly-CSharp/AudioMixerMgr.cs

@@ -14,6 +14,36 @@ public class AudioMixerMgr : MonoBehaviour
 		}
 	}
 
+	public AudioMixerGroup this[AudioSourceMgr.Type type]
+	{
+		get
+		{
+			switch (type)
+			{
+			case AudioSourceMgr.Type.Bgm:
+				return this.group_dic_[AudioMixerMgr.Group.BGM];
+			case AudioSourceMgr.Type.Se:
+				return this.group_dic_[AudioMixerMgr.Group.SE];
+			case AudioSourceMgr.Type.System:
+				return this.group_dic_[AudioMixerMgr.Group.System];
+			case AudioSourceMgr.Type.Env:
+				return this.group_dic_[AudioMixerMgr.Group.Env];
+			case AudioSourceMgr.Type.Voice:
+				return this.group_dic_[AudioMixerMgr.Group.Voice];
+			case AudioSourceMgr.Type.VoiceHeroine:
+				return this.group_dic_[AudioMixerMgr.Group.VoiceHeroine];
+			case AudioSourceMgr.Type.VoiceSub:
+				return this.group_dic_[AudioMixerMgr.Group.VoiceSub];
+			case AudioSourceMgr.Type.VoiceExtra:
+				return this.group_dic_[AudioMixerMgr.Group.VoiceExtra];
+			case AudioSourceMgr.Type.VoiceMob:
+				return this.group_dic_[AudioMixerMgr.Group.VoiceMob];
+			default:
+				return this.group_dic_[AudioMixerMgr.Group.BGM];
+			}
+		}
+	}
+
 	public void Awake()
 	{
 		string[] array = new string[]
@@ -23,6 +53,10 @@ public class AudioMixerMgr : MonoBehaviour
 			"Master/Dance",
 			"Master/System",
 			"Master/Voice",
+			"Master/Voice/Heroine",
+			"Master/Voice/Sub",
+			"Master/Voice/Extra",
+			"Master/Voice/Mob",
 			"Master/SE",
 			"Master/Env"
 		};
@@ -44,6 +78,10 @@ public class AudioMixerMgr : MonoBehaviour
 		this.group_dic_.Add(AudioMixerMgr.Group.Dance, this.Mixer.FindMatchingGroups("Master/Dance")[0]);
 		this.group_dic_.Add(AudioMixerMgr.Group.System, this.Mixer.FindMatchingGroups("Master/System")[0]);
 		this.group_dic_.Add(AudioMixerMgr.Group.Voice, this.Mixer.FindMatchingGroups("Master/Voice")[0]);
+		this.group_dic_.Add(AudioMixerMgr.Group.VoiceHeroine, this.Mixer.FindMatchingGroups("Master/Voice/Heroine")[0]);
+		this.group_dic_.Add(AudioMixerMgr.Group.VoiceSub, this.Mixer.FindMatchingGroups("Master/Voice/Sub")[0]);
+		this.group_dic_.Add(AudioMixerMgr.Group.VoiceExtra, this.Mixer.FindMatchingGroups("Master/Voice/Extra")[0]);
+		this.group_dic_.Add(AudioMixerMgr.Group.VoiceMob, this.Mixer.FindMatchingGroups("Master/Voice/Mob")[0]);
 		this.group_dic_.Add(AudioMixerMgr.Group.SE, this.Mixer.FindMatchingGroups("Master/SE")[0]);
 		this.group_dic_.Add(AudioMixerMgr.Group.Env, this.Mixer.FindMatchingGroups("Master/Env")[0]);
 	}
@@ -82,7 +120,7 @@ public class AudioMixerMgr : MonoBehaviour
 		}
 	}
 
-	public const int kGroupMax = 7;
+	public const int kGroupMax = 11;
 
 	public AudioMixer Mixer;
 
@@ -103,6 +141,10 @@ public class AudioMixerMgr : MonoBehaviour
 		BGM,
 		Dance,
 		Voice,
+		VoiceHeroine,
+		VoiceSub,
+		VoiceExtra,
+		VoiceMob,
 		SE,
 		Env
 	}

+ 29 - 1
Assembly-CSharp/AudioSourceMgr.cs

@@ -10,6 +10,10 @@ public class AudioSourceMgr : MonoBehaviour
 		{
 			return this.m_eType;
 		}
+		set
+		{
+			this.m_eType = value;
+		}
 	}
 
 	public float FadeVolume
@@ -63,6 +67,18 @@ public class AudioSourceMgr : MonoBehaviour
 		case AudioSourceMgr.Type.Voice:
 			outputAudioMixerGroup = this.m_gcSoundMgr.mix_mgr[AudioMixerMgr.Group.Voice];
 			break;
+		case AudioSourceMgr.Type.VoiceHeroine:
+			outputAudioMixerGroup = this.m_gcSoundMgr.mix_mgr[AudioMixerMgr.Group.VoiceHeroine];
+			break;
+		case AudioSourceMgr.Type.VoiceSub:
+			outputAudioMixerGroup = this.m_gcSoundMgr.mix_mgr[AudioMixerMgr.Group.VoiceSub];
+			break;
+		case AudioSourceMgr.Type.VoiceExtra:
+			outputAudioMixerGroup = this.m_gcSoundMgr.mix_mgr[AudioMixerMgr.Group.VoiceExtra];
+			break;
+		case AudioSourceMgr.Type.VoiceMob:
+			outputAudioMixerGroup = this.m_gcSoundMgr.mix_mgr[AudioMixerMgr.Group.VoiceMob];
+			break;
 		}
 		this.audiosource.outputAudioMixerGroup = outputAudioMixerGroup;
 	}
@@ -227,7 +243,7 @@ public class AudioSourceMgr : MonoBehaviour
 			return;
 		}
 		AFileSystemBase[] array;
-		if (this.m_eType == AudioSourceMgr.Type.Voice)
+		if (this.m_eType == AudioSourceMgr.Type.Voice || this.m_eType == AudioSourceMgr.Type.VoiceHeroine || this.m_eType == AudioSourceMgr.Type.VoiceSub || this.m_eType == AudioSourceMgr.Type.VoiceExtra || this.m_eType == AudioSourceMgr.Type.VoiceMob)
 		{
 			if (this.m_gcSoundMgr.compatibilityMode)
 			{
@@ -465,6 +481,10 @@ public class AudioSourceMgr : MonoBehaviour
 		1f,
 		1f,
 		1f,
+		1f,
+		1f,
+		1f,
+		1f,
 		1f
 	};
 
@@ -474,6 +494,10 @@ public class AudioSourceMgr : MonoBehaviour
 		0.8f,
 		0.5f,
 		0.15f,
+		2.8f,
+		2.8f,
+		2.8f,
+		2.8f,
 		2.8f
 	};
 
@@ -542,6 +566,10 @@ public class AudioSourceMgr : MonoBehaviour
 		System,
 		Env,
 		Voice,
+		VoiceHeroine,
+		VoiceSub,
+		VoiceExtra,
+		VoiceMob,
 		Max
 	}
 }

+ 12 - 2
Assembly-CSharp/BacklogCtrl.cs

@@ -23,7 +23,15 @@ public class BacklogCtrl : MonoBehaviour
 					if (!string.IsNullOrEmpty(component.name))
 					{
 						UIButton uibutton = component;
-						uibutton.name = uibutton.name + "|" + backlogUnit.m_voicePitch;
+						string name = uibutton.name;
+						uibutton.name = string.Concat(new object[]
+						{
+							name,
+							"|",
+							backlogUnit.m_voicePitch,
+							"|",
+							backlogUnit.m_voiceType.ToString()
+						});
 					}
 				}
 				else
@@ -75,7 +83,7 @@ public class BacklogCtrl : MonoBehaviour
 				'|'
 			});
 			GameMain.Instance.SoundMgr.VoiceStopAll();
-			GameMain.Instance.SoundMgr.PlayDummyVoice(array[0], 0f, false, false, int.Parse(array[1]));
+			GameMain.Instance.SoundMgr.PlayDummyVoice(array[0], 0f, false, false, int.Parse(array[1]), (AudioSourceMgr.Type)Enum.Parse(typeof(AudioSourceMgr.Type), array[2]));
 		}
 		Debug.Log(string.Format("ボイスボタン ボイスID={0}がクリックされました。", name));
 	}
@@ -92,6 +100,8 @@ public class BacklogCtrl : MonoBehaviour
 
 		public int m_voicePitch { get; set; }
 
+		public AudioSourceMgr.Type m_voiceType { get; set; }
+
 		public override string ToString()
 		{
 			return string.Format("BacklogUnit=[m_speakerName={1}, m_msg={2}, m_voiceId={3}]", this.m_speakerName, this.m_msg, this.m_voiceId);

+ 13 - 5
Assembly-CSharp/BaseKagManager.cs

@@ -805,7 +805,7 @@ public class BaseKagManager : IDisposable
 		WaitEventList waitEventList = this.GetWaitEventList("motion_script");
 		if (num <= 0)
 		{
-			this.script_mgr_.LoadMotionScript(sloat, false, file_name, label_name, maid_guid, man_guid, false, vailed_pos);
+			this.script_mgr_.LoadMotionScript(sloat, false, file_name, label_name, maid_guid, man_guid, false, vailed_pos, false);
 			waitEventList.Clear();
 			if (this.script_mgr_.is_motion_all_prop_seq && this.script_mgr_.motion_all_prop_seq_maid != null)
 			{
@@ -832,7 +832,7 @@ public class BaseKagManager : IDisposable
 				}
 				if (maid != null && maid.body0 != null && maid.body0.isLoadedBody)
 				{
-					this.script_mgr_.LoadMotionScript(sloat, false, file_name, label_name, maid_guid, man_guid, false, vailed_pos);
+					this.script_mgr_.LoadMotionScript(sloat, false, file_name, label_name, maid_guid, man_guid, false, vailed_pos, false);
 					NDebug.Assert(!this.script_mgr_.is_motion_all_prop_seq, "motionscript wait内でのAllProcPropSeqStartはできません");
 				}
 			}, num);
@@ -2603,12 +2603,19 @@ public class BaseKagManager : IDisposable
 			}
 			else
 			{
-				GameMain.Instance.SoundMgr.PlayDummyVoice(text, GameUty.MillisecondToSecond(millisecond), true, flag, 50);
+				int voice_pitch = 50;
+				AudioSourceMgr.Type soundType = AudioSourceMgr.Type.Voice;
+				if (maidAndMan != null)
+				{
+					voice_pitch = maidAndMan.VoicePitch;
+					soundType = maidAndMan.AudioMan.SoundType;
+				}
+				GameMain.Instance.SoundMgr.PlayDummyVoice(text, GameUty.MillisecondToSecond(millisecond), true, flag, voice_pitch, soundType);
 			}
 		}
 		else
 		{
-			GameMain.Instance.SoundMgr.PlayDummyVoice(text, GameUty.MillisecondToSecond(millisecond), true, flag, 50);
+			GameMain.Instance.SoundMgr.PlayDummyVoice(text, GameUty.MillisecondToSecond(millisecond), true, flag, 50, AudioSourceMgr.Type.Voice);
 			if (GameMain.Instance.SoundMgr.m_AudioDummyVoice.isPlay() && GameMain.Instance.SoundMgr.m_AudioDummyVoice.audiosource.clip != null)
 			{
 				num = (int)(GameMain.Instance.SoundMgr.m_AudioDummyVoice.audiosource.clip.length * 1000f);
@@ -3797,6 +3804,7 @@ public class BaseKagManager : IDisposable
 				NDebug.Assert(maid.boNPC, "NPCメイドではないメイドにNPCプリセットを適用しようとしました");
 			}
 			CharacterMgr.npcDatas[text].Apply(maid, false);
+			maid.status.voiceGroup = VoiceGroup.Sub;
 		}
 		else if (tag_data.IsValid("pc"))
 		{
@@ -5103,7 +5111,7 @@ public class BaseKagManager : IDisposable
 	public void Serialize(BinaryWriter binary)
 	{
 		binary.Write("CM3D2_KAG");
-		binary.Write(1240);
+		binary.Write(1250);
 		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(1240);
+				binaryWriter.Write(1250);
 				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(1240);
+				binaryWriter.Write(1250);
 				binaryWriter.Write(this.save_data_.Count);
 				foreach (KeyValuePair<string, Dictionary<string, Dictionary<string, string>>> keyValuePair3 in this.save_data_)
 				{

+ 2 - 2
Assembly-CSharp/BjMotionControl.cs

@@ -266,7 +266,7 @@ public class BjMotionControl : MonoBehaviour
 		this.nMotionName = label;
 		this.m_ScriptMgr.StopMotionScript();
 		this.m_ScriptMgr.is_motion_blend = this.m_IsMotionBlend;
-		this.m_ScriptMgr.LoadMotionScript(0, false, "work_002.ks", label, string.Empty, string.Empty, false, true);
+		this.m_ScriptMgr.LoadMotionScript(0, false, "work_002.ks", label, string.Empty, string.Empty, false, true, false);
 		this.m_IsMotionBlend = true;
 		if (!this.IsWait)
 		{
@@ -289,7 +289,7 @@ public class BjMotionControl : MonoBehaviour
 		this.nMotionName = first_label;
 		this.m_ScriptMgr.StopMotionScript();
 		this.m_ScriptMgr.is_motion_blend = this.m_IsMotionBlend;
-		this.m_ScriptMgr.LoadMotionScript(0, false, "work_002.ks", first_label, string.Empty, string.Empty, false, true);
+		this.m_ScriptMgr.LoadMotionScript(0, false, "work_002.ks", first_label, string.Empty, string.Empty, false, true, false);
 		this.m_IsMotionBlend = true;
 		if (!this.IsWait)
 		{

+ 13 - 5
Assembly-CSharp/CMSystem.cs

@@ -808,7 +808,7 @@ public class CMSystem
 	{
 		XElement xelement = new XElement("Config", new object[]
 		{
-			new XAttribute("Version", 1240),
+			new XAttribute("Version", 1250),
 			new XElement("System", new XElement("SysButtonShowAlways", this.SysButtonShowAlways)),
 			new XElement("Screen", new object[]
 			{
@@ -921,6 +921,14 @@ public class CMSystem
 			{
 				XDocument xdocument = XDocument.Load(text);
 				XElement xelement = xdocument.Element("Config");
+				int version = 0;
+				try
+				{
+					version = int.Parse(xelement.Attribute("Version").Value);
+				}
+				catch (Exception)
+				{
+				}
 				XElement xelm = xelement.Element("System");
 				this.SysButtonShowAlways = bool.Parse(this.getElemetn(xelm, "SysButtonShowAlways", "true").Value);
 				XElement xelm2 = xelement.Element("Screen");
@@ -1092,7 +1100,7 @@ public class CMSystem
 				{
 					this.m_SConfig = JsonUtility.FromJson<CMSystem.SerializeConfig>(xelement6.Value);
 				}
-				GameMain.Instance.SoundMgr.LoadIni(xelement);
+				GameMain.Instance.SoundMgr.LoadIni(xelement, version);
 				Debug.Log("コンフィグ内容 " + xdocument.ToString(SaveOptions.DisableFormatting));
 			}
 			catch (Exception ex)
@@ -1125,7 +1133,7 @@ public class CMSystem
 		MemoryStream memoryStream = new MemoryStream();
 		BinaryWriter binaryWriter = new BinaryWriter(memoryStream);
 		binaryWriter.Write("CM3D2_SYSTEM2");
-		binaryWriter.Write(1240);
+		binaryWriter.Write(1250);
 		binaryWriter.Write(this.m_dicEditColorPresetData.Count);
 		foreach (KeyValuePair<int, Dictionary<string, int>> keyValuePair in this.m_dicEditColorPresetData)
 		{
@@ -1733,7 +1741,7 @@ public class CMSystem
 
 		public void OnBeforeSerialize()
 		{
-			this.m_nVersion = 1240;
+			this.m_nVersion = 1250;
 		}
 
 		public void OnAfterDeserialize()
@@ -1741,7 +1749,7 @@ public class CMSystem
 		}
 
 		[SerializeField]
-		private int m_nVersion = 1240;
+		private int m_nVersion = 1250;
 
 		[SerializeField]
 		private string m_strDShowFilter = "Microsoft DTV-DVD Video Decoder";

+ 69 - 8
Assembly-CSharp/CharacterMgr.cs

@@ -3,7 +3,9 @@ using System.Collections.Generic;
 using System.IO;
 using System.Linq;
 using System.Text;
+using MaidStatus;
 using PlayerStatus;
+using SceneNPCEdit;
 using Schedule;
 using UnityEngine;
 using wf;
@@ -32,7 +34,7 @@ public class CharacterMgr : MonoBehaviour
 		}
 	}
 
-	public Status status
+	public PlayerStatus.Status status
 	{
 		get
 		{
@@ -214,7 +216,7 @@ public class CharacterMgr : MonoBehaviour
 	public void Init(GameMain f_gcGameMain)
 	{
 		BoneMorph.Init();
-		this.m_PlayerStatus = new Status();
+		this.m_PlayerStatus = new PlayerStatus.Status();
 		this.m_goCharacter = new GameObject("Character");
 		this.m_goCharacter.transform.parent = f_gcGameMain.transform;
 		this.m_goActive = new GameObject("Active");
@@ -328,6 +330,18 @@ public class CharacterMgr : MonoBehaviour
 		}
 		array[f_nActiveSlotNo] = gameObject;
 		array2[f_nActiveSlotNo] = f_maid;
+		if (!f_bMan && f_maid.status != null)
+		{
+			if (f_maid.status.heroineType != HeroineType.Sub)
+			{
+				f_maid.status.voiceGroup = VoiceGroup.Heroine;
+			}
+			if (f_maid.status.subCharaStatus != null)
+			{
+				string contractText = f_maid.status.subCharaStatus.contractText;
+				f_maid.status.voiceGroup = ((!(contractText == "ユニーク")) ? VoiceGroup.Extra : VoiceGroup.Sub);
+			}
+		}
 		f_maid.DutPropAll();
 		f_maid.AllProcPropSeqStart();
 	}
@@ -976,7 +990,7 @@ public class CharacterMgr : MonoBehaviour
 		BinaryWriter binaryWriter = new BinaryWriter(memoryStream);
 		string result = string.Empty;
 		binaryWriter.Write("CM3D2_PRESET_S");
-		binaryWriter.Write(1240);
+		binaryWriter.Write(1250);
 		binaryWriter.Write((char)presset_type);
 		maid.SerializePropLowCapacity(binaryWriter);
 		maid.SerializeMultiColor(binaryWriter);
@@ -993,7 +1007,7 @@ public class CharacterMgr : MonoBehaviour
 		MemoryStream memoryStream = new MemoryStream();
 		BinaryWriter binaryWriter = new BinaryWriter(memoryStream);
 		binaryWriter.Write("CM3D2_PRESET");
-		binaryWriter.Write(1240);
+		binaryWriter.Write(1250);
 		binaryWriter.Write((int)f_type);
 		if (texture2D != null)
 		{
@@ -1032,6 +1046,31 @@ public class CharacterMgr : MonoBehaviour
 		return preset;
 	}
 
+	public byte[] PresetSaveNotWriteFile(Maid f_maid, CharacterMgr.PresetType f_type)
+	{
+		CharacterMgr.Preset preset = new CharacterMgr.Preset();
+		Texture2D texture2D = this.ThumShot(f_maid);
+		MemoryStream memoryStream = new MemoryStream();
+		BinaryWriter binaryWriter = new BinaryWriter(memoryStream);
+		binaryWriter.Write("CM3D2_PRESET");
+		binaryWriter.Write(1250);
+		binaryWriter.Write((int)f_type);
+		if (texture2D != null)
+		{
+			byte[] array = texture2D.EncodeToPNG();
+			binaryWriter.Write(array.Length);
+			binaryWriter.Write(array);
+		}
+		else
+		{
+			binaryWriter.Write(0);
+		}
+		f_maid.SerializeProp(binaryWriter);
+		f_maid.SerializeMultiColor(binaryWriter);
+		f_maid.SerializeBody(binaryWriter);
+		return memoryStream.ToArray();
+	}
+
 	public void PresetSaveAsQRCode(Maid f_maid, CharacterMgr.PresetType f_type)
 	{
 		Texture2D texture2D = Utility.CreateQRCodeTexture(CharacterMgr.CreatePresetLowCapacityData(f_maid, f_type), 512, 512);
@@ -1273,7 +1312,7 @@ public class CharacterMgr : MonoBehaviour
 	public bool Serialize(BinaryWriter bwWrite)
 	{
 		bwWrite.Write("CM3D2_CHR_MGR");
-		bwWrite.Write(1240);
+		bwWrite.Write(1250);
 		this.m_PlayerStatus.Serialize(bwWrite);
 		bwWrite.Write(this.m_listStockMan.Count);
 		for (int i = 0; i < this.m_listStockMan.Count; i++)
@@ -1396,7 +1435,7 @@ public class CharacterMgr : MonoBehaviour
 
 	private GameObject m_goChaches;
 
-	private Status m_PlayerStatus;
+	private PlayerStatus.Status m_PlayerStatus;
 
 	private List<Maid> m_listStockMaid = new List<Maid>();
 
@@ -1422,6 +1461,20 @@ public class CharacterMgr : MonoBehaviour
 			this.uniqueName = csv.GetCellAsString(num++, lineY);
 			this.lastName = csv.GetCellAsString(num++, lineY);
 			this.firstName = csv.GetCellAsString(num++, lineY);
+			string cellAsString = csv.GetCellAsString(num++, lineY);
+			this.voiceGroup = VoiceGroup.Mob;
+			if (!string.IsNullOrEmpty(cellAsString))
+			{
+				try
+				{
+					this.voiceGroup = (VoiceGroup)Enum.Parse(typeof(VoiceGroup), cellAsString);
+				}
+				catch (Exception ex)
+				{
+					Debug.LogError(ex.StackTrace);
+					Debug.LogError(ex.Message);
+				}
+			}
 			this.presetFileName = Path.GetFileNameWithoutExtension(csv.GetCellAsString(num++, lineY));
 			if (!string.IsNullOrEmpty(this.presetFileName))
 			{
@@ -1451,7 +1504,12 @@ public class CharacterMgr : MonoBehaviour
 					maid.status.firstName = this.firstName;
 					maid.status.lastName = this.lastName;
 				}
-				if (this.isResourcesLoad)
+				CharacterMgr.Preset preset = SaveData.GetPreset(this);
+				if (preset != null)
+				{
+					characterMgr.PresetSet(maid, preset);
+				}
+				else if (this.isResourcesLoad)
 				{
 					characterMgr.PresetSet(maid, characterMgr.PresetLoadFromResources(this.presetFileName));
 				}
@@ -1469,6 +1527,7 @@ public class CharacterMgr : MonoBehaviour
 						}
 					}
 				}
+				maid.status.voiceGroup = this.voiceGroup;
 			}
 			else
 			{
@@ -1483,11 +1542,13 @@ public class CharacterMgr : MonoBehaviour
 
 		public readonly string lastName;
 
+		public readonly VoiceGroup voiceGroup;
+
 		public readonly string presetFileName;
 
 		public readonly string menuFileName;
 
-		private bool isResourcesLoad;
+		public readonly bool isResourcesLoad;
 	}
 
 	public class CharaPer

+ 156 - 0
Assembly-CSharp/CharacterSelectMain.cs

@@ -57,6 +57,7 @@ public class CharacterSelectMain : WfScreenChildren
 			return;
 		}
 		bool flag = this.scene_chara_select_.select_type != SceneCharacterSelect.SelectType.NewYotogiAdditional;
+		flag &= (this.scene_chara_select_.select_type != SceneCharacterSelect.SelectType.LifeModeRecollection);
 		if (flag)
 		{
 			for (int i = 0; i < this.chara_mgr_.GetMaidCount(); i++)
@@ -469,6 +470,35 @@ public class CharacterSelectMain : WfScreenChildren
 			this.button_dic_["全解除"].gameObject.SetActive(false);
 			this.SetExplanatoryLabel("ライフモードに登場するメイドを選択してください");
 		}
+		else if (this.scene_chara_select_.select_type == SceneCharacterSelect.SelectType.LifeModeRecollection)
+		{
+			this.chara_select_mgr_.SetCallBackMaidList(delegate(List<Maid> draw_maid_list)
+			{
+				List<Maid> list3 = new List<Maid>();
+				CharacterSelectManager.DefaultMaidList(list3);
+				foreach (Maid item in EmpireLifeModeAPI.SelectionMaidList(list3))
+				{
+					draw_maid_list.Add(item);
+				}
+			});
+			this.chara_select_mgr_.big_thumbnail.isEnabled = false;
+			this.CreateSelectedMaidPanelOfLifeModeRecollection();
+			this.chara_select_mgr_.SetCallBackOnMultiSelect(new CharacterSelectManager.CallBackOnMultiSelect(this.OnMultiSelectCharaLifeModeRecollection));
+			this.chara_select_mgr_.Create(CharacterSelectManager.Type.Multiple, EmpireLifeModeAPI.GetEnabledPersonalListOfRecollection().Count, false);
+			this.button_dic_["OK"].isEnabled = false;
+			if (this.chara_select_mgr_.maid_list_count == 1)
+			{
+				this.chara_select_mgr_.SelectAllMaid();
+				this.auto_select_ = true;
+			}
+			if (!this.auto_select_)
+			{
+				GameMain.Instance.SoundMgr.PlayBGM("BGM015.ogg", 0.5f, true);
+			}
+			this.button_dic_["全選択"].gameObject.SetActive(false);
+			this.button_dic_["全解除"].gameObject.SetActive(false);
+			this.SetExplanatoryLabel("ライフモードに登場するメイドを選択してください");
+		}
 		CharacterMgr characterMgr = GameMain.Instance.CharacterMgr;
 		for (int m = 0; m < characterMgr.GetStockMaidCount(); m++)
 		{
@@ -609,6 +639,20 @@ public class CharacterSelectMain : WfScreenChildren
 		this.button_dic_["OK"].isEnabled = (this.loaded_check_maid_.Count > 0);
 	}
 
+	private void OnMultiSelectCharaLifeModeRecollection(Maid[] maidArray)
+	{
+		this.loaded_check_maid_.Clear();
+		foreach (Maid maid in maidArray)
+		{
+			if (maid != null)
+			{
+				this.loaded_check_maid_.Add(maid);
+			}
+		}
+		this.UpdateSelectedMaidPanelOfLifeModeRecollection(maidArray);
+		this.button_dic_["OK"].isEnabled = (this.loaded_check_maid_.Count > 0);
+	}
+
 	private void OnClickButton()
 	{
 		string text = string.Empty;
@@ -741,6 +785,11 @@ public class CharacterSelectMain : WfScreenChildren
 			GameMain.Instance.LifeModeMgr.SetAllMaidList(this.loaded_check_maid_);
 			this.loaded_check_maid_.Clear();
 		}
+		if (this.scene_chara_select_.select_type == SceneCharacterSelect.SelectType.LifeModeRecollection)
+		{
+			GameMain.Instance.LifeModeMgr.SetAllMaidList(this.loaded_check_maid_);
+			this.loaded_check_maid_.Clear();
+		}
 		if (this.scene_chara_select_.select_type == SceneCharacterSelect.SelectType.NewYotogiAdditional)
 		{
 			this.loaded_check_maid_.Clear();
@@ -938,6 +987,113 @@ public class CharacterSelectMain : WfScreenChildren
 		this.chara_select_mgr_.SelectAllReleaseMaid();
 	}
 
+	private void CreateSelectedMaidPanelOfLifeModeRecollection()
+	{
+		this.m_SelectedMaidPanelParent.SetActive(true);
+		GameObject gameObject = Utility.CreatePrefab(this.m_SelectedMaidPanelGrid.gameObject, "CharacterSelect/Prefab/MaidPlateSimple", true);
+		gameObject.SetActive(false);
+		this.m_SelectedMaidPanelListViewer.tempItem = gameObject;
+		this.m_SelectedMaidPanelListViewer.Show<MaidPlate>(EmpireLifeModeAPI.GetEnabledPersonalListOfRecollection().Count, delegate(int index, MaidPlate maidPlate)
+		{
+			if (EmpireLifeModeAPI.GetEnabledPersonalListOfRecollection().Count <= index)
+			{
+				maidPlate.gameObject.SetActive(false);
+			}
+			else
+			{
+				maidPlate.gameObject.SetActive(true);
+			}
+			maidPlate.SetEmpty();
+			UIButton uibutton = UTY.GetChildObject(maidPlate.gameObject, "Button", false).AddComponent<UIButton>();
+			EventDelegate.Add(uibutton.onClick, delegate()
+			{
+				if (maidPlate.maid != null)
+				{
+					this.chara_select_mgr_.MoveGridArea(maidPlate.maid);
+					this.chara_select_mgr_.SetSelectStateMaid(maidPlate.maid, false);
+				}
+			});
+			maidPlate.GetComponentInChildren<Collider>().enabled = false;
+			maidPlate.GetComponentInChildren<UIButton>().defaultColor = new Color(0f, 0f, 0f, 0.5f);
+			maidPlate.GetComponentInChildren<UIPlayAnimation>().enabled = false;
+		});
+		this.m_SelectedMaidPanelButtonAutoSelect.gameObject.SetActive(false);
+		EventDelegate.Add(this.m_SelectedMaidPanelButtonAllRelease.onClick, new EventDelegate.Callback(this.OnClickButtonMaidAllRelease));
+	}
+
+	private void UpdateSelectedMaidPanelOfLifeModeRecollection(Maid[] nowMaidSelectState)
+	{
+		bool flag = false;
+		int num = 0;
+		while (num < nowMaidSelectState.Length && num < this.m_SelectedMaidPanelListViewer.ItemArray.Length)
+		{
+			GameObject gameObject = this.m_SelectedMaidPanelListViewer.ItemArray[num];
+			MaidPlate component = gameObject.GetComponent<MaidPlate>();
+			UIButton componentInChildren = gameObject.GetComponentInChildren<UIButton>();
+			Maid maid = nowMaidSelectState[num];
+			component.GetComponentInChildren<Collider>().enabled = (maid != null);
+			componentInChildren.defaultColor = ((!(maid != null)) ? new Color(0f, 0f, 0f, 0.5f) : new Color(0f, 0f, 0f, 0f));
+			if (maid == null)
+			{
+				component.SetEmpty();
+				component.transform.SetAsLastSibling();
+				flag = true;
+			}
+			if (!gameObject.activeSelf)
+			{
+				gameObject.SetActive(true);
+				component.transform.SetAsLastSibling();
+				flag = true;
+			}
+			if (maid != component.maid)
+			{
+				component.SetMaidData(maid);
+				component.transform.SetAsLastSibling();
+				flag = true;
+			}
+			num++;
+		}
+		if (flag)
+		{
+			this.m_SelectedMaidPanelGrid.Reposition();
+		}
+		foreach (Transform transform in this.chara_select_mgr_.MaidPlateParentGrid.GetChildList())
+		{
+			MaidPlate component2 = transform.GetComponent<MaidPlate>();
+			if (component2.maid != null && this.loaded_check_maid_.Contains(component2.maid))
+			{
+				this.chara_select_mgr_.MoveNoDrawArea(component2.maid);
+			}
+		}
+		foreach (MaidPlate maidPlate in this.chara_select_mgr_.NoDrawArea.GetComponentsInChildren<MaidPlate>())
+		{
+			if (maidPlate.maid != null && !this.loaded_check_maid_.Contains(maidPlate.maid))
+			{
+				this.chara_select_mgr_.MoveGridArea(maidPlate.maid);
+			}
+		}
+		List<string> list = new List<string>();
+		foreach (Maid maid2 in nowMaidSelectState)
+		{
+			if (maid2 != null && !list.Contains(maid2.status.personal.uniqueName))
+			{
+				list.Add(maid2.status.personal.uniqueName);
+			}
+		}
+		foreach (Transform transform2 in this.chara_select_mgr_.MaidPlateParentGrid.GetChildList())
+		{
+			MaidPlate component3 = transform2.GetComponent<MaidPlate>();
+			UIButton componentInChildren2 = component3.GetComponentInChildren<UIButton>(true);
+			bool flag2 = true;
+			if (component3.maid == null || list.Contains(component3.maid.status.personal.uniqueName))
+			{
+				flag2 = false;
+			}
+			componentInChildren2.defaultColor = ((!flag2) ? new Color(0f, 0f, 0f, 0.5f) : new Color(0f, 0f, 0f, 0f));
+			componentInChildren2.gameObject.SetActive(flag2);
+		}
+	}
+
 	private SceneCharacterSelect scene_chara_select_;
 
 	private Maid select_maid_;

+ 1 - 1
Assembly-CSharp/CompetitiveShowAPI.cs

@@ -46,7 +46,7 @@ public class CompetitiveShowAPI
 		Maid maid = GameMain.Instance.CharacterMgr.GetMaid(0);
 		ScriptManager script_mgr = GameMain.Instance.ScriptMgr;
 		script_mgr.is_motion_blend = false;
-		script_mgr.LoadMotionScript(0, false, "h_kaiwa_tati_001.ks", "*会話立ち待機", string.Empty, string.Empty, false, true);
+		script_mgr.LoadMotionScript(0, false, "h_kaiwa_tati_001.ks", "*会話立ち待機", string.Empty, string.Empty, false, true, false);
 		script_mgr.is_motion_blend = true;
 		maid.FaceAnime("通常", 1f, 0);
 		maid.FaceBlend("無し");

+ 2 - 2
Assembly-CSharp/CompetitiveShowMgr.cs

@@ -202,7 +202,7 @@ public class CompetitiveShowMgr : BasePanelMgr
 				}
 				KeyValuePair<string, string> competitiveMotionFileVictory = maid.status.personal.competitiveMotionFileVictory;
 				this.ClassEffect.SetActive(true);
-				GameMain.Instance.ScriptMgr.LoadMotionScript(0, false, competitiveMotionFileVictory.Key, competitiveMotionFileVictory.Value, string.Empty, string.Empty, false, true);
+				GameMain.Instance.ScriptMgr.LoadMotionScript(0, false, competitiveMotionFileVictory.Key, competitiveMotionFileVictory.Value, string.Empty, string.Empty, false, true, false);
 			}
 			else
 			{
@@ -216,7 +216,7 @@ public class CompetitiveShowMgr : BasePanelMgr
 				}
 				KeyValuePair<string, string> competitiveMotionFileDefeat = maid.status.personal.competitiveMotionFileDefeat;
 				GameMain.Instance.SoundMgr.PlaySe("SE021.ogg", false);
-				GameMain.Instance.ScriptMgr.LoadMotionScript(0, false, competitiveMotionFileDefeat.Key, competitiveMotionFileDefeat.Value, string.Empty, string.Empty, false, true);
+				GameMain.Instance.ScriptMgr.LoadMotionScript(0, false, competitiveMotionFileDefeat.Key, competitiveMotionFileDefeat.Value, string.Empty, string.Empty, false, true, false);
 			}
 			this.wait_time = Time.time + 3f;
 			this.phase_status_ = CompetitiveShowMgr.PhaseStatus.MotionPlay;

+ 0 - 726
Assembly-CSharp/ConfigCtrl.cs

@@ -1,726 +0,0 @@
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.Text.RegularExpressions;
-using UnityEngine;
-
-public class ConfigCtrl : MonoBehaviour
-{
-	public void Init(GameObject configPanel)
-	{
-		this.m_sysBtnShowAlwaysOn = UTY.GetChildObject(configPanel, "System/SysButtonShowAlways/On", false).GetComponent<UIButton>();
-		this.m_sysBtnShowAlwaysOff = UTY.GetChildObject(configPanel, "System/SysButtonShowAlways/Off", false).GetComponent<UIButton>();
-		EventDelegate.Add(this.m_sysBtnShowAlwaysOn.onClick, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnSysButtonShowAlwaysEnabled));
-		EventDelegate.Add(this.m_sysBtnShowAlwaysOff.onClick, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnSysButtonShowAlwaysDisabled));
-		UTY.GetChildObject(configPanel, "CategorySwitch", false).SetActive(false);
-		GameObject childObject = UTY.GetChildObject(configPanel, "Screen", false);
-		this.m_fullScreenOn = UTY.GetChildObject(childObject, "FullScreen/On", false).GetComponent<UIButton>();
-		this.m_fullScreenOff = UTY.GetChildObject(childObject, "FullScreen/Off", false).GetComponent<UIButton>();
-		EventDelegate.Add(this.m_fullScreenOn.onClick, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnFullScreenEnabled));
-		EventDelegate.Add(this.m_fullScreenOff.onClick, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnFullScreenDisabled));
-		this.m_plResolution = UTY.GetChildObject(childObject, "Resolution/PopupList", false).GetComponent<UIPopupList>();
-		List<Size<int>> list = this.MakeResolutionPopupList();
-		foreach (Size<int> size in list)
-		{
-			this.m_plResolution.items.Add(this.ToResolutionOption(size));
-		}
-		EventDelegate.Add(this.m_plResolution.onChange, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnResolutionChange));
-		this.m_plAntiAlias = UTY.GetChildObject(childObject, "AntiAlias/PopupList", false).GetComponent<UIPopupList>();
-		IEnumerator enumerator2 = Enum.GetValues(typeof(CMSystem.AntiAliasType)).GetEnumerator();
-		try
-		{
-			while (enumerator2.MoveNext())
-			{
-				object obj = enumerator2.Current;
-				this.MakePopupListOption(this.m_plAntiAlias, obj.ToString());
-			}
-		}
-		finally
-		{
-			IDisposable disposable;
-			if ((disposable = (enumerator2 as IDisposable)) != null)
-			{
-				disposable.Dispose();
-			}
-		}
-		EventDelegate.Add(this.m_plAntiAlias.onChange, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnAntiAliasChange));
-		this.m_plShadowQuality = UTY.GetChildObject(childObject, "ShadowQuality/PopupList", false).GetComponent<UIPopupList>();
-		IEnumerator enumerator3 = Enum.GetValues(typeof(CMSystem.ShadowQualityType)).GetEnumerator();
-		try
-		{
-			while (enumerator3.MoveNext())
-			{
-				object obj2 = enumerator3.Current;
-				this.MakePopupListOption(this.m_plShadowQuality, obj2.ToString());
-			}
-		}
-		finally
-		{
-			IDisposable disposable2;
-			if ((disposable2 = (enumerator3 as IDisposable)) != null)
-			{
-				disposable2.Dispose();
-			}
-		}
-		EventDelegate.Add(this.m_plShadowQuality.onChange, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnShadowQualityChange));
-		this.m_plTextureQuality = UTY.GetChildObject(childObject, "TextureQuality/PopupList", false).GetComponent<UIPopupList>();
-		IEnumerator enumerator4 = Enum.GetValues(typeof(CMSystem.TextureQualityType)).GetEnumerator();
-		try
-		{
-			while (enumerator4.MoveNext())
-			{
-				object obj3 = enumerator4.Current;
-				this.MakePopupListOption(this.m_plTextureQuality, obj3.ToString());
-			}
-		}
-		finally
-		{
-			IDisposable disposable3;
-			if ((disposable3 = (enumerator4 as IDisposable)) != null)
-			{
-				disposable3.Dispose();
-			}
-		}
-		EventDelegate.Add(this.m_plTextureQuality.onChange, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnTextureQualityChange));
-		this.m_fpsDisplayOn = UTY.GetChildObject(childObject, "FpsDisplay/On", false).GetComponent<UIButton>();
-		this.m_fpsDisplayOff = UTY.GetChildObject(childObject, "FpsDisplay/Off", false).GetComponent<UIButton>();
-		EventDelegate.Add(this.m_fpsDisplayOn.onClick, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnFpsDisplayEnabled));
-		EventDelegate.Add(this.m_fpsDisplayOff.onClick, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnFpsDisplayDisabled));
-		this.m_slBloom = UTY.GetChildObject(childObject, "Bloom/Slider", false).GetComponent<UISlider>();
-		EventDelegate.Add(this.m_slBloom.onChange, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnBloomChange));
-		this.m_plCaptureMagnification = UTY.GetChildObject(childObject, "CaptureMagnification/PopupList", false).GetComponent<UIPopupList>();
-		IEnumerator enumerator5 = Enum.GetValues(typeof(CMSystem.SSSuperSizeType)).GetEnumerator();
-		try
-		{
-			while (enumerator5.MoveNext())
-			{
-				object obj4 = enumerator5.Current;
-				this.MakePopupListOption(this.m_plCaptureMagnification, obj4.ToString());
-			}
-		}
-		finally
-		{
-			IDisposable disposable4;
-			if ((disposable4 = (enumerator5 as IDisposable)) != null)
-			{
-				disposable4.Dispose();
-			}
-		}
-		EventDelegate.Add(this.m_plCaptureMagnification.onChange, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnCaptureMagnificationChange));
-		this.m_slPlayerModelTransparency = UTY.GetChildObject(childObject, "PlayerModelTransparency/Slider", false).GetComponent<UISlider>();
-		EventDelegate.Add(this.m_slPlayerModelTransparency.onChange, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnPlayerModelTransparencyChange));
-		GameObject childObject2 = UTY.GetChildObject(configPanel, "Message", false);
-		this.m_slMessageWindowTransparency = UTY.GetChildObject(childObject2, "MessageWindowTransparency/Slider", false).GetComponent<UISlider>();
-		EventDelegate.Add(this.m_slMessageWindowTransparency.onChange, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnMessageWindowTransparencyChange));
-		this.m_slTextSpeed = UTY.GetChildObject(childObject2, "TextSpeed/Slider", false).GetComponent<UISlider>();
-		EventDelegate.Add(this.m_slTextSpeed.onChange, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnTextSpeedChange));
-		this.m_slAutoSpeed = UTY.GetChildObject(childObject2, "AutoSpeed/Slider", false).GetComponent<UISlider>();
-		EventDelegate.Add(this.m_slAutoSpeed.onChange, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnAutoSpeedChange));
-		this.m_sequentialVoiceOn = UTY.GetChildObject(childObject2, "SequentialVoice/On", false).GetComponent<UIButton>();
-		this.m_sequentialVoiceOff = UTY.GetChildObject(childObject2, "SequentialVoice/Off", false).GetComponent<UIButton>();
-		EventDelegate.Add(this.m_sequentialVoiceOn.onClick, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnSequentialVoiceEnabled));
-		EventDelegate.Add(this.m_sequentialVoiceOff.onClick, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnSequentialVoiceDisabled));
-		this.m_plSubtitleType = UTY.GetChildObject(childObject2, "Subtitle/PopupList", false).GetComponent<UIPopupList>();
-		IEnumerator enumerator6 = Enum.GetValues(typeof(SubtitleDisplayManager.DisplayType)).GetEnumerator();
-		try
-		{
-			while (enumerator6.MoveNext())
-			{
-				object obj5 = enumerator6.Current;
-				this.MakePopupListOption(this.m_plSubtitleType, SubtitleDisplayManager.EnumConvert.GetTerm((SubtitleDisplayManager.DisplayType)obj5));
-			}
-		}
-		finally
-		{
-			IDisposable disposable5;
-			if ((disposable5 = (enumerator6 as IDisposable)) != null)
-			{
-				disposable5.Dispose();
-			}
-		}
-		EventDelegate.Add(this.m_plSubtitleType.onChange, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnSubtitleDisplayTypeChange));
-		this.m_plSubtitleType.transform.parent.gameObject.SetActive(false);
-		GameObject childObject3 = UTY.GetChildObject(configPanel, "Sound", false);
-		this.m_slMasterVolume = UTY.GetChildObject(childObject3, "MasterVolume/Slider", false).GetComponent<UISlider>();
-		EventDelegate.Add(this.m_slMasterVolume.onChange, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnMasterVolumeChange));
-		this.m_slSystemVolume = UTY.GetChildObject(childObject3, "SystemVolume/Slider", false).GetComponent<UISlider>();
-		EventDelegate.Add(this.m_slSystemVolume.onChange, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnSystemVolumeChange));
-		this.m_slMusicVolume = UTY.GetChildObject(childObject3, "MusicVolume/Slider", false).GetComponent<UISlider>();
-		EventDelegate.Add(this.m_slMusicVolume.onChange, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnMusicVolumeChange));
-		this.m_slDanceVolume = UTY.GetChildObject(childObject3, "DanceVolume/Slider", false).GetComponent<UISlider>();
-		EventDelegate.Add(this.m_slDanceVolume.onChange, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnDanceVolumeChange));
-		this.m_music3d = UTY.GetChildObject(childObject3, "MusicVolume/3D", false).GetComponent<UIButton>();
-		EventDelegate.Add(this.m_music3d.onClick, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnMusic3DActive));
-		this.m_slVoiceVolume = UTY.GetChildObject(childObject3, "VoiceVolume/Slider", false).GetComponent<UISlider>();
-		EventDelegate.Add(this.m_slVoiceVolume.onChange, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnVoiceVolumeChange));
-		this.m_voice3d = UTY.GetChildObject(childObject3, "VoiceVolume/3D", false).GetComponent<UIButton>();
-		EventDelegate.Add(this.m_voice3d.onClick, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnVoice3DActive));
-		this.m_slSoundEffectVolume = UTY.GetChildObject(childObject3, "SoundEffectVolume/Slider", false).GetComponent<UISlider>();
-		EventDelegate.Add(this.m_slSoundEffectVolume.onChange, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnSoundEffectVolumeChange));
-		this.m_soundEffect3d = UTY.GetChildObject(childObject3, "SoundEffectVolume/3D", false).GetComponent<UIButton>();
-		EventDelegate.Add(this.m_soundEffect3d.onClick, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnSoundEffect3DActive));
-		this.m_slSoundEnvironmentVolume = UTY.GetChildObject(childObject3, "SoundEnvironmentVolume/Slider", false).GetComponent<UISlider>();
-		EventDelegate.Add(this.m_slSoundEnvironmentVolume.onChange, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnSoundEnvironmentVolumeChange));
-		this.m_soundEnvironment3d = UTY.GetChildObject(childObject3, "SoundEnvironmentVolume/3D", false).GetComponent<UIButton>();
-		EventDelegate.Add(this.m_soundEnvironment3d.onClick, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.OnSoundEnvironment3DActive));
-		this.m_ejaculationSeEnabledOn = UTY.GetChildObject(childObject3, "EjaculationSeEnabled/On", false).GetComponent<UIButton>();
-		this.m_ejaculationSeEnabledOff = UTY.GetChildObject(childObject3, "EjaculationSeEnabled/Off", false).GetComponent<UIButton>();
-		EventDelegate.Add(this.m_ejaculationSeEnabledOn.onClick, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.SetEjaculationSeEnabled));
-		EventDelegate.Add(this.m_ejaculationSeEnabledOff.onClick, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.SetEjaculationSeDisabled));
-		this.m_okButton = UTY.GetChildObject(configPanel, "OK", false).GetComponent<UIButton>();
-		EventDelegate.Add(this.m_okButton.onClick, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.CloseConfigPanel));
-		this.m_changeVRConfigButton = UTY.GetChildObject(configPanel, "Change VR", false).GetComponent<UIButton>();
-		EventDelegate.Add(this.m_changeVRConfigButton.onClick, delegate()
-		{
-			BaseMgr<ConfigMgr>.Instance.CloseConfigPanel();
-			ConfigVRCtrl.Open(null);
-		});
-		this.activeColor = new Color(this.m_sysBtnShowAlwaysOn.defaultColor.r, this.m_sysBtnShowAlwaysOn.defaultColor.g, this.m_sysBtnShowAlwaysOn.defaultColor.b, 1f);
-		this.inActiveColor = this.m_sysBtnShowAlwaysOn.defaultColor;
-		this.LoadConfigData();
-	}
-
-	private void MakePopupListOption(UIPopupList popupList, string option)
-	{
-		if (option != "MAX")
-		{
-			popupList.items.Add(option);
-		}
-	}
-
-	private List<Size<int>> MakeResolutionPopupList()
-	{
-		List<Size<int>> screenSizeList = GameMain.Instance.CMSystem.GetScreenSizeList();
-		Size<int> screenSizeNow = GameMain.Instance.CMSystem.GetScreenSizeNow();
-		if (!screenSizeList.Contains(screenSizeNow))
-		{
-			screenSizeList.Add(screenSizeNow);
-		}
-		return screenSizeList;
-	}
-
-	public void LoadConfigData()
-	{
-		bool sysButtonShowAlways = GameMain.Instance.CMSystem.SysButtonShowAlways;
-		this.SetButtonActive(this.m_sysBtnShowAlwaysOn, this.m_sysBtnShowAlwaysOff, sysButtonShowAlways);
-		Debug.Log("Load sysButtonShowAlwaysEnabled=" + sysButtonShowAlways);
-		bool fullScreen = GameMain.Instance.CMSystem.FullScreen;
-		this.SetButtonActive(this.m_fullScreenOn, this.m_fullScreenOff, fullScreen);
-		Debug.Log("Load fullScreenEnabled=" + fullScreen);
-		Size<int> screenSizeNow = GameMain.Instance.CMSystem.GetScreenSizeNow();
-		this.m_plResolution.value = this.ToResolutionOption(screenSizeNow);
-		CMSystem.AntiAliasType antialias = GameMain.Instance.CMSystem.Antialias;
-		this.m_plAntiAlias.value = antialias.ToString();
-		CMSystem.ShadowQualityType shadowQuality = GameMain.Instance.CMSystem.ShadowQuality;
-		this.m_plShadowQuality.value = shadowQuality.ToString();
-		CMSystem.TextureQualityType textureQuality = GameMain.Instance.CMSystem.TextureQuality;
-		this.m_plTextureQuality.value = textureQuality.ToString();
-		bool viewFps = GameMain.Instance.CMSystem.ViewFps;
-		this.SetButtonActive(this.m_fpsDisplayOn, this.m_fpsDisplayOff, viewFps);
-		Debug.Log("Load viewFpsEnabled=" + viewFps);
-		int bloomValue = GameMain.Instance.CMSystem.BloomValue;
-		float num = (float)Math.Round((double)((float)bloomValue / 100f), 2, MidpointRounding.AwayFromZero);
-		this.m_slBloom.value = num;
-		Debug.Log(string.Concat(new object[]
-		{
-			"Load bloom Value=",
-			bloomValue,
-			" sliderValue=",
-			num
-		}));
-		CMSystem.SSSuperSizeType screenShotSuperSize = GameMain.Instance.CMSystem.ScreenShotSuperSize;
-		this.m_plCaptureMagnification.value = screenShotSuperSize.ToString();
-		int manAlpha = GameMain.Instance.CMSystem.ManAlpha;
-		num = (float)Math.Round((double)((float)manAlpha / 100f), 2, MidpointRounding.AwayFromZero);
-		this.m_slPlayerModelTransparency.value = num;
-		Debug.Log(string.Concat(new object[]
-		{
-			"Load playerModelTransparency Value=",
-			manAlpha,
-			" sliderValue=",
-			num
-		}));
-		int msgWndAlpha = GameMain.Instance.CMSystem.MsgWndAlpha;
-		num = (float)Math.Round((double)((float)msgWndAlpha / 100f), 2, MidpointRounding.AwayFromZero);
-		this.m_slMessageWindowTransparency.value = num;
-		Debug.Log(string.Concat(new object[]
-		{
-			"Load messageWindowTransparency Value :",
-			msgWndAlpha,
-			" sliderValue=",
-			num
-		}));
-		int msgTextSpeed = GameMain.Instance.CMSystem.MsgTextSpeed;
-		num = (float)Math.Round((double)((float)msgTextSpeed / 100f), 2, MidpointRounding.AwayFromZero);
-		this.m_slTextSpeed.value = num;
-		Debug.Log(string.Concat(new object[]
-		{
-			"Load textSpeed Value :",
-			msgTextSpeed,
-			" sliderValue=",
-			num
-		}));
-		int msgAutoSpeed = GameMain.Instance.CMSystem.MsgAutoSpeed;
-		num = (float)Math.Round((double)((float)msgAutoSpeed / 100f), 2, MidpointRounding.AwayFromZero);
-		this.m_slAutoSpeed.value = num;
-		Debug.Log(string.Concat(new object[]
-		{
-			"Load autoSpeed Value :",
-			msgAutoSpeed,
-			" sliderValue=",
-			num
-		}));
-		SubtitleDisplayManager.DisplayType subtitleType = GameMain.Instance.CMSystem.SubtitleType;
-		this.m_plSubtitleType.value = SubtitleDisplayManager.EnumConvert.GetTerm(subtitleType);
-		bool msgVoiceNoStop = GameMain.Instance.CMSystem.MsgVoiceNoStop;
-		Debug.Log("Load alreadyReadSkipEnabled:" + msgVoiceNoStop);
-		this.SetButtonActive(this.m_sequentialVoiceOn, this.m_sequentialVoiceOff, msgVoiceNoStop);
-		int volumeAll = GameMain.Instance.SoundMgr.GetVolumeAll();
-		num = (float)Math.Round((double)((float)volumeAll / 100f), 2, MidpointRounding.AwayFromZero);
-		this.m_slMasterVolume.value = num;
-		Debug.Log(string.Concat(new object[]
-		{
-			"Load masterVolume Value :",
-			volumeAll,
-			" sliderValue=",
-			num
-		}));
-		int volume = GameMain.Instance.SoundMgr.GetVolume(AudioSourceMgr.Type.System);
-		num = (float)Math.Round((double)((float)volume / 100f), 2, MidpointRounding.AwayFromZero);
-		this.m_slSystemVolume.value = num;
-		Debug.Log(string.Concat(new object[]
-		{
-			"Load systemVolume Value :",
-			volume,
-			" sliderValue=",
-			num
-		}));
-		int volume2 = GameMain.Instance.SoundMgr.GetVolume(AudioSourceMgr.Type.Bgm);
-		num = (float)Math.Round((double)((float)volume2 / 100f), 2, MidpointRounding.AwayFromZero);
-		this.m_slMusicVolume.value = num;
-		Debug.Log(string.Concat(new object[]
-		{
-			"Load musicVolume Value :",
-			volume2,
-			" sliderValue=",
-			num
-		}));
-		int volumeDance = GameMain.Instance.SoundMgr.GetVolumeDance();
-		num = (float)Math.Round((double)((float)volumeDance / 100f), 2, MidpointRounding.AwayFromZero);
-		this.m_slDanceVolume.value = num;
-		Debug.Log(string.Concat(new object[]
-		{
-			"Load danceVolume Value :",
-			volumeDance,
-			" sliderValue=",
-			num
-		}));
-		int volume3 = GameMain.Instance.SoundMgr.GetVolume(AudioSourceMgr.Type.Voice);
-		num = (float)Math.Round((double)((float)volume3 / 100f), 2, MidpointRounding.AwayFromZero);
-		this.m_slVoiceVolume.value = num;
-		Debug.Log(string.Concat(new object[]
-		{
-			"Load voiceVolume Value :",
-			volume3,
-			" sliderValue=",
-			num
-		}));
-		int volume4 = GameMain.Instance.SoundMgr.GetVolume(AudioSourceMgr.Type.Se);
-		num = (float)Math.Round((double)((float)volume4 / 100f), 2, MidpointRounding.AwayFromZero);
-		this.m_slSoundEffectVolume.value = num;
-		Debug.Log(string.Concat(new object[]
-		{
-			"Load soundEffectVolume Value :",
-			volume4,
-			" sliderValue=",
-			num
-		}));
-		int volume5 = GameMain.Instance.SoundMgr.GetVolume(AudioSourceMgr.Type.Env);
-		num = (float)Math.Round((double)((float)volume5 / 100f), 2, MidpointRounding.AwayFromZero);
-		this.m_slSoundEnvironmentVolume.value = num;
-		Debug.Log(string.Concat(new object[]
-		{
-			"Load soundEnvironmentVolume Value :",
-			volume5,
-			" sliderValue=",
-			num
-		}));
-		bool threeD = GameMain.Instance.SoundMgr.GetThreeD(AudioSourceMgr.Type.Voice);
-		Debug.Log("Load voice3dEnabled:" + threeD);
-		this.SetToggleButtonActive(this.m_voice3d, threeD);
-		bool threeD2 = GameMain.Instance.SoundMgr.GetThreeD(AudioSourceMgr.Type.Se);
-		Debug.Log("Load soundEffect3dEnabled:" + threeD2);
-		this.SetToggleButtonActive(this.m_soundEffect3d, threeD2);
-		bool threeD3 = GameMain.Instance.SoundMgr.GetThreeD(AudioSourceMgr.Type.Env);
-		Debug.Log("Load soundEnvironment3dEnabled:" + threeD3);
-		this.SetToggleButtonActive(this.m_soundEnvironment3d, threeD3);
-		bool ejaculationSeEnabled = GameMain.Instance.CMSystem.EjaculationSeEnabled;
-		Debug.Log("Load EjaculationSeEnabled:" + ejaculationSeEnabled);
-		this.SetButtonActive(this.m_ejaculationSeEnabledOn, this.m_ejaculationSeEnabledOff, ejaculationSeEnabled);
-	}
-
-	private void SetButtonActive(UIButton ActiveButton, UIButton InActiveButton, bool active)
-	{
-		if (active)
-		{
-			this.SetButtonActive(ActiveButton, InActiveButton);
-		}
-		else
-		{
-			this.SetButtonActive(InActiveButton, ActiveButton);
-		}
-	}
-
-	private string ToResolutionOption(Size<int> size)
-	{
-		return string.Format("{0}x{1}", size.width, size.height);
-	}
-
-	private void SetButtonActive(UIButton activeButton, UIButton inActiveButton)
-	{
-		activeButton.defaultColor = this.activeColor;
-		inActiveButton.defaultColor = this.inActiveColor;
-	}
-
-	private void InvertButtonActive(UIButton toggleButton, bool wasActive)
-	{
-		if (wasActive)
-		{
-			toggleButton.defaultColor = this.inActiveColor;
-		}
-		else
-		{
-			toggleButton.defaultColor = this.activeColor;
-		}
-	}
-
-	private void SetToggleButtonActive(UIButton toggleButton, bool active)
-	{
-		if (active)
-		{
-			toggleButton.defaultColor = this.activeColor;
-		}
-		else
-		{
-			toggleButton.defaultColor = this.inActiveColor;
-		}
-	}
-
-	public void SetButtonShowAlwaysEnabled(bool enabled)
-	{
-		this.SetButtonActive(this.m_sysBtnShowAlwaysOn, this.m_sysBtnShowAlwaysOff, enabled);
-		GameMain.Instance.CMSystem.SysButtonShowAlways = enabled;
-		GameMain.Instance.CMSystem.ConfigSystemApply();
-		Debug.Log(string.Format("{0}に{1}を設定しました。", "SysButtonShowAlways", enabled));
-	}
-
-	public void SetFullScreenEnabled(bool enabled)
-	{
-		this.SetButtonActive(this.m_fullScreenOn, this.m_fullScreenOff, enabled);
-		GameMain.Instance.CMSystem.FullScreen = enabled;
-		GameMain.Instance.CMSystem.ConfigScreenApply();
-		Debug.Log(string.Format("{0}に{1}を設定しました。", "FullScreen", enabled));
-	}
-
-	public void SetFpsDisplayEnabled(bool enabled)
-	{
-		this.SetButtonActive(this.m_fpsDisplayOn, this.m_fpsDisplayOff, enabled);
-		GameMain.Instance.CMSystem.ViewFps = enabled;
-		GameMain.Instance.CMSystem.ConfigScreenApply();
-		Debug.Log(string.Format("{0}に{1}を設定しました。", "ViewFps", enabled));
-	}
-
-	public void SetAlreadyReadSkipEnabled(bool enabled)
-	{
-		this.SetButtonActive(this.m_alreadyReadSkipOn, this.m_alreadyReadSkipOff, enabled);
-		GameMain.Instance.CMSystem.MsgAlreadySkip = enabled;
-		GameMain.Instance.CMSystem.ConfigSystemApply();
-		Debug.Log(string.Format("{0}に{1}を設定しました。", "MsgAlreadySkip", enabled));
-	}
-
-	public void SetSequentialVoiceEnabled(bool enabled)
-	{
-		this.SetButtonActive(this.m_sequentialVoiceOn, this.m_sequentialVoiceOff, enabled);
-		GameMain.Instance.CMSystem.MsgVoiceNoStop = enabled;
-		GameMain.Instance.CMSystem.ConfigSystemApply();
-		Debug.Log(string.Format("{0}に{1}を設定しました。", "MsgVoiceNoStop", enabled));
-	}
-
-	public void SetEjaculationSeEnabled(bool enabled)
-	{
-		this.SetButtonActive(this.m_ejaculationSeEnabledOn, this.m_ejaculationSeEnabledOff, enabled);
-		GameMain.Instance.CMSystem.EjaculationSeEnabled = enabled;
-		GameMain.Instance.CMSystem.ConfigSystemApply();
-		Debug.Log(string.Format("{0}に{1}を設定しました。", "EjaculationSeEnabled", enabled));
-	}
-
-	public void SetMusic3DActive()
-	{
-		this.SetSound3DActive(this.m_music3d, AudioSourceMgr.Type.Bgm);
-	}
-
-	public void SetVoice3DActive()
-	{
-		this.SetSound3DActive(this.m_voice3d, AudioSourceMgr.Type.Voice);
-	}
-
-	public void SetSoundEffect3DActive()
-	{
-		this.SetSound3DActive(this.m_soundEffect3d, AudioSourceMgr.Type.Se);
-	}
-
-	public void SetSoundEnvironment3DActive()
-	{
-		this.SetSound3DActive(this.m_soundEnvironment3d, AudioSourceMgr.Type.Env);
-	}
-
-	private void SetSound3DActive(UIButton button, AudioSourceMgr.Type soundType)
-	{
-		bool threeD = GameMain.Instance.SoundMgr.GetThreeD(soundType);
-		this.InvertButtonActive(button, threeD);
-		GameMain.Instance.SoundMgr.SetThreeD(soundType, !threeD);
-		GameMain.Instance.SoundMgr.Apply();
-		Debug.Log(string.Format("{0}[3D]に{1}を設定しました。", soundType, !threeD));
-	}
-
-	public void ChangePopupListResolutionValue(string value)
-	{
-		value = this.DelNewlineOfSentenceEnd(value);
-		Size<int> screenSize = this.ToSize(value);
-		GameMain.Instance.CMSystem.SetScreenSize(screenSize);
-		GameMain.Instance.CMSystem.ConfigScreenApply();
-		Debug.Log(string.Format("{0}に{1}を設定しました。", "解像度", value));
-	}
-
-	private Size<int> ToSize(string value)
-	{
-		Size<int> result = default(Size<int>);
-		int num = value.IndexOf("x");
-		if (num < 0)
-		{
-			Debug.LogError(string.Format("不適切な解像度が設定されています。設定された解像度={0}", value));
-		}
-		string s = value.Substring(0, num);
-		int width;
-		if (int.TryParse(s, out width))
-		{
-			result.width = width;
-		}
-		else
-		{
-			Debug.LogError(string.Format("不適切な解像度が設定されています。設定された解像度={0}", value));
-		}
-		string s2 = value.Substring(num + 1);
-		int height;
-		if (int.TryParse(s2, out height))
-		{
-			result.height = height;
-		}
-		else
-		{
-			Debug.LogError(string.Format("不適切な解像度が設定されています。設定された解像度={0}", value));
-		}
-		return result;
-	}
-
-	public void ChangePopupListValue<PopupListType>(string value)
-	{
-		value = this.DelNewlineOfSentenceEnd(value);
-		if (typeof(PopupListType) == typeof(CMSystem.AntiAliasType))
-		{
-			GameMain.Instance.CMSystem.Antialias = (CMSystem.AntiAliasType)Enum.Parse(typeof(CMSystem.AntiAliasType), value);
-		}
-		else if (typeof(PopupListType) == typeof(CMSystem.ShadowQualityType))
-		{
-			GameMain.Instance.CMSystem.ShadowQuality = (CMSystem.ShadowQualityType)Enum.Parse(typeof(CMSystem.ShadowQualityType), value);
-		}
-		else if (typeof(PopupListType) == typeof(CMSystem.TextureQualityType))
-		{
-			GameMain.Instance.CMSystem.TextureQuality = (CMSystem.TextureQualityType)Enum.Parse(typeof(CMSystem.TextureQualityType), value);
-		}
-		else if (typeof(PopupListType) == typeof(CMSystem.SSSuperSizeType))
-		{
-			GameMain.Instance.CMSystem.ScreenShotSuperSize = (CMSystem.SSSuperSizeType)Enum.Parse(typeof(CMSystem.SSSuperSizeType), value);
-		}
-		GameMain.Instance.CMSystem.ConfigScreenApply();
-		Debug.Log(string.Format("{0}に[{1}]が設定されました。", typeof(PopupListType).ToString(), value));
-	}
-
-	public void ChangeSliderValue(ConfigMgr.SliderType sliderType, float value)
-	{
-		int num = (int)Math.Ceiling((double)(value * 100f));
-		switch (sliderType)
-		{
-		case ConfigMgr.SliderType.Bloom:
-			GameMain.Instance.CMSystem.BloomValue = num;
-			GameMain.Instance.CMSystem.ConfigScreenApply();
-			break;
-		case ConfigMgr.SliderType.PlayerModelTransparency:
-			GameMain.Instance.CMSystem.ManAlpha = num;
-			GameMain.Instance.CMSystem.ConfigScreenApply();
-			break;
-		case ConfigMgr.SliderType.MessageWindowTransparency:
-			GameMain.Instance.CMSystem.MsgWndAlpha = num;
-			GameMain.Instance.CMSystem.ConfigSystemApply();
-			break;
-		case ConfigMgr.SliderType.TextSpeed:
-			GameMain.Instance.CMSystem.MsgTextSpeed = num;
-			GameMain.Instance.CMSystem.ConfigSystemApply();
-			break;
-		case ConfigMgr.SliderType.AutoSpeed:
-			GameMain.Instance.CMSystem.MsgAutoSpeed = num;
-			GameMain.Instance.CMSystem.ConfigSystemApply();
-			break;
-		case ConfigMgr.SliderType.MasterVolume:
-			GameMain.Instance.SoundMgr.SetVolumeAll(num);
-			GameMain.Instance.SoundMgr.Apply();
-			break;
-		case ConfigMgr.SliderType.SystemVolume:
-			GameMain.Instance.SoundMgr.SetVolume(AudioSourceMgr.Type.System, num);
-			GameMain.Instance.SoundMgr.Apply();
-			break;
-		case ConfigMgr.SliderType.MusicVolume:
-			GameMain.Instance.SoundMgr.SetVolume(AudioSourceMgr.Type.Bgm, num);
-			GameMain.Instance.SoundMgr.Apply();
-			break;
-		case ConfigMgr.SliderType.DanceVolume:
-			GameMain.Instance.SoundMgr.SetVolumeDance(num);
-			GameMain.Instance.SoundMgr.Apply();
-			break;
-		case ConfigMgr.SliderType.VoiceVolume:
-			GameMain.Instance.SoundMgr.SetVolume(AudioSourceMgr.Type.Voice, num);
-			GameMain.Instance.SoundMgr.Apply();
-			break;
-		case ConfigMgr.SliderType.SoundEffectVolume:
-			GameMain.Instance.SoundMgr.SetVolume(AudioSourceMgr.Type.Se, num);
-			GameMain.Instance.SoundMgr.Apply();
-			break;
-		case ConfigMgr.SliderType.SoundEnvironmentVolume:
-			GameMain.Instance.SoundMgr.SetVolume(AudioSourceMgr.Type.Env, num);
-			GameMain.Instance.SoundMgr.Apply();
-			break;
-		default:
-			Debug.LogError(string.Format("不適切な項目が変更されました。変更しようとした項目={0}", sliderType));
-			break;
-		}
-		Debug.Log(string.Format("{0}の値に[{1}]が設定されました。", sliderType.ToString(), num));
-	}
-
-	public void SetOKButtonActive(bool active)
-	{
-		this.m_okButton.enabled = active;
-	}
-
-	public void SetContentsVisible(bool value)
-	{
-		string[] array = new string[]
-		{
-			"System",
-			"Screen",
-			"Message",
-			"Sound"
-		};
-		foreach (string f_strObjName in array)
-		{
-			UTY.GetChildObject(base.gameObject, f_strObjName, false).SetActive(value);
-		}
-	}
-
-	private string DelNewlineOfSentenceEnd(string str)
-	{
-		return Regex.Replace(str, "[\\r\\n]+$", string.Empty);
-	}
-
-	public UIPopupList m_plSubtitleType;
-
-	private UIPopupList m_resolution;
-
-	private UIPopupList m_plResolution;
-
-	private UIPopupList m_plAntiAlias;
-
-	private UIPopupList m_plShadowQuality;
-
-	private UIPopupList m_plTextureQuality;
-
-	private UIPopupList m_plCaptureMagnification;
-
-	private UISlider m_volume;
-
-	private UISlider m_slSystemVolume;
-
-	private UISlider m_slBloom;
-
-	private UISlider m_slPlayerModelTransparency;
-
-	private UISlider m_slMessageWindowTransparency;
-
-	private UISlider m_slTextSpeed;
-
-	private UISlider m_slAutoSpeed;
-
-	private UISlider m_slMasterVolume;
-
-	private UISlider m_slMusicVolume;
-
-	private UISlider m_slDanceVolume;
-
-	private UISlider m_slVoiceVolume;
-
-	private UISlider m_slSoundEffectVolume;
-
-	private UISlider m_slSoundEnvironmentVolume;
-
-	private UIButton m_sysBtnShowAlwaysOn;
-
-	private UIButton m_sysBtnShowAlwaysOff;
-
-	private UIButton m_fullScreenOn;
-
-	private UIButton m_fullScreenOff;
-
-	private UIButton m_fpsDisplayOn;
-
-	private UIButton m_fpsDisplayOff;
-
-	private UIButton m_alreadyReadSkipOn;
-
-	private UIButton m_alreadyReadSkipOff;
-
-	private UIButton m_sequentialVoiceOn;
-
-	private UIButton m_sequentialVoiceOff;
-
-	private UIButton m_ejaculationSeEnabledOn;
-
-	private UIButton m_ejaculationSeEnabledOff;
-
-	private UIButton m_music3d;
-
-	private UIButton m_voice3d;
-
-	private UIButton m_soundEffect3d;
-
-	private UIButton m_soundEnvironment3d;
-
-	private UIButton m_okButton;
-
-	private UIButton m_changeVRConfigButton;
-
-	private Color activeColor;
-
-	private Color inActiveColor;
-
-	private const string RESOLUTION_MARK = "x";
-
-	private const string ENUM_MAX_MARK = "MAX";
-
-	private const int COEFFICIENT = 100;
-
-	private class Resolution
-	{
-		public int width;
-
-		public int height;
-	}
-}

+ 42 - 0
Assembly-CSharp/ConfigIntegerSlider.cs

@@ -0,0 +1,42 @@
+using System;
+using config.ui;
+using UnityEngine;
+
+public class ConfigIntegerSlider : MonoBehaviour
+{
+	public void Initialize()
+	{
+		this.slider.onGetValue = new Func<int>(this.OnGetValue);
+		this.slider.onSetValue = new Action<int>(this.OnSetValue);
+		this.slider.Initialize(this.uiSlider);
+	}
+
+	public void UpdateSlider()
+	{
+		this.slider.UpdateSlider();
+	}
+
+	private int OnGetValue()
+	{
+		return (this.onGetValue == null) ? 0 : this.onGetValue();
+	}
+
+	private void OnSetValue(int value)
+	{
+		if (this.onSetValue != null)
+		{
+			this.onSetValue(value);
+		}
+	}
+
+	public Action<int> onSetValue;
+
+	public Func<int> onGetValue;
+
+	[ReadOnly]
+	[SerializeField]
+	private UISlider uiSlider;
+
+	[NonSerialized]
+	public IntegerSlider slider = new IntegerSlider();
+}

+ 624 - 0
Assembly-CSharp/ConfigManager.cs

@@ -0,0 +1,624 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Text.RegularExpressions;
+using UnityEngine;
+
+public class ConfigManager : MonoBehaviour
+{
+	public UIPopupList subtitleTypePopupList
+	{
+		get
+		{
+			return this.subtitleType;
+		}
+	}
+
+	public void Init(ConfigCblManager cblConfigMgr)
+	{
+		this.cblConfigMgr = cblConfigMgr;
+		ConfigManager.CategoryButton[] array = this.categoryTabButtons;
+		for (int i = 0; i < array.Length; i++)
+		{
+			ConfigManager.CategoryButton categoryData = array[i];
+			if (categoryData.type == ConfigManager.CategoryButton.Type.System)
+			{
+				this.OnClickCategoryTabButton(categoryData);
+			}
+			EventDelegate.Add(categoryData.tab.onClick, delegate()
+			{
+				this.OnClickCategoryTabButton(categoryData);
+			});
+			if (categoryData.type == ConfigManager.CategoryButton.Type.ChuBLip)
+			{
+				categoryData.tab.gameObject.SetActive(false);
+			}
+		}
+		KeyValuePair<UIGrid, GameObject> rootItem = this.GetRootItem<UIGrid>(this.deviceSelect.gameObject);
+		UIGrid key = rootItem.Key;
+		GameObject value = rootItem.Value;
+		if (value != null)
+		{
+			value.gameObject.SetActive(false);
+		}
+		if (key != null)
+		{
+			key.repositionNow = true;
+		}
+		this.systemFrame.height -= 72;
+		EventDelegate.Add(this.closeButton.onClick, new EventDelegate.Callback(BaseMgr<ConfigMgr>.Instance.CloseConfigPanel));
+		EventDelegate.Add(this.vrConfigButton.onClick, delegate()
+		{
+			BaseMgr<ConfigMgr>.Instance.CloseConfigPanel();
+			ConfigVRCtrl.Open(null);
+		});
+		Action<ConfigSelectButton> action = delegate(ConfigSelectButton button)
+		{
+			button.Initialize();
+			this.selectButtons.Add(button);
+		};
+		Action<ConfigIntegerSlider> intSliderInit = delegate(ConfigIntegerSlider slider)
+		{
+			slider.Initialize();
+			this.intSliders.Add(slider);
+		};
+		Action<ConfigIntegerSlider, AudioSourceMgr.Type> action2 = delegate(ConfigIntegerSlider slider, AudioSourceMgr.Type type)
+		{
+			intSliderInit(slider);
+			slider.onGetValue = (() => GameMain.Instance.SoundMgr.GetVolume(type));
+			slider.onSetValue = delegate(int setValue)
+			{
+				GameMain.Instance.SoundMgr.SetVolume(type, setValue);
+				GameMain.Instance.SoundMgr.Apply();
+			};
+		};
+		Action<WFCheckBox, AudioSourceMgr.Type> action3 = delegate(WFCheckBox checkBox, AudioSourceMgr.Type type)
+		{
+			checkBox.onClick.Add(delegate(WFCheckBox clickCheckBox)
+			{
+				GameMain.Instance.SoundMgr.SetThreeD(type, clickCheckBox.check);
+				GameMain.Instance.SoundMgr.Apply();
+			});
+		};
+		action(this.systemButtonVisible);
+		this.systemButtonVisible.onGetValue = (() => GameMain.Instance.CMSystem.SysButtonShowAlways);
+		this.systemButtonVisible.onSetValue = delegate(bool setValue)
+		{
+			GameMain.Instance.CMSystem.SysButtonShowAlways = setValue;
+		};
+		action(this.screenMode);
+		this.screenMode.onGetValue = (() => GameMain.Instance.CMSystem.FullScreen);
+		this.screenMode.onSetValue = delegate(bool setValue)
+		{
+			GameMain.Instance.CMSystem.FullScreen = setValue;
+			GameMain.Instance.CMSystem.ConfigScreenApply();
+		};
+		action(this.drawFPS);
+		this.drawFPS.onGetValue = (() => GameMain.Instance.CMSystem.ViewFps);
+		this.drawFPS.onSetValue = delegate(bool setValue)
+		{
+			GameMain.Instance.CMSystem.ViewFps = setValue;
+			GameMain.Instance.CMSystem.ConfigScreenApply();
+		};
+		action(this.sequentialVoice);
+		this.sequentialVoice.onGetValue = (() => GameMain.Instance.CMSystem.MsgVoiceNoStop);
+		this.sequentialVoice.onSetValue = delegate(bool setValue)
+		{
+			GameMain.Instance.CMSystem.MsgVoiceNoStop = setValue;
+		};
+		action(this.ejaculationSe);
+		this.ejaculationSe.onGetValue = (() => GameMain.Instance.CMSystem.EjaculationSeEnabled);
+		this.ejaculationSe.onSetValue = delegate(bool setValue)
+		{
+			GameMain.Instance.CMSystem.EjaculationSeEnabled = this.enabled;
+		};
+		foreach (Size<int> size in this.MakeResolutionPopupList())
+		{
+			this.screenResolution.items.Add(string.Format("{0}x{1}", size.width, size.height));
+		}
+		EventDelegate.Add(this.screenResolution.onChange, delegate()
+		{
+			string currentPopupListValue = this.GetCurrentPopupListValue();
+			Size<int> screenSize = this.ResolutionTextToSize(currentPopupListValue);
+			GameMain.Instance.CMSystem.SetScreenSize(screenSize);
+			GameMain.Instance.CMSystem.ConfigScreenApply();
+		});
+		this.CreateEnumPopupList<CMSystem.SSSuperSizeType>(this.captureMagnification, delegate(CMSystem.SSSuperSizeType setValue)
+		{
+			GameMain.Instance.CMSystem.ScreenShotSuperSize = setValue;
+			GameMain.Instance.CMSystem.ConfigScreenApply();
+		});
+		this.CreateEnumPopupList<CMSystem.AntiAliasType>(this.antiAlias, delegate(CMSystem.AntiAliasType setValue)
+		{
+			GameMain.Instance.CMSystem.Antialias = setValue;
+			GameMain.Instance.CMSystem.ConfigScreenApply();
+		});
+		this.CreateEnumPopupList<CMSystem.ShadowQualityType>(this.shadowQuality, delegate(CMSystem.ShadowQualityType setValue)
+		{
+			GameMain.Instance.CMSystem.ShadowQuality = setValue;
+			GameMain.Instance.CMSystem.ConfigScreenApply();
+		});
+		this.CreateEnumPopupList<CMSystem.TextureQualityType>(this.textureQuality, delegate(CMSystem.TextureQualityType setValue)
+		{
+			GameMain.Instance.CMSystem.TextureQuality = setValue;
+			GameMain.Instance.CMSystem.ConfigScreenApply();
+		});
+		if (this.subtitleType != null)
+		{
+			if (GameUty.supportMultiLanguage)
+			{
+				IEnumerator enumerator2 = Enum.GetValues(typeof(SubtitleDisplayManager.DisplayType)).GetEnumerator();
+				try
+				{
+					while (enumerator2.MoveNext())
+					{
+						object obj = enumerator2.Current;
+						this.subtitleType.AddItem(SubtitleDisplayManager.EnumConvert.GetTerm((SubtitleDisplayManager.DisplayType)obj));
+					}
+				}
+				finally
+				{
+					IDisposable disposable;
+					if ((disposable = (enumerator2 as IDisposable)) != null)
+					{
+						disposable.Dispose();
+					}
+				}
+				EventDelegate.Add(this.subtitleType.onChange, delegate()
+				{
+					string currentPopupListValue = this.GetCurrentPopupListValue();
+					IEnumerator enumerator3 = Enum.GetValues(typeof(SubtitleDisplayManager.DisplayType)).GetEnumerator();
+					try
+					{
+						while (enumerator3.MoveNext())
+						{
+							object obj2 = enumerator3.Current;
+							string term = SubtitleDisplayManager.EnumConvert.GetTerm((SubtitleDisplayManager.DisplayType)obj2);
+							if (currentPopupListValue == term)
+							{
+								GameMain.Instance.CMSystem.SubtitleType = (SubtitleDisplayManager.DisplayType)obj2;
+								break;
+							}
+						}
+					}
+					finally
+					{
+						IDisposable disposable2;
+						if ((disposable2 = (enumerator3 as IDisposable)) != null)
+						{
+							disposable2.Dispose();
+						}
+					}
+				});
+			}
+			else
+			{
+				Transform transform = this.subtitleType.transform;
+				while (transform.parent == null || transform.parent.GetComponent<UIGrid>() == null)
+				{
+					transform = transform.parent;
+				}
+				if (transform != null)
+				{
+					transform.gameObject.SetActive(false);
+				}
+			}
+		}
+		intSliderInit(this.manAlpha);
+		this.manAlpha.onGetValue = (() => GameMain.Instance.CMSystem.ManAlpha);
+		this.manAlpha.onSetValue = delegate(int setValue)
+		{
+			GameMain.Instance.CMSystem.ManAlpha = setValue;
+			GameMain.Instance.CMSystem.ConfigScreenApply();
+		};
+		intSliderInit(this.bloom);
+		this.bloom.onGetValue = (() => GameMain.Instance.CMSystem.BloomValue);
+		this.bloom.onSetValue = delegate(int setValue)
+		{
+			GameMain.Instance.CMSystem.BloomValue = setValue;
+		};
+		intSliderInit(this.messageAlpha);
+		this.messageAlpha.onGetValue = (() => GameMain.Instance.CMSystem.MsgWndAlpha);
+		this.messageAlpha.onSetValue = delegate(int setValue)
+		{
+			GameMain.Instance.CMSystem.MsgWndAlpha = setValue;
+		};
+		intSliderInit(this.textSpeed);
+		this.textSpeed.onGetValue = (() => GameMain.Instance.CMSystem.MsgTextSpeed);
+		this.textSpeed.onSetValue = delegate(int setValue)
+		{
+			GameMain.Instance.CMSystem.MsgTextSpeed = setValue;
+		};
+		intSliderInit(this.textAutoSpeed);
+		this.textAutoSpeed.onGetValue = (() => GameMain.Instance.CMSystem.MsgAutoSpeed);
+		this.textAutoSpeed.onSetValue = delegate(int setValue)
+		{
+			GameMain.Instance.CMSystem.MsgAutoSpeed = setValue;
+		};
+		intSliderInit(this.volumeMaster);
+		this.volumeMaster.onGetValue = (() => GameMain.Instance.SoundMgr.GetVolumeAll());
+		this.volumeMaster.onSetValue = delegate(int setValue)
+		{
+			GameMain.Instance.SoundMgr.SetVolumeAll(setValue);
+			GameMain.Instance.SoundMgr.Apply();
+		};
+		action2(this.volumeSystem, AudioSourceMgr.Type.System);
+		action2(this.volumeBGM, AudioSourceMgr.Type.Bgm);
+		intSliderInit(this.volumeDance);
+		this.volumeDance.onGetValue = (() => GameMain.Instance.SoundMgr.GetVolumeDance());
+		this.volumeDance.onSetValue = delegate(int setValue)
+		{
+			GameMain.Instance.SoundMgr.SetVolumeDance(setValue);
+			GameMain.Instance.SoundMgr.Apply();
+		};
+		action2(this.volumeVoiceMaster, AudioSourceMgr.Type.Voice);
+		action2(this.volumeVoiceHeroine, AudioSourceMgr.Type.VoiceHeroine);
+		action3(this.threeDEffectVoiceHeroine, AudioSourceMgr.Type.VoiceHeroine);
+		action2(this.volumeSubVoice, AudioSourceMgr.Type.VoiceSub);
+		action3(this.threeDEffectSubVoice, AudioSourceMgr.Type.VoiceSub);
+		action2(this.volumeExtraVoice, AudioSourceMgr.Type.VoiceExtra);
+		action3(this.threeDEffectExtraVoice, AudioSourceMgr.Type.VoiceExtra);
+		action2(this.volumeMobVoice, AudioSourceMgr.Type.VoiceMob);
+		action3(this.threeDEffectMobVoice, AudioSourceMgr.Type.VoiceMob);
+		action2(this.volumeSE, AudioSourceMgr.Type.Se);
+		action3(this.threeDEffectSE, AudioSourceMgr.Type.Se);
+		action2(this.volumeEnv, AudioSourceMgr.Type.Env);
+		action3(this.threeDEffectEnv, AudioSourceMgr.Type.Env);
+	}
+
+	public void LoadConfig()
+	{
+		foreach (ConfigSelectButton configSelectButton in this.selectButtons)
+		{
+			configSelectButton.UpdateButton();
+		}
+		foreach (ConfigIntegerSlider configIntegerSlider in this.intSliders)
+		{
+			configIntegerSlider.UpdateSlider();
+		}
+		SoundMgr soundMgr = GameMain.Instance.SoundMgr;
+		this.threeDEffectVoiceHeroine.check = soundMgr.GetThreeD(AudioSourceMgr.Type.VoiceHeroine);
+		this.threeDEffectSubVoice.check = soundMgr.GetThreeD(AudioSourceMgr.Type.VoiceSub);
+		this.threeDEffectExtraVoice.check = soundMgr.GetThreeD(AudioSourceMgr.Type.VoiceExtra);
+		this.threeDEffectMobVoice.check = soundMgr.GetThreeD(AudioSourceMgr.Type.VoiceMob);
+		this.threeDEffectSE.check = soundMgr.GetThreeD(AudioSourceMgr.Type.Se);
+		this.threeDEffectEnv.check = soundMgr.GetThreeD(AudioSourceMgr.Type.Env);
+		Size<int> screenSizeNow = GameMain.Instance.CMSystem.GetScreenSizeNow();
+		this.screenResolution.value = string.Format("{0}x{1}", screenSizeNow.width, screenSizeNow.height);
+		this.captureMagnification.value = GameMain.Instance.CMSystem.ScreenShotSuperSize.ToString();
+		this.antiAlias.value = GameMain.Instance.CMSystem.Antialias.ToString();
+		this.shadowQuality.value = GameMain.Instance.CMSystem.ShadowQuality.ToString();
+		this.textureQuality.value = GameMain.Instance.CMSystem.TextureQuality.ToString();
+	}
+
+	public void SetCloseButtonActive(bool active)
+	{
+		this.closeButton.gameObject.SetActive(active);
+	}
+
+	private void OnClickCategoryTabButton(ConfigManager.CategoryButton data)
+	{
+		ConfigManager.CategoryButton.Type type = data.type;
+		if (type != ConfigManager.CategoryButton.Type.System)
+		{
+			if (type != ConfigManager.CategoryButton.Type.Sound)
+			{
+				if (type == ConfigManager.CategoryButton.Type.ChuBLip)
+				{
+					UIRect uirect = this.systemWidget;
+					float alpha = 0f;
+					this.soundWidget.alpha = alpha;
+					uirect.alpha = alpha;
+					this.cblConfigMgr.visible = true;
+				}
+			}
+			else
+			{
+				this.systemWidget.alpha = 0f;
+				this.soundWidget.alpha = 1f;
+				this.cblConfigMgr.visible = false;
+			}
+		}
+		else
+		{
+			this.systemWidget.alpha = 1f;
+			this.soundWidget.alpha = 0f;
+			this.cblConfigMgr.visible = false;
+		}
+		foreach (ConfigManager.CategoryButton categoryButton in this.categoryTabButtons)
+		{
+			categoryButton.tab.SetSelect(categoryButton.type == data.type);
+		}
+	}
+
+	private void CreateEnumPopupList<enumT>(UIPopupList addPopupList, Action<enumT> applyAction)
+	{
+		IEnumerator enumerator = Enum.GetValues(typeof(enumT)).GetEnumerator();
+		try
+		{
+			while (enumerator.MoveNext())
+			{
+				object obj = enumerator.Current;
+				if (obj.ToString() != "MAX")
+				{
+					addPopupList.items.Add(obj.ToString());
+				}
+			}
+		}
+		finally
+		{
+			IDisposable disposable;
+			if ((disposable = (enumerator as IDisposable)) != null)
+			{
+				disposable.Dispose();
+			}
+		}
+		EventDelegate.Add(addPopupList.onChange, delegate()
+		{
+			string currentPopupListValue = this.GetCurrentPopupListValue();
+			if (this.IsValidatePopupValue<enumT>(currentPopupListValue))
+			{
+				enumT obj2 = (enumT)((object)Enum.Parse(typeof(enumT), currentPopupListValue));
+				applyAction(obj2);
+			}
+		});
+	}
+
+	private string GetCurrentPopupListValue()
+	{
+		return Regex.Replace(UIPopupList.current.value, "[\\r\\n]+$", string.Empty);
+	}
+
+	private List<Size<int>> MakeResolutionPopupList()
+	{
+		List<Size<int>> screenSizeList = GameMain.Instance.CMSystem.GetScreenSizeList();
+		Size<int> screenSizeNow = GameMain.Instance.CMSystem.GetScreenSizeNow();
+		if (!screenSizeList.Contains(screenSizeNow))
+		{
+			screenSizeList.Add(screenSizeNow);
+		}
+		return screenSizeList;
+	}
+
+	private Size<int> ResolutionTextToSize(string value)
+	{
+		Size<int> result = default(Size<int>);
+		int num = value.IndexOf("x");
+		if (num < 0)
+		{
+			Debug.LogError(string.Format("不適切な解像度が設定されています。設定された解像度={0}", value));
+		}
+		string s = value.Substring(0, num);
+		int width;
+		if (int.TryParse(s, out width))
+		{
+			result.width = width;
+		}
+		else
+		{
+			Debug.LogError(string.Format("不適切な解像度が設定されています。設定された解像度={0}", value));
+		}
+		string s2 = value.Substring(num + 1);
+		int height;
+		if (int.TryParse(s2, out height))
+		{
+			result.height = height;
+		}
+		else
+		{
+			Debug.LogError(string.Format("不適切な解像度が設定されています。設定された解像度={0}", value));
+		}
+		return result;
+	}
+
+	private bool IsValidatePopupValue<T>(string value)
+	{
+		if (!Enum.IsDefined(typeof(T), value))
+		{
+			Debug.LogError(string.Format("ポップアップリストから不適切な値が選択されました。選択されたボタン名={0}", value));
+			return false;
+		}
+		return true;
+	}
+
+	private KeyValuePair<T, GameObject> GetRootItem<T>(GameObject obj) where T : class
+	{
+		T t = (T)((object)null);
+		Transform transform = obj.transform;
+		for (;;)
+		{
+			t = transform.parent.GetComponent<T>();
+			if (!(transform.parent == null) && t != null)
+			{
+				break;
+			}
+			transform = transform.parent;
+		}
+		if (transform != null)
+		{
+			transform.gameObject.SetActive(false);
+		}
+		return new KeyValuePair<T, GameObject>(t, transform.gameObject);
+	}
+
+	[SerializeField]
+	[Header("タブボタンのデータ")]
+	private ConfigManager.CategoryButton[] categoryTabButtons;
+
+	[SerializeField]
+	[Header("閉じるボタン")]
+	private UIButton closeButton;
+
+	[SerializeField]
+	[Header("VRボタン")]
+	private UIButton vrConfigButton;
+
+	[SerializeField]
+	[Header("システムタブ表示用Widget")]
+	private UIWidget systemWidget;
+
+	[SerializeField]
+	[Header("システムフレーム")]
+	private UISprite systemFrame;
+
+	[SerializeField]
+	[Header("サウンドタブ表示用Widget")]
+	private UIWidget soundWidget;
+
+	[SerializeField]
+	[Header("システムボタン常時表示")]
+	private ConfigSelectButton systemButtonVisible;
+
+	[SerializeField]
+	[Header("スクリーンモード")]
+	private ConfigSelectButton screenMode;
+
+	[SerializeField]
+	[Header("FPS表示")]
+	private ConfigSelectButton drawFPS;
+
+	[SerializeField]
+	[Header("ボイス継続")]
+	private ConfigSelectButton sequentialVoice;
+
+	[SerializeField]
+	[Header("射精音の再生")]
+	private ConfigSelectButton ejaculationSe;
+
+	[SerializeField]
+	[Header("男透明度")]
+	private ConfigIntegerSlider manAlpha;
+
+	[SerializeField]
+	[Header("ブルーム")]
+	private ConfigIntegerSlider bloom;
+
+	[SerializeField]
+	[Header("メッセージウィンドウ透明度")]
+	private ConfigIntegerSlider messageAlpha;
+
+	[SerializeField]
+	[Header("テキストスピード")]
+	private ConfigIntegerSlider textSpeed;
+
+	[SerializeField]
+	[Header("テキストオートスピード")]
+	private ConfigIntegerSlider textAutoSpeed;
+
+	[SerializeField]
+	[Header("CBLデバイス選択")]
+	private UIPopupList deviceSelect;
+
+	[SerializeField]
+	[Header("画面解像度")]
+	private UIPopupList screenResolution;
+
+	[SerializeField]
+	[Header("キャプチャ倍率")]
+	private UIPopupList captureMagnification;
+
+	[SerializeField]
+	[Header("アンチエイリアス")]
+	private UIPopupList antiAlias;
+
+	[SerializeField]
+	[Header("影のクオリティ")]
+	private UIPopupList shadowQuality;
+
+	[SerializeField]
+	[Header("テクスチャのクオリティ")]
+	private UIPopupList textureQuality;
+
+	[SerializeField]
+	[Header("翻訳版用-ADVの表示タイプ")]
+	private UIPopupList subtitleType;
+
+	[SerializeField]
+	[Header("音量-マスター")]
+	private ConfigIntegerSlider volumeMaster;
+
+	[SerializeField]
+	[Header("音量-システム")]
+	private ConfigIntegerSlider volumeSystem;
+
+	[SerializeField]
+	[Header("音量-BGM")]
+	private ConfigIntegerSlider volumeBGM;
+
+	[SerializeField]
+	[Header("音量-ダンス")]
+	private ConfigIntegerSlider volumeDance;
+
+	[SerializeField]
+	[Header("音量-ボイスマスター")]
+	private ConfigIntegerSlider volumeVoiceMaster;
+
+	[SerializeField]
+	[Header("音量-ボイスヒロイン")]
+	private ConfigIntegerSlider volumeVoiceHeroine;
+
+	[SerializeField]
+	[Header("3D-ボイスヒロイン")]
+	private WFCheckBox threeDEffectVoiceHeroine;
+
+	[SerializeField]
+	[Header("音量-ボイスサブ")]
+	private ConfigIntegerSlider volumeSubVoice;
+
+	[SerializeField]
+	[Header("3D-ボイスサブ")]
+	private WFCheckBox threeDEffectSubVoice;
+
+	[SerializeField]
+	[Header("音量-ボイスエキストラ")]
+	private ConfigIntegerSlider volumeExtraVoice;
+
+	[SerializeField]
+	[Header("3D-ボイスエキストラ")]
+	private WFCheckBox threeDEffectExtraVoice;
+
+	[SerializeField]
+	[Header("音量-ボイスモブ")]
+	private ConfigIntegerSlider volumeMobVoice;
+
+	[SerializeField]
+	[Header("3D-ボイスモブ")]
+	private WFCheckBox threeDEffectMobVoice;
+
+	[SerializeField]
+	[Header("音量-SE")]
+	private ConfigIntegerSlider volumeSE;
+
+	[SerializeField]
+	[Header("3D-SE")]
+	private WFCheckBox threeDEffectSE;
+
+	[SerializeField]
+	[Header("音量-環境音")]
+	private ConfigIntegerSlider volumeEnv;
+
+	[SerializeField]
+	[Header("3D-環境音")]
+	private WFCheckBox threeDEffectEnv;
+
+	private ConfigCblManager cblConfigMgr;
+
+	private List<ConfigSelectButton> selectButtons = new List<ConfigSelectButton>();
+
+	private List<ConfigIntegerSlider> intSliders = new List<ConfigIntegerSlider>();
+
+	[Serializable]
+	private struct CategoryButton
+	{
+		public ConfigManager.CategoryButton.Type type;
+
+		public UIWFTabButton tab;
+
+		public enum Type
+		{
+			System = 10,
+			Sound = 20,
+			ChuBLip = 30
+		}
+	}
+}

+ 38 - 300
Assembly-CSharp/ConfigMgr.cs

@@ -4,20 +4,14 @@ using UnityEngine;
 
 public class ConfigMgr : BaseMgr<ConfigMgr>
 {
-	private void Start()
-	{
-	}
-
 	private void Init()
 	{
 		string rootPath = "__GameMain__/SystemUI Root";
 		this.m_goPanel = base.GetPanel("ConfigPanel", rootPath);
-		this.m_configCtrl = base.GetCtrl<ConfigCtrl>();
-		this.m_configCtrl.Init(this.m_goPanel);
+		this.configMgr.Init(this.cblConfig);
 		this.m_uiPanel = this.m_goPanel.GetComponent<UIPanel>();
 		this.m_goPanel.SetActive(false);
 		this.m_bInited = true;
-		this.ChangeNormalConfig();
 	}
 
 	public bool IsOpenConfigPanel()
@@ -25,100 +19,6 @@ public class ConfigMgr : BaseMgr<ConfigMgr>
 		return !(this.m_goPanel == null) && this.m_goPanel.activeSelf;
 	}
 
-	public void OnSysButtonShowAlwaysEnabled()
-	{
-		this.m_configCtrl.SetButtonShowAlwaysEnabled(true);
-	}
-
-	public void OnSysButtonShowAlwaysDisabled()
-	{
-		this.m_configCtrl.SetButtonShowAlwaysEnabled(false);
-	}
-
-	public void OnFullScreenEnabled()
-	{
-		this.m_configCtrl.SetFullScreenEnabled(true);
-	}
-
-	public void OnFullScreenDisabled()
-	{
-		this.m_configCtrl.SetFullScreenEnabled(false);
-	}
-
-	public void OnResolutionChange()
-	{
-		if (!this.m_bInited)
-		{
-			return;
-		}
-		string value = UIPopupList.current.value;
-		this.m_configCtrl.ChangePopupListResolutionValue(value);
-	}
-
-	public void OnAntiAliasChange()
-	{
-		if (!this.m_bInited)
-		{
-			return;
-		}
-		string value = UIPopupList.current.value;
-		base.IsValidatePopupValue<CMSystem.AntiAliasType>(value);
-		this.m_configCtrl.ChangePopupListValue<CMSystem.AntiAliasType>(value);
-	}
-
-	public void OnShadowQualityChange()
-	{
-		if (!this.m_bInited)
-		{
-			return;
-		}
-		string value = UIPopupList.current.value;
-		base.IsValidatePopupValue<CMSystem.ShadowQualityType>(value);
-		this.m_configCtrl.ChangePopupListValue<CMSystem.ShadowQualityType>(value);
-	}
-
-	public void OnTextureQualityChange()
-	{
-		if (!this.m_bInited)
-		{
-			return;
-		}
-		string value = UIPopupList.current.value;
-		base.IsValidatePopupValue<CMSystem.TextureQualityType>(value);
-		this.m_configCtrl.ChangePopupListValue<CMSystem.TextureQualityType>(value);
-	}
-
-	public void OnFpsDisplayEnabled()
-	{
-		this.m_configCtrl.SetFpsDisplayEnabled(true);
-	}
-
-	public void OnFpsDisplayDisabled()
-	{
-		this.m_configCtrl.SetFpsDisplayEnabled(false);
-	}
-
-	public void OnCaptureMagnificationChange()
-	{
-		if (!this.m_bInited)
-		{
-			return;
-		}
-		string value = UIPopupList.current.value;
-		base.IsValidatePopupValue<CMSystem.SSSuperSizeType>(value);
-		this.m_configCtrl.ChangePopupListValue<CMSystem.SSSuperSizeType>(value);
-	}
-
-	public void OnSubtitleDisplayTypeChange()
-	{
-		if (!this.m_bInited)
-		{
-			return;
-		}
-		string value = UIPopupList.current.value;
-		this.SubtitleDisplayTypeChange(value);
-	}
-
 	public void SubtitleDisplayTypeChange(string typeName)
 	{
 		IEnumerator enumerator = Enum.GetValues(typeof(SubtitleDisplayManager.DisplayType)).GetEnumerator();
@@ -145,184 +45,14 @@ public class ConfigMgr : BaseMgr<ConfigMgr>
 		}
 	}
 
-	public void OnBloomChange()
-	{
-		if (!this.m_bInited)
-		{
-			return;
-		}
-		float value = UIProgressBar.current.value;
-		this.m_configCtrl.ChangeSliderValue(ConfigMgr.SliderType.Bloom, value);
-	}
-
-	public void OnPlayerModelTransparencyChange()
-	{
-		if (!this.m_bInited)
-		{
-			return;
-		}
-		float value = UIProgressBar.current.value;
-		this.m_configCtrl.ChangeSliderValue(ConfigMgr.SliderType.PlayerModelTransparency, value);
-	}
-
-	public void OnMessageWindowTransparencyChange()
-	{
-		if (!this.m_bInited)
-		{
-			return;
-		}
-		float value = UIProgressBar.current.value;
-		this.m_configCtrl.ChangeSliderValue(ConfigMgr.SliderType.MessageWindowTransparency, value);
-	}
-
-	public void OnTextSpeedChange()
-	{
-		if (!this.m_bInited)
-		{
-			return;
-		}
-		float value = UIProgressBar.current.value;
-		this.m_configCtrl.ChangeSliderValue(ConfigMgr.SliderType.TextSpeed, value);
-	}
-
-	public void OnAutoSpeedChange()
-	{
-		if (!this.m_bInited)
-		{
-			return;
-		}
-		float value = UIProgressBar.current.value;
-		this.m_configCtrl.ChangeSliderValue(ConfigMgr.SliderType.AutoSpeed, value);
-	}
-
-	public void OnMasterVolumeChange()
-	{
-		if (!this.m_bInited)
-		{
-			return;
-		}
-		float value = UIProgressBar.current.value;
-		this.m_configCtrl.ChangeSliderValue(ConfigMgr.SliderType.MasterVolume, value);
-	}
-
-	public void OnSystemVolumeChange()
-	{
-		if (!this.m_bInited)
-		{
-			return;
-		}
-		float value = UIProgressBar.current.value;
-		this.m_configCtrl.ChangeSliderValue(ConfigMgr.SliderType.SystemVolume, value);
-	}
-
-	public void OnMusicVolumeChange()
-	{
-		if (!this.m_bInited)
-		{
-			return;
-		}
-		float value = UIProgressBar.current.value;
-		this.m_configCtrl.ChangeSliderValue(ConfigMgr.SliderType.MusicVolume, value);
-	}
-
-	public void OnDanceVolumeChange()
-	{
-		if (!this.m_bInited)
-		{
-			return;
-		}
-		float value = UIProgressBar.current.value;
-		this.m_configCtrl.ChangeSliderValue(ConfigMgr.SliderType.DanceVolume, value);
-	}
-
-	public void OnVoiceVolumeChange()
-	{
-		if (!this.m_bInited)
-		{
-			return;
-		}
-		float value = UIProgressBar.current.value;
-		this.m_configCtrl.ChangeSliderValue(ConfigMgr.SliderType.VoiceVolume, value);
-	}
-
-	public void OnSoundEffectVolumeChange()
-	{
-		if (!this.m_bInited)
-		{
-			return;
-		}
-		float value = UIProgressBar.current.value;
-		this.m_configCtrl.ChangeSliderValue(ConfigMgr.SliderType.SoundEffectVolume, value);
-	}
-
-	public void OnSoundEnvironmentVolumeChange()
-	{
-		if (!this.m_bInited)
-		{
-			return;
-		}
-		float value = UIProgressBar.current.value;
-		this.m_configCtrl.ChangeSliderValue(ConfigMgr.SliderType.SoundEnvironmentVolume, value);
-	}
-
-	public void OnAlreadyReadSkipEnabled()
-	{
-		this.m_configCtrl.SetAlreadyReadSkipEnabled(true);
-	}
-
-	public void OnAlreadyReadSkipDisabled()
-	{
-		this.m_configCtrl.SetAlreadyReadSkipEnabled(false);
-	}
-
-	public void OnSequentialVoiceEnabled()
-	{
-		this.m_configCtrl.SetSequentialVoiceEnabled(true);
-	}
-
-	public void OnSequentialVoiceDisabled()
-	{
-		this.m_configCtrl.SetSequentialVoiceEnabled(false);
-	}
-
-	public void SetEjaculationSeEnabled()
-	{
-		this.m_configCtrl.SetEjaculationSeEnabled(true);
-	}
-
-	public void SetEjaculationSeDisabled()
-	{
-		this.m_configCtrl.SetEjaculationSeEnabled(false);
-	}
-
-	public void OnMusic3DActive()
-	{
-		this.m_configCtrl.SetMusic3DActive();
-	}
-
-	public void OnVoice3DActive()
-	{
-		this.m_configCtrl.SetVoice3DActive();
-	}
-
-	public void OnSoundEffect3DActive()
-	{
-		this.m_configCtrl.SetSoundEffect3DActive();
-	}
-
-	public void OnSoundEnvironment3DActive()
-	{
-		this.m_configCtrl.SetSoundEnvironment3DActive();
-	}
-
 	public void OpenConfigPanel()
 	{
 		if (!this.m_bInited)
 		{
 			this.Init();
 		}
-		this.m_configCtrl.LoadConfigData();
-		this.m_configCtrl.SetOKButtonActive(true);
+		this.configMgr.LoadConfig();
+		this.configMgr.SetCloseButtonActive(true);
 		this.m_goPanel.SetActive(true);
 		TweenAlpha tweenAlpha = this.m_goPanel.AddComponent<TweenAlpha>();
 		tweenAlpha.from = 0f;
@@ -333,7 +63,7 @@ public class ConfigMgr : BaseMgr<ConfigMgr>
 
 	public void CloseConfigPanel()
 	{
-		this.m_configCtrl.SetOKButtonActive(false);
+		this.configMgr.SetCloseButtonActive(false);
 		this.cblConfig.OnClose();
 		TweenAlpha tweenAlpha = TweenAlpha.Begin(this.m_goPanel, 0.3f, 0f);
 		EventDelegate.Set(tweenAlpha.onFinished, delegate()
@@ -343,42 +73,50 @@ public class ConfigMgr : BaseMgr<ConfigMgr>
 		GameMain.Instance.BroadcastMessage("OnChangeScreenSizeOrAA", SendMessageOptions.DontRequireReceiver);
 	}
 
-	public void ChangeNormalConfig()
+	public void Update()
 	{
-		this.m_configCtrl.SetContentsVisible(true);
-		this.cblConfig.visible = false;
+		if (GameUty.supportMultiLanguage)
+		{
+			int num = int.MinValue;
+			if (Input.GetKeyDown(KeyCode.F1))
+			{
+				num = 0;
+			}
+			else if (Input.GetKeyDown(KeyCode.F2))
+			{
+				num = 1;
+			}
+			else if (Input.GetKeyDown(KeyCode.F3))
+			{
+				num = 2;
+			}
+			else if (Input.GetKeyDown(KeyCode.F4))
+			{
+				num = 3;
+			}
+			if (num != -2147483648)
+			{
+				if (this.configMgr == null)
+				{
+					GameMain.Instance.CMSystem.SubtitleType = (SubtitleDisplayManager.DisplayType)num;
+				}
+				else
+				{
+					this.configMgr.subtitleTypePopupList.value = SubtitleDisplayManager.EnumConvert.GetTerm((SubtitleDisplayManager.DisplayType)num);
+				}
+			}
+		}
 	}
 
-	public void ChangeCBLConfig()
-	{
-		this.m_configCtrl.SetContentsVisible(false);
-		this.cblConfig.visible = true;
-	}
+	[SerializeField]
+	private ConfigManager configMgr;
 
 	[SerializeField]
 	public ConfigCblManager cblConfig;
 
-	private ConfigCtrl m_configCtrl;
-
 	private const float DURATION_TO_FADE = 0.3f;
 
 	private UIPanel m_uiPanel;
 
 	private bool m_bInited;
-
-	public enum SliderType
-	{
-		Bloom,
-		PlayerModelTransparency,
-		MessageWindowTransparency,
-		TextSpeed,
-		AutoSpeed,
-		MasterVolume,
-		SystemVolume,
-		MusicVolume,
-		DanceVolume,
-		VoiceVolume,
-		SoundEffectVolume,
-		SoundEnvironmentVolume
-	}
 }

+ 61 - 0
Assembly-CSharp/ConfigSelectButton.cs

@@ -0,0 +1,61 @@
+using System;
+using UnityEngine;
+
+public class ConfigSelectButton : MonoBehaviour
+{
+	protected bool srcValue
+	{
+		get
+		{
+			return this.onGetValue != null && this.onGetValue();
+		}
+		set
+		{
+			if (this.onSetValue != null)
+			{
+				this.onSetValue(value);
+			}
+		}
+	}
+
+	public void Initialize()
+	{
+		this.UpdateButton();
+		EventDelegate.Add(this.onButton.onClick, delegate()
+		{
+			this.srcValue = true;
+			this.SetSelect(true);
+		});
+		EventDelegate.Add(this.offButton.onClick, delegate()
+		{
+			this.srcValue = false;
+			this.SetSelect(false);
+		});
+	}
+
+	public void UpdateButton()
+	{
+		this.SetSelect(this.srcValue);
+	}
+
+	private void SetSelect(bool isOn)
+	{
+		bool flag = false;
+		if (isOn)
+		{
+			flag = true;
+		}
+		this.onButton.SetSelect(flag);
+		this.offButton.SetSelect(!flag);
+	}
+
+	[SerializeField]
+	private UIWFTabButton onButton;
+
+	[SerializeField]
+	private UIWFTabButton offButton;
+
+	public Func<bool> onGetValue;
+
+	public Action<bool> onSetValue;
+}

+ 2 - 2
Assembly-CSharp/ControllerShortcutSettingData.cs

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

+ 2 - 2
Assembly-CSharp/CostumePartsEnabledCtrl.cs

@@ -184,9 +184,9 @@ public class CostumePartsEnabledCtrl : MonoBehaviour
 							{
 								if (smenuItem.m_boDelOnly)
 								{
-									return smenuItem.m_texIcon;
+									return smenuItem.m_texIconRef;
 								}
-								return smenuItem.m_texIcon;
+								return smenuItem.m_texIconRef;
 							}
 						}
 						return this.m_notSettingIcon;

+ 7 - 3
Assembly-CSharp/DailyCtrl.cs

@@ -49,7 +49,8 @@ public class DailyCtrl : MonoBehaviour
 					DailyCtrl.ButtonType.Karaoke,
 					DailyCtrl.ButtonType.EventScenario,
 					DailyCtrl.ButtonType.ManEdit,
-					DailyCtrl.ButtonType.Credit
+					DailyCtrl.ButtonType.Credit,
+					DailyCtrl.ButtonType.NPCEdit
 				};
 			}
 			else
@@ -80,7 +81,8 @@ public class DailyCtrl : MonoBehaviour
 				DailyCtrl.ButtonType.EventScenario,
 				DailyCtrl.ButtonType.ManEdit,
 				DailyCtrl.ButtonType.Credit,
-				DailyCtrl.ButtonType.Dance
+				DailyCtrl.ButtonType.Dance,
+				DailyCtrl.ButtonType.NPCEdit
 			};
 		}
 		else
@@ -92,6 +94,7 @@ public class DailyCtrl : MonoBehaviour
 				DailyCtrl.ButtonType.LegacyMode
 			};
 		}
+		this.GetMenuButton(DailyCtrl.ButtonType.NPCEdit).active = PluginData.IsEnabled("GP001");
 		foreach (DailyCtrl.ButtonType type in array3)
 		{
 			this.GetMenuButton(type).active = false;
@@ -269,7 +272,8 @@ public class DailyCtrl : MonoBehaviour
 		Karaoke,
 		Credit,
 		Next,
-		MyRoomCustom
+		MyRoomCustom,
+		NPCEdit
 	}
 
 	[Serializable]

+ 1 - 0
Assembly-CSharp/DailyMgr.cs

@@ -151,6 +151,7 @@ public class DailyMgr : BaseCreatePanel
 			dictionary.Add(DailyCtrl.ButtonType.DeskCustomize, "label_deskcustomize");
 			dictionary.Add(DailyCtrl.ButtonType.MyRoomCustom, "label_myroom");
 			dictionary.Add(DailyCtrl.ButtonType.ManEdit, "label_useredit");
+			dictionary.Add(DailyCtrl.ButtonType.NPCEdit, "label_npcedit");
 			dictionary.Add(DailyCtrl.ButtonType.LegacyMode, "label_legacymode");
 			dictionary.Add(DailyCtrl.ButtonType.Karaoke, "label_karaoke");
 			dictionary.Add(DailyCtrl.ButtonType.Credit, "label_credit");

+ 2 - 2
Assembly-CSharp/Dance/UndressItem.cs

@@ -48,9 +48,9 @@ namespace Dance
 			MaidProp prop = maid.GetProp(this.m_MyMpn);
 			SceneEdit.SMenuItem smenuItem = new SceneEdit.SMenuItem();
 			SceneEdit.InitMenuItemScript(smenuItem, prop.strFileName, false);
-			if (smenuItem.m_texIcon)
+			if (smenuItem.m_texIconRef)
 			{
-				this.m_MaidPartsiconPair.Add(maid, new UndressItem.MaidInfo(smenuItem.m_texIcon, false));
+				this.m_MaidPartsiconPair.Add(maid, new UndressItem.MaidInfo(smenuItem.m_texIconRef, false));
 			}
 		}
 

+ 10 - 1
Assembly-CSharp/DanceMain.cs

@@ -6,6 +6,7 @@ using System.Linq;
 using System.Text.RegularExpressions;
 using UnityEngine;
 using UnityEngine.Rendering;
+using UnityEngine.SceneManagement;
 
 public class DanceMain : MonoBehaviour
 {
@@ -64,6 +65,12 @@ public class DanceMain : MonoBehaviour
 	{
 		this.m_boDebugDummyBody = false;
 		NTime.Reset();
+		string name = SceneManager.GetActiveScene().name;
+		if (name.ToLower().Contains("_release") && !this.UseBinaryData)
+		{
+			Debug.LogError("ダンスシーン:" + name + " でUseBinaryDataがONになっていません。強制でONにします。");
+			this.UseBinaryData = true;
+		}
 		Dictionary<string, string> tag_backup = GameMain.Instance.ScriptMgr.adv_kag.tag_backup;
 		string strScriptLabel;
 		if (tag_backup != null && tag_backup.TryGetValue("label", out strScriptLabel))
@@ -402,6 +409,8 @@ public class DanceMain : MonoBehaviour
 				this.m_listMaid[i].StopKuchipakuPattern();
 				this.m_listMaid[i].EyeToCamera(Maid.EyeMoveType.目と顔を向ける, 0f);
 				this.m_listMaid[i].AllIKDetach(0f);
+				this.m_listMaid[i].SetAutoTwist(Maid.AutoTwist.WristL, true);
+				this.m_listMaid[i].SetAutoTwist(Maid.AutoTwist.WristR, true);
 			}
 		}
 		for (int j = 0; j < this.m_listItemObject.Count; j++)
@@ -481,7 +490,7 @@ public class DanceMain : MonoBehaviour
 		ScriptManager script_mgr = GameMain.Instance.ScriptMgr;
 		script_mgr.StopMotionScript();
 		script_mgr.is_motion_blend = true;
-		script_mgr.LoadMotionScript(0, false, this.m_AdjustScript, this.m_ScriptLabel, string.Empty, string.Empty, false, true);
+		script_mgr.LoadMotionScript(0, false, this.m_AdjustScript, this.m_ScriptLabel, string.Empty, string.Empty, false, true, false);
 		float timer = 0f;
 		while (timer <= this.m_LoadScriptTime)
 		{

+ 1 - 2
Assembly-CSharp/DanceSelect.cs

@@ -3,7 +3,6 @@ using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
 using I2.Loc;
-using MaidStatus;
 using UnityEngine;
 using wf;
 
@@ -717,7 +716,7 @@ public class DanceSelect : WfScreenChildren
 				for (int i = 0; i < GameMain.Instance.CharacterMgr.GetStockMaidCount(); i++)
 				{
 					Maid stockMaid = GameMain.Instance.CharacterMgr.GetStockMaid(i);
-					if (!stockMaid.status.mainChara || stockMaid.status.heroineType != HeroineType.Original || !ScenarioData.IsMainPersonal(stockMaid))
+					if (!VsDanceDataMgr.Instance.CurrentSetting.IsCanBattleParticipate(stockMaid))
 					{
 						this.chara_select_mgr_.RemoveMaidPlate(stockMaid);
 					}

+ 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(1240);
+		binary.Write(1250);
 		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(1240);
+		f_bw.Write(1250);
 		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(1240);
+		f_bw.Write(1250);
 		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, 1240);
+				this.m_Colliders[i].Serialize(f_bw, 1250);
 			}
 		}
 		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(1240);
+		f_bw.Write(1250);
 		f_bw.Write(this.m_fPanierRadius);
 		this.SerializeWriteAnimationCurve(f_bw, this.m_PanierRadiusDistrib);
 		int num = (this.m_PanierRadiusDistribGroup == null) ? 0 : this.m_PanierRadiusDistribGroup.Length;

+ 88 - 0
Assembly-CSharp/EditItemTextureCache.cs

@@ -0,0 +1,88 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class EditItemTextureCache : MonoBehaviour
+{
+	private void OnDestroy()
+	{
+		foreach (KeyValuePair<int, Texture2D> keyValuePair in this.loadTex)
+		{
+			UnityEngine.Object.Destroy(keyValuePair.Value);
+		}
+	}
+
+	private IEnumerator ProcLoad()
+	{
+		float endTime = Time.realtimeSinceStartup + 0.003f;
+		while (0 < this.preloadItems.Count)
+		{
+			int rid = this.preloadItems[0];
+			if (!this.loadTex.ContainsKey(rid))
+			{
+				try
+				{
+					this.loadTex.Add(rid, ImportCM.CreateTexture(this.ridToFileNameDic[rid]));
+				}
+				catch (Exception)
+				{
+				}
+				this.preloadItems.RemoveAt(0);
+				if (endTime <= Time.realtimeSinceStartup)
+				{
+					yield return null;
+					endTime = Time.realtimeSinceStartup + 0.003f;
+				}
+			}
+			else
+			{
+				this.preloadItems.RemoveAt(0);
+			}
+		}
+		this.loadProcessOperation = false;
+		yield break;
+	}
+
+	public Texture2D GetTexter(int rid)
+	{
+		Texture2D texture2D = null;
+		if (!this.loadTex.TryGetValue(rid, out texture2D))
+		{
+			texture2D = ImportCM.CreateTexture(this.ridToFileNameDic[rid]);
+			this.loadTex.Add(rid, texture2D);
+		}
+		return texture2D;
+	}
+
+	public bool IsRegister(int rid)
+	{
+		return this.ridToFileNameDic.ContainsKey(rid);
+	}
+
+	public void PreLoadRegister(int rid, string fileName)
+	{
+		if (!this.loadTex.ContainsKey(rid))
+		{
+			this.preloadItems.Add(rid);
+			this.ridToFileNameDic[rid] = fileName;
+		}
+	}
+
+	public void Update()
+	{
+		if (!this.loadProcessOperation && 0 < this.preloadItems.Count)
+		{
+			this.loadProcessOperation = true;
+			base.StartCoroutine(this.ProcLoad());
+		}
+	}
+
+	private Dictionary<int, Texture2D> loadTex = new Dictionary<int, Texture2D>();
+
+	private List<int> preloadItems = new List<int>();
+
+	private Dictionary<int, string> ridToFileNameDic = new Dictionary<int, string>();
+
+	private bool loadProcessOperation;
+}

+ 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(1240);
+		binaryWriter.Write(1250);
 		binaryWriter.Write(value);
 		binaryWriter.Write(text2.ToLower());
 		binaryWriter.Write(value2);

+ 32 - 0
Assembly-CSharp/EmpireLifeModeAPI.cs

@@ -133,6 +133,38 @@ public static class EmpireLifeModeAPI
 		return list;
 	}
 
+	public static List<string> GetEnabledPersonalListOfRecollection()
+	{
+		List<string> list = new List<string>();
+		foreach (Personal.Data data in Personal.GetAllDatas(true))
+		{
+			string uniqueName = data.uniqueName;
+			if (data.oldPersonal)
+			{
+				if (uniqueName == "Pure" || uniqueName == "Cool" || uniqueName == "Pride")
+				{
+					if (GameMain.Instance.CharacterMgr.status.isAvailableTransfer)
+					{
+						list.Add(uniqueName);
+					}
+				}
+				else if (data.single)
+				{
+					list.Add(uniqueName);
+				}
+				else if (!string.IsNullOrEmpty(GameMain.Instance.CMSystem.CM3D2Path) && data.compatible)
+				{
+					list.Add(uniqueName);
+				}
+			}
+			else
+			{
+				list.Add(uniqueName);
+			}
+		}
+		return list;
+	}
+
 	public static int GetPriorityScenarioType(this EmpireLifeModeData.Data data)
 	{
 		return EmpireLifeModeAPI.GetPriorityScenarioType(data.dataScenarioType);

+ 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(1240);
+		brWrite.Write(1250);
 		brWrite.Write("2");
 		DataArray<int, byte> saveDataScenarioExecuteCountArray = this.m_SaveDataScenarioExecuteCountArray;
 		if (EmpireLifeModeManager.<>f__mg$cache1 == null)

+ 2 - 2
Assembly-CSharp/FaceWindow.cs

@@ -72,9 +72,9 @@ public class FaceWindow : BaseMaidPhotoWindow
 			foreach (SceneEdit.SMenuItem smenuItem in array[i])
 			{
 				GameObject gameObject = Utility.CreatePrefab(uiwftabPanel.gameObject, "ScenePhotoMode/EditItemIcon", true);
-				if (smenuItem.m_texIcon != null)
+				if (smenuItem.m_texIconRef != null)
 				{
-					Sprite sprite2D = Sprite.Create(smenuItem.m_texIcon, new Rect(0f, 0f, (float)smenuItem.m_texIcon.width, (float)smenuItem.m_texIcon.height), default(Vector2));
+					Sprite sprite2D = Sprite.Create(smenuItem.m_texIconRef, new Rect(0f, 0f, (float)smenuItem.m_texIconRef.width, (float)smenuItem.m_texIconRef.height), default(Vector2));
 					UI2DSprite componentInChildren = gameObject.GetComponentInChildren<UI2DSprite>();
 					componentInChildren.sprite2D = sprite2D;
 					componentInChildren.SetDimensions(60, 60);

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

+ 213 - 0
Assembly-CSharp/FreeModeItemLifeMode.cs

@@ -0,0 +1,213 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+public class FreeModeItemLifeMode : AbstractFreeModeItem
+{
+	private FreeModeItemLifeMode(CsvParser csv, int y)
+	{
+		int num = 0;
+		this.m_ID = csv.GetCellAsInteger(num++, y);
+		this.m_LifeModeDataID = csv.GetCellAsInteger(num++, y);
+		this.m_Title = csv.GetCellAsString(num++, y);
+		this.m_PlayFileName = csv.GetCellAsString(num++, y);
+		this.m_Text = csv.GetCellAsString(num++, y);
+		List<string> list = new List<string>();
+		while (num < csv.max_cell_x && csv.IsCellToExistData(num, y))
+		{
+			list.Add(csv.GetCellAsString(num++, y));
+		}
+		this.m_ConditionTexts = list.ToArray();
+		NDebug.Assert(EmpireLifeModeData.Contains(this.m_LifeModeDataID), "ライフモード回想\n項目「ライフモードID」の値が不正です。\nこのIDに対応するライフモードの表データが存在しません。\n値:" + this.m_LifeModeDataID.ToString());
+		this.m_LifeModeData = EmpireLifeModeData.GetData(this.m_LifeModeDataID);
+		this.m_IsAllEnabledPersonal = true;
+		foreach (KeyValuePair<int, string> keyValuePair in this.m_LifeModeData.dataMaidPersonalUniqueNameAndActiveSlotDic)
+		{
+			if (!EmpireLifeModeAPI.GetEnabledPersonalListOfRecollection().Contains(keyValuePair.Value))
+			{
+				this.m_IsAllEnabledPersonal = false;
+				break;
+			}
+		}
+	}
+
+	public static List<FreeModeItemLifeMode> CreateItemList(bool displayableOnly = true)
+	{
+		FreeModeItemLifeMode.CreateCsvData();
+		if (displayableOnly)
+		{
+			return new List<FreeModeItemLifeMode>(from data in FreeModeItemLifeMode.m_DataDic.Values
+			where data.IsDisplayable
+			select data);
+		}
+		return new List<FreeModeItemLifeMode>(FreeModeItemLifeMode.m_DataDic.Values);
+	}
+
+	private static void CreateCsvData()
+	{
+		if (FreeModeItemLifeMode.m_DataDic != null)
+		{
+			return;
+		}
+		FreeModeItemLifeMode.m_DataDic = new Dictionary<int, FreeModeItemLifeMode>();
+		HashSet<int> enabledIdList = AbstractFreeModeItem.GetEnabledIdList();
+		if (enabledIdList == null || enabledIdList.Count <= 0)
+		{
+			return;
+		}
+		string text = "recollection_life_mode.nei";
+		NDebug.Assert(GameUty.FileSystem.IsExistentFile(text), text + "\nopen failed.");
+		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))
+					{
+						int cellAsInteger = csvParser.GetCellAsInteger(0, i);
+						if (enabledIdList.Contains(cellAsInteger))
+						{
+							FreeModeItemLifeMode freeModeItemLifeMode = new FreeModeItemLifeMode(csvParser, i);
+							if (freeModeItemLifeMode.m_IsAllEnabledPersonal)
+							{
+								FreeModeItemLifeMode.m_DataDic.Add(cellAsInteger, freeModeItemLifeMode);
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+
+	public override string title
+	{
+		get
+		{
+			return this.m_Title;
+		}
+	}
+
+	public override string titleTerm
+	{
+		get
+		{
+			return "SceneFreeModeSelect/タイトル/" + this.m_Title;
+		}
+	}
+
+	public override int item_id
+	{
+		get
+		{
+			return this.m_ID;
+		}
+	}
+
+	public override string text
+	{
+		get
+		{
+			return this.m_Text;
+		}
+	}
+
+	public override string textTerm
+	{
+		get
+		{
+			return "SceneFreeModeSelect/説明/" + this.m_Text;
+		}
+	}
+
+	public override string[] condition_texts
+	{
+		get
+		{
+			return this.m_ConditionTexts;
+		}
+	}
+
+	public override string[] condition_text_terms
+	{
+		get
+		{
+			string[] array = new string[this.m_ConditionTexts.Length];
+			for (int i = 0; i < array.Length; i++)
+			{
+				array[i] = "SceneFreeModeSelect/条件文/" + this.m_ConditionTexts[i];
+			}
+			return array;
+		}
+	}
+
+	public override bool is_enabled
+	{
+		get
+		{
+			if (GameMain.Instance.LifeModeMgr.GetScenarioExecuteCount(this.m_LifeModeData.ID) <= 0)
+			{
+				return false;
+			}
+			List<Maid> lifeModeAllMaidList = GameMain.Instance.LifeModeMgr.lifeModeAllMaidList;
+			using (Dictionary<int, string>.Enumerator enumerator = this.m_LifeModeData.dataMaidPersonalUniqueNameAndActiveSlotDic.GetEnumerator())
+			{
+				while (enumerator.MoveNext())
+				{
+					KeyValuePair<int, string> personalSlotPair = enumerator.Current;
+					if (!lifeModeAllMaidList.Any((Maid maid) => maid.status.personal.uniqueName == personalSlotPair.Value))
+					{
+						return false;
+					}
+				}
+			}
+			return true;
+		}
+	}
+
+	public override string play_file_name
+	{
+		get
+		{
+			return this.m_PlayFileName;
+		}
+	}
+
+	public override AbstractFreeModeItem.ItemType type
+	{
+		get
+		{
+			return AbstractFreeModeItem.ItemType.LifeMode;
+		}
+	}
+
+	public bool IsDisplayable
+	{
+		get
+		{
+			return this.m_IsAllEnabledPersonal && this.m_LifeModeData.IsCorrectNTRBlock();
+		}
+	}
+
+	public readonly EmpireLifeModeData.Data m_LifeModeData;
+
+	private readonly int m_ID;
+
+	private readonly int m_LifeModeDataID;
+
+	private readonly string m_Title;
+
+	private readonly string m_PlayFileName;
+
+	private readonly string m_Text;
+
+	private readonly string[] m_ConditionTexts;
+
+	public readonly bool m_IsAllEnabledPersonal;
+
+	private static Dictionary<int, FreeModeItemLifeMode> m_DataDic;
+
+	private const string STR_MSG = "ライフモード回想";
+}

+ 58 - 1
Assembly-CSharp/FreeModeSceneSelectBase.cs

@@ -1,5 +1,7 @@
 using System;
+using System.Collections;
 using System.Collections.Generic;
+using System.Linq;
 using Schedule;
 using UnityEngine;
 
@@ -41,6 +43,10 @@ public class FreeModeSceneSelectBase : WfScreenChildren
 		{
 			isEnabled = this.freemode_item_list_.SetList(FreeModeItemEveryday.CreateItemEverydayList(FreeModeItemEveryday.ScnearioType.Nitijyou, this.maid_.status).ToArray());
 		}
+		else if (this.mode == FreeModeSceneSelectBase.SelectMode.LifeMode)
+		{
+			isEnabled = this.freemode_item_list_.SetList(FreeModeItemLifeMode.CreateItemList(true).ToArray());
+		}
 		else
 		{
 			this.freemode_item_list_.gameObject.SetActive(false);
@@ -132,6 +138,10 @@ public class FreeModeSceneSelectBase : WfScreenChildren
 		{
 			this.mgr_.CallScenePlayMainStory();
 		}
+		else if (select_item_data.type == AbstractFreeModeItem.ItemType.LifeMode)
+		{
+			this.Finish();
+		}
 	}
 
 	protected override void OnFinish()
@@ -139,6 +149,13 @@ public class FreeModeSceneSelectBase : WfScreenChildren
 		base.OnFinish();
 		if (this.is_scenario_load_)
 		{
+			if (this.IsLifeModeData())
+			{
+				this.LifeModeScenarioMaidActivate(this.freemode_item_list_.select_item_data as FreeModeItemLifeMode, delegate
+				{
+					this.mgr_.CallScenePlayLifeMode();
+				});
+			}
 			GameMain.Instance.MainLight.Reset();
 			GameMain.Instance.CharacterMgr.ResetCharaPosAll();
 			GameMain.Instance.MainCamera.Reset(CameraMain.CameraType.Target, true);
@@ -156,6 +173,45 @@ public class FreeModeSceneSelectBase : WfScreenChildren
 		this.mgr_.CallScreen("Select");
 	}
 
+	private bool IsLifeModeData()
+	{
+		return !(this.freemode_item_list_ == null) && this.freemode_item_list_.select_item_data != null && this.freemode_item_list_.select_item_data.type == AbstractFreeModeItem.ItemType.LifeMode;
+	}
+
+	private void LifeModeScenarioMaidActivate(FreeModeItemLifeMode freeModeItemLifeMode, Action onFinish)
+	{
+		List<Maid> list = new List<Maid>();
+		using (Dictionary<int, string>.Enumerator enumerator = freeModeItemLifeMode.m_LifeModeData.dataMaidPersonalUniqueNameAndActiveSlotDic.GetEnumerator())
+		{
+			while (enumerator.MoveNext())
+			{
+				KeyValuePair<int, string> slotPersonalPair = enumerator.Current;
+				Maid maid = GameMain.Instance.LifeModeMgr.lifeModeAllMaidList.First((Maid data) => data.status.personal.uniqueName == slotPersonalPair.Value);
+				GameMain.Instance.CharacterMgr.SetActiveMaid(maid, slotPersonalPair.Key);
+				list.Add(maid);
+			}
+		}
+		base.StartCoroutine(this.CoWaitAllCharacterLoad(list, onFinish));
+	}
+
+	private IEnumerator CoWaitAllCharacterLoad(IEnumerable<Maid> maids, Action onFinish)
+	{
+		foreach (Maid maid in maids)
+		{
+			maid.Visible = true;
+			maid.AllProcPropSeqStart();
+			while (maid.IsBusy)
+			{
+				yield return null;
+			}
+		}
+		if (onFinish != null)
+		{
+			onFinish();
+		}
+		yield break;
+	}
+
 	public FreeModeSceneSelectBase.SelectMode mode;
 
 	private Maid maid_;
@@ -176,6 +232,7 @@ public class FreeModeSceneSelectBase : WfScreenChildren
 	{
 		Everyday,
 		Vip,
-		Story
+		Story,
+		LifeMode
 	}
 }

+ 9 - 1
Assembly-CSharp/FreeModeSelect.cs

@@ -14,6 +14,7 @@ public class FreeModeSelect : WfScreenChildren
 		this.btn_dic_.Add("日常", UTY.GetChildObject(base.root_obj, "Menu/FreeModeMenuButton/日常", false).GetComponent<UIButton>());
 		this.btn_dic_.Add("夜伽", UTY.GetChildObject(base.root_obj, "Menu/FreeModeMenuButton/夜伽", false).GetComponent<UIButton>());
 		this.btn_dic_.Add("キャンセル", UTY.GetChildObject(base.root_obj, "Cancel", false).GetComponent<UIButton>());
+		this.btn_dic_.Add("ライフモード", UTY.GetChildObject(base.root_obj, "Menu/FreeModeMenuButton/ライフモード", false).GetComponent<UIButton>());
 		if (DailyMgr.IsLegacy)
 		{
 			this.btn_dic_.Add("VIP", UTY.GetChildObject(base.root_obj, "Menu/FreeModeMenuButton/VIP", false).GetComponent<UIButton>());
@@ -55,7 +56,14 @@ public class FreeModeSelect : WfScreenChildren
 					{
 						if (!(type_name == "夜伽"))
 						{
-							if (type_name == "キャンセル")
+							if (!(type_name == "キャンセル"))
+							{
+								if (type_name == "ライフモード")
+								{
+									this.free_mode_select_mgr_.CallEmpireLifeMode();
+								}
+							}
+							else
 							{
 								this.free_mode_select_mgr_.CallCharaSelect();
 							}

+ 100 - 19
Assembly-CSharp/FreeSkillSelect.cs

@@ -412,6 +412,41 @@ public class FreeSkillSelect : MonoBehaviour
 		this.update_obj_dic_["スキル"].UpdateArrow(skill_data.tab_button_obj.gameObject);
 		this.select_skill_ = skill_data.skill_data;
 		this.CreateStage(skill_data.skill_data);
+		FreeSkillSelect.ButtonData buttonData = (skill_data.parent == null) ? null : ((skill_data.parent.parent == null) ? null : skill_data.parent.parent);
+		FreeSkillSelect.RootType rootType = (buttonData == null) ? FreeSkillSelect.RootType.Null : buttonData.root_type;
+		if (rootType == FreeSkillSelect.RootType.GP01Harem || rootType == FreeSkillSelect.RootType.GP01Swapping || rootType == FreeSkillSelect.RootType.GP01NTR || rootType == FreeSkillSelect.RootType.GP01NTRReport)
+		{
+			List<Transform> childList = this.update_obj_dic_["レベル"].ui_grid.GetChildList();
+			bool flag = true;
+			for (int i = childList.Count - 1; i >= 0; i--)
+			{
+				UIWFTabButton componentInChildren = childList[i].gameObject.GetComponentInChildren<UIWFTabButton>();
+				if (!(componentInChildren == null) && componentInChildren.isEnabled)
+				{
+					if (flag)
+					{
+						this.update_obj_dic_["レベル"].tab_panel.Select(componentInChildren);
+					}
+					else
+					{
+						componentInChildren.isEnabled = false;
+					}
+					flag = false;
+				}
+			}
+		}
+		else
+		{
+			List<Transform> childList2 = this.update_obj_dic_["レベル"].ui_grid.GetChildList();
+			for (int j = 0; j < childList2.Count; j++)
+			{
+				UIWFTabButton componentInChildren2 = childList2[j].gameObject.GetComponentInChildren<UIWFTabButton>();
+				if (!(componentInChildren2 == null))
+				{
+					componentInChildren2.isEnabled = true;
+				}
+			}
+		}
 	}
 
 	private void OnClickLevelBtnEvent()
@@ -430,24 +465,27 @@ public class FreeSkillSelect : MonoBehaviour
 	private static List<FreeSkillSelect.ButtonData> CreateButtonData(Maid maid, HashSet<int> selectableStageIds)
 	{
 		List<FreeSkillSelect.ButtonData> list = new List<FreeSkillSelect.ButtonData>();
-		Dictionary<Skill.Data.SpecialConditionType, KeyValuePair<FreeSkillSelect.ButtonData, Dictionary<string, FreeSkillSelect.ButtonData>>> type_data_dic = new Dictionary<Skill.Data.SpecialConditionType, KeyValuePair<FreeSkillSelect.ButtonData, Dictionary<string, FreeSkillSelect.ButtonData>>>();
-		List<KeyValuePair<Skill.Data.SpecialConditionType, string>> list2 = new List<KeyValuePair<Skill.Data.SpecialConditionType, string>>();
-		list2.Add(new KeyValuePair<Skill.Data.SpecialConditionType, string>(Skill.Data.SpecialConditionType.Null, "通常"));
-		list2.Add(new KeyValuePair<Skill.Data.SpecialConditionType, string>(Skill.Data.SpecialConditionType.Drunk, "酔い"));
-		list2.Add(new KeyValuePair<Skill.Data.SpecialConditionType, string>(Skill.Data.SpecialConditionType.Mask, "目隠し"));
-		list2.Add(new KeyValuePair<Skill.Data.SpecialConditionType, string>(Skill.Data.SpecialConditionType.Drug, "媚薬"));
-		list2.Add(new KeyValuePair<Skill.Data.SpecialConditionType, string>(Skill.Data.SpecialConditionType.Confess, "告白"));
-		list2.Add(new KeyValuePair<Skill.Data.SpecialConditionType, string>(Skill.Data.SpecialConditionType.Faint, "気絶"));
-		list2.Add(new KeyValuePair<Skill.Data.SpecialConditionType, string>(Skill.Data.SpecialConditionType.NewType, "新夜伽"));
+		Dictionary<FreeSkillSelect.RootType, KeyValuePair<FreeSkillSelect.ButtonData, Dictionary<string, FreeSkillSelect.ButtonData>>> type_data_dic = new Dictionary<FreeSkillSelect.RootType, KeyValuePair<FreeSkillSelect.ButtonData, Dictionary<string, FreeSkillSelect.ButtonData>>>();
+		List<KeyValuePair<FreeSkillSelect.RootType, string>> list2 = new List<KeyValuePair<FreeSkillSelect.RootType, string>>();
+		list2.Add(new KeyValuePair<FreeSkillSelect.RootType, string>(FreeSkillSelect.RootType.Null, "通常"));
+		list2.Add(new KeyValuePair<FreeSkillSelect.RootType, string>(FreeSkillSelect.RootType.Drunk, "酔い"));
+		list2.Add(new KeyValuePair<FreeSkillSelect.RootType, string>(FreeSkillSelect.RootType.Mask, "目隠し"));
+		list2.Add(new KeyValuePair<FreeSkillSelect.RootType, string>(FreeSkillSelect.RootType.Drug, "媚薬"));
+		list2.Add(new KeyValuePair<FreeSkillSelect.RootType, string>(FreeSkillSelect.RootType.Confess, "告白"));
+		list2.Add(new KeyValuePair<FreeSkillSelect.RootType, string>(FreeSkillSelect.RootType.Faint, "気絶"));
+		list2.Add(new KeyValuePair<FreeSkillSelect.RootType, string>(FreeSkillSelect.RootType.GP01Harem, "GP-01ハーレム"));
+		list2.Add(new KeyValuePair<FreeSkillSelect.RootType, string>(FreeSkillSelect.RootType.GP01Swapping, "GP-01スワッピング"));
+		list2.Add(new KeyValuePair<FreeSkillSelect.RootType, string>(FreeSkillSelect.RootType.GP01NTR, "GP-01寝取らせ"));
+		list2.Add(new KeyValuePair<FreeSkillSelect.RootType, string>(FreeSkillSelect.RootType.GP01NTRReport, "GP-01寝取らせ報告"));
 		for (int i = 0; i < list2.Count; i++)
 		{
 			FreeSkillSelect.ButtonData buttonData = new FreeSkillSelect.ButtonData();
 			buttonData.children_list = new List<FreeSkillSelect.ButtonData>();
 			buttonData.name = list2[i].Value;
 			buttonData.nameTerm = "SceneYotogi/スキル所属/" + buttonData.name;
-			buttonData.condition_type = list2[i].Key;
+			buttonData.root_type = list2[i].Key;
 			list.Add(buttonData);
-			type_data_dic.Add(buttonData.condition_type, new KeyValuePair<FreeSkillSelect.ButtonData, Dictionary<string, FreeSkillSelect.ButtonData>>(buttonData, new Dictionary<string, FreeSkillSelect.ButtonData>()));
+			type_data_dic.Add(buttonData.root_type, new KeyValuePair<FreeSkillSelect.ButtonData, Dictionary<string, FreeSkillSelect.ButtonData>>(buttonData, new Dictionary<string, FreeSkillSelect.ButtonData>()));
 		}
 		for (int j = 0; j < list.Count; j++)
 		{
@@ -462,7 +500,7 @@ public class FreeSkillSelect : MonoBehaviour
 				buttonData3.nameTerm = "SceneYotogi/スキルカテゴリー/" + buttonData3.name;
 				buttonData3.parent = buttonData2;
 				buttonData2.children_list.Add(buttonData3);
-				type_data_dic[list[j].condition_type].Value.Add(buttonData3.name, buttonData3);
+				type_data_dic[list[j].root_type].Value.Add(buttonData3.name, buttonData3);
 			}
 		}
 		CharacterMgr characterMgr = GameMain.Instance.CharacterMgr;
@@ -509,7 +547,8 @@ public class FreeSkillSelect : MonoBehaviour
 		}
 		foreach (Skill.Data data2 in list3)
 		{
-			if (1 < data2.player_num)
+			int user_player_num = data2.user_player_num;
+			if (1 < user_player_num)
 			{
 				int num = 0;
 				for (int m = 0; m < characterMgr.GetMaidCount(); m++)
@@ -520,14 +559,42 @@ public class FreeSkillSelect : MonoBehaviour
 					}
 					num++;
 				}
-				if (num < data2.player_num)
+				if (num < user_player_num)
 				{
 					continue;
 				}
 			}
 			if (data2.IsExecMaid(maid.status))
 			{
-				FreeSkillSelect.ButtonData buttonData5 = type_data_dic[data2.specialConditionType].Value[data2.category.ToString()];
+				FreeSkillSelect.RootType key;
+				if (Skill.Data.SpecialConditionType.Null <= data2.specialConditionType && data2.specialConditionType <= Skill.Data.SpecialConditionType.Confess)
+				{
+					key = (FreeSkillSelect.RootType)data2.specialConditionType;
+				}
+				else
+				{
+					if (data2.specialConditionType != Skill.Data.SpecialConditionType.GP01Recollect)
+					{
+						continue;
+					}
+					if (data2.category == Yotogi.Category.ハ\u30FCレム)
+					{
+						key = FreeSkillSelect.RootType.GP01Harem;
+					}
+					else
+					{
+						key = FreeSkillSelect.RootType.GP01Swapping;
+						if (data2.name.Contains("報告"))
+						{
+							key = FreeSkillSelect.RootType.GP01NTRReport;
+						}
+						else if (data2.name.Contains("寝取り"))
+						{
+							key = FreeSkillSelect.RootType.GP01NTR;
+						}
+					}
+				}
+				FreeSkillSelect.ButtonData buttonData5 = type_data_dic[key].Value[data2.category.ToString()];
 				if (buttonData5 != null)
 				{
 					FreeSkillSelect.ButtonData buttonData6 = new FreeSkillSelect.ButtonData();
@@ -538,7 +605,7 @@ public class FreeSkillSelect : MonoBehaviour
 				}
 			}
 		}
-		Action<Skill.Data.SpecialConditionType> action = delegate(Skill.Data.SpecialConditionType type)
+		Action<FreeSkillSelect.RootType> action = delegate(FreeSkillSelect.RootType type)
 		{
 			Dictionary<string, FreeSkillSelect.ButtonData> value3 = type_data_dic[type].Value;
 			HashSet<string> hashSet = new HashSet<string>();
@@ -555,9 +622,9 @@ public class FreeSkillSelect : MonoBehaviour
 		};
 		foreach (FreeSkillSelect.ButtonData buttonData7 in list)
 		{
-			if (buttonData7.condition_type != Skill.Data.SpecialConditionType.Null)
+			if (buttonData7.root_type != FreeSkillSelect.RootType.Null)
 			{
-				action(buttonData7.condition_type);
+				action(buttonData7.root_type);
 			}
 		}
 		return list;
@@ -616,6 +683,20 @@ public class FreeSkillSelect : MonoBehaviour
 
 	private YotogiStage.Data user_request_stage;
 
+	private enum RootType
+	{
+		Null,
+		Drunk,
+		Mask,
+		Drug,
+		Faint,
+		Confess,
+		GP01Harem,
+		GP01Swapping,
+		GP01NTR,
+		GP01NTRReport
+	}
+
 	private class ButtonData
 	{
 		public UIWFTabButton tab_button_obj;
@@ -630,7 +711,7 @@ public class FreeSkillSelect : MonoBehaviour
 
 		public Skill.Data skill_data;
 
-		public Skill.Data.SpecialConditionType condition_type;
+		public FreeSkillSelect.RootType root_type;
 	}
 
 	private class UpdateObject

+ 1 - 1
Assembly-CSharp/GameInShopMain.cs

@@ -230,7 +230,7 @@ public class GameInShopMain : WfScreenChildren
 			{
 				this.wait_check_time_ = GameMain.tick_count;
 				ScriptManager scriptMgr = GameMain.Instance.ScriptMgr;
-				scriptMgr.LoadMotionScript(0, false, "h_kaiwa_tati_001.ks", "*会話立ち待機", string.Empty, string.Empty, false, true);
+				scriptMgr.LoadMotionScript(0, false, "h_kaiwa_tati_001.ks", "*会話立ち待機", string.Empty, string.Empty, false, true, false);
 				this.maid_.FaceAnime("通常", 1f, 0);
 				this.maid_.FaceBlend("無し");
 				return false;

+ 5 - 2
Assembly-CSharp/GameMain.cs

@@ -9,6 +9,7 @@ using System.Threading;
 using I2.Loc;
 using Kasizuki;
 using MaidStatus;
+using SceneNPCEdit;
 using Schedule;
 using UnityEngine;
 using UnityEngine.SceneManagement;
@@ -678,7 +679,7 @@ public class GameMain : MonoSingleton<GameMain>
 		serializeHeader.nMaidNum = this.m_CharacterMgr.GetStockMaidCount();
 		serializeHeader.strComment = f_strComment;
 		binaryWriter.Write("COM3D2_SAVE");
-		binaryWriter.Write(1240);
+		binaryWriter.Write(1250);
 		this.SerializeWriteHeader(binaryWriter, serializeHeader);
 		binaryWriter.Write("bookmark_kk_01");
 		GameMain.BinaryBookmark binaryBookmark = new GameMain.BinaryBookmark(binaryWriter);
@@ -716,6 +717,7 @@ public class GameMain : MonoSingleton<GameMain>
 		binaryBookmark2.WriteBinaryLength(binaryWriter);
 		CasinoDataMgr.Instance.Serialize(binaryWriter);
 		VsDanceDataMgr.Instance.Serialize(binaryWriter);
+		SaveData.Serialize(binaryWriter);
 		string path = this.MakeSavePathFileName(f_nSaveNo);
 		File.WriteAllBytes(path, memoryStream.ToArray());
 		memoryStream.Close();
@@ -794,7 +796,7 @@ public class GameMain : MonoSingleton<GameMain>
 		MemoryStream memoryStream = new MemoryStream();
 		BinaryWriter binaryWriter = new BinaryWriter(memoryStream);
 		binaryWriter.Write("COM3D2_SAVE");
-		binaryWriter.Write(1240);
+		binaryWriter.Write(1250);
 		this.SerializeWriteHeader(binaryWriter, saveDataHeader);
 		binaryWriter.Write(array, (int)saveDataHeader.lHeaderSize, (int)((long)array.Length - saveDataHeader.lHeaderSize));
 		File.WriteAllBytes(path, memoryStream.ToArray());
@@ -1060,6 +1062,7 @@ public class GameMain : MonoSingleton<GameMain>
 			this.m_KasizukiMgr.Deserialize(f_nSaveNo, binaryReader);
 			CasinoDataMgr.Instance.Deserialize(binaryReader, num);
 			VsDanceDataMgr.Instance.Deserialize(binaryReader, num);
+			SaveData.Deserialize(binaryReader, num);
 			binaryReader.Close();
 			binaryReader = null;
 		}

+ 1 - 1
Assembly-CSharp/GameModeManager.cs

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

+ 9 - 2
Assembly-CSharp/GameUty.cs

@@ -50,6 +50,8 @@ public class GameUty
 		}
 	}
 
+	public static HashSet<string> loadArchiveList { get; private set; }
+
 	public static string[] MenuFiles
 	{
 		get
@@ -133,6 +135,7 @@ public class GameUty
 	{
 		GameUty.m_FileSystem = new FileSystemArchive();
 		GameUty.m_FileSystemOld = new FileSystemArchive();
+		GameUty.loadArchiveList = new HashSet<string>();
 		GameUty.PathListOld = new List<string>();
 		if (!string.IsNullOrEmpty(GameMain.Instance.CMSystem.CM3D2Path))
 		{
@@ -285,6 +288,10 @@ public class GameUty
 					".arc]を読み込みました"
 				}));
 			}
+			if (flag3)
+			{
+				GameUty.loadArchiveList.Add(name.ToLower());
+			}
 			return flag3;
 		};
 		HashSet<string> addedLegacyArchives = new HashSet<string>();
@@ -978,14 +985,14 @@ public class GameUty
 
 	public static string GetBuildVersionText()
 	{
-		int num = 1240;
+		int num = 1250;
 		return (num >= 1000) ? ((float)num / 1000f).ToString("F2") : ((float)num / 100f).ToString("F2");
 	}
 
 	public static string GetGameVersionText()
 	{
 		string text = "COM3D2x64.exe";
-		int num = 1240;
+		int num = 1250;
 		string path = Path.GetFullPath(".\\") + "update.lst";
 		string[] array = new string[0];
 		if (File.Exists(path))

+ 4 - 17
Assembly-CSharp/GizmoRenderTarget.cs

@@ -54,27 +54,14 @@ public class GizmoRenderTarget : GizmoRender
 
 	public override void OnRenderObject()
 	{
-		Quaternion quaternion = base.transform.rotation;
+		Quaternion rotation = base.transform.rotation;
 		base.OnRenderObject();
-		if (this.target_trans != null && quaternion != base.transform.rotation)
+		if (this.target_trans != null && rotation != base.transform.rotation)
 		{
+			this.target_trans.rotation = base.transform.rotation;
 			if (this.rotate_limit_ != null)
 			{
-				bool flag;
-				quaternion = this.rotate_limit_.GetLimitedLocalRotation(this.target_trans.localRotation, out flag);
-				if (flag)
-				{
-					this.target_trans.localRotation = quaternion;
-					base.transform.rotation = this.target_trans.rotation;
-				}
-				else
-				{
-					this.target_trans.rotation = base.transform.rotation;
-				}
-			}
-			else
-			{
-				this.target_trans.rotation = base.transform.rotation;
+				this.rotate_limit_.Apply();
 			}
 		}
 	}

+ 2 - 2
Assembly-CSharp/HandSignShortcut.cs

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

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

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

+ 3 - 3
Assembly-CSharp/Maid.cs

@@ -1273,7 +1273,7 @@ public class Maid : MonoBehaviour
 	public bool SerializeProp(BinaryWriter f_bwWrite)
 	{
 		f_bwWrite.Write("CM3D2_MPROP_LIST");
-		f_bwWrite.Write(1240);
+		f_bwWrite.Write(1250);
 		f_bwWrite.Write(this.m_dicMaidProp.Count);
 		int num = 0;
 		foreach (KeyValuePair<string, MaidProp> keyValuePair in this.m_dicMaidProp)
@@ -1307,7 +1307,7 @@ public class Maid : MonoBehaviour
 	public bool SerializeMisc(BinaryWriter f_bwWrite)
 	{
 		f_bwWrite.Write("CM3D2_MAID_MISC");
-		f_bwWrite.Write(1240);
+		f_bwWrite.Write(1250);
 		f_bwWrite.Write(this.m_nActiveSlotNo);
 		if (this.m_texIcon != null)
 		{
@@ -1332,7 +1332,7 @@ public class Maid : MonoBehaviour
 	public bool SerializeBody(BinaryWriter f_bwWrite)
 	{
 		f_bwWrite.Write("CM3D2_MAID_BODY");
-		f_bwWrite.Write(1240);
+		f_bwWrite.Write(1250);
 		return true;
 	}
 

+ 7 - 7
Assembly-CSharp/MaidParts.cs

@@ -37,7 +37,7 @@ public class MaidParts : MonoBehaviour
 	public unsafe bool Serialize(BinaryWriter f_bwWrite)
 	{
 		f_bwWrite.Write("CM3D2_MULTI_COL");
-		f_bwWrite.Write(1240);
+		f_bwWrite.Write(1250);
 		f_bwWrite.Write(this.m_aryPartsColor.Length);
 		for (int i = 0; i < this.m_aryPartsColor.Length; i++)
 		{
@@ -185,16 +185,16 @@ public class MaidParts : MonoBehaviour
 		new MaidParts.PartsColor
 		{
 			m_nMainHue = 69,
-			m_nMainChroma = 186,
-			m_nMainBrightness = 270,
-			m_nMainContrast = 94
+			m_nMainChroma = 0,
+			m_nMainBrightness = 67,
+			m_nMainContrast = 100
 		},
 		new MaidParts.PartsColor
 		{
 			m_nMainHue = 18,
-			m_nMainChroma = 149,
-			m_nMainBrightness = 247,
-			m_nMainContrast = 100
+			m_nMainChroma = 100,
+			m_nMainBrightness = 138,
+			m_nMainContrast = 85
 		},
 		new MaidParts.PartsColor
 		{

+ 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(1240);
+		f_bwWrite.Write(1250);
 		f_bwWrite.Write(this.idx);
 		f_bwWrite.Write(this.name);
 		f_bwWrite.Write(this.type);

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

@@ -756,6 +756,22 @@ namespace MaidStatus
 			}
 		}
 
+		public VoiceGroup voiceGroup
+		{
+			get
+			{
+				return this.voiceGroup_;
+			}
+			set
+			{
+				this.voiceGroup_ = value;
+				if (this.maid != null && this.maid.body0 != null)
+				{
+					this.maid.body0.SetVoiceGroup(value);
+				}
+			}
+		}
+
 		public ReadOnlyDictionary<int, Feature.Data> features { get; private set; }
 
 		public ReadOnlyDictionary<int, Propensity.Data> propensitys { get; private set; }
@@ -1215,7 +1231,7 @@ namespace MaidStatus
 		public void Serialize(BinaryWriter binary)
 		{
 			binary.Write("CM3D2_MAID_STATUS");
-			binary.Write(1240);
+			binary.Write(1250);
 			binary.Write(this.guid);
 			binary.Write(this.creationTime);
 			binary.Write((short)this.heroineType);
@@ -1905,5 +1921,7 @@ namespace MaidStatus
 		private Dictionary<string, int> flags_;
 
 		private Dictionary<int, bool> eventEndFlags_;
+
+		private VoiceGroup voiceGroup_;
 	}
 }

+ 12 - 0
Assembly-CSharp/MaidStatus/VoiceGroup.cs

@@ -0,0 +1,12 @@
+using System;
+
+namespace MaidStatus
+{
+	public enum VoiceGroup
+	{
+		Heroine,
+		Sub,
+		Extra,
+		Mob
+	}
+}

+ 177 - 138
Assembly-CSharp/Menu.cs

@@ -110,7 +110,7 @@ public class Menu : MonoBehaviour
 		Menu.ProcScriptBin(maid, cd, mp, f_bTemp, f_SubProp);
 		if (flag)
 		{
-			Menu.ProcModScriptBin(maid, array, text2, false);
+			Menu.ProcModScriptBin(maid, array, text2, mp, false);
 		}
 		return true;
 	}
@@ -160,13 +160,15 @@ public class Menu : MonoBehaviour
 		string text9 = string.Empty;
 		string slotname = string.Empty;
 		int version = 100;
+		bool flag2 = false;
+		bool flag3 = false;
 		for (;;)
 		{
 			try
 			{
 				for (;;)
 				{
-					IL_102:
+					IL_108:
 					int num3 = (int)binaryReader.ReadByte();
 					text8 = text7;
 					text7 = string.Empty;
@@ -180,11 +182,11 @@ public class Menu : MonoBehaviour
 					}
 					if (!(text7 == string.Empty))
 					{
-						goto IL_169;
+						goto IL_16F;
 					}
 				}
 				break;
-				IL_169:
+				IL_16F:
 				string stringCom = UTY.GetStringCom(text7);
 				string[] stringList = UTY.GetStringList(text7);
 				if (stringCom == "end")
@@ -193,38 +195,38 @@ public class Menu : MonoBehaviour
 				}
 				if (stringCom == "name")
 				{
-					goto IL_13C4;
+					goto IL_14B9;
 				}
 				if (stringCom == "ver")
 				{
 					TBodySkin slot2 = body.GetSlot(stringList[1]);
 					version = int.Parse(stringList[2]);
-					goto IL_13C4;
+					goto IL_14B9;
 				}
 				if (stringCom == "アイテム")
 				{
 					Menu.SetMaidItemTemp(maid, stringList[1], f_bTemp);
-					goto IL_13C4;
+					goto IL_14B9;
 				}
 				if (stringCom == "アイテム条件")
 				{
 					string slotname2 = stringList[1];
 					if (stringList[2] == "に何か")
 					{
-						bool flag2 = false;
+						bool flag4 = false;
 						TBodySkin slot3 = body.GetSlot(slotname2);
 						if (stringList[3] == "有る")
 						{
 							if (slot3.obj != null)
 							{
-								flag2 = true;
+								flag4 = true;
 							}
 						}
 						else if (stringList[3] == "無い")
 						{
 							if (slot3.obj == null)
 							{
-								flag2 = true;
+								flag4 = true;
 							}
 						}
 						else
@@ -233,56 +235,56 @@ public class Menu : MonoBehaviour
 						}
 						if (stringList[4] == "なら")
 						{
-							if (flag2)
+							if (flag4)
 							{
 								Menu.SetMaidItemTemp(maid, stringList[5], f_bTemp);
-								goto IL_2C3;
+								goto IL_2C9;
 							}
-							goto IL_2C3;
-							IL_2C3:
-							goto IL_2DA;
+							goto IL_2C9;
+							IL_2C9:
+							goto IL_2E0;
 						}
 						NDebug.Assert("アイテム条件が不正です。「なら」が必要です。\n" + text7, false);
-						goto IL_2DA;
-						IL_2DA:
-						goto IL_40E;
+						goto IL_2E0;
+						IL_2E0:
+						goto IL_414;
 					}
 					if (stringList[2] == "が")
 					{
-						bool flag3 = false;
+						bool flag5 = false;
 						TBodySkin slot4 = body.GetSlot(slotname2);
 						if (slot4.m_strModelFileName == stringList[3])
 						{
-							flag3 = true;
+							flag5 = true;
 						}
 						if (stringList[4] == "なら")
 						{
-							if (flag3)
+							if (flag5)
 							{
 								Menu.SetMaidItemTemp(maid, stringList[5], f_bTemp);
-								goto IL_33F;
+								goto IL_345;
 							}
-							goto IL_33F;
-							IL_33F:
-							goto IL_356;
+							goto IL_345;
+							IL_345:
+							goto IL_35C;
 						}
 						NDebug.Assert("アイテム条件が不正です。「なら」が必要です。\n" + text7, false);
-						goto IL_356;
-						IL_356:
-						goto IL_40E;
+						goto IL_35C;
+						IL_35C:
+						goto IL_414;
 					}
 					if (!(stringList[2] == "のアイテムパラメータの"))
 					{
-						goto IL_40E;
+						goto IL_414;
 					}
-					bool flag4 = false;
+					bool flag6 = false;
 					TBodySkin slot5 = body.GetSlot(slotname2);
 					string param = slot5.GetParam(stringList[3].ToLower());
 					if (stringList[4] == "が")
 					{
 						if (stringList[5].ToLower() == param)
 						{
-							flag4 = true;
+							flag6 = true;
 						}
 					}
 					else
@@ -291,38 +293,38 @@ public class Menu : MonoBehaviour
 					}
 					if (stringList[6] == "なら")
 					{
-						if (flag4)
+						if (flag6)
 						{
 							Menu.SetMaidItemTemp(maid, stringList[7], f_bTemp);
-							goto IL_3F7;
+							goto IL_3FD;
 						}
-						goto IL_3F7;
-						IL_3F7:
-						goto IL_40E;
+						goto IL_3FD;
+						IL_3FD:
+						goto IL_414;
 					}
 					NDebug.Assert("アイテム条件が不正です。「なら」が必要です。\n" + text7, false);
-					goto IL_40E;
-					IL_40E:
-					goto IL_13C4;
+					goto IL_414;
+					IL_414:
+					goto IL_14B9;
 				}
 				if (stringCom == "if")
 				{
 					if (stringList[1].IndexOf("maidprop[") != 0)
 					{
-						goto IL_58E;
+						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)
 					{
-						goto IL_58E;
+						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_58E;
+						goto IL_594;
 					}
 					string text10;
 					if (stringList[7].IndexOf("getprop[") == 0)
@@ -339,11 +341,11 @@ public class Menu : MonoBehaviour
 					if (!string.IsNullOrEmpty(text10))
 					{
 						maid.SetProp(idx, text10, 0, false, false);
-						goto IL_58E;
+						goto IL_594;
 					}
-					goto IL_58E;
-					IL_58E:
-					goto IL_13C4;
+					goto IL_594;
+					IL_594:
+					goto IL_14B9;
 				}
 				if (stringCom == "アイテムパラメータ")
 				{
@@ -358,12 +360,12 @@ public class Menu : MonoBehaviour
 							text12,
 							text13
 						}));
-						goto IL_603;
+						goto IL_609;
 					}
 					Debug.LogError("アイテムパラメータ 命令の引数が不正です。SlotNameを明示的に指定しする必要があります。アイテムパラメータ <スロット名> <変数名> <値> の順です。" + text7);
-					goto IL_603;
-					IL_603:
-					goto IL_13C4;
+					goto IL_609;
+					IL_609:
+					goto IL_14B9;
 				}
 				if (stringCom == "半脱ぎ" || stringCom == "リソース参照")
 				{
@@ -387,34 +389,34 @@ public class Menu : MonoBehaviour
 						if (sortedDictionary.TryGetValue(key, out empty))
 						{
 							sortedDictionary[key] = value4;
-							goto IL_6B5;
+							goto IL_6BB;
 						}
 						sortedDictionary.Add(key, value4);
-						goto IL_6B5;
-						IL_6B5:
-						goto IL_6DA;
+						goto IL_6BB;
+						IL_6BB:
+						goto IL_6E0;
 					}
 					sortedDictionary = new SortedDictionary<string, string>();
 					sortedDictionary.Add(key, value4);
 					Menu.m_dicResourceRef.Add(hashCode, sortedDictionary);
-					goto IL_6DA;
-					IL_6DA:
-					goto IL_13C4;
+					goto IL_6E0;
+					IL_6E0:
+					goto IL_14B9;
 				}
 				if (stringCom == "set")
 				{
-					goto IL_13C4;
+					goto IL_14B9;
 				}
 				if (stringCom == "setname")
 				{
-					goto IL_13C4;
+					goto IL_14B9;
 				}
 				if (stringCom == "setslotitem")
 				{
 					string tag = stringList[1];
 					uint val = uint.Parse(stringList[2]);
 					maid.SetProp(tag, (int)val, false);
-					goto IL_13C4;
+					goto IL_14B9;
 				}
 				if (stringCom == "additem")
 				{
@@ -455,23 +457,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_13C4;
+					goto IL_14B9;
 				}
 				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_13C4;
+					goto IL_14B9;
 				}
 				if (stringCom == "saveitem")
 				{
 					text5 = stringList[1];
-					goto IL_13C4;
+					goto IL_14B9;
 				}
 				if (stringCom == "category")
 				{
 					text9 = stringList[1];
-					goto IL_13C4;
+					flag2 = (text9 == "skin");
+					flag3 = (text9 == "haircolor");
+					goto IL_14B9;
 				}
 				if (stringCom == "maskitem")
 				{
@@ -479,11 +483,11 @@ public class Menu : MonoBehaviour
 					{
 						string maskslot = stringList[1];
 						body.AddMask(text9, maskslot);
-						goto IL_90A;
+						goto IL_92C;
 					}
-					goto IL_90A;
-					IL_90A:
-					goto IL_13C4;
+					goto IL_92C;
+					IL_92C:
+					goto IL_14B9;
 				}
 				if (stringCom == "delitem")
 				{
@@ -493,27 +497,27 @@ public class Menu : MonoBehaviour
 						slotname3 = stringList[1];
 					}
 					body.DelItem((MPN)Enum.Parse(typeof(MPN), text9, true), slotname3);
-					goto IL_13C4;
+					goto IL_14B9;
 				}
 				if (stringCom == "node消去")
 				{
 					body.SetVisibleNodeSlot(text9, false, stringList[1]);
-					goto IL_13C4;
+					goto IL_14B9;
 				}
 				if (stringCom == "node表示")
 				{
 					body.SetVisibleNodeSlot(text9, true, stringList[1]);
-					goto IL_13C4;
+					goto IL_14B9;
 				}
 				if (stringCom == "パーツnode消去")
 				{
 					body.SetVisibleNodeSlotParts(text9, stringList[1], false, stringList[2]);
-					goto IL_13C4;
+					goto IL_14B9;
 				}
 				if (stringCom == "パーツnode表示")
 				{
 					body.SetVisibleNodeSlotParts(text9, stringList[1], true, stringList[2]);
-					goto IL_13C4;
+					goto IL_14B9;
 				}
 				if (stringCom == "color")
 				{
@@ -522,62 +526,79 @@ 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_13C4;
+					goto IL_14B9;
 				}
 				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_13C4;
+					goto IL_14B9;
 				}
 				if (stringCom == "tex" || stringCom == "テクスチャ変更")
 				{
 					string text15 = stringList[1];
-					int matno2 = int.Parse(stringList[2]);
-					string prop_name2 = stringList[3];
+					int num4 = int.Parse(stringList[2]);
+					string text16 = stringList[3];
 					string filename = stringList[4];
 					MaidParts.PARTS_COLOR parts_COLOR = MaidParts.PARTS_COLOR.NONE;
 					if (stringList.Length == 6)
 					{
-						string text16 = stringList[5];
+						string text17 = stringList[5];
 						try
 						{
-							parts_COLOR = (MaidParts.PARTS_COLOR)Enum.Parse(typeof(MaidParts.PARTS_COLOR), text16.ToUpper());
+							parts_COLOR = (MaidParts.PARTS_COLOR)Enum.Parse(typeof(MaidParts.PARTS_COLOR), text17.ToUpper());
 						}
 						catch
 						{
-							NDebug.Assert("無限色IDがありません。" + text16, false);
+							NDebug.Assert("無限色IDがありません。" + text17, false);
 						}
 					}
 					if (mp.idx == 61)
 					{
-						matno2 = 7;
+						num4 = 7;
 					}
-					body.ChangeTex(text15, matno2, prop_name2, filename, null, parts_COLOR);
+					if (flag2 && parts_COLOR == MaidParts.PARTS_COLOR.SKIN)
+					{
+						if (text15 == "body" && num4 == 0 && text16.ToLower() == "_maintex")
+						{
+							body.ChangeShader(text15, num4, "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);
+						}
+						else if (text15 == "head" && num4 == 5 && text16.ToLower() == "_maintex")
+						{
+							body.ChangeShader(text15, num4, "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, num4, text16, filename, null, parts_COLOR);
 					if (parts_COLOR != MaidParts.PARTS_COLOR.NONE)
 					{
 						maid.Parts.SetPartsColor(parts_COLOR, maid.Parts.GetPartsColor(parts_COLOR));
 					}
-					if ((text9 == "skin" || text9 == "haircolor") && !flag)
+					if ((flag2 || flag3) && !flag)
 					{
 						body.RestoreShader(text15);
-						goto IL_BC7;
+						goto IL_CBC;
 					}
-					goto IL_BC7;
-					IL_BC7:
-					goto IL_13C4;
+					goto IL_CBC;
+					IL_CBC:
+					goto IL_14B9;
 				}
 				if (stringCom == "prop")
 				{
 					string tag2 = stringList[1];
 					string s = stringList[2];
 					maid.SetProp(tag2, int.Parse(s), false);
-					goto IL_13C4;
+					goto IL_14B9;
 				}
 				if (stringCom == "テクスチャ乗算")
 				{
-					goto IL_13C4;
+					goto IL_14B9;
 				}
 				if (stringCom == "テクスチャ合成")
 				{
@@ -588,12 +609,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_D2A;
+						goto IL_E1F;
 					}
 					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_D2A;
-					IL_D2A:
-					goto IL_13C4;
+					goto IL_E1F;
+					IL_E1F:
+					goto IL_14B9;
 				}
 				if (stringCom == "テクスチャセット合成")
 				{
@@ -602,7 +623,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_13C4;
+					goto IL_14B9;
 				}
 				if (stringCom == "マテリアル変更")
 				{
@@ -610,7 +631,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_13C4;
+					goto IL_14B9;
 				}
 				if (stringCom == "shader")
 				{
@@ -619,14 +640,14 @@ public class Menu : MonoBehaviour
 					string f_strShaderFileName = stringList[3];
 					body.ChangeShader(f_strSlotName2, f_nMatNo2, f_strShaderFileName);
 					flag = true;
-					goto IL_13C4;
+					goto IL_14B9;
 				}
 				if (stringCom == "アタッチポイントの設定")
 				{
 					if (stringList.Length < 5)
 					{
 						Debug.LogError("アタッチポイントの設定引数の数が不正です。 " + text7 + " " + text3);
-						goto IL_EED;
+						goto IL_FE2;
 					}
 					Vector3 v = new Vector3(float.Parse(stringList[2]), float.Parse(stringList[3]), float.Parse(stringList[4]));
 					Quaternion q = Quaternion.identity;
@@ -639,27 +660,27 @@ public class Menu : MonoBehaviour
 						Debug.LogError("アタッチポイントの設定引数に角度指定がありません。 " + text7 + "  " + text3);
 					}
 					body.SetAttachPoint(slotname, stringList[1], v, q, f_bTemp);
-					goto IL_EED;
-					IL_EED:
-					goto IL_13C4;
+					goto IL_FE2;
+					IL_FE2:
+					goto IL_14B9;
 				}
 				if (stringCom == "blendset")
 				{
 					string blendSetName = stringList[1];
-					int num4 = (stringList.Length - 2) / 2;
+					int num5 = (stringList.Length - 2) / 2;
 					body.Face.morph.NewBlendSet(blendSetName);
-					for (int j = 0; j < num4; j++)
+					for (int j = 0; j < num5; j++)
 					{
 						string tag3 = stringList[2 + j * 2].ToLower();
 						float val2 = float.Parse(stringList[3 + j * 2]);
 						body.Face.morph.SetValueBlendSet(blendSetName, tag3, val2);
 					}
-					goto IL_13C4;
+					goto IL_14B9;
 				}
 				if (stringCom == "paramset")
 				{
 					body.Face.NewParamSet(text7);
-					goto IL_13C4;
+					goto IL_14B9;
 				}
 				if (stringCom == "commenttype")
 				{
@@ -668,18 +689,18 @@ public class Menu : MonoBehaviour
 						maid.status.partsDic.Add(stringList[1], string.Empty);
 					}
 					maid.status.partsDic[stringList[1]] = stringList[2];
-					goto IL_13C4;
+					goto IL_14B9;
 				}
 				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_1045;
+						goto IL_113A;
 					}
-					goto IL_1045;
-					IL_1045:
-					goto IL_13C4;
+					goto IL_113A;
+					IL_113A:
+					goto IL_14B9;
 				}
 				if (stringCom == "bonemorph")
 				{
@@ -690,43 +711,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_120B;
+						goto IL_1300;
 					}
-					string text17 = stringList[1].ToLower();
+					string text18 = 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 (text17 != null)
+					if (text18 != null)
 					{
-						if (text17 == "pos")
+						if (text18 == "pos")
 						{
 							body.bonemorph.ChangeMorphPosValue(strPropName, f_strBoneName, f_fAddMin, f_fAddMax);
-							goto IL_120B;
+							goto IL_1300;
 						}
-						if (text17 == "rot")
+						if (text18 == "rot")
 						{
 							body.bonemorph.ChangeMorphRotatioValue(strPropName, f_strBoneName, f_fAddMin, f_fAddMax);
-							goto IL_120B;
+							goto IL_1300;
 						}
-						if (text17 == "scl")
+						if (text18 == "scl")
 						{
 							body.bonemorph.ChangeMorphSclValue(strPropName, f_strBoneName, f_fAddMin, f_fAddMax);
-							goto IL_120B;
+							goto IL_1300;
 						}
 					}
 					Debug.LogError(string.Concat(new string[]
 					{
 						"BoneMorpのタイプ指定が不正です[",
-						text17,
+						text18,
 						"]\n",
 						text7,
 						" ",
 						text3
 					}));
-					goto IL_120B;
-					IL_120B:
-					goto IL_13C4;
+					goto IL_1300;
+					IL_1300:
+					goto IL_14B9;
 				}
 				if (stringCom == "length")
 				{
@@ -735,7 +756,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_13C4;
+					goto IL_14B9;
 				}
 				if (stringCom == "anime")
 				{
@@ -751,7 +772,7 @@ public class Menu : MonoBehaviour
 						f_bLoop = (stringList[3] == "loop");
 					}
 					body.ItemAnimationPlay(f_slot, stringList[2], f_bLoop);
-					goto IL_13C4;
+					goto IL_14B9;
 				}
 				if (stringCom == "param2")
 				{
@@ -759,23 +780,23 @@ public class Menu : MonoBehaviour
 					{
 						string slotname4 = stringList[1];
 						body.GetSlot(slotname4).SetParam2(stringList[2], stringList[3]);
-						goto IL_137E;
+						goto IL_1473;
 					}
 					Debug.LogError("param2の設定引数の数が不正です。 " + text7 + " " + text3);
-					goto IL_137E;
-					IL_137E:
-					goto IL_13C4;
+					goto IL_1473;
+					IL_1473:
+					goto IL_14B9;
 				}
 				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_13C4;
+					goto IL_14B9;
 				}
-				goto IL_13C4;
-				IL_13C4:
-				goto IL_1447;
+				goto IL_14B9;
+				IL_14B9:
+				goto IL_153C;
 			}
 			catch (Exception ex)
 			{
@@ -793,10 +814,10 @@ public class Menu : MonoBehaviour
 					ex.StackTrace
 				}));
 				NDebug.Assert("メニューファイル処理中にエラーが発生しました。" + Path.GetFileName(text), true);
-				goto IL_1447;
+				goto IL_153C;
 			}
-			IL_1447:
-			goto IL_102;
+			IL_153C:
+			goto IL_108;
 		}
 		list.Sort((Menu.LastParam a, Menu.LastParam b) => a.nOrder - a.nOrder);
 		for (int k = 0; k < list.Count; k++)
@@ -886,7 +907,7 @@ public class Menu : MonoBehaviour
 			Directory.CreateDirectory(text);
 		}
 		StreamWriter streamWriter = new StreamWriter(text + "\\" + text2 + ".txt", false, Encoding.UTF8);
-		streamWriter.WriteLine("出力バージョン\t" + 1240);
+		streamWriter.WriteLine("出力バージョン\t" + 1250);
 		streamWriter.WriteLine("基本アイテム\t" + filename.Replace(" ", ":"));
 		try
 		{
@@ -1249,6 +1270,19 @@ public class Menu : MonoBehaviour
 
 	private static void ProcModScriptBin(Maid maid, byte[] cd, string filename, bool f_bTemp = false)
 	{
+		Menu.ProcModScriptBin(maid, cd, filename, null, f_bTemp);
+	}
+
+	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))
+		{
+			TBodySkin slot = maid.body0.GetSlot(1);
+			if (slot.PartsVersion < 110)
+			{
+				return;
+			}
+		}
 		BinaryReader binaryReader = new BinaryReader(new MemoryStream(cd), Encoding.UTF8);
 		string text = binaryReader.ReadString();
 		NDebug.Assert(text == "CM3D2_MOD", "ProcModScriptBin 例外 : ヘッダーファイルが不正です。" + text);
@@ -1289,12 +1323,12 @@ public class Menu : MonoBehaviour
 		{
 			Menu.IMode mode = Menu.IMode.Non;
 			string slotname = string.Empty;
-			int num3 = 0;
 			TBodySkin tbodySkin = null;
 			Material material = null;
 			string text9;
 			while ((text9 = stringReader.ReadLine()) != null)
 			{
+				int num3 = 0;
 				string[] array = text9.Split(new char[]
 				{
 					'\t',
@@ -1369,7 +1403,12 @@ public class Menu : MonoBehaviour
 							NDebug.Assert("無限色IDがありません。" + text10, false);
 						}
 					}
-					maid.body0.ChangeTex(array[1], int.Parse(array[2]), array[3], array[4].ToLower(), dictionary, parts_COLOR);
+					num3 = int.Parse(array[2]);
+					if (mp != null && mp.idx == 61)
+					{
+						num3 = 7;
+					}
+					maid.body0.ChangeTex(array[1], num3, array[3], array[4].ToLower(), dictionary, parts_COLOR);
 					if (parts_COLOR != MaidParts.PARTS_COLOR.NONE)
 					{
 						maid.Parts.SetPartsColor(parts_COLOR, maid.Parts.GetPartsColor(parts_COLOR));

+ 13 - 3
Assembly-CSharp/MessageClass.cs

@@ -111,13 +111,23 @@ public class MessageClass
 		return text2;
 	}
 
-	public void SetText(string name, string text, string voice_file, int voice_pitch)
+	public void SetText(string name, string text, string voice_file, int voice_pitch, AudioSourceMgr.Type type)
 	{
 		this.exit_wait_count_ = -1;
 		this.hitret_sprite_.alpha = 0f;
 		this.charaNameText = name;
-		this.mainTextAnimation.StartAnimation(MessageClass.GetWrapString(this.message_label_, text));
-		this.message_mgr_.AddBackLog(name, this.mainTextAnimation.text, voice_file, voice_pitch);
+		if (!GameUty.supportMultiLanguage)
+		{
+			this.mainTextAnimation.StartAnimation(MessageClass.GetWrapString(this.message_label_, text));
+			this.message_mgr_.AddBackLog(name, this.mainTextAnimation.text, voice_file, voice_pitch, type);
+		}
+		else
+		{
+			KeyValuePair<string, string> translationText = MessageClass.GetTranslationText(text);
+			this.mainTextAnimation.StartAnimation(translationText.Key);
+			this.subTextAnimation.StartAnimation(translationText.Value);
+			this.message_mgr_.AddBackLog(name, this.mainTextAnimation.text, this.subTextAnimation.text, voice_file, voice_pitch, type);
+		}
 		this.Update();
 	}
 

+ 11 - 6
Assembly-CSharp/MessageWindowMgr.cs

@@ -227,7 +227,7 @@ public class MessageWindowMgr : BaseMgr<MessageWindowMgr>
 			if (!string.IsNullOrEmpty(this.current_voice_file_))
 			{
 				GameMain.Instance.SoundMgr.VoiceStopAll();
-				GameMain.Instance.SoundMgr.PlayDummyVoice(this.current_voice_file_, 0f, false, false, this.current_voice_pitch_);
+				GameMain.Instance.SoundMgr.PlayDummyVoice(this.current_voice_file_, 0f, false, false, this.current_voice_pitch_, this.sound_type_);
 			}
 			break;
 		case MessageWindowMgr.MessageWindowUnderButton.BackLog:
@@ -314,12 +314,12 @@ public class MessageWindowMgr : BaseMgr<MessageWindowMgr>
 		this.m_goMessageWindowPanel.SetActive(true);
 	}
 
-	public void AddBackLog(string name, string text, string voice_file, int pitch)
+	public void AddBackLog(string name, string text, string voice_file, int pitch, AudioSourceMgr.Type type)
 	{
-		this.AddBackLog(name, text, string.Empty, voice_file, pitch);
+		this.AddBackLog(name, text, string.Empty, voice_file, pitch, type);
 	}
 
-	public void AddBackLog(string name, string text, string subtitle_text, string voice_file, int pitch)
+	public void AddBackLog(string name, string text, string subtitle_text, string voice_file, int pitch, AudioSourceMgr.Type type)
 	{
 		BacklogCtrl.BacklogUnit backlogUnit = new BacklogCtrl.BacklogUnit();
 		backlogUnit.m_speakerName = name;
@@ -327,6 +327,7 @@ public class MessageWindowMgr : BaseMgr<MessageWindowMgr>
 		backlogUnit.m_subtitlemsg = subtitle_text;
 		backlogUnit.m_voiceId = voice_file;
 		backlogUnit.m_voicePitch = pitch;
+		backlogUnit.m_voiceType = type;
 		this.m_listBacklogUnit.Add(backlogUnit);
 		if (30 < this.m_listBacklogUnit.Count)
 		{
@@ -334,15 +335,16 @@ public class MessageWindowMgr : BaseMgr<MessageWindowMgr>
 		}
 	}
 
-	public void SetText(string name, string text, string voice_file, int voice_pitch)
+	public void SetText(string name, string text, string voice_file, int voice_pitch, AudioSourceMgr.Type sound_type)
 	{
 		if (this.m_bForceDisable)
 		{
 			return;
 		}
-		this.message_.SetText(name, text, voice_file, voice_pitch);
+		this.message_.SetText(name, text, voice_file, voice_pitch, sound_type);
 		this.current_voice_file_ = voice_file;
 		this.current_voice_pitch_ = voice_pitch;
+		this.sound_type_ = sound_type;
 		this.m_dicButtonGameObject[MessageWindowMgr.MessageWindowUnderButton.Voice].enabled = !string.IsNullOrEmpty(this.current_voice_file_);
 	}
 
@@ -350,6 +352,7 @@ public class MessageWindowMgr : BaseMgr<MessageWindowMgr>
 	{
 		this.current_voice_file_ = string.Empty;
 		this.current_voice_pitch_ = 50;
+		this.sound_type_ = AudioSourceMgr.Type.Voice;
 		this.message_.Clear();
 		this.m_dicButtonGameObject[MessageWindowMgr.MessageWindowUnderButton.Voice].enabled = false;
 	}
@@ -404,6 +407,8 @@ public class MessageWindowMgr : BaseMgr<MessageWindowMgr>
 
 	private int current_voice_pitch_ = 50;
 
+	private AudioSourceMgr.Type sound_type_ = AudioSourceMgr.Type.Voice;
+
 	private bool backup_camera_control_;
 
 	public delegate void OnClickEvent();

+ 1 - 1
Assembly-CSharp/Misc.cs

@@ -2,7 +2,7 @@
 
 public class Misc
 {
-	public const int GAME_VERSION = 1240;
+	public const int GAME_VERSION = 1250;
 
 	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(1240);
+		binaryWriter.Write(1250);
 		string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(f_strMqoFile);
 		binaryWriter.Write(fileNameWithoutExtension);
 		binaryWriter.Write(exObjIn2.strName);

+ 4 - 0
Assembly-CSharp/OnaholeMotion.cs

@@ -40,6 +40,10 @@ public class OnaholeMotion : MonoBehaviour
 		}
 	}
 
+	private string targetMaidGUID { get; set; }
+
+	private string targetManGUID { get; set; }
+
 	public static readonly string[] animeTypeNameArray = new string[]
 	{
 		"NON",

+ 2 - 2
Assembly-CSharp/OvrIK.cs

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

+ 5 - 5
Assembly-CSharp/PhotoManEditManager.cs

@@ -20,7 +20,7 @@ public class PhotoManEditManager
 					SceneEdit.SMenuItem smenuItem = new SceneEdit.SMenuItem();
 					if (SceneEdit.GetMenuItemSetUP(smenuItem, text, true))
 					{
-						if (!(smenuItem.m_texIcon == null) && smenuItem.m_bMan)
+						if (!(smenuItem.m_texIconRef == null) && smenuItem.m_bMan)
 						{
 							if (!PhotoManEditManager.menu_file_name_list_.Contains(text))
 							{
@@ -70,13 +70,13 @@ public class PhotoManEditManager
 		{
 			foreach (SceneEdit.SMenuItem smenuItem in list)
 			{
-				if (smenuItem.m_texIcon != null)
+				if (smenuItem.m_texIconRef != null)
 				{
-					UnityEngine.Object.Destroy(smenuItem.m_texIcon);
+					UnityEngine.Object.Destroy(smenuItem.m_texIconRef);
 				}
-				if (smenuItem.m_texIconRandomColor != null)
+				if (smenuItem.m_texIconRandomColorRef != null)
 				{
-					UnityEngine.Object.Destroy(smenuItem.m_texIconRandomColor);
+					UnityEngine.Object.Destroy(smenuItem.m_texIconRandomColorRef);
 				}
 			}
 			list.Clear();

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

+ 1 - 1
Assembly-CSharp/PhotoMotionData.cs

@@ -317,7 +317,7 @@ public class PhotoMotionData
 					break;
 				}
 			}
-			GameMain.Instance.ScriptMgr.LoadMotionScript(sloat, false, this.call_script_fil, this.call_script_label, maid.status.guid, string.Empty, true, true);
+			GameMain.Instance.ScriptMgr.LoadMotionScript(sloat, false, this.call_script_fil, this.call_script_label, maid.status.guid, string.Empty, true, true, false);
 		}
 	}
 

+ 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(1240);
+			binary.Write(1250);
 			binary.Write(this.playerName_);
 			binary.Write(this.days_);
 			binary.Write(this.totalPurchasePrice_);

+ 5 - 1
Assembly-CSharp/PresetButtonCtrl.cs

@@ -112,7 +112,7 @@ public class PresetButtonCtrl : MonoBehaviour
 		{
 			EventDelegate.Add(component4.onClick, new EventDelegate.Callback(this.m_sceneEdit.CallHowToNameDialog));
 		}
-		if (this.m_sceneEdit.modeType == SceneEdit.ModeType.OriginalChara || this.m_sceneEdit.modeType == SceneEdit.ModeType.MainChara || this.m_sceneEdit.modeType == SceneEdit.ModeType.CostumeEdit || maid.status.heroineType == HeroineType.Sub)
+		if (this.m_sceneEdit.modeType == SceneEdit.ModeType.OriginalChara || this.m_sceneEdit.modeType == SceneEdit.ModeType.MainChara || this.m_sceneEdit.modeType == SceneEdit.ModeType.CostumeEdit || maid.status.heroineType == HeroineType.Sub || maid.boNPC)
 		{
 			component4.gameObject.SetActive(false);
 		}
@@ -131,6 +131,10 @@ public class PresetButtonCtrl : MonoBehaviour
 			UTY.GetChildObject(this.m_goPresetButtonPanel, "WindowVoice/Button", false).GetComponent<UIButton>().isEnabled = false;
 			UTY.GetChildObject(this.m_goPresetButtonPanel, "WindowPresetSave/Button", false).GetComponent<UIButton>().isEnabled = false;
 		}
+		if (maid.boNPC)
+		{
+			UTY.GetChildObject(this.m_goPresetButtonPanel, "WindowVoice/Button", false).GetComponent<UIButton>().isEnabled = false;
+		}
 	}
 
 	public void CreateItemPresetsViewer(string type, string clickBtnName, string prevActiveBtnName)

+ 1 - 1
Assembly-CSharp/RandomPresetContent.cs

@@ -297,7 +297,7 @@ public class RandomPresetContent
 	{
 		SceneEdit component = GameObject.Find("__SceneEdit__").GetComponent<SceneEdit>();
 		List<SceneEdit.SCategory> categoryList = component.CategoryList;
-		Texture2D texIcon = categoryList[1].m_listPartsType[0].m_listMenu[0].m_texIcon;
+		Texture2D texIconRef = categoryList[1].m_listPartsType[0].m_listMenu[0].m_texIconRef;
 	}
 
 	public static Dictionary<int, RandomPresetContent.RandomBaseGroup> m_dicRandomBaseGroup;

+ 4 - 4
Assembly-CSharp/RandomPresetCtrl.cs

@@ -173,9 +173,9 @@ public class RandomPresetCtrl : MonoBehaviour
 							{
 								if (smenuItem.m_boDelOnly)
 								{
-									return smenuItem.m_texIcon;
+									return smenuItem.m_texIconRef;
 								}
-								return smenuItem.m_texIcon;
+								return smenuItem.m_texIconRef;
 							}
 						}
 						return this.m_notSettingIcon;
@@ -210,7 +210,7 @@ public class RandomPresetCtrl : MonoBehaviour
 										{
 											return this.m_notSettingIcon;
 										}
-										return smenuItem2.m_texIconRandomColor;
+										return smenuItem2.m_texIconRandomColorRef;
 									}
 									else
 									{
@@ -493,7 +493,7 @@ public class RandomPresetCtrl : MonoBehaviour
 		SceneEdit.SMenuItem menuItemByDelOnly = this.GetMenuItemByDelOnly(eMenuCategory, btnMpn);
 		if (menuItemByDelOnly != null)
 		{
-			return menuItemByDelOnly.m_texIcon;
+			return menuItemByDelOnly.m_texIconRef;
 		}
 		return this.m_notSettingIcon;
 	}

+ 0 - 6
Assembly-CSharp/ScenarioData.cs

@@ -727,12 +727,6 @@ public class ScenarioData
 		this.IsOncePlayed = false;
 	}
 
-	public static bool IsMainPersonal(Maid maid)
-	{
-		string convertPersonal = GameMain.Instance.ScenarioSelectMgr.GetConvertPersonal(maid);
-		return ScenarioData.m_MainMaidList.Contains(convertPersonal);
-	}
-
 	private static string[] m_MainMaidList = new string[]
 	{
 		"無垢",

+ 1 - 1
Assembly-CSharp/SceneCasino.cs

@@ -162,7 +162,7 @@ public class SceneCasino : KasaSceneMgr<SceneCasino>
 		CasinoDataMgr.Instance.DealerMaid.FaceAnime("通常", 1f, 0);
 		CasinoDataMgr.Instance.DealerMaid.AudioMan.Stop();
 		GameMain.Instance.ScriptMgr.is_motion_blend = false;
-		GameMain.Instance.ScriptMgr.LoadMotionScript(0, false, "h_kaiwa_tati_001.ks", "*会話立ち待機", string.Empty, string.Empty, false, true);
+		GameMain.Instance.ScriptMgr.LoadMotionScript(0, false, "h_kaiwa_tati_001.ks", "*会話立ち待機", string.Empty, string.Empty, false, true, false);
 		GameMain.Instance.CharacterMgr.CharaAllOfsetPos(this.m_MaidPos);
 		GameMain.Instance.CharacterMgr.CharaAllOfsetRot(this.m_MaidAngle);
 		base.LoadEnd();

+ 1 - 1
Assembly-CSharp/SceneCasinoShop.cs

@@ -92,7 +92,7 @@ public class SceneCasinoShop : KasaSceneMgr<SceneCasinoShop>
 
 	protected override void LoadEnd()
 	{
-		GameMain.Instance.ScriptMgr.LoadMotionScript(0, false, "h_kaiwa_tati_001.ks", "*会話立ち待機", string.Empty, string.Empty, false, true);
+		GameMain.Instance.ScriptMgr.LoadMotionScript(0, false, "h_kaiwa_tati_001.ks", "*会話立ち待機", string.Empty, string.Empty, false, true, false);
 		base.StartCoroutine(this.AnimateWait());
 	}
 

+ 2 - 1
Assembly-CSharp/SceneCharacterSelect.cs

@@ -241,6 +241,7 @@ public class SceneCharacterSelect : WfScreenManager
 		Additional,
 		NewYotogi,
 		NewYotogiAdditional,
-		LifeMode
+		LifeMode,
+		LifeModeRecollection
 	}
 }

+ 61 - 25
Assembly-CSharp/SceneEdit.cs

@@ -9,6 +9,7 @@ using I2.Loc;
 using Kasizuki;
 using MaidStatus;
 using SceneEditWindow;
+using SceneNPCEdit;
 using UnityEngine;
 using wf;
 
@@ -32,6 +33,8 @@ public class SceneEdit : MonoBehaviour
 
 	public CustomPartsWindow customPartsWindow { get; private set; }
 
+	public EditItemTextureCache editItemTextureCache { get; private set; }
+
 	public SceneEdit.ModeType modeType { get; private set; }
 
 	public int maidPoint { get; set; }
@@ -147,6 +150,7 @@ public class SceneEdit : MonoBehaviour
 	public void Awake()
 	{
 		this.m_cameraMoveSupport = base.gameObject.AddComponent<WfCameraMoveSupport>();
+		this.editItemTextureCache = base.gameObject.AddComponent<EditItemTextureCache>();
 		SceneEdit.Instance = this;
 		this.modeType = SceneEdit.ModeType.OriginalChara;
 		this.enabledMpns = new HashSet<MPN>();
@@ -180,6 +184,11 @@ public class SceneEdit : MonoBehaviour
 				this.modeType = SceneEdit.ModeType.CostumeEdit;
 				flag = true;
 			}
+			else if (tag_backup.TryGetValue("npcedit", out strScriptArg))
+			{
+				this.modeType = SceneEdit.ModeType.NpcEdit;
+				flag = true;
+			}
 			if (!flag)
 			{
 				NDebug.Assert("エディットシーンのモード指定がありませんでした。次のうち必ず一つは指定してください[original|main|after|costume]", false);
@@ -611,7 +620,7 @@ public class SceneEdit : MonoBehaviour
 						ex.StackTrace
 					}));
 				}
-				if (!mi.m_bMan && !(mi.m_texIcon == null))
+				if (!mi.m_bMan && this.editItemTextureCache.IsRegister(mi.m_nMenuFileRID))
 				{
 					this.AddMenuItemToList(mi);
 					menuList.Add(mi);
@@ -648,7 +657,7 @@ public class SceneEdit : MonoBehaviour
 			SceneEdit.SMenuItem mi2 = new SceneEdit.SMenuItem();
 			if (SceneEdit.GetMenuItemSetUP(mi2, strFileName, false))
 			{
-				if (!mi2.m_bMan && !(mi2.m_texIcon == null))
+				if (!mi2.m_bMan && !(mi2.m_texIconRef == null))
 				{
 					this.AddMenuItemToList(mi2);
 					menuList.Add(mi2);
@@ -702,7 +711,7 @@ public class SceneEdit : MonoBehaviour
 					SceneEdit.SMenuItem mi = new SceneEdit.SMenuItem();
 					if (SceneEdit.GetMenuItemSetUP(mi, strFileName, false))
 					{
-						if (!mi.m_bMan && !(mi.m_texIcon == null))
+						if (!mi.m_bMan && !(mi.m_texIconRef == null))
 						{
 							this.AddMenuItemToList(mi);
 							menuList.Add(mi);
@@ -897,7 +906,7 @@ public class SceneEdit : MonoBehaviour
 				this.m_listCategory.Find((SceneEdit.SCategory c) => c.m_eCategory == cate).m_isEnabled = false;
 			}
 		}
-		else if (this.maid.status.heroineType == HeroineType.Sub)
+		else if (this.maid.status.heroineType == HeroineType.Sub || this.maid.boNPC)
 		{
 			SceneEditInfo.EMenuCategory[] array3 = new SceneEditInfo.EMenuCategory[]
 			{
@@ -952,16 +961,22 @@ public class SceneEdit : MonoBehaviour
 		mi.m_bMan = menuDataBase.GetIsMan();
 		mi.m_bOld = (menuDataBase.GetVersion() < 2000);
 		string iconS = menuDataBase.GetIconS();
-		if (!string.IsNullOrEmpty(iconS))
+		if (!string.IsNullOrEmpty(iconS) && GameUty.FileSystem.IsExistentFile(iconS))
 		{
-			try
+			if (SceneEdit.Instance != null)
 			{
-				mi.m_texIcon = ImportCM.CreateTexture(iconS);
-				mi.m_texIconRandomColor = mi.m_texIcon;
+				SceneEdit.Instance.editItemTextureCache.PreLoadRegister(mi.m_nMenuFileRID, iconS);
 			}
-			catch (Exception)
+			else
 			{
-				Debug.LogError("Error:");
+				try
+				{
+					mi.m_texIcon = ImportCM.CreateTexture(iconS);
+				}
+				catch (Exception)
+				{
+					Debug.LogError("Error:");
+				}
 			}
 		}
 	}
@@ -1087,7 +1102,6 @@ public class SceneEdit : MonoBehaviour
 			byte[] data = dictionary[text2];
 			mi.m_texIcon = new Texture2D(1, 1, TextureFormat.RGBA32, false);
 			mi.m_texIcon.LoadImage(data);
-			mi.m_texIconRandomColor = mi.m_texIcon;
 		}
 		mi.m_fPriority = 999f;
 		using (StringReader stringReader = new StringReader(s))
@@ -1392,7 +1406,6 @@ public class SceneEdit : MonoBehaviour
 			try
 			{
 				mi.m_texIcon = ImportCM.CreateTexture(text5);
-				mi.m_texIconRandomColor = mi.m_texIcon;
 			}
 			catch (Exception)
 			{
@@ -2414,7 +2427,7 @@ public class SceneEdit : MonoBehaviour
 		ButtonEdit componentInChildren = UIEventTrigger.current.GetComponentInChildren<ButtonEdit>();
 		SceneEdit.SMenuItem menuItem = componentInChildren.m_MenuItem;
 		Vector3 position = UIEventTrigger.current.transform.parent.position;
-		this.m_info.Open(position, menuItem.m_texIcon, menuItem.menuNameCurrentLanguage, menuItem.infoTextCurrentLanguage, 0);
+		this.m_info.Open(position, menuItem.m_texIconRef, menuItem.menuNameCurrentLanguage, menuItem.infoTextCurrentLanguage, 0);
 	}
 
 	public void HoverOverCallbackOnGroup()
@@ -2422,7 +2435,7 @@ public class SceneEdit : MonoBehaviour
 		ButtonEdit componentInChildren = UIEventTrigger.current.GetComponentInChildren<ButtonEdit>();
 		SceneEdit.SMenuItem menuItem = componentInChildren.m_MenuItem;
 		Vector3 position = UIEventTrigger.current.transform.parent.position;
-		this.m_info.Open(position, menuItem.m_texIcon, menuItem.menuNameCurrentLanguage, menuItem.infoTextCurrentLanguage, (menuItem.m_listMember == null) ? 0 : menuItem.m_listMember.Count);
+		this.m_info.Open(position, menuItem.m_texIconRef, menuItem.menuNameCurrentLanguage, menuItem.infoTextCurrentLanguage, (menuItem.m_listMember == null) ? 0 : menuItem.m_listMember.Count);
 	}
 
 	public void HoverOutCallback()
@@ -2745,7 +2758,7 @@ public class SceneEdit : MonoBehaviour
 
 	private IEnumerator CoWaitPutCloth()
 	{
-		if (this.modeType == SceneEdit.ModeType.CostumeEdit)
+		if (this.modeType == SceneEdit.ModeType.CostumeEdit || this.modeType == SceneEdit.ModeType.NpcEdit)
 		{
 			while (GameMain.Instance.CharacterMgr.IsBusy())
 			{
@@ -2761,6 +2774,14 @@ public class SceneEdit : MonoBehaviour
 		{
 			this.m_maid.ThumShotCustom(GameMain.Instance.FacilityMgr.tempSelectFacility.GetFacilityEditCostumeThumbnailName(), true);
 		}
+		else if (this.modeType == SceneEdit.ModeType.NpcEdit)
+		{
+			byte[] data = GameMain.Instance.CharacterMgr.PresetSaveNotWriteFile(this.m_maid, CharacterMgr.PresetType.All);
+			if (NPCCharaSelect.editTargetNPCData != null)
+			{
+				SaveData.SetPreset(NPCCharaSelect.editTargetNPCData.id, data);
+			}
+		}
 		else
 		{
 			this.m_maid.ThumShot();
@@ -2785,7 +2806,7 @@ public class SceneEdit : MonoBehaviour
 	private void CreateKasizukiThumShot()
 	{
 		GameMain.Instance.MainCamera.SetTargetOffset(Vector3.zero, false);
-		if (this.modeType == SceneEdit.ModeType.CostumeEdit)
+		if (this.modeType == SceneEdit.ModeType.CostumeEdit || this.modeType == SceneEdit.ModeType.NpcEdit)
 		{
 			this.OnEndScene();
 			return;
@@ -3288,7 +3309,8 @@ public class SceneEdit : MonoBehaviour
 		OriginalChara,
 		MainChara,
 		AfterEdit,
-		CostumeEdit
+		CostumeEdit,
+		NpcEdit
 	}
 
 	private enum TouchType
@@ -3318,12 +3340,26 @@ public class SceneEdit : MonoBehaviour
 			}
 		}
 
+		public Texture2D m_texIconRef
+		{
+			get
+			{
+				return (!(this.m_texIcon != null) && !(SceneEdit.Instance == null)) ? SceneEdit.Instance.editItemTextureCache.GetTexter(this.m_nMenuFileRID) : this.m_texIcon;
+			}
+		}
+
+		public Texture2D m_texIconRandomColorRef
+		{
+			get
+			{
+				return this.m_texIconRef;
+			}
+		}
+
 		public void Dispose()
 		{
 			UnityEngine.Object.DestroyImmediate(this.m_goButton);
 			UnityEngine.Object.DestroyImmediate(this.m_texIcon);
-			UnityEngine.Object.DestroyImmediate(this.m_texIconRandomColor);
-			this.m_texIcon = null;
 		}
 
 		public void SortColorItem()
@@ -3636,16 +3672,16 @@ public class SceneEdit : MonoBehaviour
 			this.goOld.SetActive(f_mi.m_bOld);
 			this.gcBtn = this.goItem.GetComponentsInChildren<UIButton>(true)[0];
 			this.gcEvent = this.goItem.GetComponentsInChildren<UIEventTrigger>(true)[0];
-			if (f_mi.m_texIcon != null)
+			if (f_mi.m_texIconRef != null)
 			{
-				Sprite normalSprite2D = Sprite.Create(f_mi.m_texIcon, new Rect(0f, 0f, (float)f_mi.m_texIcon.width, (float)f_mi.m_texIcon.height), default(Vector2));
+				Sprite normalSprite2D = Sprite.Create(f_mi.m_texIconRef, new Rect(0f, 0f, (float)f_mi.m_texIconRef.width, (float)f_mi.m_texIconRef.height), default(Vector2));
 				this.gcBtn.normalSprite2D = normalSprite2D;
 			}
 		}
 
 		public void ToSmall()
 		{
-			if (this.gcBtnEdit.m_MenuItem.m_texIcon.width == 138 && this.gcBtnEdit.m_MenuItem.m_texIcon.height == 200)
+			if (this.gcBtnEdit.m_MenuItem.m_texIconRef.width == 138 && this.gcBtnEdit.m_MenuItem.m_texIconRef.height == 200)
 			{
 				this.gcBtn.GetComponent<UI2DSprite>().SetDimensions(80, 116);
 				this.gcBtn.GetComponent<BoxCollider>().size = new Vector3(80f, 116f, 0f);
@@ -3698,10 +3734,10 @@ public class SceneEdit : MonoBehaviour
 			this.gcBtnEdit.m_MenuItem = f_mi;
 			this.gcBtn = this.goItem.GetComponentsInChildren<UIButton>(true)[0];
 			this.gcEvent = this.goItem.GetComponentsInChildren<UIEventTrigger>(true)[0];
-			NDebug.Assert(f_mi.m_texIcon != null, "アイコンテクスチャがありません。" + f_mi.m_strMenuFileName);
-			if (f_mi.m_texIcon != null)
+			NDebug.Assert(f_mi.m_texIconRef != null, "アイコンテクスチャがありません。" + f_mi.m_strMenuFileName);
+			if (f_mi.m_texIconRef != null)
 			{
-				Sprite normalSprite2D = Sprite.Create(f_mi.m_texIcon, new Rect(0f, 0f, (float)f_mi.m_texIcon.width, (float)f_mi.m_texIcon.height), default(Vector2));
+				Sprite normalSprite2D = Sprite.Create(f_mi.m_texIconRef, new Rect(0f, 0f, (float)f_mi.m_texIconRef.width, (float)f_mi.m_texIconRef.height), default(Vector2));
 				this.gcBtn.normalSprite2D = normalSprite2D;
 			}
 		}

+ 4 - 4
Assembly-CSharp/SceneEditWindow/CustomViewItem.cs

@@ -60,7 +60,7 @@ namespace SceneEditWindow
 				flag = true;
 				this.settingRid = num;
 				SceneEdit.SMenuItem smenuItem = (!flag2) ? null : this.GetMenuItem(maid, this.mpn);
-				if (smenuItem == null || (smenuItem.m_boDelOnly && this.defaultIconTexture != null) || (smenuItem.m_texIcon == null && this.defaultIconTexture != null))
+				if (smenuItem == null || (smenuItem.m_boDelOnly && this.defaultIconTexture != null) || (smenuItem.m_texIconRef == null && this.defaultIconTexture != null))
 				{
 					this.iconTex.mainTexture = this.defaultIconTexture;
 					this.button.tweenTarget = null;
@@ -71,9 +71,9 @@ namespace SceneEditWindow
 						component.from = (component.to = this.iconTex.color);
 					}
 				}
-				else if (smenuItem.m_texIcon)
+				else if (smenuItem.m_texIconRef)
 				{
-					this.iconTex.mainTexture = smenuItem.m_texIcon;
+					this.iconTex.mainTexture = smenuItem.m_texIconRef;
 					this.button.tweenTarget = this.buttonTweenTarget;
 					this.iconTex.color = Color.white;
 					TweenColor component2 = base.GetComponent<TweenColor>();
@@ -95,7 +95,7 @@ namespace SceneEditWindow
 			else if (!flag)
 			{
 				SceneEdit.SMenuItem smenuItem2 = (!flag2) ? null : this.GetMenuItem(maid, this.mpn);
-				if (smenuItem2 == null || (smenuItem2.m_boDelOnly && this.defaultIconTexture != null) || (smenuItem2.m_texIcon == null && this.defaultIconTexture != null))
+				if (smenuItem2 == null || (smenuItem2.m_boDelOnly && this.defaultIconTexture != null) || (smenuItem2.m_texIconRef == null && this.defaultIconTexture != null))
 				{
 					this.iconTex.color = new Color(1f, 1f, 1f, 0.58f);
 				}

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

@@ -62,7 +62,6 @@ namespace SceneEditWindow
 					}
 				}
 			}
-			bool flag = hashSet.Contains(MPN.eyewhite);
 			foreach (CustomViewItemData.ItemData itemData in CustomViewItemData.itemList)
 			{
 				if (hashSet.Contains(itemData.mpn) && (!itemData.requestNewFace || PluginData.IsEnabled("GP001")))

+ 1 - 1
Assembly-CSharp/SceneEditWindow/PoseIconData.cs

@@ -147,7 +147,7 @@ namespace SceneEditWindow
 					scriptMgr.compatibilityMode = true;
 				}
 				scriptMgr.is_motion_blend = false;
-				scriptMgr.LoadMotionScript(0, false, this.callScriptFileName, this.callLabelName, string.Empty, string.Empty, false, true);
+				scriptMgr.LoadMotionScript(0, false, this.callScriptFileName, this.callLabelName, string.Empty, string.Empty, false, true, false);
 				scriptMgr.is_motion_blend = true;
 				if (scriptMgr.compatibilityMode)
 				{

+ 63 - 3
Assembly-CSharp/SceneFreeModeSelectManager.cs

@@ -29,14 +29,23 @@ public class SceneFreeModeSelectManager : WfScreenManager
 			NDebug.Assert(this.adv_kag_.tag_backup.ContainsKey("scene_label_vip"), "SceneFreeModeSelectManagerにscene_label_everydayの設定がされていませんでした");
 			NDebug.Assert(this.adv_kag_.tag_backup.ContainsKey("yotogi_label"), "SceneFreeModeSelectManagerにyotogi_labelの設定がされていませんでした");
 			NDebug.Assert(this.adv_kag_.tag_backup.ContainsKey("cancel_label"), "SceneFreeModeSelectManagerにcancel_labelの設定がされていませんでした");
+			NDebug.Assert(this.adv_kag_.tag_backup.ContainsKey("scene_label_life_mode"), "SceneFreeModeSelectManagerにscene_label_life_modeの設定がされていませんでした");
+			NDebug.Assert(this.adv_kag_.tag_backup.ContainsKey("life_mode_chara_select"), "SceneFreeModeSelectManagerにlife_mode_chara_selectの設定がされていませんでした");
 			this.scene_label_mainstory_ = this.adv_kag_.tag_backup["scene_label_mainstory"];
 			this.scene_label_everyday_ = this.adv_kag_.tag_backup["scene_label_everyday"];
 			this.scene_label_vip_ = this.adv_kag_.tag_backup["scene_label_vip"];
 			this.yotogi_label_ = this.adv_kag_.tag_backup["yotogi_label"];
 			this.cancel_label_ = this.adv_kag_.tag_backup["cancel_label"];
+			this.scene_label_life_mode_ = this.adv_kag_.tag_backup["scene_label_life_mode"];
+			this.life_mode_chara_select_label_ = this.adv_kag_.tag_backup["life_mode_chara_select"];
+			this.is_life_mode_init = this.adv_kag_.tag_backup.ContainsKey("start_life_mode");
 		}
 		this.init_mgr_ = base.children_dic["Init"].GetComponent<FreeModeInit>();
 		this.init_mgr_.next_screen = "Select";
+		if (this.is_life_mode_init)
+		{
+			this.init_mgr_.next_screen = "LifeMode";
+		}
 		this.StoreBackupData();
 		this.CallScreen("Init");
 		Maid maid = GameMain.Instance.CharacterMgr.GetMaid(0);
@@ -47,6 +56,7 @@ public class SceneFreeModeSelectManager : WfScreenManager
 		GameObject childObject3 = UTY.GetChildObject(gameObject, "MenuSelect/Menu/FreeModeMenuButton/夜伽", false);
 		GameObject childObject4 = UTY.GetChildObject(gameObject, "MenuSelect/Menu/FreeModeMenuButton/VIP", false);
 		GameObject childObject5 = UTY.GetChildObject(gameObject, "MenuSelect/Menu/FreeModeMenuButton/VIP_HEvent", false);
+		GameObject childObject6 = UTY.GetChildObject(gameObject, "MenuSelect/Menu/FreeModeMenuButton/ライフモード", false);
 		if (DailyMgr.IsLegacy)
 		{
 			if (childObject != null)
@@ -55,6 +65,10 @@ public class SceneFreeModeSelectManager : WfScreenManager
 			}
 			childObject5.gameObject.SetActive(false);
 			childObject4.gameObject.SetActive(true);
+			if (childObject6 != null)
+			{
+				childObject6.SetActive(false);
+			}
 		}
 		else
 		{
@@ -82,6 +96,10 @@ public class SceneFreeModeSelectManager : WfScreenManager
 			{
 				childObject.SetActive(false);
 			}
+			if (childObject6 != null)
+			{
+				childObject6.SetActive(FreeModeItemLifeMode.CreateItemList(true).Count > 0);
+			}
 			childObject5.gameObject.SetActive(true);
 			childObject4.gameObject.SetActive(false);
 		}
@@ -143,6 +161,11 @@ public class SceneFreeModeSelectManager : WfScreenManager
 
 	public void StoreBackupData()
 	{
+		Maid maid = GameMain.Instance.CharacterMgr.GetMaid(0);
+		if (maid != null)
+		{
+			this.backup_0_maid_guid = maid.status.guid;
+		}
 		this.backup_data_dic_.Clear();
 		CharacterMgr characterMgr = GameMain.Instance.CharacterMgr;
 		for (int i = 0; i < characterMgr.GetStockMaidCount(); i++)
@@ -178,12 +201,20 @@ public class SceneFreeModeSelectManager : WfScreenManager
 
 	public void RestoreBackupData()
 	{
+		if (!string.IsNullOrEmpty(this.backup_0_maid_guid))
+		{
+			Maid stockMaid = GameMain.Instance.CharacterMgr.GetStockMaid(this.backup_0_maid_guid);
+			if (stockMaid != null && stockMaid.ActiveSlotNo != 0)
+			{
+				GameMain.Instance.CharacterMgr.SetActiveMaid(stockMaid, 0);
+			}
+		}
 		CharacterMgr characterMgr = GameMain.Instance.CharacterMgr;
 		for (int i = 0; i < characterMgr.GetStockMaidCount(); i++)
 		{
-			Maid stockMaid = characterMgr.GetStockMaid(i);
-			Status status = stockMaid.status;
-			if (stockMaid != null && this.backup_data_dic_.ContainsKey(status.guid))
+			Maid stockMaid2 = characterMgr.GetStockMaid(i);
+			Status status = stockMaid2.status;
+			if (stockMaid2 != null && this.backup_data_dic_.ContainsKey(status.guid))
 			{
 				SceneFreeModeSelectManager.BackupData backupData = this.backup_data_dic_[status.guid];
 				string[] keyArray = status.flags.GetKeyArray();
@@ -285,6 +316,26 @@ public class SceneFreeModeSelectManager : WfScreenManager
 		this.CallScreen("Move");
 	}
 
+	public void CallEmpireLifeMode()
+	{
+		if (string.IsNullOrEmpty(this.life_mode_chara_select_label_))
+		{
+			return;
+		}
+		this.move_screen_.SetNextLabel(this.life_mode_chara_select_label_);
+		this.CallScreen("Move");
+	}
+
+	public void CallScenePlayLifeMode()
+	{
+		if (string.IsNullOrEmpty(this.scene_label_life_mode_))
+		{
+			return;
+		}
+		this.move_screen.SetNextLabel(this.scene_label_life_mode_);
+		this.CallScreen("Move");
+	}
+
 	protected override void SettingChildrenList(Dictionary<string, WfScreenChildren> children_dic)
 	{
 		string[] array = new string[]
@@ -294,6 +345,7 @@ public class SceneFreeModeSelectManager : WfScreenManager
 			"Vip",
 			"Story",
 			"Everyday",
+			"LifeMode",
 			"Move"
 		};
 		for (int i = 0; i < array.Length; i++)
@@ -312,6 +364,8 @@ public class SceneFreeModeSelectManager : WfScreenManager
 		}
 	}
 
+	public bool is_life_mode_init { get; private set; }
+
 	public FreeModeItemEveryday.ScnearioType ScnearioItemType
 	{
 		get
@@ -328,6 +382,8 @@ public class SceneFreeModeSelectManager : WfScreenManager
 
 	private Dictionary<string, SceneFreeModeSelectManager.BackupData> backup_data_dic_ = new Dictionary<string, SceneFreeModeSelectManager.BackupData>();
 
+	private string backup_0_maid_guid;
+
 	private WfScreenMoveChildren move_screen_;
 
 	private ADVKagManager adv_kag_;
@@ -344,6 +400,10 @@ public class SceneFreeModeSelectManager : WfScreenManager
 
 	private string cancel_label_;
 
+	private string scene_label_life_mode_;
+
+	private string life_mode_chara_select_label_;
+
 	[SerializeField]
 	private FreeModeItemEveryday.ScnearioType itemType;
 

+ 219 - 0
Assembly-CSharp/SceneNPCEdit/EditCharacterDatabase.cs

@@ -0,0 +1,219 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using UnityEngine;
+using wf;
+
+namespace SceneNPCEdit
+{
+	public static class EditCharacterDatabase
+	{
+		public static int Count
+		{
+			get
+			{
+				EditCharacterDatabase.CreateData();
+				return EditCharacterDatabase.commonIdManager.idMap.Count;
+			}
+		}
+
+		public static bool Contains(int id)
+		{
+			return EditCharacterDatabase.commonIdManager.idMap.ContainsKey(id);
+		}
+
+		public static EditCharacterDatabase.Data GetData(int id)
+		{
+			EditCharacterDatabase.CreateData();
+			NDebug.Assert(EditCharacterDatabase.basicDatas.ContainsKey(id), "NPCエディット\nID[" + id + "]のデータは存在しません");
+			return EditCharacterDatabase.basicDatas[id];
+		}
+
+		public static bool IsEnabled(int id)
+		{
+			EditCharacterDatabase.CreateData();
+			return EditCharacterDatabase.commonIdManager.enabledIdList.Contains(id);
+		}
+
+		public static List<EditCharacterDatabase.Data> GetAllDatas(bool onlyEnabled)
+		{
+			EditCharacterDatabase.CreateData();
+			List<EditCharacterDatabase.Data> list = new List<EditCharacterDatabase.Data>();
+			foreach (KeyValuePair<int, KeyValuePair<string, string>> keyValuePair in EditCharacterDatabase.commonIdManager.idMap)
+			{
+				if (!onlyEnabled || EditCharacterDatabase.commonIdManager.enabledIdList.Contains(keyValuePair.Key))
+				{
+					list.Add(EditCharacterDatabase.basicDatas[keyValuePair.Key]);
+				}
+			}
+			return list;
+		}
+
+		public static void CreateData()
+		{
+			if (EditCharacterDatabase.commonIdManager != null)
+			{
+				return;
+			}
+			EditCharacterDatabase.commonIdManager = new CsvCommonIdManager("npcedit", "NPCエディット", CsvCommonIdManager.Type.IdOnly, null);
+			EditCharacterDatabase.basicDatas = new Dictionary<int, EditCharacterDatabase.Data>();
+			string[] array = new string[]
+			{
+				"list"
+			};
+			KeyValuePair<AFileBase, CsvParser>[] array2 = new KeyValuePair<AFileBase, CsvParser>[array.Length];
+			for (int i = 0; i < array2.Length; i++)
+			{
+				string text = "npcedit_" + array[i] + ".nei";
+				AFileBase afileBase = GameUty.FileSystem.FileOpen(text);
+				CsvParser csvParser = new CsvParser();
+				bool condition = csvParser.Open(afileBase);
+				NDebug.Assert(condition, text + "\nopen failed.");
+				array2[i] = new KeyValuePair<AFileBase, CsvParser>(afileBase, csvParser);
+			}
+			foreach (KeyValuePair<int, KeyValuePair<string, string>> keyValuePair in EditCharacterDatabase.commonIdManager.idMap)
+			{
+				EditCharacterDatabase.basicDatas.Add(keyValuePair.Key, new EditCharacterDatabase.Data(keyValuePair.Key, array2[0].Value));
+			}
+			foreach (KeyValuePair<AFileBase, CsvParser> keyValuePair2 in array2)
+			{
+				keyValuePair2.Value.Dispose();
+				keyValuePair2.Key.Dispose();
+			}
+			HashSet<int> hashSet = new HashSet<int>();
+			foreach (int num in EditCharacterDatabase.commonIdManager.enabledIdList)
+			{
+				EditCharacterDatabase.Data data = EditCharacterDatabase.GetData(num);
+				if (string.IsNullOrEmpty(data.checkPluginName) || PluginData.IsEnabled(data.checkPluginName))
+				{
+					if (data.checkLoadFolders != null && 0 < data.checkLoadFolders.Length)
+					{
+						bool flag = false;
+						foreach (string item in data.checkLoadFolders)
+						{
+							if (GameUty.loadArchiveList.Contains(item))
+							{
+								flag = true;
+							}
+						}
+						if (!flag)
+						{
+							continue;
+						}
+					}
+					hashSet.Add(num);
+				}
+			}
+			EditCharacterDatabase.commonIdManager = new CsvCommonIdManager(new Dictionary<int, KeyValuePair<string, string>>(EditCharacterDatabase.commonIdManager.idMap), EditCharacterDatabase.commonIdManager.nameMap, hashSet, CsvCommonIdManager.Type.IdOnly);
+		}
+
+		private const string csvTopCommonName = "npcedit";
+
+		private const string typeNameForErrorLog = "NPCエディット";
+
+		private static CsvCommonIdManager commonIdManager;
+
+		private static Dictionary<int, EditCharacterDatabase.Data> basicDatas;
+
+		public class Data
+		{
+			public Data(int id, CsvParser basicCsv)
+			{
+				for (int i = 1; i < basicCsv.max_cell_y; i++)
+				{
+					if (basicCsv.IsCellToExistData(0, i) && basicCsv.GetCellAsInteger(0, i) == id)
+					{
+						int num = 1;
+						this.id = id;
+						string cellAsString = basicCsv.GetCellAsString(num++, i);
+						if (CharacterMgr.npcDatas.ContainsKey(cellAsString))
+						{
+							if (!CharacterMgr.npcDatas.ContainsKey(cellAsString))
+							{
+								Debug.LogError("NPCエディットエラー ユニーク名[" + cellAsString + "]のキャラプリセットが存在しません");
+							}
+							this.npcData = CharacterMgr.npcDatas[cellAsString];
+						}
+						this.isCBLEnabled = (basicCsv.GetCellAsString(num++, i) == "〇");
+						this.checkPluginName = basicCsv.GetCellAsString(num++, i);
+						string cellAsString2 = basicCsv.GetCellAsString(num++, i);
+						if (!string.IsNullOrEmpty(cellAsString2))
+						{
+							this.checkLoadFolders = cellAsString2.Split(new char[]
+							{
+								'|'
+							});
+						}
+						else
+						{
+							this.checkLoadFolders = new string[0];
+						}
+						string cellAsString3 = basicCsv.GetCellAsString(num++, i);
+						if (!string.IsNullOrEmpty(cellAsString3))
+						{
+							List<CharacterMgr.NpcData> list = new List<CharacterMgr.NpcData>();
+							foreach (string text in cellAsString3.Split(new char[]
+							{
+								'|'
+							}))
+							{
+								if (!CharacterMgr.npcDatas.ContainsKey(text))
+								{
+									Debug.LogError("NPCエディットエラー ユニーク名[" + text + "]のキャラプリセットが存在しません");
+								}
+								list.Add(CharacterMgr.npcDatas[text]);
+							}
+							this.overRideTargetNpc = list.ToArray();
+						}
+						else
+						{
+							this.overRideTargetNpc = new CharacterMgr.NpcData[]
+							{
+								this.npcData
+							};
+						}
+						this.additionalInformationText = basicCsv.GetCellAsString(num++, i);
+						this.additionalInformationTextForCBL = basicCsv.GetCellAsString(num++, i);
+					}
+				}
+			}
+
+			public Texture2D GetThumbnail()
+			{
+				if (this.npcData.isResourcesLoad)
+				{
+					return GameMain.Instance.CharacterMgr.PresetLoadFromResources(this.npcData.presetFileName).texThum;
+				}
+				using (AFileBase afileBase = GameUty.FileOpen(this.npcData.presetFileName + ".preset", null))
+				{
+					if (afileBase != null && afileBase.IsValid())
+					{
+						byte[] buffer = afileBase.ReadAll();
+						using (BinaryReader binaryReader = new BinaryReader(new MemoryStream(buffer), Encoding.UTF8))
+						{
+							return GameMain.Instance.CharacterMgr.PresetLoad(binaryReader, this.npcData.presetFileName).texThum;
+						}
+					}
+				}
+				return null;
+			}
+
+			public readonly int id;
+
+			public readonly CharacterMgr.NpcData npcData;
+
+			public readonly bool isCBLEnabled;
+
+			public readonly string checkPluginName;
+
+			public readonly string[] checkLoadFolders;
+
+			public readonly string additionalInformationText;
+
+			public readonly string additionalInformationTextForCBL;
+
+			public readonly CharacterMgr.NpcData[] overRideTargetNpc;
+		}
+	}
+}

+ 106 - 0
Assembly-CSharp/SceneNPCEdit/NPCCharaSelect.cs

@@ -0,0 +1,106 @@
+using System;
+using UnityEngine;
+using wf;
+
+namespace SceneNPCEdit
+{
+	public class NPCCharaSelect : MonoBehaviour
+	{
+		public EditCharacterDatabase.Data selectNPC { get; private set; }
+
+		private UIProgressBar scrollBar
+		{
+			get
+			{
+				return this.scrollView.verticalScrollBar;
+			}
+		}
+
+		private void Awake()
+		{
+			NDebug.AssertNull(this.MaidPlateParentGrid != null);
+			this.plateTabPanel = this.MaidPlateParentGrid.gameObject.GetComponent<UIWFTabPanel>();
+			this.scrollView = UTY.GetChildObject(base.gameObject, "Contents", false).GetComponent<UIScrollView>();
+			this.Create();
+		}
+
+		public void Create()
+		{
+			foreach (EditCharacterDatabase.Data data in EditCharacterDatabase.GetAllDatas(true))
+			{
+				GameObject gameObject = Utility.CreatePrefab(this.MaidPlateParentGrid.gameObject, "CharacterSelect/Prefab/MaidPlateSimple", true);
+				gameObject.name = data.id.ToString();
+				NPCEditPlate npceditPlate = gameObject.AddComponent<NPCEditPlate>();
+				npceditPlate.onSelectEvent = new Action<NPCEditPlate>(this.OnSelectPlate);
+				npceditPlate.lastName = data.npcData.lastName;
+				npceditPlate.firstName = data.npcData.firstName;
+				Texture2D thumbnail = (!SaveData.Contains(data.id)) ? data.GetThumbnail() : SaveData.GetPreset(data.id).texThum;
+				npceditPlate.thumbnail = thumbnail;
+			}
+			this.plateTabPanel.UpdateChildren();
+			Utility.ResetNGUI(this.MaidPlateParentGrid);
+			Utility.ResetNGUI(this.scrollView);
+			if (this.MaidPlateParentGrid.GetChildList().Count != 0)
+			{
+				if (NPCCharaSelect.editTargetNPCData != null)
+				{
+					for (int i = 0; i < this.MaidPlateParentGrid.transform.childCount; i++)
+					{
+						int num = int.Parse(this.MaidPlateParentGrid.GetChild(i).name);
+						if (num == NPCCharaSelect.editTargetNPCData.id)
+						{
+							UIWFTabButton component = UTY.GetChildObject(this.MaidPlateParentGrid.GetChild(i).gameObject, "Button", false).GetComponent<UIWFTabButton>();
+							if (component != null)
+							{
+								this.plateTabPanel.Select(component);
+							}
+							break;
+						}
+					}
+				}
+				else
+				{
+					UIWFTabButton component2 = UTY.GetChildObject(this.MaidPlateParentGrid.GetChild(0).gameObject, "Button", false).GetComponent<UIWFTabButton>();
+					if (component2 != null)
+					{
+						this.plateTabPanel.Select(component2);
+					}
+				}
+			}
+			NPCCharaSelect.editTargetNPCData = null;
+		}
+
+		public void UpdateSelectData()
+		{
+			for (int i = 0; i < this.MaidPlateParentGrid.transform.childCount; i++)
+			{
+				int num = int.Parse(this.MaidPlateParentGrid.GetChild(i).name);
+				if (num == this.selectNPC.id)
+				{
+					NPCEditPlate component = this.MaidPlateParentGrid.GetChild(i).GetComponent<NPCEditPlate>();
+					Texture2D thumbnail = (!SaveData.Contains(num)) ? this.selectNPC.GetThumbnail() : SaveData.GetPreset(num).texThum;
+					component.thumbnail = thumbnail;
+					this.statusPanel.Apply(component, this.selectNPC.additionalInformationText);
+				}
+			}
+		}
+
+		public void OnSelectPlate(NPCEditPlate selectPlate)
+		{
+			this.selectNPC = EditCharacterDatabase.GetData(int.Parse(selectPlate.name));
+			this.statusPanel.Apply(selectPlate, this.selectNPC.additionalInformationText);
+		}
+
+		public static EditCharacterDatabase.Data editTargetNPCData;
+
+		[SerializeField]
+		private UIGrid MaidPlateParentGrid;
+
+		[SerializeField]
+		private NPCEditStatus statusPanel;
+
+		private UIWFTabPanel plateTabPanel;
+
+		private UIScrollView scrollView;
+	}
+}

+ 57 - 0
Assembly-CSharp/SceneNPCEdit/NPCEdit.cs

@@ -0,0 +1,57 @@
+using System;
+using System.Collections.Generic;
+
+namespace SceneNPCEdit
+{
+	public class NPCEdit : WfScreenManager
+	{
+		public void Awake()
+		{
+			this.adv_kag_ = GameMain.Instance.ScriptMgr.adv_kag;
+		}
+
+		public override void Start()
+		{
+			base.Start();
+			this.move_screen_ = base.children_dic["Move"].GetComponent<WfScreenMoveChildren>();
+			string edit_label = string.Empty;
+			string empty = string.Empty;
+			string empty2 = string.Empty;
+			if (this.adv_kag_.tag_backup != null && 0 < this.adv_kag_.tag_backup.Count && this.adv_kag_.tag_backup["name"] == "SceneNPCEdit")
+			{
+				NDebug.Assert(this.adv_kag_.tag_backup.ContainsKey("label"), "SceneCallにlabelの設定がされていませんでした");
+				NDebug.Assert(this.adv_kag_.tag_backup.ContainsKey("edit_label"), "SceneCallにedit_labelの設定がされていませんでした");
+				edit_label = this.adv_kag_.tag_backup["edit_label"];
+				this.move_screen_.SetNextLabel(this.adv_kag_.tag_backup["label"]);
+			}
+			NPCEditMain component = base.children_dic["Main"].GetComponent<NPCEditMain>();
+			component.SetScreenManager(this, edit_label, empty, empty2);
+			this.CallScreen("Main");
+		}
+
+		protected override void SettingChildrenList(Dictionary<string, WfScreenChildren> children_dic)
+		{
+			string[] array = new string[]
+			{
+				"Main",
+				"Move"
+			};
+			for (int i = 0; i < array.Length; i++)
+			{
+				children_dic.Add(array[i], UTY.GetChildObject(base.gameObject, array[i], false).GetComponent<WfScreenChildren>());
+			}
+		}
+
+		public WfScreenMoveChildren move_screen
+		{
+			get
+			{
+				return this.move_screen_;
+			}
+		}
+
+		private WfScreenMoveChildren move_screen_;
+
+		private ADVKagManager adv_kag_;
+	}
+}

+ 155 - 0
Assembly-CSharp/SceneNPCEdit/NPCEditMain.cs

@@ -0,0 +1,155 @@
+using System;
+using System.Collections.Generic;
+using com.workman.cm3d2.scene.dailyEtc;
+using UnityEngine;
+
+namespace SceneNPCEdit
+{
+	public class NPCEditMain : WfScreenChildren
+	{
+		public override void Awake()
+		{
+			base.Awake();
+			this.mainUIFade = base.root_obj.GetComponent<WfFadeBehaviour>();
+			NDebug.AssertNull(this.mainUIFade);
+			this.parent_grid_ = UTY.GetChildObject(base.root_obj, "ButtonParent/Tower/Grid", false).GetComponent<UIGrid>();
+			this.button_dic_.Add("エディット", UTY.GetChildObject(this.parent_grid_.gameObject, "エディット", false).GetComponent<UIButton>());
+			this.button_dic_.Add("リセット", UTY.GetChildObject(this.parent_grid_.gameObject, "リセット", false).GetComponent<UIButton>());
+			this.button_dic_.Add("Cancel", UTY.GetChildObject(base.root_obj, "ButtonParent/Cancel", false).GetComponent<UIButton>());
+			foreach (KeyValuePair<string, UIButton> keyValuePair in this.button_dic_)
+			{
+				EventDelegate.Add(keyValuePair.Value.onClick, new EventDelegate.Callback(this.OnClickButton));
+			}
+		}
+
+		protected override void OnCall()
+		{
+			base.SetCallInFadeWaitFrame(2);
+			GameMain.Instance.MainLight.Reset();
+			GameMain.Instance.CharacterMgr.ResetCharaPosAll();
+			GameMain.Instance.MainCamera.Reset(CameraMain.CameraType.Target, true);
+			GameMain.Instance.SoundMgr.VoiceStopAll();
+			GameMain.Instance.CharacterMgr.DeactivateCharaAll();
+			GameMain.Instance.CharacterMgr.DeactivateMaid(0);
+			if (this.charaMgr.status.isDaytime)
+			{
+				GameMain.Instance.SoundMgr.PlayBGM(DailyAPI.dayBgm, 0.5f, true);
+				GameMain.Instance.BgMgr.ChangeBg(DailyAPI.dayBg);
+			}
+			else
+			{
+				GameMain.Instance.SoundMgr.PlayBGM(DailyAPI.nightBgm, 0.5f, true);
+				GameMain.Instance.BgMgr.ChangeBg(DailyAPI.nightBg);
+			}
+			this.parent_grid_.repositionNow = true;
+			this.select_maid_ = null;
+			for (int i = 0; i < this.charaMgr.GetStockMaidCount(); i++)
+			{
+				if (this.charaMgr.GetStockMaid(i).status.leader)
+				{
+					this.cur_maid_leader_ = this.charaMgr.GetStockMaid(i);
+					break;
+				}
+			}
+			for (int j = 0; j < this.charaMgr.GetMaidCount(); j++)
+			{
+				if (this.charaMgr.GetMaid(j) != null)
+				{
+					this.charaMgr.GetMaid(j).Visible = false;
+				}
+			}
+		}
+
+		public void SetScreenManager(NPCEdit maid_management, string edit_label, string new_edit_label, string transfer_label)
+		{
+			this.screenManager = maid_management;
+			this.edit_label_ = edit_label;
+			this.new_edit_label_ = new_edit_label;
+			this.transfer_label_ = transfer_label;
+		}
+
+		private void OnSelectChara(Maid select_maid)
+		{
+			this.select_maid_ = select_maid;
+		}
+
+		private void OnClickButton()
+		{
+			if (!PluginData.IsEnabled("GP001"))
+			{
+				return;
+			}
+			string a = string.Empty;
+			foreach (KeyValuePair<string, UIButton> keyValuePair in this.button_dic_)
+			{
+				if (keyValuePair.Value == UIButton.current)
+				{
+					a = keyValuePair.Key;
+					break;
+				}
+			}
+			if (a == "エディット" && this.npcEditCharaSelect.selectNPC != null)
+			{
+				if (string.IsNullOrEmpty(this.edit_label_))
+				{
+					return;
+				}
+				Maid maid = this.charaMgr.ActivateNpc(0);
+				this.npcEditCharaSelect.selectNPC.npcData.Apply(maid, true);
+				NPCCharaSelect.editTargetNPCData = this.npcEditCharaSelect.selectNPC;
+				this.screenManager.move_screen.SetNextLabel(this.edit_label_);
+				this.Finish();
+			}
+			if (a == "リセット" && this.npcEditCharaSelect.selectNPC != null)
+			{
+				SaveData.RemovePreset(this.npcEditCharaSelect.selectNPC.id);
+				this.npcEditCharaSelect.UpdateSelectData();
+			}
+			else if (a == "Cancel")
+			{
+				this.Finish();
+			}
+		}
+
+		protected override void OnFinish()
+		{
+			if ((this.screenManager.move_screen.next_label == this.edit_label_ || this.screenManager.move_screen.next_label == this.new_edit_label_ || this.screenManager.move_screen.next_label == this.transfer_label_) && this.charaMgr.GetMaid(0) != null)
+			{
+				this.charaMgr.GetMaid(0).Visible = true;
+			}
+			if (!string.IsNullOrEmpty(this.screenManager.move_screen.next_label))
+			{
+				this.screenManager.CallScreen("Move");
+			}
+		}
+
+		private CharacterMgr charaMgr
+		{
+			get
+			{
+				return GameMain.Instance.CharacterMgr;
+			}
+		}
+
+		[SerializeField]
+		private NPCCharaSelect npcEditCharaSelect;
+
+		private WfFadeBehaviour mainUIFade;
+
+		private NPCEdit screenManager;
+
+		private Maid cur_maid_leader_;
+
+		private Maid select_maid_;
+
+		private UIGrid parent_grid_;
+
+		private Dictionary<string, UIButton> button_dic_ = new Dictionary<string, UIButton>();
+
+		private string edit_label_;
+
+		private string new_edit_label_;
+
+		private string transfer_label_;
+	}
+}

+ 110 - 0
Assembly-CSharp/SceneNPCEdit/NPCEditPlate.cs

@@ -0,0 +1,110 @@
+using System;
+using UnityEngine;
+
+namespace SceneNPCEdit
+{
+	public class NPCEditPlate : MonoBehaviour
+	{
+		public string lastName
+		{
+			get
+			{
+				return this.labelLastName.text;
+			}
+			set
+			{
+				this.labelLastName.text = value;
+			}
+		}
+
+		public string firstName
+		{
+			get
+			{
+				return this.labelFirstName.text;
+			}
+			set
+			{
+				this.labelFirstName.text = value;
+			}
+		}
+
+		public Texture2D thumbnail
+		{
+			get
+			{
+				return this.GetThumTex();
+			}
+			set
+			{
+				this.SetThumTex(value);
+			}
+		}
+
+		public Sprite thumbnailSprite
+		{
+			get
+			{
+				return this.thumSprite.sprite2D;
+			}
+		}
+
+		private void Awake()
+		{
+			UnityEngine.Object.Destroy(UTY.GetChildObject(base.gameObject, "Button", false).GetComponent<UIWFSelectButton>());
+			UIWFTabButton component = UTY.GetChildObject(base.gameObject, "Button", false).GetComponent<UIWFTabButton>();
+			if (component != null)
+			{
+				component.enabled = true;
+				EventDelegate.Add(component.onSelect, new EventDelegate.Callback(this.OnSelectPlate));
+			}
+			UTY.GetChildObject(base.gameObject, "LeftPlate/FrameBaseData/FixText2", false).SetActive(false);
+			UTY.GetChildObject(base.gameObject, "LeftPlate/FrameBaseData/TextTypeName", false).SetActive(false);
+			this.labelLastName = UTY.GetChildObject(base.gameObject, "LeftPlate/FrameBaseData/TextLastName", false).GetComponent<UILabel>();
+			this.labelFirstName = UTY.GetChildObject(base.gameObject, "LeftPlate/FrameBaseData/TextFirstName", false).GetComponent<UILabel>();
+			this.thumSprite = UTY.GetChildObject(base.gameObject, "LeftPlate/FrameThumbnail/Thum", false).GetComponent<UI2DSprite>();
+		}
+
+		private void SetThumTex(Texture2D tex)
+		{
+			if (tex != null)
+			{
+				if (this.thumSprite.sprite2D == null || this.thumSprite.sprite2D.texture != tex)
+				{
+					Sprite sprite2D = Sprite.Create(tex, new Rect(0f, 0f, (float)tex.width, (float)tex.height), default(Vector2));
+					this.thumSprite.sprite2D = sprite2D;
+					this.thumSprite.SetDimensions(61, 88);
+				}
+			}
+			else
+			{
+				this.thumSprite.sprite2D = null;
+			}
+		}
+
+		private Texture2D GetThumTex()
+		{
+			return (!(this.thumSprite.sprite2D != null)) ? null : this.thumSprite.sprite2D.texture;
+		}
+
+		private void OnSelectPlate()
+		{
+			if (!UIWFSelectButton.current.isSelected)
+			{
+				return;
+			}
+			if (this.onSelectEvent != null)
+			{
+				this.onSelectEvent(this);
+			}
+		}
+
+		public Action<NPCEditPlate> onSelectEvent;
+
+		private UILabel labelLastName;
+
+		private UILabel labelFirstName;
+
+		private UI2DSprite thumSprite;
+	}
+}

+ 29 - 0
Assembly-CSharp/SceneNPCEdit/NPCEditStatus.cs

@@ -0,0 +1,29 @@
+using System;
+using UnityEngine;
+
+namespace SceneNPCEdit
+{
+	public class NPCEditStatus : MonoBehaviour
+	{
+		public void Apply(NPCEditPlate plate, string additionalInformationText)
+		{
+			this.labelLastName.text = plate.lastName;
+			this.labelFirstName.text = plate.firstName;
+			this.thumSprite.mainTexture = plate.thumbnail;
+			this.thumSprite.SetDimensions(61, 88);
+			this.additionalInformationText.text = additionalInformationText;
+		}
+
+		[SerializeField]
+		private UILabel labelLastName;
+
+		[SerializeField]
+		private UILabel labelFirstName;
+
+		[SerializeField]
+		private UILabel additionalInformationText;
+
+		[SerializeField]
+		private UITexture thumSprite;
+	}
+}

+ 111 - 0
Assembly-CSharp/SceneNPCEdit/SaveData.cs

@@ -0,0 +1,111 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+
+namespace SceneNPCEdit
+{
+	public static class SaveData
+	{
+		public static void Serialize(BinaryWriter binary)
+		{
+			binary.Write("CM3D2_NPCEDIT");
+			binary.Write(1250);
+			binary.Write(SaveData.presetData.Count);
+			foreach (KeyValuePair<int, byte[]> keyValuePair in SaveData.presetData)
+			{
+				binary.Write(keyValuePair.Key);
+				binary.Write(keyValuePair.Value.Length);
+				binary.Write(keyValuePair.Value);
+			}
+		}
+
+		public static void Deserialize(BinaryReader binary, int version)
+		{
+			SaveData.presetData.Clear();
+			SaveData.presetDataCache.Clear();
+			if (version < 1250)
+			{
+				return;
+			}
+			string a = binary.ReadString();
+			NDebug.Assert(a == "CM3D2_NPCEDIT", "NPCEDITのヘッダーが不正です。");
+			int num = binary.ReadInt32();
+			int num2 = binary.ReadInt32();
+			for (int i = 0; i < num2; i++)
+			{
+				int key = binary.ReadInt32();
+				int count = binary.ReadInt32();
+				byte[] value = binary.ReadBytes(count);
+				if (!SaveData.presetData.ContainsKey(key))
+				{
+					SaveData.presetData.Add(key, value);
+				}
+			}
+		}
+
+		public static int GetID(CharacterMgr.NpcData targetNpcData)
+		{
+			foreach (EditCharacterDatabase.Data data in EditCharacterDatabase.GetAllDatas(true))
+			{
+				foreach (CharacterMgr.NpcData npcData in data.overRideTargetNpc)
+				{
+					if (npcData.uniqueName == targetNpcData.uniqueName)
+					{
+						return data.id;
+					}
+				}
+			}
+			return int.MinValue;
+		}
+
+		public static bool Contains(int id)
+		{
+			return SaveData.presetData.ContainsKey(id);
+		}
+
+		public static CharacterMgr.Preset GetPreset(int id)
+		{
+			CharacterMgr.Preset result = null;
+			if (SaveData.presetDataCache.TryGetValue(id, out result))
+			{
+				return result;
+			}
+			if (SaveData.Contains(id))
+			{
+				byte[] buffer = SaveData.presetData[id];
+				using (BinaryReader binaryReader = new BinaryReader(new MemoryStream(buffer), Encoding.UTF8))
+				{
+					CharacterMgr.Preset preset = GameMain.Instance.CharacterMgr.PresetLoad(binaryReader, string.Empty);
+					SaveData.presetDataCache.Add(id, preset);
+					result = preset;
+				}
+			}
+			return result;
+		}
+
+		public static CharacterMgr.Preset GetPreset(CharacterMgr.NpcData npcData)
+		{
+			return SaveData.GetPreset(SaveData.GetID(npcData));
+		}
+
+		public static void SetPreset(int id, byte[] data)
+		{
+			SaveData.presetData[id] = data;
+			if (SaveData.presetDataCache.ContainsKey(id))
+			{
+				SaveData.presetDataCache.Remove(id);
+			}
+		}
+
+		public static void RemovePreset(int id)
+		{
+			SaveData.presetData.Remove(id);
+			SaveData.presetDataCache.Remove(id);
+		}
+
+		public static Dictionary<int, byte[]> presetData = new Dictionary<int, byte[]>();
+
+		public static Dictionary<int, CharacterMgr.Preset> presetDataCache = new Dictionary<int, CharacterMgr.Preset>();
+	}
+}

+ 3 - 3
Assembly-CSharp/SceneUserEditMain.cs

@@ -48,12 +48,12 @@ public class SceneUserEditMain : WfScreenChildren
 			foreach (SceneEdit.SMenuItem smenuItem in array2[j])
 			{
 				GameObject gameObject = Utility.CreatePrefab(uiwftabPanel.gameObject, "ScenePhotoMode/EditItemIcon", true);
-				if (smenuItem.m_texIcon != null)
+				if (smenuItem.m_texIconRef != null)
 				{
-					Sprite sprite2D = Sprite.Create(smenuItem.m_texIcon, new Rect(0f, 0f, (float)smenuItem.m_texIcon.width, (float)smenuItem.m_texIcon.height), default(Vector2));
+					Sprite sprite2D = Sprite.Create(smenuItem.m_texIconRef, new Rect(0f, 0f, (float)smenuItem.m_texIconRef.width, (float)smenuItem.m_texIconRef.height), default(Vector2));
 					UI2DSprite componentInChildren = gameObject.GetComponentInChildren<UI2DSprite>();
 					componentInChildren.sprite2D = sprite2D;
-					componentInChildren.SetDimensions(smenuItem.m_texIcon.width, smenuItem.m_texIcon.height);
+					componentInChildren.SetDimensions(smenuItem.m_texIconRef.width, smenuItem.m_texIconRef.height);
 					UISprite component = UTY.GetChildObject(gameObject, "Frame", false).GetComponent<UISprite>();
 					component.SetDimensions(74, 74);
 				}

+ 7 - 3
Assembly-CSharp/ScriptManager.cs

@@ -478,7 +478,7 @@ public class ScriptManager : IDisposable
 		this.tmp_kag_.LoadScriptFile(file_name, label_name);
 	}
 
-	public void LoadMotionScript(int sloat, bool is_next, string file_name, string label_name = "", string maid_guid = "", string man_guid = "", bool face_fix = false, bool valid_pos = true)
+	public void LoadMotionScript(int sloat, bool is_next, string file_name, string label_name = "", string maid_guid = "", string man_guid = "", bool face_fix = false, bool valid_pos = true, bool disable_diff_pos = false)
 	{
 		if (!string.IsNullOrEmpty(maid_guid))
 		{
@@ -548,7 +548,7 @@ public class ScriptManager : IDisposable
 			b = mainMaid.transform.position;
 		}
 		motionKagManager2.Exec();
-		if (!ScriptManager.isGP001Mode && mainMaid != null && motionKagManager2.maidOffsetSetList.Find((Maid maid) => maid == mainMaid) != null)
+		if (!ScriptManager.isGP001Mode && !disable_diff_pos && mainMaid != null && motionKagManager2.maidOffsetSetList.Find((Maid maid) => maid == mainMaid) != null)
 		{
 			Vector3 b2 = mainMaid.transform.position - b;
 			Quaternion rotation = mainMaid.transform.rotation;
@@ -1210,6 +1210,10 @@ public class ScriptManager : IDisposable
 			}
 			array = null;
 		}
+		if (this.compatibilityMode && !maid.boMAN)
+		{
+			maid.status.voiceGroup = VoiceGroup.Sub;
+		}
 	}
 
 	private void TJSFuncPresetLoadNPC(TJSVariantRef[] tjs_param, TJSVariantRef result)
@@ -3068,7 +3072,7 @@ public class ScriptManager : IDisposable
 	public void Serialize(BinaryWriter binary)
 	{
 		binary.Write("CM3D2_SCRIPT");
-		binary.Write(1240);
+		binary.Write(1250);
 		this.adv_kag_.Serialize(binary);
 	}
 

+ 45 - 14
Assembly-CSharp/SoundMgr.cs

@@ -72,11 +72,19 @@ public class SoundMgr : MonoBehaviour
 		this.SetVolume(AudioSourceMgr.Type.System, 50);
 		this.SetVolume(AudioSourceMgr.Type.Env, 50);
 		this.SetVolume(AudioSourceMgr.Type.Voice, 80);
+		this.SetVolume(AudioSourceMgr.Type.VoiceHeroine, 100);
+		this.SetVolume(AudioSourceMgr.Type.VoiceSub, 100);
+		this.SetVolume(AudioSourceMgr.Type.VoiceExtra, 100);
+		this.SetVolume(AudioSourceMgr.Type.VoiceMob, 100);
 		this.SetVolumeDance(70);
 		this.SetThreeD(AudioSourceMgr.Type.Bgm, false);
 		this.SetThreeD(AudioSourceMgr.Type.Se, true);
 		this.SetThreeD(AudioSourceMgr.Type.Env, true);
-		this.SetThreeD(AudioSourceMgr.Type.Voice, true);
+		this.SetThreeD(AudioSourceMgr.Type.Voice, false);
+		this.SetThreeD(AudioSourceMgr.Type.VoiceHeroine, true);
+		this.SetThreeD(AudioSourceMgr.Type.VoiceSub, true);
+		this.SetThreeD(AudioSourceMgr.Type.VoiceExtra, true);
+		this.SetThreeD(AudioSourceMgr.Type.VoiceMob, true);
 	}
 
 	public void PlayBGM(string f_strFileName, float f_fTime, bool f_fLoop = true)
@@ -148,9 +156,10 @@ public class SoundMgr : MonoBehaviour
 		audioSourceMgr.PlayOneShot();
 	}
 
-	public void PlayDummyVoice(string f_strFileName, float f_fFadeTime = 0f, bool f_bStreaming = false, bool f_bLoop = false, int voice_pitch = 50)
+	public void PlayDummyVoice(string f_strFileName, float f_fFadeTime = 0f, bool f_bStreaming = false, bool f_bLoop = false, int voice_pitch = 50, AudioSourceMgr.Type soundType = AudioSourceMgr.Type.Voice)
 	{
 		this.m_AudioDummyVoice.Pitch = SoundMgr.ConvertToAudioSourcePitch(voice_pitch);
+		this.m_AudioDummyVoice.audiosource.outputAudioMixerGroup = this.mix_mgr[soundType];
 		this.m_AudioDummyVoice.LoadPlay(f_strFileName, f_fFadeTime, f_bStreaming, f_bLoop);
 	}
 
@@ -273,6 +282,10 @@ public class SoundMgr : MonoBehaviour
 		this.mix_mgr.SetVolume(AudioMixerMgr.Group.Master, (float)this.m_nAllVol * 0.01f);
 		this.mix_mgr.SetVolume(AudioMixerMgr.Group.BGM, (float)this.GetVolume(AudioSourceMgr.Type.Bgm) * 0.01f);
 		this.mix_mgr.SetVolume(AudioMixerMgr.Group.Voice, (float)this.GetVolume(AudioSourceMgr.Type.Voice) * 0.01f);
+		this.mix_mgr.SetVolume(AudioMixerMgr.Group.VoiceHeroine, (float)this.GetVolume(AudioSourceMgr.Type.VoiceHeroine) * 0.01f);
+		this.mix_mgr.SetVolume(AudioMixerMgr.Group.VoiceSub, (float)this.GetVolume(AudioSourceMgr.Type.VoiceSub) * 0.01f);
+		this.mix_mgr.SetVolume(AudioMixerMgr.Group.VoiceExtra, (float)this.GetVolume(AudioSourceMgr.Type.VoiceExtra) * 0.01f);
+		this.mix_mgr.SetVolume(AudioMixerMgr.Group.VoiceMob, (float)this.GetVolume(AudioSourceMgr.Type.VoiceMob) * 0.01f);
 		this.mix_mgr.SetVolume(AudioMixerMgr.Group.Dance, (float)this.GetVolumeDance() * 0.01f);
 		this.mix_mgr.SetVolume(AudioMixerMgr.Group.System, (float)this.GetVolume(AudioSourceMgr.Type.System) * 0.01f);
 		this.mix_mgr.SetVolume(AudioMixerMgr.Group.SE, (float)this.GetVolume(AudioSourceMgr.Type.Se) * 0.01f);
@@ -292,9 +305,9 @@ public class SoundMgr : MonoBehaviour
 
 	public bool SaveIni(XElement f_xe)
 	{
-		XElement[] array = new XElement[5];
-		XElement[] array2 = new XElement[5];
-		for (int i = 0; i < 5; i++)
+		XElement[] array = new XElement[9];
+		XElement[] array2 = new XElement[9];
+		for (int i = 0; i < 9; i++)
 		{
 			XElement[] array3 = array;
 			int num = i;
@@ -316,7 +329,7 @@ public class SoundMgr : MonoBehaviour
 		return true;
 	}
 
-	public bool LoadIni(XElement f_xe)
+	public bool LoadIni(XElement f_xe, int version)
 	{
 		XElement xelement = f_xe.Element("Sound");
 		this.SetVolumeAll(int.Parse(xelement.Element("VolumeAll").Value));
@@ -325,19 +338,37 @@ public class SoundMgr : MonoBehaviour
 		{
 			this.SetVolumeDance(int.Parse(xelement2.Value));
 		}
-		for (int i = 0; i < 5; i++)
+		for (int i = 0; i < 9; i++)
 		{
-			AudioSourceMgr.Type f_eType = (AudioSourceMgr.Type)i;
 			XContainer xcontainer = xelement;
 			AudioSourceMgr.Type type = (AudioSourceMgr.Type)i;
-			this.SetVolume(f_eType, int.Parse(xcontainer.Element(type.ToString() + "Volume").Value));
+			XElement xelement3 = xcontainer.Element(type.ToString() + "Volume");
+			if (xelement3 != null)
+			{
+				this.SetVolume((AudioSourceMgr.Type)i, int.Parse(xelement3.Value));
+			}
+			else
+			{
+				this.SetVolume((AudioSourceMgr.Type)i, 100);
+			}
 		}
-		for (int j = 0; j < 5; j++)
+		for (int j = 0; j < 9; j++)
 		{
-			AudioSourceMgr.Type f_eType2 = (AudioSourceMgr.Type)j;
 			XContainer xcontainer2 = xelement;
 			AudioSourceMgr.Type type2 = (AudioSourceMgr.Type)j;
-			this.SetThreeD(f_eType2, bool.Parse(xcontainer2.Element(type2.ToString() + "ThreeD").Value));
+			XElement xelement4 = xcontainer2.Element(type2.ToString() + "ThreeD");
+			if (xelement4 != null)
+			{
+				this.SetThreeD((AudioSourceMgr.Type)j, bool.Parse(xelement4.Value));
+			}
+			else
+			{
+				this.SetThreeD((AudioSourceMgr.Type)j, true);
+			}
+		}
+		if (version <= 1240 && this.GetThreeD(AudioSourceMgr.Type.Voice))
+		{
+			this.SetThreeD(AudioSourceMgr.Type.Voice, false);
 		}
 		return true;
 	}
@@ -362,9 +393,9 @@ public class SoundMgr : MonoBehaviour
 
 	private int m_nDanceVol;
 
-	private int[] m_nVol = new int[5];
+	private int[] m_nVol = new int[9];
 
-	private bool[] m_bThreeD = new bool[5];
+	private bool[] m_bThreeD = new bool[9];
 
 	public bool compatibilityMode;
 

+ 4 - 4
Assembly-CSharp/SubSlotEditItem.cs

@@ -58,9 +58,9 @@ public class SubSlotEditItem : MonoBehaviour
 			if (prop != null && this.sceneEdit.m_menuRidDic.ContainsKey(prop.nFileNameRID))
 			{
 				this.menuItem = this.sceneEdit.m_menuRidDic[prop.nFileNameRID];
-				if (this.menuItem.m_texIcon != null)
+				if (this.menuItem.m_texIconRef != null)
 				{
-					this.button.normalSprite2D = Sprite.Create(this.menuItem.m_texIcon, new Rect(0f, 0f, (float)this.menuItem.m_texIcon.width, (float)this.menuItem.m_texIcon.height), Vector2.zero);
+					this.button.normalSprite2D = Sprite.Create(this.menuItem.m_texIconRef, new Rect(0f, 0f, (float)this.menuItem.m_texIconRef.width, (float)this.menuItem.m_texIconRef.height), Vector2.zero);
 				}
 			}
 			this.menuItem = null;
@@ -68,9 +68,9 @@ public class SubSlotEditItem : MonoBehaviour
 			return false;
 		}
 		this.menuItem = this.sceneEdit.m_menuRidDic[subProp.nFileNameRID];
-		if (this.menuItem.m_texIcon != null)
+		if (this.menuItem.m_texIconRef != null)
 		{
-			this.button.normalSprite2D = Sprite.Create(this.menuItem.m_texIcon, new Rect(0f, 0f, (float)this.menuItem.m_texIcon.width, (float)this.menuItem.m_texIcon.height), Vector2.zero);
+			this.button.normalSprite2D = Sprite.Create(this.menuItem.m_texIconRef, new Rect(0f, 0f, (float)this.menuItem.m_texIconRef.width, (float)this.menuItem.m_texIconRef.height), Vector2.zero);
 		}
 		this.button.isEnabled = true;
 		return true;

+ 64 - 0
Assembly-CSharp/TBody.cs

@@ -3,7 +3,9 @@ using System.Collections;
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;
+using MaidStatus;
 using UnityEngine;
+using UnityEngine.Audio;
 
 public class TBody : MonoBehaviour
 {
@@ -31,6 +33,50 @@ public class TBody : MonoBehaviour
 		}
 	}
 
+	public void SetVoiceGroup(VoiceGroup group)
+	{
+		if (this.AudioMan == null)
+		{
+			return;
+		}
+		AudioMixerMgr.Group group2 = AudioMixerMgr.Group.VoiceHeroine;
+		AudioSourceMgr.Type soundType = AudioSourceMgr.Type.VoiceHeroine;
+		if (group != VoiceGroup.Sub)
+		{
+			if (group != VoiceGroup.Extra)
+			{
+				if (group == VoiceGroup.Mob)
+				{
+					group2 = AudioMixerMgr.Group.VoiceMob;
+					soundType = AudioSourceMgr.Type.VoiceMob;
+				}
+			}
+			else
+			{
+				group2 = AudioMixerMgr.Group.VoiceExtra;
+				soundType = AudioSourceMgr.Type.VoiceExtra;
+			}
+		}
+		else
+		{
+			group2 = AudioMixerMgr.Group.VoiceSub;
+			soundType = AudioSourceMgr.Type.VoiceSub;
+		}
+		SoundMgr soundMgr = GameMain.Instance.SoundMgr;
+		AudioMixerGroup audioMixerGroup = soundMgr.mix_mgr[group2];
+		AudioSource audiosource = this.maid.AudioMan.audiosource;
+		if (audiosource.outputAudioMixerGroup != audioMixerGroup)
+		{
+			bool threeD = soundMgr.GetThreeD(this.maid.AudioMan.SoundType);
+			soundMgr.SetThreeD(this.maid.AudioMan.SoundType, false);
+			this.maid.AudioMan.ApplyThreeD();
+			soundMgr.SetThreeD(this.maid.AudioMan.SoundType, threeD);
+			this.maid.AudioMan.SoundType = soundType;
+			audiosource.outputAudioMixerGroup = audioMixerGroup;
+			this.maid.AudioMan.ApplyThreeD();
+		}
+	}
+
 	public FullBodyIKCtrl IKCtrl
 	{
 		get
@@ -257,6 +303,7 @@ public class TBody : MonoBehaviour
 			this.m_AudioParent = this.trsNeck.gameObject.AddComponent<AudioSourceParent>();
 			this.m_AudioParent.AttachVoice(this.trsNeck, new AudioSourceParent.dgOnDettach(this.OnDetattchVoice));
 			this.SetVoicePitch(this.maid.VoicePitch);
+			this.SetVoiceGroup(this.maid.status.voiceGroup);
 			Debug.Log(this.maid.name + " Voice割り当て");
 		}
 		this.quaDefHead = this.trsHead.localRotation;
@@ -2950,6 +2997,21 @@ public class TBody : MonoBehaviour
 		}
 	}
 
+	private void OnDrawGizmos()
+	{
+		if (this.m_drawBodyHitSphere)
+		{
+			for (int i = 0; i < this.goSlot.Count; i++)
+			{
+				TBodySkin tbodySkin = this.goSlot[i];
+				if (tbodySkin != null && tbodySkin.m_ParentMPN == MPN.wear)
+				{
+					tbodySkin.bonehair.DrawGizmos();
+				}
+			}
+		}
+	}
+
 	private bool m_bIsLoadedBody;
 
 	private AudioSourceParent m_AudioParent;
@@ -3494,6 +3556,8 @@ public class TBody : MonoBehaviour
 
 	private bool m_bManMeshHide;
 
+	public bool m_drawBodyHitSphere;
+
 	private Dictionary<string, TBody.TexLay.Mat> m_dicLaySlot = new Dictionary<string, TBody.TexLay.Mat>();
 
 	private TBody.MaskMode m_eMaskMode;

+ 27 - 25
Assembly-CSharp/TBodySkin.cs

@@ -498,18 +498,6 @@ public class TBodySkin
 				}
 			}
 		}
-		if (this.body.m_bNewPhyscs)
-		{
-			if (!this.bonehair2.InitGameObject(gameObject, mpn))
-			{
-				bool bNoSkirt = this.bonehair3.InitGameObject(gameObject, mpn);
-				this.bonehair.SearchGameObj(gameObject, bNoSkirt);
-			}
-		}
-		else
-		{
-			this.bonehair.SearchGameObj(gameObject, false);
-		}
 		this.morph.InitGameObject(gameObject);
 		gameObject.transform.parent = CMT.SearchObjName(srcbody, bonename, true);
 		Vector3 localPosition = gameObject.transform.localPosition;
@@ -540,6 +528,18 @@ public class TBodySkin
 		body1.position = position2;
 		body1.rotation = rotation2;
 		body1.localScale = localScale2;
+		if (this.body.m_bNewPhyscs)
+		{
+			if (!this.bonehair2.InitGameObject(gameObject, mpn))
+			{
+				bool bNoSkirt = this.bonehair3.InitGameObject(gameObject, mpn);
+				this.bonehair.SearchGameObj(gameObject, bNoSkirt);
+			}
+		}
+		else
+		{
+			this.bonehair.SearchGameObj(gameObject, false);
+		}
 		this.ItemScaleReset();
 		this.OnChangeScreenSizeOrAA();
 		if (this.m_bMan)
@@ -1124,12 +1124,12 @@ public class TBodySkin
 			{
 				NDebug.Assert("髪ボーン検索タイプが不正です。 " + f_strBoneSearchType, false);
 			}
-			this.SearchObjName(f_strGroupName, this.m_tbskin.obj_tr, new Regex(pattern), mode);
+			this.SearchObjAndAdd(f_strGroupName, this.m_tbskin.obj_tr, new Regex(pattern), mode, f_vScaleMin, f_vScaleMax);
 			TBodySkin.HairLengthCtrl.HairLength hairLength;
-			if (this.m_dicHairLenght.TryGetValue(f_strGroupName, out hairLength))
+			if (!this.m_dicHairLenght.TryGetValue(f_strGroupName, out hairLength))
 			{
-				hairLength.vScaleMin = f_vScaleMin;
-				hairLength.vScaleMax = f_vScaleMax;
+				Debug.LogError("髪ボーングループがありません。");
+				return;
 			}
 			float lengthRate = 0.5f;
 			if (this.m_maid.GetHairLengthFromMP(this.m_tbskin.m_ParentMPN, this.m_tbskin.SlotId, f_strGroupName, out lengthRate))
@@ -1143,7 +1143,7 @@ public class TBodySkin
 			this.HairLenghtBlend();
 		}
 
-		private Transform SearchObjName(string f_strGroupName, Transform t, Regex regex, TBodySkin.HairLengthCtrl.SerchMode mode)
+		private Transform SearchObjAndAdd(string f_strGroupName, Transform t, Regex regex, TBodySkin.HairLengthCtrl.SerchMode mode, Vector3 f_vScaleMin, Vector3 f_vScaleMax)
 		{
 			string name = t.name;
 			if (regex.IsMatch(name))
@@ -1157,7 +1157,9 @@ public class TBodySkin
 				hairLength.listTarget.Add(new TBodySkin.HairLengthCtrl.HairLengthTarget
 				{
 					trTarget = t,
-					vScaleDef = t.localScale
+					vScaleDef = t.localScale,
+					vScaleMin = f_vScaleMin,
+					vScaleMax = f_vScaleMax
 				});
 				if (mode == TBodySkin.HairLengthCtrl.SerchMode.FIRST_BROTHER || mode == TBodySkin.HairLengthCtrl.SerchMode.FIRST_CHILD)
 				{
@@ -1167,7 +1169,7 @@ public class TBodySkin
 			for (int i = 0; i < t.childCount; i++)
 			{
 				Transform child = t.GetChild(i);
-				Transform transform = this.SearchObjName(f_strGroupName, child, regex, mode);
+				Transform transform = this.SearchObjAndAdd(f_strGroupName, child, regex, mode, f_vScaleMin, f_vScaleMax);
 				if (transform != null && mode == TBodySkin.HairLengthCtrl.SerchMode.FIRST_CHILD)
 				{
 					return transform;
@@ -1187,11 +1189,11 @@ public class TBodySkin
 					Vector3 localScale = hairLengthTarget.vScaleDef;
 					if (lengthRate < 0.5f)
 					{
-						localScale = Vector3.Lerp(keyValuePair.Value.vScaleMin, hairLengthTarget.vScaleDef, lengthRate / 0.5f);
+						localScale = Vector3.Lerp(hairLengthTarget.vScaleMin, hairLengthTarget.vScaleDef, lengthRate / 0.5f);
 					}
 					else if (0.5f < lengthRate)
 					{
-						localScale = Vector3.Lerp(hairLengthTarget.vScaleDef, keyValuePair.Value.vScaleMax, (lengthRate - 0.5f) / 0.5f);
+						localScale = Vector3.Lerp(hairLengthTarget.vScaleDef, hairLengthTarget.vScaleMax, (lengthRate - 0.5f) / 0.5f);
 					}
 					hairLengthTarget.trTarget.localScale = localScale;
 				}
@@ -1209,6 +1211,10 @@ public class TBodySkin
 			public Transform trTarget;
 
 			public Vector3 vScaleDef;
+
+			public Vector3 vScaleMin;
+
+			public Vector3 vScaleMax;
 		}
 
 		public class HairLength
@@ -1240,10 +1246,6 @@ public class TBodySkin
 
 			private float fLenghtRate = 0.5f;
 
-			public Vector3 vScaleMin;
-
-			public Vector3 vScaleMax;
-
 			public List<TBodySkin.HairLengthCtrl.HairLengthTarget> listTarget = new List<TBodySkin.HairLengthCtrl.HairLengthTarget>();
 		}
 

+ 15 - 0
Assembly-CSharp/TBoneHair_.cs

@@ -357,6 +357,21 @@ public class TBoneHair_
 		}
 	}
 
+	public void DrawGizmos()
+	{
+		if (this.bodyhit == null)
+		{
+			return;
+		}
+		foreach (THitSphere thitSphere in this.bodyhit.spherelist)
+		{
+			if (thitSphere.t != null)
+			{
+				Gizmos.DrawWireSphere(thitSphere.t.TransformPoint(thitSphere.vs), thitSphere.len);
+			}
+		}
+	}
+
 	private Transform JumpChkT;
 
 	private Vector3 JumpChkPos = new Vector3(0f, 0f, 0f);

+ 2 - 3
Assembly-CSharp/UserEditAPI.cs

@@ -54,7 +54,7 @@ public class UserEditAPI
 					if (smenuItem.m_boDelOnly)
 					{
 					}
-					if (!(smenuItem.m_texIcon == null))
+					if (!(smenuItem.m_texIconRef == null))
 					{
 						if (smenuItem.m_bMan)
 						{
@@ -99,8 +99,7 @@ public class UserEditAPI
 		}
 		foreach (SceneEdit.SMenuItem smenuItem in this.m_listHead)
 		{
-			UnityEngine.Object.Destroy(smenuItem.m_texIcon);
-			UnityEngine.Object.Destroy(smenuItem.m_texIconRandomColor);
+			UnityEngine.Object.Destroy(smenuItem.m_texIconRef);
 		}
 		this.m_listHead.Clear();
 		if (this.m_man != null)

+ 1 - 1
Assembly-CSharp/UserEditMgr.cs

@@ -103,7 +103,7 @@ public class UserEditMgr : BaseCreatePanel
 			{
 				UserEditCtrl.HeadButton headButton = new UserEditCtrl.HeadButton();
 				headButton.name = smenuItem.m_strMenuFileName;
-				headButton.headIcon = smenuItem.m_texIcon;
+				headButton.headIcon = smenuItem.m_texIconRef;
 				headButton.item = smenuItem;
 				if (!dictionary.ContainsKey(headButton.name))
 				{

+ 1 - 1
Assembly-CSharp/VRRentalMaidMenu.cs

@@ -84,7 +84,7 @@ public class VRRentalMaidMenu : MonoBehaviour
 		GameMain.Instance.CharacterMgr.status.SetFlag(this.m_NowFlagName, 1);
 		if (!string.IsNullOrEmpty(this.m_VoiceFileName))
 		{
-			GameMain.Instance.SoundMgr.PlayDummyVoice(this.m_VoiceFileName + ".ogg", 0f, false, false, 50);
+			GameMain.Instance.SoundMgr.PlayDummyVoice(this.m_VoiceFileName + ".ogg", 0f, false, false, 50, AudioSourceMgr.Type.Voice);
 		}
 		GameMain.Instance.ScriptMgr.LoadAdvScenarioScript("HAN_main_0004.ks", string.Empty);
 		GameMain.Instance.ScriptMgr.adv_kag.JumpLabel("*rentalmaid_ok");

+ 33 - 0
Assembly-CSharp/VsDanceDataMgr.cs

@@ -218,6 +218,37 @@ public class VsDanceDataMgr
 					this.ClearReleaseList.Add(int.Parse(s));
 				}
 			}
+			this.BattlePersonalList = new List<string>();
+			string cellAsString3 = csv.GetCellAsString(num++, cy);
+			if (!string.IsNullOrEmpty(cellAsString3))
+			{
+				foreach (string item in cellAsString3.Split(new char[]
+				{
+					','
+				}))
+				{
+					this.BattlePersonalList.Add(item);
+				}
+			}
+			else
+			{
+				this.BattlePersonalList = new List<string>
+				{
+					"Muku",
+					"Majime",
+					"Rindere"
+				};
+			}
+		}
+
+		public bool IsCanBattleParticipate(Maid maid)
+		{
+			if (!maid.status.mainChara)
+			{
+				return false;
+			}
+			string uniqueName = maid.status.personal.uniqueName;
+			return this.BattlePersonalList.Contains(uniqueName);
 		}
 
 		public readonly int ID;
@@ -229,5 +260,7 @@ public class VsDanceDataMgr
 		public readonly int Music2ndID;
 
 		public readonly List<int> ClearReleaseList;
+
+		public readonly List<string> BattlePersonalList;
 	}
 }

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

+ 8 - 1
Assembly-CSharp/YotogiKagManager.cs

@@ -208,7 +208,14 @@ public class YotogiKagManager : BaseKagManager
 		}
 		else
 		{
-			GameMain.Instance.SoundMgr.PlayDummyVoice(file, 0f, false, false, 50);
+			int voice_pitch = 50;
+			AudioSourceMgr.Type soundType = AudioSourceMgr.Type.Voice;
+			if (maid != null)
+			{
+				voice_pitch = maid.VoicePitch;
+				soundType = maid.AudioMan.SoundType;
+			}
+			GameMain.Instance.SoundMgr.PlayDummyVoice(file, 0f, false, false, voice_pitch, soundType);
 		}
 	}
 

+ 1 - 1
Assembly-CSharp/YotogiManager.cs

@@ -646,7 +646,7 @@ public class YotogiManager : WfScreenManager
 			for (int i = 0; i < keyArray.Length; i++)
 			{
 				Skill.Data data = Skill.Get(keyArray[i]);
-				if (data.specialConditionType != Skill.Data.SpecialConditionType.NewType)
+				if (data.specialConditionType != Skill.Data.SpecialConditionType.NewType && data.specialConditionType != Skill.Data.SpecialConditionType.GP01Recollect)
 				{
 					if (!hashSet.Contains(data.player_num))
 					{

+ 1 - 1
Assembly-CSharp/YotogiOldSkillSelectWaitMotion.cs

@@ -83,7 +83,7 @@ public static class YotogiOldSkillSelectWaitMotion
 			scriptMgr.is_motion_blend = false;
 			bool compatibilityMode = scriptMgr.compatibilityMode;
 			scriptMgr.compatibilityMode = true;
-			scriptMgr.LoadMotionScript(0, false, data.motion_script_file, data.motion_script_label, string.Empty, string.Empty, false, true);
+			scriptMgr.LoadMotionScript(0, false, data.motion_script_file, data.motion_script_label, string.Empty, string.Empty, false, true, false);
 			scriptMgr.compatibilityMode = compatibilityMode;
 			scriptMgr.is_motion_blend = true;
 			maid.FaceAnime(data.face_name, 0f, 0);

+ 3 - 6
Assembly-CSharp/YotogiResultManager.cs

@@ -124,14 +124,11 @@ public class YotogiResultManager : WfScreenChildren
 		foreach (int id3 in hashSet4)
 		{
 			Skill.Data data = Skill.Get(id3);
-			if (data.specialConditionType != Skill.Data.SpecialConditionType.Faint && data.specialConditionType != Skill.Data.SpecialConditionType.NewType)
+			if (data.IsResultDisplay(lockNTRPlay))
 			{
-				if (!lockNTRPlay || (data.category != Yotogi.Category.交換 && data.category != Yotogi.Category.乱交))
+				if (data.IsExecSeikeiken(this.maid_.status.seikeiken))
 				{
-					if (data.IsExecSeikeiken(this.maid_.status.seikeiken))
-					{
-						this.AddAcquiredSkill(data.name);
-					}
+					this.AddAcquiredSkill(data.name);
 				}
 			}
 		}

+ 1 - 5
Assembly-CSharp/YotogiSkillListManager.cs

@@ -134,11 +134,7 @@ public class YotogiSkillListManager : MonoBehaviour
 			YotogiSkillListManager.Data value = keyValuePair.Value;
 			if (value.skillData != null)
 			{
-				if (value.skillData.specialConditionType == Skill.Data.SpecialConditionType.Faint || value.skillData.specialConditionType == Skill.Data.SpecialConditionType.NewType)
-				{
-					continue;
-				}
-				if (lockNTRPlay && (value.skillData.category == Yotogi.Category.交換 || value.skillData.category == Yotogi.Category.乱交))
+				if (!value.skillData.IsSkillListDisplay(lockNTRPlay))
 				{
 					continue;
 				}

+ 1 - 1
Assembly-CSharp/YotogiSkillSelectWaitMotion.cs

@@ -57,7 +57,7 @@ public static class YotogiSkillSelectWaitMotion
 			YotogiSkillSelectWaitMotion.Data data = YotogiSkillSelectWaitMotion.GetData(maid);
 			ScriptManager scriptMgr = GameMain.Instance.ScriptMgr;
 			scriptMgr.is_motion_blend = false;
-			scriptMgr.LoadMotionScript(0, false, data.motion_script_file, data.motion_script_label, string.Empty, string.Empty, false, true);
+			scriptMgr.LoadMotionScript(0, false, data.motion_script_file, data.motion_script_label, string.Empty, string.Empty, false, true, false);
 			scriptMgr.is_motion_blend = true;
 			maid.FaceAnime(data.face_name, 0f, 0);
 			maid.FaceBlend("無し");

+ 26 - 3
Assembly-CSharp/Yotogis/Skill.cs

@@ -1166,6 +1166,15 @@ namespace Yotogis
 				{
 					this.player_num = 1;
 				}
+				this.user_player_num = this.player_num;
+				if (csv.IsCellToExistData(num, y))
+				{
+					this.user_player_num = csv.GetCellAsInteger(num++, y);
+				}
+				else
+				{
+					num++;
+				}
 				cellAsString = csv.GetCellAsString(num++, y);
 				string[] array2 = cellAsString.Split(new char[]
 				{
@@ -1297,7 +1306,7 @@ namespace Yotogis
 					string cellAsString3 = csv.GetCellAsString(num++, y);
 					if (string.IsNullOrEmpty(cellAsString2))
 					{
-						IL_5AC:
+						IL_5E0:
 						NDebug.Assert(command_data_cell_dic.ContainsKey(this.id), this.name + "の情報は見つかりませんでした");
 						int[] array8 = command_data_cell_dic[this.id];
 						this.command_basic_cell_y = array8[0];
@@ -1360,7 +1369,7 @@ namespace Yotogis
 						this.playable_stageid_list.Add(YotogiStage.uniqueNameToId(cellAsString2));
 					}
 				}
-				goto IL_5AC;
+				goto IL_5E0;
 			}
 
 			public void SetOldSkillData(Skill.Old.Data data)
@@ -1490,6 +1499,17 @@ namespace Yotogis
 				return this.playable_stageid_list.Contains(stageData.id);
 			}
 
+			public bool IsResultDisplay(bool lockNTRPlay)
+			{
+				Skill.Data.SpecialConditionType specialConditionType = this.specialConditionType;
+				return specialConditionType != Skill.Data.SpecialConditionType.Faint && specialConditionType != Skill.Data.SpecialConditionType.NewType && specialConditionType != Skill.Data.SpecialConditionType.GP01Recollect && (!lockNTRPlay || (this.category != Yotogi.Category.交換 && this.category != Yotogi.Category.乱交));
+			}
+
+			public bool IsSkillListDisplay(bool lockNTRPlay)
+			{
+				return this.specialConditionType != Skill.Data.SpecialConditionType.Faint && this.specialConditionType != Skill.Data.SpecialConditionType.NewType && this.specialConditionType != Skill.Data.SpecialConditionType.GP01Recollect && (!lockNTRPlay || (this.category != Yotogi.Category.交換 && this.category != Yotogi.Category.乱交));
+			}
+
 			public Skill.Data.Command command
 			{
 				get
@@ -1571,6 +1591,8 @@ namespace Yotogis
 
 			public readonly int player_num;
 
+			public readonly int user_player_num;
+
 			public readonly KeyValuePair<int, string>[] man_setting;
 
 			public readonly int command_basic_cell_x;
@@ -2067,7 +2089,8 @@ namespace Yotogis
 				Drug,
 				Faint,
 				Confess,
-				NewType
+				NewType,
+				GP01Recollect
 			}
 
 			public class GetConditionData : SkillAcquisitionCondition

+ 48 - 0
Assembly-CSharp/config/ui/IntegerSlider.cs

@@ -0,0 +1,48 @@
+using System;
+using wf.ui;
+
+namespace config.ui
+{
+	public class IntegerSlider : NGUISlider<int>
+	{
+		protected int srcValue
+		{
+			get
+			{
+				return (this.onGetValue == null) ? 0 : this.onGetValue();
+			}
+			set
+			{
+				if (this.onSetValue != null)
+				{
+					this.onSetValue(value);
+				}
+			}
+		}
+
+		public override float srcValueToSliderValue
+		{
+			get
+			{
+				return (float)Math.Round((double)((float)this.srcValue / 100f), 2, MidpointRounding.AwayFromZero);
+			}
+		}
+
+		public override int sliderValueToSrcValue
+		{
+			get
+			{
+				return (int)Math.Ceiling((double)(this.slider.value * 100f));
+			}
+		}
+
+		protected override void OnChangeSliderValue()
+		{
+			this.srcValue = this.sliderValueToSrcValue;
+		}
+
+		public Func<int> onGetValue;
+
+		public Action<int> onSetValue;
+	}
+}

+ 4 - 0
Assembly-CSharp/jiggleBone.cs

@@ -155,6 +155,10 @@ public class jiggleBone : MonoBehaviour
 		}
 		else
 		{
+			if (0f < this.BlendValueON)
+			{
+				base.transform.localRotation = this.defQtn;
+			}
 			this.m_fBackBlendValueON2 = -1f;
 			this.boWarpInit = true;
 		}

+ 139 - 0
Assembly-CSharp/wf/CsvCommonDatabaseIDType.cs

@@ -0,0 +1,139 @@
+using System;
+using System.Collections.Generic;
+
+namespace wf
+{
+	public abstract class CsvCommonDatabaseIDType<Data>
+	{
+		public abstract string csvTopCommonName { get; }
+
+		public abstract string typeNameForErrorLog { get; }
+
+		public int Count
+		{
+			get
+			{
+				this.Initialize();
+				return this.commonIdManager.idMap.Count;
+			}
+		}
+
+		public bool Contains(int id)
+		{
+			return this.commonIdManager.idMap.ContainsKey(id);
+		}
+
+		public Data GetData(int id)
+		{
+			this.Initialize();
+			NDebug.Assert(this.basicDatas.ContainsKey(id), string.Concat(new object[]
+			{
+				this.typeNameForErrorLog,
+				"\nID[",
+				id,
+				"]のデータは存在しません"
+			}));
+			return this.basicDatas[id];
+		}
+
+		public List<Data> GetAllDatas(bool onlyEnabled)
+		{
+			this.Initialize();
+			List<Data> list = new List<Data>();
+			foreach (KeyValuePair<int, KeyValuePair<string, string>> keyValuePair in this.commonIdManager.idMap)
+			{
+				if (!onlyEnabled || this.commonIdManager.enabledIdList.Contains(keyValuePair.Key))
+				{
+					list.Add(this.basicDatas[keyValuePair.Key]);
+				}
+			}
+			return list;
+		}
+
+		public bool IsEnabled(int id)
+		{
+			this.Initialize();
+			return this.commonIdManager.enabledIdList.Contains(id);
+		}
+
+		public virtual bool Initialize()
+		{
+			if (this.commonIdManager != null)
+			{
+				return false;
+			}
+			this.commonIdManager = new CsvCommonIdManager(this.csvTopCommonName, this.typeNameForErrorLog, CsvCommonIdManager.Type.IdOnly, null);
+			this.basicDatas = this.CreateData(this.commonIdManager);
+			return true;
+		}
+
+		protected abstract Dictionary<int, Data> CreateData(CsvCommonIdManager createIds);
+
+		public CsvCommonDatabaseIDType<Data>.CsvPair OpenCsvFromNameSuffix(string nameSuffix)
+		{
+			return this.OpenCsv(this.csvTopCommonName + "_" + nameSuffix + ".csv");
+		}
+
+		public CsvCommonDatabaseIDType<Data>.CsvPair OpenCsv(string fileName)
+		{
+			bool flag;
+			return new CsvCommonDatabaseIDType<Data>.CsvPair(fileName, ref flag);
+		}
+
+		protected CsvCommonIdManager commonIdManager;
+
+		protected Dictionary<int, Data> basicDatas;
+
+		public class CsvPair : IDisposable
+		{
+			public CsvPair(string fileName, out bool openResult)
+			{
+				this.file = GameUty.FileSystem.FileOpen(fileName);
+				this.csv = new CsvParser();
+				openResult = (this.file != null && this.csv.Open(this.file));
+			}
+
+			public CsvPair(string fileName)
+			{
+				this.file = GameUty.FileSystem.FileOpen(fileName);
+				this.csv = new CsvParser();
+				this.csv.Open(this.file);
+			}
+
+			public CsvPair()
+			{
+			}
+
+			~CsvPair()
+			{
+				this.Dispose();
+			}
+
+			public void Dispose()
+			{
+				if (this.isDisposed)
+				{
+					return;
+				}
+				this.isDisposed = true;
+				if (this.file != null)
+				{
+					this.file.Dispose();
+				}
+				if (this.csv != null)
+				{
+					this.csv.Dispose();
+				}
+				this.file = null;
+				this.csv = null;
+				GC.SuppressFinalize(this);
+			}
+
+			public AFileBase file;
+
+			public CsvParser csv;
+
+			private bool isDisposed;
+		}
+	}
+}

+ 54 - 0
Assembly-CSharp/wf/CsvCommonDatabaseUniqueType.cs

@@ -0,0 +1,54 @@
+using System;
+
+namespace wf
+{
+	public abstract class CsvCommonDatabaseUniqueType<Data> : CsvCommonDatabaseIDType<Data>
+	{
+		public bool Contains(string name)
+		{
+			return this.commonIdManager.nameMap.ContainsKey(name);
+		}
+
+		public int uniqueNameToId(string name)
+		{
+			this.Initialize();
+			NDebug.Assert(this.commonIdManager.nameMap.ContainsKey(name), this.typeNameForErrorLog + "\nユニーク名[" + name + "]をIDに変換できませんでした");
+			return this.commonIdManager.nameMap[name];
+		}
+
+		public string IdToUniqueName(int id)
+		{
+			this.Initialize();
+			NDebug.Assert(this.commonIdManager.idMap.ContainsKey(id), string.Concat(new object[]
+			{
+				this.typeNameForErrorLog,
+				"\nID[",
+				id,
+				"]をユニーク名に変換できませんでした"
+			}));
+			return this.commonIdManager.idMap[id].Key;
+		}
+
+		public Data GetData(string uniqueName)
+		{
+			return base.GetData(this.uniqueNameToId(uniqueName));
+		}
+
+		public bool IsEnabled(string uniqueName)
+		{
+			this.Initialize();
+			return this.commonIdManager.enabledIdList.Contains(this.uniqueNameToId(uniqueName));
+		}
+
+		public override bool Initialize()
+		{
+			if (this.commonIdManager != null)
+			{
+				return false;
+			}
+			this.commonIdManager = new CsvCommonIdManager(this.csvTopCommonName, this.typeNameForErrorLog, CsvCommonIdManager.Type.IdAndUniqueName, null);
+			this.basicDatas = this.CreateData(this.commonIdManager);
+			return true;
+		}
+	}
+}

+ 24 - 0
Assembly-CSharp/wf/ui/AbstractSliderWrapper.cs

@@ -0,0 +1,24 @@
+using System;
+
+namespace wf.ui
+{
+	public abstract class AbstractSliderWrapper<T>
+	{
+		public abstract T slider { get; }
+
+		public abstract float srcValueToSliderValue { get; }
+
+		public virtual void Initialize(T setSlider)
+		{
+			this.slider_ = setSlider;
+		}
+
+		public abstract void UpdateSlider();
+
+		protected abstract void OnChangeSliderValue();
+
+		public Action<AbstractSliderWrapper<T>> onChangeSliderValue;
+
+		protected T slider_;
+	}
+}

+ 50 - 0
Assembly-CSharp/wf/ui/NGUISlider.cs

@@ -0,0 +1,50 @@
+using System;
+using UnityEngine;
+
+namespace wf.ui
+{
+	public abstract class NGUISlider<T> : AbstractSliderWrapper<UISlider>
+	{
+		public override UISlider slider
+		{
+			get
+			{
+				return this.slider_;
+			}
+		}
+
+		public abstract T sliderValueToSrcValue { get; }
+
+		public override void Initialize(UISlider set_slider)
+		{
+			base.Initialize(set_slider);
+			this.slider.onChange.Clear();
+			this.UpdateSlider();
+			EventDelegate.Add(this.slider.onChange, new EventDelegate(new EventDelegate.Callback(this.OncChange)));
+		}
+
+		protected void OncChange()
+		{
+			this.OnChangeSliderValue();
+			if (this.onChangeSliderValue != null)
+			{
+				this.onChangeSliderValue(this);
+			}
+		}
+
+		public override void UpdateSlider()
+		{
+			if (this.slider == null)
+			{
+				return;
+			}
+			float srcValueToSliderValue = this.srcValueToSliderValue;
+			if (!Mathf.Approximately(srcValueToSliderValue, this.slider.value))
+			{
+				this.slider.value = srcValueToSliderValue;
+			}
+		}
+
+		protected T num_ = default(T);
+	}
+}