Skip to content

Commit

Permalink
Update websocket mod, bump version, fix graphics after SR did their r…
Browse files Browse the repository at this point in the history
…ework
  • Loading branch information
bookdude13 committed Jan 8, 2025
1 parent 9171e08 commit f37ccb2
Show file tree
Hide file tree
Showing 8 changed files with 64 additions and 44 deletions.
57 changes: 30 additions & 27 deletions PerformanceMeter/PerformanceMeter/EndGameDisplay.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
using SRModCore;
using UnityEngine;
using UnityEngine.UI;
using static Il2CppRootMotion.Demos.Turret;

namespace PerformanceMeter
{
Expand Down Expand Up @@ -54,17 +55,17 @@ List<CumulativeFrame> 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;
}

Expand Down Expand Up @@ -110,7 +111,7 @@ List<PercentFrame> 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);
}

Expand All @@ -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<Image>().color = Color.clear;

Expand All @@ -147,7 +148,7 @@ private RectTransform CreateGraphContainer(SRLogger logger, Transform parent, st
/// <returns>Root GameObject for created left screen</returns>
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;
Expand All @@ -161,33 +162,36 @@ 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");
return;
}

root.name = "pm_title";
root.localPosition += Vector3.up * 2.0f;

var labelText = root.Find("TotalScoreLabel").GetComponent<Il2CppTMPro.TMP_Text>();
var labelText = root.Find("Final Score Label").GetComponent<Il2CppTMPro.TMP_Text>();
labelText.SetText("");

var valueText = root.Find("Value").GetComponent<Il2CppTMPro.TMP_Text>();
var valueText = root.Find("Final Score Value").GetComponent<Il2CppTMPro.TMP_Text>();
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);
}
Expand All @@ -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<Il2CppTMPro.TMP_Text>();
var labelTMP = averageStat.transform.Find("StatName").GetComponent<Il2CppTMPro.TMP_Text>();
labelTMP.SetText(labelText);

var valueText = averageStat.transform.Find("Value").GetComponent<Il2CppTMPro.TMP_Text>();
var valueText = averageStat.transform.Find("StatValue").GetComponent<Il2CppTMPro.TMP_Text>();
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);
}
Expand All @@ -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<Image>();
backgroundImage.sprite = backgroundSprite;
backgroundImage.color = Color.black;
backgroundImage.color = new Color(0f, 0f, 0f, 0.7f);

FillParent(graphBackground.GetComponent<RectTransform>());

Expand All @@ -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);

Expand Down Expand Up @@ -389,7 +392,7 @@ private GameObject CreatePoint(RectTransform graphContainer, Sprite sprite, floa

var rectTransform = dot.GetComponent<RectTransform>();
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);

Expand All @@ -409,8 +412,8 @@ private GameObject CreateTimeMarker(RectTransform graphContainer, float pctTime)
image.enabled = true;

var rectTransform = marker.GetComponent<RectTransform>();
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);

Expand All @@ -431,7 +434,7 @@ private GameObject CreateAverageLine(RectTransform graphContainer, float average
var rectTransform = line.GetComponent<RectTransform>();
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;
Expand All @@ -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);

Expand Down
35 changes: 26 additions & 9 deletions PerformanceMeter/PerformanceMeter/MainMod.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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";

Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -155,27 +157,29 @@ 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;
endGameDisplay.Inject(_logger, lifePctFrames, highScoreRun.TotalScoreFrames, totalScoreFrames);
highScoreRun = null;
}

public override void OnApplicationQuit()
public override async void OnApplicationQuit()
{
base.OnApplicationQuit();

if (webSocketClient != null && config.isEnabled)
{
try
{
webSocketClient.StopAsync(webSocketCancellation);
await webSocketClient.StopAsync(webSocketCancellation);
}
catch (Exception e)
{
Expand Down Expand Up @@ -228,19 +232,27 @@ 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);
}

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
Expand All @@ -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));
Expand All @@ -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");
Expand Down
10 changes: 5 additions & 5 deletions PerformanceMeter/PerformanceMeter/PerformanceMeter.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
<GenerateAssemblyInfo>True</GenerateAssemblyInfo>
<AssemblyTitle>PerformanceMeter</AssemblyTitle>
<Product>PerformanceMeter</Product>
<Copyright>Copyright © 2022</Copyright>
<AssemblyVersion>2.0.1.0</AssemblyVersion>
<FileVersion>2.0.1.0</FileVersion>
<Version>2.0.1.0</Version>
<Copyright>Copyright © 2025</Copyright>
<AssemblyVersion>2.1.0.0</AssemblyVersion>
<FileVersion>2.1.0.0</FileVersion>
<Version>2.1.0.0</Version>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
<SynthRidersDir>C:\Program Files (x86)\Steam\steamapps\common\SynthRiders</SynthRidersDir>
</PropertyGroup>
Expand All @@ -21,7 +21,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="LiteDB">
<Version>5.0.11</Version>
<Version>5.0.21</Version>
</PackageReference>
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<PackageReference Include="System.Data.DataSetExtensions" Version="4.5.0" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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")]
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
<ProjectReference Include="..\PerformanceMeter\PerformanceMeter.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="LiteDB" Version="5.0.11" />
<PackageReference Include="LiteDB" Version="5.0.21" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.*" />
<PackageReference Include="MSTest.TestAdapter" Version="2.2.8" />
<PackageReference Include="MSTest.TestFramework" Version="2.2.8" />
Expand Down
Binary file modified end_game_example.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added end_game_example_old.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit f37ccb2

Please sign in to comment.