mirror of
https://github.com/Theaninova/HitScoreVisualizer.git
synced 2026-01-05 07:12:56 +00:00
Compare commits
8 Commits
v2.1.0
...
v1.0-compe
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7b8f210e65 | ||
|
|
337c3b3f3b | ||
|
|
232264ea1b | ||
|
|
0ebc4fe99f | ||
|
|
5232e704f6 | ||
|
|
4cc7cb0856 | ||
|
|
f8a54ee407 | ||
|
|
ca796ed1c1 |
@@ -14,6 +14,28 @@ namespace HitScoreVisualizer
|
|||||||
{
|
{
|
||||||
public static Config instance;
|
public static Config instance;
|
||||||
|
|
||||||
|
public const string mode_hardcoreCompetetive = "hardcoreCompetetive";
|
||||||
|
public const string mode_format = "format";
|
||||||
|
public const string mode_textOnly = "textOnly";
|
||||||
|
public const string mode_numeric = "numeric";
|
||||||
|
public const string mode_scoreOnTop = "scoreOnTop";
|
||||||
|
|
||||||
|
public const char format_indicator = '%';
|
||||||
|
public const char format_beforeCutScore = 'b';
|
||||||
|
public const char format_accuracyScore = 'c';
|
||||||
|
public const char format_afterCutScore = 'a';
|
||||||
|
public const char FORMAT_BEFORECUTSCORE = 'B';
|
||||||
|
public const char FORMAT_ACCUTRACYSCORE = 'C';
|
||||||
|
public const char FORMAT_AFTERCUTSCORE = 'A';
|
||||||
|
public const char format_score = 's';
|
||||||
|
public const char format_indicatorChar = format_indicator;
|
||||||
|
public const char format_lineBreak = 'n';
|
||||||
|
|
||||||
|
public const bool percentages = true;
|
||||||
|
public const int maxBeforeCutScore = 70;
|
||||||
|
public const int maxAfterCutScore = 30;
|
||||||
|
public const int maxAccuracyScore = 10;
|
||||||
|
|
||||||
// If true, this config will not overwrite the existing config file.
|
// If true, this config will not overwrite the existing config file.
|
||||||
// (This gets set if a config from a newer version is detected.)
|
// (This gets set if a config from a newer version is detected.)
|
||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
@@ -102,6 +124,7 @@ namespace HitScoreVisualizer
|
|||||||
|
|
||||||
// path to where the config is saved
|
// path to where the config is saved
|
||||||
private const string FILE_PATH = "/UserData/HitScoreVisualizerConfig.json";
|
private const string FILE_PATH = "/UserData/HitScoreVisualizerConfig.json";
|
||||||
|
private const string FILE_PATH_RATINGS = "\\Ratings\\Latest.txt";
|
||||||
|
|
||||||
private const string DEFAULT_JSON = @"{
|
private const string DEFAULT_JSON = @"{
|
||||||
""majorVersion"": 2,
|
""majorVersion"": 2,
|
||||||
@@ -233,6 +256,7 @@ namespace HitScoreVisualizer
|
|||||||
};
|
};
|
||||||
|
|
||||||
public static string fullPath => Environment.CurrentDirectory.Replace('\\', '/') + FILE_PATH;
|
public static string fullPath => Environment.CurrentDirectory.Replace('\\', '/') + FILE_PATH;
|
||||||
|
public static string fullPathRatings => Environment.CurrentDirectory + FILE_PATH_RATINGS;
|
||||||
|
|
||||||
public static void load()
|
public static void load()
|
||||||
{
|
{
|
||||||
@@ -339,6 +363,11 @@ namespace HitScoreVisualizer
|
|||||||
instance = DEFAULT_CONFIG;
|
instance = DEFAULT_CONFIG;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static string floatToHexColor(float dec)
|
||||||
|
{
|
||||||
|
return ((int)(255f * dec)).ToString("X2");
|
||||||
|
}
|
||||||
|
|
||||||
public static void judge(FlyingScoreTextEffect text, NoteCutInfo noteCutInfo, SaberAfterCutSwingRatingCounter saberAfterCutSwingRatingCounter, ref Color color, int score)
|
public static void judge(FlyingScoreTextEffect text, NoteCutInfo noteCutInfo, SaberAfterCutSwingRatingCounter saberAfterCutSwingRatingCounter, ref Color color, int score)
|
||||||
{
|
{
|
||||||
Judgment judgment = DEFAULT_JUDGMENT;
|
Judgment judgment = DEFAULT_JUDGMENT;
|
||||||
@@ -365,7 +394,76 @@ namespace HitScoreVisualizer
|
|||||||
color = toColor(judgment.color);
|
color = toColor(judgment.color);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (instance.displayMode == "format")
|
//Hardcore Competetive Mode by wulkanat
|
||||||
|
if (instance.displayMode == mode_hardcoreCompetetive)
|
||||||
|
{
|
||||||
|
float beforeCut = noteCutInfo.swingRating;
|
||||||
|
float accuracy = 1f - Mathf.Clamp01(noteCutInfo.cutDistanceToCenter / 0.2f);
|
||||||
|
float afterCut = 0f;
|
||||||
|
if (saberAfterCutSwingRatingCounter != null)
|
||||||
|
afterCut = saberAfterCutSwingRatingCounter.rating;
|
||||||
|
|
||||||
|
int beforeCutScore, accuracyScore, afterCutScore;
|
||||||
|
int beforeMax, accuracyMax, afterMax;
|
||||||
|
|
||||||
|
if (percentages)
|
||||||
|
{
|
||||||
|
beforeMax = 100;
|
||||||
|
accuracyMax = 100;
|
||||||
|
afterMax = 100;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
beforeMax = 70;
|
||||||
|
accuracyMax = 10;
|
||||||
|
afterMax = 30;
|
||||||
|
}
|
||||||
|
|
||||||
|
beforeCutScore = Mathf.RoundToInt(beforeMax * beforeCut);
|
||||||
|
accuracyScore = Mathf.RoundToInt(accuracyMax * accuracy);
|
||||||
|
afterCutScore = Mathf.RoundToInt(afterMax * afterCut);
|
||||||
|
|
||||||
|
if (beforeCutScore == beforeMax && accuracyScore == accuracyMax && afterCutScore == afterMax)
|
||||||
|
{
|
||||||
|
text.text = "Perfect";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
StringBuilder formattedBuilder = new StringBuilder();
|
||||||
|
|
||||||
|
if (percentages)
|
||||||
|
formattedBuilder.Append( "<color=#" + floatToHexColor(1f - score / 110f) + floatToHexColor(score / 110f) + "00>" + (int) ((score / 110f) * 100f) + "%\n");
|
||||||
|
else
|
||||||
|
formattedBuilder.Append("<color=#" + floatToHexColor(1f - score / 110f) + floatToHexColor(score / 110f) + "00>" + score + "\n");
|
||||||
|
|
||||||
|
if (beforeCutScore == beforeMax)
|
||||||
|
formattedBuilder.Append("<color=#FFFFFF>P ");
|
||||||
|
else
|
||||||
|
formattedBuilder.Append("<color=#" + floatToHexColor(1f - beforeCut) + (floatToHexColor(beforeCut) + "00>" + beforeCutScore + " "));
|
||||||
|
|
||||||
|
if (accuracyScore == accuracyMax)
|
||||||
|
formattedBuilder.Append("<color=#FFFFFF>P ");
|
||||||
|
else
|
||||||
|
formattedBuilder.Append("<color=#" + floatToHexColor(1f - accuracy) + floatToHexColor(accuracy) + "00>" + accuracyScore + " ");
|
||||||
|
|
||||||
|
if (afterCutScore == afterMax)
|
||||||
|
formattedBuilder.Append("<color=#FFFFFF>P");
|
||||||
|
else
|
||||||
|
formattedBuilder.Append("<color=#" + floatToHexColor(1f - afterCut) + floatToHexColor(afterCut) + "00>" + afterCutScore);
|
||||||
|
|
||||||
|
text.text = formattedBuilder.ToString();
|
||||||
|
|
||||||
|
if (saberAfterCutSwingRatingCounter.didFinish)
|
||||||
|
{
|
||||||
|
using (StreamWriter file = File.AppendText(fullPathRatings))
|
||||||
|
{
|
||||||
|
file.WriteLine(saberAfterCutSwingRatingCounter.RequestId + " <<>> " + beforeCut + " " + accuracy + " " + afterCut + " | " + score);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (instance.displayMode == mode_format)
|
||||||
{
|
{
|
||||||
int beforeCutScore, accuracyScore, afterCutScore;
|
int beforeCutScore, accuracyScore, afterCutScore;
|
||||||
|
|
||||||
@@ -380,7 +478,7 @@ namespace HitScoreVisualizer
|
|||||||
|
|
||||||
StringBuilder formattedBuilder = new StringBuilder();
|
StringBuilder formattedBuilder = new StringBuilder();
|
||||||
string formatString = judgment.text;
|
string formatString = judgment.text;
|
||||||
int nextPercentIndex = formatString.IndexOf('%');
|
int nextPercentIndex = formatString.IndexOf(format_indicator);
|
||||||
while (nextPercentIndex != -1)
|
while (nextPercentIndex != -1)
|
||||||
{
|
{
|
||||||
formattedBuilder.Append(formatString.Substring(0, nextPercentIndex));
|
formattedBuilder.Append(formatString.Substring(0, nextPercentIndex));
|
||||||
@@ -392,61 +490,53 @@ namespace HitScoreVisualizer
|
|||||||
|
|
||||||
switch (specifier)
|
switch (specifier)
|
||||||
{
|
{
|
||||||
case 'b':
|
case format_beforeCutScore:
|
||||||
formattedBuilder.Append(beforeCutScore);
|
formattedBuilder.Append(beforeCutScore);
|
||||||
break;
|
break;
|
||||||
case 'c':
|
case format_accuracyScore:
|
||||||
formattedBuilder.Append(accuracyScore);
|
formattedBuilder.Append(accuracyScore);
|
||||||
break;
|
break;
|
||||||
case 'a':
|
case format_afterCutScore:
|
||||||
formattedBuilder.Append(afterCutScore);
|
formattedBuilder.Append(afterCutScore);
|
||||||
break;
|
break;
|
||||||
case 'B':
|
case FORMAT_BEFORECUTSCORE:
|
||||||
formattedBuilder.Append(judgeSegment(beforeCutScore, instance.beforeCutAngleJudgments));
|
formattedBuilder.Append(judgeSegment(beforeCutScore, instance.beforeCutAngleJudgments));
|
||||||
break;
|
break;
|
||||||
case 'C':
|
case FORMAT_ACCUTRACYSCORE:
|
||||||
formattedBuilder.Append(judgeSegment(accuracyScore, instance.accuracyJudgments));
|
formattedBuilder.Append(judgeSegment(accuracyScore, instance.accuracyJudgments));
|
||||||
break;
|
break;
|
||||||
case 'A':
|
case FORMAT_AFTERCUTSCORE:
|
||||||
formattedBuilder.Append(judgeSegment(afterCutScore, instance.afterCutAngleJudgments));
|
formattedBuilder.Append(judgeSegment(afterCutScore, instance.afterCutAngleJudgments));
|
||||||
break;
|
break;
|
||||||
case 's':
|
case format_score:
|
||||||
formattedBuilder.Append(score);
|
formattedBuilder.Append(score);
|
||||||
break;
|
break;
|
||||||
case '%':
|
case format_indicatorChar:
|
||||||
formattedBuilder.Append("%");
|
formattedBuilder.Append(format_indicatorChar);
|
||||||
break;
|
break;
|
||||||
case 'n':
|
case format_lineBreak:
|
||||||
formattedBuilder.Append("\n");
|
formattedBuilder.Append("\n");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
formattedBuilder.Append("%" + specifier);
|
formattedBuilder.Append(format_indicator + specifier);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
formatString = formatString.Remove(0, nextPercentIndex + 2);
|
formatString = formatString.Remove(0, nextPercentIndex + 2);
|
||||||
nextPercentIndex = formatString.IndexOf('%');
|
nextPercentIndex = formatString.IndexOf(format_indicator);
|
||||||
}
|
}
|
||||||
formattedBuilder.Append(formatString);
|
formattedBuilder.Append(formatString);
|
||||||
|
|
||||||
text.text = formattedBuilder.ToString();
|
text.text = formattedBuilder.ToString();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else if (instance.displayMode == mode_textOnly)
|
||||||
if (instance.displayMode == "textOnly")
|
|
||||||
{
|
|
||||||
text.text = judgment.text;
|
text.text = judgment.text;
|
||||||
|
else if (instance.displayMode == mode_numeric)
|
||||||
return;
|
return;
|
||||||
}
|
else if (instance.displayMode == mode_scoreOnTop)
|
||||||
if (instance.displayMode == "numeric")
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (instance.displayMode == "scoreOnTop")
|
|
||||||
{
|
|
||||||
text.text = score + "\n" + judgment.text + "\n";
|
text.text = score + "\n" + judgment.text + "\n";
|
||||||
return;
|
else
|
||||||
}
|
|
||||||
text.text = judgment.text + "\n" + score + "\n";
|
text.text = judgment.text + "\n" + score + "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
<DebugSymbols>true</DebugSymbols>
|
<DebugSymbols>true</DebugSymbols>
|
||||||
<DebugType>full</DebugType>
|
<DebugType>full</DebugType>
|
||||||
<Optimize>false</Optimize>
|
<Optimize>false</Optimize>
|
||||||
<OutputPath>bin\Debug\</OutputPath>
|
<OutputPath>..\..\..\..\Steam Games\steamapps\common\Beat Saber\Plugins\</OutputPath>
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<WarningLevel>4</WarningLevel>
|
<WarningLevel>4</WarningLevel>
|
||||||
@@ -31,16 +31,16 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="0Harmony">
|
<Reference Include="0Harmony">
|
||||||
<HintPath>..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Beat Saber\Beat Saber_Data\Managed\0Harmony.dll</HintPath>
|
<HintPath>..\..\..\..\Steam Games\steamapps\common\Beat Saber\Beat Saber_Data\Managed\0Harmony.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Assembly-CSharp">
|
<Reference Include="Assembly-CSharp">
|
||||||
<HintPath>..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Beat Saber\Beat Saber_Data\Managed\Assembly-CSharp.dll</HintPath>
|
<HintPath>..\..\..\..\Steam Games\steamapps\common\Beat Saber\Beat Saber_Data\Managed\Assembly-CSharp.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Assembly-CSharp-firstpass">
|
<Reference Include="Assembly-CSharp-firstpass">
|
||||||
<HintPath>..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Beat Saber\Beat Saber_Data\Managed\Assembly-CSharp-firstpass.dll</HintPath>
|
<HintPath>..\..\..\..\Steam Games\steamapps\common\Beat Saber\Beat Saber_Data\Managed\Assembly-CSharp-firstpass.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="IllusionPlugin">
|
<Reference Include="IllusionPlugin">
|
||||||
<HintPath>..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Beat Saber\Beat Saber_Data\Managed\IllusionPlugin.dll</HintPath>
|
<HintPath>..\..\..\..\Steam Games\steamapps\common\Beat Saber\Beat Saber_Data\Managed\IllusionPlugin.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Newtonsoft.Json, Version=11.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
<Reference Include="Newtonsoft.Json, Version=11.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
|
<HintPath>..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||||
@@ -54,10 +54,10 @@
|
|||||||
<Reference Include="System.Net.Http" />
|
<Reference Include="System.Net.Http" />
|
||||||
<Reference Include="System.Xml" />
|
<Reference Include="System.Xml" />
|
||||||
<Reference Include="UnityEngine">
|
<Reference Include="UnityEngine">
|
||||||
<HintPath>..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Beat Saber\Beat Saber_Data\Managed\UnityEngine.dll</HintPath>
|
<HintPath>..\..\..\..\Steam Games\steamapps\common\Beat Saber\Beat Saber_Data\Managed\UnityEngine.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="UnityEngine.CoreModule">
|
<Reference Include="UnityEngine.CoreModule">
|
||||||
<HintPath>..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Beat Saber\Beat Saber_Data\Managed\UnityEngine.CoreModule.dll</HintPath>
|
<HintPath>..\..\..\..\Steam Games\steamapps\common\Beat Saber\Beat Saber_Data\Managed\UnityEngine.CoreModule.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -17,6 +17,8 @@ namespace HitScoreVisualizer
|
|||||||
|
|
||||||
public void OnApplicationStart()
|
public void OnApplicationStart()
|
||||||
{
|
{
|
||||||
|
System.IO.File.WriteAllText(Config.fullPathRatings, "NO DATA");
|
||||||
|
|
||||||
SceneManager.activeSceneChanged += SceneManagerOnActiveSceneChanged;
|
SceneManager.activeSceneChanged += SceneManagerOnActiveSceneChanged;
|
||||||
SceneManager.sceneLoaded += SceneManager_sceneLoaded;
|
SceneManager.sceneLoaded += SceneManager_sceneLoaded;
|
||||||
try
|
try
|
||||||
@@ -33,8 +35,27 @@ namespace HitScoreVisualizer
|
|||||||
Config.load();
|
Config.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SceneManagerOnActiveSceneChanged(Scene arg0, Scene arg1)
|
private void SceneManagerOnActiveSceneChanged(Scene arg0, Scene newScene)
|
||||||
{
|
{
|
||||||
|
switch (newScene.buildIndex)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
// Return if we're not playing in a song.
|
||||||
|
return;
|
||||||
|
case 8:
|
||||||
|
case 9:
|
||||||
|
// We're in a song
|
||||||
|
//System.IO.File.WriteAllText(Config.fullPathRatings, newScene.name);
|
||||||
|
return;
|
||||||
|
|
||||||
|
default:
|
||||||
|
// Unknown, fallback to matching the name.
|
||||||
|
if (newScene.name.Contains("Environment"))
|
||||||
|
goto case 8;
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SceneManager_sceneLoaded(Scene arg0, LoadSceneMode arg1)
|
private void SceneManager_sceneLoaded(Scene arg0, LoadSceneMode arg1)
|
||||||
|
|||||||
Reference in New Issue
Block a user