diff --git a/TaikoWebUI/GlobalUsings.cs b/TaikoWebUI/GlobalUsings.cs
index c9a23b1..f644645 100644
--- a/TaikoWebUI/GlobalUsings.cs
+++ b/TaikoWebUI/GlobalUsings.cs
@@ -6,6 +6,7 @@ global using Microsoft.AspNetCore.Components.Web;
global using MudBlazor;
global using TaikoWebUI;
global using TaikoWebUI.Services;
+global using TaikoWebUI.Shared;
global using SharedProject.Models;
global using SharedProject.Models.Requests;
global using SharedProject.Models.Responses;
diff --git a/TaikoWebUI/Pages/Profile.razor b/TaikoWebUI/Pages/Profile.razor
index a77e060..8e93555 100644
--- a/TaikoWebUI/Pages/Profile.razor
+++ b/TaikoWebUI/Pages/Profile.razor
@@ -1,5 +1,6 @@
@page "/Cards/{baid:int}/Profile"
@inject HttpClient Client
+@inject IGameDataService GameDataService
@@ -9,213 +10,212 @@
@if (response is not null)
{
-
-
-
-
-
- Profile Options
+
+
+
+
+
+ Profile Options
-
+
-
-
- @if (EnterTextDirectly)
+
+
+ @if (enterTextDirectly)
+ {
+
+ }
+ else
+ {
+
+ }
+ Enter Text Directly
+
+
+
+ @for (uint i = 0; i < 8; i++)
{
-
+ var index = i;
+ @TitlePlateStrings[index]
}
- else
- {
-
- }
- Enter Text Directly
-
-
-
- @for (uint i = 0; i < 8; i++)
+
+
+
+
+
+ @foreach (var item in Enum.GetValues())
+ {
+
+ }
+
+
+
+
+
+
+
+
+
+ Costume Options
+
+
+
+
+ @for (var i = 0; i < Constants.COSTUME_HEAD_MAX; i++)
{
- var index = i;
- @titlePlateStrings[index]
+ var index = (uint)i;
+ var costumeTitle = GameDataService.GetHeadTitle(index);
+ @index - @costumeTitle
}
-
-
-
- @foreach (var item in Enum.GetValues())
- {
-
- }
-
+
+ @for (var i = 0; i < Constants.COSTUME_BODY_MAX; i++)
+ {
+ var index = (uint)i;
+ var costumeTitle = GameDataService.GetBodyTitle(index);
+ @index - @costumeTitle
+ }
+
-
-
-
-
+
+ @for (var i = 0; i < Constants.COSTUME_FACE_MAX; i++)
+ {
+ var index = (uint)i;
+ var costumeTitle = GameDataService.GetFaceTitle(index);
+ @index - @costumeTitle
+ }
+
-
-
- Costume Options
-
-
-
-
- @for (uint i = 0; i < GameDataService.COSTUME_HEAD_MAX; i++)
- {
- var index = i;
- var costumeTitle = GameDataService.headMap[index];
- @index - @costumeTitle
- }
-
+
+ @for (var i = 0; i < Constants.COSTUME_KIGURUMI_MAX; i++)
+ {
+ var index = (uint)i;
+ var costumeTitle = GameDataService.GetKigurumiTitle(index);
+ @index - @costumeTitle
+ }
+
-
- @for (uint i = 0; i < GameDataService.COSTUME_BODY_MAX; i++)
- {
- var index = i;
- var costumeTitle = GameDataService.bodyMap[index];
- @index - @costumeTitle
- }
-
+
+ @for (var i = 0; i < Constants.COSTUME_PUCHI_MAX; i++)
+ {
+ var index = (uint)i;
+ var costumeTitle = GameDataService.GetPuchiTitle(index);
+ @index - @costumeTitle
+ }
+
+
-
- @for (uint i = 0; i < GameDataService.COSTUME_FACE_MAX; i++)
- {
- var index = i;
- var costumeTitle = GameDataService.faceMap[index];
- @index - @costumeTitle
- }
-
+
+
+ @for (uint i = 0; i < Constants.COSTUME_COLOR_MAX; i++)
+ {
+ var index = i;
+
+
+ @index
+
+ }
+
+
+ @for (uint i = 0; i < Constants.COSTUME_COLOR_MAX; i++)
+ {
+ var index = i;
+
+
+ @index
+
+ }
+
+
+ @for (uint i = 0; i < Constants.COSTUME_COLOR_MAX; i++)
+ {
+ var index = i;
+
+
+ @index
+
+ }
+
+
+
+
+
+
-
- @for (uint i = 0; i < GameDataService.COSTUME_KIGURUMI_MAX; i++)
- {
- var index = i;
- var costumeTitle = GameDataService.kigurumiMap[index];
- @index - @costumeTitle
- }
-
+
+
+ Song Options
+
+
+
+
+
+
+
+
+
+
+
+
+ @for (uint i = 0; i < 15; i++)
+ {
+ var index = i;
+ @SpeedStrings[index]
+ }
+
-
- @for (uint i = 0; i < GameDataService.COSTUME_PUCHI_MAX; i++)
- {
- var index = i;
- var costumeTitle = GameDataService.puchiMap[index];
- @index - @costumeTitle
- }
-
-
+
+ @foreach (var item in Enum.GetValues())
+ {
+
+ }
+
-
-
- @for (uint i = 0; i < GameDataService.COSTUME_COLOR_MAX; i++)
- {
- var index = i;
-
-
- @index
-
- }
-
-
- @for (uint i = 0; i < GameDataService.COSTUME_COLOR_MAX; i++)
- {
- var index = i;
-
-
- @index
-
- }
-
-
- @for (uint i = 0; i < GameDataService.COSTUME_COLOR_MAX; i++)
- {
- var index = i;
-
-
- @index
-
- }
-
-
-
-
-
-
+
+ @for (uint i = 0; i < 19; i++)
+ {
+ var index = i;
+ @ToneStrings[index]
+ }
+
-
-
- Song Options
-
-
-
-
-
-
-
-
-
-
-
-
- @for (uint i = 0; i < 15; i++)
- {
- var index = i;
- @speedStrings[index]
- }
-
+
+ Notes Position
+
+
+
+
+
+
+
+
+
-
- @foreach (var item in Enum.GetValues())
- {
-
- }
-
+
+
+
+ @if (isSavingOptions)
+ {
+
+ Saving...
+ }
+ else
+ {
+
+ Save
+ }
+
+
-
- @for (uint i = 0; i < 19; i++)
- {
- var index = i;
- @toneStrings[index]
- }
-
-
-
- Notes Position
-
-
-
-
-
-
-
-
-
-
-
-
-
- @if (isSavingOptions)
- {
-
- Saving...
- }
- else
- {
-
- Save
- }
-
-
-
-
+
-
- @code {
- private bool EnterTextDirectly;
- }
}
\ No newline at end of file
diff --git a/TaikoWebUI/Pages/Profile.razor.cs b/TaikoWebUI/Pages/Profile.razor.cs
index 9c37a68..f3e1fda 100644
--- a/TaikoWebUI/Pages/Profile.razor.cs
+++ b/TaikoWebUI/Pages/Profile.razor.cs
@@ -11,8 +11,10 @@ public partial class Profile
private UserSetting? response;
private bool isSavingOptions;
+
+ private bool enterTextDirectly;
- public string[] costumeColors =
+ private static readonly string[] CostumeColors =
{
"#F84828", "#68C0C0", "#DC1500", "#F8F0E0", "#009687", "#00BF87",
"#00FF9A", "#66FFC2", "#FFFFFF", "#690000", "#FF0000", "#FF6666",
@@ -27,16 +29,16 @@ public partial class Profile
"#FF66BF", "#FFB3DF", "#000000"
};
- private readonly string[] speedStrings =
+ private static readonly string[] SpeedStrings =
{
"1.0", "1.1", "1.2", "1.3", "1.4",
"1.5", "1.6", "1.7", "1.8", "1.9",
"2.0", "2.5", "3.0", "3.5", "4.0"
};
- private readonly string[] notePositionStrings = { "-5", "-4", "-3", "-2", "-1", "0", "+1", "+2", "+3", "+4", "+5" };
+ private static readonly string[] NotePositionStrings = { "-5", "-4", "-3", "-2", "-1", "0", "+1", "+2", "+3", "+4", "+5" };
- private readonly string[] toneStrings =
+ private static readonly string[] ToneStrings =
{
"Taiko", "Festival", "Dogs & Cats", "Deluxe",
"Drumset", "Tambourine", "Don Wada", "Clapping",
@@ -45,13 +47,13 @@ public partial class Profile
"Synth Drum", "Shuriken", "Bubble Pop", "Electric Guitar"
};
- private readonly string[] titlePlateStrings =
+ private static readonly string[] TitlePlateStrings =
{
"Wood", "Rainbow", "Gold", "Purple",
"AI 1", "AI 2", "AI 3", "AI 4"
};
- private List breadcrumbs = new()
+ private readonly List breadcrumbs = new()
{
new BreadcrumbItem("Cards", href: "/Cards"),
};
@@ -73,15 +75,12 @@ public partial class Profile
isSavingOptions = false;
}
+#pragma warning disable CS1998
private async Task> SearchForTitle(string value)
+#pragma warning restore CS1998
{
- var titles = GameDataService.titleMap;
+ var titles = GameDataService.GetTitles();
- if (string.IsNullOrWhiteSpace(value))
- {
- return titles.Values;
- }
-
- return titles.Values.Where(x => x.Contains(value, StringComparison.OrdinalIgnoreCase));
+ return string.IsNullOrWhiteSpace(value) ? titles : titles.Where(x => x.Contains(value, StringComparison.OrdinalIgnoreCase));
}
}
\ No newline at end of file
diff --git a/TaikoWebUI/Services/GameDataService.cs b/TaikoWebUI/Services/GameDataService.cs
index c30d6bf..c1a3527 100644
--- a/TaikoWebUI/Services/GameDataService.cs
+++ b/TaikoWebUI/Services/GameDataService.cs
@@ -11,23 +11,15 @@ public class GameDataService : IGameDataService
private readonly Dictionary musicMap = new();
- private ImmutableDictionary danMap = null!;
+ private ImmutableDictionary danMap = ImmutableDictionary.Empty;
+
+ private ImmutableHashSet titles = ImmutableHashSet.Empty;
- public const int COSTUME_HEAD_MAX = 140;
- public const int COSTUME_FACE_MAX = 58;
- public const int COSTUME_BODY_MAX = 156;
- public const int COSTUME_KIGURUMI_MAX = 154;
- public const int COSTUME_PUCHI_MAX = 129;
- public const int COSTUME_COLOR_MAX = 63;
- public const int PLAYER_TITLE_MAX = 750;
-
- public static string[] headMap = new string[COSTUME_HEAD_MAX];
- public static string[] faceMap = new string[COSTUME_FACE_MAX];
- public static string[] bodyMap = new string[COSTUME_BODY_MAX];
- public static string[] kigurumiMap = new string[COSTUME_KIGURUMI_MAX];
- public static string[] puchiMap = new string[COSTUME_PUCHI_MAX];
-
- public static Dictionary titleMap = new();
+ private readonly string[] headTitles = new string[Constants.COSTUME_HEAD_MAX];
+ private readonly string[] faceTitles = new string[Constants.COSTUME_FACE_MAX];
+ private readonly string[] bodyTitles = new string[Constants.COSTUME_BODY_MAX];
+ private readonly string[] kigurumiMTitles = new string[Constants.COSTUME_KIGURUMI_MAX];
+ private readonly string[] puchiTitles = new string[Constants.COSTUME_PUCHI_MAX];
public GameDataService(HttpClient client)
{
@@ -51,6 +43,88 @@ public class GameDataService : IGameDataService
// To prevent duplicate entries in wordlist
var dict = wordList.WordListEntries.GroupBy(entry => entry.Key)
.ToImmutableDictionary(group => group.Key, group => group.First());
+ await Task.Run(()=>InitializeMusicMap(musicInfo, dict, musicOrder));
+
+ await Task.Run(() => InitializeHeadTitles(dict));
+ await Task.Run(() => InitializeFaceTitles(dict));
+ await Task.Run(() => InitializeBodyTitles(dict));
+ await Task.Run(() => InitializePuchiTitles(dict));
+ await Task.Run(() => InitializeKigurumiTitles(dict));
+ await Task.Run(() => InitializeTitles(dict));
+ }
+
+ private void InitializeTitles(ImmutableDictionary dict)
+ {
+ var set = ImmutableHashSet.CreateBuilder();
+ for (var i = 1; i < Constants.PLAYER_TITLE_MAX; i++)
+ {
+ var key = $"syougou_{i}";
+
+ var titleWordlistItem = dict.GetValueOrDefault(key, new WordListEntry());
+
+ set.Add(titleWordlistItem.JapaneseText);
+ }
+
+ titles = set.ToImmutable();
+ }
+
+ private void InitializePuchiTitles(ImmutableDictionary dict)
+ {
+ for (var i = 0; i < Constants.COSTUME_PUCHI_MAX; i++)
+ {
+ var key = $"costume_puchi_{i}";
+
+ var costumeWordlistItem = dict.GetValueOrDefault(key, new WordListEntry());
+ puchiTitles[i] = costumeWordlistItem.JapaneseText;
+ }
+ }
+
+ private void InitializeKigurumiTitles(ImmutableDictionary dict)
+ {
+ for (var i = 0; i < Constants.COSTUME_KIGURUMI_MAX; i++)
+ {
+ var key = $"costume_kigurumi_{i}";
+
+ var costumeWordlistItem = dict.GetValueOrDefault(key, new WordListEntry());
+ kigurumiMTitles[i] = costumeWordlistItem.JapaneseText;
+ }
+ }
+
+ private void InitializeBodyTitles(ImmutableDictionary dict)
+ {
+ for (var i = 0; i < Constants.COSTUME_BODY_MAX; i++)
+ {
+ var key = $"costume_body_{i}";
+
+ var costumeWordlistItem = dict.GetValueOrDefault(key, new WordListEntry());
+ bodyTitles[i] = costumeWordlistItem.JapaneseText;
+ }
+ }
+
+ private void InitializeFaceTitles(ImmutableDictionary dict)
+ {
+ for (var i = 0; i < Constants.COSTUME_FACE_MAX; i++)
+ {
+ var key = $"costume_face_{i}";
+
+ var costumeWordlistItem = dict.GetValueOrDefault(key, new WordListEntry());
+ faceTitles[i] = costumeWordlistItem.JapaneseText;
+ }
+ }
+
+ private void InitializeHeadTitles(ImmutableDictionary dict)
+ {
+ for (var i = 0; i < Constants.COSTUME_HEAD_MAX; i++)
+ {
+ var key = $"costume_head_{i}";
+
+ var costumeWordlistItem = dict.GetValueOrDefault(key, new WordListEntry());
+ headTitles[i] = costumeWordlistItem.JapaneseText;
+ }
+ }
+
+ private void InitializeMusicMap(MusicInfo musicInfo, ImmutableDictionary dict, MusicOrder musicOrder)
+ {
foreach (var music in musicInfo.Items)
{
var songNameKey = $"song_{music.Id}";
@@ -76,67 +150,6 @@ public class GameDataService : IGameDataService
musicMap[songId].Index = index;
}
}
-
- for (var i = 0; i < COSTUME_HEAD_MAX; i++)
- {
- var index = i;
- var key = $"costume_head_{index}";
-
- var costumeWordlistItem = dict.GetValueOrDefault(key, new WordListEntry());
- headMap[index] = costumeWordlistItem.JapaneseText;
- }
-
- for (var i = 0; i < COSTUME_FACE_MAX; i++)
- {
- var index = i;
- var key = $"costume_face_{index}";
-
- var costumeWordlistItem = dict.GetValueOrDefault(key, new WordListEntry());
- faceMap[index] = costumeWordlistItem.JapaneseText;
- }
-
- for (var i = 0; i < COSTUME_BODY_MAX; i++)
- {
- var index = i;
- var key = $"costume_body_{index}";
-
- var costumeWordlistItem = dict.GetValueOrDefault(key, new WordListEntry());
- bodyMap[index] = costumeWordlistItem.JapaneseText;
- }
-
- for (var i = 0; i < COSTUME_KIGURUMI_MAX; i++)
- {
- var index = i;
- var key = $"costume_kigurumi_{index}";
-
- var costumeWordlistItem = dict.GetValueOrDefault(key, new WordListEntry());
- kigurumiMap[index] = costumeWordlistItem.JapaneseText;
- }
-
- for (var i = 0; i < COSTUME_PUCHI_MAX; i++)
- {
- var index = i;
- var key = $"costume_puchi_{index}";
-
- var costumeWordlistItem = dict.GetValueOrDefault(key, new WordListEntry());
- puchiMap[index] = costumeWordlistItem.JapaneseText;
- }
-
- for (var i = 1; i < PLAYER_TITLE_MAX; i++)
- {
- var index = i;
- var key = $"syougou_{index}";
-
- var titleWordlistItem = dict.GetValueOrDefault(key, new WordListEntry());
-
- // prevent duplicate values with different keys
- if (titleMap.ContainsValue(titleWordlistItem.JapaneseText))
- {
- continue;
- }
-
- titleMap.TryAdd(index, titleWordlistItem.JapaneseText);
- }
}
public string GetMusicNameBySongId(uint songId)
@@ -176,4 +189,34 @@ public class GameDataService : IGameDataService
_ => throw new ArgumentOutOfRangeException(nameof(difficulty), difficulty, null)
};
}
+
+ public string GetHeadTitle(uint index)
+ {
+ return index < headTitles.Length ? headTitles[index] : string.Empty;
+ }
+
+ public string GetKigurumiTitle(uint index)
+ {
+ return index < kigurumiMTitles.Length ? kigurumiMTitles[index] : string.Empty;
+ }
+
+ public string GetBodyTitle(uint index)
+ {
+ return index < bodyTitles.Length ? bodyTitles[index] : string.Empty;
+ }
+
+ public string GetFaceTitle(uint index)
+ {
+ return index < faceTitles.Length ? faceTitles[index] : string.Empty;
+ }
+
+ public string GetPuchiTitle(uint index)
+ {
+ return index < puchiTitles.Length ? puchiTitles[index] : string.Empty;
+ }
+
+ public IEnumerable GetTitles()
+ {
+ return titles.ToArray();
+ }
}
\ No newline at end of file
diff --git a/TaikoWebUI/Services/IGameDataService.cs b/TaikoWebUI/Services/IGameDataService.cs
index fbad860..95eb397 100644
--- a/TaikoWebUI/Services/IGameDataService.cs
+++ b/TaikoWebUI/Services/IGameDataService.cs
@@ -1,4 +1,6 @@
-namespace TaikoWebUI.Services;
+using System.Collections.Immutable;
+
+namespace TaikoWebUI.Services;
public interface IGameDataService
{
@@ -15,4 +17,12 @@ public interface IGameDataService
public DanData GetDanDataById(uint danId);
public int GetMusicStarLevel(uint songId, Difficulty difficulty);
+
+ public string GetHeadTitle(uint index);
+ public string GetKigurumiTitle(uint index);
+ public string GetBodyTitle(uint index);
+ public string GetFaceTitle(uint index);
+ public string GetPuchiTitle(uint index);
+
+ public IEnumerable GetTitles();
}
\ No newline at end of file
diff --git a/TaikoWebUI/Shared/Constants.cs b/TaikoWebUI/Shared/Constants.cs
new file mode 100644
index 0000000..47eb065
--- /dev/null
+++ b/TaikoWebUI/Shared/Constants.cs
@@ -0,0 +1,12 @@
+namespace TaikoWebUI.Shared;
+
+public static class Constants
+{
+ public const int COSTUME_HEAD_MAX = 140;
+ public const int COSTUME_FACE_MAX = 58;
+ public const int COSTUME_BODY_MAX = 156;
+ public const int COSTUME_KIGURUMI_MAX = 154;
+ public const int COSTUME_PUCHI_MAX = 129;
+ public const int COSTUME_COLOR_MAX = 63;
+ public const int PLAYER_TITLE_MAX = 750;
+}
\ No newline at end of file