MessageWindowManager.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. using UnityEngine;
  2. namespace COM3D2.MeidoPhotoStudio.Plugin
  3. {
  4. internal class MessageWindowManager : IManager, ISerializable
  5. {
  6. public const string header = "TEXTBOX";
  7. public static readonly SliderProp fontBounds = new SliderProp(25f, 60f);
  8. private static GameObject sysRoot;
  9. private readonly MessageClass msgClass;
  10. private readonly MessageWindowMgr msgWnd;
  11. private readonly UILabel msgLabel;
  12. private readonly UILabel nameLabel;
  13. private readonly GameObject msgGameObject;
  14. public bool ShowingMessage { get; private set; }
  15. private string messageName;
  16. private string messageText;
  17. static MessageWindowManager()
  18. {
  19. InputManager.Register(MpsKey.ToggleMessage, KeyCode.M, "Show/hide message box");
  20. }
  21. public MessageWindowManager()
  22. {
  23. sysRoot = GameObject.Find("__GameMain__/SystemUI Root");
  24. msgWnd = GameMain.Instance.MsgWnd;
  25. msgGameObject = sysRoot.transform.Find("MessageWindowPanel").gameObject;
  26. msgClass = new MessageClass(msgGameObject, msgWnd);
  27. nameLabel = UTY.GetChildObject(msgGameObject, "MessageViewer/MsgParent/SpeakerName/Name", false)
  28. .GetComponent<UILabel>();
  29. msgLabel = UTY.GetChildObject(msgGameObject, "MessageViewer/MsgParent/Message", false)
  30. .GetComponent<UILabel>();
  31. Utility.SetFieldValue(msgClass, "message_label_", msgLabel);
  32. Utility.SetFieldValue(msgClass, "name_label_", nameLabel);
  33. }
  34. public void Activate() => SetPhotoMessageWindowActive(true);
  35. public void Deactivate()
  36. {
  37. msgWnd.CloseMessageWindowPanel();
  38. SetPhotoMessageWindowActive(false);
  39. }
  40. public void Serialize(System.IO.BinaryWriter binaryWriter)
  41. {
  42. binaryWriter.Write(header);
  43. binaryWriter.Write(ShowingMessage);
  44. binaryWriter.Write(msgLabel.fontSize);
  45. binaryWriter.WriteNullableString(messageName);
  46. binaryWriter.WriteNullableString(messageText);
  47. }
  48. public void Deserialize(System.IO.BinaryReader binaryReader)
  49. {
  50. CloseMessagePanel();
  51. bool showingMessage = binaryReader.ReadBoolean();
  52. msgLabel.fontSize = binaryReader.ReadInt32();
  53. messageName = binaryReader.ReadNullableString();
  54. messageText = binaryReader.ReadNullableString();
  55. if (showingMessage) ShowMessage(messageName, messageText);
  56. }
  57. public void Update() { }
  58. private void SetPhotoMessageWindowActive(bool active)
  59. {
  60. UTY.GetChildObject(msgGameObject, "MessageViewer/MsgParent/MessageBox", false)
  61. .SetActive(active);
  62. UTY.GetChildObject(msgGameObject, "MessageViewer/MsgParent/Hitret", false)
  63. .GetComponent<UISprite>().enabled = !active;
  64. nameLabel.gameObject.SetActive(active);
  65. msgLabel.gameObject.SetActive(active);
  66. Transform transform = sysRoot.transform.Find("MessageWindowPanel/MessageViewer/MsgParent/Buttons");
  67. MessageWindowMgr.MessageWindowUnderButton[] msgButtons = new[]
  68. {
  69. MessageWindowMgr.MessageWindowUnderButton.Skip,
  70. MessageWindowMgr.MessageWindowUnderButton.Auto,
  71. MessageWindowMgr.MessageWindowUnderButton.Voice,
  72. MessageWindowMgr.MessageWindowUnderButton.BackLog,
  73. MessageWindowMgr.MessageWindowUnderButton.Config
  74. };
  75. foreach (MessageWindowMgr.MessageWindowUnderButton msgButton in msgButtons)
  76. {
  77. transform.Find(msgButton.ToString()).gameObject.SetActive(!active);
  78. }
  79. if (msgClass.subtitles_manager_ != null)
  80. {
  81. msgClass.subtitles_manager_.visible = false;
  82. msgClass.subtitles_manager_ = null;
  83. }
  84. }
  85. public void ShowMessage(string name, string message)
  86. {
  87. messageName = name;
  88. messageText = message;
  89. ShowingMessage = true;
  90. msgWnd.OpenMessageWindowPanel();
  91. msgLabel.ProcessText();
  92. msgClass.SetText(name, message, "", 0, AudioSourceMgr.Type.System);
  93. msgClass.FinishChAnime();
  94. }
  95. public void SetFontSize(int fontSize) => msgLabel.fontSize = fontSize;
  96. public void CloseMessagePanel()
  97. {
  98. ShowingMessage = false;
  99. msgWnd.CloseMessageWindowPanel();
  100. }
  101. }
  102. }