MaidDressingPane.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using UnityEngine;
  6. using static TBody;
  7. namespace COM3D2.MeidoPhotoStudio.Plugin
  8. {
  9. public class MaidDressingPane : BasePane
  10. {
  11. private MeidoManager meidoManager;
  12. private Dictionary<SlotID, Toggle> ClothingToggles;
  13. private Dictionary<SlotID, bool> LoadedSlots;
  14. public enum Curl
  15. {
  16. front, back, shift
  17. }
  18. private static readonly SlotID[] clothingSlots = {
  19. // main slots
  20. SlotID.wear, SlotID.skirt, SlotID.bra, SlotID.panz, SlotID.headset, SlotID.megane,
  21. SlotID.accUde, SlotID.glove, SlotID.accSenaka, SlotID.stkg, SlotID.shoes, SlotID.body,
  22. // detailed slots
  23. SlotID.accAshi, SlotID.accHana, SlotID.accHat, SlotID.accHeso, SlotID.accKamiSubL,
  24. SlotID.accKamiSubR, SlotID.accKami_1_, SlotID.accKami_2_, SlotID.accKami_3_, SlotID.accKubi,
  25. SlotID.accKubiwa, SlotID.accMiMiL, SlotID.accMiMiR, SlotID.accNipL, SlotID.accNipR,
  26. SlotID.accShippo, SlotID.accXXX,
  27. // unused slots
  28. // SlotID.mizugi, SlotID.onepiece, SlotID.accHead,
  29. };
  30. public static readonly SlotID[] bodySlots = {
  31. SlotID.body, SlotID.head, SlotID.eye, SlotID.hairF, SlotID.hairR,
  32. SlotID.hairS, SlotID.hairT, SlotID.hairAho, SlotID.chikubi, SlotID.underhair,
  33. SlotID.moza, SlotID.accHa
  34. };
  35. private static readonly SlotID[] wearSlots = {
  36. SlotID.wear, SlotID.mizugi, SlotID.onepiece
  37. };
  38. private static readonly SlotID[] headwearSlots = {
  39. SlotID.headset, SlotID.accHat, SlotID.accKamiSubL,
  40. SlotID.accKamiSubR, SlotID.accKami_1_, SlotID.accKami_2_, SlotID.accKami_3_
  41. };
  42. private Toggle detailedClothingToggle;
  43. private Toggle curlingFrontToggle;
  44. private Toggle curlingBackToggle;
  45. private Toggle pantsuShiftToggle;
  46. private bool detailedClothing = false;
  47. public MaidDressingPane(MeidoManager meidoManager)
  48. {
  49. this.meidoManager = meidoManager;
  50. ClothingToggles = new Dictionary<SlotID, Toggle>(clothingSlots.Length);
  51. LoadedSlots = new Dictionary<SlotID, bool>(clothingSlots.Length);
  52. foreach (SlotID slot in clothingSlots)
  53. {
  54. Toggle slotToggle = new Toggle(Translation.Get("clothing", slot.ToString()));
  55. slotToggle.ControlEvent += (s, a) => ToggleClothing(slot, slotToggle.Value);
  56. ClothingToggles.Add(slot, slotToggle);
  57. LoadedSlots[slot] = true;
  58. }
  59. detailedClothingToggle = new Toggle(Translation.Get("clothing", "detail"));
  60. detailedClothingToggle.ControlEvent += (s, a) => UpdateDetailedClothing();
  61. curlingFrontToggle = new Toggle(Translation.Get("clothing", "curlingFront"));
  62. curlingFrontToggle.ControlEvent += (s, a) => ToggleCurling(Curl.front, curlingFrontToggle.Value);
  63. curlingBackToggle = new Toggle(Translation.Get("clothing", "curlingBack"));
  64. curlingBackToggle.ControlEvent += (s, a) => ToggleCurling(Curl.back, curlingBackToggle.Value);
  65. pantsuShiftToggle = new Toggle(Translation.Get("clothing", "shiftPanties"));
  66. pantsuShiftToggle.ControlEvent += (s, a) => ToggleCurling(Curl.shift, pantsuShiftToggle.Value);
  67. UpdateDetailedClothing();
  68. }
  69. protected override void ReloadTranslation()
  70. {
  71. foreach (SlotID slot in clothingSlots)
  72. {
  73. Toggle clothingToggle = ClothingToggles[slot];
  74. if (slot == SlotID.headset)
  75. {
  76. clothingToggle.Label = detailedClothing
  77. ? Translation.Get("clothing", "headset")
  78. : Translation.Get("clothing", "headwear");
  79. }
  80. else
  81. {
  82. clothingToggle.Label = Translation.Get("clothing", slot.ToString());
  83. }
  84. }
  85. detailedClothingToggle.Label = Translation.Get("clothing", "detail");
  86. curlingFrontToggle.Label = Translation.Get("clothing", "curlingFront");
  87. curlingBackToggle.Label = Translation.Get("clothing", "curlingBack");
  88. pantsuShiftToggle.Label = Translation.Get("clothing", "shiftPanties");
  89. }
  90. public void ToggleClothing(SlotID slot, bool enabled)
  91. {
  92. if (this.updating) return;
  93. if (slot == SlotID.body)
  94. {
  95. this.meidoManager.ActiveMeido.SetBodyMask(enabled);
  96. return;
  97. }
  98. TBody body = this.meidoManager.ActiveMeido.Maid.body0;
  99. if (!detailedClothing && slot == SlotID.headset)
  100. {
  101. this.updating = true;
  102. foreach (SlotID wearSlot in headwearSlots)
  103. {
  104. body.SetMask(wearSlot, enabled);
  105. ClothingToggles[wearSlot].Value = enabled;
  106. }
  107. this.updating = false;
  108. }
  109. else
  110. {
  111. if (slot == SlotID.wear)
  112. {
  113. foreach (SlotID wearSlot in wearSlots)
  114. {
  115. body.SetMask(wearSlot, enabled);
  116. }
  117. }
  118. else if (slot == SlotID.megane)
  119. {
  120. body.SetMask(SlotID.megane, enabled);
  121. body.SetMask(SlotID.accHead, enabled);
  122. }
  123. else body.SetMask(slot, enabled);
  124. }
  125. }
  126. public void ToggleCurling(Curl curl, bool enabled)
  127. {
  128. if (updating) return;
  129. Maid maid = this.meidoManager.ActiveMeido.Maid;
  130. string[] name = curl == Curl.shift
  131. ? new[] { "panz", "mizugi" }
  132. : new[] { "skirt", "onepiece" };
  133. if (enabled)
  134. {
  135. string action = curl == Curl.shift
  136. ? "パンツずらし"
  137. : curl == Curl.front
  138. ? "めくれスカート" : "めくれスカート後ろ";
  139. maid.ItemChangeTemp(name[0], action);
  140. maid.ItemChangeTemp(name[1], action);
  141. this.updating = true;
  142. if (curl == Curl.front && curlingBackToggle.Value)
  143. {
  144. curlingBackToggle.Value = false;
  145. }
  146. else if (curl == Curl.back && curlingFrontToggle.Value)
  147. {
  148. curlingFrontToggle.Value = false;
  149. }
  150. this.updating = false;
  151. }
  152. else
  153. {
  154. maid.ResetProp(name[0]);
  155. maid.ResetProp(name[1]);
  156. }
  157. maid.AllProcProp();
  158. }
  159. public override void Update()
  160. {
  161. if (!this.meidoManager.HasActiveMeido) return;
  162. this.updating = true;
  163. Maid maid = this.meidoManager.ActiveMeido.Maid;
  164. TBody body = maid.body0;
  165. foreach (SlotID clothingSlot in clothingSlots)
  166. {
  167. bool toggleValue = false;
  168. bool hasSlot = false;
  169. if (clothingSlot == SlotID.wear)
  170. {
  171. foreach (SlotID wearSlot in wearSlots)
  172. {
  173. if (body.GetMask(wearSlot)) toggleValue = true;
  174. if (body.GetSlotLoaded(wearSlot)) hasSlot = true;
  175. if (hasSlot && toggleValue) break;
  176. }
  177. }
  178. else if (clothingSlot == SlotID.megane)
  179. {
  180. toggleValue = body.GetMask(SlotID.megane) || body.GetMask(SlotID.accHead);
  181. hasSlot = body.GetSlotLoaded(SlotID.megane) || body.GetSlotLoaded(SlotID.accHead);
  182. }
  183. else if (!detailedClothing && clothingSlot == SlotID.headset)
  184. {
  185. foreach (SlotID headwearSlot in headwearSlots)
  186. {
  187. if (body.GetMask(headwearSlot)) toggleValue = true;
  188. if (body.GetSlotLoaded(headwearSlot)) hasSlot = true;
  189. if (hasSlot && toggleValue) break;
  190. }
  191. }
  192. else
  193. {
  194. toggleValue = body.GetMask(clothingSlot);
  195. hasSlot = body.GetSlotLoaded(clothingSlot);
  196. }
  197. ClothingToggles[clothingSlot].Value = hasSlot ? toggleValue : false;
  198. LoadedSlots[clothingSlot] = hasSlot;
  199. }
  200. curlingFrontToggle.Value = maid.IsItemChange("skirt", "めくれスカート")
  201. || maid.IsItemChange("onepiece", "めくれスカート");
  202. curlingBackToggle.Value = maid.IsItemChange("skirt", "めくれスカート後ろ")
  203. || maid.IsItemChange("onepiece", "めくれスカート後ろ");
  204. pantsuShiftToggle.Value = maid.IsItemChange("panz", "パンツずらし")
  205. || maid.IsItemChange("mizugi", "パンツずらし");
  206. this.updating = false;
  207. }
  208. private void DrawSlotGroup(params SlotID[] slots)
  209. {
  210. GUILayout.BeginHorizontal();
  211. for (int i = 0; i < slots.Length; i++)
  212. {
  213. SlotID slot = slots[i];
  214. if (!this.Enabled) GUI.enabled = false;
  215. else GUI.enabled = LoadedSlots[slot];
  216. ClothingToggles[slot].Draw();
  217. if (i < slots.Length - 1) GUILayout.FlexibleSpace();
  218. }
  219. GUILayout.EndHorizontal();
  220. }
  221. private void UpdateDetailedClothing()
  222. {
  223. detailedClothing = detailedClothingToggle.Value;
  224. ClothingToggles[SlotID.headset].Label = detailedClothing
  225. ? Translation.Get("clothing", "headset")
  226. : Translation.Get("clothing", "headwear");
  227. Update();
  228. }
  229. public override void Draw(params GUILayoutOption[] layoutOptions)
  230. {
  231. this.Enabled = this.meidoManager.HasActiveMeido;
  232. GUI.enabled = this.Enabled;
  233. detailedClothingToggle.Draw();
  234. MiscGUI.BlackLine();
  235. DrawSlotGroup(SlotID.wear, SlotID.skirt);
  236. DrawSlotGroup(SlotID.bra, SlotID.panz);
  237. DrawSlotGroup(SlotID.headset, SlotID.megane);
  238. DrawSlotGroup(SlotID.accUde, SlotID.glove, SlotID.accSenaka);
  239. DrawSlotGroup(SlotID.stkg, SlotID.shoes, SlotID.body);
  240. if (detailedClothing)
  241. {
  242. MiscGUI.BlackLine();
  243. DrawSlotGroup(SlotID.accShippo, SlotID.accHat);
  244. DrawSlotGroup(SlotID.accKami_1_, SlotID.accKami_2_, SlotID.accKami_3_);
  245. DrawSlotGroup(SlotID.accKamiSubL, SlotID.accKamiSubR);
  246. DrawSlotGroup(SlotID.accMiMiL, SlotID.accMiMiR);
  247. DrawSlotGroup(SlotID.accNipL, SlotID.accNipR);
  248. DrawSlotGroup(SlotID.accHana, SlotID.accKubi, SlotID.accKubiwa);
  249. DrawSlotGroup(SlotID.accHeso, SlotID.accAshi, SlotID.accXXX);
  250. }
  251. GUI.enabled = this.Enabled;
  252. GUILayout.BeginHorizontal();
  253. curlingFrontToggle.Draw();
  254. GUILayout.FlexibleSpace();
  255. curlingBackToggle.Draw();
  256. GUILayout.FlexibleSpace();
  257. pantsuShiftToggle.Draw();
  258. GUILayout.FlexibleSpace();
  259. GUILayout.EndHorizontal();
  260. }
  261. }
  262. }