BSEvents.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. using SongCore.Utilities;
  2. using System;
  3. using System.Linq;
  4. using UnityEngine;
  5. using UnityEngine.SceneManagement;
  6. namespace SongBrowser.Internals
  7. {
  8. class BSEvents : MonoBehaviour
  9. {
  10. static BSEvents Instance;
  11. //Scene Events
  12. public static event Action menuSceneActive;
  13. public static event Action menuSceneLoaded;
  14. public static event Action menuSceneLoadedFresh;
  15. public static event Action gameSceneActive;
  16. public static event Action gameSceneLoaded;
  17. // Menu Events
  18. public static event Action<StandardLevelDetailViewController, IDifficultyBeatmap> difficultySelected;
  19. public static event Action<BeatmapCharacteristicSegmentedControlController, BeatmapCharacteristicSO> characteristicSelected;
  20. public static event Action<LevelPacksViewController, IBeatmapLevelPack> levelPackSelected;
  21. public static event Action<LevelPackLevelsViewController, IBeatmapLevel> levelSelected;
  22. // Game Events
  23. public static event Action songPaused;
  24. public static event Action songUnpaused;
  25. public static event Action<StandardLevelScenesTransitionSetupDataSO, LevelCompletionResults> levelCleared;
  26. public static event Action<StandardLevelScenesTransitionSetupDataSO, LevelCompletionResults> levelQuit;
  27. public static event Action<StandardLevelScenesTransitionSetupDataSO, LevelCompletionResults> levelFailed;
  28. public static event Action<StandardLevelScenesTransitionSetupDataSO, LevelCompletionResults> levelRestarted;
  29. public static event Action<NoteData, NoteCutInfo, int> noteWasCut;
  30. public static event Action<NoteData, int> noteWasMissed;
  31. public static event Action<int, float> multiplierDidChange;
  32. public static event Action<int> multiplierDidIncrease;
  33. public static event Action<int> comboDidChange;
  34. public static event Action comboDidBreak;
  35. public static event Action<int, int> scoreDidChange;
  36. public static event Action<float> energyDidChange;
  37. public static event Action energyReachedZero;
  38. public static event Action<BeatmapEventData> beatmapEvent;
  39. public static event Action<Saber.SaberType> sabersStartCollide;
  40. public static event Action<Saber.SaberType> sabersEndCollide;
  41. const string Menu = "MenuCore";
  42. const string Game = "GameCore";
  43. const string EmptyTransition = "EmptyTransition";
  44. GameScenesManager gameScenesManager;
  45. public static void OnLoad()
  46. {
  47. if (Instance != null) return;
  48. GameObject go = new GameObject("BSEvents");
  49. go.AddComponent<BSEvents>();
  50. }
  51. private void Awake()
  52. {
  53. if (Instance != null) return;
  54. Instance = this;
  55. SceneManager.activeSceneChanged += SceneManagerOnActiveSceneChanged;
  56. DontDestroyOnLoad(gameObject);
  57. }
  58. private void SceneManagerOnActiveSceneChanged(Scene arg0, Scene arg1)
  59. {
  60. try
  61. {
  62. if (arg1.name == Game)
  63. {
  64. InvokeAll(gameSceneActive);
  65. gameScenesManager = Resources.FindObjectsOfTypeAll<GameScenesManager>().FirstOrDefault();
  66. if (gameScenesManager != null)
  67. {
  68. gameScenesManager.transitionDidFinishEvent -= GameSceneSceneWasLoaded;
  69. gameScenesManager.transitionDidFinishEvent += GameSceneSceneWasLoaded;
  70. }
  71. }
  72. else if (arg1.name == Menu)
  73. {
  74. gameScenesManager = Resources.FindObjectsOfTypeAll<GameScenesManager>().FirstOrDefault();
  75. InvokeAll(menuSceneActive);
  76. if (gameScenesManager != null)
  77. {
  78. if (arg0.name == EmptyTransition)
  79. {
  80. gameScenesManager.transitionDidFinishEvent -= OnMenuSceneWasLoadedFresh;
  81. gameScenesManager.transitionDidFinishEvent += OnMenuSceneWasLoadedFresh;
  82. }
  83. else
  84. {
  85. gameScenesManager.transitionDidFinishEvent -= OnMenuSceneWasLoaded;
  86. gameScenesManager.transitionDidFinishEvent += OnMenuSceneWasLoaded;
  87. }
  88. }
  89. }
  90. }
  91. catch (Exception e)
  92. {
  93. Console.WriteLine("[BSEvents] " + e);
  94. }
  95. }
  96. private void OnMenuSceneWasLoaded()
  97. {
  98. gameScenesManager.transitionDidFinishEvent -= OnMenuSceneWasLoaded;
  99. InvokeAll(menuSceneLoaded);
  100. }
  101. private void OnMenuSceneWasLoadedFresh()
  102. {
  103. gameScenesManager.transitionDidFinishEvent -= OnMenuSceneWasLoadedFresh;
  104. var levelDetailViewController = Resources.FindObjectsOfTypeAll<StandardLevelDetailViewController>().FirstOrDefault();
  105. levelDetailViewController.didChangeDifficultyBeatmapEvent += delegate (StandardLevelDetailViewController vc, IDifficultyBeatmap beatmap) { InvokeAll(difficultySelected, vc, beatmap); };
  106. var characteristicSelect = Resources.FindObjectsOfTypeAll<BeatmapCharacteristicSegmentedControlController>().FirstOrDefault();
  107. characteristicSelect.didSelectBeatmapCharacteristicEvent += delegate (BeatmapCharacteristicSegmentedControlController controller, BeatmapCharacteristicSO characteristic) { InvokeAll(characteristicSelected, controller, characteristic); };
  108. var packSelectViewController = Resources.FindObjectsOfTypeAll<LevelPacksViewController>().FirstOrDefault();
  109. packSelectViewController.didSelectPackEvent += delegate (LevelPacksViewController controller, IBeatmapLevelPack pack) { InvokeAll(levelPackSelected, controller, pack); };
  110. var levelSelectViewController = Resources.FindObjectsOfTypeAll<LevelPackLevelsViewController>().FirstOrDefault();
  111. levelSelectViewController.didSelectLevelEvent += delegate (LevelPackLevelsViewController controller, IPreviewBeatmapLevel level) { InvokeAll(levelSelected, controller, level); };
  112. InvokeAll(menuSceneLoadedFresh);
  113. }
  114. private void GameSceneSceneWasLoaded()
  115. {
  116. // Prevent firing this event when returning to menu
  117. Resources.FindObjectsOfTypeAll<GameScenesManager>().FirstOrDefault().transitionDidFinishEvent -= GameSceneSceneWasLoaded;
  118. var pauseManager = Resources.FindObjectsOfTypeAll<GamePauseManager>().FirstOrDefault();
  119. pauseManager.GetPrivateField<Signal>("_gameDidResumeSignal").Subscribe(delegate () { InvokeAll(songUnpaused); });
  120. pauseManager.GetPrivateField<Signal>("_gameDidPauseSignal").Subscribe(delegate () { InvokeAll(songPaused); });
  121. var scoreController = Resources.FindObjectsOfTypeAll<ScoreController>().FirstOrDefault();
  122. scoreController.noteWasCutEvent += delegate (NoteData noteData, NoteCutInfo noteCutInfo, int multiplier) { InvokeAll(noteWasCut, noteData, noteCutInfo, multiplier); };
  123. scoreController.noteWasMissedEvent += delegate (NoteData noteData, int multiplier) { InvokeAll(noteWasMissed, noteData, multiplier); }; ;
  124. scoreController.multiplierDidChangeEvent += delegate (int multiplier, float progress) { InvokeAll(multiplierDidChange, multiplier, progress); if (multiplier > 1 && progress < 0.1f) InvokeAll(multiplierDidIncrease, multiplier); };
  125. scoreController.comboDidChangeEvent += delegate (int combo) { InvokeAll(comboDidChange, combo); };
  126. scoreController.comboBreakingEventHappenedEvent += delegate () { InvokeAll(comboDidBreak); };
  127. scoreController.scoreDidChangeEvent += delegate (int rawScore, int multipliedScore) { InvokeAll(scoreDidChange); };
  128. var saberCollisionManager = Resources.FindObjectsOfTypeAll<ObstacleSaberSparkleEffectManager>().FirstOrDefault();
  129. saberCollisionManager.sparkleEffectDidStartEvent += delegate (Saber.SaberType saber) { InvokeAll(sabersStartCollide, saber); };
  130. saberCollisionManager.sparkleEffectDidEndEvent += delegate (Saber.SaberType saber) { InvokeAll(sabersEndCollide, saber); };
  131. var gameEnergyCounter = Resources.FindObjectsOfTypeAll<GameEnergyCounter>().FirstOrDefault();
  132. gameEnergyCounter.gameEnergyDidReach0Event += delegate () { InvokeAll(energyReachedZero); };
  133. gameEnergyCounter.gameEnergyDidChangeEvent += delegate (float energy) { InvokeAll(energyDidChange, energy); };
  134. var beatmapObjectCallbackController = Resources.FindObjectsOfTypeAll<BeatmapObjectCallbackController>().FirstOrDefault();
  135. beatmapObjectCallbackController.beatmapEventDidTriggerEvent += delegate (BeatmapEventData songEvent) { InvokeAll(beatmapEvent, songEvent); };
  136. var transitionSetup = Resources.FindObjectsOfTypeAll<StandardLevelScenesTransitionSetupDataSO>().FirstOrDefault();
  137. transitionSetup.didFinishEvent += delegate (StandardLevelScenesTransitionSetupDataSO data, LevelCompletionResults results)
  138. {
  139. switch (results.levelEndStateType)
  140. {
  141. case LevelCompletionResults.LevelEndStateType.Cleared:
  142. InvokeAll(levelCleared, data, results);
  143. break;
  144. case LevelCompletionResults.LevelEndStateType.Failed:
  145. InvokeAll(levelFailed, data, results);
  146. break;
  147. }
  148. switch (results.levelEndAction)
  149. {
  150. case LevelCompletionResults.LevelEndAction.Quit:
  151. InvokeAll(levelQuit, data, results);
  152. break;
  153. case LevelCompletionResults.LevelEndAction.Restart:
  154. InvokeAll(levelRestarted, data, results);
  155. break;
  156. }
  157. };
  158. InvokeAll(gameSceneLoaded);
  159. }
  160. public void InvokeAll<T1, T2, T3>(Action<T1, T2, T3> action, params object[] args)
  161. {
  162. if (action == null) return;
  163. foreach (Delegate invoc in action.GetInvocationList())
  164. {
  165. try
  166. {
  167. invoc?.DynamicInvoke(args);
  168. }
  169. catch (Exception e)
  170. {
  171. Console.WriteLine($"Caught Exception when executing event");
  172. Console.WriteLine(e);
  173. }
  174. }
  175. }
  176. public void InvokeAll<T1, T2>(Action<T1, T2> action, params object[] args)
  177. {
  178. if (action == null) return;
  179. foreach (Delegate invoc in action.GetInvocationList())
  180. {
  181. try
  182. {
  183. invoc?.DynamicInvoke(args);
  184. }
  185. catch (Exception e)
  186. {
  187. Console.WriteLine($"Caught Exception when executing event");
  188. Console.WriteLine(e);
  189. }
  190. }
  191. }
  192. public void InvokeAll<T>(Action<T> action, params object[] args)
  193. {
  194. if (action == null) return;
  195. foreach (Delegate invoc in action.GetInvocationList())
  196. {
  197. try
  198. {
  199. invoc?.DynamicInvoke(args);
  200. }
  201. catch (Exception e)
  202. {
  203. Console.WriteLine($"Caught Exception when executing event");
  204. Console.WriteLine(e);
  205. }
  206. }
  207. }
  208. public void InvokeAll(Action action, params object[] args)
  209. {
  210. if (action == null) return;
  211. foreach (Delegate invoc in action.GetInvocationList())
  212. {
  213. try
  214. {
  215. invoc?.DynamicInvoke(args);
  216. }
  217. catch (Exception e)
  218. {
  219. Console.WriteLine($"Caught Exception when executing event");
  220. Console.WriteLine(e);
  221. }
  222. }
  223. }
  224. }
  225. }