diff --git a/PerformanceMeter/PerformanceMeter/EndGameDisplay.cs b/PerformanceMeter/PerformanceMeter/EndGameDisplay.cs index 197bded..a42a366 100644 --- a/PerformanceMeter/PerformanceMeter/EndGameDisplay.cs +++ b/PerformanceMeter/PerformanceMeter/EndGameDisplay.cs @@ -10,6 +10,7 @@ using SRModCore; using UnityEngine; using UnityEngine.UI; +using static Il2CppRootMotion.Demos.Turret; namespace PerformanceMeter { @@ -54,17 +55,17 @@ List currentScoreFrames InjectTitle(logger, leftScreen); // Get some existing objects for later reference - Transform parent = leftScreen.transform.Find("ScoreWrap"); + Transform parent = leftScreen.transform.Find("ScoreUI"); if (parent == null) { logger.Msg("Failed to find root transform for graph"); return; } - Transform clonedStatTransform = parent.Find("Streak"); + Transform clonedStatTransform = parent.Find("Song Stats/SongStat - Longest Streak"); if (clonedStatTransform == null) { - logger.Msg("Failed to find transform to clone for stats"); + logger.Msg("Failed to find transform clone for stats"); return; } @@ -110,7 +111,7 @@ List lifePctFrames logger.Msg("Average life pct: " + avgLifePct); RectTransform lifePctGraphContainer = CreateGraphContainer(logger, parent, "pm_lifePctContainer"); - InjectAverageStat(logger, lifePctGraphContainer, clonedStatGameObject, "Average Life Percent: ", avgLifePct); + InjectAverageStat(logger, lifePctGraphContainer, clonedStatGameObject, "Average Life %", avgLifePct); InjectPercentGraph(logger, lifePctGraphContainer, lifePctFrames, GetColorForLifePercent, avgLifePct); } @@ -131,8 +132,8 @@ private RectTransform CreateGraphContainer(SRLogger logger, Transform parent, st containerRect.localEulerAngles = Vector3.zero; containerRect.anchorMin = new Vector2(0f, 0.5f); containerRect.anchorMax = new Vector2(1f, 0.5f); - containerRect.sizeDelta = new Vector2(20.0f, 21.0f); - containerRect.anchoredPosition = new Vector2(0f, 5.0f); + containerRect.sizeDelta = new Vector2(2.0f, 2.0f); + containerRect.anchoredPosition = new Vector2(0f, 1.0f); container.GetComponent().color = Color.clear; @@ -147,7 +148,7 @@ private RectTransform CreateGraphContainer(SRLogger logger, Transform parent, st /// Root GameObject for created left screen private GameObject InjectLeftScreen(SRLogger logger) { - GameObject displayWrap = GameObject.Find("[Game_Scripts]/DisplayWrap"); + GameObject displayWrap = GameObject.Find("[Score Summary]/DisplayWrap"); // Center screen GameObject centerScreen = displayWrap.transform.Find("SinglePlayer").gameObject; @@ -161,17 +162,19 @@ private GameObject InjectLeftScreen(SRLogger logger) leftScreen.transform.RotateAround(platformPosition, Vector3.up, -75.0f); // Delete unwanted children - UnityUtil.DeleteChildren(logger, leftScreen.transform, new string[] { "ScoreWrap" }); + UnityUtil.DeleteChildren(logger, leftScreen.transform, new string[] { "ScoreUI" }); - // Delete unwanted children - UnityUtil.DeleteChildren(logger, leftScreen.transform.Find("ScoreWrap"), new string[] { "TotalScore", "Streak" }); + var scoreUi = leftScreen.transform.Find("ScoreUI"); + UnityUtil.DeleteChildren(logger, scoreUi.transform, new string[] { "Background", "Score", "Song Stats" }); + + UnityUtil.DeleteChildren(logger, scoreUi.transform.Find("Song Stats"), new string[] { "SongStat - Longest Streak" }); return leftScreen; } private void InjectTitle(SRLogger logger, GameObject leftScreen) { - Transform root = leftScreen.transform.Find("ScoreWrap/TotalScore"); + Transform root = leftScreen.transform.Find("ScoreUI/Score"); if (root == null) { logger.Msg("Failed to find root transform"); @@ -179,15 +182,16 @@ private void InjectTitle(SRLogger logger, GameObject leftScreen) } root.name = "pm_title"; + root.localPosition += Vector3.up * 2.0f; - var labelText = root.Find("TotalScoreLabel").GetComponent(); + var labelText = root.Find("Final Score Label").GetComponent(); labelText.SetText(""); - var valueText = root.Find("Value").GetComponent(); + var valueText = root.Find("Final Score Value").GetComponent(); valueText.SetText("Performance"); valueText.color = Color.white; - UnityUtil.DeleteChildren(logger, root, new string[] { "TotalScoreLabel", "Value" }); + UnityUtil.DeleteChildren(logger, root, new string[] { "Final Score Label", "Final Score Value" }); root.gameObject.SetActive(true); } @@ -205,13 +209,13 @@ float averagePercent averageStat.transform.localPosition = new Vector3(0.0f, 6.0f, 0.0f); averageStat.transform.localEulerAngles = Vector3.zero; - var labelTMP = averageStat.transform.Find("Label").GetComponent(); + var labelTMP = averageStat.transform.Find("StatName").GetComponent(); labelTMP.SetText(labelText); - var valueText = averageStat.transform.Find("Value").GetComponent(); + var valueText = averageStat.transform.Find("StatValue").GetComponent(); valueText.SetText(string.Format("{0:0.###}%", averagePercent * 100)); - UnityUtil.DeleteChildren(logger, averageStat.transform, new string[] { "Label", "Value", "Bg" }); + UnityUtil.DeleteChildren(logger, averageStat.transform, new string[] { "StatName", "StatValue", "BG" }); averageStat.SetActive(true); } @@ -237,19 +241,18 @@ private void InjectPercentGraph( containerRect.localEulerAngles = Vector3.zero; containerRect.anchorMin = new Vector2(0.5f, 1f); containerRect.anchorMax = new Vector2(0.5f, 1f); - containerRect.sizeDelta = new Vector2(20.0f, 15.0f); - containerRect.anchoredPosition = new Vector2(0f, -16.0f); + containerRect.sizeDelta = new Vector2(2.0f, 1.5f); + containerRect.anchoredPosition = new Vector2(0f, -6.0f); // Background var backgroundSprite = UnityUtil.CreateSpriteFromAssemblyResource(logger, Assembly.GetExecutingAssembly(), "PerformanceMeter.Resources.Sprites.bg.png"); - //GameObject graphBackground = GameObject.Instantiate(new GameObject("pm_graphBg", typeof(Image)), graphContainer.transform); var graphBackground = new GameObject("pm_graphBg"); graphBackground.transform.SetParent(graphContainer.transform); var backgroundImage = graphBackground.AddComponent(); backgroundImage.sprite = backgroundSprite; - backgroundImage.color = Color.black; + backgroundImage.color = new Color(0f, 0f, 0f, 0.7f); FillParent(graphBackground.GetComponent()); @@ -264,7 +267,7 @@ private void InjectPercentGraph( label0.anchorMax = new Vector2(0f, 0f);*/ // Graphable Region - var padding = new Vector2(0.4f, 0.4f); + var padding = new Vector2(0.2f, 0.2f); var graphableRegionSize = containerRect.sizeDelta - padding; var graphableRect = CreateGraphableRegion(graphContainer.transform, graphableRegionSize); @@ -389,7 +392,7 @@ private GameObject CreatePoint(RectTransform graphContainer, Sprite sprite, floa var rectTransform = dot.GetComponent(); rectTransform.anchoredPosition = new Vector2(pctTime * graphWidth, pctOfTotal * graphHeight); - rectTransform.sizeDelta = new Vector2(0.04f, 0.04f); + rectTransform.sizeDelta = new Vector2(0.01f, 0.01f); rectTransform.anchorMin = new Vector2(0, 0); rectTransform.anchorMax = new Vector2(0, 0); @@ -409,8 +412,8 @@ private GameObject CreateTimeMarker(RectTransform graphContainer, float pctTime) image.enabled = true; var rectTransform = marker.GetComponent(); - rectTransform.anchoredPosition = new Vector2(pctTime * graphWidth, 0.0f); - rectTransform.sizeDelta = new Vector2(0.03f, 0.5f); + rectTransform.anchoredPosition = new Vector2(pctTime * graphWidth, -0.1f); + rectTransform.sizeDelta = new Vector2(0.01f, 0.07f); rectTransform.anchorMin = new Vector2(0, 0); rectTransform.anchorMax = new Vector2(0, 0); @@ -431,7 +434,7 @@ private GameObject CreateAverageLine(RectTransform graphContainer, float average var rectTransform = line.GetComponent(); rectTransform.anchorMin = new Vector2(0, 0); rectTransform.anchorMax = new Vector2(1, 0); - rectTransform.sizeDelta = new Vector2(0f, 0.04f); + rectTransform.sizeDelta = new Vector2(0f, 0.01f); rectTransform.anchoredPosition = new Vector2(0f, averagePercent * graphHeight); return line; @@ -451,7 +454,7 @@ private GameObject CreateLineSegment(RectTransform graphContainer, Vector2 from, var distance = Vector2.Distance(from, to); rectTransform.anchorMin = new Vector2(0, 0); rectTransform.anchorMax = new Vector2(0, 0); - rectTransform.sizeDelta = new Vector2(distance, 0.06f); + rectTransform.sizeDelta = new Vector2(distance, 0.01f); rectTransform.anchoredPosition = from + direction * distance * .5f; rectTransform.localEulerAngles = new Vector3(0, 0, Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg); diff --git a/PerformanceMeter/PerformanceMeter/MainMod.cs b/PerformanceMeter/PerformanceMeter/MainMod.cs index 394d682..0b27501 100644 --- a/PerformanceMeter/PerformanceMeter/MainMod.cs +++ b/PerformanceMeter/PerformanceMeter/MainMod.cs @@ -22,6 +22,8 @@ namespace PerformanceMeter { public class MainMod : MelonMod, ISynthRidersEventHandler { + private const bool VERBOSE_LOGS = false; + private static readonly string SCENE_NAME_GAME_END = "3.GameEnd"; private static readonly string modDirectory = "UserData/PerformanceMeter"; @@ -101,7 +103,7 @@ private void Reset() totalPerfectFrames.Add(new CumulativeFrame(0, 0)); } - public override async void OnSceneWasLoaded(int buildIndex, string sceneName) + public override void OnSceneWasLoaded(int buildIndex, string sceneName) { base.OnSceneWasLoaded(buildIndex, sceneName); @@ -155,11 +157,13 @@ public override async void OnSceneWasLoaded(int buildIndex, string sceneName) public override void OnUpdate() { - if (!shouldInject) return; + if (!shouldInject) + return; // Wait for the center screen to load - var center = GameObject.Find("[Game_Scripts]/DisplayWrap"); - if (center == null) return; + var center = GameObject.Find("[Score Summary]/DisplayWrap"); + if (center == null) + return; // Once center screen is loaded show the graph and reset shouldInject = false; @@ -167,7 +171,7 @@ public override void OnUpdate() highScoreRun = null; } - public override void OnApplicationQuit() + public override async void OnApplicationQuit() { base.OnApplicationQuit(); @@ -175,7 +179,7 @@ public override void OnApplicationQuit() { try { - webSocketClient.StopAsync(webSocketCancellation); + await webSocketClient.StopAsync(webSocketCancellation); } catch (Exception e) { @@ -228,11 +232,19 @@ private PlayConfiguration GetCurrentPlayConfiguration(GameControlManager gameCon }; } + void LogVerbose(string message) + { + if (VERBOSE_LOGS) + { + _logger.Msg(message); + } + } + /* Handle websocket events */ void ISynthRidersEventHandler.OnSongStart(EventDataSongStart data) { - _logger.Msg("Song started!"); + LogVerbose("Song started!"); Reset(); inSong = true; currentPlayConfig = GetCurrentPlayConfiguration(GameControlManager.s_instance, Game_InfoProvider.s_instance); @@ -240,7 +252,7 @@ void ISynthRidersEventHandler.OnSongStart(EventDataSongStart data) void ISynthRidersEventHandler.OnSongEnd(EventDataSongEnd data) { - _logger.Msg("Song ended!"); + LogVerbose("Song ended!"); inSong = false; // Once we don't risk introducing any lag into the run, ensure that the play config exists while wrapping up the map @@ -249,11 +261,12 @@ void ISynthRidersEventHandler.OnSongEnd(EventDataSongEnd data) void ISynthRidersEventHandler.OnPlayTime(EventDataPlayTime data) { - _logger.Msg("Play time " + data.playTimeMS); + LogVerbose("Play time " + data.playTimeMS); } void ISynthRidersEventHandler.OnNoteHit(EventDataNoteHit data) { + LogVerbose($"Note miss. Health: {data.lifeBarPercent}"); if (inSong) { lifePctFrames.Add(new PercentFrame(data.playTimeMS, data.lifeBarPercent)); @@ -273,6 +286,10 @@ void ISynthRidersEventHandler.OnSceneChange(EventDataSceneChange data) { } + void ISynthRidersEventHandler.OnEnterSpecial() { } + void ISynthRidersEventHandler.OnCompleteSpecial() { } + void ISynthRidersEventHandler.OnFailSpecial() { } + void ISynthRidersEventHandler.OnReturnToMenu() { _logger.Msg("Return to menu"); diff --git a/PerformanceMeter/PerformanceMeter/PerformanceMeter.csproj b/PerformanceMeter/PerformanceMeter/PerformanceMeter.csproj index 82566b3..e77e793 100644 --- a/PerformanceMeter/PerformanceMeter/PerformanceMeter.csproj +++ b/PerformanceMeter/PerformanceMeter/PerformanceMeter.csproj @@ -5,10 +5,10 @@ True PerformanceMeter PerformanceMeter - Copyright © 2022 - 2.0.1.0 - 2.0.1.0 - 2.0.1.0 + Copyright © 2025 + 2.1.0.0 + 2.1.0.0 + 2.1.0.0 true C:\Program Files (x86)\Steam\steamapps\common\SynthRiders @@ -21,7 +21,7 @@ - 5.0.11 + 5.0.21 diff --git a/PerformanceMeter/PerformanceMeter/Properties/AssemblyInfo.cs b/PerformanceMeter/PerformanceMeter/Properties/AssemblyInfo.cs index 33d6e14..d678bbb 100644 --- a/PerformanceMeter/PerformanceMeter/Properties/AssemblyInfo.cs +++ b/PerformanceMeter/PerformanceMeter/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("790e1270-393d-4609-be62-5a7cb4acaff5")] -[assembly: MelonInfo(typeof(PerformanceMeter.MainMod), "Performance Meter", "2.0.1", "bookdude13", "https://github.com/bookdude13/SRPerformanceMeter")] +[assembly: MelonInfo(typeof(PerformanceMeter.MainMod), "Performance Meter", "2.1.0", "bookdude13", "https://github.com/bookdude13/SRPerformanceMeter")] [assembly: MelonGame("Kluge Interactive", "SynthRiders")] diff --git a/PerformanceMeter/PerformanceMeterTests/PerformanceMeterTests.csproj b/PerformanceMeter/PerformanceMeterTests/PerformanceMeterTests.csproj index 55d6a1e..97c5503 100644 --- a/PerformanceMeter/PerformanceMeterTests/PerformanceMeterTests.csproj +++ b/PerformanceMeter/PerformanceMeterTests/PerformanceMeterTests.csproj @@ -17,7 +17,7 @@ - + diff --git a/PerformanceMeter/SynthRiders-Websockets-Mod b/PerformanceMeter/SynthRiders-Websockets-Mod index dfd1228..44c8bbd 160000 --- a/PerformanceMeter/SynthRiders-Websockets-Mod +++ b/PerformanceMeter/SynthRiders-Websockets-Mod @@ -1 +1 @@ -Subproject commit dfd1228acc8608521d98c96dec50ba34950a748e +Subproject commit 44c8bbdfb4ff37e7d1e818c9110bd4b94e752b03 diff --git a/end_game_example.jpeg b/end_game_example.jpeg index 4fcbaae..4a06e4e 100644 Binary files a/end_game_example.jpeg and b/end_game_example.jpeg differ diff --git a/end_game_example_old.jpeg b/end_game_example_old.jpeg new file mode 100644 index 0000000..4fcbaae Binary files /dev/null and b/end_game_example_old.jpeg differ